diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..a591c060955eb4331993844c8a2acdaeacdd84a0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,418 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/001[[:space:]]What[[:space:]]you're[[:space:]]going[[:space:]]to[[:space:]]get[[:space:]]from[[:space:]]this[[:space:]]course.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/002[[:space:]]START[[:space:]]HERE.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/003[[:space:]]12-Rules-to-Learn-to-Code-eBook-Copyright-App-Brewery.pdf filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/003[[:space:]]Downloadable[[:space:]]Resources[[:space:]]and[[:space:]]Tips[[:space:]]for[[:space:]]Taking[[:space:]]the[[:space:]]Course.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/004[[:space:]]Day[[:space:]]1[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/006[[:space:]]Printing[[:space:]]to[[:space:]]the[[:space:]]Console[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/007[[:space:]]Join[[:space:]]our[[:space:]]Class[[:space:]]on[[:space:]]Auditorium.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/008[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Printing.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/009[[:space:]]String[[:space:]]Manipulation[[:space:]]and[[:space:]]Code[[:space:]]Intelligence.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/010[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Debugging[[:space:]]Practice.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/011[[:space:]]The[[:space:]]Python[[:space:]]Input[[:space:]]Function.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/012[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Input[[:space:]]Function.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/013[[:space:]]Python[[:space:]]Variables.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/014[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Variables.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/015[[:space:]]Variable[[:space:]]Naming.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/017[[:space:]]Day[[:space:]]1[[:space:]]Project[[:space:]]Band[[:space:]]Name[[:space:]]Generator.mp4 filter=lfs diff=lfs merge=lfs -text +part1/01[[:space:]]-[[:space:]]Day[[:space:]]1[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Variables[[:space:]]in[[:space:]]Python[[:space:]]to[[:space:]]Manage[[:space:]]Data/018[[:space:]]Congratulations![[:space:]]Well[[:space:]]done!.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/001[[:space:]]Day[[:space:]]2[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/002[[:space:]]Python[[:space:]]Primitive[[:space:]]Data[[:space:]]Types.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/004[[:space:]]Type[[:space:]]Error,[[:space:]]Type[[:space:]]Checking[[:space:]]and[[:space:]]Type[[:space:]]Conversion.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/005[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Data[[:space:]]Types.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/006[[:space:]]Mathematical[[:space:]]Operations[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/007[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]BMI[[:space:]]Calculator.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/008[[:space:]]Number[[:space:]]Manipulation[[:space:]]and[[:space:]]F[[:space:]]Strings[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/009[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Life[[:space:]]in[[:space:]]Weeks.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/011[[:space:]]Day[[:space:]]2[[:space:]]Project[[:space:]]Tip[[:space:]]Calculator.mp4 filter=lfs diff=lfs merge=lfs -text +part1/02[[:space:]]-[[:space:]]Day[[:space:]]2[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Understanding[[:space:]]Data[[:space:]]Types[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Manipulate[[:space:]]Strings/012[[:space:]]You[[:space:]]are[[:space:]]already[[:space:]]in[[:space:]]the[[:space:]]top[[:space:]]50%.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/001[[:space:]]Day[[:space:]]3[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/003[[:space:]]Control[[:space:]]Flow[[:space:]]with[[:space:]]if[[:space:]][[:space:]]else[[:space:]]and[[:space:]]Conditional[[:space:]]Operators.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/004[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Odd[[:space:]]or[[:space:]]Even[[:space:]]Introducing[[:space:]]the[[:space:]]Modulo.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/005[[:space:]]Nested[[:space:]]if[[:space:]]statements[[:space:]]and[[:space:]]elif[[:space:]]statements.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/006[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]BMI[[:space:]]2.0.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/007[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Leap[[:space:]]Year.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/008[[:space:]]Multiple[[:space:]]If[[:space:]]Statements[[:space:]]in[[:space:]]Succession.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/009[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Pizza[[:space:]]Order[[:space:]]Practice.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/010[[:space:]]Logical[[:space:]]Operators.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/011[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Love[[:space:]]Calculator.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/012[[:space:]]Day[[:space:]]3[[:space:]]Project[[:space:]]Treasure[[:space:]]Island.mp4 filter=lfs diff=lfs merge=lfs -text +part1/03[[:space:]]-[[:space:]]Day[[:space:]]3[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Control[[:space:]]Flow[[:space:]]and[[:space:]]Logical[[:space:]]Operators/013[[:space:]]Share[[:space:]]and[[:space:]]Show[[:space:]]off[[:space:]]your[[:space:]]Project!.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/001[[:space:]]Day[[:space:]]4[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/002[[:space:]]Random[[:space:]]Module.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/003[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Heads[[:space:]]or[[:space:]]Tails.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/004[[:space:]]Understanding[[:space:]]the[[:space:]]Offset[[:space:]]and[[:space:]]Appending[[:space:]]Items[[:space:]]to[[:space:]]Lists.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/005[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Banker[[:space:]]Roulette[[:space:]]-[[:space:]]Who[[:space:]]will[[:space:]]pay[[:space:]]the[[:space:]]bill.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/006[[:space:]]IndexErrors[[:space:]]and[[:space:]]Working[[:space:]]with[[:space:]]Nested[[:space:]]Lists.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/008[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Treasure[[:space:]]Map.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/009[[:space:]]Day[[:space:]]4[[:space:]]Project[[:space:]]Rock[[:space:]]Paper[[:space:]]Scissors.mp4 filter=lfs diff=lfs merge=lfs -text +part1/04[[:space:]]-[[:space:]]Day[[:space:]]4[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Randomisation[[:space:]]and[[:space:]]Python[[:space:]]Lists/010[[:space:]]Programming[[:space:]]is[[:space:]]like[[:space:]]going[[:space:]]to[[:space:]]the[[:space:]]Gym.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/001[[:space:]]Day[[:space:]]5[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/002[[:space:]]Using[[:space:]]the[[:space:]]for[[:space:]]loop[[:space:]]with[[:space:]]Python[[:space:]]Lists.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/003[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Average[[:space:]]Height.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/004[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]High[[:space:]]Score.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/005[[:space:]]for[[:space:]]loops[[:space:]]and[[:space:]]the[[:space:]]range()[[:space:]]function.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/006[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Adding[[:space:]]Even[[:space:]]Numbers.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/007[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]The[[:space:]]FizzBuzz[[:space:]]Job[[:space:]]Interview[[:space:]]Question.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/008[[:space:]]Day[[:space:]]5[[:space:]]Project[[:space:]]Create[[:space:]]a[[:space:]]Password[[:space:]]Generator.mp4 filter=lfs diff=lfs merge=lfs -text +part1/05[[:space:]]-[[:space:]]Day[[:space:]]5[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Loops/009[[:space:]]Hard[[:space:]]Work[[:space:]]and[[:space:]]Perseverance[[:space:]]beats[[:space:]]Raw[[:space:]]Talent[[:space:]]Every[[:space:]]Time.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/001[[:space:]]Day[[:space:]]6[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/002[[:space:]]Defining[[:space:]]and[[:space:]]Calling[[:space:]]Python[[:space:]]Functions.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/003[[:space:]]The[[:space:]]Hurdles[[:space:]]Loop[[:space:]]Challenge.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/004[[:space:]]Indentation[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/006[[:space:]]While[[:space:]]Loops.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/007[[:space:]]Hurdles[[:space:]]Challenge[[:space:]]using[[:space:]]While[[:space:]]Loops.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/008[[:space:]]Jumping[[:space:]]over[[:space:]]Hurdles[[:space:]]with[[:space:]]Variable[[:space:]]Heights.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/009[[:space:]]Final[[:space:]]Project[[:space:]]Escaping[[:space:]]the[[:space:]]Maze.mp4 filter=lfs diff=lfs merge=lfs -text +part1/06[[:space:]]-[[:space:]]Day[[:space:]]6[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Python[[:space:]]Functions[[:space:]]&[[:space:]]Karel/010[[:space:]]Why[[:space:]]is[[:space:]]this[[:space:]]so[[:space:]]Hard![[:space:]]Can[[:space:]]I[[:space:]]really[[:space:]]do[[:space:]]this.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/001[[:space:]]Day[[:space:]]7[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/002[[:space:]]How[[:space:]]to[[:space:]]break[[:space:]]a[[:space:]]Complex[[:space:]]Problem[[:space:]]down[[:space:]]into[[:space:]]a[[:space:]]Flow[[:space:]]Chart.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/003[[:space:]]Challenge[[:space:]]1[[:space:]]-[[:space:]]Picking[[:space:]]a[[:space:]]Random[[:space:]]Words[[:space:]]and[[:space:]]Checking[[:space:]]Answers.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/004[[:space:]]Challenge[[:space:]]1[[:space:]]Solution[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Check[[:space:]]the[[:space:]]User's[[:space:]]Answer.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/005[[:space:]]Challenge[[:space:]]2[[:space:]]-[[:space:]]Replacing[[:space:]]Blanks[[:space:]]with[[:space:]]Guesses.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/006[[:space:]]Challenge[[:space:]]2[[:space:]]Solution[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Replace[[:space:]]the[[:space:]]Blanks.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/007[[:space:]]Challenge[[:space:]]3[[:space:]]-[[:space:]]Checking[[:space:]]if[[:space:]]the[[:space:]]Player[[:space:]]has[[:space:]]Won.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/008[[:space:]]Challenge[[:space:]]3[[:space:]]Solution[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Check[[:space:]]if[[:space:]]the[[:space:]]Player[[:space:]]Won.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/009[[:space:]]Challenge[[:space:]]4[[:space:]]-[[:space:]]Keeping[[:space:]]Track[[:space:]]of[[:space:]]the[[:space:]]Player's[[:space:]]Lives.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/010[[:space:]]Challenge[[:space:]]4[[:space:]]Solution[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Keep[[:space:]]Track[[:space:]]of[[:space:]]the[[:space:]]Player's[[:space:]]Lives.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/011[[:space:]]Challenge[[:space:]]5[[:space:]]-[[:space:]]Improving[[:space:]]the[[:space:]]User[[:space:]]Experience.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/012[[:space:]]Challenge[[:space:]]5[[:space:]]Solution[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Add[[:space:]]ASCII[[:space:]]Art[[:space:]]and[[:space:]]Improve[[:space:]]the[[:space:]]UI.mp4 filter=lfs diff=lfs merge=lfs -text +part1/07[[:space:]]-[[:space:]]Day[[:space:]]7[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Hangman/013[[:space:]]The[[:space:]]Benefits[[:space:]]of[[:space:]]Daily[[:space:]]Practice.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/001[[:space:]]Day[[:space:]]8[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/002[[:space:]]Functions[[:space:]]with[[:space:]]Inputs.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/003[[:space:]]Positional[[:space:]]vs.[[:space:]]Keyword[[:space:]]Arguments.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/004[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Paint[[:space:]]Area[[:space:]]Calculator.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/005[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Prime[[:space:]]Number[[:space:]]Checker.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/006[[:space:]]Caesar[[:space:]]Cipher[[:space:]]Part[[:space:]]1[[:space:]]-[[:space:]]Encryption.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/007[[:space:]]Caesar[[:space:]]Cipher[[:space:]]Part[[:space:]]2[[:space:]]-[[:space:]]Decryption.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/008[[:space:]]Caesar[[:space:]]Cipher[[:space:]]Part[[:space:]]3[[:space:]]-[[:space:]]Reorganising[[:space:]]our[[:space:]]Code.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/009[[:space:]]Caesar[[:space:]]Cipher[[:space:]]Part[[:space:]]4[[:space:]]-[[:space:]]User[[:space:]]Experience[[:space:]]Improvements[[:space:]]&[[:space:]]Final[[:space:]]Touches.mp4 filter=lfs diff=lfs merge=lfs -text +part1/08[[:space:]]-[[:space:]]Day[[:space:]]8[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Function[[:space:]]Parameters[[:space:]]&[[:space:]]Caesar[[:space:]]Cipher/010[[:space:]]How[[:space:]]You[[:space:]]Can[[:space:]]Stay[[:space:]]Motivated.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/001[[:space:]]Day[[:space:]]9[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/002[[:space:]]The[[:space:]]Python[[:space:]]Dictionary[[:space:]]Deep[[:space:]]Dive.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/003[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Grading[[:space:]]Program.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/004[[:space:]]Nesting[[:space:]]Lists[[:space:]]and[[:space:]]Dictionaries.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/005[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Dictionary[[:space:]]in[[:space:]]List.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/007[[:space:]]The[[:space:]]Secret[[:space:]]Auction[[:space:]]Program[[:space:]]Instructions[[:space:]]and[[:space:]]Flow[[:space:]]Chart.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/008[[:space:]]Solution[[:space:]]and[[:space:]]Complete[[:space:]]Code[[:space:]]for[[:space:]]the[[:space:]]Secret[[:space:]]Auction[[:space:]]Program.mp4 filter=lfs diff=lfs merge=lfs -text +part1/09[[:space:]]-[[:space:]]Day[[:space:]]9[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Dictionaries,[[:space:]]Nesting[[:space:]]and[[:space:]]the[[:space:]]Secret[[:space:]]Auction/009[[:space:]]Motivation[[:space:]]and[[:space:]]the[[:space:]]Accountability[[:space:]]Trick.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/001[[:space:]]Day[[:space:]]10[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/002[[:space:]]Functions[[:space:]]with[[:space:]]Outputs.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/003[[:space:]]Multiple[[:space:]]return[[:space:]]values.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/004[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Days[[:space:]]in[[:space:]]Month.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/005[[:space:]]Docstrings.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/007[[:space:]]Calculator[[:space:]]Part[[:space:]]1[[:space:]]Combining[[:space:]]Dictionaries[[:space:]]and[[:space:]]Functions.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/008[[:space:]]Print[[:space:]]vs.[[:space:]]Return.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/009[[:space:]]While[[:space:]]Loops,[[:space:]]Flags[[:space:]]and[[:space:]]Recursion.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/010[[:space:]]Calculator[[:space:]]Finishing[[:space:]]Touches[[:space:]]and[[:space:]]Bug[[:space:]]Fixes.mp4 filter=lfs diff=lfs merge=lfs -text +part1/10[[:space:]]-[[:space:]]Day[[:space:]]10[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Functions[[:space:]]with[[:space:]]Outputs/011[[:space:]]How[[:space:]]to[[:space:]]Get[[:space:]]a[[:space:]]Good[[:space:]]Night's[[:space:]]Sleep.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/001[[:space:]]Day[[:space:]]11[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/002[[:space:]]Blackjack[[:space:]]Program[[:space:]]Requirements[[:space:]]and[[:space:]]Game[[:space:]]Rules.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/003[[:space:]]Hint[[:space:]]4[[:space:]]&[[:space:]]5[[:space:]]Solution[[:space:]]Walkthrough.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/004[[:space:]]Hint[[:space:]]6-8[[:space:]]Solution[[:space:]]Walkthrough.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/005[[:space:]]Hint[[:space:]]9[[:space:]]Solution[[:space:]]Walkthrough[[:space:]]Refactoring[[:space:]]and[[:space:]]calling[[:space:]]calculate_score().mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/006[[:space:]]Hint[[:space:]]10-12[[:space:]]Solution[[:space:]]Walkthrough.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/007[[:space:]]Hint[[:space:]]13[[:space:]]Solution[[:space:]]Walkthrough.mp4 filter=lfs diff=lfs merge=lfs -text +part1/11[[:space:]]-[[:space:]]Day[[:space:]]11[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]The[[:space:]]Blackjack[[:space:]]Capstone[[:space:]]Project/008[[:space:]]A[[:space:]]Solid[[:space:]]Foundation[[:space:]]goes[[:space:]]a[[:space:]]Long[[:space:]]Way.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/001[[:space:]]Namespaces[[:space:]]Local[[:space:]]vs.[[:space:]]Global[[:space:]]Scope.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/002[[:space:]]Does[[:space:]]Python[[:space:]]Have[[:space:]]Block[[:space:]]Scope.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/003[[:space:]]How[[:space:]]to[[:space:]]Modify[[:space:]]a[[:space:]]Global[[:space:]]Variable.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/004[[:space:]]Python[[:space:]]Constants[[:space:]]and[[:space:]]Global[[:space:]]Scope.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/006[[:space:]]Introducing[[:space:]]the[[:space:]]Final[[:space:]]Project[[:space:]]The[[:space:]]Number[[:space:]]Guessing[[:space:]]Game.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/007[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]to[[:space:]]the[[:space:]]Number[[:space:]]Guessing[[:space:]]Game.mp4 filter=lfs diff=lfs merge=lfs -text +part1/12[[:space:]]-[[:space:]]Day[[:space:]]12[[:space:]][[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Scope[[:space:]]&[[:space:]]Number[[:space:]]Guessing[[:space:]]Game/008[[:space:]]Don't[[:space:]]be[[:space:]]too[[:space:]]hard[[:space:]]on[[:space:]]yourself.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/001[[:space:]]Describe[[:space:]]the[[:space:]]Problem.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/002[[:space:]]Reproduce[[:space:]]the[[:space:]]Bug.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/003[[:space:]]Play[[:space:]]Computer[[:space:]]and[[:space:]]Evaluate[[:space:]]Each[[:space:]]Line.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/004[[:space:]]Fixing[[:space:]]Errors[[:space:]]and[[:space:]]Watching[[:space:]]for[[:space:]]Red[[:space:]]Underlines.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/005[[:space:]]Squash[[:space:]]bugs[[:space:]]with[[:space:]]a[[:space:]]print()[[:space:]]Statement.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/006[[:space:]]Bringing[[:space:]]out[[:space:]]the[[:space:]]BIG[[:space:]]Gun[[:space:]]Using[[:space:]]a[[:space:]]Debugger.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/007[[:space:]]Final[[:space:]]Debugging[[:space:]]Tips.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/008[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Debugging[[:space:]]Odd[[:space:]]or[[:space:]]Even.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/009[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Debugging[[:space:]]Leap[[:space:]]Year.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/010[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Debugging[[:space:]]FizzBuzz.mp4 filter=lfs diff=lfs merge=lfs -text +part2/13[[:space:]]-[[:space:]]Day[[:space:]]13[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Debugging[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Fix[[:space:]]Errors[[:space:]]in[[:space:]]your[[:space:]]Code/011[[:space:]]Building[[:space:]]Confidence.mp4 filter=lfs diff=lfs merge=lfs -text +part2/14[[:space:]]-[[:space:]]Day[[:space:]]14[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Higher[[:space:]]Lower[[:space:]]Game[[:space:]]Project/001[[:space:]]Introduction[[:space:]]&[[:space:]]Program[[:space:]]Requirements[[:space:]]for[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game.mp4 filter=lfs diff=lfs merge=lfs -text +part2/14[[:space:]]-[[:space:]]Day[[:space:]]14[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Higher[[:space:]]Lower[[:space:]]Game[[:space:]]Project/002[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]of[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game.mp4 filter=lfs diff=lfs merge=lfs -text +part2/14[[:space:]]-[[:space:]]Day[[:space:]]14[[:space:]]-[[:space:]]Beginner[[:space:]]-[[:space:]]Higher[[:space:]]Lower[[:space:]]Game[[:space:]]Project/003[[:space:]]Study[[:space:]]Tip[[:space:]]Set[[:space:]]Reminders[[:space:]]in[[:space:]]Your[[:space:]]Calendar[[:space:]]to[[:space:]]Review.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/001[[:space:]]Installing[[:space:]]Python[[:space:]]Locally[[:space:]]on[[:space:]]Your[[:space:]]Computer.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/002[[:space:]]Download[[:space:]]PyCharm[[:space:]]for[[:space:]]Windows[[:space:]]or[[:space:]]Mac.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/003[[:space:]]PyCharm's[[:space:]]Charming[[:space:]]Features[[:space:]](while[[:space:]]you[[:space:]]wait[[:space:]]for[[:space:]]the[[:space:]]download[[:space:]]to[[:space:]]finish).mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/004[[:space:]]How[[:space:]]to[[:space:]]Install[[:space:]]PyCharm[[:space:]]on[[:space:]]Windows.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/005[[:space:]]Installing[[:space:]]PyCharm[[:space:]]on[[:space:]]Mac.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/006[[:space:]]Introduction[[:space:]]&[[:space:]]Requirements[[:space:]]for[[:space:]]the[[:space:]]Coffee[[:space:]]Machine[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/007[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]the[[:space:]]Coffee[[:space:]]Machine[[:space:]]Code.mp4 filter=lfs diff=lfs merge=lfs -text +part2/15[[:space:]]-[[:space:]]Day[[:space:]]15[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Local[[:space:]]Development[[:space:]]Environment[[:space:]]Setup[[:space:]]&[[:space:]]the[[:space:]]Coffee[[:space:]]Machine/008[[:space:]]Location,[[:space:]]Location,[[:space:]]Location[[:space:]]-[[:space:]]Pavlov's[[:space:]]Coding[[:space:]]Corner.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/001[[:space:]]Why[[:space:]]do[[:space:]]we[[:space:]]need[[:space:]]OOP[[:space:]]and[[:space:]]how[[:space:]]does[[:space:]]it[[:space:]]work.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/002[[:space:]]How[[:space:]]to[[:space:]]use[[:space:]]OOP[[:space:]]Classes[[:space:]]and[[:space:]]Objects.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/003[[:space:]]Constructing[[:space:]]Objects[[:space:]]and[[:space:]]Accessing[[:space:]]their[[:space:]]Attributes[[:space:]]and[[:space:]]Methods.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/004[[:space:]]How[[:space:]]to[[:space:]]Add[[:space:]]Python[[:space:]]Packages[[:space:]]and[[:space:]]use[[:space:]]PyPi.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/005[[:space:]]Practice[[:space:]]Modifying[[:space:]]Object[[:space:]]Attributes[[:space:]]and[[:space:]]Calling[[:space:]]Methods.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/007[[:space:]]Building[[:space:]]the[[:space:]]Coffee[[:space:]]Machine[[:space:]]in[[:space:]]OOP.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/008[[:space:]]Walkthrough[[:space:]]and[[:space:]]Solution[[:space:]]for[[:space:]]the[[:space:]]OOP[[:space:]]Coffee[[:space:]]Machine.mp4 filter=lfs diff=lfs merge=lfs -text +part2/16[[:space:]]-[[:space:]]Day[[:space:]]16[[:space:]][[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Object[[:space:]]Oriented[[:space:]]Programming[[:space:]](OOP)/009[[:space:]]Don't[[:space:]]forget[[:space:]]to[[:space:]]review[[:space:]]occasionally.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/001[[:space:]]Day[[:space:]]17[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/002[[:space:]]How[[:space:]]to[[:space:]]create[[:space:]]your[[:space:]]own[[:space:]]Class[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/003[[:space:]]Working[[:space:]]with[[:space:]]Attributes,[[:space:]]Class[[:space:]]Constructors[[:space:]]and[[:space:]]the[[:space:]]__init__()[[:space:]]Function.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/004[[:space:]]Adding[[:space:]]Methods[[:space:]]to[[:space:]]a[[:space:]]Class.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/005[[:space:]]Quiz[[:space:]]Project[[:space:]]Part[[:space:]]1[[:space:]]Creating[[:space:]]the[[:space:]]Question[[:space:]]Class.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/006[[:space:]]Quiz[[:space:]]Project[[:space:]]Part[[:space:]]2[[:space:]]Creating[[:space:]]the[[:space:]]List[[:space:]]of[[:space:]]Question[[:space:]]Objects[[:space:]]from[[:space:]]the[[:space:]]Data.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/007[[:space:]]Quiz[[:space:]]Project[[:space:]]Part[[:space:]]3[[:space:]]The[[:space:]]QuizBrain[[:space:]]and[[:space:]]the[[:space:]]next_question()[[:space:]]Method.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/008[[:space:]]Quiz[[:space:]]Project[[:space:]]Part[[:space:]]4[[:space:]]How[[:space:]]to[[:space:]]continue[[:space:]]showing[[:space:]]new[[:space:]]Questions.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/009[[:space:]]Quiz[[:space:]]Project[[:space:]]Part[[:space:]]5[[:space:]]Checking[[:space:]]Answers[[:space:]]and[[:space:]]Keeping[[:space:]]Score.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/010[[:space:]]The[[:space:]]Benefits[[:space:]]of[[:space:]]OOP[[:space:]]Use[[:space:]]Open[[:space:]]Trivia[[:space:]]DB[[:space:]]to[[:space:]]Get[[:space:]]New[[:space:]]Questions.mp4 filter=lfs diff=lfs merge=lfs -text +part2/17[[:space:]]-[[:space:]]Day[[:space:]]17[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Quiz[[:space:]]Project[[:space:]]&[[:space:]]the[[:space:]]Benefits[[:space:]]of[[:space:]]OOP/011[[:space:]]Run[[:space:]]for[[:space:]]that[[:space:]]Bus!.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/001[[:space:]]Day[[:space:]]18[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/002[[:space:]]Understanding[[:space:]]Turtle[[:space:]]Graphics[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]use[[:space:]]the[[:space:]]Documentation.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/003[[:space:]]Turtle[[:space:]]Challenge[[:space:]]1[[:space:]]-[[:space:]]Draw[[:space:]]a[[:space:]]Square.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/004[[:space:]]Importing[[:space:]]Modules,[[:space:]]Installing[[:space:]]Packages,[[:space:]]and[[:space:]]Working[[:space:]]with[[:space:]]Aliases.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/005[[:space:]]Turtle[[:space:]]Challenge[[:space:]]2[[:space:]]-[[:space:]]Draw[[:space:]]a[[:space:]]Dashed[[:space:]]Line.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/006[[:space:]]Turtle[[:space:]]Challenge[[:space:]]3[[:space:]]-[[:space:]]Drawing[[:space:]]Different[[:space:]]Shapes.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/007[[:space:]]Turtle[[:space:]]Challenge[[:space:]]4[[:space:]]-[[:space:]]Generate[[:space:]]a[[:space:]]Random[[:space:]]Walk.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/008[[:space:]]Python[[:space:]]Tuples[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Generate[[:space:]]Random[[:space:]]RGB[[:space:]]Colours.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/009[[:space:]]Turtle[[:space:]]Challenge[[:space:]]5[[:space:]]-[[:space:]]Draw[[:space:]]a[[:space:]]Spirograph.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/010[[:space:]]The[[:space:]]Hirst[[:space:]]Painting[[:space:]]Project[[:space:]]Part[[:space:]]1[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Extract[[:space:]]RGB[[:space:]]Values[[:space:]]from[[:space:]]Images.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/011[[:space:]]The[[:space:]]Hirst[[:space:]]Painting[[:space:]]Project[[:space:]]Part[[:space:]]2[[:space:]]-[[:space:]]Drawing[[:space:]]the[[:space:]]Dots.mp4 filter=lfs diff=lfs merge=lfs -text +part2/18[[:space:]]-[[:space:]]Day[[:space:]]18[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Turtle[[:space:]]&[[:space:]]the[[:space:]]Graphical[[:space:]]User[[:space:]]Interface[[:space:]](GUI)/012[[:space:]]Space[[:space:]]out[[:space:]]your[[:space:]]study[[:space:]]sessions[[:space:]]and[[:space:]]stay[[:space:]]consistent.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/001[[:space:]]Day[[:space:]]19[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/002[[:space:]]Python[[:space:]]Higher[[:space:]]Order[[:space:]]Functions[[:space:]]&[[:space:]]Event[[:space:]]Listeners.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/003[[:space:]]Challenge[[:space:]]Make[[:space:]]an[[:space:]]Etch-A-Sketch[[:space:]]App.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/004[[:space:]]Object[[:space:]]State[[:space:]]and[[:space:]]Instances.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/005[[:space:]]Understanding[[:space:]]the[[:space:]]Turtle[[:space:]]Coordinate[[:space:]]System.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/007[[:space:]]Aaaand,[[:space:]]we're[[:space:]]off[[:space:]]to[[:space:]]the[[:space:]]races!.mp4 filter=lfs diff=lfs merge=lfs -text +part2/19[[:space:]]-[[:space:]]Day[[:space:]]19[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Instances,[[:space:]]State[[:space:]]and[[:space:]]Higher[[:space:]]Order[[:space:]]Functions/008[[:space:]]Expand[[:space:]]on[[:space:]]the[[:space:]]Solutions.mp4 filter=lfs diff=lfs merge=lfs -text +part2/20[[:space:]]-[[:space:]]Day[[:space:]]20[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Animation[[:space:]]&[[:space:]]Coordinates/001[[:space:]]Day[[:space:]]20[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/20[[:space:]]-[[:space:]]Day[[:space:]]20[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Animation[[:space:]]&[[:space:]]Coordinates/002[[:space:]]Screen[[:space:]]Setup[[:space:]]and[[:space:]]Creating[[:space:]]a[[:space:]]Snake[[:space:]]Body.mp4 filter=lfs diff=lfs merge=lfs -text +part2/20[[:space:]]-[[:space:]]Day[[:space:]]20[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Animation[[:space:]]&[[:space:]]Coordinates/003[[:space:]]Animating[[:space:]]the[[:space:]]Snake[[:space:]]Segments[[:space:]]on[[:space:]]Screen.mp4 filter=lfs diff=lfs merge=lfs -text +part2/20[[:space:]]-[[:space:]]Day[[:space:]]20[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Animation[[:space:]]&[[:space:]]Coordinates/004[[:space:]]Create[[:space:]]a[[:space:]]Snake[[:space:]]Class[[:space:]]&[[:space:]]Move[[:space:]]to[[:space:]]OOP.mp4 filter=lfs diff=lfs merge=lfs -text +part2/20[[:space:]]-[[:space:]]Day[[:space:]]20[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Animation[[:space:]]&[[:space:]]Coordinates/005[[:space:]]How[[:space:]]to[[:space:]]Control[[:space:]]the[[:space:]]Snake[[:space:]]with[[:space:]]a[[:space:]]Keypress.mp4 filter=lfs diff=lfs merge=lfs -text +part2/20[[:space:]]-[[:space:]]Day[[:space:]]20[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Animation[[:space:]]&[[:space:]]Coordinates/006[[:space:]]Programming[[:space:]]is[[:space:]]not[[:space:]]Memorising.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/001[[:space:]]Day[[:space:]]21[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/002[[:space:]]Class[[:space:]]Inheritance.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/004[[:space:]]Detect[[:space:]]Collisions[[:space:]]with[[:space:]]Food.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/005[[:space:]]Create[[:space:]]a[[:space:]]Scoreboard[[:space:]]and[[:space:]]Keep[[:space:]]Score.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/006[[:space:]]Detect[[:space:]]Collisions[[:space:]]with[[:space:]]the[[:space:]]Wall.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/007[[:space:]]Detect[[:space:]]Collisions[[:space:]]with[[:space:]]your[[:space:]]own[[:space:]]Tail.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/008[[:space:]]How[[:space:]]to[[:space:]]Slice[[:space:]]Lists[[:space:]]&[[:space:]]Tuples[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part2/21[[:space:]]-[[:space:]]Day[[:space:]]21[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]the[[:space:]]Snake[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Inheritance[[:space:]]&[[:space:]]List[[:space:]]Slicing/009[[:space:]]Stay[[:space:]]motivated[[:space:]]by[[:space:]]remembering[[:space:]]the[[:space:]]reason[[:space:]]you[[:space:]]signed[[:space:]]up.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/001[[:space:]]Day[[:space:]]22[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/002[[:space:]]Set[[:space:]]up[[:space:]]the[[:space:]]Main[[:space:]]Screen.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/003[[:space:]]Create[[:space:]]a[[:space:]]Paddle[[:space:]]that[[:space:]]responds[[:space:]]to[[:space:]]Key[[:space:]]Presses.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/004[[:space:]]Write[[:space:]]the[[:space:]]Paddle[[:space:]]Class[[:space:]]and[[:space:]]Create[[:space:]]the[[:space:]]Second[[:space:]]Paddle.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/005[[:space:]]Write[[:space:]]the[[:space:]]Ball[[:space:]]Class[[:space:]]and[[:space:]]Make[[:space:]]the[[:space:]]Ball[[:space:]]Move.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/006[[:space:]]Add[[:space:]]the[[:space:]]Ball[[:space:]]Bouncing[[:space:]]Logic.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/007[[:space:]]How[[:space:]]to[[:space:]]Detect[[:space:]]Collisions[[:space:]]with[[:space:]]the[[:space:]]Paddle.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/008[[:space:]]How[[:space:]]to[[:space:]]Detect[[:space:]]when[[:space:]]the[[:space:]]Ball[[:space:]]goes[[:space:]]Out[[:space:]]of[[:space:]]Bounds.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/009[[:space:]]Score[[:space:]]Keeping[[:space:]]and[[:space:]]Changing[[:space:]]the[[:space:]]Ball[[:space:]]Speed.mp4 filter=lfs diff=lfs merge=lfs -text +part2/22[[:space:]]-[[:space:]]Day[[:space:]]22[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Build[[:space:]]Pong[[:space:]]The[[:space:]]Famous[[:space:]]Arcade[[:space:]]Game/010[[:space:]]Picturing[[:space:]]fears[[:space:]]even[[:space:]]the[[:space:]]worst-case[[:space:]]scenario[[:space:]]is[[:space:]]not[[:space:]]so[[:space:]]scary.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/001[[:space:]]Day[[:space:]]23[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/003[[:space:]]How[[:space:]]to[[:space:]]use[[:space:]]the[[:space:]]Starter[[:space:]]Code.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/006[[:space:]]Solution[[:space:]]to[[:space:]]Step[[:space:]]3[[:space:]]-[[:space:]]Create[[:space:]]the[[:space:]]Player[[:space:]]Behaviour.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/007[[:space:]]Solution[[:space:]]to[[:space:]]Step[[:space:]]4[[:space:]]-[[:space:]]Create[[:space:]]the[[:space:]]Car[[:space:]]Behaviour.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/008[[:space:]]Solution[[:space:]]to[[:space:]]Step[[:space:]]5[[:space:]]-[[:space:]]Detect[[:space:]]when[[:space:]]the[[:space:]]Turtle[[:space:]]collides[[:space:]]with[[:space:]]a[[:space:]]Car[[:space:]]squish.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/009[[:space:]]Solution[[:space:]]to[[:space:]]Step[[:space:]]6[[:space:]]-[[:space:]]Detect[[:space:]]when[[:space:]]the[[:space:]]Player[[:space:]]has[[:space:]]reached[[:space:]]the[[:space:]]other[[:space:]]side.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/010[[:space:]]Solution[[:space:]]to[[:space:]]Step[[:space:]]7[[:space:]]-[[:space:]]Add[[:space:]]the[[:space:]]Scoreboard[[:space:]]and[[:space:]]Game[[:space:]]Over[[:space:]]sequence.mp4 filter=lfs diff=lfs merge=lfs -text +part2/23[[:space:]]-[[:space:]]Day[[:space:]]23[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]The[[:space:]]Turtle[[:space:]]Crossing[[:space:]]Capstone[[:space:]]Project/011[[:space:]]This[[:space:]]course[[:space:]]is[[:space:]]not[[:space:]]about[[:space:]]typing[[:space:]]out[[:space:]]code.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/001[[:space:]]Day[[:space:]]24[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/002[[:space:]]Add[[:space:]]a[[:space:]]High[[:space:]]Score[[:space:]]to[[:space:]]the[[:space:]]Snake[[:space:]]Game.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/003[[:space:]]How[[:space:]]to[[:space:]]Open,[[:space:]]Read,[[:space:]]and[[:space:]]Write[[:space:]]to[[:space:]]Files[[:space:]]using[[:space:]]the[[:space:]]with[[:space:]]Keyword.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/004[[:space:]]Challenge[[:space:]]Read[[:space:]]and[[:space:]]Write[[:space:]]the[[:space:]]High[[:space:]]Score[[:space:]]to[[:space:]]a[[:space:]]File[[:space:]]in[[:space:]]Snake.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/005[[:space:]]Understand[[:space:]]Relative[[:space:]]and[[:space:]]Absolute[[:space:]]File[[:space:]]Paths.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/007[[:space:]]Introducing[[:space:]]the[[:space:]]Mail[[:space:]]Merge[[:space:]]Challenge.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/008[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]the[[:space:]]Mail[[:space:]]Merge[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part2/24[[:space:]]-[[:space:]]Day[[:space:]]24[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Files,[[:space:]]Directories[[:space:]]and[[:space:]]Paths/009[[:space:]]What's[[:space:]]the[[:space:]]correct[[:space:]]solution[[:space:]]What's[[:space:]]the[[:space:]]best[[:space:]]answer[[:space:]]What's[[:space:]]the[[:space:]]right[[:space:]]way.mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/001[[:space:]]Day[[:space:]]25[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/002[[:space:]]Reading[[:space:]]CSV[[:space:]]Data[[:space:]]in[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/003[[:space:]]DataFrames[[:space:]]&[[:space:]]Series[[:space:]]Working[[:space:]]with[[:space:]]Rows[[:space:]]&[[:space:]]Columns.mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/004[[:space:]]The[[:space:]]Great[[:space:]]Squirrel[[:space:]]Census[[:space:]]Data[[:space:]]Analysis[[:space:]](with[[:space:]]Pandas!).mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/005[[:space:]]U.S.[[:space:]]States[[:space:]]Game[[:space:]]Part[[:space:]]1[[:space:]]Setup.mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/006[[:space:]]U.S.[[:space:]]States[[:space:]]Game[[:space:]]Part[[:space:]]2[[:space:]]Challenge[[:space:]]with[[:space:]].csv.mp4 filter=lfs diff=lfs merge=lfs -text +part2/25[[:space:]]-[[:space:]]Day[[:space:]]25[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]CSV[[:space:]]Data[[:space:]]and[[:space:]]the[[:space:]]Pandas[[:space:]]Library/007[[:space:]]U.S.[[:space:]]States[[:space:]]Game[[:space:]]Part[[:space:]]3[[:space:]]Saving[[:space:]]Data[[:space:]]to[[:space:]].csv.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/001[[:space:]]Day[[:space:]]26[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/002[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]Lists[[:space:]]using[[:space:]]List[[:space:]]Comprehension.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/003[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Squaring[[:space:]]Numbers.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/004[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Filtering[[:space:]]Even[[:space:]]Numbers.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/005[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Data[[:space:]]Overlap.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/006[[:space:]]Apply[[:space:]]List[[:space:]]Comprehension[[:space:]]to[[:space:]]the[[:space:]]U.S.[[:space:]]States[[:space:]]Game.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/007[[:space:]]How[[:space:]]to[[:space:]]use[[:space:]]Dictionary[[:space:]]Comprehension.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/008[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Dictionary[[:space:]]Comprehension[[:space:]]1.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/009[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Dictionary[[:space:]]Comprehension[[:space:]]2.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/010[[:space:]]How[[:space:]]to[[:space:]]Iterate[[:space:]]over[[:space:]]a[[:space:]]Pandas[[:space:]]DataFrame.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/011[[:space:]]Introducing[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part2/26[[:space:]]-[[:space:]]Day[[:space:]]26[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]List[[:space:]]Comprehension[[:space:]]and[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet/012[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]the[[:space:]]NATO[[:space:]]Alphabet[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/001[[:space:]]Day[[:space:]]27[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/002[[:space:]]History[[:space:]]of[[:space:]]GUI[[:space:]]and[[:space:]]Introduction[[:space:]]to[[:space:]]Tkinter.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/003[[:space:]]Creating[[:space:]]Windows[[:space:]]and[[:space:]]Labels[[:space:]]with[[:space:]]Tkinter.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/004[[:space:]]Setting[[:space:]]Default[[:space:]]Values[[:space:]]for[[:space:]]Optional[[:space:]]Arguments[[:space:]]inside[[:space:]]a[[:space:]]Function[[:space:]]Header.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/006[[:space:]]args[[:space:]]Many[[:space:]]Positional[[:space:]]Arguments.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/007[[:space:]]kwargs[[:space:]]Many[[:space:]]Keyword[[:space:]]Arguments.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/009[[:space:]]Buttons,[[:space:]]Entry,[[:space:]]and[[:space:]]Setting[[:space:]]Component[[:space:]]Options.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/010[[:space:]]Other[[:space:]]Tkinter[[:space:]]Widgets[[:space:]]Radiobuttons,[[:space:]]Scales,[[:space:]]Checkbuttons[[:space:]]and[[:space:]]more.mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/011[[:space:]]Tkinter[[:space:]]Layout[[:space:]]Managers[[:space:]]pack(),[[:space:]]place()[[:space:]]and[[:space:]]grid().mp4 filter=lfs diff=lfs merge=lfs -text +part2/27[[:space:]]-[[:space:]]Day[[:space:]]27[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]args,[[:space:]]kwargs[[:space:]]and[[:space:]]Creating[[:space:]]GUI[[:space:]]Programs/012[[:space:]]Mile[[:space:]]to[[:space:]]Kilometers[[:space:]]Converter[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/001[[:space:]]Day[[:space:]]28[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/002[[:space:]]How[[:space:]]to[[:space:]]work[[:space:]]with[[:space:]]the[[:space:]]Canvas[[:space:]]Widget[[:space:]]and[[:space:]]Add[[:space:]]Images[[:space:]]to[[:space:]]Tkinter.mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/003[[:space:]]Challenge[[:space:]]-[[:space:]]Complete[[:space:]]the[[:space:]]Application's[[:space:]]User[[:space:]]Interface[[:space:]](UI).mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/004[[:space:]]Add[[:space:]]a[[:space:]]Count[[:space:]]Down[[:space:]]Mechanism.mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/005[[:space:]]Dynamic[[:space:]]Typing[[:space:]]Explained.mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/006[[:space:]]Setting[[:space:]]Different[[:space:]]Timer[[:space:]]Sessions[[:space:]]and[[:space:]]Values.mp4 filter=lfs diff=lfs merge=lfs -text +part2/28[[:space:]]-[[:space:]]Day[[:space:]]28[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Tkinter,[[:space:]]Dynamic[[:space:]]Typing[[:space:]]and[[:space:]]the[[:space:]]Pomodoro[[:space:]]GUI[[:space:]]Application/007[[:space:]]Adding[[:space:]]Checkmarks[[:space:]]and[[:space:]]Resetting[[:space:]]the[[:space:]]Application.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/001[[:space:]]Day[[:space:]]29[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/002[[:space:]]Challenge[[:space:]]1[[:space:]]-[[:space:]]Working[[:space:]]with[[:space:]]Images[[:space:]]and[[:space:]]Setting[[:space:]]up[[:space:]]the[[:space:]]Canvas.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/003[[:space:]]Challenge[[:space:]]2[[:space:]]-[[:space:]]Use[[:space:]]grid()[[:space:]]and[[:space:]]columnspan[[:space:]]to[[:space:]]Complete[[:space:]]the[[:space:]]User[[:space:]]Interface.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/004[[:space:]]Solution[[:space:]]to[[:space:]]the[[:space:]]Creating[[:space:]]the[[:space:]]Grid[[:space:]]Layout.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/005[[:space:]]Challenge[[:space:]]3[[:space:]]-[[:space:]]Saving[[:space:]]Data[[:space:]]to[[:space:]]File.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/006[[:space:]]Dialog[[:space:]]Boxes[[:space:]]and[[:space:]]Pop-Ups[[:space:]]in[[:space:]]Tkinter.mp4 filter=lfs diff=lfs merge=lfs -text +part3/29[[:space:]]-[[:space:]]Day[[:space:]]29[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Building[[:space:]]a[[:space:]]Password[[:space:]]Manager[[:space:]]GUI[[:space:]]App[[:space:]]with[[:space:]]Tkinter/007[[:space:]]Generate[[:space:]]a[[:space:]]Password[[:space:]]&[[:space:]]Copy[[:space:]]it[[:space:]]to[[:space:]]the[[:space:]]Clipboard.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/001[[:space:]]Day[[:space:]]30[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/002[[:space:]]Catching[[:space:]]Exceptions[[:space:]]The[[:space:]]try[[:space:]]catch[[:space:]]except[[:space:]]finally[[:space:]]Pattern.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/003[[:space:]]Raising[[:space:]]your[[:space:]]own[[:space:]]Exceptions.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/004[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]IndexError[[:space:]]Handling.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/005[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]KeyError[[:space:]]Handling.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/006[[:space:]]Code[[:space:]]Exercise[[:space:]]Exception[[:space:]]Handling[[:space:]]in[[:space:]]the[[:space:]]NATO[[:space:]]Phonetic[[:space:]]Alphabet[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/007[[:space:]]Write,[[:space:]]read[[:space:]]and[[:space:]]update[[:space:]]JSON[[:space:]]data[[:space:]]in[[:space:]]the[[:space:]]Password[[:space:]]Manager.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/008[[:space:]]Challenge[[:space:]]1[[:space:]]-[[:space:]]Handling[[:space:]]Exceptions[[:space:]]in[[:space:]]the[[:space:]]Password[[:space:]]Manager.mp4 filter=lfs diff=lfs merge=lfs -text +part3/30[[:space:]]-[[:space:]]Day[[:space:]]30[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Errors,[[:space:]]Exceptions[[:space:]]and[[:space:]]JSON[[:space:]]Data[[:space:]]Improving[[:space:]]the[[:space:]]Password/009[[:space:]]Challenge[[:space:]]2[[:space:]]-[[:space:]]Search[[:space:]]for[[:space:]]a[[:space:]]Website[[:space:]]in[[:space:]]the[[:space:]]Password[[:space:]]Manager.mp4 filter=lfs diff=lfs merge=lfs -text +part3/31[[:space:]]-[[:space:]]Day[[:space:]]31[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Flash[[:space:]]Card[[:space:]]App[[:space:]]Capstone[[:space:]]Project/001[[:space:]]Day[[:space:]]31[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/31[[:space:]]-[[:space:]]Day[[:space:]]31[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Flash[[:space:]]Card[[:space:]]App[[:space:]]Capstone[[:space:]]Project/003[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Creating[[:space:]]the[[:space:]]UI.mp4 filter=lfs diff=lfs merge=lfs -text +part3/31[[:space:]]-[[:space:]]Day[[:space:]]31[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Flash[[:space:]]Card[[:space:]]App[[:space:]]Capstone[[:space:]]Project/005[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Creating[[:space:]]New[[:space:]]Flash[[:space:]]Cards.mp4 filter=lfs diff=lfs merge=lfs -text +part3/31[[:space:]]-[[:space:]]Day[[:space:]]31[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Flash[[:space:]]Card[[:space:]]App[[:space:]]Capstone[[:space:]]Project/007[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Flipping[[:space:]]Cards.mp4 filter=lfs diff=lfs merge=lfs -text +part3/31[[:space:]]-[[:space:]]Day[[:space:]]31[[:space:]]-[[:space:]]Intermediate[[:space:]]-[[:space:]]Flash[[:space:]]Card[[:space:]]App[[:space:]]Capstone[[:space:]]Project/009[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Saving[[:space:]]Progress.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/001[[:space:]]Day[[:space:]]32[[:space:]]Goals[[:space:]]what[[:space:]]we[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/003[[:space:]]How[[:space:]]to[[:space:]]Send[[:space:]]Emails[[:space:]]with[[:space:]]Python[[:space:]]using[[:space:]]SMTP.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/004[[:space:]]Working[[:space:]]with[[:space:]]the[[:space:]]datetime[[:space:]]Module.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/005[[:space:]]Challenge[[:space:]]1[[:space:]]-[[:space:]]Send[[:space:]]Motivational[[:space:]]Quotes[[:space:]]on[[:space:]]Mondays[[:space:]]via[[:space:]]Email.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/006[[:space:]]Automated[[:space:]]Birthday[[:space:]]Wisher[[:space:]]Project[[:space:]]Challenge.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/007[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]the[[:space:]]Automated[[:space:]]Birthday[[:space:]]Wisher.mp4 filter=lfs diff=lfs merge=lfs -text +part3/32[[:space:]]-[[:space:]]Day[[:space:]]32[[:space:]]-[[:space:]]Intermediate+[[:space:]]Send[[:space:]]Email[[:space:]](smtplib)[[:space:]]&[[:space:]]Manage[[:space:]]Dates[[:space:]](datetime)/008[[:space:]]Run[[:space:]]Your[[:space:]]Python[[:space:]]Code[[:space:]]in[[:space:]]the[[:space:]]Cloud!.mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/001[[:space:]]Day[[:space:]]33[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/002[[:space:]]What[[:space:]]are[[:space:]]Application[[:space:]]Programming[[:space:]]Interfaces[[:space:]](APIs).mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/003[[:space:]]API[[:space:]]Endpoints[[:space:]]and[[:space:]]Making[[:space:]]API[[:space:]]Calls.mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/004[[:space:]]Working[[:space:]]with[[:space:]]Responses[[:space:]]HTTP[[:space:]]Codes,[[:space:]]Exceptions[[:space:]]&[[:space:]]JSON[[:space:]]Data.mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/005[[:space:]]Challenge[[:space:]]-[[:space:]]Build[[:space:]]a[[:space:]]Kanye[[:space:]]Quotes[[:space:]]App[[:space:]]using[[:space:]]the[[:space:]]Kanye[[:space:]]Rest[[:space:]]API.mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/006[[:space:]]Understand[[:space:]]API[[:space:]]Parameters[[:space:]]Match[[:space:]]Sunset[[:space:]]Times[[:space:]]with[[:space:]]the[[:space:]]Current[[:space:]]Time.mp4 filter=lfs diff=lfs merge=lfs -text +part3/33[[:space:]]-[[:space:]]Day[[:space:]]33[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Endpoints[[:space:]]&[[:space:]]API[[:space:]]Parameters[[:space:]]-[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier/007[[:space:]]ISS[[:space:]]Overhead[[:space:]]Notifier[[:space:]]Project[[:space:]]-[[:space:]]Challenge[[:space:]]&[[:space:]]Solution.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/001[[:space:]]Day[[:space:]]34[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/002[[:space:]]Trivia[[:space:]]Question[[:space:]]API[[:space:]]Challenge.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/003[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]getting[[:space:]]Trivia[[:space:]]Questions.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/004[[:space:]]Unescaping[[:space:]]HTML[[:space:]]Entities.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/005[[:space:]]Class[[:space:]]based[[:space:]]Tkinter[[:space:]]UI.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/006[[:space:]]Python[[:space:]]Typing[[:space:]]&[[:space:]]Showing[[:space:]]the[[:space:]]Next[[:space:]]Question[[:space:]]in[[:space:]]the[[:space:]]GUI.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/007[[:space:]]Python[[:space:]]Typing[[:space:]]Type[[:space:]]Hints[[:space:]]and[[:space:]]Arrows[[:space:]]-.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/008[[:space:]]Check[[:space:]]the[[:space:]]Answer.mp4 filter=lfs diff=lfs merge=lfs -text +part3/34[[:space:]]-[[:space:]]Day[[:space:]]34[[:space:]]-[[:space:]]Intermediate+[[:space:]]API[[:space:]]Practice[[:space:]]-[[:space:]]Creating[[:space:]]a[[:space:]]GUI[[:space:]]Quiz[[:space:]]App/009[[:space:]]Give[[:space:]]Feedback[[:space:]]to[[:space:]]the[[:space:]]Player,[[:space:]]Keep[[:space:]]Score[[:space:]]and[[:space:]]Fix[[:space:]]the[[:space:]]Bugs[[:space:]]=).mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/001[[:space:]]Day[[:space:]]35[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/002[[:space:]]What[[:space:]]is[[:space:]]API[[:space:]]Authentication[[:space:]]and[[:space:]]Why[[:space:]]Do[[:space:]]We[[:space:]]Need[[:space:]]to[[:space:]]Authenticate[[:space:]]Ourselves.mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/003[[:space:]]Using[[:space:]]API[[:space:]]Keys[[:space:]]to[[:space:]]Authenticate[[:space:]]and[[:space:]]Get[[:space:]]the[[:space:]]Weather[[:space:]]from[[:space:]]OpenWeatherMap.mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/004[[:space:]]Challenge[[:space:]]-[[:space:]]Check[[:space:]]if[[:space:]]it[[:space:]]Will[[:space:]]Rain[[:space:]]in[[:space:]]the[[:space:]]Next[[:space:]]12[[:space:]]Hours.mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/005[[:space:]]Sending[[:space:]]SMS[[:space:]]via[[:space:]]the[[:space:]]Twilio[[:space:]]API.mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/006[[:space:]]Use[[:space:]]PythonAnywhere[[:space:]]to[[:space:]]Automate[[:space:]]the[[:space:]]Python[[:space:]]Script.mp4 filter=lfs diff=lfs merge=lfs -text +part3/35[[:space:]]-[[:space:]]Day[[:space:]]35[[:space:]]-[[:space:]]Intermediate+[[:space:]]Keys,[[:space:]]Authentication[[:space:]]&[[:space:]]Environment[[:space:]]Variables[[:space:]]Send[[:space:]]SMS/007[[:space:]]Understanding[[:space:]]Environment[[:space:]]Variables[[:space:]]and[[:space:]]Hiding[[:space:]]API[[:space:]]Keys.mp4 filter=lfs diff=lfs merge=lfs -text +part3/36[[:space:]]-[[:space:]]Day[[:space:]]36[[:space:]]-[[:space:]]Intermediate+[[:space:]]Stock[[:space:]]Trading[[:space:]]News[[:space:]]Alert[[:space:]]Project/001[[:space:]]Day[[:space:]]36[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/36[[:space:]]-[[:space:]]Day[[:space:]]36[[:space:]]-[[:space:]]Intermediate+[[:space:]]Stock[[:space:]]Trading[[:space:]]News[[:space:]]Alert[[:space:]]Project/003[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Step[[:space:]]1[[:space:]]-[[:space:]]Check[[:space:]]for[[:space:]]Stock[[:space:]]Price[[:space:]]Movements.mp4 filter=lfs diff=lfs merge=lfs -text +part3/36[[:space:]]-[[:space:]]Day[[:space:]]36[[:space:]]-[[:space:]]Intermediate+[[:space:]]Stock[[:space:]]Trading[[:space:]]News[[:space:]]Alert[[:space:]]Project/004[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Step[[:space:]]2[[:space:]]-[[:space:]]Get[[:space:]]the[[:space:]]News[[:space:]]Articles.mp4 filter=lfs diff=lfs merge=lfs -text +part3/36[[:space:]]-[[:space:]]Day[[:space:]]36[[:space:]]-[[:space:]]Intermediate+[[:space:]]Stock[[:space:]]Trading[[:space:]]News[[:space:]]Alert[[:space:]]Project/005[[:space:]]Solution[[:space:]]&[[:space:]]Walkthrough[[:space:]]for[[:space:]]Step[[:space:]]3[[:space:]]-[[:space:]]Send[[:space:]]the[[:space:]]SMS[[:space:]]Messages.mp4 filter=lfs diff=lfs merge=lfs -text +part3/37[[:space:]]-[[:space:]]Day[[:space:]]37[[:space:]]-[[:space:]]Intermediate+[[:space:]]Habit[[:space:]]Tracking[[:space:]]Project[[:space:]]API[[:space:]]Post[[:space:]]Requests[[:space:]]&[[:space:]]Headers/001[[:space:]]Day[[:space:]]37[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/37[[:space:]]-[[:space:]]Day[[:space:]]37[[:space:]]-[[:space:]]Intermediate+[[:space:]]Habit[[:space:]]Tracking[[:space:]]Project[[:space:]]API[[:space:]]Post[[:space:]]Requests[[:space:]]&[[:space:]]Headers/002[[:space:]]HTTP[[:space:]]Post[[:space:]]Requests.mp4 filter=lfs diff=lfs merge=lfs -text +part3/37[[:space:]]-[[:space:]]Day[[:space:]]37[[:space:]]-[[:space:]]Intermediate+[[:space:]]Habit[[:space:]]Tracking[[:space:]]Project[[:space:]]API[[:space:]]Post[[:space:]]Requests[[:space:]]&[[:space:]]Headers/003[[:space:]]Advanced[[:space:]]Authentication[[:space:]]using[[:space:]]an[[:space:]]HTTP[[:space:]]Header.mp4 filter=lfs diff=lfs merge=lfs -text +part3/37[[:space:]]-[[:space:]]Day[[:space:]]37[[:space:]]-[[:space:]]Intermediate+[[:space:]]Habit[[:space:]]Tracking[[:space:]]Project[[:space:]]API[[:space:]]Post[[:space:]]Requests[[:space:]]&[[:space:]]Headers/004[[:space:]]Challenge[[:space:]]Add[[:space:]]a[[:space:]]Pixel[[:space:]]to[[:space:]]the[[:space:]]Habit[[:space:]]Tracker[[:space:]]using[[:space:]]a[[:space:]]Post[[:space:]]Request.mp4 filter=lfs diff=lfs merge=lfs -text +part3/37[[:space:]]-[[:space:]]Day[[:space:]]37[[:space:]]-[[:space:]]Intermediate+[[:space:]]Habit[[:space:]]Tracking[[:space:]]Project[[:space:]]API[[:space:]]Post[[:space:]]Requests[[:space:]]&[[:space:]]Headers/005[[:space:]]Autofilling[[:space:]]today's[[:space:]]date[[:space:]]using[[:space:]]strftime.mp4 filter=lfs diff=lfs merge=lfs -text +part3/37[[:space:]]-[[:space:]]Day[[:space:]]37[[:space:]]-[[:space:]]Intermediate+[[:space:]]Habit[[:space:]]Tracking[[:space:]]Project[[:space:]]API[[:space:]]Post[[:space:]]Requests[[:space:]]&[[:space:]]Headers/006[[:space:]]How[[:space:]]to[[:space:]]use[[:space:]]HTTP[[:space:]]Put[[:space:]]and[[:space:]]Delete[[:space:]]Requests.mp4 filter=lfs diff=lfs merge=lfs -text +part3/38[[:space:]]-[[:space:]]Day[[:space:]]38[[:space:]]-[[:space:]]Intermediate+[[:space:]]Workout[[:space:]]Tracking[[:space:]]Using[[:space:]]Google[[:space:]]Sheets/001[[:space:]]Day[[:space:]]38[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/39[[:space:]]-[[:space:]]Day[[:space:]]39[[:space:]]-[[:space:]]Intermediate+[[:space:]]Capstone[[:space:]]Part[[:space:]]1[[:space:]]Flight[[:space:]]Deal[[:space:]]Finder/001[[:space:]]Day[[:space:]]39[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/40[[:space:]]-[[:space:]]Day[[:space:]]40[[:space:]]-[[:space:]]Intermediate+[[:space:]]Capstone[[:space:]]Part[[:space:]]2[[:space:]]Flight[[:space:]]Club/001[[:space:]]Day[[:space:]]40[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/001[[:space:]]How[[:space:]]Does[[:space:]]the[[:space:]]Internet[[:space:]]Actually[[:space:]]Work.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/002[[:space:]]How[[:space:]]Do[[:space:]]Websites[[:space:]]Actually[[:space:]]Work.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/004[[:space:]]What[[:space:]]is[[:space:]]HTML.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/005[[:space:]]HTML[[:space:]]Heading[[:space:]]Elements.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/006[[:space:]]HTML[[:space:]]Paragraph[[:space:]]Elements.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/007[[:space:]]Self[[:space:]]Closing[[:space:]]Tags.mp4 filter=lfs diff=lfs merge=lfs -text +part3/41[[:space:]]-[[:space:]]Day[[:space:]]41[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]HTML/008[[:space:]]Day[[:space:]]41[[:space:]]Project[[:space:]]-[[:space:]]Movie[[:space:]]Ranking.mp4 filter=lfs diff=lfs merge=lfs -text +part3/42[[:space:]]-[[:space:]]Day[[:space:]]42[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]HTML/001[[:space:]]HTML[[:space:]]Boilerplate.mp4 filter=lfs diff=lfs merge=lfs -text +part3/42[[:space:]]-[[:space:]]Day[[:space:]]42[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]HTML/002[[:space:]]The[[:space:]]List[[:space:]]Element.mp4 filter=lfs diff=lfs merge=lfs -text +part3/42[[:space:]]-[[:space:]]Day[[:space:]]42[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]HTML/003[[:space:]]Nesting[[:space:]]and[[:space:]]Indentation.mp4 filter=lfs diff=lfs merge=lfs -text +part3/42[[:space:]]-[[:space:]]Day[[:space:]]42[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]HTML/004[[:space:]]Anchor[[:space:]]Elements.mp4 filter=lfs diff=lfs merge=lfs -text +part3/42[[:space:]]-[[:space:]]Day[[:space:]]42[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]HTML/005[[:space:]]Image[[:space:]]Elements.mp4 filter=lfs diff=lfs merge=lfs -text +part3/42[[:space:]]-[[:space:]]Day[[:space:]]42[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]HTML/006[[:space:]]Day[[:space:]]42[[:space:]]Project[[:space:]]-[[:space:]]Birthday[[:space:]]Invite[[:space:]]Website.mp4 filter=lfs diff=lfs merge=lfs -text +part3/43[[:space:]]-[[:space:]]Day[[:space:]]43[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]CSS/001[[:space:]]Why[[:space:]]do[[:space:]]we[[:space:]]need[[:space:]]CSS.mp4 filter=lfs diff=lfs merge=lfs -text +part3/43[[:space:]]-[[:space:]]Day[[:space:]]43[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]CSS/002[[:space:]]How[[:space:]]to[[:space:]]add[[:space:]]CSS.mp4 filter=lfs diff=lfs merge=lfs -text +part3/43[[:space:]]-[[:space:]]Day[[:space:]]43[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]CSS/004[[:space:]]CSS[[:space:]]Selectors.mp4 filter=lfs diff=lfs merge=lfs -text +part3/43[[:space:]]-[[:space:]]Day[[:space:]]43[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Introduction[[:space:]]to[[:space:]]CSS/005[[:space:]]Day[[:space:]]43[[:space:]]Project[[:space:]]-[[:space:]]Colour[[:space:]]Vocab[[:space:]]Website.mp4 filter=lfs diff=lfs merge=lfs -text +part3/44[[:space:]]-[[:space:]]Day[[:space:]]44[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]CSS/001[[:space:]]CSS[[:space:]]Colours.mp4 filter=lfs diff=lfs merge=lfs -text +part3/44[[:space:]]-[[:space:]]Day[[:space:]]44[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]CSS/002[[:space:]]Font[[:space:]]Properties.mp4 filter=lfs diff=lfs merge=lfs -text +part3/44[[:space:]]-[[:space:]]Day[[:space:]]44[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]CSS/003[[:space:]]Inspecting[[:space:]]CSS.mp4 filter=lfs diff=lfs merge=lfs -text +part3/44[[:space:]]-[[:space:]]Day[[:space:]]44[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]CSS/004[[:space:]]The[[:space:]]CSS[[:space:]]Box[[:space:]]Model[[:space:]]-[[:space:]]Margin,[[:space:]]Padding[[:space:]]and[[:space:]]Border.mp4 filter=lfs diff=lfs merge=lfs -text +part3/44[[:space:]]-[[:space:]]Day[[:space:]]44[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]-[[:space:]]Intermediate[[:space:]]CSS/005[[:space:]]Day[[:space:]]44[[:space:]]Project[[:space:]]-[[:space:]]Motivational[[:space:]]Poster[[:space:]]Website.mp4 filter=lfs diff=lfs merge=lfs -text +part3/45[[:space:]]-[[:space:]]Day[[:space:]]45[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]with[[:space:]]Beautiful[[:space:]]Soup/001[[:space:]]Day[[:space:]]45[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/45[[:space:]]-[[:space:]]Day[[:space:]]45[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]with[[:space:]]Beautiful[[:space:]]Soup/002[[:space:]]Parsing[[:space:]]HTML[[:space:]]and[[:space:]]Making[[:space:]]Soup.mp4 filter=lfs diff=lfs merge=lfs -text +part3/45[[:space:]]-[[:space:]]Day[[:space:]]45[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]with[[:space:]]Beautiful[[:space:]]Soup/003[[:space:]]Finding[[:space:]]and[[:space:]]Selecting[[:space:]]Particular[[:space:]]Elements[[:space:]]with[[:space:]]BeautifulSoup.mp4 filter=lfs diff=lfs merge=lfs -text +part3/45[[:space:]]-[[:space:]]Day[[:space:]]45[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]with[[:space:]]Beautiful[[:space:]]Soup/005[[:space:]]Scraping[[:space:]]a[[:space:]]Live[[:space:]]Website.mp4 filter=lfs diff=lfs merge=lfs -text +part3/45[[:space:]]-[[:space:]]Day[[:space:]]45[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]with[[:space:]]Beautiful[[:space:]]Soup/006[[:space:]]Is[[:space:]]Web[[:space:]]Scraping[[:space:]]Legal.mp4 filter=lfs diff=lfs merge=lfs -text +part3/45[[:space:]]-[[:space:]]Day[[:space:]]45[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]with[[:space:]]Beautiful[[:space:]]Soup/007[[:space:]]100[[:space:]]Movies[[:space:]]that[[:space:]]You[[:space:]]Must[[:space:]]Watch.mp4 filter=lfs diff=lfs merge=lfs -text +part3/46[[:space:]]-[[:space:]]Day[[:space:]]46[[:space:]]-[[:space:]]Intermediate+[[:space:]]Create[[:space:]]a[[:space:]]Spotify[[:space:]]Playlist[[:space:]]using[[:space:]]the[[:space:]]Musical[[:space:]]Time[[:space:]]Machine/001[[:space:]]Day[[:space:]]46[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/47[[:space:]]-[[:space:]]Day[[:space:]]47[[:space:]]-[[:space:]]Intermediate+[[:space:]]Create[[:space:]]an[[:space:]]Automated[[:space:]]Amazon[[:space:]]Price[[:space:]]Tracker/001[[:space:]]Day[[:space:]]47[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/001[[:space:]]Day[[:space:]]48[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/002[[:space:]]How[[:space:]]to[[:space:]]Install[[:space:]]&[[:space:]]Set[[:space:]]Up[[:space:]]Selenium.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/003[[:space:]]How[[:space:]]to[[:space:]]Find[[:space:]]and[[:space:]]Select[[:space:]]Elements[[:space:]]on[[:space:]]a[[:space:]]Website[[:space:]]with[[:space:]]Selenium.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/004[[:space:]]Challenge[[:space:]]Use[[:space:]]Selenium[[:space:]]to[[:space:]]Scrape[[:space:]]Website[[:space:]]Data.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/005[[:space:]]Challenge[[:space:]]Use[[:space:]]Selenium[[:space:]]in[[:space:]]a[[:space:]]Blank[[:space:]]Project[[:space:]]&[[:space:]]Scrape[[:space:]]a[[:space:]]Different[[:space:]]Piece[[:space:]]of[[:space:]]Data.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/006[[:space:]]How[[:space:]]to[[:space:]]Automate[[:space:]]Filling[[:space:]]Out[[:space:]]Forms[[:space:]]and[[:space:]]Clicking[[:space:]]Buttons[[:space:]]with[[:space:]]Selenium.mp4 filter=lfs diff=lfs merge=lfs -text +part3/48[[:space:]]-[[:space:]]Day[[:space:]]48[[:space:]]-[[:space:]]Intermediate+[[:space:]]Selenium[[:space:]]Webdriver[[:space:]]Browser[[:space:]]and[[:space:]]Game[[:space:]]Playing[[:space:]]Bot/007[[:space:]]The[[:space:]]Cookie[[:space:]]Clicker[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part3/49[[:space:]]-[[:space:]]Day[[:space:]]49[[:space:]]-[[:space:]]Intermediate+[[:space:]]Automating[[:space:]]Job[[:space:]]Applications[[:space:]]on[[:space:]]LinkedIn/001[[:space:]]Day[[:space:]]49[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/50[[:space:]]-[[:space:]]Day[[:space:]]50[[:space:]]-[[:space:]]Intermediate+[[:space:]]Auto[[:space:]]Tinder[[:space:]]Swiping[[:space:]]Bot/001[[:space:]]Day[[:space:]]50[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/51[[:space:]]-[[:space:]]Day[[:space:]]51[[:space:]]-[[:space:]]Intermediate+[[:space:]]Internet[[:space:]]Speed[[:space:]]Twitter[[:space:]]Complaint[[:space:]]Bot/001[[:space:]]Day[[:space:]]51[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/52[[:space:]]-[[:space:]]Day[[:space:]]52[[:space:]]-[[:space:]]Intermediate+[[:space:]]Instagram[[:space:]]Follower[[:space:]]Bot/001[[:space:]]Day[[:space:]]52[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/53[[:space:]]-[[:space:]]Day[[:space:]]53[[:space:]]-[[:space:]]Intermediate+[[:space:]]Web[[:space:]]Scraping[[:space:]]Capstone[[:space:]]-[[:space:]]Data[[:space:]]Entry[[:space:]]Job[[:space:]]Automation/001[[:space:]]Day[[:space:]]53[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/001[[:space:]]Understanding[[:space:]]Backend[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/002[[:space:]]Create[[:space:]]your[[:space:]]First[[:space:]]Web[[:space:]]Server[[:space:]]with[[:space:]]Flask.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/003[[:space:]]Understand[[:space:]]the[[:space:]]Command[[:space:]]Line[[:space:]]on[[:space:]]Windows[[:space:]]and[[:space:]]Mac.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/004[[:space:]]__name__[[:space:]]and[[:space:]]__main__[[:space:]][[:space:]]Special[[:space:]]Attributes[[:space:]]built[[:space:]]into[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/005[[:space:]]Python[[:space:]]Functions[[:space:]]as[[:space:]]First[[:space:]]Class[[:space:]]Objects[[:space:]]Passing[[:space:]]&[[:space:]]Nesting[[:space:]]Functions.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/006[[:space:]]Understanding[[:space:]]Python[[:space:]]Decorator[[:space:]]Functions[[:space:]]and[[:space:]]the[[:space:]]@[[:space:]]Syntax.mp4 filter=lfs diff=lfs merge=lfs -text +part3/54[[:space:]]-[[:space:]]Day[[:space:]]54[[:space:]]-[[:space:]]Intermediate+[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Development[[:space:]]with[[:space:]]Flask/007[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Create[[:space:]]your[[:space:]]own[[:space:]]Python[[:space:]]Decorator.mp4 filter=lfs diff=lfs merge=lfs -text +part3/55[[:space:]]-[[:space:]]Day[[:space:]]55[[:space:]]-[[:space:]]Intermediate+[[:space:]]HTML[[:space:]]&[[:space:]]URL[[:space:]]Parsing[[:space:]]in[[:space:]]Flask[[:space:]]and[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game/001[[:space:]]Day[[:space:]]55[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/55[[:space:]]-[[:space:]]Day[[:space:]]55[[:space:]]-[[:space:]]Intermediate+[[:space:]]HTML[[:space:]]&[[:space:]]URL[[:space:]]Parsing[[:space:]]in[[:space:]]Flask[[:space:]]and[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game/002[[:space:]]Working[[:space:]]Flask[[:space:]]URL[[:space:]]Paths[[:space:]]and[[:space:]]the[[:space:]]Flask[[:space:]]Debugger.mp4 filter=lfs diff=lfs merge=lfs -text +part3/55[[:space:]]-[[:space:]]Day[[:space:]]55[[:space:]]-[[:space:]]Intermediate+[[:space:]]HTML[[:space:]]&[[:space:]]URL[[:space:]]Parsing[[:space:]]in[[:space:]]Flask[[:space:]]and[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game/003[[:space:]]Rendering[[:space:]]HTML[[:space:]]Elements[[:space:]]with[[:space:]]Flask.mp4 filter=lfs diff=lfs merge=lfs -text +part3/55[[:space:]]-[[:space:]]Day[[:space:]]55[[:space:]]-[[:space:]]Intermediate+[[:space:]]HTML[[:space:]]&[[:space:]]URL[[:space:]]Parsing[[:space:]]in[[:space:]]Flask[[:space:]]and[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game/004[[:space:]]Challenge[[:space:]]Use[[:space:]]Python[[:space:]]Decorators[[:space:]]to[[:space:]]Style[[:space:]]HTML[[:space:]]Tags.mp4 filter=lfs diff=lfs merge=lfs -text +part3/55[[:space:]]-[[:space:]]Day[[:space:]]55[[:space:]]-[[:space:]]Intermediate+[[:space:]]HTML[[:space:]]&[[:space:]]URL[[:space:]]Parsing[[:space:]]in[[:space:]]Flask[[:space:]]and[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game/005[[:space:]]Advanced[[:space:]]Decorators[[:space:]]with[[:space:]]args[[:space:]]and[[:space:]]kwargs.mp4 filter=lfs diff=lfs merge=lfs -text +part3/55[[:space:]]-[[:space:]]Day[[:space:]]55[[:space:]]-[[:space:]]Intermediate+[[:space:]]HTML[[:space:]]&[[:space:]]URL[[:space:]]Parsing[[:space:]]in[[:space:]]Flask[[:space:]]and[[:space:]]the[[:space:]]Higher[[:space:]]Lower[[:space:]]Game/006[[:space:]]\[Interactive[[:space:]]Coding[[:space:]]Exercise\][[:space:]]Advanced[[:space:]]Decorators.mp4 filter=lfs diff=lfs merge=lfs -text +part3/56[[:space:]]-[[:space:]]Day[[:space:]]56[[:space:]]-[[:space:]]Intermediate+[[:space:]]Rendering[[:space:]]HTMLStatic[[:space:]]files[[:space:]]and[[:space:]]Using[[:space:]]Website[[:space:]]Templates/001[[:space:]]Day[[:space:]]56[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/56[[:space:]]-[[:space:]]Day[[:space:]]56[[:space:]]-[[:space:]]Intermediate+[[:space:]]Rendering[[:space:]]HTMLStatic[[:space:]]files[[:space:]]and[[:space:]]Using[[:space:]]Website[[:space:]]Templates/002[[:space:]]Rendering[[:space:]]HTML[[:space:]]Files[[:space:]]with[[:space:]]Flask.mp4 filter=lfs diff=lfs merge=lfs -text +part3/56[[:space:]]-[[:space:]]Day[[:space:]]56[[:space:]]-[[:space:]]Intermediate+[[:space:]]Rendering[[:space:]]HTMLStatic[[:space:]]files[[:space:]]and[[:space:]]Using[[:space:]]Website[[:space:]]Templates/003[[:space:]]Serving[[:space:]]Static[[:space:]]Files[[:space:]]using[[:space:]]Flask.mp4 filter=lfs diff=lfs merge=lfs -text +part3/56[[:space:]]-[[:space:]]Day[[:space:]]56[[:space:]]-[[:space:]]Intermediate+[[:space:]]Rendering[[:space:]]HTMLStatic[[:space:]]files[[:space:]]and[[:space:]]Using[[:space:]]Website[[:space:]]Templates/004[[:space:]]How[[:space:]]to[[:space:]]Use[[:space:]]Website[[:space:]]Templates[[:space:]]to[[:space:]]Speed[[:space:]]Up[[:space:]]Web[[:space:]]Development.mp4 filter=lfs diff=lfs merge=lfs -text +part3/56[[:space:]]-[[:space:]]Day[[:space:]]56[[:space:]]-[[:space:]]Intermediate+[[:space:]]Rendering[[:space:]]HTMLStatic[[:space:]]files[[:space:]]and[[:space:]]Using[[:space:]]Website[[:space:]]Templates/006[[:space:]]Solution[[:space:]]and[[:space:]]Walkthrough[[:space:]]for[[:space:]]the[[:space:]]Name[[:space:]]Card[[:space:]]Final[[:space:]]Project.mp4 filter=lfs diff=lfs merge=lfs -text +part3/57[[:space:]]-[[:space:]]Day[[:space:]]57[[:space:]]-[[:space:]]Intermediate+[[:space:]]Templating[[:space:]]with[[:space:]]Jinja[[:space:]]in[[:space:]]Flask[[:space:]]Applications/001[[:space:]]Day[[:space:]]57[[:space:]]Goals[[:space:]]what[[:space:]]you[[:space:]]will[[:space:]]make[[:space:]]by[[:space:]]the[[:space:]]end[[:space:]]of[[:space:]]the[[:space:]]day.mp4 filter=lfs diff=lfs merge=lfs -text +part3/57[[:space:]]-[[:space:]]Day[[:space:]]57[[:space:]]-[[:space:]]Intermediate+[[:space:]]Templating[[:space:]]with[[:space:]]Jinja[[:space:]]in[[:space:]]Flask[[:space:]]Applications/002[[:space:]]Using[[:space:]]Jinja[[:space:]]to[[:space:]]Produce[[:space:]]Dynamic[[:space:]]HTML[[:space:]]Pages.mp4 filter=lfs diff=lfs merge=lfs -text +part3/57[[:space:]]-[[:space:]]Day[[:space:]]57[[:space:]]-[[:space:]]Intermediate+[[:space:]]Templating[[:space:]]with[[:space:]]Jinja[[:space:]]in[[:space:]]Flask[[:space:]]Applications/003[[:space:]]Challenge[[:space:]]Combining[[:space:]]Jinja[[:space:]]Templating[[:space:]]with[[:space:]]APIs.mp4 filter=lfs diff=lfs merge=lfs -text +part3/57[[:space:]]-[[:space:]]Day[[:space:]]57[[:space:]]-[[:space:]]Intermediate+[[:space:]]Templating[[:space:]]with[[:space:]]Jinja[[:space:]]in[[:space:]]Flask[[:space:]]Applications/004[[:space:]]Multiline[[:space:]]Statements[[:space:]]with[[:space:]]Jinja.mp4 filter=lfs diff=lfs merge=lfs -text +part3/57[[:space:]]-[[:space:]]Day[[:space:]]57[[:space:]]-[[:space:]]Intermediate+[[:space:]]Templating[[:space:]]with[[:space:]]Jinja[[:space:]]in[[:space:]]Flask[[:space:]]Applications/005[[:space:]]URL[[:space:]]Building[[:space:]]with[[:space:]]Flask.mp4 filter=lfs diff=lfs merge=lfs -text +part3/58[[:space:]]-[[:space:]]Day[[:space:]]58[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]Bootstrap/002[[:space:]]What[[:space:]]is[[:space:]]Bootstrap.mp4 filter=lfs diff=lfs merge=lfs -text +part3/58[[:space:]]-[[:space:]]Day[[:space:]]58[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]Bootstrap/003[[:space:]]Bootstrap[[:space:]]Layout.mp4 filter=lfs diff=lfs merge=lfs -text +part3/58[[:space:]]-[[:space:]]Day[[:space:]]58[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]Bootstrap/004[[:space:]]Bootstrap[[:space:]]Components.mp4 filter=lfs diff=lfs merge=lfs -text +part3/58[[:space:]]-[[:space:]]Day[[:space:]]58[[:space:]]-[[:space:]]Web[[:space:]]Foundation[[:space:]]Bootstrap/005[[:space:]]Day[[:space:]]58[[:space:]]Project[[:space:]]-[[:space:]]A[[:space:]]Startup[[:space:]]Website[[:space:]]for[[:space:]]TinDog.mp4 filter=lfs diff=lfs merge=lfs -text +part3/65[[:space:]]-[[:space:]]Day[[:space:]]65[[:space:]]-[[:space:]]Web[[:space:]]Design[[:space:]]School[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]a[[:space:]]Website[[:space:]]that[[:space:]]People[[:space:]]will[[:space:]]Love/001[[:space:]]Introduction[[:space:]]to[[:space:]]Web[[:space:]]Design.mp4 filter=lfs diff=lfs merge=lfs -text +part3/65[[:space:]]-[[:space:]]Day[[:space:]]65[[:space:]]-[[:space:]]Web[[:space:]]Design[[:space:]]School[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]a[[:space:]]Website[[:space:]]that[[:space:]]People[[:space:]]will[[:space:]]Love/002[[:space:]]Understanding[[:space:]]Color[[:space:]]Theory.mp4 filter=lfs diff=lfs merge=lfs -text +part3/65[[:space:]]-[[:space:]]Day[[:space:]]65[[:space:]]-[[:space:]]Web[[:space:]]Design[[:space:]]School[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]a[[:space:]]Website[[:space:]]that[[:space:]]People[[:space:]]will[[:space:]]Love/003[[:space:]]Understanding[[:space:]]Typography[[:space:]]and[[:space:]]How[[:space:]]to[[:space:]]Choose[[:space:]]Fonts.mp4 filter=lfs diff=lfs merge=lfs -text +part3/65[[:space:]]-[[:space:]]Day[[:space:]]65[[:space:]]-[[:space:]]Web[[:space:]]Design[[:space:]]School[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]a[[:space:]]Website[[:space:]]that[[:space:]]People[[:space:]]will[[:space:]]Love/004[[:space:]]Manage[[:space:]]ATTENTION[[:space:]]with[[:space:]]effective[[:space:]]User[[:space:]]Interface[[:space:]](UI)[[:space:]]Design.mp4 filter=lfs diff=lfs merge=lfs -text +part3/65[[:space:]]-[[:space:]]Day[[:space:]]65[[:space:]]-[[:space:]]Web[[:space:]]Design[[:space:]]School[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]a[[:space:]]Website[[:space:]]that[[:space:]]People[[:space:]]will[[:space:]]Love/005[[:space:]]User[[:space:]]Experience[[:space:]](UX)[[:space:]]Design.mp4 filter=lfs diff=lfs merge=lfs -text +part3/65[[:space:]]-[[:space:]]Day[[:space:]]65[[:space:]]-[[:space:]]Web[[:space:]]Design[[:space:]]School[[:space:]]-[[:space:]]How[[:space:]]to[[:space:]]Create[[:space:]]a[[:space:]]Website[[:space:]]that[[:space:]]People[[:space:]]will[[:space:]]Love/006[[:space:]]Web[[:space:]]Design[[:space:]]in[[:space:]]Practice[[:space:]]-[[:space:]]Let's[[:space:]]apply[[:space:]]what[[:space:]]we've[[:space:]]learnt!.mp4 filter=lfs diff=lfs merge=lfs -text +part3/66[[:space:]]-[[:space:]]Day[[:space:]]66[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Building[[:space:]]Your[[:space:]]Own[[:space:]]API[[:space:]]with[[:space:]]RESTful[[:space:]]Routing/002[[:space:]]What[[:space:]]is[[:space:]]REST.mp4 filter=lfs diff=lfs merge=lfs -text +part3/66[[:space:]]-[[:space:]]Day[[:space:]]66[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Building[[:space:]]Your[[:space:]]Own[[:space:]]API[[:space:]]with[[:space:]]RESTful[[:space:]]Routing/009[[:space:]]HTTP[[:space:]]PUT[[:space:]]vs.[[:space:]]PATCH.mp4 filter=lfs diff=lfs merge=lfs -text +part3/68[[:space:]]-[[:space:]]Day[[:space:]]68[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Authentication[[:space:]]with[[:space:]]Flask/002[[:space:]]What[[:space:]]is[[:space:]]Authentication.mp4 filter=lfs diff=lfs merge=lfs -text +part3/68[[:space:]]-[[:space:]]Day[[:space:]]68[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Authentication[[:space:]]with[[:space:]]Flask/006[[:space:]]Encryption[[:space:]]and[[:space:]]Hashing.mp4 filter=lfs diff=lfs merge=lfs -text +part3/68[[:space:]]-[[:space:]]Day[[:space:]]68[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Authentication[[:space:]]with[[:space:]]Flask/007[[:space:]]How[[:space:]]to[[:space:]]Hack[[:space:]]Passwords[[:space:]]101.mp4 filter=lfs diff=lfs merge=lfs -text +part3/68[[:space:]]-[[:space:]]Day[[:space:]]68[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Authentication[[:space:]]with[[:space:]]Flask/008[[:space:]]Salting[[:space:]]Passwords.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/002[[:space:]]Install[[:space:]]Git[[:space:]]Bash[[:space:]]on[[:space:]]Windows.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/003[[:space:]]Introduction[[:space:]]to[[:space:]]Version[[:space:]]Control[[:space:]]and[[:space:]]Git.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/004[[:space:]]Version[[:space:]]Control[[:space:]]using[[:space:]]Git[[:space:]]and[[:space:]]the[[:space:]]Command[[:space:]]Line.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/005[[:space:]]Github[[:space:]]and[[:space:]]Remote[[:space:]]Repositories.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/006[[:space:]]Gitignore.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/007[[:space:]]Cloning.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/008[[:space:]]Branching[[:space:]]and[[:space:]]Merging.mp4 filter=lfs diff=lfs merge=lfs -text +part3/70[[:space:]]-[[:space:]]Day[[:space:]]70[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Git,[[:space:]]Github[[:space:]]and[[:space:]]Version[[:space:]]Control/010[[:space:]]Forking[[:space:]]and[[:space:]]Pull[[:space:]]Requests.mp4 filter=lfs diff=lfs merge=lfs -text +part3/71[[:space:]]-[[:space:]]Day[[:space:]]71[[:space:]]-[[:space:]]Advanced[[:space:]]-[[:space:]]Deploying[[:space:]]Your[[:space:]]Web[[:space:]]Application/001[[:space:]]Day[[:space:]]71[[:space:]]Goals[[:space:]]-[[:space:]]Learn[[:space:]]to[[:space:]]Deploy[[:space:]]Your[[:space:]]Website.mp4 filter=lfs diff=lfs merge=lfs -text +part4/101[[:space:]]-[[:space:]]Final[[:space:]]Stretch/001[[:space:]]Recording[[:space:]]of[[:space:]]our[[:space:]]Live[[:space:]]AMA[[:space:]](aka[[:space:]]AAA[[:space:]]-[[:space:]]Ask[[:space:]]Angela[[:space:]]Anything).mp4 filter=lfs diff=lfs merge=lfs -text +part4/101[[:space:]]-[[:space:]]Final[[:space:]]Stretch/002[[:space:]]Study[[:space:]]With[[:space:]]Me.mp4 filter=lfs diff=lfs merge=lfs -text +part4/83[[:space:]]-[[:space:]]Day[[:space:]]83[[:space:]]-[[:space:]]Professional[[:space:]]Portfolio[[:space:]]Project[[:space:]]-[[:space:]]\[Python[[:space:]]Web[[:space:]]Development\]/001[[:space:]]Where[[:space:]]are[[:space:]]the[[:space:]]Videos[[:space:]]and[[:space:]]the[[:space:]]Solution[[:space:]]Code.mp4 filter=lfs diff=lfs merge=lfs -text diff --git "a/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" "b/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" new file mode 100644 index 0000000000000000000000000000000000000000..92f6e72357f936d07dff5ac8aee29e545e4c11d3 --- /dev/null +++ "b/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" @@ -0,0 +1,6 @@ +Do là mình up quá nhiều file nên thằng google drive nó giảm độ phân giải về 360 nên ae xem trên gg drive sẽ rất khó chịu và mờ , Nhìn Đống Video Này Mà Tải về Thì khá là nặng nên mình sẽ chia sẻ cho ae cách xem video trên gg drive độ phân giải cao không lag mà vẫn mượt mà nhé ! + +link hướng dẫn : https://tainguyenmienphi.com/huong-dan-cach-xem-video-tren-gg-drive/ + +Nhóm FB:https://www.facebook.com/groups/1105106193836548 +Nhóm account Tele: https://t.me/EduTecHackVN \ No newline at end of file diff --git a/Download all source code.zip b/Download all source code.zip new file mode 100644 index 0000000000000000000000000000000000000000..28c3e3c33fcb3e8fe9fca3f1f73e158b4c52eae0 --- /dev/null +++ b/Download all source code.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7273166e23da5d870128692e11533aa332cd30a27ceca648db97aaf7b1c6ad7 +size 1201 diff --git "a/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" "b/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" new file mode 100644 index 0000000000000000000000000000000000000000..bbbf5155676f390f80d69ae9563c705d64398c70 --- /dev/null +++ "b/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" @@ -0,0 +1 @@ +tải khóa học tại tainguyenmienphi.com \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/001 What you're going to get from this course.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/001 What you're going to get from this course.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8870a27d16ae53cbbc4bf166cec99bbe54494162 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/001 What you're going to get from this course.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:093d31a51425af47c291065ff3f72809d19f0991d53db3f9e92feffb487dc082 +size 101276960 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/001 What you're going to get from this course_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/001 What you're going to get from this course_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7c143a33cb6b28fc738dd941b4d0f5a8f07be19b --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/001 What you're going to get from this course_vi.srt @@ -0,0 +1,212 @@ +1 +00:00:01,920 --> 00:00:06,600 +Xin chào và chào mừng bạn đến với bootcamp Python tốt nhất thế giới! + +2 +00:00:07,320 --> 00:00:08,490 +Tên tôi là Angela 👩🏻‍🏫 + +3 +00:00:08,610 --> 00:00:12,150 +Tôi là Nhà phát triển cấp cao và là người hướng dẫn chính tại App Brewery, chương trình đào + +4 +00:00:12,630 --> 00:00:16,230 +tạo lập trình được đánh giá cao nhất ở London. Cho đến nay, tôi đã + +5 +00:00:16,440 --> 00:00:20,400 +dạy hơn nửa triệu sinh viên trực tiếp và trực tuyến, và tôi rất + +6 +00:00:20,940 --> 00:00:24,840 +vui được trở thành người hướng dẫn cho bạn trong khóa học này. + +7 +00:00:25,170 --> 00:00:26,520 +Là sinh viên + +8 +00:00:26,580 --> 00:00:31,350 +của khóa học này, bạn sẽ có quyền truy cập hơn 56 giờ nội dung + +9 +00:00:31,740 --> 00:00:36,090 +video HD, bao gồm hướng dẫn từng bước, tương tác, bài tập viết + +10 +00:00:36,210 --> 00:00:37,620 +mã, câu đố, v.v. + +11 +00:00:38,220 --> 00:00:41,700 +Khóa học có cấu trúc xoay quanh thử thách # 100DaysOfCode. + +12 +00:00:42,180 --> 00:00:47,180 +Vì vậy, bạn có thể mong đợi 100 ngày nội dung được tạo ra một cách đáng yêu + +13 +00:00:47,490 --> 00:00:52,490 +sẽ bao gồm mọi khía cạnh của lập trình Python từ Phát triển web đến Khoa học + +14 +00:00:52,980 --> 00:00:53,813 +dữ liệu. + +15 +00:00:53,940 --> 00:00:58,940 +Đây là khóa học duy nhất bạn cần để trở thành một nhà phát triển Python chuyên nghiệp. Mỗi ngày trong khóa học, bạn sẽ sử + +16 +00:00:59,850 --> 00:01:03,780 +dụng những gì bạn đã học để xây dựng một dự án mới. + +17 +00:01:04,440 --> 00:01:07,950 +Bạn sẽ xây dựng một bot 🤖 nhắn tin cho bạn vào buổi sáng. Nếu trời sẽ mưa ☔️ ngày hôm đó. + +18 +00:01:08,280 --> 00:01:10,260 +Vì vậy, bạn không bao giờ quên chiếc ô của bạn một lần nữa. + +19 +00:01:10,650 --> 00:01:15,650 +Bạn sẽ xây dựng các trò chơi arcade cổ điển 👾 như Snake và Pong để gây ấn tượng với bạn bè của bạn 😮 bằng cách + +20 +00:01:15,930 --> 00:01:18,600 +thách thức họ tham gia một trò chơi mà bạn * đã xây dựng. + +21 +00:01:19,440 --> 00:01:23,880 +Bạn sẽ học cách hiểu về dữ liệu phức tạp và tạo hình ảnh trực quan đẹp mắt để gây ấn + +22 +00:01:24,090 --> 00:01:25,980 +tượng với đồng nghiệp tại nơi làm việc. + +23 +00:01:26,850 --> 00:01:31,110 +Bạn sẽ tạo một chương trình tự động gửi email "Chúc mừng sinh nhật" đến bạn + +24 +00:01:31,110 --> 00:01:34,320 +bè và gia đình của bạn. Không bao giờ quên sinh nhật của mẹ 🎂 một lần nữa! + +25 +00:01:34,740 --> 00:01:39,690 +Bạn sẽ làm việc trên các dự án nhân bản các công ty khởi nghiệp trong thế giới thực. Câu lạc bộ chuyến bay giá rẻ: kiểm tra ✅. + +26 +00:01:39,900 --> 00:01:42,990 +Xây dựng blog của riêng bạn: kiểm tra ✅. Bot Twitter: kiểm tra ✅. + +27 +00:01:43,560 --> 00:01:47,340 +Và còn rất nhiều dự án nữa đang chờ bạn khám phá! + +28 +00:01:47,640 --> 00:01:49,860 +Tổng số 100 dự án. + +29 +00:01:50,640 --> 00:01:54,180 +Vì vậy, nếu bạn là ai đó muốn kiếm một công việc với tư cách là một nhà phát + +30 +00:01:54,270 --> 00:01:58,590 +triển Python, thì điều này là hoàn hảo để xây dựng danh mục đầu tư của bạn để giới thiệu trong cuộc phỏng vấn + +31 +00:01:58,590 --> 00:01:59,423 +tiếp theo của bạn. + +32 +00:01:59,910 --> 00:02:04,910 +Bây giờ, khóa học này hoàn toàn không có kinh nghiệm lập trình trước đó. + +33 +00:02:05,460 --> 00:02:07,980 +Vì vậy, nếu bạn là người chưa bao + +34 +00:02:08,370 --> 00:02:12,930 +giờ viết mã, tôi sẽ ở bên bạn từng bước khi tôi đưa bạn từ lập + +35 +00:02:12,930 --> 00:02:17,400 +trình cơ bản đến các khái niệm lập trình trung cấp và nâng cao hơn. + +36 +00:02:17,970 --> 00:02:20,820 +Bạn sẽ học Python từ đầu. Mặt khác, nếu bạn là + +37 +00:02:20,850 --> 00:02:24,330 +một nhà phát triển nâng cao 👨‍💻 thì hãy xem qua chương trình học và + +38 +00:02:24,330 --> 00:02:29,100 +bắt đầu ở cấp độ phù hợp với bạn nhất. Từ người mới bắt đầu đến chuyên nghiệp, mọi + +39 +00:02:29,100 --> 00:02:33,630 +cấp độ đều có trong khóa học. Đã đi học? + +40 +00:02:33,660 --> 00:02:37,980 +Làm việc toàn thời gian? Phải chăm sóc trẻ em? Tôi biết bạn đang bận. + +41 +00:02:38,490 --> 00:02:40,260 +Tôi đã định giờ mỗi ngày trong + +42 +00:02:40,290 --> 00:02:42,690 +khóa học, chỉ mất chưa đầy 2 giờ để hoàn thành. + +43 +00:02:43,020 --> 00:02:45,330 +Vì vậy, bạn có thể phù hợp với khóa học xung quanh cuộc sống của bạn. + +44 +00:02:45,720 --> 00:02:50,580 +Khóa học này có cùng chương trình giảng dạy với chương trình đào tạo lập + +45 +00:02:50,580 --> 00:02:54,930 +trình trực tiếp của chúng tôi. Vì vậy, thay vì tiêu tốn hàng nghìn đô la và nghỉ làm, + +46 +00:02:55,290 --> 00:02:56,400 +bạn sẽ có quyền truy + +47 +00:02:56,400 --> 00:03:01,400 +cập vào cùng một chương trình giảng dạy với nhiều năm thiết kế và thử nghiệm đằng sau nó để đảm bảo rằng bạn không chỉ biết phải làm + +48 +00:03:01,510 --> 00:03:05,710 +gì mà còn cả lý do tại sao bạn đang làm nó. Bây giờ, đừng chỉ nghe + +49 +00:03:05,740 --> 00:03:07,300 +lời tôi. + +50 +00:03:07,660 --> 00:03:10,360 +Kiểm tra xem các sinh viên trước đây của tôi đã nói gì về các khóa học của tôi. + +51 +00:03:16,560 --> 00:03:18,240 +Vậy bạn còn chần chừ gì nữa? + +52 +00:03:18,720 --> 00:03:23,720 +Tìm hiểu lý do tại sao hơn nửa triệu sinh viên đã xếp hạng khóa học của tôi ⭐️⭐️⭐️⭐️⭐️ sao và xem + +53 +00:03:24,000 --> 00:03:26,610 +bạn * có thể làm gì khi thành thạo Python 🐍! + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 Course-Pledge-App-Brewery-100-Days-of-Python.pdf b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 Course-Pledge-App-Brewery-100-Days-of-Python.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8d723d70fee8bdb0c7d3af26fa4d5ae8856c2734 Binary files /dev/null and b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 Course-Pledge-App-Brewery-100-Days-of-Python.pdf differ diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 START HERE.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 START HERE.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0a76e0a217c715d9c7057b002a5dd4462bca576d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 START HERE.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27316f04a8e969da7991d5a04c045d2960cfc799e27c01a42e0c3f0d5a99f7c9 +size 70142614 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 START HERE_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 START HERE_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..59accdf660ae01000b62ef40d372e8dfbd77a9e9 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/002 START HERE_vi.srt @@ -0,0 +1,164 @@ +1 +00:00:01,830 --> 00:00:04,740 +Xin chào, đây là nơi bạn bắt đầu khóa học. + +2 +00:00:05,280 --> 00:00:10,280 +Nhưng trước tiên tôi muốn nói với bạn một chút về nó, bởi vì đây không chỉ + +3 +00:00:10,740 --> 00:00:14,640 +là một khóa học. Đó là một cuộc hành trình. Và đó là một thách thức. + +4 +00:00:15,510 --> 00:00:19,260 +Một thách thức đối với chính bạn. Tôi thường nghe mọi người nói, "Tôi + +5 +00:00:19,440 --> 00:00:23,430 +muốn học viết mã". "Tôi muốn trở thành nhà phát triển ứng dụng". "Tôi muốn có một công việc mới". + +6 +00:00:23,700 --> 00:00:26,940 +"Tôi muốn xây dựng ứng dụng của mình", nhưng nếu không có hành động, + +7 +00:00:27,210 --> 00:00:31,410 +những lời nói đó trở nên vô nghĩa. Nhưng * bạn * thì khác! + +8 +00:00:31,920 --> 00:00:35,160 +Tôi biết điều đó. Mặc dù tôi không biết cá nhân bạn, + +9 +00:00:35,550 --> 00:00:38,910 +tôi biết bạn đã mua khóa học này và bạn vẫn chưa rời bỏ khóa học đó. + +10 +00:00:39,570 --> 00:00:44,570 +Bạn đã bắt đầu. Và thành công sẽ đến với những ai xuất hiện. Và bạn đã xuất + +11 +00:00:44,850 --> 00:00:49,740 +hiện hôm nay. Tôi biết bạn có thể làm điều này. Bạn có thể biến ước mơ của mình thành hiện thực. + +12 +00:00:49,980 --> 00:00:53,700 +Bạn có thể thay đổi tương lai của chính mình và bạn có thể thay đổi cuộc sống của những + +13 +00:00:53,700 --> 00:00:54,533 +người xung quanh bạn. + +14 +00:00:55,260 --> 00:00:59,970 +Một trong những câu hỏi tôi nghe thường xuyên nhất là: "Cách tốt nhất để học viết mã là gì? ". + +15 +00:01:00,720 --> 00:01:01,500 +Chà, + +16 +00:01:01,500 --> 00:01:06,500 +đây rồi! Đó là 100 ngày thử thách mã. Mã trong ít nhất một giờ. ⏳ + +17 +00:01:06,720 --> 00:01:11,520 +Hơn 100 ngày. Bạn đang luyện tập cơ bắp để trở nên mạnh mẽ trong việc viết mã. + +18 +00:01:12,600 --> 00:01:16,410 +Sau đó, câu hỏi tiếp theo chắc chắn là: “Chà, + +19 +00:01:16,560 --> 00:01:21,420 +tôi làm gì mỗi ngày? "Và tôi đã dành nhiều năm để suy nghĩ về câu hỏi này. + +20 +00:01:22,080 --> 00:01:22,913 +Và cuối cùng, + +21 +00:01:23,280 --> 00:01:27,780 +bây giờ tôi có thể trả lời dứt khoát rằng ... đó là khóa học này! + +22 +00:01:29,760 --> 00:01:33,900 +Mỗi ngày, bạn sẽ học và áp dụng các khái niệm lập trình mới. + +23 +00:01:34,740 --> 00:01:37,200 +Sau một trăm ngày lặp lại quá + +24 +00:01:37,560 --> 00:01:42,000 +trình này, bạn không chỉ nắm được toàn bộ giáo trình Python chuyên nghiệp mà + +25 +00:01:42,390 --> 00:01:45,540 +bạn còn giỏi đến mức họ không thể bỏ qua bạn. + +26 +00:01:46,710 --> 00:01:49,860 +Chỉ có hai quy tắc để tận dụng tối đa khóa học này. + +27 +00:01:50,550 --> 00:01:55,550 +1) Cam kết viết mã một giờ một ngày trong 100 ngày. Để giữ cho mình có + +28 +00:01:56,610 --> 00:01:59,400 +trách nhiệm. Tôi khuyên bạn nên tải xuống bản cam kết khóa học. + +29 +00:01:59,790 --> 00:02:04,350 +Đây là một hợp đồng 🤝 với chính bạn. Bạn có thể in nó ra và ghim ở đâu đó. + +30 +00:02:04,350 --> 00:02:08,639 +Ví dụ, bạn luôn có thể nhìn thấy phía trên máy tính hoặc trên bàn làm việc của mình. + +31 +00:02:09,479 --> 00:02:13,050 +Bằng cách ký vào bản cam kết, bạn đang cam kết với chính mình. + +32 +00:02:13,470 --> 00:02:16,380 +Nó dành riêng cho bạn. Không ai khác cần phải xem nó. + +33 +00:02:17,520 --> 00:02:20,970 +Bạn có thể tải về cam kết trong tài nguyên khóa học cho bài học này. + +34 +00:02:22,080 --> 00:02:24,870 +Quy tắc thứ hai là ghi lại tiến trình của bạn. + +35 +00:02:25,080 --> 00:02:28,470 +Sử dụng thẻ bắt đầu bằng # 100DaysOfCode trên Twitter. + +36 +00:02:29,400 --> 00:02:32,310 +Có hàng triệu sinh viên khác đang trên hành trình này với bạn. + +37 +00:02:32,760 --> 00:02:35,130 +Và họ sẽ hỗ trợ bạn khi khó khăn. + +38 +00:02:35,880 --> 00:02:40,350 +Tôi khuyên bạn nên tweet sự tiến bộ của mình mỗi ngày với hashtag + +39 +00:02:40,350 --> 00:02:45,350 +# 100DaysOfCode và tìm kiếm hashtag trên Twitter để xem những người khác đang làm gì + +40 +00:02:45,360 --> 00:02:48,840 +trong 100 ngày của họ. Và đó là tất cả những gì cần làm! + +41 +00:02:49,290 --> 00:02:53,640 +Vì vậy, đây là thành công của bạn và hãy bắt đầu với khóa học. 🤞 + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 100-Days-of-Python-Check-Off-Posters.pdf b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 100-Days-of-Python-Check-Off-Posters.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0ea07aa4721636daddc4d944f0e471384491f9a4 Binary files /dev/null and b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 100-Days-of-Python-Check-Off-Posters.pdf differ diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 12-Rules-to-Learn-to-Code-eBook-Copyright-App-Brewery.pdf b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 12-Rules-to-Learn-to-Code-eBook-Copyright-App-Brewery.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da5348937a90bf30330259c3638c853d39360c38 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 12-Rules-to-Learn-to-Code-eBook-Copyright-App-Brewery.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3688ed58e610f04d25aecc332448a96b0a0c6ba288f811c49b5b3b3ae85bc2ea +size 2469516 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Coding-Notebook-Sheets-to-Print.pdf b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Coding-Notebook-Sheets-to-Print.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f01fed347d63b39710b1977ac89063f4c3d7e09d Binary files /dev/null and b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Coding-Notebook-Sheets-to-Print.pdf differ diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Downloadable Resources and Tips for Taking the Course.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Downloadable Resources and Tips for Taking the Course.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..502e0ea748bd6bd7eaca90a1c1d68cc363e7eaa3 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Downloadable Resources and Tips for Taking the Course.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53035bb7beeac629c805899b4a5105f7d7fbf3b79ee47eed9948ebc9e8ad8c26 +size 157023889 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Downloadable Resources and Tips for Taking the Course_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Downloadable Resources and Tips for Taking the Course_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f64f738b29debf08201359be09cea8d1632f8293 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Downloadable Resources and Tips for Taking the Course_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,570 --> 00:00:05,490 +Này các bạn, Angela đây. Sau khi thực hiện khóa học này, tôi + +2 +00:00:05,640 --> 00:00:10,640 +đã quyết định tự mình tham gia khóa học này để có thể thấy bạn sẽ như thế nào. + +3 +00:00:11,760 --> 00:00:15,420 +Trong quá trình đó, tôi nhận ra rằng có những thứ chúng tôi có thể + +4 +00:00:15,750 --> 00:00:20,190 +tạo ra để làm cho trải nghiệm học tập của bạn dễ dàng hơn và thậm chí thú vị hơn. + +5 +00:00:20,970 --> 00:00:23,850 +Vì vậy, trong video này, tôi sẽ chia sẻ các mẹo hàng đầu của mình. + +6 +00:00:24,270 --> 00:00:28,140 +Và làm thế nào để bạn sử dụng tất cả các công cụ và tài nguyên mà chúng tôi đã xây dựng cho bạn. + +7 +00:00:29,910 --> 00:00:33,570 +Mẹo đầu tiên tôi dành cho bạn là sử dụng một màn hình khác. + +8 +00:00:34,290 --> 00:00:39,290 +Bằng cách đó, bạn có thể xem bài học trên máy tính bảng hoặc điện thoại và viết + +9 +00:00:39,690 --> 00:00:44,130 +mã trên máy tính chính của mình. Vì vậy, bạn có thể viết mã cùng với + +10 +00:00:44,340 --> 00:00:48,960 +tôi và thực hành thay vì chỉ nghe các video. Lập trình là một kỹ năng thực tế. + +11 +00:00:49,080 --> 00:00:53,070 +Vì vậy, khi bạn cần luyện tập, khi học trượt ván 🛹, bạn cũng cần + +12 +00:00:53,640 --> 00:00:58,640 +luyện tập để có thể lập trình tốt. Mẹo số hai: Tôi đã tạo + +13 +00:00:59,220 --> 00:01:04,080 +một bảng lừa cú pháp Python, bạn có thể tải xuống và in ra. + +14 +00:01:04,739 --> 00:01:08,640 +Nó chứa một số khái niệm lập trình phổ biến nhất mà chúng ta sẽ học. + +15 +00:01:09,030 --> 00:01:13,140 +Và đó là một tài liệu tham khảo hữu ích cần có khi bạn thực hiện các thử thách mã hóa. + +16 +00:01:13,710 --> 00:01:18,540 +Bạn có thể tải xuống nội dung này trong tài nguyên khóa học cho bài học này, nơi bạn cũng + +17 +00:01:18,540 --> 00:01:22,170 +sẽ tìm thấy sách điện tử "12 Quy tắc để Học lập trình" của tôi. + +18 +00:01:23,070 --> 00:01:27,360 +Một trong những điều khó nhất khi học là giữ cho ✨ động lực✨ cao. + +19 +00:01:28,170 --> 00:01:33,170 +Tôi thấy mình thường có động lực hơn khi ở trong thư viện hoặc quán cà phê, nơi tôi có thể nhìn thấy + +20 +00:01:33,420 --> 00:01:36,060 +những người khác đang học tập hoặc làm việc chăm chỉ. + +21 +00:01:36,840 --> 00:01:41,840 +Vì vậy, tôi quyết định tạo một video dài hai giờ "Học cùng tôi" mà tôi + +22 +00:01:42,390 --> 00:01:45,810 +đang tập trung cao độ. Chúng tôi sẽ làm việc 25 phút mỗi lần, + +23 +00:01:46,200 --> 00:01:51,200 +sau đó nghỉ ngơi năm phút trước khi quay lại với Pomodoro tiếp theo 🍅. Mẹo số bốn: khi bạn đang học + +24 +00:01:51,570 --> 00:01:55,800 +các khái niệm lập trình mới, bạn nên ghi lại cách mã + +25 +00:01:56,040 --> 00:02:01,040 +hoạt động trong khi tâm trí của bạn luôn sảng khoái về chủ đề + +26 +00:02:01,050 --> 00:02:01,883 +đó. + +27 +00:02:02,430 --> 00:02:07,430 +Vì vậy, tôi đã tạo một trang ghi chú mã hóa mà bạn có thể in ra và đối chiếu để tạo + +28 +00:02:08,430 --> 00:02:09,660 +sổ ghi chép mã hóa. + +29 +00:02:10,530 --> 00:02:15,530 +Giấy ghi chú là nơi hoàn hảo để viết ra các ví dụ về các khái niệm mã hóa mà bạn + +30 +00:02:16,500 --> 00:02:17,333 +đã học được. + +31 +00:02:17,850 --> 00:02:21,900 +Nó đi kèm với số dòng và hướng dẫn thụt lề tiện dụng, + +32 +00:02:22,320 --> 00:02:27,320 +cực kỳ hữu ích khi viết mã Python. Mã hóa không giống như + +33 +00:02:28,530 --> 00:02:32,190 +lịch sử. Không có gì bạn cần phải ghi nhớ. + +34 +00:02:32,730 --> 00:02:36,420 +Nó hơi giống như nướng. Bạn không cần phải nhớ công thức. + +35 +00:02:36,750 --> 00:02:41,160 +Bạn chỉ cần thực hành và hiểu cách sử dụng công thức. + +36 +00:02:41,820 --> 00:02:46,820 +Một trong những hệ thống ghi chú hữu ích nhất cho việc học là phương + +37 +00:02:47,220 --> 00:02:50,070 +pháp ghi chú Cornell. Trong sổ ghi chép mã + +38 +00:02:50,130 --> 00:02:53,880 +của chúng tôi, chúng tôi đã kết hợp tất cả các yếu tố chính từ + +39 +00:02:54,540 --> 00:02:59,540 +Cornell, bao gồm thanh bên nơi bạn có thể viết nhận xét trên mỗi dòng mã và phần tóm tắt + +40 +00:03:00,310 --> 00:03:01,930 +dưới cùng, nơi bạn có thể + +41 +00:03:02,290 --> 00:03:07,290 +viết tổng quan về khái niệm bạn vừa học được. Trong tài nguyên khóa học cho bài học này, + +42 +00:03:07,390 --> 00:03:09,010 +bạn cũng sẽ tìm thấy + +43 +00:03:09,370 --> 00:03:14,370 +một số hình nền máy tính mà tôi đã tạo cho bạn có chứa một số thông điệp + +44 +00:03:15,060 --> 00:03:19,350 +mà tôi lưu giữ trên bàn làm việc để giúp tôi có động lực và + +45 +00:03:19,770 --> 00:03:24,270 +tôi hy vọng chúng cũng sẽ giúp bạn. Mẹo số năm: ăn mừng ngay + +46 +00:03:24,990 --> 00:03:27,600 +sau khi bạn hoàn thành mỗi ngày. + +47 +00:03:28,380 --> 00:03:32,730 +Bởi vì khóa học này được thiết kế để đưa bạn từ người mới bắt đầu đến chuyên nghiệp, khi bạn đi từ + +48 +00:03:33,210 --> 00:03:34,860 +ngày này sang ngày khác, sẽ ngày càng + +49 +00:03:34,920 --> 00:03:39,920 +có ít hướng dẫn hơn và ngày càng có nhiều thực hành hơn. Để giúp bạn đi đúng hướng, + +50 +00:03:40,290 --> 00:03:44,040 +tôi đã tạo một áp phích "100 ngày viết mã". + +51 +00:03:44,940 --> 00:03:49,410 +Sau khi bạn hoàn thành một ngày, bạn có thể kiểm tra nó trên áp phích. Vì vậy, hãy in nó ra, + +52 +00:03:49,590 --> 00:03:53,190 +dán lên tường và coi mỗi ngày là một thử thách. + +53 +00:03:53,790 --> 00:03:58,290 +Tự thưởng cho bản thân sau mỗi ngày bạn đánh dấu ✅ và từng ngày, bạn sẽ học hỏi + +54 +00:03:58,320 --> 00:04:00,480 +và phát triển như một nhà phát triển. + +55 +00:04:01,620 --> 00:04:06,300 +Khóa học này có một không gian an toàn, nơi bạn có thể mắc lỗi, đặt + +56 +00:04:06,780 --> 00:04:11,760 +câu hỏi, nhưng quan trọng nhất là trở nên tự tin vào kỹ năng lập trình viên của mình. + +57 +00:04:13,050 --> 00:04:15,510 +Tôi đã rất vui khi xây dựng khóa học này + +58 +00:04:15,990 --> 00:04:19,140 +và tôi hy vọng rằng bạn sẽ thích nó nhiều như tôi đã làm. + +59 +00:04:19,829 --> 00:04:22,019 +Vì vậy, đây là thành công của bạn! + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 FAQ-I-Cant-Open-the-Course-Resource-Links.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 FAQ-I-Cant-Open-the-Course-Resource-Links.url new file mode 100644 index 0000000000000000000000000000000000000000..0b442dd324087d5ee62bd2d79417038e5a038db2 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 FAQ-I-Cant-Open-the-Course-Resource-Links.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/23544648#questions/13314700 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Join-the-Student-Community-on-Discord.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Join-the-Student-Community-on-Discord.url new file mode 100644 index 0000000000000000000000000000000000000000..f11fff04cf6609a80b913d52ea718e5dfffa7abc --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Join-the-Student-Community-on-Discord.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://discord.gg/3DDPkCAU3N \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Python-Syntax-Cheat-Sheet-Booklet-v2.pdf b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Python-Syntax-Cheat-Sheet-Booklet-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..54ca86a8ee070a8199457dc9bf4484a504881486 Binary files /dev/null and b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Python-Syntax-Cheat-Sheet-Booklet-v2.pdf differ diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Study-With-Me-Video.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Study-With-Me-Video.url new file mode 100644 index 0000000000000000000000000000000000000000..644c7c406231a39ba28d84646ca3c95db9e464a6 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Study-With-Me-Video.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/23518346#search \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Syllabus-for-100-Days-of-Python.pdf b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Syllabus-for-100-Days-of-Python.pdf new file mode 100644 index 0000000000000000000000000000000000000000..69f91631e10d79f5a005bfd41a44ef4aa30b8804 Binary files /dev/null and b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Syllabus-for-100-Days-of-Python.pdf differ diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Wallpapers.zip b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Wallpapers.zip new file mode 100644 index 0000000000000000000000000000000000000000..3502fa0602fab0ceabfcb3db649d0e184cc8e842 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/003 Wallpapers.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b64f3624343c9021001a5bb560ba2cd773432a304e812703d5b40ff44c5506d +size 33096706 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Day 1 Goals what we will make by the end of the day.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Day 1 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2e0d45a90920f8bb47c6cf1d4a20440a73c637d4 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Day 1 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dd95d70e600e09262c3c2f36d281d4b3d61fb43fc2b073afa5a6d6580654910 +size 15044823 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Day 1 Goals what we will make by the end of the day_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Day 1 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f555790f1f56d25b30b06e04d228ba6b12cd143d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Day 1 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,140 @@ +1 +00:00:00,390 --> 00:00:01,150 +Này các cậu. + +2 +00:00:01,170 --> 00:00:05,430 +Chào mừng đến với ngày đầu tiên trong hành trình 100 ngày của bạn. + +3 +00:00:05,730 --> 00:00:12,240 +Và hôm nay, chúng ta sẽ tìm hiểu về in ấn, nhận xét, sửa lỗi, thao tác chuỗi và biến. + +4 +00:00:12,240 --> 00:00:15,930 +Vì vậy, nó chứa đầy những thứ thực sự thú vị. + +5 +00:00:15,990 --> 00:00:22,470 +Và đến cuối ngày hôm nay, bạn sẽ tạo xong một chương trình tạo tên ban nhạc. + +6 +00:00:22,950 --> 00:00:26,090 +Vì vậy, đây là dự án cuối cùng của ngày hôm nay. + +7 +00:00:26,100 --> 00:00:31,980 +Và ý tưởng là giả sử bạn của bạn đang thành lập một ban nhạc mới, một ban nhạc rock hoặc + +8 +00:00:31,980 --> 00:00:36,150 +một ban nhạc cổ điển và họ đang cố gắng tìm ra một cái tên hay. + +9 +00:00:36,150 --> 00:00:40,770 +Vì vậy, bạn đến để giải cứu và gửi cho họ chương trình tạo tên ban nhạc của bạn. + +10 +00:00:40,860 --> 00:00:43,680 +Vì vậy, nó hỏi bạn tên của thành phố mà bạn lớn lên. + +11 +00:00:43,680 --> 00:00:48,180 +Vì vậy, của tôi là Bristol ở phía tây nam của Vương quốc Anh. + +12 +00:00:48,510 --> 00:00:51,660 +Và sau đó nó sẽ hỏi bạn, tên thú cưng của bạn là gì? + +13 +00:00:52,110 --> 00:00:58,710 +Tôi có một con thỏ cưng khi tôi còn nhỏ, và tôi có lẽ là người ít trí tưởng tượng nhất. + +14 +00:00:58,950 --> 00:01:01,230 +Tính cách lập trình viên cổ điển. + +15 +00:01:01,470 --> 00:01:02,490 +Vì vậy, tôi gọi con thỏ của tôi. + +16 +00:01:03,180 --> 00:01:03,930 +"Thỏ". + +17 +00:01:04,739 --> 00:01:08,880 +Vì vậy, bây giờ khi tôi nhấn "Enter", nó sẽ cho tôi biết tên ban nhạc của mình. + +18 +00:01:08,940 --> 00:01:12,270 +Và đó có thể là Thỏ Bristol. + +19 +00:01:12,900 --> 00:01:14,310 +Vì vậy, điều đó nghe có vẻ khá tuyệt. + +20 +00:01:14,310 --> 00:01:16,140 +Đó có thể giống như một ban nhạc rock. + +21 +00:01:16,590 --> 00:01:17,810 +Vì vậy, đây là những gì bạn sẽ làm. + +22 +00:01:17,820 --> 00:01:23,670 +Và trong quá trình này, để tạo ra cái này, bạn sẽ tìm hiểu về in, nhập, + +23 +00:01:23,670 --> 00:01:29,660 +nhận xét, gỡ lỗi, lỗi tên, lỗi cú pháp, biến thao tác chuỗi, v.v. + +24 +00:01:29,670 --> 00:01:35,730 +Vì vậy, nếu bạn cảm thấy mình đã có thể đạt được điều này và bạn có thể chứng minh điều đó bằng cách tự mình thực hiện + +25 +00:01:35,730 --> 00:01:39,140 +chương trình này, thì hãy chuyển sang bài học của ngày hôm sau. + +26 +00:01:39,180 --> 00:01:43,980 +Nhưng đối với hầu hết các bạn, ngay cả khi bạn đã bắt đầu học lập trình Python, có lẽ vẫn còn rất nhiều + +27 +00:01:43,980 --> 00:01:47,040 +điều mới mẻ mà bạn sẽ tìm thấy trong các bài học ngày hôm nay. + +28 +00:01:47,580 --> 00:01:53,400 +Bây giờ, như với tất cả các dự án mà chúng tôi đang thực hiện trong khóa học này, bạn có thể dùng + +29 +00:01:53,400 --> 00:01:56,670 +thử trước khi thực hiện để bạn có thể truy cập URL. + +30 +00:01:57,210 --> 00:02:02,730 +Ngoài ra, nếu bạn không muốn nhập URL đầy đủ, bạn có thể truy cập nội dung khóa + +31 +00:02:02,730 --> 00:02:08,560 +học tại đây, sau đó nhấp vào tài nguyên và nhấp vào liên kết này để đi thẳng đến đó. + +32 +00:02:08,580 --> 00:02:14,580 +Và sau đó khi bạn ở đó, tất cả những gì bạn phải làm là nhấp vào chạy và bạn sẽ có thể xem trước sản phẩm cuối + +33 +00:02:14,580 --> 00:02:16,650 +cùng sẽ hoạt động như thế nào. + +34 +00:02:16,650 --> 00:02:22,650 +Vì vậy, bạn có thể nhập thành phố của mình và làm theo hướng dẫn cho đến khi bạn nhận được kết quả cuối cùng. + +35 +00:02:22,890 --> 00:02:29,070 +Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và bắt đầu viết mã ngay lập tức. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Press-Run-to-see-the-final-project.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Press-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..647b17f49b0527a96bd5f2183202d1025c09b428 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/004 Press-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/band-name-generator-end \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/005 FAQ Can I Use PyCharmVSCode Another Local Code Editor.html b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/005 FAQ Can I Use PyCharmVSCode Another Local Code Editor.html new file mode 100644 index 0000000000000000000000000000000000000000..e826daddf3ef235434be5c0d5eda7f7b8141bd0a --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/005 FAQ Can I Use PyCharmVSCode Another Local Code Editor.html @@ -0,0 +1 @@ +

On day 15 of the course, I will show you how to install and set up PyCharm, the most popular Python local code editor.

In the meantime (between day 1 and day 15) we will be using Replit a browser-based code editor. This has a number of advantages:

1. We can get up and running immediately, with less time wasted on setup and troubleshooting, more time learning to code.

2. It's accessible anywhere, any computer/iPad/phone that's connected to the internet can be used to code.

3. Your code and progress are saved, ready for you to review and revisit at any time.

4. It's free.


If you already have PyCharm or another code editor installed, feel free to use it. But the videos are recorded with replit so you might have a harder time trying to figure out how to do something in your local editor. But if you are advanced then feel free to choose.

I recommend everyone start with replit as I do in the videos and to follow along. As a developer, we need to learn to use many tools and the more your know the better. Then when we reach day 15, we will learn to use PyCharm. Even if you have a preferred tool, you might find something new.




\ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Create-a-Replit-Account.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Create-a-Replit-Account.url new file mode 100644 index 0000000000000000000000000000000000000000..3f8dab20c80e500d648e3824af0c6dbce824e7b9 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Create-a-Replit-Account.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/signup \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Fork-the-Day-1-Starting-Repl.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Fork-the-Day-1-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..084225be9ac1180174c67eb78bc589fe85a338b5 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Fork-the-Day-1-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-1-printing-start \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Printing to the Console in Python.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Printing to the Console in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2bf072ae055f3bd61ab042970f54d4c55e14fb3e --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Printing to the Console in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aeb0ce8a37dc1b1996dd38ced51c8638a03d70ad00374ed69f075643c9f156db +size 74087415 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Printing to the Console in Python_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Printing to the Console in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e00aad3ca5bf473dd9f18e014d37cc9ebc30a4a --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/006 Printing to the Console in Python_vi.srt @@ -0,0 +1,581 @@ +1 +00:00:00,250 --> 00:00:04,059 +Để bắt đầu, hãy mở trình duyệt của bạn và truy cập URL này. + +2 +00:00:04,350 --> 00:00:08,470 +Bây giờ, nếu bạn không muốn gõ tất cả những thứ đó và mắc một số lỗi chính tả cũng + +3 +00:00:08,480 --> 00:00:11,450 +như không đến đúng nơi, thì bạn chỉ cần truy cập tài nguyên + +4 +00:00:11,450 --> 00:00:13,490 +khóa học và nhấp vào liên kết ở đó. + +5 +00:00:13,730 --> 00:00:15,660 +Nó sẽ đưa bạn trực tiếp đến trang này. + +6 +00:00:16,730 --> 00:00:20,830 +Bây giờ, khi bạn đã nhấp vào liên kết đưa bạn đến phần Replit bắt đầu, + +7 +00:00:20,830 --> 00:00:23,520 +bạn sẽ thấy một cái gì đó trông như thế này. + +8 +00:00:23,965 --> 00:00:28,974 +Và điều đầu tiên tôi muốn bạn làm là tiếp tục và nhấp vào Nút Fork. + +9 +00:00:29,785 --> 00:00:34,775 +Điều này sẽ làm là nó sẽ tạo ra một phiên bản của Replit tương tự mà bạn sẽ thấy + +10 +00:00:34,775 --> 00:00:38,424 +tôi thực hiện trong các video, nhưng trong trường hợp + +11 +00:00:38,754 --> 00:00:41,284 +này, bạn sẽ có thể chỉnh sửa nó. + +12 +00:00:42,084 --> 00:00:44,570 +Vì vậy, nếu bạn muốn lưu công việc mình đang làm, tôi + +13 +00:00:44,570 --> 00:00:46,090 +khuyên bạn nên đăng ký Replit. + +14 +00:00:46,250 --> 00:00:47,320 +Nó hoàn toàn miễn phí. + +15 +00:00:47,320 --> 00:00:49,230 +Bạn không cần bất kỳ thẻ tín dụng hoặc bất cứ điều gì. + +16 +00:00:49,540 --> 00:00:51,480 +Khi bạn đã tạo tài khoản của + +17 +00:00:51,480 --> 00:00:55,510 +mình trên Replit, nó sẽ đưa bạn đến trang trước nơi bạn + +18 +00:00:55,540 --> 00:00:58,390 +có thể thực sự nhấp vào nút Fork Repl. + +19 +00:00:58,630 --> 00:01:02,959 +Và điều đó sẽ làm là nó sẽ tạo một bản sao của những gì tôi đã tạo và đưa + +20 +00:01:03,170 --> 00:01:04,929 +nó vào tài khoản của bạn. + +21 +00:01:05,400 --> 00:01:09,810 +Và sau đó bạn sẽ có thể xem bản ghi tất cả mã mà bạn đã viết + +22 +00:01:09,820 --> 00:01:11,560 +trong suốt khóa học. + +23 +00:01:12,130 --> 00:01:14,579 +Trong khóa học này, bạn sẽ cùng tôi viết mã trên + +24 +00:01:14,580 --> 00:01:18,940 +Replit và hoàn thành một loạt bài tập viết mã tương tác trong lớp học Replit của chúng + +25 +00:01:18,940 --> 00:01:19,589 +tôi. + +26 +00:01:20,569 --> 00:01:24,189 +Vì vậy, hãy tiếp tục, tạm dừng video, đăng ký Replit và đảm + +27 +00:01:24,190 --> 00:01:28,470 +bảo rằng bạn đã chia đôi bản sao bắt đầu của "day-1-printing-start" + +28 +00:01:28,470 --> 00:01:31,570 +và bạn sẽ thấy một màn hình giống như thế này. + +29 +00:01:33,640 --> 00:01:36,740 +Và sau khi đăng nhập, bạn thực sự có thể tiếp tục + +30 +00:01:36,770 --> 00:01:39,100 +và chỉnh sửa tên của Replit hoặc thêm + +31 +00:01:39,100 --> 00:01:42,890 +mô tả ngắn gọn và bạn sẽ có thể truy cập nó sau này thông qua + +32 +00:01:42,890 --> 00:01:45,090 +thư mục Trả lời của tôi. + +33 +00:01:45,670 --> 00:01:49,270 +Bây giờ, khi bạn đã hoàn thành việc đó, hãy tiếp tục và xem qua một + +34 +00:01:49,510 --> 00:01:50,959 +số phần khác nhau của Replit + +35 +00:01:50,959 --> 00:01:52,090 +mà bạn sẽ sử dụng. + +36 +00:01:52,720 --> 00:01:56,690 +Đầu tiên ở khung bên trái ở đây, bạn có một số tệp và bạn có thể thấy + +37 +00:01:56,860 --> 00:02:01,770 +tệp hiện tại đang mở là tệp Python này ở đây và bạn có thể tạo các tệp mới hoặc bạn có + +38 +00:02:01,770 --> 00:02:05,630 +thể tạo các thư mục mới và sau này chúng ta sẽ sử dụng những tính năng + +39 +00:02:05,630 --> 00:02:07,910 +này để tổ chức mã của chúng tôi. + +40 +00:02:08,579 --> 00:02:12,870 +Bây giờ, phần còn lại của khung bên trái thực sự hữu ích là tab cài + +41 +00:02:12,870 --> 00:02:17,769 +đặt ở đây và tôi khuyên mọi người nên chuyển cỡ chữ của mình lên lớn. + +42 +00:02:18,209 --> 00:02:22,510 +Điều này chỉ làm cho nó dễ dàng hơn nhiều +xác định lỗi và bất kỳ lỗi chính tả nào bạn mắc phải. + +43 +00:02:22,994 --> 00:02:26,204 +Bây giờ, chúng ta sẽ giữ nguyên mọi thứ khác và bạn có + +44 +00:02:26,204 --> 00:02:29,644 +thể nhấp vào nút cài đặt để thu gọn khung đó, nhờ đó bạn có + +45 +00:02:29,654 --> 00:02:31,764 +nhiều không gian hơn để viết mã. + +46 +00:02:32,344 --> 00:02:35,915 +Và khu vực này ở đây là nơi bạn sẽ làm điều đó. + +47 +00:02:36,094 --> 00:02:39,684 +Tất cả mã của bạn sẽ được đưa vào bên trong đây và sau khi + +48 +00:02:39,684 --> 00:02:44,154 +viết xong mã, chúng ta sẽ nhấp vào Chạy, mã sẽ thực thi và kết quả mã + +49 +00:02:44,154 --> 00:02:48,605 +của chúng ta sẽ xuất hiện trên bảng điều khiển ở bên phải đây . + +50 +00:02:49,665 --> 00:02:54,245 +Và tôi thường thích viết mã bằng nền tối hơn. + +51 +00:02:54,535 --> 00:02:58,305 +Nó dễ nhìn hơn một chút, đặc biệt là khi bạn làm việc vào ban đêm. + +52 +00:02:59,345 --> 00:03:02,234 +Vì vậy, đây là một số phần quan trọng nhất của + +53 +00:03:02,615 --> 00:03:06,685 +Replit, nhưng điều quan trọng là nó cho phép chúng ta bắt đầu. + +54 +00:03:07,175 --> 00:03:11,325 +Bây giờ hãy nhớ rằng toàn bộ lý do chúng ta học lập trình là để có thể + +55 +00:03:11,325 --> 00:03:16,435 +nói cho máy tính biết nó cần làm gì và để nó tuân theo mệnh lệnh của chúng ta. + +56 +00:03:16,920 --> 00:03:19,750 +Vì vậy, hãy tiếp tục và yêu cầu máy tính làm điều gì đó. + +57 +00:03:20,339 --> 00:03:23,350 +Và chúng ta sẽ làm điều đó bằng cách viết dòng mã đầu tiên. + +58 +00:03:24,029 --> 00:03:28,339 +Vì vậy, trong trường hợp này, tôi đang tạo một thứ gọi là hàm in, chỉ + +59 +00:03:28,339 --> 00:03:32,970 +là từ in tất cả bằng chữ thường và sau đó là một tập hợp dấu ngoặc đơn (). + +60 +00:03:33,405 --> 00:03:38,454 +Bây giờ, bên trong các dấu ngoặc đơn này, tôi sẽ cho nó biết những gì tôi muốn nó in và hy + +61 +00:03:38,995 --> 00:03:43,064 +vọng nó sẽ xuất ra nội dung đó trong bảng điều khiển của chúng ta. + +62 +00:03:44,165 --> 00:03:49,294 +Vì vậy, tôi sẽ bắt đầu bằng cách viết câu kinh điển "Xin chào thế giới! ' vào bên trong đây, sau khi bạn đã + +63 +00:03:49,835 --> 00:03:53,265 +sẵn sàng, hãy tiếp tục và nhấp vào Chạy. + +64 +00:03:54,184 --> 00:03:57,835 +Sau vài giây, bạn sẽ thấy máy tính làm theo lệnh của + +65 +00:03:58,095 --> 00:04:02,935 +bạn, cụ thể là in các từ mà bạn yêu cầu in bên trong bảng điều khiển hoặc + +66 +00:04:03,045 --> 00:04:04,695 +khu vực đầu ra ở đây. + +67 +00:04:05,795 --> 00:04:09,414 +Và sau khi hoàn thành, nó sẽ chỉ ra điều đó bằng mũi tên nhỏ màu cam. + +68 +00:04:10,295 --> 00:04:12,875 +Và cách thức hoạt động của lệnh này cực kỳ đơn giản. + +69 +00:04:13,125 --> 00:04:17,945 +Bạn có từ khóa print, theo sau là một tập hợp các dấu ngoặc đơn(), rồi bên trong + +70 +00:04:18,024 --> 00:04:21,474 +dấu ngoặc đơn, bạn cho nó biết nội dung bạn muốn nó in. + +71 +00:04:22,254 --> 00:04:26,624 +Và một khi bạn đã chèn mã đó, thì khi dòng mã này được máy tính + +72 +00:04:26,625 --> 00:04:31,625 +thực thi, nó sẽ biết chỉ cần in hoặc xuất ra nội dung bạn đã đặt ở giữa + +73 +00:04:31,625 --> 00:04:33,385 +các dấu ngoặc đơn. + +74 +00:04:35,905 --> 00:04:41,005 +Nhưng hãy chú ý ở đây rằng nó không chỉ là từ "Xin chào thế giới! mà tôi đã đặt trong dấu ngoặc đơn, tôi cũng đã + +75 +00:04:41,035 --> 00:04:43,195 +thêm một số dấu ngoặc + +76 +00:04:43,895 --> 00:04:48,995 +kép hoặc dấu ngoặc kép xung quanh từ đó. + +77 +00:04:49,764 --> 00:04:54,049 +Và lý do tôi làm điều này là để tôi có thể nói với máy + +78 +00:04:54,349 --> 00:04:59,109 +tính rằng bit này ở giữa dấu ngoặc kép không phải là mã. + +79 +00:04:59,250 --> 00:05:02,169 +Nó không giống như bản in nơi nó phải làm gì đó. + +80 +00:05:02,459 --> 00:05:06,289 +Đây chỉ là một số văn bản tôi đã tạo ra và tôi muốn in nó ra. + +81 +00:05:07,750 --> 00:05:12,369 +Và những đoạn văn bản này trong biệt ngữ lập trình được gọi là chuỗi. + +82 +00:05:12,949 --> 00:05:16,639 +Và bạn có thể tưởng tượng nó gần giống như một chiếc vòng cổ ngọc trai phải không? + +83 +00:05:16,659 --> 00:05:19,329 +Đó là một chuỗi ký tự. + +84 +00:05:20,049 --> 00:05:26,085 +Và công dụng của dấu ngoặc kép là về cơ bản chúng hiển thị phần đầu + +85 +00:05:26,085 --> 00:05:29,075 +và phần cuối của chuỗi ký tự đó. + +86 +00:05:30,405 --> 00:05:33,905 +Vì vậy, điều đó có nghĩa là bạn phải thực sự cẩn thận khi gõ. + +87 +00:05:34,224 --> 00:05:40,265 +Ví dụ: nếu tôi tiếp tục và bỏ lỡ dấu ngoặc kép kết thúc, thì bây giờ bạn có thể thấy rằng + +88 +00:05:40,295 --> 00:05:44,084 +đã có một số thay đổi đã xảy ra với mã của chúng ta, cụ thể + +89 +00:05:44,654 --> 00:05:48,865 +là dấu ngoặc đơn cuối cùng, thay vì được tô màu trắng như dấu + +90 +00:05:48,955 --> 00:05:54,015 +ngoặc đơn mở hay trước đây nó như thế nào thì bây giờ nó có màu cam và đây là + +91 +00:05:54,155 --> 00:05:56,835 +một gợi ý tinh tế cho chúng ta. + +92 +00:05:57,255 --> 00:06:01,394 +Bạn sẽ thực sự quen với những gợi ý tinh tế này bởi vì chúng là những + +93 +00:06:01,445 --> 00:06:05,525 +manh mối sẽ cho bạn biết điều gì có thể đã sai trong mã của bạn. + +94 +00:06:06,084 --> 00:06:09,605 +Nếu tôi chạy mã này như hiện tại, nó sẽ bị hỏng. + +95 +00:06:09,995 --> 00:06:15,035 +Nó sẽ báo cho tôi một lỗi cú pháp và nó nói điều gì đó có vẻ như hoàn toàn + +96 +00:06:15,035 --> 00:06:17,055 +không phải tiếng Anh. + +97 +00:06:17,435 --> 00:06:18,885 +Vậy làm thế nào chúng ta có thể tìm ra + +98 +00:06:19,059 --> 00:06:20,159 +điều này có nghĩa là gì. + +99 +00:06:21,060 --> 00:06:25,659 +Bây giờ, điều tôi muốn bạn biết là tất cả các lập trình viên đều mắc lỗi. + +100 +00:06:25,710 --> 00:06:30,829 +Tất cả chúng ta đều mắc rất nhiều lỗi, như quên thêm dấu ngoặc kép ở cuối + +101 +00:06:30,829 --> 00:06:35,659 +chuỗi hoặc quên thêm dấu ngoặc đơn đóng, những điều này chỉ là những + +102 +00:06:36,015 --> 00:06:36,915 +lỗi thông thường + +103 +00:06:37,375 --> 00:06:40,235 +vì chúng ta là con người. + +104 +00:06:40,965 --> 00:06:44,724 +Nhưng điều tạo nên sự khác biệt của các lập trình viên giỏi là chúng + +105 +00:06:44,764 --> 00:06:48,525 +tôi thực sự giỏi trong việc tìm ra vấn đề là gì và cách khắc phục nó. + +106 +00:06:49,075 --> 00:06:51,794 +Vì vậy, bạn có thể tưởng tượng rằng việc viết mã chỉ là một loạt các + +107 +00:06:51,794 --> 00:06:53,194 +vấn đề mà bạn phải giải quyết. + +108 +00:06:53,810 --> 00:06:59,380 +Và trong trường hợp này, khi chúng ta nhận được một loại văn bản màu đỏ nào đó ở bên phải và mã của chúng + +109 +00:06:59,380 --> 00:07:04,999 +ta không hoạt động như những gì chúng ta mong đợi thì tất cả những gì chúng ta phải làm là đưa toàn bộ thông + +110 +00:07:05,050 --> 00:07:08,870 +báo lỗi này vào chỗ nó nói điều gì đó, lỗi gì đó, và đây là một loại thông + +111 +00:07:08,960 --> 00:07:10,840 +điệp mà chúng ta phải hiểu. + +112 +00:07:11,519 --> 00:07:14,060 +Và chúng tôi chỉ đơn giản là thả nó vào Google. + +113 +00:07:14,520 --> 00:07:17,570 +Và thường thì liên kết đầu tiên bạn gặp sẽ đến từ một trang web có tên + +114 +00:07:17,570 --> 00:07:19,510 +là stackoverflow. + +115 +00:07:19,510 --> 00:07:19,510 +com. + +116 +00:07:20,040 --> 00:07:24,729 +Và về cơ bản đây là trang web Hỏi & Đáp mà tất cả các nhà phát triển sẽ truy cập bất cứ khi nào có lỗi + +117 +00:07:24,730 --> 00:07:28,380 +xảy ra với mã của họ hoặc khi họ không thể tìm ra cách thực hiện điều gì đó. + +118 +00:07:29,900 --> 00:07:34,570 +Vì vậy, nếu chúng tôi nhấp vào liên kết này, bạn có thể thấy rằng ai đó khác + +119 +00:07:34,570 --> 00:07:39,760 +cũng mắc phải lỗi này và một số người tốt bụng đã nói với chúng tôi rằng giải pháp + +120 +00:07:40,010 --> 00:07:44,210 +có thể là do bạn đang thiếu dấu ngoặc kép trước cuối dòng. + +121 +00:07:44,630 --> 00:07:48,439 +Vì vậy, nếu chúng ta nhìn lại mã của mình, mã tạo ra lỗi + +122 +00:07:48,489 --> 00:07:50,414 +này sẽ trông như thế này. + +123 +00:07:50,865 --> 00:07:55,315 +Và thực sự, chúng tôi đang thiếu một dấu ngoặc kép ở cuối chuỗi. + +124 +00:07:57,165 --> 00:08:00,045 +Khi bạn học viết mã, khi bạn trải qua 100 ngày, + +125 +00:08:00,125 --> 00:08:05,695 +tôi muốn bạn ngày càng trở nên hòa hợp hơn với màu sắc của mã, bởi vì một trong những điều + +126 +00:08:06,154 --> 00:08:10,895 +hữu ích nhất mà những người soạn thảo mã như thế này mang lại cho chúng ta là + +127 +00:08:11,224 --> 00:08:13,714 +cái gì đó gọi là Đánh dấu cú pháp. + +128 +00:08:14,385 --> 00:08:18,415 +Ví dụ: khi tôi thiếu dấu ngoặc kép đó, nó sẽ đánh dấu + +129 +00:08:18,415 --> 00:08:21,315 +toàn bộ nội dung này bằng màu cam. + +130 +00:08:21,855 --> 00:08:27,235 +Và về cơ bản, nó cho chúng ta biết có vẻ như toàn bộ thứ này là một văn bản nào đó, nó + +131 +00:08:27,614 --> 00:08:33,683 +nghĩ rằng tất cả những thứ này là một chuỗi và chúng ta đang thiếu dấu ngoặc đơn đóng. + +132 +00:08:35,164 --> 00:08:39,575 +Vì vậy, nếu bạn nhận thấy điều này và bạn nghĩ, chờ đã, thực ra, điều đó + +133 +00:08:39,789 --> 00:08:43,409 +không đúng, phần này phải có màu cam vì đây là thứ tôi muốn + +134 +00:08:43,830 --> 00:08:48,269 +in, nhưng phần này phải khớp với màu của nẹp mở, màu trắng, vậy chắc chắn + +135 +00:08:48,319 --> 00:08:50,200 +có điều gì đó không ổn ở đây. + +136 +00:08:50,740 --> 00:08:55,410 +Và thực sự, nếu bạn nhìn vào thông báo lỗi, nó thực sự có một dấu + +137 +00:08:55,459 --> 00:08:59,890 +mũ nhỏ ở ngay đây cho bạn biết rằng có điều gì đó có thể không + +138 +00:08:59,940 --> 00:09:01,680 +đúng ở đây và nó có thể khiến + +139 +00:09:02,210 --> 00:09:07,759 +bạn nhớ lại rằng, "Ồ vâng, tôi đã quên phần kết trích dẫn kép. + +140 +00:09:07,759 --> 00:09:07,759 +Và + +141 +00:09:08,869 --> 00:09:12,160 +bây giờ khi chúng tôi chạy mã của mình, bạn sẽ thấy nó vẫn hoạt động tốt như mới. + +142 +00:09:12,740 --> 00:09:17,799 +Vì vậy, bây giờ đến lượt bạn thử nó trong thử thách viết mã. + +143 +00:09:18,209 --> 00:09:22,229 +Hãy chuyển sang bài học tiếp theo, đăng ký vào lớp học của chúng tôi và sau đó + +144 +00:09:22,229 --> 00:09:25,290 +tôi sẽ hướng dẫn bạn bắt đầu thử thách viết mã đầu tiên. + +145 +00:09:25,510 --> 00:09:28,510 +Vì vậy, tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join our Class on Auditorium.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join our Class on Auditorium.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..da991cf5e7418e877bb030aa6d1f2017b30cc4dd --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join our Class on Auditorium.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f365b6022c53ac37003186f27a478d4f248d5636c67f8fd64c4ab0616249311e +size 21841196 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join our Class on Auditorium_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join our Class on Auditorium_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..095d0492c738bca84331209618c64a32207dfc4d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join our Class on Auditorium_vi.srt @@ -0,0 +1,480 @@ +1 +00:00:00,210 --> 00:00:02,100 +Người hướng dẫn: Này các bạn, + +2 +00:00:02,100 --> 00:00:04,890 +trong các bài học sắp tới, các bạn sẽ thực + +3 +00:00:04,890 --> 00:00:07,650 +hiện một số bài tập viết mã, trong đó các bạn + +4 +00:00:07,650 --> 00:00:11,970 +sẽ làm theo hướng dẫn và tạo các chương trình để các bạn có thể chạy + +5 +00:00:11,970 --> 00:00:14,550 +mã và cũng kiểm tra mã để đảm bảo rằng nó + +6 +00:00:14,550 --> 00:00:17,400 +vượt qua tất cả của các yêu cầu. + +7 +00:00:17,400 --> 00:00:20,220 +Để bắt đầu, tôi muốn chỉ cho bạn cách thiết lập + +8 +00:00:20,220 --> 00:00:24,240 +trên nền tảng Auditorium nơi chúng tôi thực hiện việc này. + +9 +00:00:24,240 --> 00:00:27,120 +Nếu bạn xem tài nguyên khóa học cho bài học + +10 +00:00:27,120 --> 00:00:31,140 +này, bạn sẽ thấy một URL liên kết đến trang đăng ký. + +11 +00:00:31,140 --> 00:00:34,710 +Vì vậy, nếu bạn chưa đăng ký trên nền tảng Auditorium, hãy + +12 +00:00:34,710 --> 00:00:37,563 +tiếp tục và đăng ký làm người dùng mới, sau đó + +13 +00:00:38,430 --> 00:00:40,180 +tiếp tục và nhấp vào Gửi. + +14 +00:00:41,160 --> 00:00:45,480 +Bây giờ hãy vào hộp thư đến của bạn và xác minh email của bạn. + +15 +00:00:45,480 --> 00:00:47,490 +Bây giờ bạn có thể đăng nhập bằng thông tin đăng nhập + +16 +00:00:47,490 --> 00:00:48,843 +mà bạn đã thiết lập trước đó. + +17 +00:00:49,800 --> 00:00:51,840 +Sau khi đăng nhập, bạn sẽ phải đăng ký + +18 +00:00:51,840 --> 00:00:53,550 +để có thể truy cập vào khóa học + +19 +00:00:53,550 --> 00:00:55,200 +mà tôi đã chuẩn bị cho bạn. + +20 +00:00:55,200 --> 00:00:58,830 +Trong tài nguyên khóa học, bạn sẽ thấy mã đăng ký + +21 +00:00:58,830 --> 00:01:01,230 +và tôi muốn bạn sao chép mã đó. + +22 +00:01:01,230 --> 00:01:03,300 +Và sau khi bạn đã hiểu xong, + +23 +00:01:03,300 --> 00:01:05,010 +hãy đến đây, nhấp vào + +24 +00:01:05,010 --> 00:01:08,370 +nút Đăng ký và dán nó vào hộp này ở đây. + +25 +00:01:08,370 --> 00:01:11,520 +Sau đó nhấp vào Đăng ký và nó sẽ thêm khóa học mà chúng + +26 +00:01:11,520 --> 00:01:14,640 +tôi đã chuẩn bị trên Auditorium cho bạn. + +27 +00:01:14,640 --> 00:01:17,880 +Nó có tên là "100 ngày viết mã - Bài tập Python" + +28 +00:01:17,880 --> 00:01:20,580 +và nếu bạn tiếp tục và nhấp vào Tiếp + +29 +00:01:20,580 --> 00:01:24,840 +tục, nó sẽ đưa bạn đến tất cả các bài học có sẵn và có tổng + +30 +00:01:24,840 --> 00:01:28,770 +cộng 36 bài học/bài tập mà chúng tôi đã chuẩn bị cho + +31 +00:01:28,770 --> 00:01:30,450 +bạn. + +32 +00:01:30,450 --> 00:01:33,660 +Và tất nhiên, bạn sẽ bắt đầu từ ngày đầu tiên. + +33 +00:01:33,660 --> 00:01:35,730 +Sau khi mở bài học, bạn có + +34 +00:01:35,730 --> 00:01:39,210 +thể nhấp vào để bắt đầu phát bài học. + +35 +00:01:39,210 --> 00:01:40,920 +Này các bạn, chào mừng đến với lần đầu tiên. + +36 +00:01:40,920 --> 00:01:43,860 +Và giọng nói của tôi sẽ hướng dẫn bạn những + +37 +00:01:43,860 --> 00:01:46,530 +gì bạn cần làm cho bài tập này. + +38 +00:01:46,530 --> 00:01:50,160 +Nhưng cũng nên nhớ, bạn luôn có thể nhấp vào nút + +39 +00:01:50,160 --> 00:01:51,960 +I lớn này để đọc hướng dẫn + +40 +00:01:51,960 --> 00:01:54,540 +trong khi hoàn thành bài tập. + +41 +00:01:54,540 --> 00:01:59,280 +Bạn có thể tua nhanh hoặc thay đổi tốc độ tường thuật và bạn + +42 +00:01:59,280 --> 00:02:03,060 +có thể hoàn thành bài tập của mình tại đây. + +43 +00:02:03,060 --> 00:02:06,090 +Bạn có thể viết một số mã và nếu bạn muốn kiểm tra mã của mình, + +44 +00:02:06,090 --> 00:02:07,893 +bạn có thể nhấp vào nút Chạy. + +45 +00:02:09,030 --> 00:02:10,979 +Nếu vì lý do nào đó mà bạn đã làm + +46 +00:02:10,979 --> 00:02:14,160 +hỏng việc lớn và bạn chỉ muốn đặt lại về mã nguồn ban + +47 +00:02:14,160 --> 00:02:15,810 +đầu, chỉ cần nhấp vào nút Đặt + +48 +00:02:15,810 --> 00:02:18,180 +lại và nó sẽ quay trở lại trạng thái ban + +49 +00:02:18,180 --> 00:02:21,000 +đầu để bạn có thể bắt đầu lại từ đầu. + +50 +00:02:21,000 --> 00:02:22,920 +Sau khi hoàn tất mã của mình, + +51 +00:02:22,920 --> 00:02:25,500 +bạn có thể nhấp vào nút Gửi. Nút này sẽ + +52 +00:02:25,500 --> 00:02:27,480 +lấy mã của bạn và cố gắng vượt + +53 +00:02:27,480 --> 00:02:31,590 +qua bài kiểm tra mà chúng tôi đã thiết lập cho mã đó. + +54 +00:02:31,590 --> 00:02:33,480 +Để vượt qua bài kiểm tra, + +55 +00:02:33,480 --> 00:02:35,850 +bạn phải đáp ứng tất cả các yêu cầu + +56 +00:02:35,850 --> 00:02:37,830 +cho bài tập cụ thể đó. + +57 +00:02:37,830 --> 00:02:40,140 +Ví dụ, trong trường hợp này, bạn + +58 +00:02:40,140 --> 00:02:44,520 +cần có khả năng in ra đầu ra những dòng này và chỉ sau đó tất + +59 +00:02:44,520 --> 00:02:47,190 +cả các bài kiểm tra mới vượt qua. + +60 +00:02:47,190 --> 00:02:49,410 +Có rất nhiều thử nghiệm và sai sót trong + +61 +00:02:49,410 --> 00:02:50,970 +lập trình, và tất nhiên, + +62 +00:02:50,970 --> 00:02:53,580 +bạn có thể làm điều đó, chạy mã, thử nó một + +63 +00:02:53,580 --> 00:02:55,950 +vài lần và sau đó khi bạn cho rằng mã của + +64 +00:02:55,950 --> 00:02:59,100 +mình đang hoạt động như mong đợi, hãy nhấp vào Gửi + +65 +00:02:59,100 --> 00:03:03,570 +tới kiểm tra nó với tất cả các bài kiểm tra được ghi trước. + +66 +00:03:03,570 --> 00:03:05,340 +Sau khi hoàn thành bài tập, + +67 +00:03:05,340 --> 00:03:08,010 +bạn có thể chuyển sang phần tiếp theo, + +68 +00:03:08,010 --> 00:03:10,380 +phần tiếp theo sẽ là giải pháp mã + +69 +00:03:10,380 --> 00:03:14,250 +mà tôi sẽ hướng dẫn bạn từng dòng giải pháp. + +70 +00:03:14,250 --> 00:03:15,480 +Bạn sẽ nhận thấy ở đây + +71 +00:03:15,480 --> 00:03:18,480 +có nhiều phân đoạn khác nhau trong video. + +72 +00:03:18,480 --> 00:03:22,620 +Mỗi phân đoạn này tương ứng với một bước cụ thể và bạn có thể thực + +73 +00:03:22,620 --> 00:03:23,850 +hiện chúng chỉ bằng + +74 +00:03:23,850 --> 00:03:26,370 +cách nhấp vào nút Tiếp theo. + +75 +00:03:26,370 --> 00:03:28,890 +Vì vậy, bước đầu tiên là xem qua dòng + +76 +00:03:28,890 --> 00:03:31,680 +đầu tiên của giải pháp này, sau đó nếu bạn + +77 +00:03:31,680 --> 00:03:34,440 +nhấp vào Tiếp theo, nó sẽ chuyển đến đầu + +78 +00:03:34,440 --> 00:03:37,710 +dòng tiếp theo và nó sẽ bắt đầu phát lại phần giải + +79 +00:03:37,710 --> 00:03:40,440 +thích về giải pháp mã trên dòng đó. + +80 +00:03:40,440 --> 00:03:44,670 +Hãy thoải mái điều hướng bằng cách sử dụng bản nhạc phát lại. + +81 +00:03:44,670 --> 00:03:48,300 +Bây giờ, mã giải pháp không thể chỉnh sửa được, nó chỉ ở dạng + +82 +00:03:48,300 --> 00:03:50,670 +đọc và bạn không thể thay đổi mã ở đây. + +83 +00:03:50,670 --> 00:03:53,940 +Nhưng nếu ở bất kỳ giai đoạn nào bạn muốn chạy mã và + +84 +00:03:53,940 --> 00:03:57,000 +xem nó hoạt động như thế nào so với mã của bạn thì + +85 +00:03:57,000 --> 00:03:59,220 +bạn luôn có thể chạy mã ở đây. + +86 +00:03:59,220 --> 00:04:01,020 +Cuối cùng, bây giờ, nếu bạn + +87 +00:04:01,020 --> 00:04:02,820 +cần quay lại mã bạn đã viết, + +88 +00:04:02,820 --> 00:04:05,760 +bạn luôn có thể chỉ cần nhấn nút Quay lại cho đến + +89 +00:04:05,760 --> 00:04:08,610 +khi quay lại khung ban đầu và bạn có thể chỉnh + +90 +00:04:08,610 --> 00:04:11,910 +sửa mã của mình, sửa mã đó bằng cách sử dụng, nếu cần. + +91 +00:04:11,910 --> 00:04:15,480 +, những điều bạn đã học được từ giải pháp mã. + +92 +00:04:15,480 --> 00:04:18,209 +Hãy nhớ rằng, nếu có bất kỳ điểm nào mà bạn gặp + +93 +00:04:18,209 --> 00:04:21,120 +sự cố và có điều gì đó không hoạt động như bạn mong + +94 +00:04:21,120 --> 00:04:23,220 +đợi, bạn luôn có thể di chuột qua phía + +95 +00:04:23,220 --> 00:04:27,090 +bên phải của trang trình bày và nhấp để gửi phản hồi, đồng thời + +96 +00:04:27,090 --> 00:04:30,720 +bạn có thể chọn loại phản hồi mà bạn muốn. có. + +97 +00:04:30,720 --> 00:04:33,030 +Nếu bạn gặp vấn đề kỹ thuật với trang web, + +98 +00:04:33,030 --> 00:04:34,230 +hãy chọn vấn đề này và + +99 +00:04:34,230 --> 00:04:37,920 +vấn đề sẽ được chuyển đến nhóm đằng sau nền tảng này. + +100 +00:04:37,920 --> 00:04:40,140 +Ví dụ: nếu điều gì đó không hoạt động bình + +101 +00:04:40,140 --> 00:04:43,110 +thường hoặc điều gì đó không hoạt động theo đúng cách + +102 +00:04:43,110 --> 00:04:45,090 +thì bạn có thể chọn điều này. + +103 +00:04:45,090 --> 00:04:47,130 +Nhưng nếu bạn gặp vấn đề với bài tập + +104 +00:04:47,130 --> 00:04:49,650 +tôi đã tạo, bạn có thể chọn bài tập này. + +105 +00:04:49,650 --> 00:04:52,080 +Và đây là trường hợp nếu bài kiểm tra không + +106 +00:04:52,080 --> 00:04:54,360 +đạt kết quả hoặc nếu bài tập không được cấu + +107 +00:04:54,360 --> 00:04:58,620 +trúc theo cách bạn mong đợi, thì bạn luôn có thể chọn trường hợp này. + +108 +00:04:58,620 --> 00:05:00,030 +Và tất nhiên đó là điều + +109 +00:05:00,030 --> 00:05:04,500 +không bắt buộc và tôi đã thử nghiệm rất nhiều mã cũng như giải pháp + +110 +00:05:04,500 --> 00:05:06,990 +trên nền tảng Auditorium mới này. + +111 +00:05:06,990 --> 00:05:09,960 +Vì vậy, mọi thứ sẽ hoạt động như mong đợi, nhưng trong + +112 +00:05:09,960 --> 00:05:11,850 +trường hợp bạn phát hiện ra điều gì + +113 +00:05:11,850 --> 00:05:14,880 +đó, hãy thoải mái sử dụng các biểu mẫu phản hồi. + +114 +00:05:14,880 --> 00:05:17,100 +Cuối cùng, nếu bạn muốn điều hướng + +115 +00:05:17,100 --> 00:05:21,960 +nhanh giữa giải pháp mã và bài tập viết mã, vui lòng sử dụng ngăn + +116 +00:05:21,960 --> 00:05:24,810 +bên trái ở đây, nơi bạn có thể điều hướng + +117 +00:05:24,810 --> 00:05:27,780 +giữa hai trang trình bày đó, nhưng chỉ có + +118 +00:05:27,780 --> 00:05:29,370 +vậy thôi. + +119 +00:05:29,370 --> 00:05:31,170 +Vì vậy, hãy chuyển sang bài học tiếp + +120 +00:05:31,170 --> 00:05:33,603 +theo và bắt đầu với bài tập đầu tiên của bạn. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join-Auditorium.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..135ebd41d79976d71e2ee9b3f76e5d0d18d35ce7 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/register \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Python-Course-Enrollment-Code.txt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Python-Course-Enrollment-Code.txt new file mode 100644 index 0000000000000000000000000000000000000000..19b20ac827b7e86983f4abacb93cba8df1488be0 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/007 Python-Course-Enrollment-Code.txt @@ -0,0 +1,3 @@ +CP3Y9A6U + + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 How-to-join-Auditorium.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 Link-to-Coding-Exercise-1.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 Link-to-Coding-Exercise-1.url new file mode 100644 index 0000000000000000000000000000000000000000..42ea41b091e7754638a0489167b014b06c84f613 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 Link-to-Coding-Exercise-1.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/49be1e94-c2d3-4683-ae14-36bbef39fc84 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 [Interactive Coding Exercise] Printing.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 [Interactive Coding Exercise] Printing.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..601061458761577de50970caaf2372c2a9691c0f --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 [Interactive Coding Exercise] Printing.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a866c16aaaad17777e1c0d25644d79e794fe7ce1628d9f9b46ff037b5e40286a +size 11787784 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 [Interactive Coding Exercise] Printing_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 [Interactive Coding Exercise] Printing_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9cde1592e64b9273b172cf94201a141c731948e7 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/008 [Interactive Coding Exercise] Printing_vi.srt @@ -0,0 +1,380 @@ +1 +00:00:01,560 --> 00:00:04,080 +Chào các bạn, chào mừng bạn đến với bài + +2 +00:00:04,080 --> 00:00:06,330 +tập đầu tiên trong bộ bài tập này. + +3 +00:00:06,330 --> 00:00:08,790 +Trong bài tập này, chúng tôi kiểm tra kiến + +4 +00:00:08,790 --> 00:00:11,730 +thức của bạn về "câu lệnh in" trong Python. + +5 +00:00:11,730 --> 00:00:14,550 +Vậy là bạn đã học cách in mọi thứ vào đầu ra và chúng tôi đang cố + +6 +00:00:14,550 --> 00:00:15,780 +gắng xem liệu bạn có biết cách + +7 +00:00:15,780 --> 00:00:19,020 +thực hiện điều đó trong một số tình huống khác nhau hay không. + +8 +00:00:19,020 --> 00:00:22,710 +Vì vậy, nếu ngăn mô tả ở bên phải chưa mở, hãy + +9 +00:00:22,710 --> 00:00:23,790 +tiếp tục và nhấp + +10 +00:00:23,790 --> 00:00:28,050 +vào nút i lớn màu đen để mở nó và tại đây bạn sẽ thấy + +11 +00:00:28,050 --> 00:00:30,300 +hướng dẫn chi tiết cho bài + +12 +00:00:30,300 --> 00:00:31,770 +tập này. + +13 +00:00:31,770 --> 00:00:34,230 +Vì vậy, những gì bạn sẽ làm là viết + +14 +00:00:34,230 --> 00:00:35,370 +một tập hợp các + +15 +00:00:35,370 --> 00:00:38,400 +câu lệnh in để in ra kết quả ví dụ. + +16 +00:00:38,400 --> 00:00:41,280 +Bây giờ, một số điều cần lưu ý là đầu ra + +17 +00:00:41,280 --> 00:00:45,900 +mà bạn in phải khớp chính xác với đầu ra của ví dụ, từng từ, + +18 +00:00:45,900 --> 00:00:48,390 +ký tự cho ký tự, dấu cách, ký hiệu, + +19 +00:00:48,390 --> 00:00:52,260 +mọi thứ phải giống hệt nhau để giải pháp vượt qua + +20 +00:00:52,260 --> 00:00:54,863 +tất cả các bài kiểm tra. + +21 +00:00:54,863 --> 00:00:57,870 +Điều này có nghĩa là mọi chữ hoa, + +22 +00:00:57,870 --> 00:01:01,260 +chữ thường đều phải giống hệt nhau. + +23 +00:01:01,260 --> 00:01:04,410 +Và dòng cuối cùng có nội dung in ('in gì'), + +24 +00:01:04,410 --> 00:01:08,100 +nó không nên chỉ in ra 'nên in gì', nó thực sự + +25 +00:01:08,100 --> 00:01:10,500 +sẽ in ra toàn bộ dòng. + +26 +00:01:10,500 --> 00:01:11,880 +Vì vậy, bạn có thể phải suy nghĩ nhanh + +27 +00:01:11,880 --> 00:01:13,293 +về cách thực hiện điều đó. + +28 +00:01:14,490 --> 00:01:17,700 +Nếu bạn gặp khó khăn, đừng lo lắng, hãy xem + +29 +00:01:17,700 --> 00:01:20,580 +lại bài học trước và nếu bạn muốn xem giải + +30 +00:01:20,580 --> 00:01:23,820 +pháp xảy ra trong bài học tiếp theo. + +31 +00:01:23,820 --> 00:01:26,700 +Vì vậy, nếu bạn nhấn nút tiếp theo, nó sẽ đưa bạn + +32 +00:01:26,700 --> 00:01:29,502 +đến mã giải pháp nơi tôi sẽ chạy qua từng dòng, + +33 +00:01:29,502 --> 00:01:32,490 +từng dòng và bạn có thể kiểm tra mã của mình. + +34 +00:01:32,490 --> 00:01:35,513 +Bây giờ, tất cả những gì còn lại bạn phải làm là + +35 +00:01:35,513 --> 00:01:37,650 +bắt đầu bài tập và thực hiện. + +36 +00:01:37,650 --> 00:01:38,483 +Chúc may mắn. + +37 +00:01:41,730 --> 00:01:44,640 +Bây giờ, chúng ta hãy đi qua từng dòng giải pháp. + +38 +00:01:44,640 --> 00:01:49,500 +Dòng đầu tiên được in, sau đó bên trong tập hợp dấu ngoặc đơn, chúng ta + +39 +00:01:49,500 --> 00:01:52,290 +có văn bản chính xác mà chúng ta muốn in. + +40 +00:01:52,290 --> 00:01:54,720 +Và trên thực tế, tôi vừa sao chép + +41 +00:01:54,720 --> 00:01:57,780 +và dán vào ví dụ đầu ra từ khung mô tả. + +42 +00:01:57,780 --> 00:02:01,650 +Bằng cách này, tôi có thể chắc chắn rằng mình không bỏ sót bất kỳ khoảng + +43 +00:02:01,650 --> 00:02:05,430 +trắng nào và tất cả các ký tự đều được viết hoa đúng cách. + +44 +00:02:05,430 --> 00:02:06,750 +Đây là một thủ thuật gọn gàng. + +45 +00:02:06,750 --> 00:02:10,833 +Hãy chú ý cách tôi đặt dấu ngoặc kép quanh + +46 +00:02:10,833 --> 00:02:14,070 +chuỗi mà tôi muốn in ra. + +47 +00:02:14,070 --> 00:02:17,070 +Vì vậy, đây là một cách để chúng ta xác + +48 +00:02:17,070 --> 00:02:18,870 +định phần nào được đưa + +49 +00:02:18,870 --> 00:02:22,503 +vào đầu ra và phần nào được hiểu là mã. + +50 +00:02:23,520 --> 00:02:25,590 +Bây giờ, dòng thứ hai cũng gần giống + +51 +00:02:25,590 --> 00:02:27,780 +như vậy, nó lại là một phần của mã. + +52 +00:02:27,780 --> 00:02:31,170 +Vì vậy, hướng dẫn của tôi đối với máy tính là từ + +53 +00:02:31,170 --> 00:02:32,820 +"in", và ở giữa dấu ngoặc + +54 +00:02:32,820 --> 00:02:35,250 +đơn là văn bản tôi muốn in. + +55 +00:02:35,250 --> 00:02:37,740 +Và bằng cách đặt dấu ngoặc kép xung quanh văn + +56 +00:02:37,740 --> 00:02:41,610 +bản, tôi đang nói với máy tính rằng điều này nên được hiểu là văn bản chứ + +57 +00:02:41,610 --> 00:02:42,873 +không phải là mã. + +58 +00:02:43,710 --> 00:02:45,780 +Bây giờ, dòng cuối cùng hơi phức + +59 +00:02:45,780 --> 00:02:50,040 +tạp một chút vì bạn phải in ra câu lệnh thực tế, "in ('nội dung cần in') + +60 +00:02:50,040 --> 00:02:53,340 +chứ không chỉ các từ. "nên in cái gì", bởi vì nếu + +61 +00:02:53,340 --> 00:02:55,890 +bạn chỉ để lại dòng đó với một câu lệnh in + +62 +00:02:55,890 --> 00:02:58,860 +duy nhất, thì trong kết quả đầu ra, bạn sẽ chỉ thấy + +63 +00:02:58,860 --> 00:03:00,660 +dòng chữ "in cái gì". + +64 +00:03:00,660 --> 00:03:03,030 +Trong trường hợp của chúng ta, chúng ta đang cố gắng ghi lại một số ghi chú, phải không? + +65 +00:03:03,030 --> 00:03:04,380 +Chúng tôi đang cố gắng nhắc nhở bản thân + +66 +00:03:04,380 --> 00:03:06,270 +rằng đây là cách chúng tôi sử dụng câu lệnh in. + +67 +00:03:06,270 --> 00:03:09,720 +Đây là cách mã nên được định dạng trong Python. + +68 +00:03:09,720 --> 00:03:13,590 +Nếu bạn nhớ bài học trước đó, trong Python và nhiều + +69 +00:03:13,590 --> 00:03:17,160 +ngôn ngữ lập trình khác, chúng ta có thể thay + +70 +00:03:17,160 --> 00:03:20,400 +thế các dấu ngoặc đơn và dấu ngoặc kép này + +71 +00:03:20,400 --> 00:03:23,070 +để tạo ra chức năng tương tự. + +72 +00:03:23,070 --> 00:03:27,090 +Trong trường hợp này, chúng ta muốn viết, "print('what to + +73 +00:03:27,090 --> 00:03:29,490 +print')" và chúng ta có dấu ngoặc đơn + +74 +00:03:29,490 --> 00:03:32,430 +bao quanh 'what to print', và chúng ta có dấu + +75 +00:03:32,430 --> 00:03:34,380 +ngoặc kép bao quanh toàn bộ phần + +76 +00:03:34,380 --> 00:03:36,930 +của dòng mà chúng ta muốn in ra. + +77 +00:03:36,930 --> 00:03:40,800 +Bây giờ, điều gì sẽ xảy ra nếu bạn làm ngược lại, hoặc điều gì + +78 +00:03:40,800 --> 00:03:44,610 +sẽ xảy ra nếu bạn đặt cùng một loại dấu ngoặc kép, chẳng hạn như + +79 +00:03:44,610 --> 00:03:47,220 +dấu ngoặc kép trong mọi tình huống? + +80 +00:03:47,220 --> 00:03:49,890 +Chà, bạn luôn có thể quay lại trang trình bày + +81 +00:03:49,890 --> 00:03:53,940 +trước đó và tự mình thử và kết quả có thể đáng ngạc nhiên nhưng đây + +82 +00:03:53,940 --> 00:03:56,340 +là điều quan trọng cần chú ý và thu hút + +83 +00:03:56,340 --> 00:03:57,750 +sự chú ý của bạn. + +84 +00:03:57,750 --> 00:04:00,210 +Vì vậy, hy vọng bạn đã tự mình trải + +85 +00:04:00,210 --> 00:04:03,870 +nghiệm điều này và bạn đã in được dòng chính xác. + +86 +00:04:03,870 --> 00:04:05,760 +Nếu bạn gặp bất kỳ vấn đề nào, hãy + +87 +00:04:05,760 --> 00:04:07,680 +nhớ nhấp vào nút Quay lại… ở cuối + +88 +00:04:07,680 --> 00:04:09,930 +điều hướng và bạn có thể quay lại trang + +89 +00:04:09,930 --> 00:04:11,629 +trình bày trước đó để cập nhật + +90 +00:04:11,629 --> 00:04:13,890 +và thay đổi mã của mình cũng như gửi + +91 +00:04:13,890 --> 00:04:17,310 +giải pháp chính xác sau khi hoàn tất. + +92 +00:04:17,310 --> 00:04:19,829 +Hãy suy nghĩ kỹ về lý do tại sao bạn lại + +93 +00:04:19,829 --> 00:04:22,500 +sai và miễn là bạn hiểu điều gì đã xảy ra thì + +94 +00:04:22,500 --> 00:04:23,790 +tôi rất vui vì bạn đã + +95 +00:04:23,790 --> 00:04:26,133 +hoàn thành được bài tập này. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 Fork-the-Day-1-Starting-Repl.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 Fork-the-Day-1-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..dde44cf60d8dc03a88a99e78f903267117d0990d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 Fork-the-Day-1-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/day-1-printing-start \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 String Manipulation and Code Intelligence.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 String Manipulation and Code Intelligence.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..609a5c2ab45fed954ec619eab0e3348af76e78b5 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 String Manipulation and Code Intelligence.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8702b6c5289e2e2ecb98213d4cb8a5e3a0d0e0728783bdc2a10d72fd9f37add1 +size 49304050 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 String Manipulation and Code Intelligence_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 String Manipulation and Code Intelligence_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..808cdc20cf44392992dfd01b5742091a9a1a1810 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/009 String Manipulation and Code Intelligence_vi.srt @@ -0,0 +1,536 @@ +1 +00:00:00,160 --> 00:00:00,790 +Tất cả các quyền. + +2 +00:00:00,790 --> 00:00:05,230 +Hãy quay lại tìm hiểu về một số điều khác mà chúng ta có thể làm với chuỗi. + +3 +00:00:05,950 --> 00:00:10,480 +Bạn đã thấy trong bài học trước rằng nếu chúng ta muốn in mọi thứ trên từng + +4 +00:00:10,480 --> 00:00:14,830 +dòng riêng lẻ, thì chúng ta thực sự phải viết chúng một vài lần, phải không? + +5 +00:00:14,830 --> 00:00:17,320 +Chúng tôi phải viết + +6 +00:00:17,350 --> 00:00:21,970 +in, ừm, trên ba dòng nếu chúng tôi muốn nó được + +7 +00:00:22,060 --> 00:00:27,060 +in một, hai, ba, như vậy. Bây giờ trong bài học này, tôi muốn chỉ cho bạn một phương pháp + +8 +00:00:27,700 --> 00:00:31,120 +mà chúng ta có thể làm điều tương tự, nhưng bằng cách sử dụng một phương thức in duy nhất. + +9 +00:00:31,270 --> 00:00:33,580 +Vì vậy, tiết kiệm cho chúng ta một vài ký tự. + +10 +00:00:34,180 --> 00:00:39,180 +Vì vậy, cách chúng ta tạo một dòng mới là viết một dấu gạch chéo ngược và ký + +11 +00:00:40,720 --> 00:00:41,553 +tự N. + +12 +00:00:42,160 --> 00:00:47,160 +Và bây giờ nếu tôi tiếp tục và viết hello world một lần nữa sau đó và tôi nhấn + +13 +00:00:49,150 --> 00:00:53,770 +run, hoặc bạn luôn có thể sử dụng phím tắt, đó là lệnh + enter trên Mac + +14 +00:00:53,770 --> 00:00:55,540 +hoặc control + enter trên Windows. + +15 +00:00:56,020 --> 00:00:59,650 +Và bạn có thể thấy rằng khi dòng mã đó đã + +16 +00:01:00,100 --> 00:01:03,760 +được thực thi, tôi đã in hello world trên hai dòng + +17 +00:01:04,209 --> 00:01:08,290 +riêng biệt, được phân tách bằng \ n và ký tự màu hồng + +18 +00:01:08,650 --> 00:01:11,770 +này, được thay thế bằng một dòng mới. + +19 +00:01:13,030 --> 00:01:16,390 +Vì vậy, hãy tiếp tục và thử xem liệu bạn có thể tạo một cái khác hay không. + +20 +00:01:16,540 --> 00:01:17,290 +Hãy nhớ + +21 +00:01:17,290 --> 00:01:22,290 +rằng, đó là dấu gạch chéo ngược chứ không phải dấu gạch chéo ngược nhưng tô sáng cú + +22 +00:01:22,300 --> 00:01:25,740 +pháp sẽ giúp ích cho bạn. Được rồi, chúng ta có + +23 +00:01:25,800 --> 00:01:30,800 +thể chỉ cần thêm một \ n khác và hãy nhớ rằng trừ khi bạn muốn + +24 +00:01:31,080 --> 00:01:35,940 +một khoảng trắng xuất hiện ngay trước nơi hello world của bạn xuất hiện, bạn thực + +25 +00:01:36,210 --> 00:01:40,440 +sự không muốn có bất kỳ khoảng trống nào giữa mỗi dòng này. + +26 +00:01:43,530 --> 00:01:46,200 +Chúng ta bắt đầu. Chúng tôi đã có kết quả + +27 +00:01:46,440 --> 00:01:51,440 +tương tự như trước đây, nhưng bây giờ chỉ sử dụng một câu lệnh in duy nhất và tạo một số dòng + +28 +00:01:52,020 --> 00:01:53,130 +mới với \ n. + +29 +00:01:54,000 --> 00:01:59,000 +Bây giờ một trong những điều khác mà chúng ta có thể làm với các chuỗi là chúng ta có + +30 +00:01:59,610 --> 00:02:00,443 +thể nối chúng. + +31 +00:02:00,660 --> 00:02:05,660 +Điều này có nghĩa là chúng ta kết hợp các chuỗi khác nhau để chúng sẽ được + +32 +00:02:06,840 --> 00:02:10,380 +thêm vào cuối chuỗi khác. Đây là một ví dụ. + +33 +00:02:10,500 --> 00:02:15,500 +Giả sử chúng ta đã có từ xin chào và tôi muốn thêm tên của mình vào cuối từ này để + +34 +00:02:17,010 --> 00:02:20,640 +biến nó thành một chuỗi duy nhất. Tôi có thể kết hợp hai + +35 +00:02:20,640 --> 00:02:25,640 +chuỗi đơn giản bằng cách sử dụng một dấu cộng. Vì vậy, tôi có thể viết "Xin + +36 +00:02:27,240 --> 00:02:31,800 +chào" + "Angela". Bây giờ đây là một câu hỏi. Khi điều này chạy, + +37 +00:02:31,890 --> 00:02:36,030 +bạn nghĩ nó sẽ như thế nào? Bạn có nghĩ nó sẽ viết Xin chào + +38 +00:02:36,060 --> 00:02:41,040 +Angela hay xin chào Angela, tất cả trong một từ? Hãy xem điều gì sẽ xảy ra. + +39 +00:02:42,000 --> 00:02:47,000 +Bạn có thể thấy rằng hai chuỗi này hiện đã được kết hợp thành một và không có khoảng + +40 +00:02:47,730 --> 00:02:52,730 +trắng ở giữa vì chúng ta không có ký tự khoảng trắng ở bất kỳ đâu trong đây. + +41 +00:02:54,030 --> 00:02:59,030 +Tạm dừng video và xem liệu bạn có thể thêm khoảng trắng vào giữa hay không. + +42 +00:03:00,220 --> 00:03:00,610 +Được rồi, + +43 +00:03:00,610 --> 00:03:05,020 +có hai cách để bạn có thể thực hiện việc này hoặc có thể là ba cách. Bạn có thể thêm khoảng trắng + +44 +00:03:05,020 --> 00:03:08,080 +vào cuối câu chào, bạn có thể thêm khoảng + +45 +00:03:08,140 --> 00:03:13,140 +trắng vào đầu Angela hoặc bạn thực sự có thể tiếp tục sử dụng nối + +46 +00:03:14,110 --> 00:03:18,700 +chuỗi bằng cách chỉ cần thêm một chuỗi khác vào giữa hai chuỗi này + +47 +00:03:19,060 --> 00:03:23,500 +và chuỗi này chỉ là khoảng trắng. Vì vậy, bây giờ khi tôi + +48 +00:03:23,590 --> 00:03:28,590 +chạy mã của mình, bạn có thể thấy khoảng trống được chèn và phần dài này + +49 +00:03:29,320 --> 00:03:32,890 +được kết hợp thành một chuỗi duy nhất trông giống như + +50 +00:03:33,580 --> 00:03:37,150 +thế này sau khi bit này của mã được thực thi. + +51 +00:03:38,140 --> 00:03:42,880 +Nếu chúng ta nghĩ về chuỗi là một chuỗi các ký tự được kết nối, + +52 +00:03:43,540 --> 00:03:48,540 +thì việc nối chuỗi chỉ đơn giản là lấy các chuỗi ký tự riêng biệt đó + +53 +00:03:49,810 --> 00:03:53,800 +và hợp nhất chúng thành một. Bây giờ, đây là một điểm + +54 +00:03:53,830 --> 00:03:58,830 +tốt để đề cập rằng trong lập trình Python, không gian thực sự rất + +55 +00:03:59,590 --> 00:04:00,640 +quan trọng. + +56 +00:04:01,510 --> 00:04:06,510 +Và điều tôi muốn nói ở đây không phải là quá nhiều khoảng trắng bên trong chuỗi như + +57 +00:04:07,120 --> 00:04:11,470 +thế này, mà là những khoảng trắng mà bạn thêm vào mã của mình. + +58 +00:04:12,010 --> 00:04:15,550 +Vì vậy, đây, câu lệnh in của tôi, nếu tôi nhấn phím xóa lùi, bạn + +59 +00:04:15,610 --> 00:04:19,930 +có thể thấy rằng không có gì xảy ra. Tôi không thể quay lại được nữa. + +60 +00:04:20,560 --> 00:04:25,560 +Nhưng nếu tôi đã thêm khoảng trắng hoặc nếu tôi thêm tab bằng phím TAB, thì bạn + +61 +00:04:28,810 --> 00:04:33,250 +sẽ thấy rằng khi tôi cố chạy mã của mình, tôi thực sự gặp lỗi. + +62 +00:04:33,730 --> 00:04:37,000 +Và loại lỗi lần này không phải là lỗi cú pháp nữa. + +63 +00:04:37,390 --> 00:04:39,790 +Bây giờ nó là một lỗi thụt lề. + +64 +00:04:40,540 --> 00:04:45,540 +Và nó nói rằng có một dấu thụt lề bất ngờ ở vị trí này + +65 +00:04:45,760 --> 00:04:50,380 +ngay ở đầu câu lệnh in. Vì vậy, khi bạn viết mã bằng + +66 +00:04:50,470 --> 00:04:55,470 +Python, điều thực sự quan trọng là bạn phải bắt đầu tất cả mã của mình ở đầu + +67 +00:04:55,930 --> 00:05:00,910 +dòng và bạn không vô tình có bất kỳ khoảng trắng nào hoặc bất kỳ tab nào + +68 +00:05:00,910 --> 00:05:03,550 +mà bạn đã chèn vào trước dòng mã số. + +69 +00:05:04,120 --> 00:05:06,850 +Và lần sau khi bạn gặp lỗi thụt lề, bạn + +70 +00:05:07,210 --> 00:05:11,620 +sẽ có thể xem lỗi đó ở đâu và hy vọng bạn sẽ có thể sử dụng + +71 +00:05:11,620 --> 00:05:16,620 +Stack Overflow hoặc chỉ cần nhớ thông báo lỗi này có nghĩa là gì và bạn sẽ có thể + +72 +00:05:16,840 --> 00:05:18,220 +sửa mã của bạn. + +73 +00:05:19,300 --> 00:05:22,060 +Đây là lỗi thứ hai mà chúng tôi gặp phải. + +74 +00:05:22,150 --> 00:05:25,360 +Lỗi cuối cùng là lỗi cú pháp, ví dụ như khi + +75 +00:05:25,360 --> 00:05:28,420 +chúng ta quên thêm dấu ngoặc kép ở cuối. + +76 +00:05:29,050 --> 00:05:34,050 +Và lỗi này được gọi là lỗi cú pháp và lỗi này được gọi là lỗi thụt lề. + +77 +00:05:36,010 --> 00:05:38,530 +Và như tôi đã đề cập trước đây, + +78 +00:05:38,620 --> 00:05:43,210 +trong khi viết mã, bạn sẽ mắc rất nhiều lỗi này và những lỗi khác. + +79 +00:05:43,210 --> 00:05:45,310 +Đây là điều chắc chắn duy nhất mà chúng tôi biết. + +80 +00:05:46,300 --> 00:05:51,070 +Vì vậy, thật tuyệt khi bạn đã tìm hiểu về chúng và nhận ra chúng. + +81 +00:05:51,490 --> 00:05:55,270 +Nhưng làm thế nào chúng ta có thể ngăn chặn điều này xảy ra ngay từ đầu? Chà, chú ý khi bạn đang gõ + +82 +00:05:55,300 --> 00:05:59,870 +phím cũng có ích, nhưng đôi khi chúng ta đều cảm thấy mệt mỏi, đặc biệt là khi tôi viết mã + +83 +00:05:59,870 --> 00:06:03,650 +vào ban đêm, thậm chí khi tôi nhìn vào tên của chính mình, có vẻ như nó + +84 +00:06:03,650 --> 00:06:07,070 +đã viết sai chính tả và tôi không thể tìm ra. ra trái và phải. + +85 +00:06:07,100 --> 00:06:11,990 +Vì vậy, trong hầu hết các trường hợp, trình soạn thảo văn bản có rất nhiều tính năng hữu ích. + +86 +00:06:12,470 --> 00:06:16,340 +Nếu bạn vào thanh cài đặt ở đây và cuộn hết cỡ xuống dưới cùng, bạn có thể + +87 +00:06:16,700 --> 00:06:20,780 +thấy có một thứ gọi là Code Intelligence. Và mã thông minh là thứ sẽ + +88 +00:06:20,780 --> 00:06:25,310 +giúp bạn tự động hoàn thành một số chức năng như chức năng in của + +89 +00:06:25,310 --> 00:06:30,310 +chúng tôi ở đây và cung cấp cho bạn một số thông tin hoặc gợi ý hữu + +90 +00:06:30,740 --> 00:06:32,060 +ích khi bạn nhập. + +91 +00:06:32,450 --> 00:06:37,450 +Vì vậy, hãy tiếp tục và thay đổi nó thành đã bật và đóng ngăn cài đặt của chúng tôi. + +92 +00:06:38,780 --> 00:06:43,370 +Và bạn có thể thấy ngay bây giờ nếu tôi, chẳng hạn, quên thêm dấu ngoặc kép của mình, thì + +93 +00:06:43,640 --> 00:06:48,230 +tôi đã bắt đầu nhận được một dòng chữ nguệch ngoạc nhỏ màu đỏ ở đây và một chút + +94 +00:06:48,290 --> 00:06:50,780 +màu đỏ ở phía bên tay phải của thanh cuộn. + +95 +00:06:51,350 --> 00:06:53,810 +Và nếu tôi di chuột qua dòng chữ nguệch ngoạc + +96 +00:06:54,140 --> 00:06:58,910 +màu đỏ, bạn có thể thấy rằng nó cho tôi lỗi mà tôi sẽ gặp phải nếu tôi chạy + +97 +00:06:58,910 --> 00:07:02,450 +mã của mình ngay bây giờ. Và vì vậy nó nhắc nhở tôi + +98 +00:07:02,480 --> 00:07:06,500 +rằng, Ồ vâng, có thể có điều gì đó về chuỗi của tôi không đúng lắm. + +99 +00:07:06,800 --> 00:07:11,800 +Và bạn cũng có thể chỉ Google các thông báo lỗi này và xem nó trong Stack Overflow để + +100 +00:07:11,840 --> 00:07:14,840 +nhắc nhở bản thân về lỗi có thể liên quan đến. + +101 +00:07:15,530 --> 00:07:20,060 +Và tôi có thể sửa nó mà không cần phải chạy mã của mình và để nó bị hỏng. + +102 +00:07:20,480 --> 00:07:23,060 +Bởi vì hãy nhớ rằng khi bạn đang viết các chương + +103 +00:07:23,090 --> 00:07:25,550 +trình lớn, nó không chỉ là một dòng mã. + +104 +00:07:25,670 --> 00:07:30,200 +Bạn có thể có nhiều dòng mã, mỗi dòng có lỗi riêng. + +105 +00:07:30,200 --> 00:07:33,380 +Ví dụ: cái này có thể thiếu dấu ngoặc kép, cái + +106 +00:07:33,620 --> 00:07:36,260 +này có thể thiếu dấu cộng, cái + +107 +00:07:36,710 --> 00:07:39,470 +này có thể có hàm in sai chính tả. + +108 +00:07:39,980 --> 00:07:44,510 +Mã tiếp theo có thể có một thụt lề không có nghĩa là ở đó và khi bạn chạy + +109 +00:07:44,930 --> 00:07:49,070 +mã của mình như thế này, nó sẽ chỉ cung cấp cho bạn vấn đề đầu tiên. + +110 +00:07:49,670 --> 00:07:51,260 +Sau khi bạn khắc phục được + +111 +00:07:51,290 --> 00:07:55,820 +vấn đề đó, nó sẽ tiếp tục đến vấn đề tiếp theo cho đến khi bạn đã khắc phục xong + +112 +00:07:56,270 --> 00:08:00,920 +mọi thứ và điều này thực sự rất khó khăn. Nhưng khi kích hoạt tính năng thông minh của + +113 +00:08:01,130 --> 00:08:05,330 +mã, mỗi khi chúng tôi mắc lỗi, chẳng hạn như lỗi thụt lề như thế này, thì chúng + +114 +00:08:05,570 --> 00:08:09,260 +tôi sẽ có thể di chuột qua nó và bạn sẽ thấy thụt lề bất ngờ. + +115 +00:08:09,560 --> 00:08:13,970 +Vì vậy, chúng tôi sẽ có thể khắc phục điều đó. Nếu chúng ta quên đóng báo cáo in + +116 +00:08:14,330 --> 00:08:18,020 +của mình, thì chúng ta sẽ nhận được một dòng nhỏ nguệch ngoạc bên cạnh nó. + +117 +00:08:18,380 --> 00:08:21,500 +Và nếu chúng tôi nói báo cáo in sai chính + +118 +00:08:21,890 --> 00:08:26,810 +tả của mình, chúng tôi cũng sẽ gặp lỗi khi cho chúng tôi biết tên không xác + +119 +00:08:26,870 --> 00:08:31,870 +định đó hoặc nó không biết 'prnt' này là gì và tô sáng cú pháp cũng thay đổi + +120 +00:08:34,159 --> 00:08:38,990 +và tất cả mọi thứ sẽ giúp bạn tránh sai lầm và viết tốt mã rắn. + +121 +00:08:40,640 --> 00:08:43,970 +Vì vậy, bây giờ là lúc cho một thử thách mã khác. + +122 +00:08:44,480 --> 00:08:45,830 +Và trong thử thách mã + +123 +00:08:46,040 --> 00:08:51,040 +này, tôi có cả đống mã bị hỏng cho bạn và công việc của bạn là gỡ lỗi hoặc + +124 +00:08:53,060 --> 00:08:57,840 +loại bỏ các lỗi khỏi mã và làm cho mã chạy mà không có bất kỳ lỗi nào. + +125 +00:08:58,740 --> 00:09:03,740 +Việc gỡ lỗi từ ngữ này thực sự xuất phát từ một câu chuyện mà ở những năm 1980, một con + +126 +00:09:04,530 --> 00:09:09,530 +bướm đêm đã thực sự bay vào một trong những chiếc máy tính đầu tiên và nó không may bị + +127 +00:09:11,130 --> 00:09:14,370 +điện giật cho con bướm đêm và cho lập trình viên, điều + +128 +00:09:14,400 --> 00:09:18,540 +đó có nghĩa là mã của anh ta không hoạt động như anh ta mong đợi. đến. + +129 +00:09:18,960 --> 00:09:22,500 +Vì vậy, anh ấy thực sự phải vào máy tính, nhặt bỏ con sâu + +130 +00:09:22,950 --> 00:09:25,890 +bướm và sửa các dây để nó hoạt động trở lại. + +131 +00:09:26,670 --> 00:09:30,330 +Bây giờ chúng tôi không có bất kỳ con bướm đêm nào bay xung quanh mã + +132 +00:09:30,750 --> 00:09:35,520 +của chúng tôi, nhưng những gì chúng tôi phải làm là chúng tôi phải tìm ra các lỗi để mã của + +133 +00:09:35,520 --> 00:09:39,630 +chúng tôi sẽ chạy theo cách mà chúng tôi mong đợi mà không có bất kỳ lỗi nào. + +134 +00:09:40,050 --> 00:09:45,050 +Vì vậy, hãy chuyển sang bài học tiếp theo và thử bài tập gỡ lỗi đầu tiên của bạn. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 Exercise-2.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 Exercise-2.url new file mode 100644 index 0000000000000000000000000000000000000000..5c9a9e69af964cf5b040e11f5321b6cdf2b8dbd1 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 Exercise-2.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d43d1d37-164f-4a24-8e5a-3cc03722437f \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 How-to-join-Auditorium.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 [Interactive Coding Exercise] Debugging Practice.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 [Interactive Coding Exercise] Debugging Practice.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..193e697194be510cd13f20485e345c9b2e908e9f --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 [Interactive Coding Exercise] Debugging Practice.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66e048c14fd1fc4b32f3e3b856f79284b7c78150b40c9aff74d6b3a755ab184f +size 12739284 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 [Interactive Coding Exercise] Debugging Practice_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 [Interactive Coding Exercise] Debugging Practice_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6ddffe9c4b039c3f10f4597200306389e2166240 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/010 [Interactive Coding Exercise] Debugging Practice_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,810 --> 00:00:01,950 +Trong bài tập này, mục + +2 +00:00:01,950 --> 00:00:04,470 +tiêu là thực hiện một số thao tác sửa lỗi. + +3 +00:00:04,470 --> 00:00:07,290 +Chúng tôi sẽ xác định lỗi xảy ra với + +4 +00:00:07,290 --> 00:00:10,830 +mã và sửa nó để mã hoạt động như mong đợi. + +5 +00:00:10,830 --> 00:00:13,410 +Bây giờ mục tiêu là khi bạn nhấn Run + +6 +00:00:13,410 --> 00:00:16,890 +Code, nó sẽ in ra kết quả mẫu chính xác như được + +7 +00:00:16,890 --> 00:00:19,080 +thấy trong khung mô tả. + +8 +00:00:19,080 --> 00:00:20,790 +Nếu ngăn mô tả không mở, + +9 +00:00:20,790 --> 00:00:22,230 +hãy nhớ rằng bạn luôn + +10 +00:00:22,230 --> 00:00:25,740 +có thể nhấp vào nút i lớn đó để hiển thị nó. + +11 +00:00:25,740 --> 00:00:29,040 +Vì vậy, bạn có thể thấy một số lỗi nhất định khi + +12 +00:00:29,040 --> 00:00:30,990 +nhấn nút Chạy mã mà không thực + +13 +00:00:30,990 --> 00:00:34,140 +hiện bất kỳ thay đổi nào đối với mã. + +14 +00:00:34,140 --> 00:00:36,240 +Và dựa trên những gì những lỗi đó + +15 +00:00:36,240 --> 00:00:39,780 +cho bạn biết hoặc dựa trên kiến thức của bạn về câu lệnh + +16 +00:00:39,780 --> 00:00:41,700 +in trong Python, bạn sẽ có thể + +17 +00:00:41,700 --> 00:00:44,130 +sửa mã để nó hoạt động chính xác. + +18 +00:00:44,130 --> 00:00:45,840 +Khi đầu ra trong khung + +19 +00:00:45,840 --> 00:00:49,380 +đầu ra khớp chính xác với đầu ra của ví dụ thì bạn + +20 +00:00:49,380 --> 00:00:51,780 +có thể thoải mái nhấn nút Gửi và + +21 +00:00:51,780 --> 00:00:53,580 +kiểm tra mã của mình. + +22 +00:00:53,580 --> 00:00:54,870 +Và khi bạn đã hoàn tất hoặc + +23 +00:00:54,870 --> 00:00:55,980 +nếu gặp khó khăn, hãy + +24 +00:00:55,980 --> 00:00:57,780 +nhớ rằng bạn có thể nhấn nút Tiếp theoâž¡ + +25 +00:00:57,780 --> 00:01:00,360 +và tôi sẽ cùng bạn xem xét giải pháp. + +26 +00:01:00,360 --> 00:01:01,503 +Vì vậy, hãy đi ngay bây giờ. + +27 +00:01:06,540 --> 00:01:08,460 +Chúng ta hãy cùng nhau tìm hiểu giải pháp. + +28 +00:01:08,460 --> 00:01:10,440 +Trong câu lệnh in đầu tiên, + +29 +00:01:10,440 --> 00:01:14,460 +chúng tôi thiếu dấu ngoặc kép trước từ "Ngày". + +30 +00:01:14,460 --> 00:01:17,550 +Bằng cách đó, chúng ta có thể cho máy tính + +31 +00:01:17,550 --> 00:01:20,280 +biết phần nào trong toàn bộ dòng là văn + +32 +00:01:20,280 --> 00:01:22,740 +bản mà chúng ta muốn in ra. + +33 +00:01:22,740 --> 00:01:24,930 +Bây giờ, nếu các dấu ngoặc kép đó + +34 +00:01:24,930 --> 00:01:28,170 +không khớp, chẳng hạn như trong mã lỗi bắt đầu, + +35 +00:01:28,170 --> 00:01:29,550 +thì máy tính sẽ không + +36 +00:01:29,550 --> 00:01:31,590 +biết phần nào sẽ được in ra. + +37 +00:01:31,590 --> 00:01:33,900 +Bằng cách thêm dấu ngoặc kép đó, + +38 +00:01:33,900 --> 00:01:36,540 +chúng tôi sửa câu lệnh in đầu tiên. + +39 +00:01:36,540 --> 00:01:38,460 +Trong câu lệnh in thứ + +40 +00:01:38,460 --> 00:01:42,870 +hai, vấn đề là chúng ta chỉ có dấu ngoặc kép. + +41 +00:01:42,870 --> 00:01:44,670 +Cách hoạt động của dấu + +42 +00:01:44,670 --> 00:01:46,410 +ngoặc kép là máy tính sẽ + +43 +00:01:46,410 --> 00:01:49,170 +tìm dấu ngoặc kép đầu tiên và giả định + +44 +00:01:49,170 --> 00:01:52,980 +nội dung giữa dấu ngoặc kép đó và dấu ngoặc kép thứ + +45 +00:01:52,980 --> 00:01:56,550 +hai mà nó coi là văn bản bạn muốn in. + +46 +00:01:56,550 --> 00:01:58,470 +Bây giờ, điều này phức tạp bởi thực + +47 +00:01:58,470 --> 00:02:00,630 +tế là chúng ta có biểu tượng dấu cộng mà chúng + +48 +00:02:00,630 --> 00:02:03,390 +ta muốn hiển thị trong câu lệnh in của mình. + +49 +00:02:03,390 --> 00:02:07,500 +Cách khắc phục vấn đề này là thay thế loại báo giá. + +50 +00:02:07,500 --> 00:02:10,560 +Vì vậy, nếu chúng ta thay đổi dấu ngoặc kép + +51 +00:02:10,560 --> 00:02:13,470 +bên ngoài, dấu ngoặc kép ngay trước từ + +52 +00:02:13,470 --> 00:02:17,700 +"Chuỗi" và ngay sau dấu chấm hết thành dấu ngoặc đơn thì + +53 +00:02:17,700 --> 00:02:22,200 +toàn bộ câu lệnh in của chúng ta sẽ có ý nghĩa đối với máy tính + +54 +00:02:22,200 --> 00:02:26,850 +và nó sẽ coi toàn bộ văn bản bên trong câu lệnh in là một khối của + +55 +00:02:26,850 --> 00:02:28,710 +văn bản và nó biết rằng chúng + +56 +00:02:28,710 --> 00:02:30,930 +ta muốn in ra dấu ngoặc kép xung + +57 +00:02:30,930 --> 00:02:32,880 +quanh dấu cộng. + +58 +00:02:34,710 --> 00:02:36,990 +Trong câu lệnh in thứ ba, có + +59 +00:02:36,990 --> 00:02:38,790 +thêm một vết thụt đầu + +60 +00:02:38,790 --> 00:02:41,190 +dòng ở đầu dòng và hãy nhớ rằng + +61 +00:02:41,190 --> 00:02:42,930 +trong Python nó rất + +62 +00:02:42,930 --> 00:02:45,780 +nhạy cảm với việc thụt lề. + +63 +00:02:45,780 --> 00:02:50,040 +Nó xem điều đó là tách biệt khỏi việc không thụt đầu dòng. + +64 +00:02:50,040 --> 00:02:51,720 +Vì vậy, điều thực sự quan + +65 +00:02:51,720 --> 00:02:55,290 +trọng là chúng ta phải sắp xếp các tệp mã của mình và + +66 +00:02:55,290 --> 00:02:56,123 +trong trường + +67 +00:02:56,123 --> 00:02:59,070 +hợp này nếu bạn chỉ cần loại bỏ phần thụt lề + +68 +00:02:59,070 --> 00:03:01,560 +bổ sung đó và đặt câu lệnh in đó bắt đầu + +69 +00:03:01,560 --> 00:03:03,030 +ở đầu dòng thì chúng ta + +70 +00:03:03,030 --> 00:03:05,493 +có thể sửa lỗi này. + +71 +00:03:06,630 --> 00:03:09,060 +Trong lỗi cuối cùng, chúng + +72 +00:03:09,060 --> 00:03:12,510 +tôi có thêm dấu ngoặc đơn mở trong + +73 +00:03:12,510 --> 00:03:14,970 +câu lệnh in và chỉ cần loại + +74 +00:03:14,970 --> 00:03:17,040 +bỏ nó, mã của chúng tôi + +75 +00:03:17,040 --> 00:03:20,160 +sẽ có ý nghĩa. + +76 +00:03:20,160 --> 00:03:22,980 +Câu lệnh in bao gồm từ "in", dấu ngoặc + +77 +00:03:22,980 --> 00:03:24,060 +mở "(" và dấu ngoặc + +78 +00:03:24,060 --> 00:03:25,470 +đóng ")" và nội dung + +79 +00:03:25,470 --> 00:03:29,430 +bên trong đó chỉ là văn bản chúng ta muốn in. + +80 +00:03:29,430 --> 00:03:32,760 +Chúng tôi không thể có thêm bất kỳ ký hiệu hoặc mã bổ sung nào. + +81 +00:03:32,760 --> 00:03:35,160 +Khi bạn quen với việc viết nhiều mã + +82 +00:03:35,160 --> 00:03:38,160 +hơn, bạn sẽ trở nên quen thuộc hơn với định + +83 +00:03:38,160 --> 00:03:40,140 +dạng và cách viết mã đó. + +84 +00:03:40,140 --> 00:03:42,900 +Vì vậy, đừng lo lắng nếu bạn mắc phải một số lỗi này, + +85 +00:03:42,900 --> 00:03:44,700 +đó chỉ là quá trình học hỏi. + +86 +00:03:44,700 --> 00:03:45,870 +Và miễn là bạn có thể quay + +87 +00:03:45,870 --> 00:03:49,290 +lại và sửa mã của mình và hiểu lý do tại sao nó hoạt động thì đó là + +88 +00:03:49,290 --> 00:03:51,213 +tất cả những gì tôi muốn thấy. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/011 The Python Input Function.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/011 The Python Input Function.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..179571e0f5af2ec0f595aa238e387cdca9eacd2a --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/011 The Python Input Function.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84a49acde8a4513b8fd98673d03ca2c4ac4db6757ada1d73ae72f5e6c03f2473 +size 27439692 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/011 The Python Input Function_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/011 The Python Input Function_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c4d5b8f64b43b1f4a6fa4aad7ff3f7ea53d22473 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/011 The Python Input Function_vi.srt @@ -0,0 +1,532 @@ +1 +00:00:00,270 --> 00:00:02,550 +Trở lại với Repl của chúng tôi. nó, repl + +2 +00:00:02,760 --> 00:00:07,230 +in Ngày 1 mà bạn nên có từ trước đó, tôi muốn + +3 +00:00:08,039 --> 00:00:10,410 +nói về một chức năng khác. + +4 +00:00:10,530 --> 00:00:15,530 +Vì vậy, chúng ta đã thấy hàm in và tất cả những thứ mà chúng ta có thể + +5 +00:00:15,870 --> 00:00:19,230 +làm với chuỗi và sử dụng hàm in và gỡ lỗi nó. + +6 +00:00:19,710 --> 00:00:24,090 +Nhưng nếu chúng ta muốn có thể nhập một số dữ liệu thì sao? + +7 +00:00:24,630 --> 00:00:26,220 +Vì vậy, nếu chúng tôi + +8 +00:00:26,220 --> 00:00:31,020 +muốn nói, hãy hỏi người dùng 'tên bạn là gì? 'Và chúng tôi chạy mã này, bạn có thể + +9 +00:00:31,410 --> 00:00:33,180 +thấy mã đó đang được in, nhưng + +10 +00:00:33,570 --> 00:00:38,570 +không có cách nào để người dùng bên này có thể cung cấp cho mã của chúng tôi một số + +11 +00:00:39,150 --> 00:00:42,270 +dữ liệu để làm việc. Để làm được điều + +12 +00:00:42,630 --> 00:00:44,970 +đó, thay vì sử dụng hàm in, chúng + +13 +00:00:45,270 --> 00:00:49,500 +ta sẽ sử dụng một hàm khác và nó được gọi là hàm nhập. + +14 +00:00:50,250 --> 00:00:52,470 +Và hãy chú ý cách tôi đang gõ, trí + +15 +00:00:52,710 --> 00:00:57,570 +thông minh mã đã đưa ra cho tôi một số gợi ý vì nó nghĩ rằng nó biết những gì + +16 +00:00:57,570 --> 00:00:59,670 +tôi có thể muốn và nó đúng. + +17 +00:01:00,180 --> 00:01:05,069 +Vì vậy, đây là những gì chức năng đầu vào trông như thế nào. Đây là tên của hàm. + +18 +00:01:05,459 --> 00:01:09,300 +Và một lần nữa, nó được theo sau bởi một số dấu ngoặc đơn. Bên trong dấu ngoặc đơn là + +19 +00:01:09,300 --> 00:01:12,270 +lời nhắc mà tôi sẽ cung cấp cho người dùng. + +20 +00:01:12,990 --> 00:01:16,590 +Vì vậy, khi tôi chạy mã này, nó sẽ nói, tên của bạn là gì? + +21 +00:01:17,100 --> 00:01:22,100 +Và sau đó con trỏ sẽ ở cuối dòng này vì nó đang mong + +22 +00:01:22,950 --> 00:01:27,300 +đợi một số loại đầu vào. Nếu tôi đặt tên cho nó, Angela + +23 +00:01:27,720 --> 00:01:32,720 +và tôi nhấn enter, thì phần dữ liệu này bây giờ đã được chuyển trở lại mã của tôi + +24 +00:01:33,600 --> 00:01:36,360 +và giờ nó sẽ thay thế phần này của mã. + +25 +00:01:36,780 --> 00:01:39,180 +Vì vậy, tôi đang chuyển dữ liệu từ đây, trở + +26 +00:01:39,540 --> 00:01:42,480 +lại đây để tôi có thể sử dụng nó trong mã của mình. + +27 +00:01:43,680 --> 00:01:46,890 +Bây giờ nhận thấy sự khác biệt ở đây. Nó trông khá giống nhau. + +28 +00:01:47,100 --> 00:01:50,940 +Khi chúng tôi chạy bản in, bạn có thể thấy nó cho biết tên bạn là gì? + +29 +00:01:51,390 --> 00:01:56,190 +và sau đó quá trình thực thi mã kết thúc và chúng ta biết nó kết thúc vì nó hiển thị cho chúng + +30 +00:01:56,220 --> 00:01:57,720 +ta mũi tên màu cam nhỏ này. + +31 +00:01:58,350 --> 00:02:01,290 +Nhưng hãy để ý khi tôi chạy đầu vào thay vào đó, + +32 +00:02:01,830 --> 00:02:03,570 +tôi không thấy mũi tên màu cam. + +33 +00:02:03,750 --> 00:02:08,750 +Chương trình của tôi thực sự bị tạm dừng ngay bây giờ để người dùng cung cấp + +34 +00:02:09,060 --> 00:02:13,200 +đầu vào và chỉ khi tôi nhập đầu vào và nhấn enter thì chương + +35 +00:02:13,680 --> 00:02:15,090 +trình mới kết thúc. + +36 +00:02:15,630 --> 00:02:19,890 +Hàm nhập trông khá giống với hàm in, nhưng thay + +37 +00:02:20,280 --> 00:02:21,990 +vì in từ, + +38 +00:02:22,080 --> 00:02:26,220 +nó chỉ có nhập từ. Và bên trong dấu ngoặc + +39 +00:02:26,460 --> 00:02:29,460 +đơn, thay vì thêm văn bản nào sẽ được + +40 +00:02:29,760 --> 00:02:34,620 +in, chúng tôi thêm lời nhắc để người dùng cung cấp cho họ gợi ý + +41 +00:02:34,620 --> 00:02:38,970 +về loại dữ liệu chúng tôi muốn. Và sau đó khi bạn chạy đoạn mã này, nó sẽ + +42 +00:02:39,240 --> 00:02:43,860 +in ra lời nhắc, nhưng sau đó sẽ có một con trỏ. Ở một số nơi, bạn sẽ thấy nó giống như + +43 +00:02:43,860 --> 00:02:45,390 +một con trỏ nhấp nháy, những + +44 +00:02:45,420 --> 00:02:50,420 +nơi khác, nó sẽ chỉ là một con trỏ rắn sẵn sàng để người dùng nhập vào một số phần dữ liệu. + +45 +00:02:51,630 --> 00:02:54,960 +Vậy chúng ta có thể làm gì với dữ liệu này? Chà, chúng ta có thể + +46 +00:02:54,960 --> 00:02:57,450 +sử dụng nó bên trong mã của chúng ta. + +47 +00:02:58,140 --> 00:03:03,140 +Hãy nhớ cách tôi đã nói khi dòng mã này thực thi và tôi đã nhập Angela làm + +48 +00:03:03,700 --> 00:03:05,200 +phản hồi cho đầu vào + +49 +00:03:05,650 --> 00:03:10,420 +này, sau đó phần mã này được thay thế bằng bất cứ thứ gì mà người + +50 +00:03:10,420 --> 00:03:13,000 +dùng đã nhập vào. Vì vậy, trong trường hợp này nó trở thành Angela. + +51 +00:03:13,840 --> 00:03:18,840 +Và những gì tôi có thể làm với nó là giả sử tôi muốn in một cái + +52 +00:03:19,450 --> 00:03:23,470 +gì đó như, xin chào Angela. Vâng, sau đó tôi có thể + +53 +00:03:23,470 --> 00:03:28,470 +chỉ cần viết Hello + input và sau đó tôi sẽ đóng nó bằng một + +54 +00:03:32,440 --> 00:03:34,120 +bộ dấu ngoặc khác. + +55 +00:03:34,990 --> 00:03:37,990 +Vì vậy, tôi sẽ thay đổi bố cục của mình thay vì cạnh nhau, tôi + +56 +00:03:38,020 --> 00:03:39,880 +sẽ thay đổi nó thành xếp chồng lên nhau. + +57 +00:03:40,360 --> 00:03:43,870 +Và điều này có nghĩa là tôi có mã của mình ở trên cùng và bảng điều khiển của tôi ở dưới cùng. + +58 +00:03:44,230 --> 00:03:47,530 +Bằng cách này, dòng của tôi có thể dài hơn một chút mà không cần đọc rap. + +59 +00:03:48,190 --> 00:03:49,750 +Chú ý những gì đang xảy ra ở đây. + +60 +00:03:50,800 --> 00:03:55,800 +Đây là hàm nhập mà tôi đã chỉ cho bạn trước đó và đây là một câu + +61 +00:03:56,020 --> 00:03:56,853 +lệnh in. + +62 +00:03:56,890 --> 00:04:01,890 +Vì vậy, chúng tôi đã có cái này lồng vào bên trong cái kia. Và bây giờ khi tôi chạy mã của mình, + +63 +00:04:03,940 --> 00:04:07,240 +điều gì sẽ xảy ra khi nó hỏi tôi tên bạn là gì? + +64 +00:04:07,420 --> 00:04:10,660 +Vì vậy, tôi sẽ viết tên của mình và sau đó khi tôi + +65 +00:04:11,230 --> 00:04:16,230 +nhấn enter, phần này được thay thế bằng Angela và nó được ghép với từ hello và toàn bộ + +66 +00:04:18,790 --> 00:04:21,130 +nội dung sẽ được in ra ở đây. + +67 +00:04:21,880 --> 00:04:25,990 +Nếu bạn thấy dòng mã này khó hiểu và khiến bạn băn khoăn, thì tôi khuyên + +68 +00:04:25,990 --> 00:04:26,823 +bạn nên + +69 +00:04:26,890 --> 00:04:31,890 +truy cập vào một trang web có tên là thonny. org và tải xuống một ứng + +70 +00:04:31,990 --> 00:04:35,980 +dụng có tên Thonny. Nó hoàn toàn miễn phí và + +71 +00:04:35,980 --> 00:04:40,180 +có sẵn cho Windows, Mac và Linux. Và khi bạn đã cài đặt ứng dụng + +72 +00:04:40,540 --> 00:04:45,540 +này, bạn có thể tiếp tục và dán dòng mã của mình vào đây và nhấp vào biểu + +73 +00:04:46,570 --> 00:04:49,750 +tượng gỡ lỗi nhỏ này. Và sau đó chúng ta + +74 +00:04:49,840 --> 00:04:54,760 +có thể nhấp vào nút này, được gọi là nút bước vào để bước vào quá trình thực + +75 +00:04:54,760 --> 00:04:55,420 +thi dòng + +76 +00:04:55,420 --> 00:05:00,420 +mã này để xem máy tính đang đánh giá đoạn mã này ở đây từng bước như thế nào. + +77 +00:05:01,090 --> 00:05:04,870 +Vì vậy, bạn sẽ thấy điều đầu tiên nó cố gắng làm là nó sẽ + +78 +00:05:04,870 --> 00:05:08,800 +cố gắng chạy câu lệnh in này. Nó nhìn vào bên trong, những dấu ngoặc đơn này để xem nó cần in những gì. + +79 +00:05:09,370 --> 00:05:11,680 +Vì vậy, điều đầu tiên là đây, Xin + +80 +00:05:12,100 --> 00:05:17,020 +chào, và nó biến nó thành một chuỗi và sau đó nó sẽ xem xét điều tiếp theo sau dấu + +81 +00:05:17,020 --> 00:05:19,510 +cộng để xem nó sẽ biến nó thành cái gì. + +82 +00:05:19,930 --> 00:05:24,160 +Và đây tất nhiên là chức năng nhập liệu. Vì vậy, khi tôi tiếp tục bước vào nó, + +83 +00:05:24,520 --> 00:05:26,410 +nó thực sự sẽ thực hiện nó. + +84 +00:05:26,740 --> 00:05:31,360 +Vì vậy, nó sẽ chạy chức năng nhập này và hiển thị lời nhắc, tên của bạn là gì? + +85 +00:05:32,050 --> 00:05:33,760 +Vì vậy, đó là những gì hiển thị ở đây. + +86 +00:05:34,300 --> 00:05:37,600 +Và bây giờ nếu tôi nhập một giá trị vào đây và nhấn + +87 +00:05:38,020 --> 00:05:43,020 +enter, thì giá trị mà tôi đặt ngay tại đó sẽ thay thế hàm nhập trước đó và bây + +88 +00:05:44,800 --> 00:05:47,200 +giờ được giữ bên trong câu lệnh in. + +89 +00:05:47,740 --> 00:05:52,740 +Vì vậy, nếu tôi tiếp tục xem qua đoạn mã này thì bạn sẽ thấy nó nối tất + +90 +00:05:53,320 --> 00:05:57,590 +cả các phần lại với nhau, và cuối cùng nó chỉ kết thúc bằng một + +91 +00:05:57,680 --> 00:06:01,760 +bản in đơn giản Xin chào Angela! Và nếu tôi tiếp tục bước vào + +92 +00:06:01,820 --> 00:06:06,620 +nó, bạn sẽ thấy dòng mã đó được thực thi cho đến khi không còn hướng dẫn nào nữa. + +93 +00:06:07,160 --> 00:06:10,040 +Vì vậy, nếu bạn muốn xem mã của mình, ừm, hãy chạy + +94 +00:06:10,070 --> 00:06:13,490 +như thế này từng bước để bạn có thể thấy những gì đang xảy ra, + +95 +00:06:13,760 --> 00:06:15,500 +thì tôi khuyên bạn nên thử. + +96 +00:06:16,580 --> 00:06:21,110 +Nhưng vì cách chia sẻ những Repl này rất dễ dàng. nó dựa trên mã cơ sở để chúng + +97 +00:06:21,110 --> 00:06:24,950 +ta làm việc ở cùng một nơi, tôi khuyên bạn nên thực hiện hầu hết mã + +98 +00:06:25,130 --> 00:06:30,130 +của bạn ở đây và chỉ khi bạn gặp khó khăn khi lấy một dòng mã và dán nó vào Thonny + +99 +00:06:30,740 --> 00:06:35,630 +để xem nó được thực thi như thế nào- bươc. Khi bạn đang học viết mã, sẽ có + +100 +00:06:35,690 --> 00:06:37,880 +những khái niệm mới được đề cập. + +101 +00:06:38,090 --> 00:06:41,300 +Sẽ có những thứ mà bạn cần phải suy nghĩ một chút trước khi có + +102 +00:06:41,300 --> 00:06:42,230 +thể hiểu được nó. + +103 +00:06:42,740 --> 00:06:47,740 +Vì vậy, điều mà rất nhiều lập trình viên thích làm là họ thích bình luận trong mã của họ. + +104 +00:06:48,200 --> 00:06:52,210 +Bây giờ, bạn có thể đã thấy điều này trong suốt các bài tập viết mã và các giải pháp + +105 +00:06:52,230 --> 00:06:54,740 +mà tôi đã cung cấp. Nhưng trong Python, nếu + +106 +00:06:55,280 --> 00:07:00,280 +bạn muốn một dòng văn bản hoàn toàn không được máy tính xem xét, tất cả những gì + +107 +00:07:01,010 --> 00:07:06,010 +bạn phải làm là thêm thẻ bắt đầu bằng # hoặc dấu thăng vào trước văn bản của + +108 +00:07:08,030 --> 00:07:10,370 +bạn và điều này biến nó thành một + +109 +00:07:10,580 --> 00:07:13,730 +nhận xét, vì vậy máy tính sẽ hoàn toàn bỏ qua. + +110 +00:07:14,180 --> 00:07:17,840 +Vì vậy, ở đây bạn có thể viết mã tùy thích, ừm, nhưng nó sẽ + +111 +00:07:17,870 --> 00:07:20,840 +không được thực thi và khi bạn nhấp vào chạy, bạn sẽ thấy + +112 +00:07:21,050 --> 00:07:23,270 +rằng điều này hoàn toàn bị bỏ qua. + +113 +00:07:23,960 --> 00:07:28,430 +Điều tôi khuyên bạn là bất cứ khi nào bạn bắt gặp một khái niệm mới trong khóa + +114 +00:07:28,430 --> 00:07:33,430 +học, hãy bình luận ở trên nó để bạn có thể tự giải thích điều gì đang thực sự diễn + +115 +00:07:34,370 --> 00:07:37,610 +ra trong dòng mã bên dưới. Bằng cách này vào lần tiếp theo khi + +116 +00:07:37,640 --> 00:07:41,630 +bạn bắt gặp dòng mã này và bạn không chắc chắn điều gì đang thực sự xảy ra ở + +117 +00:07:41,630 --> 00:07:42,710 +đây, bạn có thể + +118 +00:07:43,040 --> 00:07:46,730 +xem các ghi chú mà bạn đã viết cho chính mình bằng từ ngữ của chính mình + +119 +00:07:46,730 --> 00:07:51,050 +và hy vọng nó sẽ ... tăng cường trí nhớ của bạn và giúp bạn hiểu những gì đang diễn + +120 +00:07:51,050 --> 00:07:52,280 +ra dễ dàng hơn nhiều. + +121 +00:07:53,720 --> 00:07:58,010 +Ngoài việc thêm ký hiệu bảng Anh theo cách thủ công, bạn cũng có thể đánh + +122 +00:07:58,160 --> 00:08:03,080 +dấu một dòng mã hoặc chỉ cần đặt con trỏ của bạn trên một dòng mã và giữ lệnh + +123 +00:08:03,080 --> 00:08:08,080 +và dấu gạch chéo lên nếu bạn đang sử dụng Mac hoặc điều khiển và dấu gạch chéo lên nếu + +124 +00:08:09,290 --> 00:08:11,270 +bạn đang sử dụng Các cửa sổ. + +125 +00:08:11,630 --> 00:08:14,240 +Và nếu bạn muốn quay lại hoặc hoàn tác các thay đổi của mình, + +126 +00:08:14,540 --> 00:08:19,160 +bạn chỉ cần đặt lệnh + z hoặc control + z. Được rồi, vì vậy trong bài học + +127 +00:08:19,310 --> 00:08:22,490 +này, chúng ta đã học về hàm nhập, chúng ta đã học + +128 +00:08:22,760 --> 00:08:27,680 +về cách đặt các hàm bên trong các hàm khác và có thể nhận được thông tin đầu + +129 +00:08:27,980 --> 00:08:31,790 +vào của người dùng từ bảng điều khiển bằng cách sử dụng hàm nhập. + +130 +00:08:32,330 --> 00:08:36,020 +Vì vậy, bây giờ tôi có một bài tập viết mã cho bạn trong + +131 +00:08:36,559 --> 00:08:41,210 +bài học tiếp theo, và nếu bạn đã nhận xét kỹ dòng mã này và bạn hoàn toàn hiểu + +132 +00:08:41,419 --> 00:08:45,470 +cách hoạt động của nó, thì bạn sẽ có thể xem qua bài tập tiếp theo. + +133 +00:08:46,010 --> 00:08:48,650 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 Exercise-3.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 Exercise-3.url new file mode 100644 index 0000000000000000000000000000000000000000..b502ced35fc0250cbdbdbb9629609dba576ab772 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 Exercise-3.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d83e1847-3ad1-4f67-9f9f-7cbfb9dd970f \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 How-to-join-Auditorium.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 [Interactive Coding Exercise] Input Function.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 [Interactive Coding Exercise] Input Function.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1b6a2b7de7f320f8d5f5f947ed121abdc4d4c305 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 [Interactive Coding Exercise] Input Function.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4bdabe2120f6c649afef793668ae8110c8a224aca1ca4435b2cf79c0d8f8115 +size 7844088 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 [Interactive Coding Exercise] Input Function_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 [Interactive Coding Exercise] Input Function_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..717347bbd62e7b03f8528b7e54c8463580152a1e --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/012 [Interactive Coding Exercise] Input Function_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:01,560 --> 00:00:02,550 +Trong bài + +2 +00:00:02,550 --> 00:00:06,810 +tập này, mục tiêu là viết một hàm tính + +3 +00:00:06,810 --> 00:00:10,980 +toán và in ra số ký tự trong một tên. + +4 +00:00:10,980 --> 00:00:13,110 +Vì vậy, bạn sẽ cung cấp thông tin đầu + +5 +00:00:13,110 --> 00:00:15,750 +vào, như bạn sẽ thấy, đã có một thông tin đầu vào + +6 +00:00:15,750 --> 00:00:19,590 +mẫu về tên của tôi trong khu vực nhập liệu ở phía dưới bên trái. + +7 +00:00:19,590 --> 00:00:22,800 +Và điều bạn sắp làm là tạo + +8 +00:00:22,800 --> 00:00:24,990 +một hàm để in ra số + +9 +00:00:24,990 --> 00:00:28,140 +chữ cái trong tên. + +10 +00:00:28,140 --> 00:00:30,570 +Bây giờ, bạn có thể phải tra cứu trên + +11 +00:00:30,570 --> 00:00:31,710 +Google một chút + +12 +00:00:31,710 --> 00:00:36,060 +để tìm ra cách tìm ra số lượng chữ cái trong một chuỗi? + +13 +00:00:36,060 --> 00:00:39,210 +Nếu muốn, bạn có thể xem trong ngăn mô tả và tôi + +14 +00:00:39,210 --> 00:00:42,180 +đã liên kết với truy vấn tìm kiếm trên Google + +15 +00:00:42,180 --> 00:00:45,480 +để giúp bạn hiểu rõ hơn những gì bạn cần sử dụng + +16 +00:00:45,480 --> 00:00:47,850 +để hoàn thành bài tập này. + +17 +00:00:47,850 --> 00:00:49,230 +Giờ đây, việc tìm kiếm trên Google + +18 +00:00:49,230 --> 00:00:52,020 +và tìm kiếm đều là một phần thú vị của việc trở thành một lập + +19 +00:00:52,020 --> 00:00:54,750 +trình viên, vì vậy bạn nên bắt đầu việc này sớm. + +20 +00:00:54,750 --> 00:00:56,850 +Bây giờ tôi sẽ để bạn tiếp tục bài tập. + +21 +00:01:00,690 --> 00:01:02,700 +Bây giờ, chúng ta sẽ chia + +22 +00:01:02,700 --> 00:01:05,519 +giải pháp thành ba phần riêng biệt + +23 +00:01:05,519 --> 00:01:08,340 +và phần đầu tiên là hàm input(). + +24 +00:01:08,340 --> 00:01:12,030 +Hàm input() có thể mang lại giá trị trong + +25 +00:01:12,030 --> 00:01:14,010 +khung Đầu vào. + +26 +00:01:14,010 --> 00:01:16,623 +Vì vậy, đó là phần đầu tiên chúng ta cần nắm bắt. + +27 +00:01:17,760 --> 00:01:20,460 +Việc tiếp theo chúng ta cần làm + +28 +00:01:20,460 --> 00:01:24,660 +là tính độ dài của chuỗi có trong Đầu vào. + +29 +00:01:24,660 --> 00:01:27,600 +Vì vậy, bây giờ hàm input() đó + +30 +00:01:27,600 --> 00:01:32,600 +trở thành đầu vào cho một hàm khác, hàm len(). + +31 +00:01:33,510 --> 00:01:36,570 +Hàm len() trong Python có thể cho bạn + +32 +00:01:36,570 --> 00:01:40,410 +biết có bao nhiêu ký tự trong một chuỗi cụ thể. + +33 +00:01:40,410 --> 00:01:42,270 +Trong trường hợp này, nếu + +34 +00:01:42,270 --> 00:01:44,700 +chúng ta lấy dữ liệu đầu vào trong + +35 +00:01:44,700 --> 00:01:47,370 +ngăn Đầu vào, Bertrand và đặt nó vào + +36 +00:01:47,370 --> 00:01:52,370 +hàm len(), bạn có thể kiểm tra dữ liệu này dưới dạng một chuỗi hoặc + +37 +00:01:53,250 --> 00:01:56,910 +dưới dạng hàm đầu vào, khi đó nó sẽ xuất ra tổng số + +38 +00:01:56,910 --> 00:01:58,773 +ký tự. số 8. + +39 +00:01:59,700 --> 00:02:00,960 +Bây giờ phần cuối + +40 +00:02:00,960 --> 00:02:05,160 +cùng là đưa tất cả những thứ đó vào câu lệnh in. + +41 +00:02:05,160 --> 00:02:07,500 +Vì vậy hãy nhớ rằng, đầu vào sẽ + +42 +00:02:07,500 --> 00:02:09,990 +nằm ở phần giữa dấu ngoặc đơn. + +43 +00:02:09,990 --> 00:02:12,990 +Vì vậy, bây giờ chúng ta có một chương trình + +44 +00:02:12,990 --> 00:02:15,480 +hoàn chỉnh, trong đó trước tiên chúng + +45 +00:02:15,480 --> 00:02:17,940 +ta lấy dữ liệu đầu vào, đặt nó vào hàm + +46 +00:02:17,940 --> 00:02:21,390 +len(), tính toán độ dài của chuỗi trong Đầu vào, + +47 +00:02:21,390 --> 00:02:23,970 +sau đó chúng ta đưa dữ liệu đó vào câu lệnh + +48 +00:02:23,970 --> 00:02:27,030 +in và in ra thành khu vực đầu ra. + +49 +00:02:27,030 --> 00:02:32,030 +Vì vậy, mỗi chức năng này có một vai trò riêng biệt và bằng cách đặt chúng + +50 +00:02:32,220 --> 00:02:35,700 +vào nhau, cái này vào cái kia, chúng ta sẽ có được + +51 +00:02:35,700 --> 00:02:37,593 +kết quả như mong muốn. + +52 +00:02:38,460 --> 00:02:39,600 +Bây giờ, nếu bạn gặp khó + +53 +00:02:39,600 --> 00:02:42,510 +khăn hoặc có bất kỳ sự khác biệt nào trong mã của mình, + +54 +00:02:42,510 --> 00:02:44,550 +vui lòng quay lại trang trình bày trước + +55 +00:02:44,550 --> 00:02:46,320 +đó và cập nhật ngay bây giờ. + +56 +00:02:46,320 --> 00:02:48,660 +Miễn là bạn hiểu chính xác những gì đang + +57 +00:02:48,660 --> 00:02:50,550 +diễn ra ở đây vì có một số bước liên + +58 +00:02:50,550 --> 00:02:53,670 +quan thì tôi rất vui vì bạn đã nắm vững nghệ thuật + +59 +00:02:53,670 --> 00:02:55,473 +của hàm input(). + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Python Variables.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Python Variables.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c670ffa46b10358b59be080b334837c3b7765bc7 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Python Variables.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a070120424b51aaa19912dc95e7ecee5d5283bfb82833a3b70a0945110266698 +size 18938365 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Python Variables_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Python Variables_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4286bd308d41e154b30e571ee2f20b0546eabef9 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Python Variables_vi.srt @@ -0,0 +1,372 @@ +1 +00:00:00,400 --> 00:00:05,320 +Bây giờ trong bài học này, tôi muốn nói với bạn về các biến Python và đó là một khái + +2 +00:00:05,320 --> 00:00:09,220 +niệm thực sự, thực sự hữu ích. Nhưng trước khi chúng ta bắt + +3 +00:00:09,370 --> 00:00:14,370 +đầu, trước tiên tôi muốn bạn xem qua các tài nguyên của khóa học và nắm + +4 +00:00:15,820 --> 00:00:20,820 +bắt các biến Ngày 1 bắt đầu Repl. đó là hộp cát hoặc bạn có thể chỉ cần nhập URL + +5 +00:00:22,330 --> 00:00:23,163 +vào trình duyệt. + +6 +00:00:23,380 --> 00:00:28,380 +Tôi muốn bạn trước tiên hãy tiếp tục và phân tách mã bắt đầu này để bạn có thể làm việc + +7 +00:00:28,750 --> 00:00:31,990 +trên phiên bản của riêng mình. Bây giờ khi bạn + +8 +00:00:32,140 --> 00:00:37,140 +đã hoàn thành điều đó, thì điều đầu tiên tôi muốn làm là xem qua dòng + +9 +00:00:37,930 --> 00:00:41,830 +mã này mà bạn nên có. Và khi chúng ta chạy nó, chúng ta + +10 +00:00:41,860 --> 00:00:44,260 +sẽ khá quen thuộc với những gì sẽ xảy ra, phải không? + +11 +00:00:44,260 --> 00:00:48,700 +Nó sẽ hỏi chúng tôi tên của chúng tôi và khi chúng tôi nhấn enter, không có gì xảy ra. + +12 +00:00:49,060 --> 00:00:50,770 +Nhưng đằng sau hậu + +13 +00:00:51,160 --> 00:00:56,160 +trường, tên này hoặc đầu vào này hiện đã được chức năng này nhận. + +14 +00:00:57,550 --> 00:01:02,020 +Nhưng một khi điều đó được thực hiện, nó sẽ biến mất, phải không? + +15 +00:01:02,680 --> 00:01:07,680 +Và không có cách nào để chúng tôi có thể tham khảo nó trong tương lai. Hay là có? + +16 +00:01:10,980 --> 00:01:13,920 +Chà, đây là lúc mà các biến trở nên thực sự hữu ích. + +17 +00:01:14,520 --> 00:01:18,150 +Nếu tôi đặt tên cho kết quả của hành động này, thì tôi + +18 +00:01:18,390 --> 00:01:20,940 +sẽ có thể tham khảo nó sau này. + +19 +00:01:21,540 --> 00:01:23,850 +Vì vậy, ở đầu dòng, tôi + +20 +00:01:23,940 --> 00:01:27,630 +sẽ gọi nó là tên và sau đó tôi sẽ thêm một + +21 +00:01:28,170 --> 00:01:33,170 +dấu bằng và điều này làm là nó gán bất cứ thứ gì mà người dùng + +22 +00:01:33,600 --> 00:01:38,600 +đã nhập làm đầu vào cho lời nhắc này cho một biến được gọi là tên. + +23 +00:01:40,350 --> 00:01:45,350 +Vì vậy, bây giờ nếu tôi tiếp tục và chạy lại mã của mình và tôi nhập tên, bây + +24 +00:01:47,970 --> 00:01:49,980 +giờ khi tôi nhấn enter, thông thường + +25 +00:01:50,040 --> 00:01:53,910 +không có cách nào để tôi nắm bắt được điều này nữa, phải không? + +26 +00:01:54,480 --> 00:01:58,800 +Nhưng bây giờ tôi thực sự có thể tiếp tục và viết bản in. + +27 +00:01:59,220 --> 00:02:02,580 +Tôi sẽ in giá trị của tên biến này. + +28 +00:02:03,300 --> 00:02:07,170 +Vì vậy, bây giờ nếu tôi chạy mã của mình và tôi viết tên, + +29 +00:02:07,560 --> 00:02:08,393 +nhấn enter, + +30 +00:02:08,759 --> 00:02:13,760 +bạn sẽ thấy rằng điều này được in và tôi có thể sử dụng điều này bất kỳ lúc + +31 +00:02:14,760 --> 00:02:19,760 +nào trong mã của mình chỉ bằng cách đề cập đến tên được gắn với giá trị này. + +32 +00:02:21,510 --> 00:02:26,510 +Vì vậy, gần giống như chúng tôi đã lưu dữ liệu từ hành động này thành một cái tên. + +33 +00:02:29,760 --> 00:02:33,660 +Và nếu bạn nghĩ về điều đó, nếu bạn có một danh bạ điện + +34 +00:02:33,660 --> 00:02:37,080 +thoại, và bạn chỉ ghi lại số người, lần sau khi bạn + +35 +00:02:37,560 --> 00:02:39,120 +nhìn vào số này, sẽ + +36 +00:02:39,150 --> 00:02:43,110 +không có cách nào để bạn biết đó là số của ai, phải không? + +37 +00:02:43,740 --> 00:02:46,560 +Theo một nghĩa nào đó, đó là điều tương tự với máy tính. + +38 +00:02:47,100 --> 00:02:50,160 +Mặc dù chúng tôi đã nhập phần dữ liệu này, nhưng không + +39 +00:02:50,310 --> 00:02:55,310 +có cách nào để chúng tôi có thể tham chiếu đến dữ liệu này trừ khi chúng tôi đặt tên cho nó. + +40 +00:02:56,760 --> 00:03:01,760 +Vì vậy, trong danh bạ điện thoại của chúng tôi, chúng tôi có thể nói rằng số cụ + +41 +00:03:02,410 --> 00:03:07,410 +thể này được liên kết với tên James. Và trong lập trình, chúng tôi gọi tên James này là một biến. + +42 +00:03:09,400 --> 00:03:14,400 +Vì vậy, chúng tôi có thể viết một cái gì đó như James bằng và sau đó là số điện thoại của anh ấy. + +43 +00:03:15,400 --> 00:03:19,360 +Và điều này có nghĩa là trong tương lai, nếu chúng ta cần phần dữ + +44 +00:03:19,570 --> 00:03:22,480 +liệu này, chúng ta có thể gọi nó bằng tên của + +45 +00:03:23,020 --> 00:03:25,900 +nó, tên biến của James. Bây giờ, như + +46 +00:03:25,960 --> 00:03:28,750 +biến tên gợi ý, nó là + +47 +00:03:29,470 --> 00:03:33,670 +thứ có thể thay đổi hoặc có thể thay đổi. + +48 +00:03:34,270 --> 00:03:35,530 +Vì vậy, ví dụ, + +49 +00:03:35,650 --> 00:03:40,480 +chỉ vì tên này được đặt thành một cái gì đó ở đây không có nghĩa là tôi không + +50 +00:03:40,480 --> 00:03:43,840 +thể thay đổi nó sau này. Vì vậy, để làm cho mọi + +51 +00:03:43,840 --> 00:03:48,610 +thứ đơn giản, hãy tiếp tục và xóa hàm đầu vào và chỉ cần nói tên + +52 +00:03:48,610 --> 00:03:50,110 +bằng Jack. Tên in. + +53 +00:03:50,320 --> 00:03:55,320 +Khi tôi chạy Jack đó là thứ được in bên trong bảng điều khiển vì bây giờ + +54 +00:03:55,720 --> 00:03:59,290 +tôi đang đề cập đến phần dữ liệu đó bằng tên biến. + +55 +00:04:00,100 --> 00:04:05,100 +Nhưng nếu sau này, tôi quyết định cung cấp cho biến này một phần dữ liệu khác + +56 +00:04:06,010 --> 00:04:06,843 +để lưu + +57 +00:04:07,000 --> 00:04:12,000 +giữ, giả sử Angela và tôi in tên vào thời điểm này sau khi tôi thay + +58 +00:04:15,760 --> 00:04:18,850 +đổi nó, bạn nghĩ hai dòng này sẽ in gì? + +59 +00:04:19,450 --> 00:04:21,190 +Bạn nghĩ cái gì sẽ được in đầu tiên? + +60 +00:04:21,250 --> 00:04:25,990 +Bạn nghĩ gì sẽ được in thứ hai? Hãy nhấn command + enter hoặc control + + +61 +00:04:25,990 --> 00:04:27,790 +enter và tự mình xem. + +62 +00:04:28,390 --> 00:04:33,390 +Vì vậy, mặc dù cả hai đều in cùng một biến, tại thời điểm này khi chúng ta gọi lần + +63 +00:04:34,810 --> 00:04:38,080 +đầu tiên là print, nó vẫn giữ giá trị của Jack ,. + +64 +00:04:38,500 --> 00:04:43,500 +Nhưng đến dòng 5, bây giờ tôi đã thay đổi nó để nó giữ nguyên giá trị + +65 +00:04:43,780 --> 00:04:44,613 +của Angela. + +66 +00:04:45,550 --> 00:04:50,550 +Điều này làm cho nó dễ dàng hơn rất nhiều khi chúng tôi muốn viết mã như những gì chúng tôi đã làm trước đây. + +67 +00:04:51,250 --> 00:04:51,880 +Ví dụ: + +68 +00:04:51,880 --> 00:04:55,750 +đây là dòng mã mà chúng tôi đã có trước đó và chúng tôi biết rằng + +69 +00:04:55,750 --> 00:05:00,750 +chúng tôi sẽ lấy một phần dữ liệu từ hàm đầu vào này và sau đó chúng tôi sẽ tính toán một + +70 +00:05:02,050 --> 00:05:04,510 +phần dữ liệu mới bằng cách sử dụng hàm Len + +71 +00:05:04,990 --> 00:05:07,540 +và cuối cùng chúng tôi sẽ để in mọi thứ ra. + +72 +00:05:08,320 --> 00:05:12,670 +Thay vì có một dòng mã dài như vậy, có thể khá khó + +73 +00:05:13,120 --> 00:05:18,100 +hiểu, nếu muốn, chúng ta có thể sử dụng các biến để lưu trữ từng bước này. + +74 +00:05:18,550 --> 00:05:19,390 +Vì vậy, ví + +75 +00:05:19,390 --> 00:05:24,390 +dụ, chúng ta có thể nói rằng tên bằng bất cứ thứ gì người + +76 +00:05:25,120 --> 00:05:25,953 +dùng + +77 +00:05:26,530 --> 00:05:30,310 +chèn làm đầu vào và sau đó khi chúng ta + +78 +00:05:30,730 --> 00:05:35,680 +muốn tính độ dài, chúng ta có thể đặt biến đó bằng hàm Len. + +79 +00:05:36,070 --> 00:05:41,070 +Và sau đó bên trong dấu ngoặc đơn, chúng ta sẽ chuyển vào tên, giá trị, được lưu trữ + +80 +00:05:41,800 --> 00:05:45,580 +trong biến tên ngay tại đây. Và cuối cùng, tất + +81 +00:05:45,820 --> 00:05:50,710 +cả những gì chúng ta cần làm là in chiều dài, + +82 +00:05:53,620 --> 00:05:56,470 +như vậy. Vì vậy, trong trường hợp + +83 +00:05:56,840 --> 00:06:01,840 +này, dữ liệu này được lưu trữ dưới tên này và sau đó dữ liệu đó là những gì sẽ + +84 +00:06:02,360 --> 00:06:04,940 +được sử dụng để thực hiện chức năng này và + +85 +00:06:05,510 --> 00:06:08,780 +sau đó kết quả sẽ được lưu trữ trong một biến khác và + +86 +00:06:09,110 --> 00:06:11,360 +cuối cùng biến đó sẽ được in ra. + +87 +00:06:11,870 --> 00:06:16,870 +Vì vậy, hãy tiếp tục và chạy mã này và nhập tên của tôi. + +88 +00:06:17,090 --> 00:06:21,950 +Vì vậy, Angela và nhấn enter và nó thực hiện chính xác những điều tương tự, nhưng bây giờ chúng ta có tất + +89 +00:06:22,460 --> 00:06:27,460 +cả các phần dữ liệu này đều được liên kết với một tên mà chúng ta có thể tham khảo tại bất kỳ + +90 +00:06:29,450 --> 00:06:34,160 +thời điểm nào sau này trong mã của chúng ta. Bây giờ, bạn đoán nó đã + +91 +00:06:34,190 --> 00:06:36,560 +đến lúc, cho một thử thách mã. + +92 +00:06:36,860 --> 00:06:39,500 +Và tôi sẽ giúp bạn áp dụng những gì bạn đã học được. + +93 +00:06:39,800 --> 00:06:42,860 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Variables-Ending-Repl.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Variables-Ending-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..b8798d15ad4f5221bc6ed5e9f8e825b49e81086f --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Variables-Ending-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-1-variables-end \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Variables-Starting-Repl.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Variables-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..3c8cfc7da3827292784a6eb1c48f4f8b61ac6597 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/013 Variables-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-1-variables-start \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 Exercise-4.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 Exercise-4.url new file mode 100644 index 0000000000000000000000000000000000000000..5e8ee4752f89f0d7d57acd660f73537bfeda436d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 Exercise-4.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/8a8d2e46-c56a-435b-98f3-bcd71216dd26 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 How-to-join-Auditorium.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 [Interactive Coding Exercise] Variables.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 [Interactive Coding Exercise] Variables.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..62cae726debb67b14cb1e9c6f1117fa3ae61ed4f --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 [Interactive Coding Exercise] Variables.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:442e18d4e484f0f94f55006ce7ab89e2ad56120f19a7ee178745316daee3a0c0 +size 11060139 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 [Interactive Coding Exercise] Variables_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 [Interactive Coding Exercise] Variables_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b86b6881e969fd6772ff90830cf8d105e76b005e --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/014 [Interactive Coding Exercise] Variables_vi.srt @@ -0,0 +1,188 @@ +1 +00:00:01,560 --> 00:00:02,550 +Trong bài tập + +2 +00:00:02,550 --> 00:00:06,300 +này, mục tiêu là sử dụng những gì bạn đã học về + +3 +00:00:06,300 --> 00:00:11,300 +biến để tìm ra cách chuyển đổi giá trị trong hai biến. + +4 +00:00:12,540 --> 00:00:16,020 +Ý tưởng ở đây là chúng ta có hai giá trị + +5 +00:00:16,020 --> 00:00:20,880 +được đưa vào khung Nhập liệu ở dòng một và dòng hai. + +6 +00:00:20,880 --> 00:00:24,480 +Vì vậy, số đầu tiên, trong trường hợp này + +7 +00:00:24,480 --> 00:00:29,480 +là 29, sẽ được thay thế vào biến "a" ở dòng thứ hai. + +8 +00:00:30,720 --> 00:00:34,290 +Số thứ hai, 41, sẽ được đặt bằng + +9 +00:00:34,290 --> 00:00:37,053 +biến "b" ở dòng ba. + +10 +00:00:37,890 --> 00:00:42,810 +Mục tiêu của bạn là viết một số mã giữa các dòng bảy + +11 +00:00:42,810 --> 00:00:45,690 +và 10 để có thể chuyển đổi các + +12 +00:00:45,690 --> 00:00:49,283 +giá trị đó sao cho khi câu lệnh in chạy + +13 +00:00:49,283 --> 00:00:54,283 +trên các dòng 12 và 13, nó sẽ in ra a bằng giá trị 41, + +14 +00:00:54,750 --> 00:00:57,270 +giá trị này thường được lưu + +15 +00:00:57,270 --> 00:01:02,070 +trữ trong b và dòng 15 sẽ in b, sau đó là dấu hai chấm, + +16 +00:01:02,070 --> 00:01:04,440 +sau đó là giá trị 29, giá + +17 +00:01:04,440 --> 00:01:08,880 +trị này từng được lưu trong biến b. + +18 +00:01:08,880 --> 00:01:11,850 +Nó chỉ là một switcheroo và bạn sẽ phải suy nghĩ về cách + +19 +00:01:11,850 --> 00:01:15,720 +thực hiện việc này bằng cách sử dụng những gì bạn biết về biến. + +20 +00:01:15,720 --> 00:01:18,813 +Có nhiều cách để giải quyết vấn đề này nhưng hãy thử ngay bây giờ. + +21 +00:01:24,600 --> 00:01:28,740 +Được rồi, giải pháp chỉ cần ba dòng mã và + +22 +00:01:28,740 --> 00:01:31,653 +tôi sẽ duyệt từng dòng một. + +23 +00:01:32,550 --> 00:01:36,150 +Bước đầu tiên là tạo biến thứ ba và đây là + +24 +00:01:36,150 --> 00:01:39,510 +chìa khóa để giải bài tập này vì chúng + +25 +00:01:39,510 --> 00:01:43,170 +ta cần một số kho lưu trữ tạm thời. + +26 +00:01:43,170 --> 00:01:46,920 +Nếu chúng ta đặt "c" bằng giá trị của a thì ngay + +27 +00:01:46,920 --> 00:01:49,680 +bây giờ bằng cách sử dụng dữ liệu + +28 +00:01:49,680 --> 00:01:53,010 +đầu vào mẫu, c bằng với tổ hợp từ. + +29 +00:01:53,010 --> 00:01:58,010 +Tiếp theo, chúng ta đặt a bằng giá trị của + +30 +00:01:58,110 --> 00:02:02,250 +b, vì vậy a bây giờ bằng "Cơ bản". + +31 +00:02:02,250 --> 00:02:06,750 +Cuối cùng, ta đặt b bằng giá trị của c để + +32 +00:02:06,750 --> 00:02:09,660 +ta lấy biến tạm thời đó, lấy + +33 +00:02:09,660 --> 00:02:14,660 +giá trị bên trong rồi đặt vào biến b. + +34 +00:02:15,060 --> 00:02:19,320 +Vì vậy, bây giờ chúng ta đã hoán đổi các giá trị trong + +35 +00:02:19,320 --> 00:02:24,150 +a và b và chúng ta không còn sử dụng giá trị bên trong c nữa. + +36 +00:02:24,150 --> 00:02:26,850 +Nhưng tại thời điểm này, switcheroo + +37 +00:02:26,850 --> 00:02:29,340 +đã hoàn tất và khi chúng ta in ra a và + +38 +00:02:29,340 --> 00:02:33,990 +b, chúng sẽ hiển thị ngược lại với những gì chúng dùng để giữ. + +39 +00:02:33,990 --> 00:02:38,400 +Vì vậy, bây giờ, với ví dụ hiện tại Đầu vào, Hội và Cơ bản, chúng + +40 +00:02:38,400 --> 00:02:42,480 +ta sẽ kết thúc với Hội cơ bản được xuất ra, chuyển đổi các + +41 +00:02:42,480 --> 00:02:44,223 +giá trị xung quanh. + +42 +00:02:45,090 --> 00:02:47,250 +Vì vậy, nếu bạn cần thực hiện bất kỳ thay + +43 +00:02:47,250 --> 00:02:49,620 +đổi nào đối với mã của mình, vui lòng quay lại + +44 +00:02:49,620 --> 00:02:51,960 +trang trình bày trước đó nhưng hãy suy nghĩ + +45 +00:02:51,960 --> 00:02:54,510 +xem tại sao điều này hoạt động và cách tạo biến + +46 +00:02:54,510 --> 00:02:57,330 +cho phép chúng ta lưu trữ các giá trị bên trong chúng, + +47 +00:02:57,330 --> 00:02:59,733 +giống như các hộp khi bạn di chuyển . + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Day-1-Ending-Code.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Day-1-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..60217062b3bd29983fa38a8afcff2a90a516689d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Day-1-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-1-printing-end \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Variable Naming.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Variable Naming.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..832a446d3429e3174029308948bf217c0861a799 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Variable Naming.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:413c1cfe8256a109a181597911348b3be44fab5b07fcfc585c3ddb09f433f686 +size 11891330 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Variable Naming_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Variable Naming_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a7b0c89db026169a2f14eee42bdab26019d4117b --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/015 Variable Naming_vi.srt @@ -0,0 +1,228 @@ +1 +00:00:00,430 --> 00:00:03,310 +Bây giờ khi nói đến việc đặt tên cho các biến của + +2 +00:00:03,610 --> 00:00:06,580 +bạn, bạn có thể gọi nó là bất cứ thứ gì bạn muốn. + +3 +00:00:07,270 --> 00:00:09,010 +Vì vậy, thay vì gọi cái + +4 +00:00:09,370 --> 00:00:14,370 +tên này, tôi có thể gọi nó là n và tôi có thể gọi nó là l và miễn là + +5 +00:00:14,920 --> 00:00:15,790 +tôi nhất quán. + +6 +00:00:15,880 --> 00:00:20,880 +Vì vậy, nếu tôi muốn nhận được độ dài của N thì tôi cũng phải thay đổi điều này. + +7 +00:00:21,940 --> 00:00:25,960 +Và nếu tôi muốn in ra chữ L thì tôi cũng phải thay đổi điều này. + +8 +00:00:26,590 --> 00:00:29,260 +Nhưng có một vài quy tắc mà bạn có thể nên tuân theo. + +9 +00:00:29,350 --> 00:00:34,350 +Và điều quan trọng nhất là làm cho mã của bạn có thể đọc được. Bởi vì nếu bạn quay lại với + +10 +00:00:35,800 --> 00:00:38,830 +điều này trong sáu tháng, 12 tháng, N và + +11 +00:00:39,280 --> 00:00:42,730 +L sẽ không có nhiều ý nghĩa đối với bạn. + +12 +00:00:43,150 --> 00:00:46,450 +Vì vậy, hãy cố gắng đảm bảo rằng nó thực sự có ý nghĩa đối với bạn. + +13 +00:00:47,590 --> 00:00:48,670 +Và nếu bạn + +14 +00:00:48,670 --> 00:00:52,630 +muốn, bạn thực sự có thể có nhiều từ trong tên biến của mình. + +15 +00:00:52,960 --> 00:00:55,900 +Vì vậy, ví dụ, nếu bạn muốn gọi tên người + +16 +00:00:56,260 --> 00:01:00,610 +dùng này, thì bạn sẽ viết từ người dùng và sau đó bạn sẽ phân + +17 +00:01:00,820 --> 00:01:05,680 +tách từng từ bằng dấu gạch dưới. Nhưng bạn không thể có khoảng trống ở giữa. + +18 +00:01:05,710 --> 00:01:10,030 +Đây không phải là mã hợp lệ và nếu bạn cố gắng chạy nó, bạn sẽ gặp lỗi cú pháp. + +19 +00:01:10,840 --> 00:01:15,840 +Vì vậy, tên của biến phải là một đơn vị duy nhất và để phân tách các từ trong + +20 +00:01:16,810 --> 00:01:19,300 +Python, chúng tôi sử dụng dấu gạch dưới. + +21 +00:01:20,080 --> 00:01:23,500 +Bây giờ nếu bạn muốn sử dụng số trong tên biến của + +22 +00:01:23,500 --> 00:01:25,870 +mình, bạn có thể. Vì + +23 +00:01:25,870 --> 00:01:30,870 +vậy, ví dụ, length1, length2. Nhưng chúng không thể ở đầu tên của các biến. + +24 +00:01:31,630 --> 00:01:35,200 +Bạn không thể nói 1length hay 3length. + +25 +00:01:35,530 --> 00:01:39,850 +Điều đó cũng sẽ tạo ra một lỗi cú pháp. Cuối cùng, có một số từ + +26 +00:01:40,360 --> 00:01:43,720 +đặc quyền nhất định mà chúng tôi sử dụng, chẳng hạn + +27 +00:01:43,720 --> 00:01:47,560 +như tên của các chức năng của chúng tôi như print và input. + +28 +00:01:48,040 --> 00:01:53,040 +Và thông thường, bạn không nên sử dụng chúng làm tên của các biến vì bạn có thể thấy + +29 +00:01:53,530 --> 00:01:57,430 +rằng tô sáng cú pháp bị rối vì nó cho rằng đó thực sự là + +30 +00:01:57,670 --> 00:02:00,130 +hàm đầu vào mà bạn đang cố gắng tạo. + +31 +00:02:00,460 --> 00:02:04,330 +Và mặc dù thường khi bạn chạy ứng dụng của mình, nó có thể không gặp bất kỳ vấn đề + +32 +00:02:04,540 --> 00:02:07,600 +gì, đây thực sự là một phương pháp không tốt vì nó rất khó hiểu. + +33 +00:02:08,680 --> 00:02:12,430 +Vì vậy, hãy cố gắng đảm bảo rằng tất cả tên của các biến của bạn được đánh dấu, giống + +34 +00:02:12,670 --> 00:02:15,760 +như các biến khác có cùng màu. Bây giờ, điều cuối + +35 +00:02:15,790 --> 00:02:20,170 +cùng cần nhớ là nếu bạn quyết định gọi biến của mình bằng cái tên cụ + +36 +00:02:20,170 --> 00:02:25,170 +thể này, n-a-m-e, và sau đó, bạn mắc lỗi chính tả và bạn đánh vần sai, vì vậy có + +37 +00:02:26,380 --> 00:02:31,090 +thể thay vì tên bạn đã nói là nama, điều này sẽ không diễn ra. để hoạt + +38 +00:02:31,780 --> 00:02:36,640 +động và khi bạn chạy mã của mình, bạn sẽ gặp lỗi được gọi là lỗi tên vì + +39 +00:02:36,670 --> 00:02:41,670 +nó cho biết tên này không được xác định. Và ý tưởng là bạn sẽ + +40 +00:02:43,390 --> 00:02:48,390 +xem lỗi ở đâu, dòng 2, in tên và bạn sẽ thấy, + +41 +00:02:49,090 --> 00:02:51,880 +Ồ không đúng. Nó có nghĩa + +42 +00:02:52,090 --> 00:02:57,090 +là được đánh vần là n-a- m-e. Vì vậy, bạn sẽ phải đi và sửa nó để mã của bạn hoạt động. + +43 +00:02:58,000 --> 00:03:02,800 +Bây giờ hãy nhớ rằng điều này không phải vì Python đang thực hiện bất kỳ loại kiểm tra chính + +44 +00:03:02,800 --> 00:03:06,730 +tả nào cho bạn. Nó giống như, Ồ, đó không phải là cách bạn đánh vần tên. Không. Trên thực tế, + +45 +00:03:06,850 --> 00:03:11,850 +nếu bạn quyết định gọi tên này và bạn, sau này, sử dụng nó làm tên, không có + +46 +00:03:13,090 --> 00:03:16,000 +vấn đề gì, không có vấn đề gì, không có lỗi. + +47 +00:03:16,690 --> 00:03:18,670 +Miễn là nó nhất quán, đây là + +48 +00:03:19,060 --> 00:03:23,830 +tên được liên kết với phần dữ liệu này. Sau này, khi bạn muốn sử + +49 +00:03:23,830 --> 00:03:28,780 +dụng phần dữ liệu này, bạn sử dụng tên này để chỉ nó. + +50 +00:03:29,180 --> 00:03:32,290 +Và chừng nào hai cách viết này giống hệt nhau, thì + +51 +00:03:32,500 --> 00:03:34,660 +máy tính sẽ không quan tâm. + +52 +00:03:35,230 --> 00:03:38,290 +Vì vậy, khi bạn gặp lỗi tên trong mã của mình, bây giờ + +53 +00:03:38,350 --> 00:03:43,350 +bạn biết đó có thể là do bạn đã viết sai chính tả hoặc nhập sai một trong các tên + +54 +00:03:43,570 --> 00:03:47,950 +biến ở đâu đó trong mã của mình. Bây giờ trong bài học tiếp theo, + +55 +00:03:48,040 --> 00:03:52,510 +tôi đã chuẩn bị một bài kiểm tra cho bạn, nơi bạn sẽ chọn được tên + +56 +00:03:52,540 --> 00:03:55,390 +biến nào hợp lệ và tên biến nào không tốt. + +57 +00:03:55,720 --> 00:03:58,060 +Hãy xem xét vấn đề đó trong bài học tiếp theo. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/016 Variable Naming Quiz.html b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/016 Variable Naming Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..840d678183f782ba4a301289ae0f53eeb3e338e0 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/016 Variable Naming Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Band-Name-Generator-Starting-Code-replit.com-.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Band-Name-Generator-Starting-Code-replit.com-.url new file mode 100644 index 0000000000000000000000000000000000000000..0b4255b682fa57ce01b6f0af5bae532d59d8e21b --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Band-Name-Generator-Starting-Code-replit.com-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/band-name-generator-start?v=1 \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Course-Fixes-Report-an-Issue.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..c27e87b38e78f05f71ec5dcb013da4feb4636616 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.google.com/forms/d/e/1FAIpQLSdwbmx2whgRNiciYXiSs2lJT6-dOYgvqGnXdVqfLv1fjln7kw/viewform?usp=send_form \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Day 1 Project Band Name Generator.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Day 1 Project Band Name Generator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ca8101a9ded05bed9f1db03f5b35eb4964afc8ff --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Day 1 Project Band Name Generator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad4c32d0c8555cda273935c03bf646f4f6e7f003159e76c3c58512fae81de9a9 +size 32104350 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Day 1 Project Band Name Generator_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Day 1 Project Band Name Generator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9960b5ef2ea5da783a267e8108382d2e592dbbaa --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Day 1 Project Band Name Generator_vi.srt @@ -0,0 +1,272 @@ +1 +00:00:00,330 --> 00:00:06,689 +Được rồi, các bạn, đã đến lúc cho dự án cuối cùng của ngày hôm nay. Vì vậy, chương trình mà bạn sắp xây + +2 +00:00:06,689 --> 00:00:12,360 +dựng trông giống như thế này. Và bạn có thể kiểm tra nó nếu bạn truy cập vào liên + +3 +00:00:12,360 --> 00:00:18,320 +kết này, bằng cách nhập nó vào hoặc chuyển đến trang tài nguyên và nhấp vào liên kết tương ứng. + +4 +00:00:18,840 --> 00:00:27,330 +Nhưng về cơ bản, đó là một công cụ tạo tên ban nhạc. Và nó hỏi bạn về thành phố mà bạn lớn lên và tên thú cưng của + +5 +00:00:27,330 --> 00:00:27,770 +bạn. + +6 +00:00:28,080 --> 00:00:32,080 +Sau đó, nó kết hợp những thứ đó lại với nhau và cung cấp cho bạn tên ban nhạc của bạn. + +7 +00:00:32,700 --> 00:00:34,290 +Có một vài điều cần lưu ý ở đây. + +8 +00:00:34,300 --> 00:00:41,980 +Đầu tiên là thông báo khi đầu vào này được kích hoạt, con trỏ thực sự xuất hiện trên một dòng mới. + +9 +00:00:42,000 --> 00:00:46,010 +Vì vậy, nếu tôi chạy lại, bạn có thể thấy nó ghi "Tên thành phố bạn lớn lên là gì? Và sau đó con trỏ ở dòng tiếp theo. + +10 +00:00:46,020 --> 00:00:48,600 +Và điều tôi muốn bạn làm là tiếp tục và hướng tới dự án khởi đầu này. + +11 +00:00:49,380 --> 00:00:54,540 +Vì vậy, đây là URL và tất nhiên, nó cũng có trong tài nguyên + +12 +00:00:55,050 --> 00:00:56,490 +khóa học. + +13 +00:00:56,490 --> 00:00:59,490 +Và khi bạn đến đây, bạn có thể rẽ nhánh mã này và hoàn thành phiên bản của riêng mình. + +14 +00:00:59,910 --> 00:01:05,080 +Vì vậy, có một vài bước ở đây như là gợi ý. + +15 +00:01:05,430 --> 00:01:08,580 +Nếu bạn không muốn xem những thứ này và bạn chỉ + +16 +00:01:09,030 --> 00:01:14,010 +muốn tiếp tục dự án kết thúc, bạn cũng có thể xóa tất cả những thứ này. + +17 +00:01:14,010 --> 00:01:14,640 +Nhưng điều + +18 +00:01:15,180 --> 00:01:21,270 +quan trọng là sau khi bạn hoàn thành dự án này, nó sẽ hoạt động giống hệt như dự án mà bạn thấy ở đây. + +19 +00:01:21,270 --> 00:01:22,550 +Và để làm được điều này, bạn sẽ + +20 +00:01:23,190 --> 00:01:28,230 +phải áp dụng mọi thứ mà bạn đã học hôm nay, bao gồm đầu vào in, biến, dòng mới, thao tác chuỗi, gỡ lỗi và nhiều thứ khác. + +21 +00:01:28,230 --> 00:01:34,960 +Vì vậy, đây là lúc để thưởng thức cho mình một tách trà 🍵 hoặc cà phê ☕️, tạm dừng video và giải quyết dự án cuối cùng này. + +22 +00:01:35,310 --> 00:01:41,790 +Được rồi, các bạn, tôi hy vọng các bạn đã thử và có thể hoàn thành nó. Nếu bạn muốn xem tôi đã triển khai nó như thế nào hoặc nếu bạn chỉ muốn kiểm tra xem mình có + +23 +00:01:46,510 --> 00:01:52,270 +mắc lỗi nào không hoặc có điều gì mà bạn không + +24 +00:01:52,270 --> 00:01:57,970 +chắc chắn không, thì hãy tiếp tục xem và tôi sẽ cùng bạn tìm ra giải pháp. + +25 +00:01:57,970 --> 00:02:02,520 +Bước đầu tiên là tạo lời chào cho chương trình của bạn, trong trường + +26 +00:02:03,920 --> 00:02:09,800 +hợp của chúng tôi, lời chào có nội dung "Chào mừng bạn đến với trình tạo tên ban nhạc. Vì vậy, đó chính xác là những gì tôi sẽ tạo ra. + +27 +00:02:09,800 --> 00:02:10,720 +Và chúng tôi in những tin nhắn này bằng chức năng in. + +28 +00:02:11,090 --> 00:02:13,240 +Vì vậy, tôi sẽ nói "Chào mừng bạn đến với công cụ tạo tên ban nhạc. Và điều này khi tôi chạy, nó sẽ chỉ in thông báo đó. + +29 +00:02:13,490 --> 00:02:16,720 +Bây giờ, bước tiếp theo là hỏi người dùng về thành phố mà họ đã lớn lên. Vì vậy, để có được một số đầu vào từ + +30 +00:02:17,210 --> 00:02:22,610 +người dùng, tất nhiên, chức năng nhập liệu sẽ cần. + +31 +00:02:24,110 --> 00:02:27,560 +Và chúng ta sẽ hỏi họ bằng cách sử dụng dấu nhắc nằm trong + +32 +00:02:29,690 --> 00:02:35,330 +dấu ngoặc đơn: "Bạn lớn lên ở thành phố nào? Vì vậy, bây giờ khi tôi nhấn chạy, nó sẽ hỏi tôi về thành + +33 +00:02:35,330 --> 00:02:38,540 +phố mà tôi đã lớn lên và tôi có thể thêm câu trả lời như vậy. + +34 +00:02:38,870 --> 00:02:46,820 +Bây giờ, dữ liệu đó sẽ biến mất trong không khí trừ khi tôi nắm bắt và đặt tên cho nó, vì vậy tôi sẽ phải tạo một biến để giữ + +35 +00:02:46,820 --> 00:02:49,040 +dữ liệu mà người dùng đã nhập. + +36 +00:02:49,610 --> 00:02:56,770 +Vì vậy, chúng tôi sẽ chỉ gọi đó là "thành phố" và sau đó thêm dấu bằng (=) để gán bất cứ thứ gì mà người dùng đã nhập vào tên biến + +37 +00:02:57,020 --> 00:02:57,620 +này. + +38 +00:02:58,850 --> 00:03:06,080 +Và bây giờ tôi có quyền truy cập vào biến thành phố và tôi có thể in hoặc sử dụng nó sau này nếu tôi muốn, như vậy. + +39 +00:03:06,080 --> 00:03:09,920 +Bây giờ, bước tiếp theo là hỏi người dùng tên của thú cưng. + +40 +00:03:10,280 --> 00:03:16,190 +Vì vậy, chúng tôi sẽ gọi biến đó là "thú cưng" và chúng tôi sẽ gán cho nó giá trị mà người dùng nhập + +41 +00:03:16,190 --> 00:03:18,200 +vào: "Tên của thú cưng là gì? Bây giờ, bước 4 là kết hợp tên của thành phố và thú cưng và cho chúng xem tên ban nhạc của chúng. + +42 +00:03:19,010 --> 00:03:27,680 +Bây giờ, có khá nhiều cách để làm điều này, đặc biệt nếu bạn tìm kiếm trên Internet. + +43 +00:03:30,770 --> 00:03:35,260 +Nhưng cách mà bạn học trong bài học hôm nay là sử dụng phép nối chuỗi. + +44 +00:03:35,390 --> 00:03:41,840 +Vì vậy, chúng tôi sẽ làm điều đó. + +45 +00:03:42,170 --> 00:03:45,140 +Vì vậy, chúng tôi sẽ sử dụng một tuyên bố in và nói với họ "Tên ban nhạc của bạn có thể là... Và sau đó chúng ta sẽ thêm tên của thành + +46 +00:03:46,810 --> 00:03:52,030 +phố, sau đó thêm khoảng trắng và sau đó thêm tên thú cưng của họ. + +47 +00:03:52,060 --> 00:03:55,860 +Vì vậy, bây giờ khi chúng tôi chạy mã của mình, nó sẽ hỏi chúng tôi tên thành phố của họ và + +48 +00:03:56,230 --> 00:04:00,690 +sau đó là tên của một con vật cưng, sau đó nó sẽ kết hợp chúng lại với nhau và hiển thị cho chúng tôi tên ban + +49 +00:04:01,120 --> 00:04:02,150 +nhạc của chúng tôi. + +50 +00:04:02,200 --> 00:04:07,540 +Bây giờ, bước cuối cùng là con trỏ nhập sẽ hiển thị trên một dòng mới như thế này. + +51 +00:04:08,500 --> 00:04:17,410 +Vì vậy, đây là con trỏ. + +52 +00:04:17,410 --> 00:04:17,800 +Nhưng đây là đầu vào. + +53 +00:04:18,610 --> 00:04:20,769 +Chỉ để bạn có một chút + +54 +00:04:20,769 --> 00:04:29,590 +dung lượng và không phải nhập trực tiếp sau lời nhắc ở đây như những gì chúng tôi có. + +55 +00:04:29,590 --> 00:04:31,960 +Vì vậy, làm thế nào để chúng tôi làm điều đó? + +56 +00:04:32,560 --> 00:04:39,180 +Chà, bạn đã học về cách sửa đổi chuỗi bằng cách tạo một dòng mới bằng lệnh \n. + +57 +00:04:39,190 --> 00:04:40,650 +Và chúng ta có thể thêm cả hai vào cuối đầu vào thành phố và đầu vào thú cưng. + +58 +00:04:40,660 --> 00:04:42,220 +Và bây giờ khi chúng tôi chạy mã + +59 +00:04:42,550 --> 00:04:48,700 +của mình, bạn sẽ thấy rằng con trỏ hiện hiển thị trên dòng tiếp theo và chương trình của chúng tôi trông đẹp hơn rất nhiều. + +60 +00:04:48,700 --> 00:04:49,360 +Vì vậy, có bạn có nó. + +61 +00:04:49,900 --> 00:04:51,160 +Đây là cách bạn giải quyết thử thách ông chủ này và đây là cách bạn tạo dự án tạo tên ban nhạc. + +62 +00:04:51,430 --> 00:04:57,610 +Vì vậy, tôi hy vọng bạn đã vui vẻ với tôi ngày hôm nay khi học Python và nhiều kiến thức cơ bản về Python. + +63 +00:04:58,150 --> 00:05:03,220 +Và ngày mai, tôi có một mô-đun đầy ắp khác gồm các + +64 +00:05:03,530 --> 00:05:10,930 +hướng dẫn, thử thách và dự án thực sự tuyệt vời để bạn tham gia! + +65 +00:05:10,930 --> 00:05:12,130 +Tôi rất mong được gặp bạn vào ngày mai, vì vậy bây giờ tôi hãy nghỉ ngơi và + +66 +00:05:13,780 --> 00:05:15,030 +để bộ não của bạn 🧠 làm việc với những điều bạn đã học được trong khi ngủ. + +67 +00:05:15,310 --> 00:05:22,030 +Và tôi sẽ gặp bạn ở đây sáng và sớm. + +68 +00:05:22,480 --> 00:05:28,480 +Chúc ngủ ngon và hẹn gặp lại vào ngày mai. + diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Solution-Band-Name-Generator-Ending-Code.url b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Solution-Band-Name-Generator-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..b817fdc56812ad496a4038bef0834d3aa1a9773e --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/017 Solution-Band-Name-Generator-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/band-name-generator-end \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/018 Congratulations! Well done!.mp4 b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/018 Congratulations! Well done!.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..75ef3200378c9a6bd4b2fe2ff957d45e312f0b7c --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/018 Congratulations! Well done!.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e59e564885076e8b20189f3942608f17ecff0aea6a25fb238b1e6558032e676 +size 20949982 diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/018 Congratulations! Well done!_vi.srt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/018 Congratulations! Well done!_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..03799acd6b6a0066a081203d0a314ec5cef27737 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/018 Congratulations! Well done!_vi.srt @@ -0,0 +1,48 @@ +1 +00:00:01,060 --> 00:00:04,510 +Tốt lắm. Bạn vừa hoàn thành ngày đầu tiên của mình. + +2 +00:00:04,960 --> 00:00:09,960 +Và hãy nhớ rằng một cuộc hành trình ngàn dặm không thể bắt đầu mà + +3 +00:00:10,390 --> 00:00:14,620 +không có bước đầu tiên. Vì vậy, xin chúc mừng bạn đã làm điều đó và hoàn thành nó. + +4 +00:00:15,400 --> 00:00:20,110 +Bây giờ, hãy nhớ rằng những ngày đầu tiên có thể mất hơn một giờ để hoàn + +5 +00:00:20,110 --> 00:00:20,920 +thành một + +6 +00:00:20,920 --> 00:00:25,480 +chút, chỉ vì tôi có quá nhiều thứ để dạy bạn và quá nhiều thứ + +7 +00:00:25,480 --> 00:00:29,380 +để nhồi nhét vào mỗi ngày này. Vì vậy, không thành vấn đề nếu bạn cần + +8 +00:00:29,650 --> 00:00:33,880 +nghỉ giữa giờ hay bạn cần chợp mắt giữa giờ. Chỉ cần quay lại với nó bất cứ khi nào bạn có thể, + +9 +00:00:33,880 --> 00:00:38,710 +và bạn không cần phải làm điều đó nghiêm ngặt theo thứ tự ngày qua ngày. Bây giờ, tôi hy vọng rằng bạn sẽ tiếp + +10 +00:00:38,710 --> 00:00:43,710 +tục và bạn sẽ trở lại vào ngày mai với tinh thần sảng khoái và bạn sẽ giải quyết các + +11 +00:00:43,760 --> 00:00:47,930 +môn học ngày hôm sau với sức lực tương tự như bạn đã làm hôm nay. + +12 +00:00:48,440 --> 00:00:51,710 +Vì vậy, hãy nghỉ ngơi thật tốt và hẹn gặp lại vào ngày mai. + diff --git "a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" "b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" new file mode 100644 index 0000000000000000000000000000000000000000..92f6e72357f936d07dff5ac8aee29e545e4c11d3 --- /dev/null +++ "b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" @@ -0,0 +1,6 @@ +Do là mình up quá nhiều file nên thằng google drive nó giảm độ phân giải về 360 nên ae xem trên gg drive sẽ rất khó chịu và mờ , Nhìn Đống Video Này Mà Tải về Thì khá là nặng nên mình sẽ chia sẻ cho ae cách xem video trên gg drive độ phân giải cao không lag mà vẫn mượt mà nhé ! + +link hướng dẫn : https://tainguyenmienphi.com/huong-dan-cach-xem-video-tren-gg-drive/ + +Nhóm FB:https://www.facebook.com/groups/1105106193836548 +Nhóm account Tele: https://t.me/EduTecHackVN \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/Download all source code.zip b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/Download all source code.zip new file mode 100644 index 0000000000000000000000000000000000000000..28c3e3c33fcb3e8fe9fca3f1f73e158b4c52eae0 --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/Download all source code.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7273166e23da5d870128692e11533aa332cd30a27ceca648db97aaf7b1c6ad7 +size 1201 diff --git "a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" "b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" new file mode 100644 index 0000000000000000000000000000000000000000..bbbf5155676f390f80d69ae9563c705d64398c70 --- /dev/null +++ "b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" @@ -0,0 +1 @@ +tải khóa học tại tainguyenmienphi.com \ No newline at end of file diff --git a/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/external-links.txt b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..1b1a6779784d409b426b699df6fba5be4d42c84d --- /dev/null +++ b/part1/01 - Day 1 - Beginner - Working with Variables in Python to Manage Data/external-links.txt @@ -0,0 +1,66 @@ + +003 Join-the-Student-Community-on-Discord +https://discord.gg/3DDPkCAU3N + +003 Study-With-Me-Video +https://www.udemy.com/course/100-days-of-code/learn/lecture/23518346#search + +003 FAQ-I-Cant-Open-the-Course-Resource-Links +https://www.udemy.com/course/100-days-of-code/learn/lecture/23544648#questions/13314700 + +004 Press-Run-to-see-the-final-project +https://replit.com/@appbrewery/band-name-generator-end + +006 Fork-the-Day-1-Starting-Repl +https://repl.it/@appbrewery/day-1-printing-start + +006 Create-a-Replit-Account +https://replit.com/signup + +007 Join-Auditorium +https://app.auditorium.ai/register + +008 Link-to-Coding-Exercise-1 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/49be1e94-c2d3-4683-ae14-36bbef39fc84 + +008 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +009 Fork-the-Day-1-Starting-Repl +https://replit.com/@appbrewery/day-1-printing-start + +010 Exercise-2 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d43d1d37-164f-4a24-8e5a-3cc03722437f + +010 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +012 Exercise-3 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d83e1847-3ad1-4f67-9f9f-7cbfb9dd970f + +012 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +013 Variables-Starting-Repl +https://repl.it/@appbrewery/day-1-variables-start + +013 Variables-Ending-Repl +https://repl.it/@appbrewery/day-1-variables-end + +014 Exercise-4 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/8a8d2e46-c56a-435b-98f3-bcd71216dd26 + +014 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +015 Day-1-Ending-Code +https://repl.it/@appbrewery/day-1-printing-end + +017 Solution-Band-Name-Generator-Ending-Code +https://repl.it/@appbrewery/band-name-generator-end + +017 Course-Fixes-Report-an-Issue +https://docs.google.com/forms/d/e/1FAIpQLSdwbmx2whgRNiciYXiSs2lJT6-dOYgvqGnXdVqfLv1fjln7kw/viewform?usp=send_form + +017 Band-Name-Generator-Starting-Code-replit.com- +https://replit.com/@appbrewery/band-name-generator-start?v=1 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Day 2 Goals what we will make by the end of the day.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Day 2 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8159275aac2acdcd47e31097555da55834362bde --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Day 2 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6090e7f54bab534704a72aeb1ca5fba463ed20daec457c65b157f81bfa6ce42d +size 3860470 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Day 2 Goals what we will make by the end of the day_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Day 2 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6b036bbf2dedb531f32fe846dbab227dd442f7dc --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Day 2 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,108 @@ +1 +00:00:00,220 --> 00:00:05,170 +Xin chào các bạn, chào mừng các bạn đã trở lại với Ngày thứ 2 của 100 Ngày viết mã. + +2 +00:00:05,830 --> 00:00:09,670 +Trong các bài học hôm nay, bạn sẽ học về kiểu dữ + +3 +00:00:09,670 --> 00:00:13,630 +liệu, số, phép toán, chuyển đổi kiểu, chuỗi f và nhiều hơn thế nữa. + +4 +00:00:14,110 --> 00:00:16,540 +Và đến cuối ngày hôm nay, + +5 +00:00:16,570 --> 00:00:20,650 +bạn sẽ học đủ để xây dựng một máy tính tiền boa. + +6 +00:00:21,100 --> 00:00:24,760 +Vì vậy, nó trông giống như thế này. Nó nói, chào mừng bạn đến với máy tính tiền boa. + +7 +00:00:25,060 --> 00:00:27,910 +Nó yêu cầu bạn cho tổng hóa đơn mà bạn cần phải trả. + +8 +00:00:28,240 --> 00:00:33,240 +Vì vậy, giả sử nó đã đến $ 124. 54, chúng tôi nhấn enter và sau đó nó hỏi bạn + +9 +00:00:37,150 --> 00:00:39,400 +bạn muốn chia hóa đơn cho bao nhiêu người? + +10 +00:00:39,760 --> 00:00:44,590 +Vì vậy, hãy giả sử năm người chúng ta đang dùng bữa và cuối cùng nó hỏi bạn, bạn muốn + +11 +00:00:44,890 --> 00:00:47,170 +đưa ra bao nhiêu phần trăm tiền boa? + +12 +00:00:47,530 --> 00:00:50,530 +Vì vậy, giả sử chúng tôi đưa ra tiền boa 12%. + +13 +00:00:51,250 --> 00:00:54,460 +Bây giờ, nó sẽ tính toán những gì mỗi người phải trả, + +14 +00:00:54,670 --> 00:00:58,270 +có tính đến tất cả những phần thông tin mà bạn đã đưa vào. + +15 +00:00:58,810 --> 00:01:01,570 +Vì vậy, tôi biết rằng tôi khá tệ trong môn toán, đặc biệt là + +16 +00:01:01,630 --> 00:01:03,550 +khi liên quan đến việc tách các hóa đơn. + +17 +00:01:04,060 --> 00:01:06,700 +Và tôi thường là người chỉ nói, vâng, chỉ cần + +18 +00:01:06,700 --> 00:01:09,910 +nói với tôi những gì tôi cần trả để tôi không phải tính toán. + +19 +00:01:10,300 --> 00:01:13,510 +Nó giống như khoản thuế sai toán mà tôi phải trả. + +20 +00:01:14,110 --> 00:01:17,530 +Nhưng để xây dựng điều này, bạn sẽ cần phải học một số + +21 +00:01:17,860 --> 00:01:22,750 +kỹ năng mới, bao gồm làm việc với các con số, chuyển đổi kiểu dữ liệu từ kiểu + +22 +00:01:23,200 --> 00:01:27,790 +này sang kiểu khác và hơn thế nữa. Vì vậy, nếu bạn cảm thấy mình có thể giải quyết vấn đề này, không có vấn đề gì. + +23 +00:01:28,060 --> 00:01:30,760 +Sau đó, hãy thoải mái bỏ qua các bài học ngày hôm nay. + +24 +00:01:31,030 --> 00:01:35,170 +Nhưng tôi cá rằng sẽ có vô số thứ mà bạn sẽ gặp trong các + +25 +00:01:35,170 --> 00:01:39,670 +bài học sắp tới và bài tập viết mã thực sự sẽ giúp bạn trở thành một + +26 +00:01:39,670 --> 00:01:42,760 +nhà phát triển tốt hơn. Vì vậy, khi bạn đã sẵn sàng + +27 +00:01:42,970 --> 00:01:45,730 +bắt đầu, hãy chuyển sang bài học tiếp theo và bắt đầu viết mã. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Press-Run-to-see-the-final-project.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Press-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..dcd2957360ac1c6c869ea635a83a676546c8c824 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/001 Press-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/tip-calculator-end?v=1 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Fork-the-Day-2-Starting-Repl.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Fork-the-Day-2-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..926be319a9c115c5f26c26f6688fa6bbf70c62e0 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Fork-the-Day-2-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-2-start \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Python Primitive Data Types.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Python Primitive Data Types.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..12a8fab3b3d2bebbfddbff21b9728d79ed45ea7a --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Python Primitive Data Types.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f747d1772d4f1a816ef7de415c5018c1ac71b5107f31e44c5c075fc9cda9ac3 +size 20783608 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Python Primitive Data Types_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Python Primitive Data Types_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cd83710dacc43ef1b0443a8cbc33cc25bf880781 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/002 Python Primitive Data Types_vi.srt @@ -0,0 +1,484 @@ +1 +00:00:00,070 --> 00:00:05,070 +Hôm qua bạn đã thấy rằng chúng ta có thể sử dụng hàm Len để lấy + +2 +00:00:05,410 --> 00:00:09,640 +số ký tự trong một chuỗi. Vì vậy, ví dụ, khi tôi viết + +3 +00:00:09,670 --> 00:00:12,580 +Len, xin chào và tôi in nó ra, chúng + +4 +00:00:13,360 --> 00:00:17,500 +ta kết thúc bằng 5. Có 5 ký tự trong chuỗi xin chào. + +5 +00:00:18,280 --> 00:00:19,570 +Bây giờ đây là một câu hỏi. + +6 +00:00:20,170 --> 00:00:25,170 +Điều gì sẽ xảy ra nếu thay vì đếm số ký tự trong một chuỗi, điều gì + +7 +00:00:26,200 --> 00:00:31,200 +sẽ xảy ra nếu tôi đặt một số thay vào đó và tôi muốn biết số + +8 +00:00:31,780 --> 00:00:35,800 +này có bao nhiêu chữ số? Bây giờ nếu tôi tiếp tục và chạy mã này, + +9 +00:00:35,980 --> 00:00:37,810 +bạn sẽ thấy rằng nó thực sự bị lỗi. + +10 +00:00:38,260 --> 00:00:43,260 +Tôi nhận được cả đống văn bản màu đỏ và nó cho tôi biết rằng có lỗi + +11 +00:00:44,380 --> 00:00:49,150 +kiểu và điều gì đó về kiểu int. Vì vậy, tất cả những điều này là về cái gì? + +12 +00:00:49,840 --> 00:00:54,370 +Để hiểu được nó, trước tiên chúng ta phải tìm hiểu về các kiểu dữ liệu. + +13 +00:00:55,120 --> 00:00:59,680 +Bây giờ vào ngày 1, chúng ta đã khám phá kiểu dữ liệu này được gọi là chuỗi. + +14 +00:01:00,100 --> 00:01:03,760 +Bây giờ bạn có thể sẽ không ngạc nhiên khi biết rằng có rất + +15 +00:01:03,760 --> 00:01:05,770 +nhiều kiểu dữ liệu khác ngoài kia. + +16 +00:01:06,250 --> 00:01:11,140 +Và hôm nay chúng ta sẽ khám phá một số kiểu dữ liệu quan + +17 +00:01:11,140 --> 00:01:15,820 +trọng nhất và cơ bản nhất như chuỗi, số nguyên, float và boolean. + +18 +00:01:16,270 --> 00:01:18,580 +Và chúng ta sẽ khám phá chi tiết từng điều này. + +19 +00:01:19,300 --> 00:01:24,300 +Vì vậy, hãy tiếp tục và nắm bắt ngày thứ 2 bắt đầu mã hóa sandbox và tiếp tục phân tách + +20 +00:01:25,540 --> 00:01:29,050 +bản sao của chính bạn về nó. Bây giờ khi bạn đã hoàn thành việc + +21 +00:01:29,110 --> 00:01:31,360 +đó, chúng ta hãy xem xét một số kiểu dữ liệu. + +22 +00:01:31,480 --> 00:01:34,240 +Vậy là chúng ta đã tìm hiểu về chuỗi rồi phải không? + +23 +00:01:34,360 --> 00:01:38,650 +Và chúng tôi biết rằng đây chỉ là một chuỗi ký tự. + +24 +00:01:38,980 --> 00:01:43,980 +Vì vậy, từ xin chào bao gồm năm ký tự này được xâu chuỗi lại với nhau. + +25 +00:01:44,320 --> 00:01:47,680 +Và chúng ta luôn biết rằng các chuỗi, khi chúng ta tạo chúng, chúng ta phải + +26 +00:01:47,890 --> 00:01:49,960 +tạo chúng với các dấu ngoặc kép xung quanh. + +27 +00:01:50,440 --> 00:01:53,110 +Bây giờ vì đây là một chuỗi ký tự, chúng tôi thực + +28 +00:01:53,470 --> 00:01:58,390 +sự có thể rút ra từng ký tự riêng lẻ. Vì vậy, chúng ta có thể, ví dụ, + +29 +00:01:58,570 --> 00:02:02,890 +thay vì chỉ viết hello, chúng ta có thể thêm một số dấu ngoặc vuông. + +30 +00:02:03,280 --> 00:02:06,220 +Vì vậy, hãy nhìn vào bàn phím của bạn và xem chúng ở đâu. + +31 +00:02:06,730 --> 00:02:11,730 +Và bên trong dấu ngoặc vuông, chúng ta có thể đặt chỉ số hoặc vị trí của ký tự + +32 +00:02:12,730 --> 00:02:15,010 +mà chúng ta muốn. Vì vậy, ví + +33 +00:02:15,010 --> 00:02:19,390 +dụ, nếu tôi muốn có ký tự đầu tiên trong từ hello, tôi sẽ + +34 +00:02:19,420 --> 00:02:21,310 +đặt số 0 ngay tại đây. + +35 +00:02:21,910 --> 00:02:26,350 +Và nếu tôi tiếp tục và in những gì điều này thực sự sẽ cung cấp + +36 +00:02:26,800 --> 00:02:31,800 +cho tôi, bạn sẽ thấy rằng bạn viết hoa H vì đó là ký tự đầu tiên của + +37 +00:02:32,890 --> 00:02:33,723 +chuỗi này. + +38 +00:02:33,970 --> 00:02:38,140 +Và điều thực sự quan trọng cần nhớ là các lập trình viên luôn bắt đầu đếm từ + +39 +00:02:38,140 --> 00:02:42,190 +số 0 vì chúng tôi làm việc với hệ nhị phân, số không và số một. + +40 +00:02:42,460 --> 00:02:46,810 +Vì vậy, bất cứ khi nào bạn muốn nắm giữ ký tự đầu tiên hoặc ký tự đầu + +41 +00:02:46,810 --> 00:02:49,480 +tiên của bất kỳ thứ gì, nó luôn ở mức 0. + +42 +00:02:50,080 --> 00:02:54,910 +Vì vậy, phương pháp lấy ra một phần tử cụ thể từ một chuỗi được + +43 +00:02:54,910 --> 00:02:58,960 +gọi là tập lệnh con. Và số ở giữa các dấu ngoặc + +44 +00:02:59,770 --> 00:03:01,270 +vuông xác định ký + +45 +00:03:01,600 --> 00:03:06,600 +tự bạn sẽ kéo ra và nó chỉ tăng từ 0 lên 1 đến 2, v.v. + +46 +00:03:07,240 --> 00:03:10,240 +Vì vậy, bất cứ khi nào bạn nhận được một kết quả chỉ sai + +47 +00:03:10,480 --> 00:03:15,480 +một kết quả, thì hãy nhớ kiểm tra xem bạn đã bắt đầu đếm từ số 0 chưa hay bạn đã bắt đầu + +48 +00:03:15,580 --> 00:03:17,140 +đếm từ một kết quả chưa. + +49 +00:03:18,040 --> 00:03:22,360 +Bây giờ tất nhiên bạn có thể mở rộng điều này và nắm giữ ký tự cuối cùng. + +50 +00:03:22,570 --> 00:03:27,100 +Vì vậy, hãy tạm dừng video và xem liệu bạn có thể thay đổi mã để chữ 'o' được in + +51 +00:03:27,100 --> 00:03:29,440 +ra ở đây hay không. Được rồi, + +52 +00:03:29,440 --> 00:03:33,760 +đây là cách đơn giản chỉ đơn giản là đếm từ + +53 +00:03:33,940 --> 00:03:38,020 +0, một, hai, ba, bốn. Vì vậy, nếu chúng tôi thay đổi điều này thành bốn và chúng + +54 +00:03:38,320 --> 00:03:41,080 +tôi chạy mã của mình, thì bạn sẽ thấy rằng chữ 'o' được in thay vì chữ H. + +55 +00:03:41,620 --> 00:03:44,980 +Vì vậy, bằng cách sử dụng các dấu ngoặc vuông này và đặt + +56 +00:03:45,280 --> 00:03:50,280 +một số bên trong, chúng ta có thể phân tích chuỗi của mình và lấy ra các ký tự riêng + +57 +00:03:50,980 --> 00:03:51,813 +lẻ khi cần. + +58 +00:03:52,120 --> 00:03:55,840 +Và điều này sẽ thực sự hữu ích trong rất nhiều chương trình mà bạn sẽ viết + +59 +00:03:55,840 --> 00:03:56,673 +trong tương lai. + +60 +00:03:57,220 --> 00:04:02,140 +Bây giờ, điều quan trọng cần nhớ là chỉ vì tôi có thể viết một + +61 +00:04:02,170 --> 00:04:03,520 +số như "123", + +62 +00:04:04,180 --> 00:04:07,660 +miễn là nó được giữ bên trong dấu ngoặc kép này, + +63 +00:04:07,990 --> 00:04:11,440 +thì máy tính sẽ không coi đây là một số. + +64 +00:04:11,440 --> 00:04:16,420 +Nó được coi như bất kỳ đoạn văn bản nào khác. Ví dụ: bạn + +65 +00:04:16,480 --> 00:04:21,040 +không thể nói "123" + "345" là gì. + +66 +00:04:21,490 --> 00:04:25,720 +Nếu tôi cố gắng in cái này, bạn nghĩ điều gì sẽ xảy ra? + +67 +00:04:26,260 --> 00:04:29,110 +Bạn có nghĩ rằng nó sẽ cung cấp cho tôi 123 + 345 theo + +68 +00:04:29,110 --> 00:04:30,820 +nghĩa truyền thống, giống như tính toán nó + +69 +00:04:30,820 --> 00:04:35,410 +hay bạn nghĩ nó sẽ làm một cái gì đó khác? Được rồi, hãy + +70 +00:04:35,470 --> 00:04:39,970 +nhấn run và chúng ta nhận được 123345. + +71 +00:04:40,240 --> 00:04:44,140 +Vì vậy, về cơ bản nó chỉ nối hai chuỗi này với + +72 +00:04:44,380 --> 00:04:49,330 +nhau, giống như chúng ta đã làm với các chuỗi khác như hello và world, phải không? + +73 +00:04:50,170 --> 00:04:54,700 +Vì nó coi datatype của hai phần dữ liệu này là chuỗi. + +74 +00:04:55,060 --> 00:04:56,650 +Khi chúng ta sử + +75 +00:04:56,830 --> 00:05:01,450 +dụng dấu cộng, nó thực sự sẽ chỉ nối hai thứ này lại thay + +76 +00:05:01,450 --> 00:05:05,140 +vì thực hiện một phép toán. Bây giờ nếu chúng ta muốn làm + +77 +00:05:05,200 --> 00:05:10,120 +điều đó, thì chúng ta thực sự phải khai báo số của chúng ta dưới dạng một kiểu dữ liệu số. + +78 +00:05:10,450 --> 00:05:13,780 +Vì vậy, một trong những số phổ biến nhất mà bạn sẽ thấy được gọi là số nguyên. + +79 +00:05:14,200 --> 00:05:18,250 +Vì vậy, đây là biệt ngữ lập trình chỉ dành cho các số nguyên, các số không + +80 +00:05:18,250 --> 00:05:20,290 +có bất kỳ chữ số thập phân nào. + +81 +00:05:20,860 --> 00:05:25,000 +Và để tạo một số nguyên hoặc khai báo một kiểu dữ liệu số nguyên, + +82 +00:05:25,300 --> 00:05:29,560 +tất cả những gì bạn phải làm chỉ là ghi số mà không cần làm gì khác. + +83 +00:05:30,220 --> 00:05:34,300 +Vì vậy, bây giờ nếu tôi chỉ viết các số, 123 + 345 và sau + +84 +00:05:34,300 --> 00:05:37,150 +đó tôi tiếp tục và in ra, sau đó + +85 +00:05:37,720 --> 00:05:40,720 +bạn sẽ thấy rằng chúng tôi thực sự nhận được 468. + +86 +00:05:40,720 --> 00:05:45,550 +Vì vậy, nó thực sự đang được tính toán bởi vì tôi có các số thực tế thay + +87 +00:05:45,670 --> 00:05:46,540 +vì các chuỗi. + +88 +00:05:47,290 --> 00:05:50,800 +Cũng như chúng ta có một số điều hữu ích mà chúng ta có thể làm với chuỗi. + +89 +00:05:51,130 --> 00:05:53,650 +Có một số điều thực sự hữu ích mà bạn có thể làm với số nguyên. + +90 +00:05:54,400 --> 00:05:57,890 +Thông thường khi chúng ta viết các số lớn, ít nhất + +91 +00:05:58,100 --> 00:06:02,600 +là ở Anh hoặc ở Mỹ, chúng ta muốn đặt dấu phẩy ở giữa + +92 +00:06:02,600 --> 00:06:03,380 +hàng nghìn. + +93 +00:06:03,380 --> 00:06:08,380 +Vì vậy, khi chúng ta nghĩ về những số lớn với những dấu phẩy ở giữa để chia nó + +94 +00:06:08,390 --> 00:06:11,720 +thành một số dễ hiểu hơn. Trong Python, chúng ta có + +95 +00:06:11,750 --> 00:06:16,750 +thể thay thế những dấu phẩy đó đơn giản bằng dấu gạch dưới và nó sẽ được + +96 +00:06:16,820 --> 00:06:20,330 +máy tính giải thích như thể bạn đã viết điều này. + +97 +00:06:20,630 --> 00:06:23,960 +Vì vậy, máy tính thực sự loại bỏ những dấu gạch dưới đó và bỏ qua nó. + +98 +00:06:24,440 --> 00:06:29,120 +Lợi ích là chỉ để con người chúng ta có thể hình dung nó dễ dàng hơn. + +99 +00:06:29,780 --> 00:06:32,060 +Vì vậy, tôi đã đề cập rằng tất cả các + +100 +00:06:32,060 --> 00:06:36,170 +số nguyên bất kể chúng là số dương hay số âm, đều được gọi là số nguyên trong lập trình. + +101 +00:06:36,770 --> 00:06:40,250 +Vì vậy, bạn gọi nó là gì khi bạn thực sự có các chữ số thập phân? Chà, chúng được gọi + +102 +00:06:40,280 --> 00:06:45,280 +là float và đây là viết tắt của một số dấu phẩy động. + +103 +00:06:45,680 --> 00:06:49,940 +Vì vậy, ví dụ, nếu bạn có um, số PI, bạn + +104 +00:06:49,970 --> 00:06:51,770 +có 3. 14159 và cái + +105 +00:06:51,830 --> 00:06:56,830 +này, bởi vì nó có một chữ số thập phân, bây giờ là một kiểu dữ liệu float. + +106 +00:06:58,580 --> 00:07:03,580 +Vì vậy, nếu bạn nghĩ dấu phẩy thập phân có thể nổi xung quanh số vì nó có thể + +107 +00:07:04,070 --> 00:07:06,020 +xảy ra bất kỳ lúc nào, thì + +108 +00:07:06,290 --> 00:07:08,900 +bạn đã có cho mình một số dấu phẩy động. + +109 +00:07:10,100 --> 00:07:14,090 +Bây giờ kiểu dữ liệu cuối cùng được gọi là boolean. + +110 +00:07:14,960 --> 00:07:18,740 +Và điều này rất đơn giản. Nó chỉ có hai giá trị + +111 +00:07:19,100 --> 00:07:20,990 +có thể, đúng hoặc sai. + +112 +00:07:21,350 --> 00:07:26,350 +Bây giờ hãy lưu ý cách các giá trị này luôn bắt đầu bằng chữ T viết hoa hoặc chữ F viết hoa và chúng không có + +113 +00:07:27,410 --> 00:07:30,290 +bất kỳ dấu ngoặc kép nào xung quanh chúng hoặc bất kỳ thứ gì. + +114 +00:07:30,560 --> 00:07:35,510 +Vì vậy, đây thực sự là một kiểu dữ liệu sẽ được sử dụng rất nhiều trong các chương trình của bạn để + +115 +00:07:35,780 --> 00:07:37,280 +kiểm tra xem điều gì đó + +116 +00:07:37,280 --> 00:07:41,300 +là đúng, điều gì đó là sai và để chương trình của bạn phản hồi cho phù hợp. + +117 +00:07:41,690 --> 00:07:44,390 +Vì vậy, chúng tôi sẽ sử dụng điều này nhiều hơn trong tương lai. + +118 +00:07:44,870 --> 00:07:49,250 +Bây giờ bạn đã thấy rất nhiều kiểu dữ liệu cơ bản, chuỗi, số nguyên, float và boolean, tôi + +119 +00:07:49,250 --> 00:07:50,083 +muốn bạn chuyển + +120 +00:07:50,270 --> 00:07:54,620 +sang bài học tiếp theo, nơi tôi có một bài kiểm tra cho bạn xem bạn đã thực hiện + +121 +00:07:54,620 --> 00:07:58,640 +điều này chưa kiến thức của riêng bạn. Vì vậy, hãy đến với bài kiểm tra và thử đi. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/003 Data Types Quiz.html b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/003 Data Types Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..f7098f40102a85d3816cf39fce2f6eaf04da487a --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/003 Data Types Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/004 Type Error, Type Checking and Type Conversion.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/004 Type Error, Type Checking and Type Conversion.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bd3e0d360452ef8fb950233f2cefa3fb9b93623f --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/004 Type Error, Type Checking and Type Conversion.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1dea9b251330bd938f22525c50bf88c5cc62b933637e8606154d4a238d68199 +size 31171647 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/004 Type Error, Type Checking and Type Conversion_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/004 Type Error, Type Checking and Type Conversion_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6d8380dc231e95124843cbc0589ae42d3f47ab35 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/004 Type Error, Type Checking and Type Conversion_vi.srt @@ -0,0 +1,400 @@ +1 +00:00:00,340 --> 00:00:05,080 +Trước đây, chúng ta đã thấy cách hàm Len cho chúng ta lỗi kiểu khi chúng ta cung cấp cho + +2 +00:00:05,080 --> 00:00:06,880 +nó một số thay vì một chuỗi. + +3 +00:00:07,570 --> 00:00:11,110 +Vì vậy, chúng ta hãy nói một chút về các kiểu dữ liệu và chức năng. + +4 +00:00:11,740 --> 00:00:16,270 +Và cách tôi nghĩ về các chức năng giống như một loại máy móc lạ mắt nào đó mà bạn có thể + +5 +00:00:16,270 --> 00:00:19,690 +thấy trong một nhà máy, phải không? Vì vậy, trong trường hợp này, chúng tôi + +6 +00:00:19,960 --> 00:00:24,460 +có một số loại máy sẽ lấy khoai tây thành khoai tây chiên và chúng tôi không thực sự quan + +7 +00:00:24,460 --> 00:00:25,810 +tâm nó hoạt động như thế + +8 +00:00:26,230 --> 00:00:29,020 +nào, nhưng có lẽ sẽ phải gọt vỏ khoai tây, rửa khoai tây, + +9 +00:00:29,020 --> 00:00:30,070 +cắt nhỏ. , + +10 +00:00:30,460 --> 00:00:34,780 +chiên nó, và cuối cùng trả lại cho chúng tôi dưới dạng đầu ra ở dạng khoai tây chiên. + +11 +00:00:35,410 --> 00:00:39,490 +Và nếu đây là lần đầu tiên bạn xem một trong những hướng dẫn của tôi, ừm, đây có thể là + +12 +00:00:39,580 --> 00:00:43,660 +một cảnh báo về sức khỏe. Tôi nói về thực phẩm rất nhiều. Ừm, vì vậy hãy + +13 +00:00:45,070 --> 00:00:47,020 +chuẩn bị nếu bạn chưa ăn. + +14 +00:00:47,710 --> 00:00:52,710 +Bây giờ giả sử chúng ta lấy cùng một chiếc máy thường xử lý khoai tây và chúng ta + +15 +00:00:52,990 --> 00:00:57,700 +quyết định lấy một tảng đá và chúng ta chỉ chuyển nó qua chức năng, sau đó + +16 +00:00:58,270 --> 00:01:02,170 +chúng ta gặp lỗi, phải không? Về cơ bản đây là những gì đã xảy ra ở đây. + +17 +00:01:02,590 --> 00:01:06,610 +Hàm độ dài này không thích làm việc với số nguyên. + +18 +00:01:07,090 --> 00:01:08,800 +Và bằng cách thực hiện điều này, + +19 +00:01:08,800 --> 00:01:13,800 +chúng ta sẽ gặp lỗi và mã của chúng ta bị hỏng và nó mang lại cho chúng ta điều này, + +20 +00:01:13,840 --> 00:01:14,673 +một lỗi kiểu. + +21 +00:01:14,920 --> 00:01:19,920 +Bây giờ bạn có nhớ trước đây chúng tôi đã có thử thách này, nơi chúng tôi yêu cầu + +22 +00:01:20,110 --> 00:01:24,400 +bạn lấy ô, nhận thông tin đầu vào từ người dùng, tên bạn là gì? + +23 +00:01:24,910 --> 00:01:29,650 +Và sau đó chúng ta sử dụng hàm length để lấy số ký tự + +24 +00:01:29,650 --> 00:01:34,510 +trong tên của chúng. Và hãy lưu nó vào một biến. Hãy gọi + +25 +00:01:34,900 --> 00:01:38,440 +nó, um, num_char bằng cái này. + +26 +00:01:39,040 --> 00:01:44,040 +Và sau đó chúng tôi in tên của bạn có cộng với num_char, số ký tự + ký tự. + +27 +00:01:49,600 --> 00:01:54,600 +Vì vậy, trong trường hợp này, bạn sẽ mong đợi nó nhắc người dùng nhập tên của họ. + +28 +00:01:54,910 --> 00:01:56,800 +Giả sử tôi đã nhập tên + +29 +00:01:57,550 --> 00:02:00,910 +của mình là Angela và độ dài của chuỗi đó sẽ là + +30 +00:02:00,940 --> 00:02:05,770 +6 nên giá trị này sẽ bằng sáu. Và vì vậy điều này sẽ được thay thế ở đây. + +31 +00:02:05,860 --> 00:02:10,150 +Và sau đó với nối chuỗi, chúng tôi kết thúc in "Tên của + +32 +00:02:10,150 --> 00:02:14,380 +bạn có sáu ký tự. “Nhưng đây không phải là điều xảy ra. + +33 +00:02:14,410 --> 00:02:19,090 +Và tôi biết rằng một số bạn có thể đã thử điều này cho thử thách + +34 +00:02:19,090 --> 00:02:21,670 +trước đó và bạn sẽ gặp lỗi loại. + +35 +00:02:22,180 --> 00:02:26,560 +Vì vậy, nó cho bạn biết rằng bạn chỉ có thể nối các chuỗi chứ không + +36 +00:02:26,950 --> 00:02:29,680 +phải các số nguyên. Vì vậy, trong trường + +37 +00:02:29,680 --> 00:02:33,400 +hợp này, chúng tôi đang nối một chuỗi với một số nguyên. + +38 +00:02:33,880 --> 00:02:37,060 +Đây là những gì chúng tôi nhận được. Chúng tôi kết thúc với một lỗi. + +39 +00:02:37,930 --> 00:02:42,930 +Vậy làm cách nào chúng ta có thể ngăn chặn những lỗi kiểu này và làm thế nào chúng ta có thể nhìn thấy kiểu dữ liệu mà + +40 +00:02:43,060 --> 00:02:45,010 +chúng ta đang làm việc? Chà, chúng ta + +41 +00:02:45,010 --> 00:02:48,640 +có thể sử dụng một hàm có tên là type, về cơ bản sẽ + +42 +00:02:49,180 --> 00:02:53,710 +kiểm tra bất cứ thứ gì bạn đặt giữa các dấu ngoặc và cung cấp cho bạn + +43 +00:02:53,740 --> 00:02:56,620 +kiểu dữ liệu của nó. Ví dụ: + +44 +00:02:56,620 --> 00:02:59,830 +nếu tôi tiếp tục và chỉ nhận + +45 +00:02:59,830 --> 00:03:04,660 +xét dòng mã này bị ngắt và tiếp tục và đặt + +46 +00:03:04,750 --> 00:03:09,670 +num_char, vì vậy phần dữ liệu cụ thể này bên trong + +47 +00:03:10,090 --> 00:03:15,090 +hàm kiểu này, và sau đó tôi sẽ in kiểu num_char. + +48 +00:03:16,210 --> 00:03:19,900 +Và bây giờ nếu tôi nhấn run, hãy nhập tên của tôi. + +49 +00:03:20,530 --> 00:03:24,100 +Và bạn có thể thấy nó nói với bạn rằng đây là một số nguyên. + +50 +00:03:24,670 --> 00:03:29,440 +Vì vậy, thêm một chuỗi vào một số nguyên không có ý nghĩa gì, đó là lý do tại + +51 +00:03:29,620 --> 00:03:31,180 +sao bạn gặp lỗi kiểu. + +52 +00:03:32,110 --> 00:03:37,110 +Bây giờ thường xuyên khi bạn đang viết mã và bạn không chắc kiểu dữ liệu của + +53 +00:03:37,720 --> 00:03:40,000 +một thứ gì đó có thể là + +54 +00:03:40,240 --> 00:03:45,240 +gì, thì bạn có thể chỉ cần đặt nó vào bên trong một hàm kiểm tra + +55 +00:03:45,610 --> 00:03:48,940 +kiểu, phải không? Như vậy. Và rồi bạn sẽ nhận được câu trả lời. + +56 +00:03:49,360 --> 00:03:51,760 +Giờ đây, ngoài việc kiểm tra kiểu, chúng tôi cũng + +57 +00:03:52,120 --> 00:03:57,120 +có thể thực hiện chuyển đổi kiểu hoặc bạn có thể nghe nó được gọi là truyền kiểu trong đó chúng tôi + +58 +00:03:58,600 --> 00:04:02,890 +thay đổi một phần dữ liệu từ một kiểu dữ liệu cụ thể này sang kiểu dữ liệu khác. + +59 +00:04:03,430 --> 00:04:04,300 +Vì vậy, + +60 +00:04:04,300 --> 00:04:09,300 +chẳng hạn, chúng ta biết rằng biến num_char này có kiểu dữ liệu là số nguyên. + +61 +00:04:10,750 --> 00:04:15,520 +Nếu chúng ta muốn biến nó thành một chuỗi để dòng mã này không bị đứt + +62 +00:04:15,520 --> 00:04:16,353 +nữa, thì + +63 +00:04:16,480 --> 00:04:20,680 +chúng ta có thể chuyển nó thành một chuỗi bằng cách viết str + +64 +00:04:21,279 --> 00:04:25,960 +và sau đó bên trong dấu ngoặc đơn, chúng ta đặt biến mà chúng ta + +65 +00:04:26,020 --> 00:04:30,310 +muốn chuyển đổi, được gọi là num_char. Và bây giờ chúng ta lưu nó + +66 +00:04:30,340 --> 00:04:33,160 +vào một biến mới, chúng ta sẽ gọi nó là new_num_char. + +67 +00:04:33,910 --> 00:04:38,910 +Và khi chúng ta đã chuyển đổi nó thành một chuỗi và lưu trữ nó dưới tên này, thì + +68 +00:04:39,250 --> 00:04:43,840 +chúng ta có thể sử dụng nó bên trong câu lệnh in của chúng ta, new_num_char và + +69 +00:04:44,320 --> 00:04:49,320 +bây giờ nó sẽ không bị vỡ nữa. Và nó cho chúng tôi biết tên của bạn có sáu ký tự. + +70 +00:04:50,890 --> 00:04:55,210 +Vì vậy, trong trường hợp này, chúng tôi đã lấy một kiểu dữ liệu số nguyên, + +71 +00:04:55,690 --> 00:05:00,690 +đặt nó bên trong dấu ngoặc đơn của một hàm str, lấy một đối tượng ở giữa các dấu + +72 +00:05:01,120 --> 00:05:05,830 +ngoặc đơn và chuyển đổi nó thành một chuỗi, sau đó chúng tôi lưu trữ bên trong new_num_char + +73 +00:05:06,490 --> 00:05:09,010 +này và bây giờ chúng tôi có thể + +74 +00:05:09,100 --> 00:05:14,100 +sử dụng nó trong câu lệnh in của chúng tôi bởi vì tất cả các kiểu dữ liệu của + +75 +00:05:14,290 --> 00:05:19,290 +tất cả các phần dữ liệu mà chúng tôi đang thêm cùng nhau có cùng kiểu dữ liệu, chuỗi. + +76 +00:05:20,740 --> 00:05:24,610 +Bây giờ bạn không bị giới hạn chỉ chuyển đổi số thành chuỗi. + +77 +00:05:24,940 --> 00:05:27,400 +Bạn có thể chuyển đổi nhiều kiểu dữ liệu khác nhau. + +78 +00:05:27,760 --> 00:05:32,760 +Vì vậy, hãy để tôi tiếp tục và nhận xét đoạn mã này và tôi có thể cho bạn thấy + +79 +00:05:33,040 --> 00:05:37,600 +rằng giả sử rằng chúng ta có một biến a, mà chúng ta đặt hai một số, + +80 +00:05:37,870 --> 00:05:39,040 +phải không? 123. + +81 +00:05:39,970 --> 00:05:44,970 +Và nếu tôi kiểm tra kiểu trên a và in ra, bạn sẽ thấy rằng như + +82 +00:05:45,730 --> 00:05:50,020 +bạn mong đợi, nó sẽ cung cấp cho bạn số nguyên, phải không? + +83 +00:05:50,230 --> 00:05:51,670 +A là một số nguyên. + +84 +00:05:52,360 --> 00:05:57,360 +Nhưng bây giờ giả sử tôi đã chuyển đổi a thành một chuỗi bằng cách gói nó bên + +85 +00:05:59,300 --> 00:06:03,710 +trong hàm chuỗi, sau đó nhấn enter. Bạn có thể thấy nó bây giờ thuộc loại chuỗi. + +86 +00:06:05,210 --> 00:06:09,410 +Bây giờ tôi có thể làm điều này với những thứ khác. Vì vậy, ví dụ, tôi có thể biến + +87 +00:06:09,710 --> 00:06:14,710 +toàn bộ số của mình ở đây thành một float và khi tôi chạy mã của mình, bây + +88 +00:06:16,940 --> 00:06:20,630 +giờ chúng tôi thấy rằng loại biến của tôi là float và điều + +89 +00:06:21,050 --> 00:06:23,090 +đó khá đơn giản, phải không? + +90 +00:06:23,420 --> 00:06:26,600 +Nhưng hãy để tôi hỏi bạn hai câu hỏi nhanh trước khi chúng ta kết thúc. + +91 +00:06:26,960 --> 00:06:31,790 +Dòng mã này sẽ in gì? Được rồi, bạn đoán + +92 +00:06:31,850 --> 00:06:36,850 +xem, cái này sẽ in 170. 5 nhưng những gì thực sự xảy ra đằng sau hậu + +93 +00:06:37,730 --> 00:06:42,730 +trường là chúng tôi đang chuyển đổi chuỗi 100 này. 5 thành một số dấu phẩy động và sau + +94 +00:06:45,980 --> 00:06:50,510 +đó chúng tôi sẽ thêm 70 đến 100. 5 và cuối cùng chúng tôi đang in kết quả. + +95 +00:06:50,900 --> 00:06:54,950 +Nhưng dòng này thì sao? Cái gì sẽ in ở đây? Hãy đoán xem. + +96 +00:06:56,840 --> 00:07:01,840 +Chà, lần này chúng ta nhận được 70100. Vì vậy, tóm lại, bạn có thể sử + +97 +00:07:02,120 --> 00:07:06,830 +dụng hàm type để điều tra kiểu dữ liệu mà bạn đang làm việc + +98 +00:07:07,220 --> 00:07:12,220 +và bạn có thể sử dụng các hàm như string, int hoặc float để chuyển đổi + +99 +00:07:12,380 --> 00:07:16,190 +sang kiểu dữ liệu đó. Trong bài học tiếp theo, tôi có một thử thách viết mã cho bạn. + +100 +00:07:16,370 --> 00:07:18,500 +Vì vậy, hãy đến đó và chúng ta sẽ bắt đầu. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 Exercise-5.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 Exercise-5.url new file mode 100644 index 0000000000000000000000000000000000000000..514d83b840e982ff08f2f4068d108639446f6b89 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 Exercise-5.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/705d8881-a95e-48f2-977b-840a5ec3a128 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 How-to-join-Auditorium.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 [Interactive Coding Exercise] Data Types.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 [Interactive Coding Exercise] Data Types.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6e2697db6b15436f9ec25225fe09d598ded3cc8a --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 [Interactive Coding Exercise] Data Types.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b81b78bb8f932f52ff99f034b41c7fc9775a5300752cfe5d27f6be585471422 +size 9782841 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 [Interactive Coding Exercise] Data Types_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 [Interactive Coding Exercise] Data Types_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..51be0844bbb8615dce5df22fc3121f88e5b197af --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/005 [Interactive Coding Exercise] Data Types_vi.srt @@ -0,0 +1,252 @@ +1 +00:00:01,980 --> 00:00:03,150 +Trong bài tập + +2 +00:00:03,150 --> 00:00:07,380 +này, mục tiêu là viết một chương trình cộng các chữ + +3 +00:00:07,380 --> 00:00:10,020 +số của một số có hai chữ số. + +4 +00:00:10,020 --> 00:00:12,390 +Vì vậy, ví dụ, ngay bây giờ + +5 +00:00:12,390 --> 00:00:17,390 +bạn sẽ thấy trong khung nhập liệu có một số và nó là 39. + +6 +00:00:17,790 --> 00:00:22,790 +Bây giờ, sau khi nó được xử lý bằng mã của bạn bên trong main. py, mã của bạn + +7 +00:00:23,370 --> 00:00:27,510 +sẽ in ra giá trị 3+9, bằng + +8 +00:00:27,510 --> 00:00:29,313 +12. + +9 +00:00:30,150 --> 00:00:33,210 +Tìm hiểu cách bạn có thể thực hiện việc này bằng cách sử dụng + +10 +00:00:33,210 --> 00:00:36,750 +những gì bạn đã học về kiểu dữ liệu, đầu vào và chức năng in. + +11 +00:00:36,750 --> 00:00:39,381 +Và khi bạn cho rằng mã của mình đang hoạt + +12 +00:00:39,381 --> 00:00:41,220 +động đúng như yêu cầu, hãy nhấp + +13 +00:00:41,220 --> 00:00:43,803 +vào nút gửi để kiểm tra mã của bạn. + +14 +00:00:49,230 --> 00:00:51,750 +Bây giờ chúng ta phải làm điều này trong một vài bước. + +15 +00:00:51,750 --> 00:00:55,439 +Vì vậy, tôi sẽ hướng dẫn bạn từng bước một. + +16 +00:00:55,439 --> 00:00:59,160 +Bây giờ, làm thế nào chúng ta có thể giữ chữ số đầu + +17 +00:00:59,160 --> 00:01:02,910 +tiên và chữ số thứ hai tách biệt khỏi đầu vào? + +18 +00:01:02,910 --> 00:01:05,310 +Chà, một điều bạn có thể thử là bạn có thể + +19 +00:01:05,310 --> 00:01:08,250 +sử dụng tính năng kiểm tra kiểu để kiểm tra xem + +20 +00:01:08,250 --> 00:01:12,630 +loại dữ liệu tôi đang nhận được thông qua chức năng nhập này là gì? + +21 +00:01:12,630 --> 00:01:15,843 +Tôi có thể nắm được cái gì đây? + +22 +00:01:16,770 --> 00:01:18,270 +Và nếu bạn đã thử điều + +23 +00:01:18,270 --> 00:01:23,163 +đó, bạn sẽ thấy rằng đầu vào có kiểu dữ liệu là một chuỗi. + +24 +00:01:24,270 --> 00:01:26,250 +Những gì chúng ta biết về chuỗi + +25 +00:01:26,250 --> 00:01:29,910 +là chúng ta thấy rằng chúng ta có thể sử dụng dấu ngoặc + +26 +00:01:29,910 --> 00:01:33,205 +vuông sau một chuỗi và đặt vào vị trí của ký tự + +27 +00:01:33,205 --> 00:01:36,753 +trong chuỗi mà chúng ta muốn truy cập. + +28 +00:01:39,240 --> 00:01:44,130 +Nếu chúng ta nhận được biến số có hai chữ số, hãy thêm dấu ngoặc + +29 +00:01:44,130 --> 00:01:48,120 +vuông [ ] sau đó và đặt 0 làm chỉ mục, để lấy ký tự đầu + +30 +00:01:48,120 --> 00:01:51,900 +tiên ra khỏi chuỗi đó< thì chúng ta sẽ kết thúc + +31 +00:01:51,900 --> 00:01:56,313 +bằng số đầu tiên, nhưng dưới dạng một chuỗi . + +32 +00:01:57,690 --> 00:02:00,990 +Vì vậy, phần tiếp theo là chuyển đổi chuỗi + +33 +00:02:00,990 --> 00:02:05,130 +đó thành một kiểu dữ liệu khác, kiểu dữ liệu số. + +34 +00:02:05,130 --> 00:02:07,830 +Và trong trường hợp này, vì đó là số + +35 +00:02:07,830 --> 00:02:12,090 +nguyên mà chúng ta muốn, nên chúng ta có thể chỉ cần sử dụng + +36 +00:02:12,090 --> 00:02:15,900 +hàm int() rồi gói số có hai chữ số đó, truy cập chữ số + +37 +00:02:15,900 --> 00:02:18,960 +đầu tiên vào hàm đó, như thế này. + +38 +00:02:18,960 --> 00:02:21,970 +Vì vậy, bây giờ chúng ta có chữ số đầu tiên là một + +39 +00:02:23,130 --> 00:02:25,530 +số và chúng ta có thể làm điều tương tự + +40 +00:02:25,530 --> 00:02:28,560 +để lấy chữ số thứ hai, nhưng lần này truy cập vào + +41 +00:02:28,560 --> 00:02:32,010 +số có hai chữ số biến đổi đó ở vị trí 1, điều này sẽ cho + +42 +00:02:32,010 --> 00:02:34,083 +chúng ta số thứ hai. + +43 +00:02:35,070 --> 00:02:37,890 +Và bạn có thể in chúng ra chỉ để xác minh và + +44 +00:02:37,890 --> 00:02:41,190 +bạn có thể kiểm tra kiểu dữ liệu của biến số đầu + +45 +00:02:41,190 --> 00:02:43,980 +tiên và chữ số thứ hai, chỉ để đảm bảo rằng + +46 +00:02:43,980 --> 00:02:47,730 +chúng ta hiện đang nắm giữ một số, số này có thể nhân, + +47 +00:02:47,730 --> 00:02:51,510 +trừ, cộng, bất kể số đó là bạn muốn làm gì với nó. + +48 +00:02:51,510 --> 00:02:55,350 +Cuối cùng, chúng ta có thể cộng hai chữ số lại với nhau + +49 +00:02:55,350 --> 00:02:58,170 +bằng cách thêm chữ số đầu tiên vào chữ + +50 +00:02:58,170 --> 00:02:59,913 +số thứ hai rồi in ra. + +51 +00:03:00,990 --> 00:03:03,360 +Tất nhiên bây giờ bạn có thể viết chương trình + +52 +00:03:03,360 --> 00:03:05,220 +này với ít dòng hơn rất nhiều. + +53 +00:03:05,220 --> 00:03:08,100 +Bạn có thể viết tất cả trong một dòng nếu bạn muốn. + +54 +00:03:08,100 --> 00:03:10,470 +Nhưng điều tôi muốn bạn nhớ là luôn + +55 +00:03:10,470 --> 00:03:12,060 +nghĩ về khả năng đọc. + +56 +00:03:12,060 --> 00:03:14,400 +Nếu người khác đến và đọc mã của + +57 +00:03:14,400 --> 00:03:17,880 +bạn, liệu người đó có dễ dàng hiểu được nó hay họ + +58 +00:03:17,880 --> 00:03:19,170 +sẽ phải suy nghĩ và + +59 +00:03:19,170 --> 00:03:22,020 +dành nhiều thời gian để tìm ra nó? + +60 +00:03:22,020 --> 00:03:25,350 +Không tối ưu hóa cho số dòng ít nhất. + +61 +00:03:25,350 --> 00:03:28,860 +Nó được gọi là Code Golf và nó không phải là thứ để bạn khao khát. + +62 +00:03:28,860 --> 00:03:32,130 +Thay vào đó, hãy khao khát tạo ra mã dễ đọc nhất và bạn sẽ có những + +63 +00:03:32,130 --> 00:03:35,030 +đồng nghiệp vui vẻ nhất khi làm việc cùng bạn. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/006 Mathematical Operations in Python.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/006 Mathematical Operations in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..774b18306563e198fd15b66e834da0ae01b2f4e7 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/006 Mathematical Operations in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71e84e2eadf76d562537233d85194ceee0addc6f2845ec1cbc56867225144b80 +size 21987028 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/006 Mathematical Operations in Python_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/006 Mathematical Operations in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..03070f6a7d179f520b7a1308cb5b3f628fcf0480 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/006 Mathematical Operations in Python_vi.srt @@ -0,0 +1,512 @@ +1 +00:00:00,670 --> 00:00:05,670 +Trong bài học trước, chúng ta đã thấy cách chúng ta có thể sử dụng dấu cộng để + +2 +00:00:05,770 --> 00:00:10,770 +nối các chuỗi với nhau hoặc như một phép toán trong đó chúng ta cộng hai số nguyên + +3 +00:00:11,710 --> 00:00:15,370 +hoặc hai số thực, về cơ bản là hai số với nhau. + +4 +00:00:16,390 --> 00:00:20,230 +Trong bài học này, tôi muốn chỉ cho bạn một số toán tử toán + +5 +00:00:20,230 --> 00:00:21,220 +học khác mà + +6 +00:00:21,670 --> 00:00:25,810 +bạn có thể truy cập ngoài việc cộng. Điều hiển nhiên tiếp theo là phép trừ. + +7 +00:00:25,840 --> 00:00:29,080 +Vì vậy, 7 - 3, bạn sẽ chỉ sử dụng dấu trừ, nhưng sau đó khi bạn + +8 +00:00:29,590 --> 00:00:33,130 +thực hiện phép nhân, nó hơi kỳ lạ. Ừm, thay vì sử dụng + +9 +00:00:33,160 --> 00:00:37,060 +x hoặc một số loại ký hiệu thời gian, bạn thực + +10 +00:00:37,390 --> 00:00:38,950 +sự sử dụng asterix. + +11 +00:00:39,070 --> 00:00:43,630 +Vì vậy, bạn sẽ nói một cái gì đó giống như 3 * 2 và đó sẽ là + +12 +00:00:43,630 --> 00:00:44,470 +3 lần 2. + +13 +00:00:45,160 --> 00:00:50,160 +Bây giờ, kết quả cuối cùng là phép chia và điều đó được thực hiện bằng cách sử dụng dấu + +14 +00:00:50,800 --> 00:00:54,820 +gạch chéo lên phía trước, vì vậy 6/3 và khi điều đó in ra, nó + +15 +00:00:54,850 --> 00:00:56,020 +sẽ cho bạn 2. + +16 +00:00:56,830 --> 00:01:00,550 +Bây giờ một điều cần lưu ý ở đây là bất cứ khi nào bạn phân chia + +17 +00:01:01,030 --> 00:01:04,360 +mọi thứ, bạn thực sự luôn kết thúc bằng một số dấu phẩy động. + +18 +00:01:04,450 --> 00:01:07,420 +Vì vậy, bạn có thể thấy mặc dù sáu chia thành ba rõ + +19 +00:01:07,630 --> 00:01:12,630 +ràng, chúng tôi vẫn nhận được 2. 0. Và trên thực tế, nếu tôi kiểm tra + +20 +00:01:14,890 --> 00:01:18,520 +kiểu xung quanh phép chia này, bạn sẽ thấy rằng nó sẽ in float thay vì số nguyên. + +21 +00:01:19,210 --> 00:01:21,880 +Và đây chỉ là một cái gì đó xảy ra với phép chia trong Python. + +22 +00:01:22,420 --> 00:01:26,200 +Nhưng vào cuối ngày, bạn sẽ nhận được kết quả mà bạn cần và nó không + +23 +00:01:26,200 --> 00:01:29,350 +thực sự quan trọng cho dù đó là số thực hay số nguyên. + +24 +00:01:30,220 --> 00:01:35,220 +Bây giờ dấu cuối cùng thực sự hữu ích là hai dấu hoa thị và điều này cho phép + +25 +00:01:35,500 --> 00:01:39,760 +bạn truy cập vào số mũ hoặc khi bạn muốn tăng số lên lũy thừa. + +26 +00:01:40,210 --> 00:01:40,930 +Vì vậy, + +27 +00:01:40,930 --> 00:01:45,930 +ví dụ, nếu bạn muốn nhận một giữ của 2 thành lũy thừa của 2, thì bạn sẽ viết + +28 +00:01:46,270 --> 00:01:51,270 +nó như thế này và 2 cho lũy thừa của 2 tất nhiên về cơ bản chỉ là + +29 +00:01:52,210 --> 00:01:54,040 +2 nhân với 2 sẽ bằng 4. + +30 +00:01:55,600 --> 00:01:58,660 +Bây giờ nếu tôi thay đổi điều này thành 2 thành lũy thừa của + +31 +00:01:58,660 --> 00:02:03,660 +3, thì đó sẽ là 2 nhân 2 lần 2. Vì vậy, đó phải là 8, vân vân và + +32 +00:02:04,360 --> 00:02:05,260 +vân vân. + +33 +00:02:05,890 --> 00:02:09,610 +Việc tích hợp số mũ vào ngôn ngữ là một trong những lý do tại sao Python + +34 +00:02:09,610 --> 00:02:14,610 +thực sự được rất nhiều nhà khoa học dữ liệu và toán học yêu thích bởi vì nó thực sự được tối ưu hóa + +35 +00:02:14,800 --> 00:02:19,300 +theo hướng thao tác và xử lý các con số. Bây giờ, một trong những + +36 +00:02:19,300 --> 00:02:22,510 +điều bạn phải cẩn thận khi thực hiện các + +37 +00:02:22,510 --> 00:02:27,280 +phép toán này là khi bạn có nhiều hơn một phép toán trên cùng + +38 +00:02:27,280 --> 00:02:32,020 +một dòng mã, thì sẽ có một mức độ ưu tiên nhất định. + +39 +00:02:32,710 --> 00:02:37,710 +Vì vậy, một số phép toán như chia hoặc nhân sẽ là hạng nhất, trong + +40 +00:02:37,900 --> 00:02:38,740 +khi các + +41 +00:02:38,770 --> 00:02:42,460 +phép toán khác sẽ kinh tế hơn như cộng và trừ. + +42 +00:02:42,940 --> 00:02:47,140 +Và quy tắc mà bạn có thể nhớ từ thời trung học được gọi + +43 +00:02:47,170 --> 00:02:48,003 +là PEMDAS. + +44 +00:02:48,250 --> 00:02:52,750 +Về cơ bản nó chỉ ra thứ tự ưu tiên là dấu + +45 +00:02:52,780 --> 00:02:56,290 +ngoặc đơn, số mũ, nhân, chia, cộng và trừ. + +46 +00:02:56,800 --> 00:03:01,180 +Vì vậy, những thứ xảy ra đầu tiên là những thứ bên trong dấu ngoặc, sau đó + +47 +00:03:01,630 --> 00:03:05,320 +là số mũ của chúng ta, sau đó là phép nhân và phép chia. + +48 +00:03:05,680 --> 00:03:10,680 +Và cuối cùng, mức độ ưu tiên thấp nhất là phép cộng và phép trừ của chúng ta. + +49 +00:03:11,530 --> 00:03:14,740 +Bây giờ nó hơi lừa dối một chút vì đơn đặt hàng này. + +50 +00:03:14,830 --> 00:03:18,400 +Nó có vẻ giống như thể phép nhân xảy ra trước phép chia, + +51 +00:03:18,850 --> 00:03:21,580 +nhưng thực ra chúng đều quan trọng như nhau. + +52 +00:03:22,150 --> 00:03:24,640 +Và khi thực sự nói đến các phép tính của + +53 +00:03:24,850 --> 00:03:28,360 +bạn, phép tính nằm bên trái nhiều nhất là phép tính sẽ được ưu + +54 +00:03:28,390 --> 00:03:30,280 +tiên giữa phép nhân và phép chia. + +55 +00:03:30,850 --> 00:03:34,120 +Vì vậy, hãy để tôi cung cấp cho bạn một ví dụ thực tế để làm rõ hơn điều này. + +56 +00:03:34,540 --> 00:03:39,540 +Giả sử chúng ta có một dòng mã mà chúng ta muốn nhân + +57 +00:03:39,940 --> 00:03:43,150 +3 * 3 + 3/3 - 3. + +58 +00:03:44,500 --> 00:03:49,500 +Nếu tôi thực thi toàn bộ dòng mã này và in nó ra bảng điều khiển, đây là lúc bạn + +59 +00:03:50,170 --> 00:03:54,670 +chơi lại máy tính và đoán bằng cách sử dụng những gì bạn đã học ở đây, + +60 +00:03:54,670 --> 00:03:56,350 +ừm, chính xác những gì sẽ + +61 +00:03:56,470 --> 00:04:00,190 +được in vì bạn sẽ nhận được một số được in , nó sẽ + +62 +00:04:00,190 --> 00:04:04,990 +tính toán toàn bộ dòng mã này cho bạn. Nhưng thứ tự mới là vấn đề. + +63 +00:04:05,260 --> 00:04:10,260 +Đầu tiên là cộng 3 với 3 rồi nhân kết quả với 3 hay là + +64 +00:04:11,710 --> 00:04:15,610 +đầu tiên sẽ chia cho 3 rồi cộng 3 với nó? + +65 +00:04:15,910 --> 00:04:17,050 +Thứ tự là gì? + +66 +00:04:17,260 --> 00:04:21,760 +Và tôi muốn bạn thực sự tạm dừng video và chơi một chút với nó trên giấy bút + +67 +00:04:21,760 --> 00:04:25,450 +trước khi bạn quay lại và chúng tôi sẽ cho bạn thấy kết quả. + +68 +00:04:28,660 --> 00:04:30,400 +Sử dụng quy tắc của chúng tôi, PEMDAS, + +69 +00:04:30,430 --> 00:04:34,210 +chúng tôi có thể thấy điều đầu tiên xảy ra là những gì nằm trong dấu ngoặc đơn, + +70 +00:04:34,270 --> 00:04:37,480 +vì vậy điều đó không quan trọng. Điều tiếp theo, số mũ của chúng tôi, chúng tôi + +71 +00:04:37,510 --> 00:04:39,040 +thực sự không có số mũ ở đây. + +72 +00:04:39,040 --> 00:04:42,790 +Chúng ta không có 2 so với sức mạnh của 3 hay cái gì đó bằng sức mạnh của bất cứ thứ gì. + +73 +00:04:42,880 --> 00:04:44,140 +Vì vậy, chúng tôi cũng có thể bỏ qua điều đó. + +74 +00:04:44,740 --> 00:04:48,700 +Vì vậy, cấp độ tiếp theo là phép nhân và phép chia. + +75 +00:04:48,940 --> 00:04:52,120 +Và như tôi đã đề cập, chúng đều có tầm quan trọng như nhau. + +76 +00:04:52,450 --> 00:04:57,450 +Vì vậy, 3 * 3 và 3/3 này đều quan trọng như nhau, nhưng + +77 +00:04:58,120 --> 00:05:01,540 +phép tính sẽ đi từ trái sang phải. + +78 +00:05:01,720 --> 00:05:06,220 +Vì vậy, điều đầu tiên chúng ta thấy thực sự là phép nhân. Vì vậy, nếu nó hữu ích + +79 +00:05:06,310 --> 00:05:10,690 +cho bạn, bạn có thể muốn thêm LR vào cuối đoạn ghi nhớ này. + +80 +00:05:10,780 --> 00:05:15,130 +Vì vậy, nó trở thành PEMDASLR, hoặc ít nhất đó là cách tôi nghĩ về nó. + +81 +00:05:15,730 --> 00:05:20,080 +Vì vậy, ngay cả khi đây là phép chia và đây là phép nhân, phép + +82 +00:05:20,500 --> 00:05:23,320 +tính này sẽ luôn được thực hiện đầu tiên. + +83 +00:05:24,190 --> 00:05:28,420 +Quay trở lại câu hỏi tôi đã hỏi bạn, bạn nghĩ con số này sẽ là bao nhiêu? + +84 +00:05:28,900 --> 00:05:33,900 +Hãy tiếp tục và nhận xét tất cả các mã khác và chạy dòng mã này và nó sẽ + +85 +00:05:34,840 --> 00:05:38,890 +cho chúng ta 7. 0. Bây giờ nếu toán học không + +86 +00:05:38,890 --> 00:05:42,130 +phải là điểm mạnh của bạn, đừng lo lắng, nó cũng không phải của tôi và bạn + +87 +00:05:42,130 --> 00:05:46,180 +là kiểu người thích xem nó một cách trực quan. Sau đó, tôi khuyên bạn nên đặt dòng mã + +88 +00:05:46,660 --> 00:05:51,220 +này một lần nữa vào Thonny, sau đó tiếp tục và nhấp vào biểu tượng gỡ lỗi và sau đó + +89 +00:05:51,220 --> 00:05:56,220 +chỉ cần bước vào, vì vậy hãy nhấn F7 hoặc nút này nhiều lần và bạn sẽ thấy nó đánh giá dòng + +90 +00:05:56,290 --> 00:05:57,680 +mã này từng bước -bươc. + +91 +00:05:57,830 --> 00:06:01,520 +Vì vậy, đầu tiên nó nhìn toàn bộ và sau đó nó đi từ trái sang phải. + +92 +00:06:02,120 --> 00:06:07,120 +Và phép tính đầu tiên là 3 * 3 và đó là phép tính sẽ thực hiện + +93 +00:06:07,130 --> 00:06:09,260 +đầu tiên và nó trở thành 9. + +94 +00:06:09,950 --> 00:06:13,670 +Tiếp theo, chúng ta sẽ xem xét dòng mã này và thấy rằng điều quan trọng + +95 +00:06:13,670 --> 00:06:17,120 +nhất tiếp theo là phép chia này ở đây, 3 chia cho 3. + +96 +00:06:17,660 --> 00:06:20,690 +Vì vậy, nó sẽ thực hiện điều đó tiếp theo và điều đó trở thành 1. + +97 +00:06:21,200 --> 00:06:26,200 +Vì vậy, bây giờ 9 + 1 sẽ là điều tiếp theo vì nó nhiều nhất bên trái và + +98 +00:06:26,330 --> 00:06:31,330 +sau đó nó trở thành 10 - 3 và cuối cùng chúng ta nhận được kết quả là 7. + +99 +00:06:32,630 --> 00:06:34,700 +Vì vậy, bây giờ đây là một thách thức khác dành cho bạn. + +100 +00:06:35,240 --> 00:06:39,980 +Làm thế nào bạn có thể thay đổi mã này để thay vì nhận được 7, chúng + +101 +00:06:40,340 --> 00:06:41,570 +tôi nhận được 3? + +102 +00:06:41,990 --> 00:06:46,170 +Làm cách nào bạn có thể thay đổi dòng mã này với những gì bạn biết về PEMDASLR? + +103 +00:06:46,170 --> 00:06:49,520 +Xem nếu bạn có thể tìm ra nó. Tạm dừng video ngay bây giờ. + +104 +00:06:54,110 --> 00:06:57,290 +Được rồi, vì vậy điều này sẽ liên quan đến một chút thử nghiệm và sai sót. + +105 +00:06:57,890 --> 00:07:02,890 +Và công cụ quan trọng nhất mà chúng ta có quyền truy cập là dấu + +106 +00:07:04,400 --> 00:07:08,600 +ngoặc đơn hoặc dấu ngoặc. Điều này có nghĩa là chúng tôi thực sự có thể cô + +107 +00:07:08,630 --> 00:07:12,800 +lập các bit mã của chúng tôi, thường có mức độ ưu tiên rất thấp và biến chúng thành các hoạt động có mức + +108 +00:07:12,800 --> 00:07:15,020 +độ ưu tiên cao hơn. Vì vậy, trong trường hợp + +109 +00:07:15,050 --> 00:07:17,810 +này, chúng ta biết rằng 3 * 3 sẽ xảy ra đầu tiên, + +110 +00:07:18,170 --> 00:07:20,930 +sau đó là phép nhân, sau đó là phép cộng ở bên trái, + +111 +00:07:20,990 --> 00:07:22,310 +và sau đó là phép trừ. + +112 +00:07:22,940 --> 00:07:27,940 +Nhưng nếu chúng ta thêm một tập hợp các dấu ngoặc quanh 3 + 3, thì trong số tất + +113 +00:07:29,450 --> 00:07:31,760 +cả các phép tính này, phép tính cụ thể + +114 +00:07:32,180 --> 00:07:36,440 +này đột nhiên trở thành mức độ ưu tiên cao nhất và nó sẽ xảy ra + +115 +00:07:36,440 --> 00:07:37,273 +đầu tiên. + +116 +00:07:37,640 --> 00:07:42,640 +Vì vậy, nếu tôi thay đổi những gì tôi có trong Thonny sang phiên bản mới của chúng tôi và tiếp + +117 +00:07:43,100 --> 00:07:43,820 +tục gỡ + +118 +00:07:43,820 --> 00:07:48,020 +lỗi thông qua nó, phép tính đầu tiên mà nó sẽ thực hiện là 3 + 3 này + +119 +00:07:48,020 --> 00:07:50,720 +bên trong dấu ngoặc và chúng tôi kết thúc bằng 6. + +120 +00:07:51,170 --> 00:07:53,690 +Vì vậy, sau đó nó sẽ đi một lần nữa từ + +121 +00:07:53,690 --> 00:07:55,910 +trái sang phải, ưu tiên nhân và chia. + +122 +00:07:56,240 --> 00:08:01,240 +Vậy thì 3 * 6 là 18. 18/3 là 6. 6 - + +123 +00:08:02,630 --> 00:08:06,500 +3 là 3. Chỉ bằng cách cô lập các + +124 +00:08:06,890 --> 00:08:11,890 +phép tính nhất định, bạn có thể nâng nó lên ngay đầu danh sách ưu tiên và bạn + +125 +00:08:11,900 --> 00:08:14,300 +sẽ có thể thực hiện phép tính mình cần. + +126 +00:08:15,530 --> 00:08:19,250 +Bây giờ bạn đã học được rất nhiều về tính toán và thực hiện + +127 +00:08:19,250 --> 00:08:23,060 +các phép toán bằng Python, tôi có một thử thách mã khác dành cho bạn. + +128 +00:08:23,180 --> 00:08:26,060 +Vì vậy, hãy đến với bài học tiếp theo và bạn sẽ có thể khám phá nó ở đó. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 Exercise-6.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 Exercise-6.url new file mode 100644 index 0000000000000000000000000000000000000000..08db91b9874d1bc6b6c5a16036b8159f9d460716 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 Exercise-6.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/3c6091ed-ef4e-4247-82ae-167a2cb5208f \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 How-to-join-Auditorium.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 [Interactive Coding Exercise] BMI Calculator.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 [Interactive Coding Exercise] BMI Calculator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bc30feec693948dfb0be56a5a97eb4a4ea4b2aad --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 [Interactive Coding Exercise] BMI Calculator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78366f3c9e41f03502f71e81b2e0dbff3ca058633a629f9f8d71ab4643097b35 +size 18708243 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 [Interactive Coding Exercise] BMI Calculator_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 [Interactive Coding Exercise] BMI Calculator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2ee3439a76c043a921cddacf115b2a157f5e5188 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/007 [Interactive Coding Exercise] BMI Calculator_vi.srt @@ -0,0 +1,472 @@ +1 +00:00:02,340 --> 00:00:03,600 +Trong bài tập này, + +2 +00:00:03,600 --> 00:00:05,790 +chúng ta sẽ viết một chương trình + +3 +00:00:05,790 --> 00:00:09,420 +tính Chỉ số khối cơ thể của một người dựa trên cân nặng + +4 +00:00:09,420 --> 00:00:12,210 +và chiều cao của người dùng. + +5 +00:00:12,210 --> 00:00:14,310 +Vì vậy, nếu bạn nhìn vào khung mô + +6 +00:00:14,310 --> 00:00:17,850 +tả, bạn sẽ thấy liên kết tới trang Wikipedia về BMI. + +7 +00:00:17,850 --> 00:00:20,550 +Và nếu bạn nhấp vào đó, bạn có thể tìm hiểu thêm + +8 +00:00:20,550 --> 00:00:24,810 +một chút về chỉ số khối cơ thể là gì và nó được sử dụng như thế nào. + +9 +00:00:24,810 --> 00:00:27,150 +Nhưng về cơ bản, đó là cách để chúng + +10 +00:00:27,150 --> 00:00:29,220 +tôi đo cân nặng của một người có + +11 +00:00:29,220 --> 00:00:31,200 +tính đến chiều cao của họ. + +12 +00:00:31,200 --> 00:00:33,330 +Vì vậy, ví dụ, nếu một người cao + +13 +00:00:33,330 --> 00:00:36,180 +và một người thấp đều có cân nặng như nhau + +14 +00:00:36,180 --> 00:00:41,180 +thì trong hầu hết các trường hợp, người thấp hơn sẽ thừa cân nhiều hơn. + +15 +00:00:41,280 --> 00:00:44,190 +Công thức tính chỉ số BMI là chia + +16 +00:00:44,190 --> 00:00:48,450 +cân nặng của một người, tính bằng kilogam, + +17 +00:00:48,450 --> 00:00:53,450 +cho bình phương chiều cao, tính bằng mét. + +18 +00:00:53,640 --> 00:00:57,150 +Đây là chiều cao nhân với chiều cao, + +19 +00:00:57,150 --> 00:00:59,460 +sau đó lấy giá trị đó và + +20 +00:00:59,460 --> 00:01:02,910 +chia cân nặng cho giá trị đó. + +21 +00:01:02,910 --> 00:01:05,970 +Bây giờ, nếu bạn không quen với ký hiệu + +22 +00:01:05,970 --> 00:01:09,660 +toán học về cách tính chỉ số BMI trong công thức + +23 +00:01:09,660 --> 00:01:13,560 +ở khung mô tả, thì hãy tra cứu trên Google để biết + +24 +00:01:13,560 --> 00:01:17,310 +các cách khác để biểu thị công thức này. + +25 +00:01:17,310 --> 00:01:18,840 +Nhưng điều rất quan + +26 +00:01:18,840 --> 00:01:21,510 +trọng là đầu vào phải đúng đơn vị. + +27 +00:01:21,510 --> 00:01:25,980 +Vì vậy, trong trường hợp này, đó là đơn vị hệ mét, kilôgam và mét. + +28 +00:01:25,980 --> 00:01:30,210 +Và mục tiêu là có thể in ra chỉ số BMI bằng cách sử dụng bất + +29 +00:01:30,210 --> 00:01:32,850 +kỳ thông tin đầu vào tiềm năng nào, + +30 +00:01:32,850 --> 00:01:34,890 +trong đó đầu vào đầu tiên là + +31 +00:01:34,890 --> 00:01:37,140 +chiều cao và đầu vào thứ hai là + +32 +00:01:37,140 --> 00:01:40,200 +cân nặng, tính bằng mét và kilôgam. + +33 +00:01:40,200 --> 00:01:41,370 +Bây giờ, một điều + +34 +00:01:41,370 --> 00:01:44,910 +cần lưu ý là trong các thử nghiệm của chúng tôi cho bài + +35 +00:01:44,910 --> 00:01:49,910 +tập này, chúng tôi mong đợi chỉ số BMI sẽ được in ra dưới dạng số nguyên. + +36 +00:01:49,920 --> 00:01:51,720 +Vì vậy, hãy suy nghĩ xem bạn cần + +37 +00:01:51,720 --> 00:01:54,000 +phải làm gì để thực hiện được điều đó. + +38 +00:01:54,000 --> 00:01:56,340 +Nếu không, khi bạn nhấp vào GỬI, câu + +39 +00:01:56,340 --> 00:02:00,270 +trả lời của bạn có thể không khớp với kết quả mong đợi. + +40 +00:02:00,270 --> 00:02:02,880 +Hãy xem liệu bạn có thể tạo chương trình này không. + +41 +00:02:02,880 --> 00:02:07,170 +Bạn luôn có thể dùng Google để tìm Máy tính chỉ số khối cơ thể và kiểm tra + +42 +00:02:07,170 --> 00:02:10,410 +kết quả của bạn với kết quả của họ để tìm hiểu xem bạn có + +43 +00:02:10,410 --> 00:02:12,330 +sai ở đâu hay không hoặc liệu bạn + +44 +00:02:12,330 --> 00:02:14,760 +có cần thay đổi mã của mình hay không. + +45 +00:02:14,760 --> 00:02:16,590 +Vì vậy, chúc may mắn, và hãy thử đi. + +46 +00:02:16,590 --> 00:02:19,440 +Chúng ta sẽ cùng nhau tìm hiểu giải pháp ở slide tiếp theo. + +47 +00:02:23,280 --> 00:02:28,080 +Bây giờ, điều đầu tiên chúng ta muốn làm là chuyển đổi các số mà chúng + +48 +00:02:28,080 --> 00:02:30,570 +ta nhận được thông qua dữ liệu đầu + +49 +00:02:30,570 --> 00:02:33,480 +vào thành các số mà chúng ta có thể làm việc + +50 +00:02:33,480 --> 00:02:36,360 +và thực hiện các phép toán. + +51 +00:02:36,360 --> 00:02:38,700 +Vì vậy, điều đó có nghĩa là ở dòng + +52 +00:02:38,700 --> 00:02:42,780 +4, bạn sẽ thấy rằng tôi đã tạo biến Weight_as_integer + +53 +00:02:42,780 --> 00:02:47,780 +để lưu trữ trọng số đầu vào dưới dạng một số nguyên. + +54 +00:02:48,240 --> 00:02:52,800 +Vì vậy, trong trường hợp này, tôi đang chuyển đổi, trong ví dụ, + +55 +00:02:52,800 --> 00:02:57,800 +nhập 69 thành một số mà tôi có thể nhân hoặc cộng và sử dụng sau này. + +56 +00:02:59,250 --> 00:03:03,990 +Ở dòng 5, tôi đang chuyển đổi chiều cao sắp tới thành chiều + +57 +00:03:03,990 --> 00:03:05,820 +cao tính bằng mét. + +58 +00:03:05,820 --> 00:03:10,110 +Và bởi vì không ai trong chúng ta có một hoặc hai mét, nên chúng ta + +59 +00:03:10,110 --> 00:03:12,240 +thường ở đâu đó ở giữa hai mét. + +60 +00:03:12,240 --> 00:03:15,990 +Điều này thường được biểu diễn dưới dạng số dấu phẩy động. + +61 +00:03:15,990 --> 00:03:18,480 +Vì vậy, có một dấu thập phân trong đó. + +62 +00:03:18,480 --> 00:03:22,080 +Ví dụ: tôi cao 1 mét 79 + +63 +00:03:22,080 --> 00:03:25,980 +thì sẽ là 1. 79 mét. + +64 +00:03:25,980 --> 00:03:28,260 +Trong trường hợp này, chúng tôi sẽ chuyển + +65 +00:03:28,260 --> 00:03:30,000 +đổi đầu vào đó thành một kiểu + +66 +00:03:30,000 --> 00:03:32,790 +dữ liệu khác, một kiểu có thể lưu trữ vị trí thập + +67 +00:03:32,790 --> 00:03:35,400 +phân và đó là "kiểu dữ liệu float". + +68 +00:03:35,400 --> 00:03:39,540 +Vì vậy, chúng ta bọc float xung quanh biến chiều cao và chúng ta + +69 +00:03:39,540 --> 00:03:43,920 +có thể biến đầu vào đó thành 1. 63 trong dữ liệu đầu vào mẫu thành + +70 +00:03:43,920 --> 00:03:47,190 +số dấu phẩy động, số này có thể được sử dụng lại + +71 +00:03:47,190 --> 00:03:51,060 +trong các phép tính của chúng tôi sau này. + +72 +00:03:51,060 --> 00:03:55,800 +Chúng ta có thể tính chỉ số BMI bằng nhiều phương pháp khác nhau. + +73 +00:03:55,800 --> 00:03:58,560 +Một phương pháp và có lẽ là phương pháp ngắn + +74 +00:03:58,560 --> 00:04:01,590 +nhất, nhưng sẽ cần phải tra cứu trên Google + +75 +00:04:01,590 --> 00:04:06,590 +một chút, đó là tìm ra cách sử dụng toán tử số mũ (**) trong Python. + +76 +00:04:07,140 --> 00:04:08,880 +Bây giờ, chúng ta chưa nói về + +77 +00:04:08,880 --> 00:04:11,730 +vấn đề này, nhưng sẽ tốt hơn nếu bạn làm quen với + +78 +00:04:11,730 --> 00:04:14,790 +ý tưởng rằng có nhiều cách để thực hiện mọi việc. + +79 +00:04:14,790 --> 00:04:16,620 +Và chỉ vì bạn làm khác đi + +80 +00:04:16,620 --> 00:04:18,570 +không có nghĩa là nó sai. + +81 +00:04:18,570 --> 00:04:21,930 +Vì vậy tôi muốn giới thiệu cho bạn nhiều cách. + +82 +00:04:21,930 --> 00:04:26,930 +Bây giờ, toán tử số mũ tương đương với một phép toán trong đó bạn + +83 +00:04:27,270 --> 00:04:29,310 +thấy số có siêu chữ số đó, + +84 +00:04:29,310 --> 00:04:31,740 +vì vậy số nhỏ ở trên cùng. + +85 +00:04:31,740 --> 00:04:36,360 +Trong trường hợp này, chúng ta cần bình phương chiều cao, nghĩa + +86 +00:04:36,360 --> 00:04:39,540 +là nhân chiều cao với chính nó, hoặc trong + +87 +00:04:39,540 --> 00:04:42,420 +toán học, điều này được gọi là nâng chiều + +88 +00:04:42,420 --> 00:04:44,670 +cao lên lũy thừa hai. + +89 +00:04:44,670 --> 00:04:45,960 +Và chúng ta có thể làm điều + +90 +00:04:45,960 --> 00:04:48,360 +đó trong Python bằng toán tử dấu hoa thị kép. + +91 +00:04:48,360 --> 00:04:50,880 +Vì vậy, chiều cao dưới dạng phao, hai dấu hoa + +92 +00:04:50,880 --> 00:04:55,410 +thị và sau đó là số hai (height_as_float **2) sẽ bình phương chiều cao. + +93 +00:04:55,410 --> 00:04:56,730 +Và tất cả những gì chúng ta + +94 +00:04:56,730 --> 00:04:59,370 +phải làm là lấy cân nặng chia cho bình phương chiều + +95 +00:04:59,370 --> 00:05:01,113 +cao, và chúng ta sẽ có chỉ số BMI. + +96 +00:05:03,270 --> 00:05:08,130 +Một cách khác để làm điều này là sử dụng dấu ngoặc đơn. + +97 +00:05:08,130 --> 00:05:10,200 +Bạn có thể nhớ môn toán ở trường + +98 +00:05:10,200 --> 00:05:12,240 +trung học, ở Mỹ nó được gọi là PEDMAS + +99 +00:05:12,240 --> 00:05:14,910 +và ở Anh nó được gọi là BODMAS, nhưng dấu + +100 +00:05:14,910 --> 00:05:19,170 +ngoặc luôn đứng trước bất kỳ phép tính nào khác. + +101 +00:05:19,170 --> 00:05:21,510 +Trong trường hợp này, chúng ta không thể chỉ + +102 +00:05:21,510 --> 00:05:23,610 +đơn giản viết cân nặng chia cho chiều cao + +103 +00:05:23,610 --> 00:05:26,460 +nhân với chiều cao, bởi vì phép tính đầu tiên sẽ được + +104 +00:05:26,460 --> 00:05:28,140 +tính là cân nặng chia cho chiều + +105 +00:05:28,140 --> 00:05:30,930 +cao và nó sẽ cho chúng ta những câu trả lời sai. + +106 +00:05:30,930 --> 00:05:34,860 +Nhưng bằng cách gói chiều cao nhân với chiều cao trong một tập hợp + +107 +00:05:34,860 --> 00:05:39,030 +dấu ngoặc đơn, chúng tôi đảm bảo rằng một phần của thao tác được thực + +108 +00:05:39,030 --> 00:05:40,650 +hiện trước, sau đó chúng tôi + +109 +00:05:40,650 --> 00:05:43,800 +lấy kết quả rồi chia trọng số cho kết quả. + +110 +00:05:43,800 --> 00:05:48,180 +Nhiều khả năng đây là cách bạn có thể giải quyết vấn đề + +111 +00:05:48,180 --> 00:05:49,770 +này, nhưng có thể bạn + +112 +00:05:49,770 --> 00:05:52,590 +đã gặp lỗi do quên dấu ngoặc đơn. + +113 +00:05:52,590 --> 00:05:54,663 +Vì vậy đây là điều cần lưu ý. + +114 +00:05:55,620 --> 00:05:59,670 +Cuối cùng, chúng ta có thể chuyển đổi chỉ số BMI thành + +115 +00:05:59,670 --> 00:06:02,490 +một số nguyên, do đó hãy làm tròn nó nếu + +116 +00:06:02,490 --> 00:06:06,120 +cần thiết và sau đó chúng ta in ra kết quả. + +117 +00:06:06,120 --> 00:06:09,390 +Và điều này sẽ cho phép chúng ta vượt qua các bài + +118 +00:06:09,390 --> 00:06:11,073 +kiểm tra ở slide trước. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/008 Number Manipulation and F Strings in Python.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/008 Number Manipulation and F Strings in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b01eaac6f5c4a3d92acaf8b073154b866c878b62 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/008 Number Manipulation and F Strings in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27fa0380227ce5a6e8752f5044b48f1d4daa0b886a7621d1e196de2770d20eb3 +size 27130963 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/008 Number Manipulation and F Strings in Python_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/008 Number Manipulation and F Strings in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cf091f67079b8ffbd1fe5a7881f96091d5258be3 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/008 Number Manipulation and F Strings in Python_vi.srt @@ -0,0 +1,452 @@ +1 +00:00:00,310 --> 00:00:03,670 +Trong thử thách cuối cùng mà chúng tôi tính chỉ số BMI, bạn + +2 +00:00:04,090 --> 00:00:09,090 +đã thấy như thế nào khi chúng tôi có một số có một danh sách dài các số sau dấu + +3 +00:00:09,970 --> 00:00:11,440 +thập phân. Ví + +4 +00:00:11,440 --> 00:00:16,440 +dụ: nếu tôi đã chia 8 cho 3 và tôi in nó ra, bạn + +5 +00:00:17,650 --> 00:00:22,650 +sẽ thấy rằng giá trị là 2. 666666 và nếu chúng ta vừa biến số + +6 +00:00:25,180 --> 00:00:30,070 +8 chia 3 thành một số nguyên, ngay bây giờ nó là một số dấu phẩy động, nhưng + +7 +00:00:30,400 --> 00:00:33,190 +nếu tôi chuyển nó thành một số nguyên, bạn sẽ + +8 +00:00:33,580 --> 00:00:37,690 +thấy rằng tất cả những gì nó làm chỉ là cắt bỏ mọi thứ sau + +9 +00:00:37,690 --> 00:00:40,450 +số thập phân. điểm. Thay vì những gì chúng + +10 +00:00:40,510 --> 00:00:43,060 +ta thường làm theo cách truyền thống, đó là làm tròn số. + +11 +00:00:43,510 --> 00:00:48,510 +Vì vậy, nếu nó là 2. 5 nó sẽ chuyển thành 3, nếu nó là 2. 4 nó sẽ giảm xuống 2. + +12 +00:00:49,630 --> 00:00:53,410 +Giờ đây trong Python, việc làm tròn số trở nên cực kỳ dễ dàng. + +13 +00:00:53,800 --> 00:00:58,180 +Tất cả những gì bạn phải làm là sử dụng hàm tròn như thế này. + +14 +00:00:58,870 --> 00:01:03,010 +Nếu chúng ta viết vòng (8/3) thì nó sẽ làm tròn thành một số nguyên + +15 +00:01:03,010 --> 00:01:07,330 +và bạn sẽ thấy rằng thay vì 2, chúng ta thực sự nhận được 3 + +16 +00:01:07,360 --> 00:01:10,240 +bây giờ vì 2. 6 lặp lại trở thành 3. + +17 +00:01:11,170 --> 00:01:14,440 +Bây giờ nếu bạn muốn, bạn thực sự có thể tiến thêm một bước nữa. + +18 +00:01:14,470 --> 00:01:19,330 +Bạn có thể chỉ định số lượng chữ số chính xác mà bạn muốn làm tròn. + +19 +00:01:19,720 --> 00:01:22,990 +Vì vậy, nếu tôi nói tôi muốn làm tròn nó đến hai + +20 +00:01:23,440 --> 00:01:28,440 +chữ số thập phân, thì tôi có thể viết (8/3, 2) và sau đó là số vị trí mà tôi + +21 +00:01:28,570 --> 00:01:29,680 +muốn xung quanh nó. + +22 +00:01:30,280 --> 00:01:35,280 +Vì vậy, bây giờ của chúng tôi 2. 666 lặp lại trở thành 2. 67 bởi vì tôi đã nói chúng ta nên làm + +23 +00:01:37,570 --> 00:01:40,510 +tròn nó đến 2 chữ số thập phân. Vì vậy, nếu nó làm cho nó dễ dàng hơn, + +24 +00:01:40,540 --> 00:01:42,400 +nó có thể dễ dàng hơn nếu tôi viết nó như thế này. + +25 +00:01:42,790 --> 00:01:47,560 +Vì vậy, 2. 666666666 và tôi sẽ làm tròn nó đến hai chữ số + +26 +00:01:47,890 --> 00:01:49,510 +thập phân và một lần nữa, + +27 +00:01:49,600 --> 00:01:54,600 +tôi nhận được cùng một kết quả, 2. 67. Giờ đây, một cách khác + +28 +00:01:55,990 --> 00:01:59,470 +để sửa đổi các con số là thay vì chia, chẳng hạn như + +29 +00:01:59,980 --> 00:02:02,830 +8/3, chúng ta cũng có thể sử dụng phép chia tầng, + +30 +00:02:02,860 --> 00:02:05,980 +để bạn có hai mi về phía trước thay vì chỉ một. + +31 +00:02:06,550 --> 00:02:10,210 +Bây giờ chúng ta biết rằng bất cứ khi nào chúng ta chia bất kỳ số nào cho + +32 +00:02:10,240 --> 00:02:13,780 +bất kỳ số nào khác, kết quả luôn được chuyển thành một số dấu phẩy động. + +33 +00:02:14,380 --> 00:02:17,230 +Bây giờ nếu bạn không muốn điều đó và bạn chỉ muốn một số + +34 +00:02:17,380 --> 00:02:20,770 +nguyên, vì vậy một số nguyên cắt bỏ tất cả các số sau số thập phân ở vị + +35 +00:02:21,130 --> 00:02:23,860 +trí, bạn chỉ có thể sử dụng phép chia tầng như thế này. + +36 +00:02:24,430 --> 00:02:28,930 +Và trong trường hợp này, bạn sẽ nhận được 2 ngay lập tức mà không cần phải chuyển nó + +37 +00:02:28,930 --> 00:02:31,420 +thành một số nguyên. Và trên thực tế, + +38 +00:02:31,750 --> 00:02:36,750 +nếu tôi tiếp tục và kiểm tra kiểu dữ liệu của kết quả của phép tính này, + +39 +00:02:37,450 --> 00:02:39,940 +bạn sẽ thấy rằng nó thực sự là + +40 +00:02:40,420 --> 00:02:45,340 +một số nguyên trong khi nếu tôi chỉ sử dụng phép chia dấu gạch chéo đơn, um, + +41 +00:02:45,760 --> 00:02:49,570 +thì tôi nhận được dấu phẩy động số có chữ số thập phân. + +42 +00:02:50,230 --> 00:02:53,860 +Ngay cả khi đây là một phép chia rõ ràng, chẳng hạn + +43 +00:02:54,580 --> 00:02:59,580 +như 4/2, thì đây vẫn sẽ trở thành một số dấu phẩy động và con số sẽ được + +44 +00:03:01,000 --> 00:03:04,630 +biểu diễn như thế này, 2. 0, như vậy. + +45 +00:03:05,890 --> 00:03:10,890 +Bây giờ nếu chúng ta đã lưu kết quả của phép tính này vào một biến thay thế, + +46 +00:03:12,370 --> 00:03:17,370 +thì một trong những điều bạn thực sự có thể làm là tiếp tục thực hiện các + +47 +00:03:17,950 --> 00:03:21,040 +phép tính trên biến này. Vì vậy, ví + +48 +00:03:21,220 --> 00:03:23,110 +dụ, tôi có thể + +49 +00:03:23,440 --> 00:03:28,120 +làm 4/2, tương đương với 2. Nhưng sau đó nếu tôi muốn chia nó một lần + +50 +00:03:28,120 --> 00:03:28,953 +nữa cho 2, + +51 +00:03:29,020 --> 00:03:34,020 +tôi thực sự có thể nói kết quả / = 2. Và khi bây giờ tôi in kết + +52 +00:03:38,380 --> 00:03:43,380 +quả, tôi sẽ thực sự nhận được 1 vì nó là 4/2 rồi + +53 +00:03:44,440 --> 00:03:48,490 +lại chia cho 2. Bây giờ rất thường xuyên khi bạn + +54 +00:03:48,730 --> 00:03:52,780 +đang viết mã, chẳng hạn như nếu bạn đang theo dõi điểm của người dùng, + +55 +00:03:53,170 --> 00:03:57,370 +vì vậy bạn có thể có điểm = 0 để bắt đầu và mỗi lần + +56 +00:03:57,370 --> 00:04:00,700 +trong mã của bạn nói rằng một người dùng ghi được một + +57 +00:04:01,090 --> 00:04:04,480 +điểm, thì bạn có thể nắm bắt lại biến điểm này và + +58 +00:04:04,750 --> 00:04:09,430 +thay vì nói điểm bây giờ bằng giá trị trước đó của điểm cộng với một, bạn + +59 +00:04:09,790 --> 00:04:12,820 +có thể chỉ cần sử dụng tốc ký này, + + +60 +00:04:13,240 --> 00:04:17,260 +=, vì vậy + = 1. Và bây giờ khi chúng tôi in + +61 +00:04:17,560 --> 00:04:20,140 +điểm, bạn sẽ thấy rằng nó thực sự bằng 1. + +62 +00:04:21,370 --> 00:04:25,120 +Vì vậy, thay vì sử dụng + =, bạn có thể + +63 +00:04:25,180 --> 00:04:29,920 +sử dụng - =, chỉ lấy phiên bản trước của điểm và xóa 1 khỏi nó. + +64 +00:04:30,460 --> 00:04:32,980 +* = và / =. + +65 +00:04:33,190 --> 00:04:37,600 +Vì vậy, điều này thực sự hữu ích khi bạn phải thao tác một giá trị dựa trên giá trị trước đó + +66 +00:04:37,600 --> 00:04:40,360 +của nó, điều mà bạn sẽ phải làm rất nhiều trong lập trình. + +67 +00:04:41,440 --> 00:04:46,300 +Bây giờ điều cuối cùng tôi muốn cho bạn thấy là một cái gì đó được gọi là chuỗi F + +68 +00:04:46,300 --> 00:04:51,300 +và điều này làm cho nó thực sự dễ dàng để trộn các chuỗi và các kiểu dữ liệu khác nhau. + +69 +00:04:51,910 --> 00:04:53,710 +Cho đến thời điểm này, nếu + +70 +00:04:54,190 --> 00:04:59,190 +chúng tôi muốn in, uhm, một cái gì đó giống như điểm của bạn, và sau đó chúng tôi muốn + +71 +00:05:00,670 --> 00:05:03,760 +in điểm chúng tôi phải viết cộng, nhưng tất nhiên vì đây + +72 +00:05:04,030 --> 00:05:06,310 +là các kiểu dữ liệu khác nhau, đây là + +73 +00:05:06,310 --> 00:05:09,940 +một chuỗi và đây là một số nguyên, chúng tôi đã gặp lỗi kiểu. + +74 +00:05:10,510 --> 00:05:15,510 +Vì vậy, chúng tôi đã phải chuyển đổi nó thành một chuỗi trước khi nó thực sự in thành + +75 +00:05:16,480 --> 00:05:18,880 +công khi cả hai kiểu dữ liệu khớp nhau. + +76 +00:05:19,600 --> 00:05:24,600 +Bây giờ điều này khá khó khăn và dễ hiểu là rất nhiều lập trình viên sẽ cần + +77 +00:05:25,270 --> 00:05:29,830 +một số cách thuận tiện hơn một chút để kết hợp những thứ có các kiểu + +78 +00:05:29,830 --> 00:05:33,880 +dữ liệu khác nhau. Giả sử um, số điểm bằng không. Ừm, giả + +79 +00:05:33,910 --> 00:05:38,910 +sử chiều cao bằng 1. 8 và isWinning bằng true. + +80 +00:05:41,200 --> 00:05:44,800 +Vì vậy, ở đây chúng tôi có một số nguyên, một float và + +81 +00:05:44,860 --> 00:05:49,450 +một boolean, và chúng tôi muốn trộn tất cả chúng thành một câu là một chuỗi và + +82 +00:05:49,450 --> 00:05:50,140 +in ra. + +83 +00:05:50,140 --> 00:05:55,140 +Vì vậy, thay vì phải chuyển đổi tất cả những thứ này và sử dụng một loạt các dấu + +84 +00:05:55,390 --> 00:05:59,600 +cộng và sau đó bạn phải chuyển đổi mọi thứ thành một chuỗi, nó thực + +85 +00:06:00,110 --> 00:06:02,120 +sự rất, rất đau đớn, phải không? + +86 +00:06:02,420 --> 00:06:07,420 +Vì vậy, những gì chúng ta có thể làm thay vào đó là sử dụng một thứ gì đó trong Python được gọi là chuỗi F. + +87 +00:06:10,850 --> 00:06:15,850 +Và khi một chuỗi F cho phép chúng tôi thực hiện ở phía trước một chuỗi như thế này, chúng tôi + +88 +00:06:17,120 --> 00:06:20,930 +nhập ký tự 'f' và điều thực sự quan trọng là nó đứng trước dấu ngoặc + +89 +00:06:20,930 --> 00:06:24,740 +kép hoặc dấu ngoặc đơn nếu bạn muốn viết chuỗi của mình. như thế này. + +90 +00:06:25,220 --> 00:06:29,240 +Nhưng tôi thích sử dụng dấu ngoặc kép và nhiều lập trình viên Python khác cũng vậy. + +91 +00:06:29,600 --> 00:06:34,600 +Vì vậy, về cơ bản bạn chỉ thêm ký tự f vào trước chuỗi, và bây giờ + +92 +00:06:35,420 --> 00:06:40,420 +đây là một chuỗi F và bạn có thể bắt đầu thêm các giá trị khác nhau + +93 +00:06:40,970 --> 00:06:43,040 +vào chuỗi này. Vì vậy, ví + +94 +00:06:43,340 --> 00:06:47,210 +dụ, nếu tôi muốn viết, điểm của bạn bằng điểm của biến này, thì + +95 +00:06:47,630 --> 00:06:52,520 +tôi có thể đặt biến đó bên trong một tập hợp các dấu ngoặc nhọn như thế này. + +96 +00:06:53,270 --> 00:06:58,010 +Và bây giờ khi tôi in chuỗi của mình, chuỗi này ngay tại đây, bạn sẽ thấy + +97 +00:06:58,400 --> 00:07:03,400 +rằng nó cho biết điểm của bạn là 0 và nó thực hiện tất cả chuyển đổi và + +98 +00:07:03,980 --> 00:07:07,430 +tất cả những thứ đằng sau hậu trường và bạn không phải + +99 +00:07:07,430 --> 00:07:11,450 +lo lắng về bất kỳ đây. Vì vậy, nếu tôi muốn tiếp tục, tôi + +100 +00:07:11,480 --> 00:07:13,250 +có thể nói rằng điểm + +101 +00:07:13,790 --> 00:07:18,790 +của bạn là thế này, chiều cao của bạn là thêm chiều cao và sau đó bạn chiến + +102 +00:07:24,830 --> 00:07:26,750 +thắng là hãy thêm giá trị boolean + +103 +00:07:28,850 --> 00:07:30,770 +cuối cùng đó và bắt nó chạy. + +104 +00:07:31,130 --> 00:07:34,310 +Bạn có thể thấy rằng toàn bộ chuỗi của chúng tôi bây giờ in ra điểm của bạn + +105 +00:07:34,550 --> 00:07:37,460 +là 0, chiều cao của bạn là 1. 8 bạn đang thắng là Đúng. + +106 +00:07:37,910 --> 00:07:42,910 +Vì vậy, tất cả các kiểu dữ liệu khác nhau này đã được kết hợp thành một chuỗi bằng cách + +107 +00:07:43,580 --> 00:07:48,580 +sử dụng F ở trước chuỗi và sau đó sử dụng các dấu ngoặc nhọn này để đặt các biến + +108 +00:07:49,640 --> 00:07:52,940 +của chúng ta vào chuỗi này. Bằng cách sử dụng chuỗi f, + +109 +00:07:52,940 --> 00:07:57,940 +bạn cắt giảm rất nhiều công việc thủ công khi chèn các kiểu dữ liệu khác nhau vào + +110 +00:07:59,030 --> 00:07:59,863 +một chuỗi. + +111 +00:07:59,930 --> 00:08:04,880 +Và điều này sẽ thực sự hữu ích vào bài học tiếp theo, nơi tôi có một + +112 +00:08:04,880 --> 00:08:06,950 +thử thách viết mã cho bạn. + +113 +00:08:07,670 --> 00:08:10,100 +Đi đến đó và hoàn thành thử thách. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 Exercise-7.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 Exercise-7.url new file mode 100644 index 0000000000000000000000000000000000000000..695e3a48336d40ea872cc8698d4522acb8037586 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 Exercise-7.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/70ce34ac-2968-4f2d-a523-964c824f7892 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 How-to-join-Auditorium.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 [Interactive Coding Exercise] Life in Weeks.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 [Interactive Coding Exercise] Life in Weeks.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a6a4002ad4a1f8e4c0e2db5f87c3a883cb697e25 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 [Interactive Coding Exercise] Life in Weeks.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca632ba3df0494841a2622ce09711b872711babc3b91d45dac4b01df8028d319 +size 13758399 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 [Interactive Coding Exercise] Life in Weeks_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 [Interactive Coding Exercise] Life in Weeks_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..70ad6d52d180f9ff75873217a388532b1131b9cf --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/009 [Interactive Coding Exercise] Life in Weeks_vi.srt @@ -0,0 +1,260 @@ +1 +00:00:01,620 --> 00:00:04,890 +Trong bài tập này, chúng ta sẽ viết một + +2 +00:00:04,890 --> 00:00:09,870 +chương trình tái tạo lại thứ gì đó mà tôi thấy trên blog. + +3 +00:00:09,870 --> 00:00:12,840 +Gần đây tôi đã đọc cuốn sách có tên + +4 +00:00:12,840 --> 00:00:14,670 +" " và tôi hơi sốc khi + +5 +00:00:14,670 --> 00:00:19,620 +biết rằng chúng ta chỉ có 4.000 tuần trong cuộc đời. + +6 +00:00:19,620 --> 00:00:22,470 +Và 4.000 là con số mà tất cả chúng ta đều có thể đếm được. + +7 +00:00:22,470 --> 00:00:23,700 +Đó là một con + +8 +00:00:23,700 --> 00:00:27,990 +số lớn, nhưng nó vẫn tương đối dễ hiểu. + +9 +00:00:27,990 --> 00:00:29,670 +Và có một bài đăng blog tuyệt + +10 +00:00:29,670 --> 00:00:32,729 +vời của Tim Urban tên là "Cuộc sống của bạn trong nhiều + +11 +00:00:32,729 --> 00:00:34,710 +tuần" và nếu bạn nhìn vào phần mô tả, + +12 +00:00:34,710 --> 00:00:37,590 +bạn sẽ thấy liên kết tới bài đăng blog này. + +13 +00:00:37,590 --> 00:00:42,590 +Bạn có thể thấy khi anh ấy hình dung cuộc sống con người 90 năm + +14 +00:00:42,900 --> 00:00:45,600 +của bạn theo tháng và tuần. + +15 +00:00:45,600 --> 00:00:47,820 +Và khi tất cả đều ở đó trên giấy, + +16 +00:00:47,820 --> 00:00:50,790 +và bạn có thể nhìn thấy từng chiếc hộp nhỏ + +17 +00:00:50,790 --> 00:00:55,790 +riêng lẻ, bạn sẽ bị sốc vì thời gian chúng ta có trên Trái đất rất ít. + +18 +00:00:56,040 --> 00:00:58,980 +Và nếu bạn thực sự đi sâu vào nó và nghĩ + +19 +00:00:58,980 --> 00:01:01,170 +xem, bạn có bao nhiêu mùa hè và + +20 +00:01:01,170 --> 00:01:04,440 +bao nhiêu Giáng sinh bạn sẽ trải qua, thì tất + +21 +00:01:04,440 --> 00:01:07,320 +cả sẽ trở nên tồn tại một chút. + +22 +00:01:07,320 --> 00:01:09,810 +Vì vậy, đó là mục tiêu. + +23 +00:01:09,810 --> 00:01:11,970 +Hôm nay chúng ta sẽ học về sự tồn + +24 +00:01:11,970 --> 00:01:13,860 +tại và chúng ta sẽ sử dụng lập + +25 +00:01:13,860 --> 00:01:15,330 +trình cũng như các kỹ + +26 +00:01:15,330 --> 00:01:17,430 +năng đã học để tính số tuần chúng + +27 +00:01:17,430 --> 00:01:20,160 +ta còn lại trong cuộc đời. + +28 +00:01:20,160 --> 00:01:25,050 +Mục tiêu là lấy đầu vào phù hợp với độ tuổi của bạn. + +29 +00:01:25,050 --> 00:01:28,890 +Ví dụ, ở đây tôi có một người 15 tuổi, và chúng + +30 +00:01:28,890 --> 00:01:32,280 +ta giả định rằng họ sẽ sống đến 90 tuổi, chúng + +31 +00:01:32,280 --> 00:01:34,050 +ta sẽ lạc quan. + +32 +00:01:34,050 --> 00:01:35,430 +Và sau đó chúng ta sẽ + +33 +00:01:35,430 --> 00:01:38,910 +tính xem họ còn bao nhiêu tuần nữa trong cuộc đời. + +34 +00:01:38,910 --> 00:01:42,030 +Và chúng tôi sẽ xuất chuỗi này dưới dạng + +35 +00:01:42,030 --> 00:01:45,630 +một chuỗi có định dạng chính xác mà bạn thấy + +36 +00:01:45,630 --> 00:01:48,960 +trong hộp mô tả là "Bạn còn X tuần. trong đó X được thay thế bằng + +37 +00:01:48,960 --> 00:01:54,123 +số tuần thực tế mà bạn đã tính toán. + +38 +00:01:55,320 --> 00:01:58,590 +Hãy tạm dừng video, suy nghĩ về cách bạn có thể thực hiện điều này + +39 +00:01:58,590 --> 00:02:00,543 +và cố gắng hoàn thành thử thách này. + +40 +00:02:04,230 --> 00:02:06,180 +Được rồi, chúng ta hãy đi qua giải pháp. + +41 +00:02:06,180 --> 00:02:07,860 +Điều đầu tiên chúng ta cần tính + +42 +00:02:07,860 --> 00:02:10,560 +toán là họ còn sống được bao nhiêu năm. + +43 +00:02:10,560 --> 00:02:12,390 +Vì vậy, chúng ta sẽ lấy + +44 +00:02:12,390 --> 00:02:15,690 +90 và chúng ta sẽ trừ nó theo tuổi của họ. + +45 +00:02:15,690 --> 00:02:18,780 +Nhưng một lần nữa, hãy nhớ rằng đầu vào + +46 +00:02:18,780 --> 00:02:21,000 +có dạng dữ liệu chuỗi. + +47 +00:02:21,000 --> 00:02:25,680 +Để chuyển đổi nó thành một số nguyên, một số nguyên, chúng + +48 +00:02:25,680 --> 00:02:30,060 +ta cần bọc hàm int() xung quanh tuổi, giống như những + +49 +00:02:30,060 --> 00:02:32,343 +gì bạn thấy ở dòng 3. + +50 +00:02:34,020 --> 00:02:36,450 +Để có được số tuần mà năm + +51 +00:02:36,450 --> 00:02:40,500 +đó đại diện, chúng ta có thể xem chi tiết + +52 +00:02:40,500 --> 00:02:43,740 +theo tháng hoặc chúng ta có thể + +53 +00:02:43,740 --> 00:02:47,970 +trực tiếp đến đó qua số tuần. + +54 +00:02:47,970 --> 00:02:51,210 +Một năm có 52 tuần, vì vậy + +55 +00:02:51,210 --> 00:02:54,330 +chúng ta có thể nhân số năm + +56 +00:02:54,330 --> 00:02:57,480 +được lưu trữ với 52. + +57 +00:02:57,480 --> 00:03:00,300 +Nếu ai đó 41 tuổi + +58 +00:03:00,300 --> 00:03:03,840 +thì 90 - 41 = 49, rồi + +59 +00:03:03,840 --> 00:03:07,680 +49 nhân với 52 là 2.548 + +60 +00:03:07,680 --> 00:03:12,090 +tuần. + +61 +00:03:12,090 --> 00:03:15,900 +Cuối cùng, chúng ta có thể in ra bằng chuỗi f, cho + +62 +00:03:15,900 --> 00:03:19,860 +người dùng biết họ còn bao nhiêu tuần nữa và chúng + +63 +00:03:19,860 --> 00:03:23,070 +ta sẽ thay thế biến tuần thành chuỗi f bằng + +64 +00:03:23,070 --> 00:03:26,253 +cách sử dụng dấu ngoặc nhọn ở đây. + +65 +00:03:27,510 --> 00:03:29,660 +Và bạn có nó, đó là giải pháp. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/010 Mathematical Operations Quiz.html b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/010 Mathematical Operations Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..7e72fb22d07633e8e2b1bedb83393cb271a59a44 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/010 Mathematical Operations Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Course-Fixes-Report-an-Issue.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Day 2 Project Tip Calculator.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Day 2 Project Tip Calculator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4d88190c95416a0c3f0b5ecf55b98440e1ea8f5e --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Day 2 Project Tip Calculator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de7776eede6df94d940ebcdfa1aeb22cfc100cc7c903f324715f7f204863ce4d +size 198673229 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Day 2 Project Tip Calculator_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Day 2 Project Tip Calculator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..940c6013de4f30e939c5801d54f007921731936b --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Day 2 Project Tip Calculator_vi.srt @@ -0,0 +1,888 @@ +1 +00:00:00,150 --> 00:00:07,110 +Chào các bạn, chào mừng đến với dự án cuối cùng của ngày hôm nay, và trong dự án cuối cùng này, chúng ta sẽ xây dựng + +2 +00:00:07,140 --> 00:00:08,730 +một máy tính tiền boa. + +3 +00:00:09,390 --> 00:00:11,870 +Vì vậy, đầu ra cuối cùng sẽ trông như thế này. + +4 +00:00:11,880 --> 00:00:12,760 +Nó sẽ in Chào mừng + +5 +00:00:12,810 --> 00:00:14,430 +bạn đến với máy tính tiền boa. + +6 +00:00:14,700 --> 00:00:19,290 +Và nó sẽ yêu cầu bạn nhập thông tin về tổng hóa đơn là bao nhiêu. + +7 +00:00:19,890 --> 00:00:27,360 +Giả sử chúng tôi và một vài người bạn ra ngoài ăn trưa và số tiền là 124. + +8 +00:00:27,360 --> 00:00:28,920 +56 đô la. + +9 +00:00:29,430 --> 00:00:33,580 +Và sau đó nó sẽ hỏi bạn, bạn muốn boa bao nhiêu phần trăm? + +10 +00:00:33,600 --> 00:00:36,570 +Vì vậy, giả sử chúng tôi muốn đưa ra 12 phần trăm tiền boa. + +11 +00:00:36,570 --> 00:00:38,570 +Vì vậy, chúng tôi nhập 12 và nhấn enter. + +12 +00:00:39,210 --> 00:00:42,590 +Và cuối cùng nó hỏi có bao nhiêu người đang chia hóa đơn này? + +13 +00:00:42,600 --> 00:00:45,740 +Giả sử có bảy người chúng ta và sau đó nhấn enter. + +14 +00:00:46,140 --> 00:00:51,270 +Cuối cùng, nó sẽ cho chúng ta biết rằng mỗi người phải trả khoảng 19 đô la. 93. + +15 +00:00:52,230 --> 00:00:58,200 +Lưu ý cách hóa đơn cuối cùng, mặc dù sau tất cả các tính toán này, nó có thể có nhiều số hơn + +16 +00:00:58,200 --> 00:01:05,790 +sau dấu thập phân, chúng tôi chỉ muốn độ chính xác hai chữ số thập phân, vì vậy nó phải được làm tròn đến hai chữ số + +17 +00:01:05,790 --> 00:01:06,730 +thập phân. + +18 +00:01:07,350 --> 00:01:14,430 +Điều thứ hai cần nhớ là đây là các tỷ lệ phần trăm và để tính tỷ lệ phần trăm của + +19 +00:01:14,430 --> 00:01:20,790 +một thứ gì đó, bạn có thể nhân một số với số phần trăm chia cho 100. + +20 +00:01:21,300 --> 00:01:24,020 +Hãy để tôi chỉ cho bạn điều này chi tiết hơn một chút. + +21 +00:01:24,480 --> 00:01:30,540 +Nếu bạn đi tới replit/appbrewery/tip-calculator-start, thì bạn đã có + +22 +00:01:30,540 --> 00:01:33,420 +những tệp bắt đầu này cho dự án này. + +23 +00:01:33,990 --> 00:01:39,720 +Và ở đây tôi chỉ muốn nhanh chóng cho bạn thấy toán học hoạt động như thế nào, bởi vì dự án này không phải để kiểm tra toán học + +24 +00:01:39,720 --> 00:01:40,230 +của bạn. + +25 +00:01:40,230 --> 00:01:43,740 +Đó là về việc xem bạn đã hiểu các khái niệm lập trình tốt đến mức nào. + +26 +00:01:44,280 --> 00:01:48,810 +Giả sử chúng ta có một hóa đơn trị giá 150 đô la. + +27 +00:01:49,200 --> 00:01:57,690 +Nếu chúng ta áp dụng tiền boa 12% trên số đó, thì 12% sẽ bằng mười hai chia cho + +28 +00:01:57,690 --> 00:02:01,830 +một trăm, bằng 0. 12. + +29 +00:02:02,670 --> 00:02:09,000 +Bây giờ, bước tiếp theo là chúng ta có thể nhân 150, tổng hóa đơn, với 0. 12. + +30 +00:02:09,419 --> 00:02:14,470 +Và điều này sẽ cho chúng ta 12 phần trăm của 150 là 18. + +31 +00:02:15,150 --> 00:02:21,390 +Bây giờ, tất nhiên, chúng tôi phải thêm tiền boa vào hóa đơn cuối cùng để nó trở thành 150 cộng 18. + +32 +00:02:21,930 --> 00:02:27,040 +Vì vậy, 150 đô la với tiền boa 12 phần trăm tương đương với 168 đô la. + +33 +00:02:27,540 --> 00:02:35,710 +Bây giờ, một cách tốc ký để làm tất cả những điều này chỉ đơn giản là nhân 150 với 1. 12. + +34 +00:02:36,180 --> 00:02:42,580 +Vì vậy, 1 là 150, và sau đó là 0. 12 trên đó. + +35 +00:02:43,110 --> 00:02:46,680 +Vì vậy, khi chúng tôi làm điều này, nó cho chúng tôi khá nhiều con số giống nhau. + +36 +00:02:47,490 --> 00:02:52,560 +Bây giờ, nếu trong quá trình thử nghiệm và viết mã của bạn, bạn bắt gặp một số + +37 +00:02:52,560 --> 00:02:58,860 +loại số trông hơi lạ vì bạn nghĩ 150 nhân với 1. 12 thực sự phải bằng 168 một cách chính + +38 +00:02:58,860 --> 00:02:59,810 +xác. + +39 +00:03:00,210 --> 00:03:02,980 +Vì vậy, tất cả những con số bổ sung ở cuối là gì? + +40 +00:03:03,510 --> 00:03:06,540 +Bây giờ, câu trả lời ngắn gọn là bạn không phải lo lắng về điều đó. + +41 +00:03:06,540 --> 00:03:11,940 +Nó đơn giản liên quan đến cách Python xử lý các số dấu phẩy động này. + +42 +00:03:12,360 --> 00:03:18,420 +Nếu bạn thực sự quan tâm và bạn muốn đọc về điều này, thì tôi sẽ liên kết tới trang này trong tài liệu Python + +43 +00:03:18,420 --> 00:03:21,660 +nơi chúng cho bạn biết tại sao điều này lại xảy ra. + +44 +00:03:22,020 --> 00:03:24,750 +Nhưng được cảnh báo, nó khá đặc và khá nặng. + +45 +00:03:25,080 --> 00:03:30,170 +Nhưng kết luận cuối cùng là cách mà Python xấp xỉ con số này. + +46 +00:03:30,480 --> 00:03:32,630 +Vì vậy, bạn không thực sự phải lo lắng về điều này. + +47 +00:03:33,180 --> 00:03:38,610 +Bây giờ, khi chúng ta đã có 168, bước tiếp theo là chia nó cho 5 người. + +48 +00:03:38,610 --> 00:03:44,970 +Vậy 168 chia 5 bằng 33. 6. + +49 +00:03:45,570 --> 00:03:51,540 +Bây giờ, điều chúng tôi muốn hiển thị cho người dùng là chúng tôi muốn hiển thị cho họ số tiền họ phải trả với độ chính + +50 +00:03:51,540 --> 00:03:52,950 +xác hai chữ số thập phân. + +51 +00:03:52,990 --> 00:03:57,630 +Chúng tôi muốn nói điều gì đó giống như 33. 60 nếu trường hợp này xảy ra, vì đó thường + +52 +00:03:57,630 --> 00:04:00,880 +là cách chúng ta biểu diễn các con số khi nói đến tiền. + +53 +00:04:01,410 --> 00:04:07,740 +Vì vậy, điều tôi muốn bạn làm là có thể làm tròn bất kỳ số nào trong số này đến hai chữ số thập phân. + +54 +00:04:08,610 --> 00:04:15,330 +Nếu bạn đã tạo thành công chương trình này, thì nó sẽ hoạt động chính xác như phiên bản ví dụ này, bạn có thể tìm thấy phiên bản + +55 +00:04:15,330 --> 00:04:22,290 +này nếu vào phần cuối máy tính. appbrewer. thay thế chạy và bạn sẽ thấy định + +56 +00:04:22,290 --> 00:04:27,990 +dạng nơi nó thực sự cho bạn biết mỗi người phải trả số tiền cụ thể bằng đô la này + +57 +00:04:27,990 --> 00:04:31,530 +và nó được làm tròn đến hai chữ số thập phân. + +58 +00:04:31,890 --> 00:04:38,520 +Và đây là số tiền sau khi xem xét ba yếu tố đầu vào khác nhau này từ người dùng. + +59 +00:04:39,090 --> 00:04:44,220 +Chơi thử với sản phẩm cuối cùng và sau đó suy nghĩ về cách bạn sẽ tạo chương trình này từng bước + +60 +00:04:44,220 --> 00:04:50,610 +và sau đó bắt đầu thực hiện bằng cách chuyển kho lưu trữ ban đầu này sang tài khoản của riêng bạn và sau đó cố gắng + +61 +00:04:50,610 --> 00:04:52,150 +đạt được kết quả này. + +62 +00:04:53,040 --> 00:04:58,530 +Điều này sẽ kiểm tra mọi thứ mà bạn đã làm cho đến nay, bao gồm cả chuỗi f, bao gồm các phép + +63 +00:04:58,530 --> 00:04:59,820 +toán phức tạp, bao gồm + +64 +00:05:00,030 --> 00:05:07,320 +PEMDAS và tính toán các số và thứ tự thực hiện các phép toán bằng máy tính, cũng như mọi thứ bạn học trong bài học + +65 +00:05:07,320 --> 00:05:13,440 +trước và những ngày trước cũng vậy. Tôi nghĩ điều này sẽ rất thú vị và kết + +66 +00:05:13,440 --> 00:05:17,850 +quả cuối cùng sẽ hữu ích vào lần tới khi bạn cần chia + +67 +00:05:17,850 --> 00:05:19,730 +hóa đơn cho bạn bè. + +68 +00:05:20,130 --> 00:05:22,320 +Vì vậy, tôi sẽ cho phép bạn tạm dừng video và tiếp tục với nó. + +69 +00:05:22,650 --> 00:05:27,330 +Và sau khi bạn hoàn thành, nếu muốn, hãy quay lại đây và tôi sẽ + +70 +00:05:27,330 --> 00:05:31,860 +cùng bạn tìm hiểu giải pháp. Nhưng tôi thực sự khuyên bạn nên cố gắng hết sức trước khi quay lại. + +71 +00:05:32,100 --> 00:05:34,340 +Vì vậy, tạm dừng video bây giờ và tôi sẽ gặp bạn sau. + +72 +00:05:40,000 --> 00:05:45,340 +OK, vậy là chúng ta đã thấy chương trình được cho là hoạt động như thế nào và chúng ta đang cố + +73 +00:05:45,340 --> 00:05:51,970 +gắng tạo nó từ đầu bằng cách thiết kế ngược nó về cơ bản. Điều đầu tiên tôi sẽ làm là tôi sẽ rẽ nhánh dự án ban đầu + +74 +00:05:51,970 --> 00:05:55,510 +và tạo phiên bản của riêng tôi mà tôi có thể chỉnh sửa. + +75 +00:05:56,200 --> 00:05:59,960 +Bây giờ, điều đầu tiên mà chương trình của chúng ta nên nói là chào mừng bạn đến với máy tính tiền boa. + +76 +00:06:00,250 --> 00:06:01,860 +Vì vậy, đó là đủ dễ dàng. + +77 +00:06:01,870 --> 00:06:03,780 +Chúng ta chỉ cần tạo một câu lệnh in. + +78 +00:06:04,330 --> 00:06:04,910 +Hoàn hảo. + +79 +00:06:05,110 --> 00:06:10,360 +Và nếu bạn đang tạo một máy tính tiền boa thực sự nhiệt tình, bạn có thể thay thế dấu chấm bằng + +80 +00:06:10,360 --> 00:06:11,290 +dấu chấm than. + +81 +00:06:12,100 --> 00:06:16,760 +OK, vậy hãy chạy nó từng bước một để đảm bảo rằng chúng ta không có bất kỳ lỗi nào trong quá trình thực hiện. + +82 +00:06:17,200 --> 00:06:20,170 +Vì vậy, bước đầu tiên dường như được làm việc. Bây giờ, bước tiếp theo là + +83 +00:06:20,170 --> 00:06:23,170 +yêu cầu người dùng cung cấp một số thông tin đầu vào. + +84 +00:06:23,470 --> 00:06:26,690 +Và chúng tôi muốn biết tổng hóa đơn của họ là bao nhiêu, nó đã đi đến đâu? + +85 +00:06:27,280 --> 00:06:32,350 +Vì vậy, hãy tiếp tục và tạo đầu vào và hỏi họ tổng hóa đơn là bao nhiêu? + +86 +00:06:32,980 --> 00:06:38,160 +Sau đó, chúng tôi sẽ thêm ký hiệu đô la hoặc bất kỳ loại tiền tệ nào mà bạn muốn sử dụng. + +87 +00:06:38,560 --> 00:06:45,040 +Bởi vì khi chúng tôi thực sự chạy nó, bạn sẽ thấy rằng đầu vào sẽ đi thẳng sau khi kết thúc chuỗi + +88 +00:06:45,040 --> 00:06:45,450 +đó, vì + +89 +00:06:45,460 --> 00:06:47,020 +vậy ở ký hiệu đô la. + +90 +00:06:47,440 --> 00:06:52,250 +Vì vậy, bây giờ chúng ta có thể nhập một số tiền như thế này, nhưng nó không thực sự được lưu ở bất cứ đâu. + +91 +00:06:52,270 --> 00:06:56,950 +Dữ liệu này chỉ biến mất vì chúng tôi chưa lưu trữ nó bên trong một biến. + +92 +00:06:57,400 --> 00:06:58,810 +Vì vậy, hãy tiếp tục và làm điều đó. + +93 +00:06:58,810 --> 00:07:05,650 +Hãy gọi biến này là bill và chúng ta sẽ đặt nó bằng bất cứ giá trị nào mà người dùng đã nhập vào đầu vào này. + +94 +00:07:06,310 --> 00:07:14,320 +Bây giờ, hãy nhớ rằng hóa đơn này sẽ có kiểu dữ liệu là một chuỗi, phải không? + +95 +00:07:14,350 --> 00:07:21,010 +Vì vậy, nếu tôi tiếp tục và nhấn run và chỉ cần nhập một số số vào đây, bạn sẽ thấy rằng kiểu dữ liệu của hóa đơn, + +96 +00:07:21,010 --> 00:07:25,530 +như chúng ta đã nói, là một chuỗi. Để có thể làm toán, bạn có thể nhớ, + +97 +00:07:25,930 --> 00:07:30,730 +chúng ta phải thay đổi định dạng này thành định dạng số, chẳng hạn + +98 +00:07:30,730 --> 00:07:32,420 +như float hoặc int. + +99 +00:07:32,860 --> 00:07:38,170 +Bây giờ, trong trường hợp này, vì hóa đơn có khả năng có các số sau vị trí thập phân, nên tốt hơn hết là + +100 +00:07:38,170 --> 00:07:45,610 +chúng ta biến nó thành số thực để có được kết quả chính xác nhất có thể. Bây giờ chúng ta đã xử lý xong hóa đơn, câu hỏi tiếp theo mà + +101 +00:07:45,610 --> 00:07:46,980 +người tính tiền boa sẽ + +102 +00:07:47,050 --> 00:07:54,730 +hỏi là bạn muốn đưa bao nhiêu phần trăm tiền boa? 10, 12 hay 15? + +103 +00:07:55,030 --> 00:07:59,050 +Hoặc, tất nhiên, bạn có thể thay đổi tùy chọn này tùy thuộc vào số tiền boa mà bạn thường cho. + +104 +00:07:59,680 --> 00:08:02,800 +Vì vậy, dòng tiếp theo sẽ là một đầu vào khác. + +105 +00:08:04,910 --> 00:08:09,640 +Ở đây, tôi đang hỏi người dùng, bạn muốn cho bao nhiêu tiền boa và đưa cho họ một số ví dụ. Và lưu ý rằng trong các ví + +106 +00:08:09,650 --> 00:08:16,040 +dụ của tôi, tôi thực sự không có ký hiệu phần trăm ở đây bởi vì tôi không + +107 +00:08:16,040 --> 00:08:24,770 +thực sự muốn họ nhập ký hiệu phần trăm vào đầu vào này bởi vì nếu họ làm như vậy khi họ nói 12%, điều + +108 +00:08:25,250 --> 00:08:31,960 +này sẽ thực sự khó khăn để tôi biến 12% thành một con số thực tế. + +109 +00:08:32,539 --> 00:08:38,929 +Vì vậy, trong thông báo đầu vào của bạn, bạn có thể nói điều gì đó như bạn muốn đưa bao nhiêu tiền boa cho + +110 +00:08:38,929 --> 00:08:39,770 +10, 12, 15? + +111 +00:08:40,070 --> 00:08:42,200 +Vui lòng không thêm bất kỳ dấu hiệu phần trăm nào. + +112 +00:08:42,380 --> 00:08:44,200 +Chỉ cần thêm số hoặc một cái gì đó như thế. + +113 +00:08:44,810 --> 00:08:51,590 +Nhưng một lần nữa, một khi chúng tôi đã thực hiện điều này, nó sẽ không được lưu trữ ở bất cứ đâu trừ khi chúng tôi thêm nó vào một biến. + +114 +00:08:52,100 --> 00:08:59,660 +Bây giờ chúng ta có một hóa đơn lưu trữ tổng hóa đơn dưới dạng số dư và chúng ta có tiền boa sẽ là một số + +115 +00:08:59,660 --> 00:09:02,470 +nguyên, 10, 12 hoặc 15, phải không? + +116 +00:09:02,870 --> 00:09:08,960 +Vì vậy, tùy thuộc vào những gì bạn cho là tốt nhất, bạn có thể biến số này thành số float hoặc trong trường hợp của + +117 +00:09:08,960 --> 00:09:11,790 +tôi, tôi có thể sẽ chuyển đổi nó thành số nguyên. + +118 +00:09:12,560 --> 00:09:17,290 +Vì vậy, bây giờ chúng ta đang ở bước cuối cùng, đó là chia hóa đơn cho bao nhiêu người. + +119 +00:09:17,750 --> 00:09:21,050 +Vì vậy, hãy tiếp tục và tạo một biến có tên là people. + +120 +00:09:21,560 --> 00:09:29,690 +Và tôi sẽ thêm một trình bao bọc int xung quanh đầu vào này để ngay từ đầu, chúng tôi biết rằng chúng tôi phải chuyển đổi số người thành + +121 +00:09:29,690 --> 00:09:36,930 +một số nguyên vì tôi chưa bao giờ dùng bữa với 3 người. + +122 +00:09:36,930 --> 00:09:36,930 +5 trước. + +123 +00:09:37,850 --> 00:09:41,870 +Vì vậy, đầu vào sẽ là bao nhiêu người để chia hóa đơn. + +124 +00:09:43,400 --> 00:09:49,850 +Và tại thời điểm này, họ nên nhập số người sẽ biến thành một số nguyên được lưu trữ + +125 +00:09:49,880 --> 00:09:56,180 +bên trong biến này được gọi là người. Vì vậy, bây giờ chúng tôi đã có tất cả dữ liệu được thu thập từ người dùng, cuối cùng chúng tôi đã + +126 +00:09:56,180 --> 00:09:57,500 +sẵn sàng để thực hiện một số phép toán. + +127 +00:09:58,040 --> 00:10:08,210 +Và chúng tôi đã nói rằng cách để tìm ra tiền boa là nhân nó với 1. và sau đó số sau dấu thập phân là tỷ lệ phần + +128 +00:10:08,210 --> 00:10:12,180 +trăm mà họ quyết định đưa ra. + +129 +00:10:12,560 --> 00:10:18,510 +Vì vậy, nó sẽ là 1. 1 nếu nó là 10 phần trăm và 1. 15 nếu nó là 15 phần trăm. + +130 +00:10:19,130 --> 00:10:23,630 +Hãy tiếp tục và tính bill_with_tip. + +131 +00:10:24,990 --> 00:10:32,370 +Vì vậy, hãy nhớ cách chúng tôi nói rằng trước đây phần trăm tiền boa bằng một số nguyên, 10, 12 hoặc 15, chia cho 100, + +132 +00:10:32,760 --> 00:10:38,190 +sẽ biến nó thành 0. 1, 0. 12 hoặc 0. 15, và sau khi phép tính + +133 +00:10:38,730 --> 00:10:46,290 +này được thực hiện, chúng ta có thể nhân nó với hóa đơn. Và cuối cùng, chúng tôi thêm nó vào + +134 +00:10:46,290 --> 00:10:47,880 +hóa đơn gốc. + +135 +00:10:49,050 --> 00:10:54,510 +Vì vậy, hãy tiếp tục và in cái này và chỉ cần kiểm tra xem nó có hợp lý không. + +136 +00:10:55,080 --> 00:10:58,080 +Vì vậy, bill_with_tip là những gì chúng tôi sẽ in. + +137 +00:10:58,570 --> 00:11:01,160 +Và hãy đặt một số con số dễ dàng trong đó. + +138 +00:11:01,680 --> 00:11:06,820 +Và giả sử hóa đơn là một trăm đô la và tiền boa là 10 phần trăm. + +139 +00:11:07,350 --> 00:11:10,830 +Vì vậy, 10% của một trăm đô la là mười đô la. + +140 +00:11:11,070 --> 00:11:12,540 +Vì vậy bill_with_tip, + +141 +00:11:12,810 --> 00:11:18,540 +thứ sẽ được in tiếp theo, phải là 110. Vì vậy, chúng tôi có thể nhập bất cứ thứ gì vào đây vì chúng tôi + +142 +00:11:18,540 --> 00:11:19,380 +không sử dụng nó. + +143 +00:11:19,680 --> 00:11:24,550 +Và bạn có thể thấy rằng phép tính này, bill_with_tip, là 110, đó là những gì chúng tôi muốn. + +144 +00:11:25,170 --> 00:11:28,350 +Bây giờ, có rất nhiều cách khác mà bạn có thể diễn đạt điều này. + +145 +00:11:28,850 --> 00:11:36,690 +Ví dụ: bạn có thể nói hóa đơn * (1 + tiền boa/100). + +146 +00:11:37,320 --> 00:11:40,630 +Vì vậy, điều này thực sự sẽ cung cấp cho bạn kết quả tương tự. + +147 +00:11:41,250 --> 00:11:47,010 +Nhưng hãy nhớ những gì chúng ta đã nói trước đây về cách Python hơi kỳ lạ với các số dấu phẩy động. + +148 +00:11:47,550 --> 00:11:51,570 +Nhưng về cơ bản, điều này vẫn cho chúng ta kết quả tương tự, đó là 110. + +149 +00:11:52,500 --> 00:11:55,940 +Vì vậy, bạn có thể chọn bất kỳ cách nào bạn thấy trực quan nhất. + +150 +00:11:55,950 --> 00:12:00,340 +Và nếu muốn, bạn thậm chí có thể chia việc này thành nhiều bước, phải không? + +151 +00:12:00,360 --> 00:12:05,580 +Chúng ta có thể nói rằng tip_as_percent bằng tiền boa/100. + +152 +00:12:07,080 --> 00:12:16,530 +Và sau đó chúng ta có thể nhân hóa đơn với tip_as_percent để có tổng số tiền boa. + +153 +00:12:18,990 --> 00:12:26,290 +Và cuối cùng, chúng ta có thể lấy tổng hóa đơn bằng cách thêm hóa đơn vào total_tip_amount. + +154 +00:12:27,270 --> 00:12:32,430 +Vui lòng làm điều này theo bất kỳ cách nào phù hợp với bạn, nhưng tôi sẽ để lại càng nhiều bước + +155 +00:12:32,430 --> 00:12:37,320 +càng tốt để bạn thực sự có thể giải quyết logic nếu bạn gặp khó khăn với môn toán này. + +156 +00:12:38,760 --> 00:12:44,070 +Bây giờ, điều tiếp theo chúng ta cần làm là chia tổng hóa đơn cho số người. + +157 +00:12:44,370 --> 00:12:47,710 +Vậy nếu chúng ta có năm người, thì chúng ta sẽ chia năm cách phải không? + +158 +00:12:48,210 --> 00:12:51,750 +Vì vậy, hãy gọi đây là bill_per_ + +159 +00:12:53,050 --> 00:12:59,560 +person, nó sẽ bằng tổng hóa đơn chia cho số người. + +160 +00:13:01,280 --> 00:13:08,000 +Bây giờ, ở giai đoạn này, bill_per_person này là một số có dấu phẩy động, vì vậy nó có thể có rất nhiều + +161 +00:13:08,000 --> 00:13:10,000 +chữ số sau dấu thập phân. + +162 +00:13:10,490 --> 00:13:16,910 +Nếu chúng ta muốn làm tròn số này đến hai chữ số thập phân, thì các bạn có thể nhớ trong một số bài học hôm nay, chúng + +163 +00:13:17,240 --> 00:13:19,790 +ta có quyền truy cập vào một hàm gọi là round. + +164 +00:13:20,300 --> 00:13:26,090 +Và ở đây chúng ta có thể thêm số mà chúng ta muốn xung quanh, đó là bill_per_person, và sau dấu + +165 +00:13:26,570 --> 00:13:33,530 +phẩy, chúng ta có thể chỉ định mức độ chính xác, bao nhiêu số hoặc bao nhiêu chữ số thập phân mà chúng ta muốn làm + +166 +00:13:33,530 --> 00:13:35,030 +tròn hóa đơn này. + +167 +00:13:35,510 --> 00:13:38,120 +Và trong trường hợp của chúng tôi, đó là hai chữ số thập phân. + +168 +00:13:38,780 --> 00:13:47,570 +Vì vậy, bây giờ đây là số tiền cuối cùng, mà tôi sẽ gọi là final_amount, là bill_per_person được làm tròn đến hai + +169 +00:13:47,570 --> 00:13:49,190 +chữ số thập phân. + +170 +00:13:49,790 --> 00:13:57,190 +Và bây giờ chúng ta cuối cùng cũng có thể in cái này cho người dùng và yêu cầu mỗi người phải trả tiền... + +171 +00:13:57,830 --> 00:14:03,740 +Và hãy nhớ rằng, bạn có thể sử dụng phép nối chuỗi, thao tác này sẽ yêu cầu bạn chuyển đổi lại số + +172 +00:14:03,740 --> 00:14:09,380 +này thành chuỗi hoặc sử dụng thủ thuật mà chúng ta đã học trong các bài học trước, nơi chúng + +173 +00:14:09,380 --> 00:14:17,930 +ta có thể tạo một chuỗi f bằng cách thêm F vào trước chuỗi rồi sử dụng một số dấu ngoặc nhọn để chèn số tiền cuối cùng ngay tại đây. + +174 +00:14:18,620 --> 00:14:27,820 +Và chúng ta có thể viết final_amount đô la hoặc chúng ta có thể đặt ký hiệu đô la ở phía trước và có thể là dấu hai chấm ở đây. + +175 +00:14:28,460 --> 00:14:34,160 +Và bây giờ nếu chúng ta xóa bảng điều khiển và chạy mã, thì bạn sẽ thấy nó hoạt động. + +176 +00:14:34,190 --> 00:14:35,770 +Vì vậy, chào mừng bạn đến với máy tính tiền boa. + +177 +00:14:35,780 --> 00:14:36,910 +Tổng hóa đơn là bao nhiêu? + +178 +00:14:37,220 --> 00:14:38,990 +Hãy tạo một số ngẫu nhiên. + +179 +00:14:39,560 --> 00:14:40,910 +Mẹo bao nhiêu phần trăm? + +180 +00:14:40,910 --> 00:14:47,780 +Giả sử chúng ta sẽ có 15 người và sau đó chúng ta chia nó cho năm người. Và nó tính toán mọi thứ, thực hiện tất cả + +181 +00:14:47,780 --> 00:14:49,370 +các phép toán đó. + +182 +00:14:49,730 --> 00:14:55,940 +Và cuối cùng, nó làm tròn đến hai chữ số thập phân, cho chúng ta số tiền cuối cùng mà mỗi người phải trả. + +183 +00:14:56,780 --> 00:14:59,440 +Nhưng nếu chúng ta kiểm tra nó với những con số ban đầu thì sao? + +184 +00:15:00,200 --> 00:15:07,700 +Hãy đánh, chạy và hãy cố gắng đặt tổng hóa đơn là 150 đô la, sau đó chúng tôi sẽ đưa ra 12% tiền boa và + +185 +00:15:07,700 --> 00:15:11,180 +chúng tôi sẽ chia số tiền đó cho năm người. + +186 +00:15:11,750 --> 00:15:16,520 +Lưu ý rằng điều đó cho chúng tôi biết rằng mỗi người phải trả 33 đô la. 6. + +187 +00:15:16,880 --> 00:15:20,960 +Nhưng thông thường, chúng ta thường thấy số đó được làm tròn đến hai chữ số thập phân. + +188 +00:15:21,440 --> 00:15:23,960 +Nhưng chúng ta đã có chức năng vòng đó ở đây rồi. + +189 +00:15:24,230 --> 00:15:26,060 +Vậy tại sao nó không làm công việc của nó? + +190 +00:15:27,160 --> 00:15:32,830 +Chà, nếu bạn nghĩ về nó, kết quả của phép tính này chỉ là 33. 6. Không có gì sau số sáu, + +191 +00:15:32,830 --> 00:15:40,390 +nhưng chúng tôi muốn nó hiển thị số không. Và đây là một vấn đề hình thành chứ không phải là một vấn + +192 +00:15:40,390 --> 00:15:42,200 +đề làm tròn toán học. + +193 +00:15:42,670 --> 00:15:43,810 +Vậy ta phải làm sao? + +194 +00:15:43,840 --> 00:15:50,410 +Chà, chúng tôi tìm đến người bạn tốt Google của mình bất cứ khi nào chúng tôi gặp khó khăn và chúng + +195 +00:15:50,410 --> 00:15:55,890 +tôi sẽ tìm kiếm cách làm tròn số đến hai chữ số thập phân trong Python. + +196 +00:15:56,620 --> 00:16:02,260 +Và nếu chúng ta xem xét câu hỏi về Stack Overflow đầu tiên, bạn có thể thấy rằng người này có khá + +197 +00:16:02,260 --> 00:16:04,240 +nhiều vấn đề giống như chúng ta. + +198 +00:16:04,630 --> 00:16:11,980 +Và nếu chúng ta cuộn xuống, bạn có thể thấy rằng giải pháp là sử dụng một số kiểu định dạng. Và chúng ta có thể thử lần lượt từng ví dụ này + +199 +00:16:11,980 --> 00:16:17,260 +bằng mã để xem chúng hoạt động như thế nào và chúng ta cũng có + +200 +00:16:17,500 --> 00:16:21,490 +thể xem tài liệu mà chúng liên kết đến. + +201 +00:16:22,360 --> 00:16:29,890 +Vì vậy, cách thực tế mà chúng tôi làm điều này là sử dụng dấu hai chấm và sau đó là dấu chấm, sau đó chúng tôi chỉ định rằng sau dấu chấm, chúng + +202 +00:16:29,950 --> 00:16:36,120 +tôi muốn có hai dấu thập phân trong số float của mình. Và chúng tôi sử dụng chức năng định dạng để làm điều này. + +203 +00:16:36,460 --> 00:16:43,360 +Vì vậy, thay vì sử dụng vòng, chúng ta có thể tạo biến số tiền cuối cùng này + +204 +00:16:43,360 --> 00:16:52,630 +bằng cách tạo một chuỗi sử dụng định dạng đó, :. 2f, sau đó chúng ta có thể sử dụng hàm định dạng để chuyển vào bill_per_person đó. + +205 +00:16:54,230 --> 00:17:03,740 +Và bây giờ khi chúng tôi chạy lại chương trình này, sử dụng cùng các đầu vào, giờ chúng tôi nhận được tệp . 60 ở cuối và điều này về cơ bản đã biến bill_per_person + +206 +00:17:04,220 --> 00:17:10,190 +này, một số float thành một chuỗi. + +207 +00:17:10,400 --> 00:17:16,680 +Và chuỗi đó tuân theo định dạng cụ thể này, đó là hai chữ số thập phân. + +208 +00:17:17,329 --> 00:17:19,369 +Bạn đã tiếp tục với dự án này như thế nào? + +209 +00:17:19,609 --> 00:17:25,550 +Bạn có quản lý để có được nó trong một lần mà không cần phải xem giải pháp không? Nếu bạn gặp khó khăn tại bất kỳ thời điểm nào hoặc + +210 +00:17:25,550 --> 00:17:27,950 +nếu mã của bạn không hoạt động như bạn mong + +211 +00:17:28,280 --> 00:17:33,110 +đợi, thì đây là lúc để quay lại, sửa lỗi và đảm bảo rằng bạn đã hiểu mọi thứ được + +212 +00:17:33,110 --> 00:17:35,150 +đề cập trong bài tập này. + +213 +00:17:35,480 --> 00:17:40,310 +Nhưng nếu bạn đã tạo nó và nó hoạt động hoàn hảo, thì bạn đã sẵn sàng ra ngoài đó với máy tính + +214 +00:17:40,310 --> 00:17:41,600 +tiền boa trong tay. + +215 +00:17:41,960 --> 00:17:47,430 +Hãy nhớ rằng bạn có thể lưu URL của máy tính tiền boa trong điện thoại của mình dưới dạng dấu trang. + +216 +00:17:47,450 --> 00:17:52,040 +Vì vậy, lần tới khi bạn ra ngoài ăn tối hoặc ăn trưa với bạn bè, thì bạn có thể mở công cụ tính + +217 +00:17:52,040 --> 00:17:54,800 +tiền boa của riêng mình và tính ra hóa đơn cuối cùng. + +218 +00:17:55,670 --> 00:18:01,130 +Vì vậy, tôi hy vọng bạn đã có niềm vui khi xây dựng dự án này và thực hiện tất cả các bài tập viết mã cũng như tìm hiểu về các phép toán, + +219 +00:18:01,130 --> 00:18:09,350 +chuỗi ký tự, kiểu dữ liệu, chuyển đổi kiểu và tất cả những điều mà chúng ta đã làm hôm nay. Hãy nghỉ ngơi và tôi sẽ quay lại vào ngày mai để dạy bạn về các câu + +220 +00:18:09,350 --> 00:18:15,500 +lệnh có điều kiện và cách chúng ta có thể khiến chương trình thực hiện những việc khác nhau + +221 +00:18:15,500 --> 00:18:21,500 +tùy thuộc vào các điều kiện nhất định hoặc một số phần nhất định trong mã của chúng ta. + +222 +00:18:22,100 --> 00:18:25,360 +Vì vậy, tôi chúc bạn ngủ ngon và tôi sẽ gặp bạn vào ngày mai. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 FAQ-How-to-Get-2-Decimal-Places-.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 FAQ-How-to-Get-2-Decimal-Places-.url new file mode 100644 index 0000000000000000000000000000000000000000..fde8e3da34cdc02fe5c16c7b2103d757b16b341d --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 FAQ-How-to-Get-2-Decimal-Places-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/17841394#questions/13315048 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Floating-Point-Arithmetic.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Floating-Point-Arithmetic.url new file mode 100644 index 0000000000000000000000000000000000000000..1b23d2bd1d06cba8327c6994d9d0e774732d2752 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Floating-Point-Arithmetic.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/tutorial/floatingpoint.html \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Solution-Tip-Calculator-Ending-Code.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Solution-Tip-Calculator-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..7ad2ae7dea294a7840c09c38044da4f0417482ed --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Solution-Tip-Calculator-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/tip-calculator-end \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Tip-Calculator-Start-replit.com-.url b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Tip-Calculator-Start-replit.com-.url new file mode 100644 index 0000000000000000000000000000000000000000..024f8812e85ee720ce374b34a60952451a551557 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/011 Tip-Calculator-Start-replit.com-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/tip-calculator-start?v=1 \ No newline at end of file diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/012 You are already in the top 50%.mp4 b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/012 You are already in the top 50%.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..522928b6d98ec302d39070ebeba77c235b52d772 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/012 You are already in the top 50%.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5da62698baa5d14b533f2bd4daa7a17156f361e8d434b1ca11d177df4728e90 +size 11875721 diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/012 You are already in the top 50%_vi.srt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/012 You are already in the top 50%_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f42dc269582c1c610f6948659090ed634fbe0cb7 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/012 You are already in the top 50%_vi.srt @@ -0,0 +1,28 @@ +1 +00:00:00,880 --> 00:00:05,530 +Này, bạn đã hoàn thành ngày thứ 2, vì vậy bạn không chỉ làm một bài, bạn thực sự đã làm + +2 +00:00:05,530 --> 00:00:09,880 +hai bài liên tiếp, điều này thật tuyệt vời. Và trên thực tế, bạn hiện đang + +3 +00:00:10,150 --> 00:00:15,150 +ở trên 50% tất cả những người bắt đầu một việc gì đó và không bao giờ hoàn thành. + +4 +00:00:15,790 --> 00:00:18,640 +Nhưng tôi biết bạn, tôi biết bạn không phải là một trong những người đó. + +5 +00:00:18,730 --> 00:00:22,390 +Tôi biết bạn sẽ tiếp tục đi và bạn sẽ lấy cái này trong túi. + +6 +00:00:22,750 --> 00:00:26,320 +Vì vậy, tiếp tục đi, nghỉ ngơi, có một đêm ngon giấc. + +7 +00:00:26,620 --> 00:00:28,930 +Và tôi sẽ gặp lại bạn vào sáng sớm mai. + diff --git a/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/external-links.txt b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..6819d6fbe31941d0ae7950f2f12a9beb14341816 --- /dev/null +++ b/part1/02 - Day 2 - Beginner - Understanding Data Types and How to Manipulate Strings/external-links.txt @@ -0,0 +1,39 @@ + +001 Press-Run-to-see-the-final-project +https://replit.com/@appbrewery/tip-calculator-end?v=1 + +002 Fork-the-Day-2-Starting-Repl +https://repl.it/@appbrewery/day-2-start + +005 Exercise-5 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/705d8881-a95e-48f2-977b-840a5ec3a128 + +005 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Exercise-6 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/3c6091ed-ef4e-4247-82ae-167a2cb5208f + +007 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +009 Exercise-7 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/70ce34ac-2968-4f2d-a523-964c824f7892 + +009 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +011 Solution-Tip-Calculator-Ending-Code +https://repl.it/@appbrewery/tip-calculator-end + +011 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +011 Floating-Point-Arithmetic +https://docs.python.org/3/tutorial/floatingpoint.html + +011 FAQ-How-to-Get-2-Decimal-Places- +https://www.udemy.com/course/100-days-of-code/learn/lecture/17841394#questions/13315048 + +011 Tip-Calculator-Start-replit.com- +https://replit.com/@appbrewery/tip-calculator-start?v=1 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day 3 Goals what we will make by the end of the day.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day 3 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4ba249db21a6909648af1ca3708f9ec9111561e5 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day 3 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8e6d192383b6b21fef99d312733ac7a3ec6cd56c37e033381cf0f7fe19bc1e3 +size 4455415 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day 3 Goals what we will make by the end of the day_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day 3 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bf1c32a6625f04ecd6480bfcace0a6e53ce7919e --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day 3 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,88 @@ +1 +00:00:00,060 --> 00:00:02,520 +Xin chào các bạn, chào mừng đến với Ngày thứ 3. + +2 +00:00:02,910 --> 00:00:05,820 +Hôm nay bạn có thể tìm hiểu tất cả + +3 +00:00:05,910 --> 00:00:10,890 +về các câu lệnh điều kiện, if else, else if, toán tử logic, khối mã, phạm vi, + +4 +00:00:11,190 --> 00:00:14,520 +khoảng cách tên toàn cục và cục bộ và nhiều hơn nữa. + +5 +00:00:15,180 --> 00:00:20,180 +Và đến cuối ngày, bạn sẽ biết đủ để có thể xây dựng trò chơi tuyệt vời này Chọn trò + +6 +00:00:20,250 --> 00:00:21,870 +chơi phiêu lưu của riêng bạn. + +7 +00:00:22,530 --> 00:00:27,530 +Vì vậy, đây là những gì nó trông như thế nào khi nó tải và nhiệm vụ của + +8 +00:00:28,200 --> 00:00:31,770 +chúng tôi là tìm kho báu. Vì vậy, nó cho chúng tôi biết của bạn ở một ngã tư, nơi bạn muốn đi? + +9 +00:00:31,800 --> 00:00:35,910 +Trái hay phải? Giả sử tôi muốn đi sang trái. Bạn đến một Hồ, có một + +10 +00:00:35,940 --> 00:00:37,920 +Đảo ở giữa Hồ. Gõ đợi + +11 +00:00:37,920 --> 00:00:42,870 +thuyền, gõ bơi để bơi ngang. Tôi sẽ đợi một chiếc thuyền. + +12 +00:00:43,980 --> 00:00:47,760 +Bạn đến Đảo mà không hề hấn gì, có một ngôi nhà có ba cửa, một màu đỏ, một + +13 +00:00:47,790 --> 00:00:50,580 +màu vàng và một màu xanh lam. Bạn chọn màu nào? + +14 +00:00:50,760 --> 00:00:55,760 +Hãy chọn màu đỏ. Và thật không may, đó là một căn phòng đầy lửa. Trò chơi kết thúc. + +15 +00:00:57,090 --> 00:01:01,170 +Vì vậy, trò chơi này cho phép người dùng đưa ra quyết định và tùy thuộc vào những gì họ + +16 +00:01:01,230 --> 00:01:05,489 +đã chọn, nó tiếp tục cốt truyện của trò chơi. Nếu bạn muốn chơi trò chơi này, + +17 +00:01:05,730 --> 00:01:07,560 +bạn có thể đi đến đảo + +18 +00:01:07,620 --> 00:01:12,620 +kho báu -end. nhà máy bia. repl. chạy và chơi với trò chơi. + +19 +00:01:13,050 --> 00:01:14,040 +Và khi bạn đã + +20 +00:01:14,070 --> 00:01:17,160 +sẵn sàng, hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu + +21 +00:01:17,400 --> 00:01:19,830 +chọn các kỹ năng cần thiết để xây dựng trò chơi này. + +22 +00:01:20,430 --> 00:01:22,230 +Vì vậy, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day-3-Goal-Click-Run-to-see-the-final-project.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day-3-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..6f36cf929ebe61c145d8973082f496ca9cd0c2d2 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/001 Day-3-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/treasure-island-end?v=1 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/002 Get Access to the Monthly App Brewery Newsletter.html b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/002 Get Access to the Monthly App Brewery Newsletter.html new file mode 100644 index 0000000000000000000000000000000000000000..045365900cd364a03794148de012923f2b40103c --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/002 Get Access to the Monthly App Brewery Newsletter.html @@ -0,0 +1 @@ +

Hey guys,

Every month, I sit down and write a hand crafted letter to my students. It usually contains the latest things I've learnt or discovered. The goal is to keep you inspired and motivated on your journey to becoming a developer.

I sometimes talk about my struggles as a programmer. I often talk about side projects I'm working on. Most of my friends work in tech, so often I also capture some of my conversations with VCs, founders, CEOs on things like tech stack trends, insider tips and life hacks,

In addition, the tech world moves very fast and it's difficult to keep on top of all the new developments, tools and skills. So in every edition of the L.A.B. Report, you'll discover 3 things I read in that month. I read a lot, and I try to pick out the top three things I discovered on topics such as Design, Programming, Productivity, Startup Growth and more.

You can see a sample here and decide whether if this is something you would want to receive once a month. 

Because it costs money to send out these emails, if you think this will be useful for you, and only if you really want it, then you can sign up over here:

Sign Up Link for Udemy Students



Best Wishes,

Your instructor, Angela




\ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Control Flow with if else and Conditional Operators.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Control Flow with if else and Conditional Operators.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..826657c9376688a3a5527a27edbb3f67cfa8c9a7 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Control Flow with if else and Conditional Operators.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:736a32bc2b379b63882ef8feb798707fd30a8f19cf01bdaf8f8cc48e77ae04e2 +size 64967127 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Control Flow with if else and Conditional Operators_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Control Flow with if else and Conditional Operators_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d757deb3a1f741880fdf1d72d00daffe261ef1b9 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Control Flow with if else and Conditional Operators_vi.srt @@ -0,0 +1,592 @@ +1 +00:00:00,340 --> 00:00:04,180 +Đây là một câu hỏi. Bạn đã bao giờ ngồi trong bồn tắm của + +2 +00:00:04,540 --> 00:00:07,750 +mình và tự hỏi, tại sao dù mình có đãng trí đến đâu, nhưng bồn tắm + +3 +00:00:08,140 --> 00:00:10,450 +của mình vẫn không bao giờ bị tràn nước như thế này? + +4 +00:00:10,690 --> 00:00:14,230 +Đây là điều mà tôi đã nghĩ đến ngày hôm trước và tôi nhận ra rằng đó không + +5 +00:00:14,260 --> 00:00:19,180 +phải vì tôi đặc biệt siêng năng. Tôi quên đồ mọi lúc. Ý tôi là, pizza, + +6 +00:00:19,300 --> 00:00:24,190 +có ai không? Đây là những chiếc pizza của tôi thường trông như thế nào. Ừm, nhưng lý + +7 +00:00:24,490 --> 00:00:29,490 +do tại sao bồn tắm hoặc bồn rửa không bị tràn là + +8 +00:00:30,490 --> 00:00:34,270 +do phần kỹ thuật tuyệt vời này, nước tràn. + +9 +00:00:34,810 --> 00:00:39,810 +Vì vậy, điều này có nghĩa là bất cứ khi nào nước vượt quá một mức nhất định ở + +10 +00:00:40,810 --> 00:00:43,240 +khoảng này, nước bắt đầu tràn để bồn + +11 +00:00:43,270 --> 00:00:47,740 +tắm không bị tràn và làm phiền những người hàng xóm ở tầng dưới của bạn. + +12 +00:00:48,340 --> 00:00:53,110 +Trên thực tế, chúng ta có thể biểu diễn cơ chế này bằng một câu lệnh điều kiện. + +13 +00:00:53,680 --> 00:00:57,820 +Khi mực nước được cho là lớn hơn 80 + +14 +00:00:58,240 --> 00:01:00,670 +cm, thì cần xả nước. + +15 +00:01:01,030 --> 00:01:04,420 +Nhưng nếu mực nước không lớn hơn 80 cm + +16 +00:01:04,599 --> 00:01:07,240 +thì nên tiếp tục đổ đầy bồn. + +17 +00:01:07,660 --> 00:01:12,520 +Loại câu lệnh điều kiện này được gọi là câu lệnh if / else. + +18 +00:01:13,000 --> 00:01:15,340 +Tùy thuộc vào một điều kiện + +19 +00:01:15,580 --> 00:01:18,460 +cụ thể, chúng tôi sẽ làm A hoặc B. + +20 +00:01:18,910 --> 00:01:22,420 +Và khi chúng ta muốn viết mã Python để biểu diễn điều này, nó + +21 +00:01:22,600 --> 00:01:23,950 +trông giống như thế này. + +22 +00:01:24,280 --> 00:01:29,280 +Có từ khóa if, sau đó là điều kiện mà chúng tôi đang kiểm tra, sau đó là + +23 +00:01:30,280 --> 00:01:35,280 +dấu hai chấm và sau dấu hai chấm, chúng ta có một khối mã thụt vào sẽ được + +24 +00:01:35,800 --> 00:01:39,370 +thực thi nếu điều kiện này được đáp ứng, nếu nó đúng. + +25 +00:01:40,120 --> 00:01:41,680 +Nhưng nếu nó không đúng, + +26 +00:01:42,010 --> 00:01:47,010 +thì chúng ta sẽ bỏ qua khối else và nó chỉ là từ khóa else với dấu hai + +27 +00:01:47,800 --> 00:01:52,090 +chấm và sau đó khối mã này sẽ thực thi nếu điều kiện sai. + +28 +00:01:52,840 --> 00:01:57,490 +Vì vậy, chúng tôi có thể đại diện cho tình huống bồn tắm trước đó bằng mã trông giống như + +29 +00:01:57,490 --> 00:01:58,150 +thế này. + +30 +00:01:58,150 --> 00:02:03,150 +Giả sử mực nước của chúng ta là 50 cm và sau đó chúng ta sẽ kiểm tra xem mực + +31 +00:02:03,220 --> 00:02:07,690 +nước có lớn hơn 80 cm hay không. Chà, nếu đúng như vậy thì chúng + +32 +00:02:07,750 --> 00:02:09,910 +ta nên xả bớt nước đi. + +33 +00:02:10,360 --> 00:02:13,060 +Nhưng nếu nó không lớn hơn 80 cm, hay nói + +34 +00:02:13,120 --> 00:02:15,400 +cách khác, trong trường hợp này, chúng + +35 +00:02:15,430 --> 00:02:17,830 +ta nên tiếp tục đổ đầy bồn tắm. + +36 +00:02:18,280 --> 00:02:21,370 +Hãy đưa điều này vào thực tế với một vấn đề thực tế trong cuộc sống. + +37 +00:02:21,940 --> 00:02:26,350 +Bây giờ, hãy giả sử rằng bạn đã nhận được một công việc tại một công viên + +38 +00:02:26,350 --> 00:02:31,330 +giải trí và công việc đầu tiên trong ngày của bạn là viết một số mã thay thế hộp vé. + +39 +00:02:31,990 --> 00:02:35,800 +Bây giờ có một số điều mà bạn sẽ cần phải suy nghĩ. Thứ nhất, để + +40 +00:02:35,980 --> 00:02:40,060 +ai đó thực sự mua vé đi tàu lượn + +41 +00:02:40,060 --> 00:02:44,050 +siêu tốc, họ sẽ cần cao hơn 120 cm. + +42 +00:02:44,650 --> 00:02:49,060 +Vì vậy, chúng tôi phải kiểm tra xem chiều cao của họ là bao nhiêu vì nếu họ quá thấp, + +43 +00:02:49,120 --> 00:02:53,740 +thì chúng tôi sẽ không thể bán vé cho họ. Trong các tài nguyên của khóa học, tôi đã bao gồm + +44 +00:02:53,830 --> 00:02:58,830 +một liên kết đến biểu đồ luồng mà tôi đã tạo khi vẽ. io. + +45 +00:02:59,890 --> 00:03:00,700 +Đây là một + +46 +00:03:00,700 --> 00:03:04,960 +công cụ thực sự, thực sự hữu ích để tạo bất kỳ loại biểu đồ hoặc sơ + +47 +00:03:04,960 --> 00:03:09,550 +đồ nào và nó thực sự dễ sử dụng. Bây giờ, nếu chúng ta nhìn vào lưu đồ này, + +48 +00:03:09,820 --> 00:03:14,260 +về cơ bản đây là logic mà chúng ta phải lập trình bằng cách sử dụng các câu lệnh + +49 +00:03:14,350 --> 00:03:15,850 +if và else của chúng ta. + +50 +00:03:16,360 --> 00:03:21,360 +Nếu người cố mua vé không cao hơn 120 cm thì họ + +51 +00:03:23,020 --> 00:03:26,020 +không thể đi tàu lượn siêu tốc. + +52 +00:03:26,530 --> 00:03:30,670 +Nhưng nếu chiều cao của họ lớn hơn 120 cm, thì họ có thể đi xe. + +53 +00:03:30,850 --> 00:03:34,870 +Vì vậy, chúng ta hãy thử nó ra. Nếu bạn đi đến Repl bắt đầu. nó, bạn sẽ tìm thấy một + +54 +00:03:35,560 --> 00:03:39,310 +số mã bắt đầu ở đó và bạn có thể tiếp tục và fork Repl + +55 +00:03:39,310 --> 00:03:40,143 +này. nó. + +56 +00:03:40,780 --> 00:03:44,470 +Tất cả những gì tôi có ở đây là một câu lệnh in có nội dung "Chào + +57 +00:03:44,470 --> 00:03:49,470 +mừng bạn đến với tàu lượn siêu tốc" cũng như một đầu vào yêu cầu người dùng cho biết chiều cao của + +58 +00:03:49,930 --> 00:03:54,930 +họ tính bằng cm và sau đó chuyển đổi chuỗi thành một số nguyên, một số nguyên, và sau đó tôi lưu + +59 +00:03:56,020 --> 00:03:58,780 +trữ nó bên trong biến này được gọi là chiều cao. + +60 +00:03:59,440 --> 00:04:04,330 +Bây giờ chúng ta sẽ kiểm tra xem liệu chiều cao mà người dùng đã + +61 +00:04:04,330 --> 00:04:09,330 +nhập có lớn hơn 120 hay không. Vì vậy, chúng tôi sử dụng từ khóa if và sau + +62 +00:04:10,960 --> 00:04:15,960 +đó chúng tôi kiểm tra xem chiều cao có lớn hơn 120 hay không và sau đó chúng tôi thêm dấu hai chấm và + +63 +00:04:17,410 --> 00:04:22,410 +bây giờ khi tôi nhấn enter, bạn sẽ nhận thấy rằng trình chỉnh sửa mã đã tự động thụt lề cho tôi một chút. + +64 +00:04:23,050 --> 00:04:28,050 +Tôi không kết thúc ở đây bởi vì trong Python, khoảng cách và thụt lề thực sự, thực + +65 +00:04:29,560 --> 00:04:30,400 +sự quan trọng. + +66 +00:04:30,790 --> 00:04:35,080 +Nó cho máy tính biết rằng mã mà tôi sắp viết là những gì + +67 +00:04:35,080 --> 00:04:38,620 +sẽ được thực thi khi điều kiện này được đáp ứng. + +68 +00:04:39,340 --> 00:04:44,340 +Vậy điều gì nên xảy ra? Nếu chiều cao của bạn trên 120 thì chúng tôi sẽ in Bạn + +69 +00:04:44,980 --> 00:04:46,720 +có thể đi tàu lượn siêu tốc !. + +70 +00:04:47,470 --> 00:04:52,470 +Nhưng chúng ta nên in gì nếu chiều cao không lớn hơn 120? Trong trường hợp này, chúng ta + +71 +00:04:52,930 --> 00:04:57,930 +sẽ sử dụng câu lệnh else để biết khi nào điều đó xảy ra. + +72 +00:04:58,840 --> 00:05:03,840 +Và điều thực sự quan trọng là bạn không viết cái khác ở đây vì cái + +73 +00:05:04,120 --> 00:05:06,820 +này bị thụt vào. Thay vào đó, + +74 +00:05:07,030 --> 00:05:11,470 +bạn muốn nó ở cùng mức thụt lề như câu lệnh if. + +75 +00:05:11,950 --> 00:05:15,610 +Hai cái này về cơ bản là một cặp, nếu và khác. Bây giờ, sau từ khóa else, chúng + +76 +00:05:15,700 --> 00:05:16,990 +ta lại thêm một + +77 +00:05:16,990 --> 00:05:21,820 +dấu hai chấm và sau đó chúng ta nhấn enter và bây giờ chúng ta lại được thụt lề. + +78 +00:05:22,180 --> 00:05:27,180 +Và ở đây chúng ta có thể viết mã sẽ xảy ra nếu điều kiện này là sai. + +79 +00:05:28,930 --> 00:05:30,910 +“Xin lỗi, bạn phải cao thêm trước khi có thể đi xe. "Vì vậy, + +80 +00:05:31,900 --> 00:05:36,900 +những điều thực sự quan trọng ở đây là điều kiện mà chúng tôi đang + +81 +00:05:38,290 --> 00:05:43,290 +kiểm tra, là giá trị của chiều cao lớn hơn 120, cú pháp của mã + +82 +00:05:44,470 --> 00:05:45,520 +này để các + +83 +00:05:45,550 --> 00:05:50,550 +từ khóa if và else cũng như dấu hai chấm đứng sau mỗi dòng này. + +84 +00:05:51,850 --> 00:05:54,310 +Và cuối cùng cũng là phần thụt đầu dòng. + +85 +00:05:54,880 --> 00:05:57,740 +Mọi thứ được thụt vào sau + +86 +00:05:57,950 --> 00:06:00,440 +if là một khối mã. + +87 +00:06:01,070 --> 00:06:06,070 +Vì vậy, điều này được thụt vào và nó có hiệu quả bên trong + +88 +00:06:07,640 --> 00:06:08,840 +nếu. Vì + +89 +00:06:08,840 --> 00:06:12,740 +vậy, dòng mã này nằm bên trong câu lệnh else. + +90 +00:06:13,160 --> 00:06:18,160 +Khối mã này nằm bên trong câu lệnh if. Và nếu bạn nhầm lẫn với + +91 +00:06:19,340 --> 00:06:24,140 +thụt lề thì có thể bạn sẽ gặp lỗi thụt lề cho bạn + +92 +00:06:24,140 --> 00:06:28,250 +biết rằng dòng 5 này có lẽ nên được thụt lề. + +93 +00:06:28,910 --> 00:06:32,180 +Nhưng khi chúng tôi thực sự sửa nó và chúng tôi chạy, giả sử + +94 +00:06:32,780 --> 00:06:36,200 +rằng chiều cao của chúng tôi là 130 cm, sau đó chúng tôi quay + +95 +00:06:36,680 --> 00:06:39,410 +trở lại, bạn có thể đi tàu lượn siêu tốc. + +96 +00:06:40,010 --> 00:06:43,520 +Nhưng nếu chiều cao của chúng ta là 90 cm, thì chúng ta + +97 +00:06:43,790 --> 00:06:47,180 +sẽ có một kết quả khác. Chúng tôi hiểu, xin lỗi, bạn phải cao + +98 +00:06:47,180 --> 00:06:50,510 +thêm trước khi có thể đi xe. Vì vậy, bằng cách sử + +99 +00:06:50,600 --> 00:06:55,310 +dụng các câu lệnh if và else, chúng tôi có thể lấy mã của mình để + +100 +00:06:55,580 --> 00:07:00,580 +thực hiện những việc khác nhau, in dòng này hoặc in dòng này tùy thuộc vào điều + +101 +00:07:01,130 --> 00:07:05,660 +kiện mà chúng tôi đang thử nghiệm. Bây giờ, khi chúng ta sử dụng dấu + +102 +00:07:05,960 --> 00:07:10,960 +lớn hơn này, hiệu quả mà chúng ta đang nói là chiều cao lớn hơn 120, nghĩa + +103 +00:07:13,160 --> 00:07:17,030 +là nó không bao gồm 120. Trên thực tế, nếu tôi + +104 +00:07:17,030 --> 00:07:22,030 +chạy mã này và nếu tôi nhập chiều cao của mình là 120 thì thực sự + +105 +00:07:23,420 --> 00:07:25,760 +sẽ đi vào khối khác và in ra. + +106 +00:07:26,480 --> 00:07:31,480 +Vì vậy, nếu chúng ta muốn bao gồm 120 cm để tất cả những người chính xác + +107 +00:07:31,730 --> 00:07:35,810 +là 120 cm có thể đi tàu lượn siêu tốc, thì thay vì + +108 +00:07:36,230 --> 00:07:38,840 +chỉ sử dụng ký hiệu lớn hơn, chúng + +109 +00:07:38,960 --> 00:07:41,330 +ta phải viết lớn hơn hoặc bằng. + +110 +00:07:41,780 --> 00:07:44,570 +Vì vậy, hai biểu tượng này phải ở cạnh nhau. + +111 +00:07:45,470 --> 00:07:50,470 +Và bây giờ khi tôi chạy mã của mình và tôi viết 120, bạn sẽ thấy rằng nó hiện đang rơi vào khối mã này và nó + +112 +00:07:51,980 --> 00:07:56,630 +nói với tôi rằng tôi có thể đi tàu lượn siêu tốc. Bây giờ, chúng được gọi là + +113 +00:07:56,630 --> 00:08:01,630 +các toán tử so sánh và chúng ta đã thấy lớn hơn, vì vậy + +114 +00:08:01,730 --> 00:08:04,160 +nhỏ hơn khá là tự giải thích. + +115 +00:08:04,430 --> 00:08:09,140 +Nhưng chúng tôi cũng đã thấy lớn hơn hoặc bằng và nhỏ hơn hoặc bằng. + +116 +00:08:09,470 --> 00:08:13,580 +Vì vậy, nếu bạn muốn bao gồm một số cụ thể, một giá trị cụ thể, khi bạn thực + +117 +00:08:13,910 --> 00:08:17,270 +hiện các phép so sánh này, bạn sẽ sử dụng chúng để thay thế. + +118 +00:08:17,990 --> 00:08:22,580 +Bây giờ trong bảng này, cũng có bằng và không bằng. + +119 +00:08:23,450 --> 00:08:24,050 +Ví dụ, + +120 +00:08:24,050 --> 00:08:29,050 +nếu bạn muốn kiểm tra xem chiều cao của ai đó có chính xác bằng 120 hay không thì + +121 +00:08:30,860 --> 00:08:35,860 +bạn sẽ sử dụng hai dấu hiệu bằng nhau. Và thường thì nó sẽ hơi khó hiểu, đặc biệt + +122 +00:08:36,350 --> 00:08:40,370 +nếu bạn là người mới lập trình khi bạn đang gõ các dấu bằng, bởi vì đôi + +123 +00:08:40,429 --> 00:08:44,059 +khi chúng ta đang gõ một và những lần khác chúng ta đang gõ hai. + +124 +00:08:44,630 --> 00:08:47,420 +Điều quan trọng cần nhớ là khi bạn có + +125 +00:08:47,510 --> 00:08:52,400 +một dấu bằng, điều đó có nghĩa là bạn đang gán giá trị này cho biến này. + +126 +00:08:53,000 --> 00:08:54,950 +Nhưng khi bạn có hai dấu bằng + +127 +00:08:55,050 --> 00:08:59,640 +nhau, bạn đang kiểm tra xem giá trị bên trái có bằng giá trị bên phải và + +128 +00:08:59,640 --> 00:09:02,790 +chúng hoàn toàn khác nhau. Bây giờ, điều tốt + +129 +00:09:02,790 --> 00:09:04,650 +là khi bạn làm sai, thông + +130 +00:09:04,680 --> 00:09:09,680 +thường bạn sẽ có đủ manh mối về lỗi để thực sự gợi ý cho bạn, Này, + +131 +00:09:09,750 --> 00:09:13,380 +có thể có điều gì đó không ổn ở đây, phải không? + +132 +00:09:13,500 --> 00:09:17,220 +Vì cú pháp có vẻ không đúng. Để đây là một điều kiện, + +133 +00:09:17,250 --> 00:09:20,760 +nó phải là một cái gì đó được đánh giá là đúng hoặc sai. + +134 +00:09:21,180 --> 00:09:24,600 +Và chiều cao = 120 cũng không đánh giá được. + +135 +00:09:24,990 --> 00:09:26,520 +Vì vậy, bằng cách thay + +136 +00:09:26,580 --> 00:09:31,580 +đổi nó thành này, chúng tôi đang nói nếu chiều cao bằng 120 thì chúng tôi sẽ thực thi dòng mã + +137 +00:09:32,250 --> 00:09:35,100 +này hoặc bất kỳ dòng nào khác trong cùng một khối mã. + +138 +00:09:35,640 --> 00:09:40,640 +Nhưng nếu chiều cao không bằng 120 thì chúng ta sẽ thực + +139 +00:09:41,010 --> 00:09:45,000 +thi khối mã này. Vì vậy, nếu tôi viết 120 thì điều đó hoạt động. + +140 +00:09:45,330 --> 00:09:50,100 +Nhưng nếu tôi viết 121 thì nó không hoạt động. + +141 +00:09:51,000 --> 00:09:55,770 +Tương tự, bạn cũng có thể kiểm tra xem không bằng với, mà chỉ cần lật nó xung quanh. + +142 +00:09:56,220 --> 00:10:01,220 +Nhưng trong trường hợp của chúng tôi, sẽ có lý khi nói rằng nếu độ cao lớn + +143 +00:10:01,350 --> 00:10:05,700 +hơn hoặc bằng 120 thì bạn có thể đi tàu lượn siêu tốc. + +144 +00:10:06,120 --> 00:10:11,120 +Nhưng nếu không thì bạn không thể đi tàu lượn siêu tốc. Bằng cách sử dụng các câu lệnh if và + +145 +00:10:11,220 --> 00:10:12,570 +else, chúng ta có + +146 +00:10:12,780 --> 00:10:17,780 +thể giúp máy tính của mình thực hiện những việc khác nhau và phản hồi khác nhau tùy thuộc + +147 +00:10:18,060 --> 00:10:21,330 +vào các điều kiện khác nhau. Vì vậy, trong bài học tiếp theo, tôi có + +148 +00:10:21,390 --> 00:10:24,420 +một bài tập viết mã cho bạn. Tôi sẽ gặp bạn ở đó. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Fork-the-Day-3-Starting-Repl.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Fork-the-Day-3-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..b9e76d405c22f784f28bd4e7140f795f181ca1b1 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Fork-the-Day-3-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-3-start \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Ticketing-Flow-Chart-Version-1-if-else-statements.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Ticketing-Flow-Chart-Version-1-if-else-statements.url new file mode 100644 index 0000000000000000000000000000000000000000..5ff0e0fd673e080e5ffd2a83202d2b6ac877451e --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/003 Ticketing-Flow-Chart-Version-1-if-else-statements.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.draw.io/?lightbox=1&target=blank&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%201#R1VfbcpswEP0apk%2FJAAJfHmM7aR%2FSjlt3ps2jYm1ArUCukC%2Fk67sywqDgJM7Eub0w6Ggl7Z49uwKPjLPNZ0UX6VfJQHihzzYemXhhOIhCfBqgrICIkApIFGcVFDTAjN%2BCBX2LLjmDwjHUUgrNFy44l3kOc%2B1gVCm5ds1upHBPXdAEOsBsTkUX%2FcWZTm1YYb%2FBvwBP0vrkoDesZjJaG9tIipQyuW5B5NwjYyWlrt6yzRiE4a7mpVp3cc%2FszjEFuT5kwTQf3Pz8rmYwjVc%2FVmxzyf%2FJExtGocs6YGAYvx1KpVOZyJyK8wYdKbnMGZhdfRw1NpdSLhAMEPwDWpc2mXSpJUKpzoSdRYdV%2BdusP%2B2RsAauEDjxT%2F1%2BXCOTjT2jGpXt0RQUz0CDsmAVh3H%2BXnosVMilmsMDnNQyoyoB%2FYBdvEsiih8keqNKXKdAUM1Xrh%2FUyjDZ2dmlZ0rRsmWwkDzXRWvnqQHQwBYUIbagbD0FcdzOOr5UO9ajlmsNtFXGE1QyfGOVREHUVon%2FQQQSHUMgHQUEkSuAoe%2FuULllFzXKeKrQer3X15nlYkXF0rJje6tpbT2aoXBGid4m0w%2Bw52ceuehIU6Uyu15ilKN1yjXMFnSbzDVeT67A7GGgNGwe1kQ3h%2FWCoO%2ByVF9b6%2BauCHoWS1v3xN2ktdPe4vjpFJK3KNUj1lZ4YG3dk5eDa%2BtZJIcdnc7QYd2V4o7Y4HE53nAhxlJItV1LWAwDZtpeoZX8C62ZQXhNsDqPI2DiCjjco99wj36jl9Jv1KF2TPNPpgPg5yE8j%2BEj8EV8l6499T7ovyJd8T663gtZYb%2F%2Fvtiqz2%2FR9U12aMKAtcsFFTzJ8X2OgZsPipGhheNPwpmdyDhjVSuFgt%2FS6%2B1WppnaWxb3jUdePDF7YfcsqkZ6JJoHd%2B4gMuywTPaUcPhiLHev8SsoPjzN%2BC%2F7KM%2FRcXjGYfNfWH1cNT%2FX5Pw%2F \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 Exercise-8.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 Exercise-8.url new file mode 100644 index 0000000000000000000000000000000000000000..429ffa17c57e8344717bc67fc4ad3a2d3bb04e2c --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 Exercise-8.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/f50f12c1-f7ab-46c3-8cb9-c2a8cb67574d \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 How-to-join-Auditorium.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 [Interactive Coding Exercise] Odd or Even Introducing the Modulo.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 [Interactive Coding Exercise] Odd or Even Introducing the Modulo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d33f398b5d84b6b42f9d1ffe2a0e0aa412a841b1 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 [Interactive Coding Exercise] Odd or Even Introducing the Modulo.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37a4b395a92e9b76912dafe293f8043cb6588ce2ea802680fcb7bafc1c134bcd +size 13714395 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 [Interactive Coding Exercise] Odd or Even Introducing the Modulo_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 [Interactive Coding Exercise] Odd or Even Introducing the Modulo_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bacd0d4334e7b4c23dba16f87db825e4e78edc79 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/004 [Interactive Coding Exercise] Odd or Even Introducing the Modulo_vi.srt @@ -0,0 +1,312 @@ +1 +00:00:00,000 --> 00:00:02,640 +Bây giờ mục tiêu của bài tập này + +2 +00:00:02,640 --> 00:00:06,000 +là viết một chương trình sử dụng những + +3 +00:00:06,000 --> 00:00:09,330 +gì bạn đã học về câu lệnh điều kiện if và + +4 +00:00:09,330 --> 00:00:14,330 +else để tìm hiểu xem một số đầu vào là số lẻ hay số chẵn. + +5 +00:00:14,430 --> 00:00:17,670 +Vậy điều gì phân biệt số lẻ và số chẵn? + +6 +00:00:17,670 --> 00:00:21,720 +Vâng, theo định nghĩa, các số chẵn có thể + +7 +00:00:21,720 --> 00:00:24,870 +chia cho hai mà không có số dư. + +8 +00:00:24,870 --> 00:00:29,340 +Điều đó có nghĩa là kết quả cuối cùng không có chữ số thập phân. + +9 +00:00:29,340 --> 00:00:33,360 +Đó là một số nguyên và phép chia rõ ràng. + +10 +00:00:33,360 --> 00:00:35,610 +Trong khi đó nếu bạn lấy một số + +11 +00:00:35,610 --> 00:00:38,460 +lẻ, chẳng hạn như ba, rồi chia cho hai + +12 +00:00:38,460 --> 00:00:41,820 +thì kết quả là 1. 5 và nó có chữ số thập phân. + +13 +00:00:41,820 --> 00:00:44,040 +Nó không phải là một số nguyên. + +14 +00:00:44,040 --> 00:00:48,090 +Trong Python và nhiều ngôn ngữ lập trình khác, có một + +15 +00:00:48,090 --> 00:00:49,830 +cách để kiểm tra xem phép + +16 +00:00:49,830 --> 00:00:53,220 +chia có xảy ra không có phần dư hay không và đó + +17 +00:00:53,220 --> 00:00:56,310 +là thông qua một thứ gọi là modulo. + +18 +00:00:56,310 --> 00:01:00,630 +Bây giờ, bạn có thể sử dụng modulo bằng cách viết ký hiệu phần + +19 +00:01:00,630 --> 00:01:04,379 +trăm % và điều đó sẽ cho bạn số dư sau khi chia. + +20 +00:01:04,379 --> 00:01:09,380 +Ví dụ: nếu bạn chia sáu cho hai thì bằng ba + +21 +00:01:09,750 --> 00:01:11,580 +không có số dư. + +22 +00:01:11,580 --> 00:01:16,383 +Vậy nếu 6% 2 thì kết quả sẽ là 0. + +23 +00:01:17,670 --> 00:01:22,620 +Nhưng nếu bạn cố chia năm cho hai, thì hai có thể + +24 +00:01:22,620 --> 00:01:27,620 +chia thành năm hai lần, nhưng vẫn có một số dư. + +25 +00:01:28,260 --> 00:01:32,010 +Vậy năm modulo hai bằng một (5 % 2 = 1). + +26 +00:01:32,010 --> 00:01:34,410 +Bạn có thể xem trong khung mô tả để thấy + +27 +00:01:34,410 --> 00:01:39,410 +điều này được viết ra và hiểu cách thức hoạt động của modulo và bạn cũng có thể biết + +28 +00:01:40,380 --> 00:01:44,313 +thêm chi tiết về modulo bằng cách tìm kiếm trên Google. + +29 +00:01:45,180 --> 00:01:50,180 +Trong trường hợp của chúng tôi, chúng tôi muốn mã của mình có thể kiểm tra số đầu + +30 +00:01:50,880 --> 00:01:54,300 +vào và số đó đã sẵn sàng nhập và chúng tôi đang chuyển đổi + +31 +00:01:54,300 --> 00:01:55,980 +nó thành số nguyên. + +32 +00:01:55,980 --> 00:01:59,280 +Và chúng ta sẽ kiểm tra xem nó chẵn hay lẻ. + +33 +00:01:59,280 --> 00:02:02,760 +Nếu là số lẻ, chúng ta sẽ in ra kết + +34 +00:02:02,760 --> 00:02:05,250 +quả: "Đây là số lẻ. Và nếu nó là số chẵn, + +35 +00:02:05,250 --> 00:02:06,750 +chúng ta sẽ in + +36 +00:02:06,750 --> 00:02:09,539 +ra, "Đây là số chẵn. Đó là nhiệm vụ trước mắt và + +37 +00:02:09,539 --> 00:02:12,690 +bây giờ bạn phải bắt đầu loay + +38 +00:02:12,690 --> 00:02:15,900 +hoay và cố gắng tìm ra cách giải + +39 +00:02:15,900 --> 00:02:18,663 +bài tập viết mã này. + +40 +00:02:22,860 --> 00:02:24,900 +Điều đầu tiên chúng ta sẽ + +41 +00:02:24,900 --> 00:02:28,410 +kiểm tra bằng cách sử dụng câu lệnh if là liệu + +42 +00:02:28,410 --> 00:02:33,410 +giá trị được lưu trong biến số của chúng ta có chia hết cho 2 và + +43 +00:02:33,450 --> 00:02:37,590 +không có số dư hay không và chúng ta sẽ thực hiện việc + +44 +00:02:37,590 --> 00:02:41,670 +này bằng cách sử dụng modulo, do đó, số % 2 và thì ta + +45 +00:02:41,670 --> 00:02:46,670 +dùng dấu bằng kép (==) để kiểm tra xem nó có bằng 0 không. + +46 +00:02:47,040 --> 00:02:52,020 +Và điều này tương đương với việc nói nếu số chia cho 2 + +47 +00:02:52,020 --> 00:02:56,190 +không có chữ số thập phân thì trong trường hợp + +48 +00:02:56,190 --> 00:02:58,470 +đó nó phải là số chẵn. + +49 +00:02:58,470 --> 00:03:01,500 +Đó là lý do tại sao ở dòng tiếp theo, Dòng + +50 +00:03:01,500 --> 00:03:04,560 +6, chúng ta có một câu lệnh in thụt lề. + +51 +00:03:04,560 --> 00:03:08,460 +Câu lệnh in này sẽ được thực + +52 +00:03:08,460 --> 00:03:13,460 +hiện nếu điều kiện Dòng 5 là đúng. + +53 +00:03:15,270 --> 00:03:18,960 +Nếu đầu vào thực sự là một số chẵn, + +54 +00:03:18,960 --> 00:03:23,760 +giả sử đó là Số 4, 4/2, 2 chia thành 4 hai + +55 +00:03:23,760 --> 00:03:27,300 +lần và không có phần dư. + +56 +00:03:27,300 --> 00:03:28,133 +Vì vậy, toán + +57 +00:03:28,133 --> 00:03:31,830 +tử modulo cho chúng ta kết quả là 0. + +58 +00:03:31,830 --> 00:03:34,230 +Vì vậy, nếu điều kiện đó đúng, + +59 +00:03:34,230 --> 00:03:37,680 +nó sẽ rơi vào câu lệnh in thụt lề và bản in + +60 +00:03:37,680 --> 00:03:39,873 +ra, "Đây là số chẵn. Ngoài ra, hoặc trong + +61 +00:03:40,800 --> 00:03:44,850 +trường hợp này, trong điều kiện khác, + +62 +00:03:44,850 --> 00:03:49,850 +vì vậy nếu điều kiện Dòng 5 sai, nó không hoạt động + +63 +00:03:51,180 --> 00:03:54,180 +và còn dư, thì chúng ta sẽ in ra, + +64 +00:03:54,180 --> 00:03:56,583 +"Đây là số lẻ. Đây là cách mà chúng ta có thể thao tác + +65 +00:03:57,660 --> 00:04:00,930 +với các con số và kiểm tra chúng, đồng thời sử dụng những + +66 +00:04:00,930 --> 00:04:03,330 +gì chúng ta đã học về điều kiện để kiểm + +67 +00:04:03,330 --> 00:04:06,750 +tra xem một điều kiện có đúng và hoạt động theo một cách + +68 +00:04:06,750 --> 00:04:10,890 +nhất định hay không, hoặc nếu điều kiện đó sai thì chương trình của + +69 +00:04:10,890 --> 00:04:14,220 +chúng ta sẽ hoạt động theo một cách khác. + +70 +00:04:14,220 --> 00:04:16,110 +Nếu bạn cần thực hiện bất kỳ thay đổi nào đối + +71 +00:04:16,110 --> 00:04:17,010 +với mã của mình, vui lòng + +72 +00:04:17,010 --> 00:04:20,130 +quay lại trang trình bày trước đó và thực hiện những thay đổi đó. + +73 +00:04:20,130 --> 00:04:21,660 +Đừng cảm thấy như bạn đã thất bại hoặc bạn đang + +74 +00:04:21,660 --> 00:04:22,860 +gian lận hay bất cứ điều gì. + +75 +00:04:22,860 --> 00:04:25,620 +Đây là một phần của quá trình học tập. + +76 +00:04:25,620 --> 00:04:26,610 +Bạn có thể xem + +77 +00:04:26,610 --> 00:04:29,550 +xét giải pháp và học hỏi từ giải pháp đó. + +78 +00:04:29,550 --> 00:04:32,300 +Bạn không cần phải tìm hiểu mọi thứ ngay lần đầu tiên. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Nested if statements and elif statements.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Nested if statements and elif statements.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0cf72b44498ecbf2fca40cb64f39d8cb838a8af8 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Nested if statements and elif statements.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d40f6d27ee8bba0c54021805ed584fde786eff3bb9572a48f129b01c33695200 +size 36199206 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Nested if statements and elif statements_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Nested if statements and elif statements_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d3fb7190fab7b0e8128c7cd5b70e728cd6c70140 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Nested if statements and elif statements_vi.srt @@ -0,0 +1,344 @@ +1 +00:00:00,310 --> 00:00:01,630 +Trong các bài học + +2 +00:00:01,720 --> 00:00:06,720 +trước, chúng ta đã học về cách sử dụng câu lệnh if và else để kiểm tra xem + +3 +00:00:07,990 --> 00:00:12,990 +ai đó có cao trên 120 cm hay không và cho phép họ thực sự mua vé nếu + +4 +00:00:14,530 --> 00:00:19,390 +họ cao hơn một chiều cao nhất định. Bây giờ ngoài chiều cao, có một + +5 +00:00:19,870 --> 00:00:24,370 +điều kiện khác mà chúng ta cần kiểm tra, đó là tuổi của họ. + +6 +00:00:24,850 --> 00:00:29,260 +Nếu ai đó trên 18 tuổi và họ phải trả giá người lớn, + +7 +00:00:29,290 --> 00:00:33,940 +giả sử là 12 đô la. Nhưng nếu họ từ 18 tuổi trở + +8 +00:00:34,030 --> 00:00:39,030 +xuống, thì họ chỉ nên trả $ 7. Vì vậy, làm thế nào chúng ta có thể biểu diễn điều kiện bổ sung này + +9 +00:00:40,510 --> 00:00:43,810 +mà chúng ta cần kiểm tra trong mã của mình? Chà, chúng ta có thể + +10 +00:00:43,810 --> 00:00:47,830 +sử dụng một thứ gọi là câu lệnh if / else lồng nhau. + +11 +00:00:48,550 --> 00:00:49,390 +Chúng tôi đã thấy + +12 +00:00:49,420 --> 00:00:53,650 +các câu lệnh if / else của chúng tôi trông giống như thế này trong đó nó chỉ có hai lựa chọn. + +13 +00:00:54,040 --> 00:00:57,370 +Nếu điều kiện này là đúng, hãy làm điều này, nếu không hãy làm điều đó. + +14 +00:00:58,060 --> 00:01:02,980 +Nhưng trong câu lệnh if lồng nhau, khi điều kiện đầu tiên đã qua, chúng ta + +15 +00:01:03,400 --> 00:01:08,400 +có thể kiểm tra điều kiện khác. Và sau đó chúng ta có thể có một câu lệnh + +16 +00:01:10,990 --> 00:01:15,990 +if / else khác bên trong điều kiện if này. Để điều này xảy ra, điều này phải + +17 +00:01:16,750 --> 00:01:21,640 +đúng và điều này cũng phải đúng. Để điều này xảy ra, điều + +18 +00:01:21,850 --> 00:01:25,690 +kiện này phải đúng nhưng điều kiện này phải sai. + +19 +00:01:26,590 --> 00:01:30,250 +Vì vậy, về cơ bản, trước tiên máy tính sẽ nhìn vào bức tranh + +20 +00:01:30,760 --> 00:01:35,200 +lớn hơn, đây là điều kiện đầu tiên và quyết định xem liệu nó có nên đi vào + +21 +00:01:35,200 --> 00:01:40,200 +khối khác ở đây hay không hoặc liệu nó có nên đi vào khối lồng nhau bên trong câu lệnh + +22 +00:01:41,650 --> 00:01:42,483 +if hay không. + +23 +00:01:43,090 --> 00:01:48,090 +Vì vậy, bây giờ đây là biểu đồ của chúng tôi trông như thế nào. Trong câu lệnh if đầu tiên, chúng tôi kiểm tra xem liệu + +24 +00:01:48,520 --> 00:01:52,690 +chiều cao của họ có trên 120 cm hay không. Nếu không, thì tất cả các câu + +25 +00:01:52,810 --> 00:01:56,590 +lệnh if đều kết thúc. Bạn không thể đi xe, bạn không thể mua vé. + +26 +00:01:57,100 --> 00:01:58,000 +Nhưng nếu có, + +27 +00:01:58,030 --> 00:02:02,920 +chúng tôi thực sự đưa họ đến một câu lệnh if khác, nơi chúng tôi kiểm tra tuổi của họ. + +28 +00:02:03,430 --> 00:02:08,169 +Nếu họ từ 18 tuổi trở xuống, thì chúng tôi tặng họ một vé $ 7. + +29 +00:02:08,770 --> 00:02:13,770 +Nếu họ trên 18 tuổi thì họ phải trả $ 12. Vì vậy, nơi mà chúng ta sẽ lồng câu lệnh + +30 +00:02:14,350 --> 00:02:19,270 +if của chúng ta ở bên trong đây. Chú ý cách nó thụt vào. + +31 +00:02:19,330 --> 00:02:22,390 +Vì vậy, nó đã ở bên trong khối if này, và + +32 +00:02:22,780 --> 00:02:24,850 +điều này đã trở thành sự thật. + +33 +00:02:25,750 --> 00:02:30,750 +Bây giờ ở đây chúng ta sẽ tạo một câu lệnh if và else khác và điều + +34 +00:02:31,690 --> 00:02:35,320 +kiện kiểm tra tuổi của chúng. Vì vậy, tốt hơn chúng ta nên hỏi họ một tuổi. + +35 +00:02:35,740 --> 00:02:40,740 +Giả sử age bằng chuyển đổi các đầu vào thành int và "tuổi của bạn là bao nhiêu? "Vì vậy, bây giờ chúng tôi đã nắm được + +36 +00:02:43,060 --> 00:02:45,400 +tuổi của họ, chúng tôi có thể xem + +37 +00:02:45,460 --> 00:02:50,460 +liệu tuổi của họ nhỏ hơn hoặc bằng 18. Trong trường hợp này, chúng + +38 +00:02:51,760 --> 00:02:54,460 +tôi sẽ cho họ vé $ 7. + +39 +00:02:56,800 --> 00:03:00,370 +Nhưng cụ thể là, nếu điều này không đúng, nếu tuổi + +40 +00:03:00,370 --> 00:03:05,370 +của họ trên 18, thì, trong trường hợp đó, chúng tôi sẽ tặng họ vé 12 + +41 +00:03:06,280 --> 00:03:07,113 +đô la. + +42 +00:03:08,200 --> 00:03:12,280 +Vì vậy, bây giờ chúng ta có một câu lệnh if lồng + +43 +00:03:12,400 --> 00:03:17,400 +nhau, bởi vì câu lệnh if và else này nằm bên trong câu lệnh if này. + +44 +00:03:18,370 --> 00:03:23,320 +Vì vậy, điều kiện này sẽ chỉ được kiểm tra nếu điều này đã được coi là đúng. + +45 +00:03:23,830 --> 00:03:28,600 +Bây giờ, hãy nói rằng tình huống của chúng ta phức tạp hơn một chút. Ông chủ đến, kiểm tra mã của chúng tôi + +46 +00:03:28,660 --> 00:03:31,210 +và nói, đợi đã, đợi đã, thực sự có + +47 +00:03:31,540 --> 00:03:35,020 +nhiều mức giá hơn thế. Trên thực tế, nếu bạn + +48 +00:03:35,410 --> 00:03:38,470 +dưới 12 tuổi, bạn phải trả 5 đô la. + +49 +00:03:39,130 --> 00:03:44,130 +Nếu bạn từ 12 đến 18 tuổi, bạn phải trả 7 đô la và nếu bạn trên 18 tuổi + +50 +00:03:45,310 --> 00:03:46,450 +thì bạn phải trả + +51 +00:03:46,480 --> 00:03:51,130 +giá người lớn đầy đủ, là 12 đô la. Bây giờ có ba khả năng, vậy làm cách nào để + +52 +00:03:51,430 --> 00:03:55,570 +biểu diễn điều này trong câu lệnh if? Chà, chúng ta có thể + +53 +00:03:55,600 --> 00:04:00,600 +sử dụng một thứ gọi là elif. Thay vì có một câu lệnh if / else đơn + +54 +00:04:01,600 --> 00:04:05,380 +giản chỉ có một điều kiện. Nếu đó là sự thật, hãy làm điều này. + +55 +00:04:05,650 --> 00:04:06,970 +Nếu không, hãy làm điều đó. + +56 +00:04:07,750 --> 00:04:12,750 +Bạn có thể thêm nhiều điều kiện elif như bạn muốn. Vì vậy, chúng tôi có thể + +57 +00:04:13,660 --> 00:04:18,130 +kiểm tra điều kiện 1. Nếu điều đó đúng, thì hãy thực hiện câu a, nhưng nếu + +58 +00:04:18,459 --> 00:04:21,519 +điều đó không đúng, thì chúng ta có thể tiếp tục và kiểm tra điều kiện 2. + +59 +00:04:22,180 --> 00:04:26,920 +Nếu điều kiện 2 là đúng, thì chúng ta có thể làm B. Và cuối cùng, nếu không có điều + +60 +00:04:26,980 --> 00:04:30,910 +kiện nào là đúng, chúng ta có thể làm điều cuối cùng này. + +61 +00:04:31,570 --> 00:04:36,160 +Biểu đồ luồng của chúng tôi bây giờ trông giống như thế này và đây là logic + +62 +00:04:36,160 --> 00:04:40,690 +mà chúng tôi đang cố gắng lập trình. Khi chúng ta đã ở bên trong câu lệnh if lồng nhau này, chúng ta sẽ kiểm + +63 +00:04:40,990 --> 00:04:45,990 +tra xem liệu độ tuổi dưới 12 có phải là trường hợp mà họ phải trả $ 5 hay không. Nếu họ từ 12 đến 18 tuổi + +64 +00:04:47,350 --> 00:04:52,350 +thì họ phải trả 7 đô la và cuối cùng nếu trên 18 tuổi + +65 +00:04:53,200 --> 00:04:58,200 +thì họ phải trả 12 đô la. Bây giờ điều đầu tiên tôi sẽ kiểm tra xem + +66 +00:05:00,700 --> 00:05:04,450 +tuổi có dưới 12 hay không. Theo điều kiện này, + +67 +00:05:04,720 --> 00:05:08,890 +họ phải trả $ 5. Vì vậy, hãy thay đổi điều đó thành năm. + +68 +00:05:10,000 --> 00:05:13,870 +Bây giờ điều kiện tiếp theo sẽ được tạo bằng cách sử dụng elif, + +69 +00:05:14,320 --> 00:05:17,410 +viết tắt của else if. Vì vậy, nó có nghĩa là, + +70 +00:05:17,530 --> 00:05:21,880 +nếu điều này không đúng, nếu không, bạn có thể kiểm tra xem điều này có đúng không? + +71 +00:05:22,090 --> 00:05:25,720 +Trong trường hợp đó thì chúng ta nên làm điều này. Ví dụ, nếu độ tuổi không dưới 12, + +72 +00:05:25,960 --> 00:05:30,960 +vậy họ trên 12 tuổi, vậy họ có phải dưới 18 tuổi không? Vậy thì điều kiện này về cơ bản phù hợp + +73 +00:05:34,240 --> 00:05:39,240 +với tất cả mọi người từ 12 đến 18 tuổi. Và cuối cùng, nếu họ không + +74 +00:05:41,350 --> 00:05:46,350 +nhỏ hơn hoặc bằng 18 và không dưới 12 thì đó là những + +75 +00:05:47,200 --> 00:05:49,420 +người khác trên 18 tuổi. + +76 +00:05:51,130 --> 00:05:56,130 +Bây giờ hãy nhớ rằng chúng ta có thể sử dụng bao nhiêu điều kiện elif giữa if và + +77 +00:05:56,140 --> 00:05:56,973 +else tùy thích. + +78 +00:05:57,050 --> 00:06:02,050 +Vì vậy, tôi có thể thêm một elif khác để kiểm tra xem liệu tuổi có nhỏ hơn + +79 +00:06:02,720 --> 00:06:06,380 +không, chẳng hạn, trong trường hợp này là 22, hãy làm việc khác. + +80 +00:06:06,650 --> 00:06:10,610 +Và sau đó tôi có thể tiếp tục với những elifs này cho đến khi tôi hoàn thành + +81 +00:06:10,610 --> 00:06:14,210 +tất cả các điều kiện của mình. Vì vậy, hãy chơi một vòng + +82 +00:06:14,510 --> 00:06:17,180 +với mã này, tự viết nó, xem nó có hợp + +83 +00:06:17,570 --> 00:06:22,340 +lý không, và sau đó xoay quanh các elifs để nó thực hiện những gì bạn mong đợi. + +84 +00:06:23,000 --> 00:06:24,080 +Và khi bạn đã sẵn sàng, + +85 +00:06:24,290 --> 00:06:27,680 +hãy tiếp tục và chuyển sang bài học tiếp theo, nơi tôi có một thử thách viết mã cho + +86 +00:06:27,680 --> 00:06:27,920 +bạn. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Ticketing-Flow-Chart-Version-2-nested-if-else-statements.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Ticketing-Flow-Chart-Version-2-nested-if-else-statements.url new file mode 100644 index 0000000000000000000000000000000000000000..e40ae2d32d43528547f79ad1e5ca82f55a52f3e3 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Ticketing-Flow-Chart-Version-2-nested-if-else-statements.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.draw.io/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%202#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1J7_rw1flGeF0hmc_zrMzPX7t6xkbcsiX%26export%3Ddownload \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Ticketing-Flow-Chart-Version-3-if-elif-else-statements.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Ticketing-Flow-Chart-Version-3-if-elif-else-statements.url new file mode 100644 index 0000000000000000000000000000000000000000..4bcefe01fa688647fb78c3e594b4ef3c88509b68 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/005 Ticketing-Flow-Chart-Version-3-if-elif-else-statements.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.draw.io/?lightbox=1&target=blank&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%202#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1XaUDMIKOxCUzJbsuZevgHZmgKr7rICbI%26export%3Ddownload \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 Exercise-9.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 Exercise-9.url new file mode 100644 index 0000000000000000000000000000000000000000..b337e304dce27fcaf462e60131c002f0224df97e --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 Exercise-9.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/7a12b4b1-76d3-4d04-820d-938547daba55 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 How-to-join-Auditorium.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 [Interactive Coding Exercise] BMI 2.0.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 [Interactive Coding Exercise] BMI 2.0.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c3241b9e7ce276052ea2598883087227720e94a8 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 [Interactive Coding Exercise] BMI 2.0.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8314bc3beb1a2e2480f6386627ec8646c1bb94064c5d54d84ddb2f54666b4b10 +size 16180074 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 [Interactive Coding Exercise] BMI 2.0_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 [Interactive Coding Exercise] BMI 2.0_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..910960c7c0d2b913f2f080cf47941df99cd7e3ac --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/006 [Interactive Coding Exercise] BMI 2.0_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:01,020 --> 00:00:02,130 +Trong bài tập + +2 +00:00:02,130 --> 00:00:03,510 +này, chúng ta sẽ viết + +3 +00:00:03,510 --> 00:00:08,280 +một số mã để nâng cấp phiên bản trước của máy tính BMI. + +4 +00:00:08,280 --> 00:00:12,570 +Đây là công cụ tính chỉ số BMI của chúng tôi 2. 0, nếu bạn muốn. + +5 +00:00:12,570 --> 00:00:14,250 +Bây giờ, chúng ta sẽ viết một + +6 +00:00:14,250 --> 00:00:17,280 +chương trình giải thích Chỉ số khối cơ thể thay vì + +7 +00:00:17,280 --> 00:00:20,280 +chỉ in ra nó là gì, bởi vì đối với hầu hết mọi người, + +8 +00:00:20,280 --> 00:00:21,450 +những con số này thực + +9 +00:00:21,450 --> 00:00:23,730 +sự không có ý nghĩa gì cả. + +10 +00:00:23,730 --> 00:00:25,530 +Nếu bạn nhìn vào khung mô + +11 +00:00:25,530 --> 00:00:27,870 +tả, bạn sẽ thấy có một biểu đồ cho + +12 +00:00:27,870 --> 00:00:32,870 +thấy các bác sĩ phân loại chỉ số BMI khác nhau như thế nào. + +13 +00:00:33,330 --> 00:00:35,340 +Nếu bạn nằm trong dải màu xanh lá cây, tức là + +14 +00:00:35,340 --> 00:00:39,270 +nếu chỉ số BMI của bạn nằm trong khoảng 18. 5 và 25 thì được coi + +15 +00:00:39,270 --> 00:00:42,930 +là cân nặng bình thường. + +16 +00:00:42,930 --> 00:00:45,180 +Và tùy thuộc vào nhóm bạn thuộc + +17 +00:00:45,180 --> 00:00:47,460 +nhóm nào, các bác sĩ sẽ đưa ra những + +18 +00:00:47,460 --> 00:00:49,650 +cách phân loại khác nhau. + +19 +00:00:49,650 --> 00:00:50,820 +Những gì chúng ta + +20 +00:00:50,820 --> 00:00:53,910 +sắp làm là lấy chiều cao và cân nặng của người + +21 +00:00:53,910 --> 00:00:55,740 +dùng, chúng ta sẽ tính chỉ số + +22 +00:00:55,740 --> 00:00:58,080 +BMI, và chúng ta sẽ đưa ra một bản in + +23 +00:00:58,080 --> 00:01:03,080 +cho họ biết, "BMI của bạn là X... ", bất kể chúng tôi đã tính toán + +24 +00:01:03,210 --> 00:01:07,140 +điều gì và sau đó chúng tôi sẽ giải thích cho họ. + +25 +00:01:07,140 --> 00:01:10,740 +Bạn thiếu cân hoặc có cân nặng bình thường và bạn + +26 +00:01:10,740 --> 00:01:13,290 +có thể kiểm tra trong khung mô tả để + +27 +00:01:13,290 --> 00:01:16,980 +biết chính xác kết quả đầu ra của bạn cần phù hợp. + +28 +00:01:16,980 --> 00:01:18,930 +Bây giờ, tôi biết mọi người + +29 +00:01:18,930 --> 00:01:22,620 +hơi nhạy cảm về những chủ đề này, và có một số nhận + +30 +00:01:22,620 --> 00:01:26,100 +định nhất định, như bạn béo phì hoặc bạn hơi + +31 +00:01:26,100 --> 00:01:28,020 +thừa cân, điều đó có thể + +32 +00:01:28,020 --> 00:01:31,800 +khó khăn, nhưng chỉ cần biết rằng đây là những + +33 +00:01:31,800 --> 00:01:36,420 +từ xuất phát từ cách giải thích lâm sàng của chỉ số BMI và + +34 +00:01:36,420 --> 00:01:41,010 +chúng ta sẽ xuất chúng ra từ máy tính của mình. + +35 +00:01:41,010 --> 00:01:43,290 +Hãy xem một số Đầu vào + +36 +00:01:43,290 --> 00:01:46,050 +mẫu và Đầu ra mẫu và xem bạn + +37 +00:01:46,050 --> 00:01:49,230 +dự kiến sẽ tạo ra những gì. + +38 +00:01:49,230 --> 00:01:51,810 +Sau đó, hãy xem liệu bạn có thể nhớ cách + +39 +00:01:51,810 --> 00:01:55,890 +tạo công cụ tính chỉ số BMI lần thứ hai và thêm vào một phần + +40 +00:01:55,890 --> 00:01:59,010 +diễn giải nhỏ giống như những gì bạn thấy trong + +41 +00:01:59,010 --> 00:02:01,620 +khung mô tả hay không. + +42 +00:02:01,620 --> 00:02:03,993 +Hãy thực hiện bài tập mã hóa này. + +43 +00:02:12,650 --> 00:02:14,940 +Vì vậy, bước đầu tiên là làm những gì + +44 +00:02:14,940 --> 00:02:18,150 +chúng ta đã làm trước đó, đó là tính chỉ số BMI bằng + +45 +00:02:18,150 --> 00:02:21,600 +công thức cân nặng chia cho bình phương chiều cao. + +46 +00:02:21,600 --> 00:02:24,540 +Và một khi chúng ta đã nắm được giá trị đó, thì chúng + +47 +00:02:24,540 --> 00:02:27,540 +ta có thể sử dụng các câu lệnh if và else để tìm ra cách + +48 +00:02:27,540 --> 00:02:30,513 +giải thích mà chúng ta nên đưa ra cho chúng. + +49 +00:02:31,410 --> 00:02:36,410 +Trong trường hợp chỉ số BMI của họ nhỏ hơn 18. 5 thì chúng ta sẽ in ra "Chỉ + +50 +00:02:36,510 --> 00:02:41,510 +số BMI của bạn là... " bất kể đó là gì, và sau + +51 +00:02:42,030 --> 00:02:44,940 +đó "bạn bị thiếu cân. Và điều kiện này được kiểm + +52 +00:02:44,940 --> 00:02:47,400 +tra trong câu lệnh if + +53 +00:02:47,400 --> 00:02:50,043 +đầu tiên trên dòng 5. + +54 +00:02:51,120 --> 00:02:53,670 +Bây giờ, vì có nhiều điều kiện, không + +55 +00:02:53,670 --> 00:02:55,770 +chỉ một điều kiện duy nhất, nên + +56 +00:02:55,770 --> 00:02:59,220 +chúng ta sẽ cần sử dụng "câu lệnh Elif". + +57 +00:02:59,220 --> 00:03:03,330 +Vì vậy, chúng ta viết elif, viết tắt của else if, và chúng ta có + +58 +00:03:03,330 --> 00:03:06,300 +thể cung cấp một điều kiện khác để kiểm tra. + +59 +00:03:06,300 --> 00:03:10,290 +Chà, nếu chỉ số BMI không dưới 18. 5, chúng ta chuyển + +60 +00:03:10,290 --> 00:03:12,150 +sang dòng 7. + +61 +00:03:12,150 --> 00:03:15,420 +Elif là chỉ số BMI nhỏ hơn 25. + +62 +00:03:15,420 --> 00:03:19,290 +Vì vậy, điều đó có nghĩa là nếu câu đầu tiên ở dòng 5 là sai thì dòng + +63 +00:03:19,290 --> 00:03:21,870 +7 thực sự kiểm tra xem liệu chỉ số BMI có nằm + +64 +00:03:21,870 --> 00:03:26,220 +trong khoảng 18 hay không. 5 và 25. + +65 +00:03:26,220 --> 00:03:29,010 +Và khi chỉ số BMI nằm trong phạm vi đó, + +66 +00:03:29,010 --> 00:03:32,970 +thì dòng chữ in ra, "Chỉ số BMI của bạn là X, bạn có cân + +67 +00:03:32,970 --> 00:03:36,033 +nặng bình thường. " sẽ được in ra. + +68 +00:03:37,170 --> 00:03:40,350 +Tiếp theo, chúng tôi có thêm hai câu lệnh Elif để + +69 +00:03:40,350 --> 00:03:43,920 +kiểm tra xem chỉ số BMI của họ có nằm trong khoảng từ 25 đến + +70 +00:03:43,920 --> 00:03:46,830 +30 và cũng nằm trong khoảng từ 30 đến 35 hay không, + +71 +00:03:46,830 --> 00:03:50,403 +rồi chúng tôi in ra cách diễn giải tương ứng. + +72 +00:03:51,750 --> 00:03:55,980 +Cuối cùng, chúng ta kết thúc câu lệnh có điều kiện bằng một câu + +73 +00:03:55,980 --> 00:03:59,040 +lệnh khác bao gồm tất cả các tình huống khác. + +74 +00:03:59,040 --> 00:04:01,710 +Và trong trường hợp này, vì chúng ta đã + +75 +00:04:01,710 --> 00:04:03,540 +khá chi tiết về các tình trạng + +76 +00:04:03,540 --> 00:04:04,740 +khác nhau, nên tình + +77 +00:04:04,740 --> 00:04:07,020 +trạng duy nhất khác sẽ kích hoạt + +78 +00:04:07,020 --> 00:04:10,950 +câu lệnh khác là nếu chỉ số BMI từ 35 trở lên. + +79 +00:04:10,950 --> 00:04:14,220 +Và trong trường hợp này, chúng tôi cung cấp cho họ lời giải + +80 +00:04:14,220 --> 00:04:16,470 +thích cuối cùng bên trong bản in này. + +81 +00:04:16,470 --> 00:04:19,380 +Nếu bạn gặp bất kỳ vấn đề nào khi lấy mã để + +82 +00:04:19,380 --> 00:04:22,530 +vượt qua các bài kiểm tra ở trang trình bày trước, + +83 +00:04:22,530 --> 00:04:25,710 +hãy xem liệu bạn có thể hiểu điều gì đang diễn + +84 +00:04:25,710 --> 00:04:28,170 +ra trong giải pháp mã này không và + +85 +00:04:28,170 --> 00:04:30,813 +thử sửa mã của mình nếu cần. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 Exercise-10.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 Exercise-10.url new file mode 100644 index 0000000000000000000000000000000000000000..a7e760640788a3f3ab80364498d237a5d4ec0f37 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 Exercise-10.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/3aa8ecef-1215-4988-8e52-a3c59e931231 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 How-to-join-Auditorium.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 [Interactive Coding Exercise] Leap Year.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 [Interactive Coding Exercise] Leap Year.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4cadf6b8323fe3c03f43b28a20bee6d9eb66a2bc --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 [Interactive Coding Exercise] Leap Year.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:621ad7972d51a293ec06317b778a1f2d4b52ea11d68f30033d2cec222a9976f1 +size 26135648 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 [Interactive Coding Exercise] Leap Year_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 [Interactive Coding Exercise] Leap Year_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..34a9b84909abe7a20f35ce221e299fcf32e94603 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/007 [Interactive Coding Exercise] Leap Year_vi.srt @@ -0,0 +1,632 @@ +1 +00:00:01,140 --> 00:00:04,440 +Bài tập viết mã này là một bài tập khó và bạn + +2 +00:00:04,440 --> 00:00:07,710 +có thể thấy điều đó trong hộp mô tả. + +3 +00:00:07,710 --> 00:00:11,010 +Tôi đã đánh dấu nó là một thử thách khó khăn. + +4 +00:00:11,010 --> 00:00:13,620 +Mục tiêu của bài tập này là để bạn xây + +5 +00:00:13,620 --> 00:00:17,790 +dựng một chương trình kiểm tra xem năm nào được đưa ra có phải + +6 +00:00:17,790 --> 00:00:20,343 +năm đó là năm nhuận hay không. + +7 +00:00:21,180 --> 00:00:25,813 +Một năm nhuận có 366 ngày thay vì 365 ngày như thường lệ + +8 +00:00:27,330 --> 00:00:29,790 +và có thêm một ngày vào tháng + +9 +00:00:29,790 --> 00:00:31,920 +2 và điều này thực sự thú vị, + +10 +00:00:31,920 --> 00:00:35,640 +lý do tại sao chúng ta cần một năm nhuận. + +11 +00:00:35,640 --> 00:00:38,130 +Và trong hộp mô tả, bạn sẽ thấy liên kết + +12 +00:00:38,130 --> 00:00:40,350 +tới một video thực sự giải thích cho + +13 +00:00:40,350 --> 00:00:43,290 +bạn lý do đầy đủ đằng sau video đó và nó thực sự + +14 +00:00:43,290 --> 00:00:44,370 +rất hấp dẫn. + +15 +00:00:44,370 --> 00:00:47,010 +Vì vậy hãy xem nếu bạn quan tâm. + +16 +00:00:47,010 --> 00:00:49,950 +Để biết liệu một năm có phải là năm nhuận + +17 +00:00:49,950 --> 00:00:54,950 +hay không, có một logic nào đó và nó được thể hiện như thế này. + +18 +00:00:55,180 --> 00:01:00,180 +Vì vậy, bạn lấy một năm cụ thể và đó là năm nhuận + +19 +00:01:00,240 --> 00:01:05,239 +nếu nó có thể chia hết cho 4 mà không có số dư, ngoại + +20 +00:01:05,801 --> 00:01:09,450 +trừ nếu năm đó cũng chia hết cho 100 + +21 +00:01:09,450 --> 00:01:13,860 +và không có số dư, và trừ khi năm đó cũng chia + +22 +00:01:13,860 --> 00:01:17,910 +hết cho 400 mà không có số dư. + +23 +00:01:17,910 --> 00:01:21,120 +Vì vậy, thực tế có ba bước chúng ta cần thực hiện trong + +24 +00:01:21,120 --> 00:01:23,040 +suốt một năm của mình. + +25 +00:01:23,040 --> 00:01:27,000 +Và đó là bởi vì các tiêu chí này đảo lộn xem một năm là năm + +26 +00:01:27,000 --> 00:01:29,970 +nhuận hay không phải là năm nhuận. + +27 +00:01:29,970 --> 00:01:33,810 +Nếu bạn nhìn vào ví dụ trong hộp mô tả và thấy + +28 +00:01:33,810 --> 00:01:36,750 +cách tôi đã làm qua nhiều năm khác + +29 +00:01:36,750 --> 00:01:41,730 +nhau, như năm 2000 hay năm 2100 và cách tôi áp dụng những quy + +30 +00:01:41,730 --> 00:01:46,730 +tắc này vào toán học để cho bạn thấy cái nào là bước nhảy vọt + +31 +00:01:46,980 --> 00:01:49,770 +và cái nào không bước nhảy vọt và + +32 +00:01:49,770 --> 00:01:51,990 +logic đằng sau nó. + +33 +00:01:51,990 --> 00:01:55,390 +Điều tôi khuyên bạn nên làm là hãy tự mình thử bằng bút và + +34 +00:01:56,422 --> 00:01:59,070 +giấy trước khi viết bất kỳ mã nào, chỉ cần chọn + +35 +00:01:59,070 --> 00:02:02,220 +một năm ngẫu nhiên trong đầu bạn và thực hiện theo ba + +36 +00:02:02,220 --> 00:02:05,430 +quy tắc này và tìm hiểu xem liệu đó có phải là năm nhuận + +37 +00:02:05,430 --> 00:02:08,100 +hay không. năm nhuận, sau đó chỉ cần gõ vào Google + +38 +00:02:08,100 --> 00:02:12,480 +năm đó và kiểm tra xem đây có phải là năm nhuận không? + +39 +00:02:12,480 --> 00:02:15,180 +Đó có lẽ là cách dễ nhất để bạn hiểu + +40 +00:02:16,342 --> 00:02:18,570 +được ba quy tắc này. + +41 +00:02:18,570 --> 00:02:20,640 +Bây giờ, nếu tiếng Anh không phải + +42 +00:02:20,640 --> 00:02:25,470 +là ngôn ngữ đầu tiên của bạn và bạn gặp khó khăn trong việc hiểu ý nghĩa của + +43 +00:02:25,470 --> 00:02:28,907 +các câu đó thì tôi thực sự đã tạo một sơ đồ cho bạn. + +44 +00:02:28,907 --> 00:02:31,980 +Vì vậy, nếu bạn nhấp vào liên kết trong hộp mô + +45 +00:02:31,980 --> 00:02:34,290 +tả, nó sẽ đưa bạn đến một biểu đồ mà + +46 +00:02:34,290 --> 00:02:37,460 +bạn có thể sử dụng để tìm hiểu xem một năm là năm + +47 +00:02:37,460 --> 00:02:40,020 +nhuận hay không phải là năm nhuận. + +48 +00:02:40,020 --> 00:02:41,640 +Và điều này có thể thực sự hữu ích + +49 +00:02:41,640 --> 00:02:43,680 +ngay cả khi tiếng Anh là ngôn ngữ đầu tiên + +50 +00:02:43,680 --> 00:02:45,360 +của bạn vì nó thực sự khó. + +51 +00:02:45,360 --> 00:02:49,080 +Từ ngữ dành cho logic có thể gây nhầm lẫn, nhưng tôi + +52 +00:02:49,080 --> 00:02:52,200 +nghĩ việc chuyển đổi thứ gì đó logic, nghĩa + +53 +00:02:52,200 --> 00:02:53,610 +là từ ngữ thành một + +54 +00:02:53,610 --> 00:02:57,150 +chương trình, là điều thực sự quan trọng. + +55 +00:02:57,150 --> 00:03:00,900 +Tất nhiên tôi có thể diễn đạt lại câu này thành "Nếu cái này, + +56 +00:03:00,900 --> 00:03:02,910 +thì cái kia... " nhưng điều đó giống như + +57 +00:03:02,910 --> 00:03:04,320 +gian lận và viết nó cho bạn. + +58 +00:03:04,320 --> 00:03:06,070 +Vì vậy, đừng lo lắng nếu bạn + +59 +00:03:07,202 --> 00:03:08,430 +làm sai, chỉ cần cố + +60 +00:03:08,430 --> 00:03:11,160 +gắng hết sức để tìm ra cách logic hoạt động, + +61 +00:03:11,160 --> 00:03:14,370 +hiểu nó nếu bạn vẫn không hiểu nó, hãy sử dụng biểu + +62 +00:03:14,370 --> 00:03:17,610 +đồ luồng và sau đó chuyển logic đó thành mã. + +63 +00:03:17,610 --> 00:03:19,893 +Vì vậy, đó là thách thức của bạn. + +64 +00:03:28,110 --> 00:03:30,180 +Điều đầu tiên chúng ta biết là chúng + +65 +00:03:30,180 --> 00:03:35,180 +ta có thể lấy năm dưới dạng số nguyên vào chương trình ở dòng thứ hai và chúng ta có + +66 +00:03:35,340 --> 00:03:37,170 +thể làm việc với nó bằng cách sử + +67 +00:03:37,170 --> 00:03:40,890 +dụng các câu lệnh điều kiện khác nhau để kiểm tra xem năm đó có + +68 +00:03:40,890 --> 00:03:43,923 +phù hợp với tiêu chí của chúng ta hay không. + +69 +00:03:45,210 --> 00:03:47,430 +Điều đầu tiên chúng ta sẽ kiểm + +70 +00:03:47,430 --> 00:03:49,590 +tra là liệu năm đó có thể chia + +71 +00:03:49,590 --> 00:03:52,560 +cho 4 mà không có số dư hay không, và hãy + +72 +00:03:52,560 --> 00:03:55,620 +nhớ để tìm ra số dư trong lập trình, chúng + +73 +00:03:55,620 --> 00:03:58,410 +ta sử dụng ký hiệu modulo (%). + +74 +00:03:58,410 --> 00:04:01,444 +Vì vậy, chúng ta đã thấy điều này trước đây khi chúng ta làm bài tập + +75 +00:04:01,444 --> 00:04:03,360 +chẵn và lẻ, và trong trường hợp này, nó lại + +76 +00:04:03,360 --> 00:04:05,340 +giống như những gì chúng ta có thể viết. + +77 +00:04:05,340 --> 00:04:09,900 +nếu năm % 4 == 0: thì điều đó có nghĩa + +78 +00:04:09,900 --> 00:04:13,290 +là nó chia hết cho bốn. + +79 +00:04:13,290 --> 00:04:15,450 +Vì vậy, điều đó có nghĩa là chúng ta có thể + +80 +00:04:15,450 --> 00:04:17,579 +tiến hành điều tiếp theo để kiểm tra. + +81 +00:04:17,579 --> 00:04:20,160 +Và nếu điều này không đúng, thì ở đây chúng + +82 +00:04:20,160 --> 00:04:23,070 +ta có một tuyên bố khác phù hợp với điều kiện if + +83 +00:04:23,070 --> 00:04:25,350 +này, thì trong trường hợp đó rõ ràng + +84 +00:04:25,350 --> 00:04:27,420 +đó không phải là một năm nhuận. + +85 +00:04:27,420 --> 00:04:29,310 +Chúng tôi đã loại bỏ năm đó vì + +86 +00:04:29,310 --> 00:04:31,443 +nó không thể chia hết cho 4. + +87 +00:04:32,700 --> 00:04:35,700 +Bước tiếp theo là đi sâu hơn nữa. + +88 +00:04:35,700 --> 00:04:39,330 +Vậy nếu năm đó chia hết cho 4 thì + +89 +00:04:39,330 --> 00:04:42,930 +nó có chia hết cho 100 không? + +90 +00:04:42,930 --> 00:04:44,820 +Bởi vì theo logic của chúng + +91 +00:04:44,820 --> 00:04:49,820 +ta, nếu nó chia hết cho 4 nhưng cũng chia hết cho 100 thì thực ra đó không + +92 +00:04:49,890 --> 00:04:52,020 +phải là năm nhuận. + +93 +00:04:52,020 --> 00:04:54,030 +Đây là phần hơi khó hiểu đối với + +94 +00:04:54,030 --> 00:04:56,010 +hầu hết mọi người vì trong trường + +95 +00:04:56,010 --> 00:04:59,850 +hợp này, khi nó chia hết cho 4 và chia hết cho 100 thì thực tế đó + +96 +00:04:59,850 --> 00:05:02,250 +không phải là năm nhuận và chúng ta phải + +97 +00:05:02,250 --> 00:05:05,280 +tiếp tục kiểm tra điều kiện cuối cùng. + +98 +00:05:05,280 --> 00:05:09,600 +Vì vậy, đó là lý do tại sao chúng ta có câu lệnh if và else được nhúng này. + +99 +00:05:09,600 --> 00:05:12,460 +Vì vậy, tại thời điểm này, chúng tôi đã xác minh rằng + +100 +00:05:13,322 --> 00:05:14,220 +năm có thể chia hết + +101 +00:05:14,220 --> 00:05:18,330 +cho 4 và hiện chúng tôi đang kiểm tra xem nó có chia hết cho 100 hay không thì + +102 +00:05:18,330 --> 00:05:20,610 +chúng tôi sẽ tiếp tục kiểm tra. + +103 +00:05:20,610 --> 00:05:25,140 +Nhưng nếu nó không chia hết cho 100 và không có số dư và chia + +104 +00:05:25,140 --> 00:05:26,700 +hết cho 4 thì bây giờ + +105 +00:05:26,700 --> 00:05:30,720 +nó được xác nhận là năm nhuận và điều này sẽ trở nên + +106 +00:05:30,720 --> 00:05:32,640 +rõ ràng hơn nếu bạn thực + +107 +00:05:32,640 --> 00:05:35,190 +sự nhìn vào biểu đồ mà tôi đã cung + +108 +00:05:35,190 --> 00:05:37,770 +cấp trong hộp mô tả . + +109 +00:05:37,770 --> 00:05:39,450 +Đây chỉ là một trong những đặc + +110 +00:05:39,450 --> 00:05:42,063 +thù của việc tìm ra năm nào là năm nhuận. + +111 +00:05:43,770 --> 00:05:45,900 +Kiểm tra cuối cùng chúng ta + +112 +00:05:45,900 --> 00:05:49,620 +phải làm là trong trường hợp một năm chia hết cho + +113 +00:05:49,620 --> 00:05:52,006 +4 cũng chia hết cho 100. + +114 +00:05:52,006 --> 00:05:55,050 +Bây giờ điều cuối cùng là kiểm + +115 +00:05:55,050 --> 00:06:00,050 +tra xem năm đó có chia hết cho 400 không? + +116 +00:06:00,720 --> 00:06:03,750 +Bởi vì trong trường hợp đó nó lại lật + +117 +00:06:03,750 --> 00:06:07,064 +ngược và bây giờ là năm nhuận nếu đáp ứng + +118 +00:06:07,064 --> 00:06:09,330 +đủ ba điều kiện đó. + +119 +00:06:09,330 --> 00:06:13,410 +Có nhiều lộ trình để điều hướng qua biểu đồ, nhưng + +120 +00:06:13,410 --> 00:06:16,020 +trong phần cuối cùng ở đây nếu cả + +121 +00:06:16,020 --> 00:06:21,020 +ba tiêu chí đều đúng, chia hết cho 4, 100 và 400 thì đó là năm nhuận, + +122 +00:06:21,150 --> 00:06:24,990 +ngược lại, nếu điều kiện cuối cùng không thành + +123 +00:06:24,990 --> 00:06:27,900 +công thì đó không phải là năm nhuận. + +124 +00:06:27,900 --> 00:06:30,360 +một năm nhuận. + +125 +00:06:30,360 --> 00:06:34,050 +Đó là lý do vì sao chúng ta có ba câu lệnh if và else + +126 +00:06:34,050 --> 00:06:39,050 +lồng nhau để hoàn thiện logic này trong lưu đồ hoặc trong phiên + +127 +00:06:39,224 --> 00:06:42,660 +bản văn bản về cách tính năm nhuận. + +128 +00:06:42,660 --> 00:06:45,627 +Có nhiều cách để giải bài tập này và cách giải mã + +129 +00:06:45,627 --> 00:06:47,910 +này không phải là cách duy nhất. + +130 +00:06:47,910 --> 00:06:51,840 +Hãy liên hệ với Google để biết cách kiểm tra năm nhuận trong Python + +131 +00:06:51,840 --> 00:06:53,850 +và bạn sẽ thấy rất nhiều phương + +132 +00:06:53,850 --> 00:06:55,020 +pháp khác. + +133 +00:06:55,020 --> 00:06:57,360 +Bạn có thể kết hợp các điều kiện khác + +134 +00:06:57,360 --> 00:07:01,560 +nhau, bạn có thể sử dụng các câu lệnh if và else số ít, có rất nhiều + +135 +00:07:01,560 --> 00:07:04,290 +cách để thực hiện cùng một việc, vì vậy đừng + +136 +00:07:04,290 --> 00:07:06,600 +quá khắt khe với bản thân. + +137 +00:07:06,600 --> 00:07:09,330 +Nếu giải pháp của bạn vượt qua tất cả các cuộc kiểm + +138 +00:07:09,330 --> 00:07:12,060 +tra thì điều đó có nghĩa là bạn đã làm đúng và mọi + +139 +00:07:12,060 --> 00:07:15,780 +giải pháp đều được chấp nhận miễn là nó vượt qua tất cả các cuộc + +140 +00:07:15,780 --> 00:07:17,160 +kiểm tra vì chúng tôi đã + +141 +00:07:17,160 --> 00:07:19,680 +kiểm tra tất cả các năm khác nhau với tất cả + +142 +00:07:19,680 --> 00:07:21,600 +các điều kiện khác nhau. + +143 +00:07:21,600 --> 00:07:22,770 +Và nếu mã của bạn hoạt động + +144 +00:07:22,770 --> 00:07:24,210 +thì điều đó thật tuyệt. + +145 +00:07:24,210 --> 00:07:25,200 +Bây giờ, như mọi + +146 +00:07:25,200 --> 00:07:28,740 +khi, các giải pháp của tôi được tối ưu hóa để dễ + +147 +00:07:28,740 --> 00:07:31,740 +đọc nhất và hy vọng là dễ hiểu nhất. + +148 +00:07:31,740 --> 00:07:32,820 +Và trong trường + +149 +00:07:32,820 --> 00:07:36,090 +hợp này, loại biểu đồ này phản ánh từng biểu đồ. + +150 +00:07:36,090 --> 00:07:38,550 +Vì vậy, hy vọng bạn có thể hiểu nó đến + +151 +00:07:38,550 --> 00:07:41,790 +từ đâu bằng cách so sánh nó với biểu đồ luồng. + +152 +00:07:41,790 --> 00:07:44,484 +Và đây là một mẹo hay cho việc lập trình, bất cứ khi nào bạn + +153 +00:07:44,484 --> 00:07:45,317 +gặp khó khăn với logic + +154 +00:07:45,317 --> 00:07:47,220 +của mình, hãy thử tự tạo một sơ đồ luồng + +155 +00:07:47,220 --> 00:07:50,190 +cho chính mình rồi sử dụng sơ đồ luồng đó để tạo mã. + +156 +00:07:50,190 --> 00:07:53,284 +Nếu bạn có bất kỳ cách khắc phục nào bạn cần thực hiện, hãy quay lại và + +157 +00:07:53,284 --> 00:07:54,960 +thực hiện ngay bây giờ và đảm bảo rằng + +158 +00:07:54,960 --> 00:07:57,513 +bạn đã hiểu cách chúng tôi chuyển đổi logic thành mã. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple If Statements in Succession.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple If Statements in Succession.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9f59adbba13cd07352cea081e7e78e29845fd707 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple If Statements in Succession.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7b03a710cde1e621c0791c441df1cfa78c85a1e87e28d78cd7f551062657a23 +size 93994366 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple If Statements in Succession_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple If Statements in Succession_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..09c926277899464488d4ab97712c8219a9439919 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple If Statements in Succession_vi.srt @@ -0,0 +1,532 @@ +1 +00:00:00,100 --> 00:00:01,420 +Bây giờ trong bài + +2 +00:00:01,450 --> 00:00:06,450 +học trước, chúng ta đã biết cách sử dụng if, elif, else để kiểm tra nhiều điều kiện. + +3 +00:00:06,970 --> 00:00:11,970 +Nhưng trong trường hợp này, chúng tôi chỉ kiểm tra một điều kiện mặc dù chúng tôi có nhiều điều kiện, + +4 +00:00:12,460 --> 00:00:15,610 +bởi vì nếu điều kiện đầu tiên này là đúng, thì chúng tôi + +5 +00:00:15,910 --> 00:00:20,350 +sẽ làm bất cứ điều gì chúng tôi cần làm và sau đó chúng tôi sẽ bỏ qua + +6 +00:00:20,440 --> 00:00:21,460 +mọi thứ khác. + +7 +00:00:22,030 --> 00:00:25,810 +Bây giờ, điều gì sẽ xảy ra nếu bạn ở trong tình huống + +8 +00:00:25,810 --> 00:00:30,010 +cần kiểm tra nhiều điều kiện ngay cả khi điều kiện trước đó đã đúng? + +9 +00:00:31,180 --> 00:00:33,910 +Quay trở lại vấn đề đặt vé tàu lượn siêu tốc của + +10 +00:00:34,420 --> 00:00:36,400 +chúng ta, nếu bạn đang đi tàu lượn + +11 +00:00:36,550 --> 00:00:41,020 +siêu tốc thì chắc hẳn bạn sẽ muốn lưu giữ một tấm hình để làm kỷ niệm đúng không? + +12 +00:00:41,800 --> 00:00:44,020 +Và tàu lượn siêu tốc của chúng tôi cũng không ngoại lệ. + +13 +00:00:44,470 --> 00:00:49,470 +Chúng tôi muốn có thể tính phí người dùng thêm 3 đô la nếu họ muốn mua + +14 +00:00:49,690 --> 00:00:52,120 +vé bao gồm ảnh. Bây giờ, điều này + +15 +00:00:52,150 --> 00:00:57,150 +khá thú vị vì điều này hoàn toàn không phụ thuộc vào tuổi tác hay chiều cao + +16 +00:00:57,910 --> 00:00:58,743 +của họ. + +17 +00:00:58,960 --> 00:01:02,500 +Ngay cả khi chúng tôi đã xác định tuổi và chiều cao của họ và xác định giá + +18 +00:01:02,500 --> 00:01:07,450 +vé của họ, thì đây vẫn là một câu hỏi bổ sung. Bạn có muốn một bức ảnh hay không? + +19 +00:01:07,480 --> 00:01:09,670 +Có hay không. Nếu bạn làm + +20 +00:01:09,700 --> 00:01:13,750 +vậy, thì chúng tôi sẽ thêm $ 3 vào giá vé hiện có của bạn. + +21 +00:01:14,650 --> 00:01:18,460 +Để làm điều này, chúng tôi sẽ viết nhiều điều kiện if. + +22 +00:01:19,030 --> 00:01:21,940 +Nếu điều kiện 1 là đúng, thì hãy thực hiện a, + +23 +00:01:22,360 --> 00:01:27,070 +nhưng sau đó mã sẽ chuyển sang trường hợp tiếp theo và kiểm tra xem điều kiện 2 + +24 +00:01:27,070 --> 00:01:27,903 +có đúng + +25 +00:01:28,180 --> 00:01:32,320 +không, trong trường hợp đó nó sẽ thực hiện B và nếu điều kiện cuối cùng + +26 +00:01:32,440 --> 00:01:35,680 +cũng đúng, nó sẽ làm C. Trong khi ở ví dụ bên + +27 +00:01:35,680 --> 00:01:40,270 +trái ở đây, chỉ một trong những điều này, A, B hoặc C sẽ được thực hiện. + +28 +00:01:40,690 --> 00:01:44,230 +So sánh ví dụ bên trái nơi chúng ta đang sử + +29 +00:01:44,260 --> 00:01:48,370 +dụng if, elif, else, chỉ một trong những điều A, B hoặc C + +30 +00:01:48,370 --> 00:01:52,480 +này sẽ được thực hiện. Nhưng ở phía bên phải, + +31 +00:01:52,900 --> 00:01:57,070 +tất cả ba điều kiện đều được kiểm tra và nếu điều đó + +32 +00:01:57,070 --> 00:01:59,470 +xảy ra mà cả ba điều kiện đều + +33 +00:01:59,590 --> 00:02:02,860 +đúng, thì A, B và C đều sẽ được thực thi. + +34 +00:02:03,520 --> 00:02:08,320 +Hiện tại, mã của chúng tôi hoạt động như thế này. Chúng tôi kiểm tra chiều cao của họ. + +35 +00:02:08,949 --> 00:02:11,020 +Nếu họ trên 120 cm, chúng tôi kiểm + +36 +00:02:11,350 --> 00:02:13,990 +tra tuổi của họ và tùy thuộc vào độ tuổi của họ, + +37 +00:02:14,380 --> 00:02:16,990 +chúng tôi cung cấp cho họ một vé giá khác nhau. + +38 +00:02:18,130 --> 00:02:23,130 +Điều chúng tôi muốn bây giờ là ngay cả sau khi chúng tôi đã kiểm tra giá vé của họ, + +39 +00:02:24,040 --> 00:02:28,510 +chúng tôi muốn hỏi họ một câu, bạn có muốn chụp ảnh với vé của mình không? + +40 +00:02:29,200 --> 00:02:32,800 +Và nếu câu trả lời là có, thì chúng tôi sẽ thêm $ 3 vào hóa + +41 +00:02:33,340 --> 00:02:35,500 +đơn đó, bất kể họ có loại vé nào. + +42 +00:02:36,220 --> 00:02:39,490 +Và cuối cùng chúng tôi cung cấp cho họ tổng hóa đơn. Nếu họ nói không, + +43 +00:02:39,550 --> 00:02:43,090 +sau đó chúng tôi chuyển thẳng đến tổng hóa đơn và chỉ + +44 +00:02:43,090 --> 00:02:47,230 +cho họ biết giá vé của họ. Vì vậy, làm thế nào để chúng tôi triển khai điều này trong mã của chúng tôi? + +45 +00:02:48,970 --> 00:02:52,240 +Trước tiên, hãy thay đổi các câu lệnh in này. + +46 +00:02:52,270 --> 00:02:55,420 +Thay vì đưa cho họ hóa đơn ở mỗi bước này, + +47 +00:02:55,750 --> 00:02:58,930 +tôi sẽ cho họ biết loại vé nào họ đủ điều kiện. + +48 +00:03:02,560 --> 00:03:07,450 +Vì vậy, điều tiếp theo cần làm là hỏi họ xem họ có muốn một bức ảnh hay không. + +49 +00:03:07,870 --> 00:03:12,730 +Vì vậy, tôi sẽ cần sử dụng một đầu vào, nhưng câu hỏi là tôi phải đặt nó ở đâu? + +50 +00:03:13,450 --> 00:03:18,450 +Bây giờ câu trả lời chính xác là nó phải ở cùng mức thụt + +51 +00:03:20,080 --> 00:03:23,860 +lề như khối if này. Vì vậy, bạn có thể tưởng tượng + +52 +00:03:23,860 --> 00:03:27,640 +toàn bộ điều này với, if elif và else như một loại thuộc về nhau. + +53 +00:03:28,420 --> 00:03:30,400 +Bởi vì tất cả đều liên quan đến một điều: + +54 +00:03:30,760 --> 00:03:35,590 +độ tuổi của họ là bao nhiêu và loại vé nào họ được hưởng. Bây giờ, ngoài câu lệnh if + +55 +00:03:35,620 --> 00:03:37,540 +đó, tôi sẽ + +56 +00:03:37,780 --> 00:03:41,650 +tạo một đầu vào và hỏi người dùng, bạn + +57 +00:03:42,370 --> 00:03:46,360 +có muốn chụp ảnh không? Nhập Y cho có hoặc N cho không. + +58 +00:03:47,110 --> 00:03:52,110 +Và sau đó tôi sẽ lưu đầu vào của họ bên trong một biến có tên là want_photo. + +59 +00:03:55,120 --> 00:04:00,120 +Vì vậy, bây giờ tôi sẽ sử dụng câu lệnh if để kiểm tra câu trả lời của họ là gì. + +60 +00:04:00,700 --> 00:04:04,240 +Nếu nó đúng, thì tôi sẽ thêm $ 3 và nếu nó sai, tôi sẽ + +61 +00:04:04,300 --> 00:04:07,120 +bỏ qua để cung cấp cho họ giá vé của họ. + +62 +00:04:07,840 --> 00:04:10,810 +Vì vậy, đây là nơi tôi viết câu lệnh if của mình. + +63 +00:04:11,440 --> 00:04:16,440 +Lưu ý rằng nó ở cùng mức thụt lề như tập hợp các câu lệnh if + +64 +00:04:16,630 --> 00:04:17,463 +trước đó. + +65 +00:04:17,920 --> 00:04:22,920 +Nhưng nó không ở cùng mức thụt lề như tập hợp câu lệnh if này. + +66 +00:04:24,220 --> 00:04:27,760 +Vì vậy, về cơ bản những gì đang xảy ra là sau khi tôi kiểm tra tuổi + +67 +00:04:28,270 --> 00:04:31,720 +của họ, sau đó tôi sẽ kiểm tra xem họ có muốn chụp ảnh hay không. + +68 +00:04:32,050 --> 00:04:35,710 +Và điều này sẽ áp dụng cho tất cả mọi người cho dù họ ở độ tuổi nào. + +69 +00:04:36,490 --> 00:04:40,930 +Vì vậy, nếu want_photo bằng Y, thì trong trường hợp + +70 +00:04:41,680 --> 00:04:46,680 +này, tôi sẽ thêm 3 đô la vào hóa đơn của họ. + +71 +00:04:48,970 --> 00:04:53,970 +Nhưng làm thế nào tôi có thể thêm $ 3 vào hóa đơn khi tôi không có một biến số để thay đổi? + +72 +00:04:55,480 --> 00:04:57,730 +Vì vậy, thay vì sử dụng các câu lệnh in + +73 +00:04:58,450 --> 00:05:01,120 +này, tôi sẽ tạo một biến ở đây được gọi là bill + +74 +00:05:01,460 --> 00:05:03,400 +và tôi sẽ đặt nó bằng 0. + +75 +00:05:04,600 --> 00:05:09,010 +Bây giờ ngoài việc in cho người dùng giá vé của họ, + +76 +00:05:09,340 --> 00:05:13,450 +tôi sẽ đặt hóa đơn thành giá mà họ phải trả. + +77 +00:05:13,930 --> 00:05:18,930 +Vì vậy, nếu tuổi nhỏ hơn 12 thì hóa đơn bằng 5 đô la, nếu tuổi nhỏ hơn 18 + +78 +00:05:19,750 --> 00:05:23,170 +thì hóa đơn bằng 7 đô la, và cuối cùng đối với những + +79 +00:05:23,200 --> 00:05:28,200 +người khác, hóa đơn bằng 12 đô la. Vì vậy, bây giờ tùy thuộc vào những + +80 +00:05:30,460 --> 00:05:34,780 +điều kiện này, biến hóa đơn sẽ được thay đổi thành một số khác. + +81 +00:05:35,470 --> 00:05:38,260 +Nhưng một khi chúng tôi đạt được câu lệnh if + +82 +00:05:38,560 --> 00:05:42,400 +này, tôi sẽ phải thêm 3 đô la vào hóa đơn của họ bất + +83 +00:05:42,700 --> 00:05:45,340 +kể giá trị đó hiện tại là bao nhiêu. + +84 +00:05:45,880 --> 00:05:50,880 +Vì vậy, một cách hiệu quả, những gì tôi muốn làm là hóa đơn bằng giá trị hiện tại của hóa đơn + +85 +00:05:51,700 --> 00:05:54,130 +cộng với 3 đô la. Vì vậy, nếu hóa đơn là + +86 +00:05:54,160 --> 00:05:59,160 +7 đô la, thì hóa đơn giá trị mới này phải là 10 đô la. Nếu hóa đơn là 12 đô la thì bây giờ nó phải là 15 đô la. + +87 +00:06:00,530 --> 00:06:05,240 +Bây giờ trong Python cũng như nhiều ngôn ngữ khác, thực sự có một cách viết ngắn + +88 +00:06:05,240 --> 00:06:06,260 +hơn một chút. + +89 +00:06:06,740 --> 00:06:11,690 +Khi bạn muốn tăng giá trị hiện tại được giữ trong một biến và bạn + +90 +00:06:11,690 --> 00:06:13,610 +muốn lưu lại vào biến, + +91 +00:06:13,970 --> 00:06:17,240 +bạn có thể chỉ cần viết dấu cộng bằng. + +92 +00:06:17,810 --> 00:06:22,040 +Vì vậy, bill + = 3 cũng giống như bill = bill + 3. + +93 +00:06:22,790 --> 00:06:27,680 +Bây giờ, bất kể giá trị của hóa đơn là bao nhiêu trước khi nó đạt đến câu lệnh if + +94 +00:06:28,040 --> 00:06:32,930 +này, tôi vẫn sẽ thêm 3 đô la vào đó. Bây giờ sau khi câu lệnh if này + +95 +00:06:32,930 --> 00:06:34,580 +được hoàn thành, tôi thực + +96 +00:06:34,880 --> 00:06:39,880 +sự không phải viết một câu lệnh khác đồng hành bởi vì trong trường hợp này, nếu câu + +97 +00:06:40,940 --> 00:06:45,080 +trả lời là không, thì chúng tôi sẽ đơn giản là không làm gì cả. + +98 +00:06:45,080 --> 00:06:48,380 +Chúng tôi sẽ không làm bất cứ điều gì với hóa đơn. Thay vào đó, tôi sẽ + +99 +00:06:48,410 --> 00:06:52,610 +bỏ qua và in cho người dùng hóa đơn cuối cùng của họ. + +100 +00:06:55,370 --> 00:07:00,370 +Và tôi sẽ sử dụng fstrings để chèn giá trị mà biến bill + +101 +00:07:02,990 --> 00:07:07,820 +có vào câu lệnh in này. Bây giờ để mã của bạn hoạt động, + +102 +00:07:08,000 --> 00:07:13,000 +việc thụt lề đóng vai trò rất quan trọng vì máy tính sẽ nghĩ rằng bạn muốn + +103 +00:07:14,750 --> 00:07:18,320 +nó làm những việc khác nhau tùy thuộc vào việc thụt lề. + +104 +00:07:19,040 --> 00:07:24,040 +Vì vậy, hãy chú ý cách thụt lề này cho thấy rằng hóa đơn cộng ba này sẽ + +105 +00:07:26,510 --> 00:07:27,890 +được thực thi khi + +106 +00:07:28,580 --> 00:07:33,580 +điều kiện này là đúng, nhưng câu lệnh in này không được thụt vào cùng mức và hiệu + +107 +00:07:34,220 --> 00:07:38,300 +quả nó sẽ xảy ra sau khi câu lệnh này nếu đã được thực thi. + +108 +00:07:39,320 --> 00:07:44,320 +Vì vậy, bạn có thể thử với cách thụt lề các câu lệnh in này, bỏ thụt lề và xem + +109 +00:07:45,230 --> 00:07:46,730 +sự khác biệt là gì. + +110 +00:07:47,810 --> 00:07:51,770 +Nhưng bây giờ tôi sẽ tiếp tục và nhấn command + enter hoặc + +111 +00:07:51,800 --> 00:07:56,800 +control + enter trên Windows để chạy mã của mình và tôi sẽ tiếp tục thử và + +112 +00:07:58,070 --> 00:07:59,330 +nhận một vé. + +113 +00:08:00,050 --> 00:08:03,530 +Vì vậy, giả sử tôi 21 tuổi, nói với tôi vé người + +114 +00:08:04,730 --> 00:08:08,150 +lớn là 12 đô la và sau đó nó hỏi tôi, bạn + +115 +00:08:08,150 --> 00:08:11,810 +có muốn chụp ảnh không? Vì vậy, tôi rất thích được chụp một bức ảnh. + +116 +00:08:12,560 --> 00:08:15,530 +Và nó cho tôi biết rằng hóa đơn cuối cùng của tôi là 15, vì vậy + +117 +00:08:16,010 --> 00:08:18,170 +tôi đã quên một ký hiệu đô la ở đây. + +118 +00:08:18,710 --> 00:08:23,710 +Nhưng hiệu quả là bây giờ nó đã thêm $ 3 vào $ 12 vì + +119 +00:08:26,510 --> 00:08:31,460 +câu lệnh if bổ sung này. Vì vậy, nếu khái niệm này vẫn còn + +120 +00:08:31,880 --> 00:08:36,880 +hơi khó hiểu với bạn, thì tôi muốn bạn thực sự nghiên cứu biểu đồ luồng này + +121 +00:08:37,460 --> 00:08:40,549 +và chỉ cần xem xét sự khác biệt, ừm và + +122 +00:08:40,669 --> 00:08:45,670 +hình dung nó bởi vì câu lệnh if elif else sẽ chỉ đúng trong một trong + +123 +00:08:47,450 --> 00:08:51,410 +những mũi tên này, phải không? Bạn không được dưới 12 và 18 tuổi trở lên. + +124 +00:08:52,280 --> 00:08:53,030 +Và tương tự, + +125 +00:08:53,030 --> 00:08:56,460 +việc bạn có hai mức giá vé khác nhau cũng không có ý nghĩa gì. + +126 +00:08:57,270 --> 00:08:59,250 +Nhưng với những bức ảnh muốn + +127 +00:08:59,550 --> 00:09:04,550 +có, điều kiện này phải được yêu cầu cho dù họ đã hạ cánh ở nhánh nào. + +128 +00:09:05,160 --> 00:09:08,130 +Vì vậy, nó hoàn toàn tách biệt với câu lệnh if này. + +129 +00:09:09,030 --> 00:09:11,910 +Và khi bạn đã xem sơ đồ luồng + +130 +00:09:12,120 --> 00:09:16,980 +này, sau đó so sánh nó với mã và cách mã hoạt động sẽ + +131 +00:09:16,980 --> 00:09:21,360 +rõ ràng hơn rất nhiều. Và một khi bạn hài lòng với mã và + +132 +00:09:21,690 --> 00:09:25,440 +khái niệm này, thì tôi muốn bạn chuyển sang bài học tiếp theo, nơi tôi có + +133 +00:09:25,440 --> 00:09:29,340 +một thử thách về mã cho bạn. Vì vậy, cho tất cả những điều đó, và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple-if-statements-Ending-Code.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple-if-statements-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..97e33abbf02bae80ac5c851f6e9698559e7014ea --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Multiple-if-statements-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-3-multiple-if \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Ticketing-Flow-Chart-Version-4-Multiple-if-statements.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Ticketing-Flow-Chart-Version-4-Multiple-if-statements.url new file mode 100644 index 0000000000000000000000000000000000000000..e9a6fdf5770db2f7ebba25b2e827f8b0b9661e88 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/008 Ticketing-Flow-Chart-Version-4-Multiple-if-statements.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.draw.io/?lightbox=1&target=blank&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%204#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1aoRTeFOb2SJO7ofMnhTCneCEboHowF2A%26export%3Ddownload \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 Exercise-11.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 Exercise-11.url new file mode 100644 index 0000000000000000000000000000000000000000..fe5aa325125d83a892cbb47e804653a578d33988 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 Exercise-11.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/f03cade4-f4f4-426c-84d8-eb26e34948fa \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 How-to-join-Auditorium.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 [Interactive Coding Exercise] Pizza Order Practice.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 [Interactive Coding Exercise] Pizza Order Practice.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..01020cd6028db47b729f74fefee5d2e949206b4c --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 [Interactive Coding Exercise] Pizza Order Practice.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b9f7618b9304058f926f34fef77503e1d0fd5fe3d2ab4f61db3fe28091c50d2 +size 13389891 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 [Interactive Coding Exercise] Pizza Order Practice_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 [Interactive Coding Exercise] Pizza Order Practice_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..aa521bd24517534c462be56f85c7235ef3c04fe7 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/009 [Interactive Coding Exercise] Pizza Order Practice_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:01,110 --> 00:00:02,460 +Được rồi, xin chúc mừng! + +2 +00:00:02,460 --> 00:00:05,970 +Bạn đã có cho mình một công việc tại Python Pizza. + +3 +00:00:05,970 --> 00:00:09,870 +Vì vậy, công việc đầu tiên của bạn với tư cách là một lập trình viên tại + +4 +00:00:09,870 --> 00:00:13,380 +Python Pizza là xây dựng Chương trình đặt hàng Pizza tự động. + +5 +00:00:13,380 --> 00:00:16,110 +Đó là mục tiêu của bài tập này. + +6 +00:00:16,110 --> 00:00:18,360 +Hãy nhìn vào mã bắt đầu. + +7 +00:00:18,360 --> 00:00:23,340 +Bạn sẽ thấy rằng người dùng có thể đặt kích thước mà họ muốn, liệu họ có + +8 +00:00:23,340 --> 00:00:25,680 +muốn thêm pepperoni hay không và + +9 +00:00:25,680 --> 00:00:28,590 +liệu họ có muốn thêm phô mai hay không. + +10 +00:00:28,590 --> 00:00:32,670 +Dựa trên thông tin đầu vào của người dùng đối với ba tiêu chí này, chúng + +11 +00:00:32,670 --> 00:00:36,060 +tôi sẽ tính toán giá bánh pizza của họ là bao nhiêu. + +12 +00:00:36,060 --> 00:00:38,310 +Nếu nhìn vào hộp mô tả, bạn sẽ thấy + +13 +00:00:38,310 --> 00:00:40,950 +các công cụ sửa đổi khác nhau. + +14 +00:00:40,950 --> 00:00:44,340 +Bắt đầu từ kích thước, chúng tôi có các mức giá khác + +15 +00:00:44,340 --> 00:00:46,830 +nhau cho loại nhỏ, vừa và lớn. + +16 +00:00:46,830 --> 00:00:50,010 +Và sau đó, nếu ai đó muốn thêm pepperoni thì phải + +17 +00:00:50,010 --> 00:00:53,437 +trả thêm 2 đô la cho một chiếc bánh pizza nhỏ, 3 đô + +18 +00:00:53,437 --> 00:00:56,640 +la cho một chiếc bánh pizza vừa hoặc lớn. + +19 +00:00:56,640 --> 00:01:00,000 +Và cuối cùng, nếu bạn muốn thêm phô mai cho bất kỳ chiếc + +20 +00:01:00,000 --> 00:01:03,000 +bánh pizza nào thì chỉ cần thêm một đô la. + +21 +00:01:03,000 --> 00:01:05,280 +Nếu bạn xem ví dụ đầu vào trong + +22 +00:01:05,280 --> 00:01:06,810 +đó chúng tôi có một chiếc + +23 +00:01:06,810 --> 00:01:11,810 +bánh pizza lớn mà họ muốn "Có" với pepperoni và "Không" với phô mai + +24 +00:01:12,420 --> 00:01:16,140 +thêm, thì kết quả đầu ra của ví dụ như sau. + +25 +00:01:16,140 --> 00:01:18,300 +"Cảm ơn bạn đã lựa chọn Python Pizza Delivery! + +26 +00:01:18,300 --> 00:01:21,630 +"Hóa đơn cuối cùng của bạn là: 28 USD. Bây giờ hãy nhớ rằng dòng đầu tiên của kết + +27 +00:01:21,630 --> 00:01:23,880 +quả đó đã được in sẵn cho bạn + +28 +00:01:23,880 --> 00:01:26,130 +ở dòng 1 nên bạn không cần lo + +29 +00:01:26,130 --> 00:01:27,930 +lắng về điều đó. + +30 +00:01:27,930 --> 00:01:30,630 +Tất cả những gì bạn cần tìm ra là cách xây dựng chương + +31 +00:01:30,630 --> 00:01:33,480 +trình để nó in ra "Hóa đơn cuối cùng của bạn là" và sau + +32 +00:01:33,480 --> 00:01:35,700 +đó tính toán giá trị chính xác dựa trên thông + +33 +00:01:35,700 --> 00:01:37,680 +tin đầu vào của người dùng. + +34 +00:01:37,680 --> 00:01:40,710 +Và đầu vào của người dùng sẽ chỉ là một loạt các chữ cái. + +35 +00:01:40,710 --> 00:01:44,370 +Vì vậy, đầu vào đầu tiên sẽ có kích thước + +36 +00:01:44,370 --> 00:01:45,510 +S, M hoặc L. + +37 +00:01:45,510 --> 00:01:48,060 +Cái thứ hai sẽ là Y hoặc N, và + +38 +00:01:48,060 --> 00:01:51,120 +cái thứ ba cũng sẽ là Y hoặc N. + +39 +00:01:51,120 --> 00:01:52,770 +Hãy tạm dừng, suy nghĩ về điều này, áp + +40 +00:01:52,770 --> 00:01:54,780 +dụng kiến thức của bạn về câu điều kiện và xem + +41 +00:01:54,780 --> 00:01:57,123 +liệu bạn có thể hoàn thành bài tập này hay không. + +42 +00:02:05,490 --> 00:02:07,410 +Được rồi, điều đầu tiên + +43 +00:02:07,410 --> 00:02:10,590 +chúng ta sẽ làm là tạo một biến có tên + +44 +00:02:10,590 --> 00:02:15,590 +là "hóa đơn" để theo dõi giá pizza hiện tại của họ. + +45 +00:02:16,050 --> 00:02:20,640 +Chúng ta có thể bắt đầu hóa đơn đó ở mức 0 đô la và sau đó chúng ta có thể tiếp tục. + +46 +00:02:20,640 --> 00:02:24,480 +Phần tiếp theo của mã của chúng tôi sẽ kiểm tra điều kiện đầu tiên, + +47 +00:02:24,480 --> 00:02:29,480 +đó là liệu đầu vào đầu tiên của chúng là S, M hay L và chúng tôi có thể sử dụng câu lệnh + +48 +00:02:30,330 --> 00:02:32,460 +if, elif, else hoặc chúng tôi có thể + +49 +00:02:32,460 --> 00:02:34,560 +sử dụng ba câu lệnh if. + +50 +00:02:34,560 --> 00:02:36,810 +Bạn có thể làm điều đó theo nhiều cách, nhưng + +51 +00:02:36,810 --> 00:02:38,580 +về cơ bản, chúng tôi đang kiểm tra + +52 +00:02:38,580 --> 00:02:40,620 +xem liệu họ có nhập S hay không, sau đó chúng + +53 +00:02:40,620 --> 00:02:42,660 +tôi sẽ thêm 15 đô la vào hóa đơn. + +54 +00:02:42,660 --> 00:02:45,330 +Nếu họ nhập M vào dòng đầu tiên thì chúng + +55 +00:02:45,330 --> 00:02:46,620 +ta sẽ cộng thêm 20. + +56 +00:02:46,620 --> 00:02:51,510 +Và nếu điều kiện cuối cùng hoặc chúng ta muốn kiểm tra xem đó có phải là L hay + +57 +00:02:51,510 --> 00:02:54,033 +không thì chúng ta có thể thêm $25. + +58 +00:02:55,860 --> 00:02:58,680 +Bây giờ, điều kiện tiếp theo là liệu họ có muốn + +59 +00:02:58,680 --> 00:02:59,880 +dùng pepperoni trên + +60 +00:02:59,880 --> 00:03:01,980 +pizza hay không và nếu câu trả lời + +61 +00:03:01,980 --> 00:03:05,730 +là có thì chúng tôi phải kiểm tra kích thước mà họ đã đặt. + +62 +00:03:05,730 --> 00:03:09,030 +Nếu kích thước vừa hoặc lớn, chúng tôi sẽ thêm 3 + +63 +00:03:09,030 --> 00:03:11,250 +đô la vào hóa đơn của họ và nếu kích + +64 +00:03:11,250 --> 00:03:14,460 +thước nhỏ thì chúng tôi sẽ chỉ thêm 2 đô la. + +65 +00:03:14,460 --> 00:03:16,740 +Vì vậy, bạn có thể đã sử dụng một sự kết hợp. + +66 +00:03:16,740 --> 00:03:19,170 +Vì vậy, bạn có thể nói nếu size == "M" và size == + +67 +00:03:19,170 --> 00:03:20,790 +"L", nhưng trong trường hợp này, + +68 +00:03:20,790 --> 00:03:23,010 +những gì tôi đã làm chỉ đơn giản là kiểm tra + +69 +00:03:23,010 --> 00:03:25,860 +chỉ một câu lệnh duy nhất, là câu lệnh duy nhất. + +70 +00:03:25,860 --> 00:03:27,900 +Nếu kích thước nhỏ thì thêm hai. + +71 +00:03:27,900 --> 00:03:31,140 +Trong tất cả các điều kiện khác, thêm ba. + +72 +00:03:31,140 --> 00:03:33,420 +Điều kiện cuối cùng có lẽ là dễ nhất. + +73 +00:03:33,420 --> 00:03:37,500 +Chúng tôi chỉ muốn kiểm tra xem đầu vào cuối cùng có phải là "Có" hay không trong + +74 +00:03:37,500 --> 00:03:40,380 +trường hợp này, chúng tôi chỉ cần thêm $1 vào hóa đơn. + +75 +00:03:40,380 --> 00:03:42,600 +Và tất cả những thứ này cộng lại cuối + +76 +00:03:42,600 --> 00:03:46,230 +cùng sẽ tạo ra giá cuối cùng cho chiếc bánh pizza. + +77 +00:03:46,230 --> 00:03:50,190 +Và chúng tôi có thể in ra mức giá cuối cùng đó bằng cách sử + +78 +00:03:50,190 --> 00:03:54,510 +dụng chuỗi f bằng cách chèn hóa đơn vào báo cáo in và đảm bảo rằng + +79 +00:03:54,510 --> 00:03:57,330 +bạn có tất cả dấu câu, dấu chấm, mọi thứ + +80 +00:03:57,330 --> 00:04:00,960 +khớp chính xác với nội dung trong mô tả, nếu không, + +81 +00:04:00,960 --> 00:04:01,950 +các bài kiểm tra + +82 +00:04:01,950 --> 00:04:04,140 +sẽ không vượt qua. + +83 +00:04:04,140 --> 00:04:05,880 +Tuy nhiên, nếu không thì mọi + +84 +00:04:05,880 --> 00:04:09,210 +việc đều ổn, bạn có thể gửi giải pháp mã của mình và nó + +85 +00:04:09,210 --> 00:04:12,783 +sẽ hiển thị là đã đạt đối với tất cả các điều kiện. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Day-3-Ending-Code.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Day-3-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..a29b643eef2865b2c198e4095e48ddb841f4aef9 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Day-3-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-3-end#main.py \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Logical Operators.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Logical Operators.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e40b9d49d7922b07cb663b5d90c4e2a54fd26c63 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Logical Operators.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbb6dd5138caf751a434ea418e8e6f76ab5a1e7d779c73cd36ed7af079626b4c +size 19144813 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Logical Operators_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Logical Operators_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..124c18ab0cb0c187a22758ca200622d9701e925b --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Logical Operators_vi.srt @@ -0,0 +1,320 @@ +1 +00:00:00,280 --> 00:00:04,720 +Cho đến thời điểm này, bạn đã thấy chúng tôi sử dụng câu lệnh if, + +2 +00:00:04,750 --> 00:00:06,460 +câu lệnh else, câu lệnh + +3 +00:00:06,610 --> 00:00:10,600 +elif, nhiều câu lệnh if cũng như các câu lệnh if lồng nhau. + +4 +00:00:10,990 --> 00:00:15,990 +Nhưng điều mà chúng tôi chưa thể làm cho đến nay là kiểm + +5 +00:00:16,780 --> 00:00:20,440 +tra nhiều điều kiện trong cùng một dòng mã. + +6 +00:00:21,250 --> 00:00:26,140 +Vì vậy, làm thế nào chúng ta có thể kết hợp các điều kiện khác nhau và nói + +7 +00:00:26,200 --> 00:00:31,200 +rằng, chiếc bánh pizza có lớn không và người dùng muốn pepperoni và thêm pho mát, tất cả trong + +8 +00:00:32,290 --> 00:00:34,510 +cùng một dòng mã? Để làm được + +9 +00:00:34,570 --> 00:00:37,900 +điều này, chúng ta cần tìm hiểu về các toán tử logic. + +10 +00:00:38,290 --> 00:00:42,280 +Vì vậy, có ba trong số chúng thực sự hữu ích: và, hoặc và không. + +11 +00:00:43,180 --> 00:00:44,830 +Vì vậy, chúng ta hãy nhìn vào cái đầu tiên. + +12 +00:00:45,280 --> 00:00:49,060 +Khi bạn kết hợp hai điều kiện khác nhau bằng cách sử dụng + +13 +00:00:49,390 --> 00:00:51,310 +toán tử và, cả hai điều + +14 +00:00:51,310 --> 00:00:55,390 +kiện đều phải đúng, cả A và B cho toàn bộ dòng mã là đúng. + +15 +00:00:56,320 --> 00:00:59,920 +Nếu chỉ một trong số chúng đúng, nói A đúng và + +16 +00:00:59,920 --> 00:01:04,780 +B sai, hoặc A sai và B đúng, thì tổng thể sẽ đánh giá là sai. + +17 +00:01:06,070 --> 00:01:08,800 +Vì vậy, nếu chúng ta chỉ nhìn vào bên trong bảng + +18 +00:01:08,830 --> 00:01:13,450 +điều khiển và trên thực tế, tôi sẽ xóa bảng điều khiển và tôi viết một số mã ở đây. + +19 +00:01:13,480 --> 00:01:14,770 +Hãy nói rằng, + +20 +00:01:15,250 --> 00:01:20,250 +um, A = 12 phải không? Bây giờ, hãy nói rằng tôi muốn kiểm tra xem + +21 +00:01:23,320 --> 00:01:27,460 +liệu A có lớn hơn 15 hay không? Vâng, điều đó sẽ là sai. + +22 +00:01:28,060 --> 00:01:32,410 +Bây giờ A lớn hơn 10 thì sao? Chà, điều đó sẽ thành + +23 +00:01:32,410 --> 00:01:33,340 +sự thật. + +24 +00:01:33,940 --> 00:01:38,680 +Bây giờ nếu tôi kết hợp điều này bằng cách sử dụng câu lệnh và, tôi có + +25 +00:01:38,680 --> 00:01:43,680 +thể nói, tốt là A lớn hơn 10 và A nhỏ hơn 13 và nhấn enter, sau đó tôi + +26 +00:01:49,450 --> 00:01:54,450 +sẽ nhận được true vì cả A lớn hơn 10 và A nhỏ hơn 13 đều đúng . + +27 +00:01:55,990 --> 00:01:58,660 +Vì vậy, trong trường hợp này, khi cả hai điều + +28 +00:01:59,110 --> 00:02:02,320 +kiện đều đúng, thì toàn bộ dòng này được đánh giá là đúng. + +29 +00:02:02,950 --> 00:02:06,100 +Nhưng hãy xem điều gì sẽ xảy ra khi chỉ một trong số chúng là sai. + +30 +00:02:06,250 --> 00:02:11,250 +Vậy A có lớn hơn 15 và A nhỏ hơn 13 không? A lớn hơn 15 là sai, A nhỏ + +31 +00:02:13,960 --> 00:02:17,590 +hơn 13 là đúng và bây giờ chúng ta nhận được sai. + +32 +00:02:18,580 --> 00:02:23,470 +Vì vậy, đó là những gì sẽ xảy ra khi bạn kết hợp các điều kiện khác nhau bằng cách sử dụng và. Bây giờ nếu bạn chỉ cần + +33 +00:02:23,470 --> 00:02:26,650 +một trong các điều kiện là đúng, thì bạn có + +34 +00:02:27,040 --> 00:02:29,980 +thể sử dụng toán tử hoặc để thay thế. + +35 +00:02:30,160 --> 00:02:35,160 +Vì vậy, nếu C hoặc D là đúng hoặc nếu cả hai đều đúng, thì nó sẽ + +36 +00:02:35,740 --> 00:02:37,240 +được đánh giá là đúng. + +37 +00:02:38,110 --> 00:02:41,680 +Chỉ khi cả C và D đều sai thì câu nói + +38 +00:02:42,130 --> 00:02:44,530 +này mới thực sự trở thành sai. + +39 +00:02:45,640 --> 00:02:50,640 +Bây giờ cái cuối cùng không phải là toán tử và tất cả những gì điều này làm là về + +40 +00:02:51,160 --> 00:02:55,360 +cơ bản nó đảo ngược một điều kiện. Vì vậy, nếu điều kiện là sai, + +41 +00:02:55,390 --> 00:02:58,900 +thì nó trở thành đúng. Nếu nó đúng, thì nó trở thành sai. + +42 +00:02:59,830 --> 00:03:01,390 +Nếu tôi đã viết không và + +43 +00:03:01,570 --> 00:03:06,570 +thì tôi đã viết điều kiện A lớn hơn 15. A lớn hơn 15 chắc chắn là + +44 +00:03:09,550 --> 00:03:14,410 +sai, 12 nhỏ hơn 15. Nhưng bằng cách đặt cái không ở đó, + +45 +00:03:14,410 --> 00:03:18,340 +nó sẽ đảo ngược điều này, do đó, đi từ sai thành đúng. + +46 +00:03:18,580 --> 00:03:21,790 +Vì vậy, khi tôi nhấn enter, bạn sẽ thấy nó bây giờ là sự thật. + +47 +00:03:23,530 --> 00:03:25,480 +Trở lại với việc bán vé tàu lượn + +48 +00:03:25,720 --> 00:03:30,670 +siêu tốc của chúng ta, giả sử rằng công ty tàu lượn siêu tốc quyết định rằng đối với tất cả những + +49 +00:03:30,670 --> 00:03:34,600 +ai đang gặp khủng hoảng tuổi trung niên, họ sẽ cung cấp cho họ vé miễn phí. + +50 +00:03:35,020 --> 00:03:36,790 +Và theo Wikipedia, các cuộc + +51 +00:03:36,880 --> 00:03:41,880 +khủng hoảng tuổi trung niên thường xảy ra khi bạn từ 45 đến 55 tuổi. + +52 +00:03:42,760 --> 00:03:46,390 +Hãy xem liệu chúng ta có thể kết hợp điều này vào mã của mình hay không. + +53 +00:03:46,960 --> 00:03:51,490 +Vì vậy, giả sử ngoài các loại giá hiện có này, điều gì + +54 +00:03:51,700 --> 00:03:56,700 +sẽ xảy ra nếu bạn phải thêm một loại giá riêng cho những người trong + +55 +00:03:57,190 --> 00:04:02,190 +độ tuổi từ 45 đến 55 và những người đó được đi xe miễn phí? + +56 +00:04:03,700 --> 00:04:06,910 +Bạn có nghĩ rằng bạn sẽ có thể thay đổi mã bằng cách sử dụng + +57 +00:04:06,940 --> 00:04:11,940 +những gì bạn đã học về các toán tử logic để kết hợp phần bổ sung này vào chương trình của chúng tôi không? + +58 +00:04:12,730 --> 00:04:14,260 +Tạm dừng video và tiếp tục. + +59 +00:04:17,970 --> 00:04:21,720 +Vì vậy, chúng tôi hiện có ba điều kiện: tuổi, + +60 +00:04:21,750 --> 00:04:26,750 +dưới 12, tuổi từ 12 đến 18, và cuối cùng là mọi người khác. + +61 +00:04:27,750 --> 00:04:31,770 +Bây giờ thay vì chỉ kết thúc ở đó, chúng ta hãy tiếp + +62 +00:04:32,580 --> 00:04:34,770 +tục và thêm một elif khác. + +63 +00:04:35,130 --> 00:04:37,740 +Và ở đây chúng ta sẽ kết hợp hai điều kiện. + +64 +00:04:38,250 --> 00:04:43,250 +Chúng ta sẽ nói nếu độ tuổi lớn hơn hoặc bằng 45 và tuổi nhỏ hơn hoặc + +65 +00:04:47,790 --> 00:04:52,790 +bằng 55, thì chúng ta sẽ bắt kịp thời điểm khủng hoảng tuổi trung niên đó. + +66 +00:04:54,840 --> 00:05:00,030 +Trong trường hợp này, chúng ta sẽ in một cái gì đó giống như-- chúng ta sẽ nói "Mọi thứ + +67 +00:05:00,030 --> 00:05:02,520 +sẽ ổn thôi. Có một chuyến đi miễn phí với chúng tôi! "Và trên thực + +68 +00:05:04,530 --> 00:05:05,190 +tế, + +69 +00:05:05,190 --> 00:05:10,190 +chúng tôi không cần phải sửa đổi dự luật theo bất kỳ cách nào vì chúng tôi biết + +70 +00:05:11,820 --> 00:05:16,820 +rằng với các câu lệnh if, elif và các câu lệnh khác là một khi điều kiện này + +71 +00:05:19,260 --> 00:05:22,350 +khớp, thì mọi thứ bên trong khối này, vì vậy mọi + +72 +00:05:22,350 --> 00:05:26,850 +thứ được thụt vào bên trong elif này là sẽ được thực hiện cụ thể + +73 +00:05:26,910 --> 00:05:28,350 +là in nó ra, và + +74 +00:05:28,890 --> 00:05:33,890 +sau đó nó sẽ bỏ qua phần còn lại của khối if / else này và tiếp tục. + +75 +00:05:36,630 --> 00:05:37,890 +Bây giờ, nếu họ muốn chụp + +76 +00:05:37,890 --> 00:05:41,790 +bức ảnh này, họ sẽ phải trả 3 đô la nhưng ít nhất vé của họ là miễn phí. + +77 +00:05:42,150 --> 00:05:47,150 +Và chúng tôi có thể làm được điều này bởi vì chúng tôi biết về toán tử logic. + +78 +00:05:48,720 --> 00:05:49,920 +Trong bài học tiếp + +79 +00:05:49,980 --> 00:05:54,960 +theo, chúng ta sẽ thực hành sử dụng các toán tử logic và hơn thế nữa bằng cách hoàn + +80 +00:05:54,960 --> 00:05:58,380 +thành một thử thách mã khác. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Ticketing-Flow-Chart-Version-5-with-Midlife-Crisis.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Ticketing-Flow-Chart-Version-5-with-Midlife-Crisis.url new file mode 100644 index 0000000000000000000000000000000000000000..61aadc4a1237109368eadedeaf47f6c878c0be38 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/010 Ticketing-Flow-Chart-Version-5-with-Midlife-Crisis.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://viewer.diagrams.net/?highlight=0000ff&edit=_blank&layers=1&nav=1&title=Day%203%20Logical%20Operators.drawio#R7VtZc9o6FP41zH2iY0teH0uWZpqkQy%2BZ29CXOwYrthNjUVkQyK%2BvjGWwLbEFL6HTzCSxjyVhfec7myQ68GKy%2BEKcqX%2BPXRR2gOIuOvCyA4CqAYP9SyTLVGJqXOCRwOWNNoJB8Ia4UOHSWeCiuNCQYhzSYFoUjnEUoTEtyBxC8Gux2RMOi586dTwkCAZjJxSlPwKX%2BqnUAuZGfoMCz88%2BWTXs9MnEyRrzmcS%2B4%2BLXnAhedeAFwZimV5PFBQoT8DJc0n7XW56uX4ygiB7SoR9ZTw%2FfyQD19fm%2Fc3dxF%2FzCXT6NmC6zCSOXzZ%2FfYkJ97OHICa820h7Bs8hFyagKu9u0ucN4yoQqEz4jSpdcmc6MYiby6STkT9kLk%2BVj0v%2BTAUEmGDJBV%2FmkmHomuVzwz0jvlvm7PiLBBFFEuFBEgwMU4xkZox0QZKxyiIfojnZ62i7BJ%2FcBHOsvCLO3IUvWgKDQocG8yB%2BH09Bbt%2BNdPxPiLHMNpjiIaJwbuZ8IWANuUZABthqR25Oq63mts4t0xOwu92ob0YoZR7DEbpklmqrlWaJ8TIJotRBEYICqFQlgK8UR0vfknTbMOJZohtE8zzgWcyeccXS4b01cm%2BFMGHF6Hl0pU1GZz5904LVATeLjyWjGZtl79QOKBlNnpd1XFp%2BKBNvKiDkiFC126jB7qppFlLKw9bqJFarBZX4uTpSVlld7DuPjIYRtmOr7bQscaFtq1bZ1EshA4OmAzYCKVFwDq%2B6n41MQhhc4xGTVF7o6stzE7cWU4BeUe2KBEWTWWQ2BYZHAQMJfIOGvVhd%2FNQHaCyf6J%2FEALD1EpyFcAV5QKcIlsXfLrAeuy682%2BL%2F%2FzaXPLvk%2BvOl71zdexsRzMXddNHfptD6WuesyTn4URgKzZMENUlLuqhUBrm9YgInNjhaxcMLAi9j1mGGRZG29BIOAVWKf%2BYNJ4LopgVEcvDmj1VAJhXkqw8bVex39MhmLcTZO6VsRzFYp0ENbQBlK%2FCSoDWUxVxqi%2BOxhBpa2F2etJpylnkiMR2143FwttK6OD6mEDvLUuzzwXk9tVO2p5dUIUJKZ55kBgV4cZEvd847aRA6I8lfx%2BXZWWyFa%2FtZ%2FzbLQzm4tgVKGP3%2B8PfT6PwfImj8%2BPAS9STtZKloE9DF3Pdzoid1tNJPcFFaO2laoFMLWMuJdb52LiskyepsrMcASAoQiSYQlqYNeW23Wsk9qhsD1JADHrlaqsKh8zSpthpTzCRvual9c3tzbWy8XUzXnIoYkKWUq1HTRBBuuRu3i%2Bgi0RBu0a1pOkiJlCkjdoThOHK6%2FKuElecO5lUxqGfMD%2FV5tJRNoJVN%2BvwerPJPdsnMHyhFKL6ugZrdhbXEb4iZw84tYejl6t%2B051vRpJ3qrzUTvyuuEd0VvXTkuekPNOiF6l3s3Hb3tLWYoiUVN26FmfLD4LVnmVEFXtc4%2BakNV8Hi6iLXeZNxWoYg1A1rBJPnDpnb%2BoB%2BQKpmNpkqyTH6rD1D2%2BwBhs9gYW2j0VNpejnCUqMB1Yn%2FtXCqAVzeL8AKJ91Bl%2BK6PSJwCsH3%2F%2BGI8erfgFvwKlvfPN8v%2BfVekdBtR%2FaD4vGvZJ7885M%2FnXfx0iYKv9n%2Bz5a06uDNesnnWncPqalHDh2awRx8%2BsuSZcmWnj3ZgLcRlsZxpOiwbWnthWQqVaFafPYYHUJIlCKXLfnVxLeLcooVuvm9BsYpoITXyViqSg3zXLp%2B013dVfrD2JJBbCRDZXkW2IXHkXgWofrPiJI2aH0qjorN6dSJ%2BpjRMPNKIZbbG6lzp1MfMi5x0qlTIwJTVjzwDq8BLlQ%2FqrkNyPulSbNFNWXW5Ka1VC1pbzTD3pIXdvl2u7swMSDz%2FliZG4lnjoxKjpi0FlnZtDNlhbaWmNEoKrFj9%2FQlnuMo4r9fXGjjDtcuacjA%2F%2BCgxQ0ydpPMoSMeIVzFBW5wXrVmeWoDblKSpKrCz1aZGiC3uNPwBR0ABLEVaCa8rOgPKbjdfDEzr283XK%2BHVbw%3D%3D \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 Exercise-12.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 Exercise-12.url new file mode 100644 index 0000000000000000000000000000000000000000..7c404232f416aeb7dea81c4f2665253450c3bba5 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 Exercise-12.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/6bd4bb59-cd10-4657-b677-a79a6f03f44b \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 How-to-join-Auditorium.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 [Interactive Coding Exercise] Love Calculator.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 [Interactive Coding Exercise] Love Calculator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b0f50be8ea9a89ef1824519079961883ea3b945a --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 [Interactive Coding Exercise] Love Calculator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c590b18371b828838a272b1506cf5a9055ed798cdabe55c38e329e265fd960b4 +size 26098813 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 [Interactive Coding Exercise] Love Calculator_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 [Interactive Coding Exercise] Love Calculator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cbb0347d70402c873024ead8ad7ecade2b757cee --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/011 [Interactive Coding Exercise] Love Calculator_vi.srt @@ -0,0 +1,600 @@ +1 +00:00:01,219 --> 00:00:03,090 +Bạn đang tìm kiếm tình yêu đích thực? + +2 +00:00:03,090 --> 00:00:06,540 +Chà, bài tập viết mã này sẽ có thể giúp + +3 +00:00:06,540 --> 00:00:07,860 +bạn điều đó. + +4 +00:00:07,860 --> 00:00:11,730 +Thử thách này là tạo ra một máy tính tình yêu. + +5 +00:00:11,730 --> 00:00:15,450 +Bạn sắp viết một chương trình kiểm tra khả năng tương + +6 +00:00:15,450 --> 00:00:17,310 +thích giữa hai người. + +7 +00:00:17,310 --> 00:00:19,650 +Việc bạn tin hay không tin điều này thực sự không + +8 +00:00:19,650 --> 00:00:23,760 +quan trọng, chúng tôi sẽ sử dụng nó để kiểm tra kỹ năng lập trình của mình. + +9 +00:00:23,760 --> 00:00:27,360 +Có nhiều cách để tính điểm tình yêu giữa hai + +10 +00:00:27,360 --> 00:00:28,710 +người và nếu bạn + +11 +00:00:28,710 --> 00:00:30,844 +đã từng học trung học, có + +12 +00:00:30,844 --> 00:00:35,520 +thể bạn đã gặp một trong những phương pháp này. + +13 +00:00:35,520 --> 00:00:40,140 +Phương pháp mà tôi đưa vào bài tập viết mã này xuất + +14 +00:00:40,140 --> 00:00:45,140 +phát từ nguồn đáng tin cậy và nổi tiếng của một bài báo + +15 +00:00:45,365 --> 00:00:47,670 +trên Buzzfeed. + +16 +00:00:47,670 --> 00:00:50,670 +Và về cơ bản, nó hoạt động như thế này. + +17 +00:00:50,670 --> 00:00:53,168 +Vì vậy, bạn lấy tên của cả hai người + +18 +00:00:53,168 --> 00:00:57,600 +và kiểm tra số lần các chữ cái trong từ true xuất hiện. + +19 +00:00:57,600 --> 00:00:59,670 +Vì vậy, T-R-U-E và sau đó bạn + +20 +00:00:59,670 --> 00:01:02,220 +kiểm tra số lần các chữ cái trong từ + +21 +00:01:02,220 --> 00:01:06,240 +tình yêu xuất hiện, vì vậy L-O-V-E, sau đó, bạn kết hợp + +22 +00:01:06,240 --> 00:01:09,810 +hai số này để tạo thành một số có hai chữ số và đó là + +23 +00:01:09,810 --> 00:01:12,780 +tỷ lệ phần trăm điểm tình yêu của bạn. + +24 +00:01:12,780 --> 00:01:15,570 +Những gì chúng tôi sắp làm là chúng tôi cũng sẽ đưa + +25 +00:01:15,570 --> 00:01:17,670 +ra cách giải thích cho mọi người. + +26 +00:01:17,670 --> 00:01:21,594 +Vì vậy, nếu điểm tình yêu của họ nhỏ hơn 10 hoặc lớn hơn 90 thì + +27 +00:01:21,594 --> 00:01:23,610 +chúng tôi sẽ gửi cho họ tin nhắn + +28 +00:01:23,610 --> 00:01:26,040 +có nội dung: "Điểm của bạn là *x* các bạn + +29 +00:01:26,040 --> 00:01:28,380 +đi cùng nhau như coke và mentos. Và sau đó, đối với những người có điểm + +30 +00:01:28,380 --> 00:01:30,750 +tình yêu từ 40 đến 50, gần như ở mức + +31 +00:01:30,750 --> 00:01:32,160 +giới hạn, chúng tôi nói, + +32 +00:01:32,160 --> 00:01:36,600 +"Điểm tình yêu của bạn là *y*, các bạn đều ổn với nhau. + +33 +00:01:36,600 --> 00:01:40,020 +Và cuối cùng, nếu không có điều kiện nào trong số đó + +34 +00:01:40,020 --> 00:01:41,820 +đúng và mọi người ở khoảng từ + +35 +00:01:41,820 --> 00:01:44,678 +20 đến 40 và 50 đến 90, thì chúng tôi sẽ chỉ nói + +36 +00:01:44,678 --> 00:01:49,260 +với họ, "Điểm của bạn là... " bất kể đó là gì. + +37 +00:01:49,260 --> 00:01:51,420 +Nếu bạn nhìn vào hộp mô tả, bạn + +38 +00:01:51,420 --> 00:01:54,630 +sẽ thấy một ví dụ về cách chúng tôi tìm ra + +39 +00:01:54,630 --> 00:01:57,330 +tên1, đó là tên của tôi và tên2, là + +40 +00:01:57,330 --> 00:01:58,770 +Jack Bauer. + +41 +00:01:58,770 --> 00:02:03,150 +Và bạn có thể thấy T-R-U-E xuất hiện tổng cộng 5 lần trong + +42 +00:02:03,150 --> 00:02:06,480 +tên của cả hai chúng ta, và L-O-V-E xuất hiện + +43 +00:02:06,480 --> 00:02:09,509 +tổng cộng 3 lần trong tên của cả hai chúng + +44 +00:02:09,509 --> 00:02:10,800 +ta và do đó điểm tình + +45 +00:02:10,800 --> 00:02:15,270 +yêu cuối cùng là 53, không có ở đây cũng không có ở đó, không + +46 +00:02:15,270 --> 00:02:18,245 +phải thật tuyệt vời, nhưng này, nó là như + +47 +00:02:18,245 --> 00:02:19,770 +thế đấy. + +48 +00:02:19,770 --> 00:02:21,720 +Và điều đó có nghĩa là chương trình của chúng + +49 +00:02:21,720 --> 00:02:23,340 +ta chỉ đơn giản là in ra điểm số. + +50 +00:02:23,340 --> 00:02:26,400 +"Điểm của bạn là 53. Bạn có thể xem một số ví dụ khác mà + +51 +00:02:26,400 --> 00:02:28,830 +tôi đưa vào đây để kiểm tra, + +52 +00:02:28,830 --> 00:02:31,560 +đồng thời tôi cũng có một số gợi + +53 +00:02:31,560 --> 00:02:33,618 +ý trong đó và một số điểm + +54 +00:02:33,618 --> 00:02:36,620 +cho các tên khác nhau. + +55 +00:02:36,620 --> 00:02:40,380 +Đây là một thử thách khó khăn và như tôi đã nói trước đây, nếu + +56 +00:02:40,380 --> 00:02:42,459 +bạn gặp khó khăn về logic, hãy thử + +57 +00:02:42,459 --> 00:02:44,520 +viết chương trình biểu đồ luồng + +58 +00:02:44,520 --> 00:02:47,518 +của riêng bạn trước khi bạn thực sự bắt tay vào viết + +59 +00:02:47,518 --> 00:02:52,200 +mã, nếu không, hãy thử mọi thứ, kiểm tra mọi thứ, xem liệu nó có hoạt động + +60 +00:02:52,200 --> 00:02:55,590 +không và bạn có thể thử các biến thể khác nhau ở cuối khung + +61 +00:02:55,590 --> 00:02:59,010 +mô tả, Brad Pitt, Jennifer Aniston, Hoàng tử William, + +62 +00:02:59,010 --> 00:03:00,600 +Kate Middleton, v.v. và + +63 +00:03:00,600 --> 00:03:03,930 +đảm bảo rằng kết quả đầu ra của bạn khớp với số điểm được + +64 +00:03:03,930 --> 00:03:06,840 +hiển thị trong bảng đó. + +65 +00:03:06,840 --> 00:03:08,970 +Và điều này chỉ nhằm giúp bạn đảm bảo rằng + +66 +00:03:08,970 --> 00:03:12,180 +mã của bạn đang hoạt động. Và khi mã của bạn đang hoạt + +67 +00:03:12,180 --> 00:03:14,298 +động, thì bạn cũng phải đảm bảo rằng + +68 +00:03:14,298 --> 00:03:19,050 +đầu ra của bạn khớp với những gì mà khung mô tả muốn nó nói chính xác, vì vậy các + +69 +00:03:19,050 --> 00:03:22,230 +diễn giải cũng vậy. Và tôi khuyên bạn chỉ nên sao + +70 +00:03:22,230 --> 00:03:23,671 +chép và dán một số cách diễn + +71 +00:03:23,671 --> 00:03:26,820 +giải đó và thay thế các phần một cách thích hợp. + +72 +00:03:26,820 --> 00:03:28,863 +Vì vậy, chúc may mắn và tận hưởng. + +73 +00:03:38,700 --> 00:03:39,533 +Được rồi. + +74 +00:03:39,533 --> 00:03:40,710 +Đầu tiên, chúng ta + +75 +00:03:40,710 --> 00:03:44,010 +biết rằng chúng ta có name1 và name2 trong các + +76 +00:03:44,010 --> 00:03:46,740 +biến name1, name2 ở dòng hai và ba. + +77 +00:03:46,740 --> 00:03:47,790 +Và điều chúng ta + +78 +00:03:47,790 --> 00:03:51,930 +sẽ làm ở dòng thứ năm là kết hợp hai tên này lại với nhau để chúng + +79 +00:03:51,930 --> 00:03:54,840 +ta chỉ có một chuỗi duy nhất để kiểm tra. + +80 +00:03:54,840 --> 00:03:58,950 +Chúng ta viết tên kết hợp bằng tên1 cộng với tên2. + +81 +00:03:58,950 --> 00:04:02,790 +Bước tiếp theo là lấy tất cả các ký tự và đảm bảo cách viết hoa + +82 +00:04:02,790 --> 00:04:05,063 +của chúng giống với những gì chúng ta + +83 +00:04:05,063 --> 00:04:07,230 +sắp kiểm tra vì người dùng có thể đã + +84 +00:04:07,230 --> 00:04:10,620 +nhập tên viết hoa, họ có thể viết hoa tất cả các tên, họ + +85 +00:04:10,620 --> 00:04:11,943 +có thể đã viết tất cả bằng + +86 +00:04:11,943 --> 00:04:13,883 +chữ thường, chúng tôi không muốn + +87 +00:04:13,883 --> 00:04:15,772 +tất cả sự mơ hồ đó. + +88 +00:04:15,772 --> 00:04:19,050 +Vì vậy, chúng ta sẽ kiểm tra tên với các chữ cái viết thường. + +89 +00:04:19,050 --> 00:04:22,738 +Vì vậy, chúng tôi cũng sẽ sử dụng phần mở rộng ". phương thức low()" để + +90 +00:04:22,738 --> 00:04:27,480 +biến các tên kết hợp của chúng ta thành chữ thường. + +91 +00:04:27,480 --> 00:04:31,050 +Điều đó có nghĩa là chúng ta lấy tên1, tên2, ví dụ như trong phần Nhập, + +92 +00:04:31,050 --> 00:04:33,810 +chúng ta có David Beckham và Victoria Beckham. + +93 +00:04:33,810 --> 00:04:36,360 +Bằng cách kết hợp nó ở dòng thứ năm, giờ đây chúng + +94 +00:04:36,360 --> 00:04:39,056 +ta có một biến duy nhất gọi là davidbeckhamvictoriabeckham + +95 +00:04:39,056 --> 00:04:42,210 +và bằng cách viết nó thành chữ thường, tất cả các chữ cái + +96 +00:04:42,210 --> 00:04:45,003 +đó giờ đây đều là chữ thường. + +97 +00:04:45,960 --> 00:04:48,570 +Bước tiếp theo là tính chữ số đầu + +98 +00:04:48,570 --> 00:04:49,457 +tiên trong + +99 +00:04:49,457 --> 00:04:53,550 +điểm tình yêu, theo quy tắc là kiểm tra xem chữ T-R-U-E + +100 +00:04:53,550 --> 00:04:58,290 +xuất hiện bao nhiêu lần trong cả hai tên. + +101 +00:04:58,290 --> 00:05:00,630 +Vì vậy, chúng tôi sẽ kiểm tra nó với các tên viết + +102 +00:05:00,630 --> 00:05:03,570 +tắt của chúng tôi, các tên viết thường kết hợp và chúng tôi + +103 +00:05:03,570 --> 00:05:06,720 +cũng sẽ kiểm tra nó với các chữ cái viết thường, t-r-u-e. + +104 +00:05:06,720 --> 00:05:11,329 +Sau đó, chúng ta sử dụng "phương thức count()" để xem chữ cái đó xuất + +105 +00:05:11,329 --> 00:05:15,300 +hiện bao nhiêu lần trong tên kết hợp của chúng ta. + +106 +00:05:15,300 --> 00:05:17,910 +Và chúng tôi cộng tất cả các số đó lại với nhau + +107 +00:05:17,910 --> 00:05:21,873 +để có được chữ số đầu tiên cho máy tính tình yêu của mình. + +108 +00:05:22,710 --> 00:05:25,950 +Và tương tự, chúng ta làm điều tương tự với chữ số thứ hai. + +109 +00:05:25,950 --> 00:05:29,760 +Chúng tôi đếm số lần các chữ cái l-o-v-e xuất hiện trong + +110 +00:05:29,760 --> 00:05:34,410 +các tên viết thường kết hợp và chúng tôi cộng tất cả những lần xuất + +111 +00:05:34,410 --> 00:05:37,713 +hiện đó để có được chữ số thứ hai. + +112 +00:05:39,150 --> 00:05:41,220 +Khi chúng ta có cả hai chữ số, + +113 +00:05:41,220 --> 00:05:44,550 +chúng ta có thể kết hợp chúng lại với nhau. + +114 +00:05:44,550 --> 00:05:47,790 +Cách thức hoạt động của máy tính này là chúng + +115 +00:05:47,790 --> 00:05:49,860 +ta lấy chữ số đầu tiên và chữ số + +116 +00:05:49,860 --> 00:05:52,980 +thứ hai rồi tạo ra một số có hai chữ số. + +117 +00:05:52,980 --> 00:05:55,050 +Vì vậy chúng ta không thể cộng nó lại với nhau như toán học. + +118 +00:05:55,050 --> 00:05:58,500 +Không phải 9 + 8 bằng 17, mà thực + +119 +00:05:58,500 --> 00:06:01,110 +ra là 9 + 8 bằng 98. + +120 +00:06:01,110 --> 00:06:03,570 +Vậy điều đó có nghĩa là, chúng ta sẽ phải + +121 +00:06:03,570 --> 00:06:06,720 +biến các chữ số, vốn là các số thành chuỗi, để chúng + +122 +00:06:06,720 --> 00:06:09,734 +ta kết hợp chúng thay vì cộng chúng lại. + +123 +00:06:09,734 --> 00:06:14,640 +Để làm điều này, chúng ta viết phương thức str(), quấn nó quanh + +124 +00:06:14,640 --> 00:06:17,845 +chữ số mà chúng ta muốn biến thành một chuỗi + +125 +00:06:17,845 --> 00:06:20,280 +và sau đó chúng ta sử dụng dấu cộng + +126 +00:06:20,280 --> 00:06:22,800 +(+) để nối nó lại với nhau sao cho + +127 +00:06:22,800 --> 00:06:27,123 +chúng xuất hiện lần lượt như thể đó là văn bản. + +128 +00:06:28,470 --> 00:06:31,278 +Bây giờ, bước cuối cùng là kiểm tra điểm + +129 +00:06:31,278 --> 00:06:34,380 +theo các điều kiện mà chúng tôi đặt ra trong + +130 +00:06:34,380 --> 00:06:37,957 +phần mô tả để có thể giải thích cho mọi người về điểm + +131 +00:06:37,957 --> 00:06:40,980 +của họ. Bởi vì trong trường + +132 +00:06:40,980 --> 00:06:43,770 +hợp này, chúng ta sẽ phải so sánh các số + +133 +00:06:43,770 --> 00:06:48,600 +với các số, khi đó sẽ hợp lý hơn nếu biến điểm tình yêu tổng hợp của + +134 +00:06:48,600 --> 00:06:53,600 +chúng ta thành một số nguyên, vì vậy chúng ta gói chuỗi kết hợp đó vào + +135 +00:06:54,196 --> 00:06:57,480 +một phương thức int() để biến nó thành một số + +136 +00:06:57,480 --> 00:07:01,710 +chúng ta có thể so sánh với những con số khác. + +137 +00:07:01,710 --> 00:07:03,752 +Tất cả những gì còn lại phải + +138 +00:07:03,752 --> 00:07:05,865 +làm chỉ là viết một câu lệnh + +139 +00:07:05,865 --> 00:07:10,080 +if, elif, else để kiểm tra ba điều kiện. + +140 +00:07:10,080 --> 00:07:13,410 +Nếu điểm nhỏ hơn 10 hoặc lớn hơn 90 thì chúng + +141 +00:07:13,410 --> 00:07:16,080 +ta sẽ in câu lệnh đầu tiên. + +142 +00:07:16,080 --> 00:07:17,790 +Ngược lại, nếu điểm lớn + +143 +00:07:17,790 --> 00:07:22,470 +hơn hoặc bằng 40 và nhỏ hơn hoặc bằng 50, tức là nằm trong khoảng + +144 +00:07:22,470 --> 00:07:27,150 +từ 40 đến 50, thì chúng ta sẽ in câu lệnh thứ hai. + +145 +00:07:27,150 --> 00:07:29,572 +Và nếu tất cả những điều đó đều không + +146 +00:07:29,572 --> 00:07:33,630 +đúng thì chúng ta chỉ in ra điểm của họ ở câu thứ ba. + +147 +00:07:33,630 --> 00:07:36,660 +Đó là tất cả những gì có trong bài tập này. + +148 +00:07:36,660 --> 00:07:39,270 +Nếu bạn gặp bất kỳ vấn đề nào, hãy quay lại trang trình bày + +149 +00:07:39,270 --> 00:07:40,560 +trước đó và xem liệu bạn có thể + +150 +00:07:40,560 --> 00:07:43,653 +sửa mã của mình để vượt qua tất cả các bài kiểm tra hay không. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Add-your-own-ASCII-art.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Add-your-own-ASCII-art.url new file mode 100644 index 0000000000000000000000000000000000000000..73fa2638992328140a1d0c2a962fc53b28b1ded8 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Add-your-own-ASCII-art.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://ascii.co.uk/art \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Course-Fixes-Report-an-Issue.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Day 3 Project Treasure Island.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Day 3 Project Treasure Island.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f1ce53c000b2f57da4250fd24d9947586c335266 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Day 3 Project Treasure Island.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75d5f09d88a6aa953ed250560b3f4d2ff32c559ac778e5e52af59afb984b4241 +size 196772988 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Day 3 Project Treasure Island_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Day 3 Project Treasure Island_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ad493e76eb5206ed68ce88bc1cdfd5f358e0e17e --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Day 3 Project Treasure Island_vi.srt @@ -0,0 +1,1528 @@ +1 +00:00:00,120 --> 00:00:02,969 +Này, bạn đã hoàn thành dự án cuối cùng, + +2 +00:00:02,969 --> 00:00:07,740 +và như bạn đã thấy ở phần đầu của bài học hôm nay, tôi đã cho bạn thấy + +3 +00:00:07,740 --> 00:00:09,600 +chúng ta sẽ làm gì, đó là một + +4 +00:00:09,600 --> 00:00:12,750 +loại trò chơi phiêu lưu do bạn tự chọn. + +5 +00:00:12,750 --> 00:00:14,070 +Tôi không biết bạn đã từng + +6 +00:00:14,070 --> 00:00:15,570 +đọc những cuốn sách Chọn cuộc + +7 +00:00:15,570 --> 00:00:17,570 +phiêu lưu của riêng mình trong đó bạn + +8 +00:00:17,570 --> 00:00:20,190 +lật sang trang khác nếu bạn đưa ra một lựa chọn cụ + +9 +00:00:20,190 --> 00:00:24,540 +thể và sau đó câu chuyện sẽ phát triển khi bạn đưa ra lựa chọn của mình. + +10 +00:00:24,540 --> 00:00:27,420 +Bây giờ chúng ta sẽ tạo một phiên bản rất đơn giản của + +11 +00:00:27,420 --> 00:00:30,090 +nó bằng cách sử dụng những gì chúng ta đã học về + +12 +00:00:30,090 --> 00:00:32,280 +câu lệnh điều kiện, if, else, elif cũng + +13 +00:00:32,280 --> 00:00:34,800 +như mọi thứ chúng ta đã làm trước đây. + +14 +00:00:34,800 --> 00:00:37,530 +Vậy là bạn đã thấy kết quả cuối cùng sẽ như thế nào + +15 +00:00:37,530 --> 00:00:40,320 +và nếu bạn muốn xem lại nó, chỉ cần đi đến phần cuối + +16 +00:00:40,320 --> 00:00:44,940 +của hòn đảo kho báu. appbrewery. thay thế. chạy và ở đây về + +17 +00:00:44,940 --> 00:00:48,780 +cơ bản bạn sẽ thấy trò chơi đang hoạt động. + +18 +00:00:48,780 --> 00:00:52,350 +Vì vậy, nó bắt đầu hỏi bạn, "Bạn đang ở ngã tư, bạn + +19 +00:00:52,350 --> 00:00:54,030 +muốn rẽ trái hay phải? Và sau đó bạn phải + +20 +00:00:54,030 --> 00:00:57,150 +gõ sự lựa chọn của bạn. + +21 +00:00:57,150 --> 00:00:59,100 +Nếu bạn chọn trái, nó sẽ + +22 +00:00:59,100 --> 00:01:01,346 +đưa bạn đến một hồ nước và nó + +23 +00:01:01,346 --> 00:01:04,530 +sẽ hỏi bạn muốn đợi một chiếc thuyền hay + +24 +00:01:04,530 --> 00:01:05,760 +bơi qua. + +25 +00:01:05,760 --> 00:01:08,970 +Vậy chúng ta hãy cứ “chờ thuyền”. + +26 +00:01:08,970 --> 00:01:11,790 +Và bước cuối cùng là nó hỏi bạn, bạn + +27 +00:01:11,790 --> 00:01:13,530 +muốn đi qua cánh cửa nào + +28 +00:01:13,530 --> 00:01:15,720 +màu đỏ, vàng hay xanh? + +29 +00:01:15,720 --> 00:01:17,310 +Bây giờ tùy thuộc vào lựa + +30 +00:01:17,310 --> 00:01:18,930 +chọn của bạn, bạn sẽ kết thúc + +31 +00:01:18,930 --> 00:01:22,890 +trò chơi hoặc bạn sẽ giành chiến thắng trong trò chơi. + +32 +00:01:22,890 --> 00:01:27,030 +Vì vậy, thiết lập cơ bản cho trò chơi này trông giống như thế này. + +33 +00:01:27,030 --> 00:01:30,960 +Và tôi đã bao gồm một liên kết tới sơ đồ này trong + +34 +00:01:30,960 --> 00:01:33,060 +phần Repl bắt đầu. + +35 +00:01:33,060 --> 00:01:37,380 +Vì vậy, thay thế/appbrewery/treasure-island-start, và tất nhiên bạn + +36 +00:01:37,380 --> 00:01:39,180 +sẽ tìm thấy tất cả các liên kết trong + +37 +00:01:39,180 --> 00:01:41,610 +tài nguyên khóa học như mọi khi. + +38 +00:01:41,610 --> 00:01:43,680 +Nhưng nếu bạn cuộn xuống, sẽ có một liên + +39 +00:01:43,680 --> 00:01:45,630 +kết ngay tại đây đưa bạn đến sơ đồ này. + +40 +00:01:45,630 --> 00:01:48,660 +Bây giờ, câu hỏi đầu tiên bạn sẽ hỏi người dùng + +41 +00:01:48,660 --> 00:01:51,190 +là đưa ra lựa chọn giữa trái và phải. + +42 +00:01:51,190 --> 00:01:54,180 +Bây giờ bạn có thể sử dụng từ ngữ của tôi nếu bạn muốn. + +43 +00:01:54,180 --> 00:01:55,110 +"Bạn đang ở ngã ba đường. + +44 +00:01:55,110 --> 00:01:55,950 +Bạn muốn đi đâu? + +45 +00:01:55,950 --> 00:01:57,750 +Gõ "trái" hoặc gõ "phải". Nhưng tôi nghĩ điều thú vị của + +46 +00:01:57,750 --> 00:02:00,180 +thử thách này là việc bạn thực sự tạo ra câu + +47 +00:02:00,180 --> 00:02:02,534 +chuyện của riêng mình, phải không? + +48 +00:02:02,534 --> 00:02:06,420 +Nhưng bằng cách nào đó hãy khiến họ lựa chọn giữa trái và phải. + +49 +00:02:06,420 --> 00:02:10,350 +Nếu họ chọn đúng hoặc bất kỳ điều kiện nào khác cho vấn đề + +50 +00:02:10,350 --> 00:02:13,080 +đó, hãy nói với họ rằng họ đã thua, Game + +51 +00:02:13,080 --> 00:02:15,090 +Over vì một lý do nào đó. + +52 +00:02:15,090 --> 00:02:17,009 +Trong trường hợp của tôi, nếu họ đã + +53 +00:02:17,009 --> 00:02:20,460 +chọn đúng thì nguyên nhân là vì họ đã rơi vào hố, Game Over. + +54 +00:02:20,460 --> 00:02:23,100 +Nhưng tôi nghĩ bạn giàu trí tưởng tượng hơn tôi rất nhiều. + +55 +00:02:23,100 --> 00:02:25,548 +Vì vậy, hãy tiếp tục và sử dụng tất cả những kỹ năng + +56 +00:02:25,548 --> 00:02:27,780 +đó và làm cho trò chơi của bạn thực sự thú vị. + +57 +00:02:27,780 --> 00:02:30,060 +Bây giờ, nếu họ chọn trái, thì + +58 +00:02:30,060 --> 00:02:32,430 +chúng ta sẽ đưa họ đến một câu hỏi + +59 +00:02:32,430 --> 00:02:33,990 +khác hỏi xem họ có muốn + +60 +00:02:33,990 --> 00:02:37,560 +bơi hay muốn đợi một chiếc thuyền. + +61 +00:02:37,560 --> 00:02:41,550 +Và nếu họ bơi, thì đó sẽ là một dạng Game Over. + +62 +00:02:41,550 --> 00:02:44,341 +Có cá sấu, có bất cứ thứ gì có thể xảy ra, + +63 +00:02:44,341 --> 00:02:46,920 +nhưng chúng không thể tiếp tục. + +64 +00:02:46,920 --> 00:02:49,320 +Nhưng nếu họ chọn chờ đợi, chúng tôi sẽ đưa họ đến câu + +65 +00:02:49,320 --> 00:02:51,570 +hỏi thứ ba và cũng là câu hỏi cuối cùng yêu cầu họ + +66 +00:02:51,570 --> 00:02:53,070 +lựa chọn giữa ba cánh cửa. + +67 +00:02:53,070 --> 00:02:54,810 +Và nếu họ chọn cửa nào khác ngoài + +68 +00:02:54,810 --> 00:02:57,510 +cửa màu vàng thì họ sẽ thua, còn nếu chọn cửa + +69 +00:02:57,510 --> 00:03:00,720 +màu vàng thì bằng cách nào đó họ sẽ thắng. + +70 +00:03:00,720 --> 00:03:03,450 +Bây giờ hãy chú ý cách mỗi trò chơi chỉ nói Trò chơi kết thúc, + +71 +00:03:03,450 --> 00:03:05,040 +Trò chơi kết thúc, trái hoặc phải, + +72 +00:03:05,040 --> 00:03:07,527 +nhưng bạn biết đấy, ý tưởng thực sự là sử dụng khả năng + +73 +00:03:07,527 --> 00:03:10,800 +sáng tạo của bạn và biến trò chơi này thực sự là của riêng bạn. + +74 +00:03:10,800 --> 00:03:11,970 +Bây giờ, có một điều + +75 +00:03:11,970 --> 00:03:14,395 +cần nhớ là khi người dùng nhập một câu + +76 +00:03:14,395 --> 00:03:16,770 +trả lời, giả sử trái hoặc phải, họ có + +77 +00:03:16,770 --> 00:03:20,077 +thể gõ nó như thế này với chữ R viết hoa hoặc họ có thể + +78 +00:03:20,077 --> 00:03:23,220 +gõ nó như thế này hoàn toàn là chữ thường. + +79 +00:03:23,220 --> 00:03:25,410 +Hãy suy nghĩ về cách bạn có thể + +80 +00:03:25,410 --> 00:03:27,360 +đảm bảo rằng cho dù họ nhập + +81 +00:03:27,360 --> 00:03:29,620 +phiên bản nào, về cơ bản bạn vẫn + +82 +00:03:29,620 --> 00:03:32,190 +có thể nắm bắt được lệnh của họ. + +83 +00:03:32,190 --> 00:03:33,023 +Vì vậy, hãy + +84 +00:03:33,023 --> 00:03:35,070 +suy nghĩ về những gì bạn đã + +85 +00:03:35,070 --> 00:03:37,920 +học trong các bài học trước và xem sơ + +86 +00:03:37,920 --> 00:03:41,310 +đồ này, sau đó chuyển sang Dự án Bắt đầu và bạn + +87 +00:03:41,310 --> 00:03:44,010 +có thể bắt đầu viết mã của mình. + +88 +00:03:44,010 --> 00:03:45,390 +Bây giờ nếu bạn đi đến + +89 +00:03:45,390 --> 00:03:48,240 +đây và những gì bạn nhìn thấy giống như một + +90 +00:03:48,240 --> 00:03:49,770 +đống nhân vật khổng lồ, + +91 +00:03:49,770 --> 00:03:52,920 +thì lý do có thể là vì không có đủ không gian để trưng + +92 +00:03:52,920 --> 00:03:57,000 +bày tác phẩm nghệ thuật ASCII về Rương kho báu này. + +93 +00:03:57,000 --> 00:03:58,860 +Vì vậy, bạn có thể làm, như tôi + +94 +00:03:58,860 --> 00:04:01,567 +đã làm, giảm kích thước của bảng điều khiển + +95 +00:04:01,567 --> 00:04:04,260 +hoặc cách khác và có lẽ dễ dàng hơn là thay + +96 +00:04:04,260 --> 00:04:06,360 +đổi bố cục thành xếp chồng lên nhau, + +97 +00:04:06,360 --> 00:04:09,412 +đặt nó ở phía dưới, thu gọn khung bên trái này và + +98 +00:04:09,412 --> 00:04:14,013 +sau đó bạn có được nhiều thứ không gian mà bạn phải làm việc. + +99 +00:04:15,240 --> 00:04:16,950 +Bây giờ nghệ thuật ASCII thực + +100 +00:04:16,950 --> 00:04:18,870 +sự rất thú vị, vì về cơ bản nó chỉ + +101 +00:04:18,870 --> 00:04:20,910 +sử dụng một loạt ký tự mà bạn biết + +102 +00:04:20,910 --> 00:04:23,220 +và yêu thích như dấu phẩy và dấu bằng + +103 +00:04:23,220 --> 00:04:27,663 +và tất cả những thứ này cùng nhau tạo nên một bức tranh. + +104 +00:04:28,590 --> 00:04:30,285 +Và bạn có thể tìm thấy tác phẩm nghệ thuật ASCII + +105 +00:04:30,285 --> 00:04:34,500 +của riêng mình nếu bạn truy cập ascii. đồng. uk/art và bạn sẽ thấy + +106 +00:04:34,500 --> 00:04:36,910 +rất nhiều chủ đề khác nhau và + +107 +00:04:36,910 --> 00:04:40,188 +họ đã nhóm nhiều thứ lại với nhau thành các + +108 +00:04:40,188 --> 00:04:42,270 +trang riêng lẻ. + +109 +00:04:42,270 --> 00:04:44,610 +Vì vậy, nếu bạn muốn một tác phẩm nghệ thuật + +110 +00:04:44,610 --> 00:04:47,220 +ASCII về tê giác, thì bạn có thể tìm thấy cả đống + +111 +00:04:47,220 --> 00:04:49,110 +tê giác mà mọi người đã vẽ. + +112 +00:04:49,110 --> 00:04:51,780 +Nhưng cách dễ nhất tất nhiên là sử dụng Command + F nếu + +113 +00:04:51,780 --> 00:04:52,613 +bạn đang sử dụng + +114 +00:04:52,613 --> 00:04:55,350 +máy Mac hoặc Ctrl + F nếu bạn đang sử dụng máy Windows, + +115 +00:04:55,350 --> 00:04:57,450 +sau đó chỉ cần tìm kiếm thứ bạn muốn. + +116 +00:04:57,450 --> 00:05:00,750 +Vì vậy, ví dụ, tôi đã đi tìm kho báu, và ở dưới + +117 +00:05:00,750 --> 00:05:04,470 +đây tôi đã tìm thấy Hộp kho báu tuyệt vời này với + +118 +00:05:04,470 --> 00:05:06,930 +hình vẽ ASCII, đó là thứ tôi đang + +119 +00:05:06,930 --> 00:05:10,350 +sử dụng để in bên trong bản in này. + +120 +00:05:10,350 --> 00:05:13,121 +Bây giờ, hãy chú ý rằng có ba dấu ngoặc + +121 +00:05:13,121 --> 00:05:14,562 +đơn (' ' ') ở đầu và + +122 +00:05:14,562 --> 00:05:17,580 +có ba dấu ngoặc đơn (' ' ') ở cuối. + +123 +00:05:17,580 --> 00:05:20,040 +Về cơ bản những gì dấu ngoặc đơn cho + +124 +00:05:20,040 --> 00:05:24,540 +phép bạn làm là tạo ra nhiều dòng của một chuỗi về cơ bản. + +125 +00:05:24,540 --> 00:05:26,760 +Vì vậy, hãy lưu ý nếu tôi tiếp + +126 +00:05:26,760 --> 00:05:29,280 +tục và xóa tất cả các dấu ngoặc + +127 +00:05:29,280 --> 00:05:33,090 +đơn này và tôi chỉ có một bộ dấu ngoặc kép thì + +128 +00:05:33,090 --> 00:05:36,003 +nó thực sự không hoạt động. + +129 +00:05:37,350 --> 00:05:40,500 +Nó khá bối rối vì nghĩ rằng đây là nơi + +130 +00:05:40,500 --> 00:05:43,260 +kết thúc dòng, nhưng thực tế, tôi + +131 +00:05:43,260 --> 00:05:46,260 +muốn in tất cả những điều này ra. + +132 +00:05:46,260 --> 00:05:49,140 +Vì vậy, để làm điều đó, thay vì sử dụng dấu ngoặc + +133 +00:05:49,140 --> 00:05:51,570 +kép, tôi sử dụng ba dấu ngoặc đơn. + +134 +00:05:51,570 --> 00:05:53,040 +Và ở phần dưới cùng, tôi + +135 +00:05:53,040 --> 00:05:56,640 +nói rõ rằng đây là phần cuối của chuỗi nhiều khối của tôi + +136 +00:05:56,640 --> 00:05:59,280 +bằng cách sử dụng ba dấu ngoặc đơn. + +137 +00:05:59,280 --> 00:06:00,630 +Vì vậy, hãy thử chạy nó và bạn + +138 +00:06:00,630 --> 00:06:03,240 +sẽ có thể thấy điều đó trong bảng điều khiển của mình. + +139 +00:06:03,240 --> 00:06:06,780 +Bạn sẽ thấy tác phẩm nghệ thuật ASCII của Đảo Châu Báu + +140 +00:06:06,780 --> 00:06:10,170 +nhỏ này được in cùng với hai câu bắt đầu trò chơi. + +141 +00:06:10,170 --> 00:06:12,277 +Hãy xem biểu đồ quy trình, + +142 +00:06:12,277 --> 00:06:15,120 +tìm hiểu nghệ thuật ASCII và cũng xem + +143 +00:06:15,120 --> 00:06:19,170 +phiên bản cuối cùng của ứng dụng để bạn có thể tiếp tục + +144 +00:06:19,170 --> 00:06:20,580 +và tạo phiên bản của + +145 +00:06:20,580 --> 00:06:24,630 +riêng mình nhằm hoàn thành thử thách này. + +146 +00:06:24,630 --> 00:06:26,580 +Hãy tạm dừng video ngay bây giờ và thử xem. + +147 +00:06:30,750 --> 00:06:31,583 +Được rồi, hãy + +148 +00:06:31,583 --> 00:06:34,290 +xem liệu chúng ta có thể tái tạo chức năng hoặc + +149 +00:06:34,290 --> 00:06:37,110 +logic được hiển thị trong sơ đồ này vào trò chơi + +150 +00:06:37,110 --> 00:06:39,120 +Đảo kho báu hay không. + +151 +00:06:39,120 --> 00:06:42,750 +Vì vậy, điều đầu tiên nó phải làm là chúng ta phải hỏi người + +152 +00:06:42,750 --> 00:06:45,090 +dùng xem họ muốn rẽ trái hay rẽ phải. + +153 +00:06:45,090 --> 00:06:47,338 +Và sau khi hỏi người dùng câu hỏi này, + +154 +00:06:47,338 --> 00:06:51,540 +chúng ta sẽ muốn nắm bắt thông tin đầu vào của họ, phải không? + +155 +00:06:51,540 --> 00:06:52,410 +Vì vậy, hãy + +156 +00:06:52,410 --> 00:06:56,823 +tiếp tục tạo một hàm input() và đặt câu hỏi. + +157 +00:07:00,570 --> 00:07:05,520 +Bây giờ hãy chú ý rằng khi tôi sử dụng dấu ngoặc kép xung quanh chuỗi của + +158 +00:07:05,520 --> 00:07:08,370 +mình, các dấu ngoặc kép nằm trong dấu ngoặc + +159 +00:07:08,370 --> 00:07:12,210 +kép được hiểu là mã vì nó thực sự cho rằng đây là phần cuối + +160 +00:07:12,210 --> 00:07:15,180 +của chuỗi đầu tiên, đây là chuỗi thứ hai và + +161 +00:07:15,180 --> 00:07:18,090 +đây là chuỗi chuỗi cuối cùng. + +162 +00:07:18,090 --> 00:07:20,550 +Đây là cách máy tính sẽ nhìn thấy nó. + +163 +00:07:20,550 --> 00:07:22,980 +Bây giờ, trước đây bạn đã thấy rằng chúng + +164 +00:07:22,980 --> 00:07:27,090 +ta có thể thực hiện thủ thuật thay đổi điều này thành dấu ngoặc đơn. + +165 +00:07:27,090 --> 00:07:29,728 +Nhưng nếu giống như tôi, bạn gặp trường + +166 +00:07:29,728 --> 00:07:34,350 +hợp này khi bạn có "You're" với dấu nháy đơn, thì nó sẽ nghĩ rằng + +167 +00:07:34,350 --> 00:07:35,910 +đây thực sự là phần cuối + +168 +00:07:35,910 --> 00:07:38,430 +của chuỗi đầu tiên, đây là chuỗi thứ + +169 +00:07:38,430 --> 00:07:41,220 +hai và đây là chuỗi thứ ba. + +170 +00:07:41,220 --> 00:07:43,800 +Vì vậy, điều này thực sự không thực sự giúp ích cho chúng tôi. + +171 +00:07:43,800 --> 00:07:47,400 +Bây giờ tất cả những gì chúng ta có thể làm khi muốn nói với máy tính + +172 +00:07:47,400 --> 00:07:49,890 +rằng những gì tôi đang viết thực ra không phải + +173 +00:07:49,890 --> 00:07:52,350 +là mã mà chỉ xem nó dưới dạng văn bản. + +174 +00:07:52,350 --> 00:07:55,590 +Bạn có thể làm cho nó bỏ qua một ký hiệu sau đó bằng cách + +175 +00:07:55,590 --> 00:07:57,930 +sử dụng dấu gạch chéo ngược (\). + +176 +00:07:57,930 --> 00:08:01,860 +Vì vậy, theo cách này về cơ bản nó sẽ thoát khỏi chuỗi này + +177 +00:08:01,860 --> 00:08:04,290 +và nó sẽ xem nó dưới dạng văn bản. + +178 +00:08:04,290 --> 00:08:07,938 +Và bây giờ chúng ta có một chuỗi hoàn chỉnh như thế này + +179 +00:08:07,938 --> 00:08:10,950 +và nó sẽ được hiểu là văn bản vì chúng ta đã yêu + +180 +00:08:10,950 --> 00:08:13,710 +cầu nó bằng dấu gạch chéo ngược. + +181 +00:08:13,710 --> 00:08:15,060 +Tất nhiên bây giờ có những cách khác mà + +182 +00:08:15,060 --> 00:08:16,320 +bạn có thể giải quyết vấn đề này. + +183 +00:08:16,320 --> 00:08:18,120 +Bạn có thể chỉ cần nói đơn giản + +184 +00:08:18,120 --> 00:08:22,710 +"Bạn đang ở ngã tư đường... " thay vì sử dụng dấu nháy đơn, nhưng thường thì + +185 +00:08:22,710 --> 00:08:23,760 +bạn sẽ cần sử dụng một + +186 +00:08:23,760 --> 00:08:26,340 +ký hiệu mà bạn cần phải thoát và bạn có thể làm điều đó + +187 +00:08:26,340 --> 00:08:27,960 +bằng dấu gạch chéo ngược. + +188 +00:08:27,960 --> 00:08:29,850 +Vì vậy, đó chỉ là một mẹo nhanh. + +189 +00:08:29,850 --> 00:08:30,750 +Bây giờ tại thời + +190 +00:08:30,750 --> 00:08:34,799 +điểm này, người dùng sẽ nhập tin nhắn sang trái hoặc phải. + +191 +00:08:34,799 --> 00:08:37,631 +Vì vậy hãy tiếp tục và lưu nó vào một biến. + +192 +00:08:37,631 --> 00:08:40,740 +Hãy gọi nó là Choice1 bằng đầu vào của họ. + +193 +00:08:40,740 --> 00:08:43,380 +Bây giờ hãy nhớ tôi đã nói họ có thể gõ câu + +194 +00:08:43,380 --> 00:08:45,660 +trả lời là "Đúng" hoặc "đúng". + +195 +00:08:45,660 --> 00:08:49,290 +Vậy làm cách nào chúng ta có thể đảm bảo rằng khi thực hiện kiểm + +196 +00:08:49,290 --> 00:08:52,920 +tra bằng câu lệnh if, chúng ta sẽ bỏ qua cách viết hoa? + +197 +00:08:52,920 --> 00:08:55,012 +Chà, một cách để làm điều này là chúng + +198 +00:08:55,012 --> 00:08:59,070 +ta có thể chỉ cần sử dụng "hàm Lower()" để thay đổi dữ liệu đầu vào + +199 +00:08:59,070 --> 00:09:02,520 +của họ bất kể họ viết nó như thế nào, Đúng, phải hay RIGHT, + +200 +00:09:02,520 --> 00:09:07,350 +tất cả đều phải được chuyển đổi thành chữ thường cho phiên bản này. + +201 +00:09:07,350 --> 00:09:08,585 +Bằng cách đó, chúng ta + +202 +00:09:08,585 --> 00:09:12,180 +có một điều mà chúng ta có thể kiểm tra một cách nhất quán trong câu + +203 +00:09:12,180 --> 00:09:13,500 +lệnh if sắp ra mắt. + +204 +00:09:13,500 --> 00:09:17,756 +Vì vậy, chúng ta có thể nói nếu lựa chọn1 ==, hãy nhớ + +205 +00:09:17,756 --> 00:09:20,294 +rằng giá trị bằng kép đang kiểm + +206 +00:09:20,294 --> 00:09:23,220 +tra xem bên trái và bên phải có bằng + +207 +00:09:23,220 --> 00:09:27,210 +nhau hay không và dấu bằng đơn đang gán phía bên + +208 +00:09:27,210 --> 00:09:29,790 +phải cho tên biến cụ thể này. + +209 +00:09:29,790 --> 00:09:33,300 +Bây giờ nếu lựa chọn1 bằng đúng chuỗi thì người chơi + +210 +00:09:33,300 --> 00:09:36,390 +của chúng ta gần như đã kết thúc trò chơi. + +211 +00:09:36,390 --> 00:09:39,210 +Vì vậy, hãy tiếp tục thêm dấu hai + +212 +00:09:39,210 --> 00:09:43,860 +chấm của chúng ta và in một cái gì đó như Game Over. + +213 +00:09:43,860 --> 00:09:45,960 +Tất nhiên, chúng ta có thể giải thích thêm một chút + +214 +00:09:45,960 --> 00:09:47,790 +về lý do tại sao Game Over lại như vậy. + +215 +00:09:47,790 --> 00:09:52,020 +"À, bởi vì cậu đã rơi xuống một cái hố. Điều này giống như trò chơi + +216 +00:09:52,020 --> 00:09:54,933 +ET từ những năm 80. + +217 +00:09:55,830 --> 00:09:57,037 +Rất nhiều lỗ. + +218 +00:09:57,037 --> 00:10:00,813 +Vì vậy, "Bạn rơi vào một cái hố. Trò chơi kết thúc. Nhưng điều gì + +219 +00:10:00,813 --> 00:10:05,550 +sẽ xảy ra nếu họ chọn bên trái? + +220 +00:10:05,550 --> 00:10:08,130 +Chà, điều đó đưa họ đến câu hỏi tiếp theo. + +221 +00:10:08,130 --> 00:10:11,250 +Vì vậy, đó là lựa chọn sẽ cho phép họ tiếp tục + +222 +00:10:11,250 --> 00:10:12,213 +trò chơi. + +223 +00:10:13,410 --> 00:10:17,100 +Bây giờ, trong trường hợp này, chúng ta có thể sử dụng một câu lệnh khác + +224 +00:10:17,100 --> 00:10:18,750 +và nói, nếu họ không chọn bên phải + +225 +00:10:18,750 --> 00:10:21,330 +thì có lẽ họ đã chọn bên trái, phải không? + +226 +00:10:21,330 --> 00:10:23,910 +Nhưng họ cũng có thể chọn một phương án hoàn + +227 +00:10:23,910 --> 00:10:25,560 +toàn không được liệt kê. + +228 +00:10:25,560 --> 00:10:28,320 +Họ có thể vừa viết một cái gì đó như thế + +229 +00:10:28,320 --> 00:10:31,410 +này và nó vẫn sẽ kích hoạt câu lệnh khác. + +230 +00:10:31,410 --> 00:10:36,240 +Vì vậy, điều chúng ta thực sự nên làm là thay đổi nó. + +231 +00:10:36,240 --> 00:10:41,240 +Vì vậy, cụ thể là chúng ta nên nói, nếu lựa chọn1 == "trái": trong + +232 +00:10:43,140 --> 00:10:48,140 +trường hợp đó, thì họ sẽ tiếp tục cho bạn tham gia trò chơi. + +233 +00:10:48,870 --> 00:10:52,980 +Nhưng mặt khác, cụ thể là nếu họ chọn "đúng" hoặc bất + +234 +00:10:52,980 --> 00:10:55,140 +cứ điều gì khác cho vấn đề đó, + +235 +00:10:55,140 --> 00:10:57,360 +thì gần như Game Over. + +236 +00:10:57,360 --> 00:10:59,520 +Vì vậy, định dạng này có ý nghĩa hơn + +237 +00:10:59,520 --> 00:11:01,110 +nhiều nếu bạn muốn tiếp + +238 +00:11:01,110 --> 00:11:04,800 +tục dọc theo phía bên trái của nhánh theo cách này. + +239 +00:11:04,800 --> 00:11:07,290 +Bây giờ, một điều khác mà bạn có thể đã nhận + +240 +00:11:07,290 --> 00:11:10,860 +ra vì chúng ta đã tìm hiểu về cách kết hợp các điều kiện khác + +241 +00:11:10,860 --> 00:11:13,980 +nhau là thay vì sử dụng . low() để thay đổi + +242 +00:11:13,980 --> 00:11:16,650 +đầu vào thành chữ thường, bạn + +243 +00:11:16,650 --> 00:11:20,310 +cũng có thể nói if Choice == "left" hoặc + +244 +00:11:20,310 --> 00:11:25,310 +if Choice1 == "Left": đánh vần như thế này, cả hai đều + +245 +00:11:25,500 --> 00:11:26,996 +hoạt động. + +246 +00:11:26,996 --> 00:11:31,526 +Nhưng tôi nghĩ về mặt ngắn gọn và ít viết mã hơn, tôi + +247 +00:11:31,526 --> 00:11:35,250 +nghĩ điều này có ý nghĩa hơn đối với tôi. + +248 +00:11:35,250 --> 00:11:37,440 +Vì vậy tôi sẽ tiếp tục với phiên bản này. + +249 +00:11:37,440 --> 00:11:38,940 +Nhưng nếu bạn làm theo cách khác + +250 +00:11:38,940 --> 00:11:40,923 +thì điều đó cũng hoàn toàn hợp lệ. + +251 +00:11:41,820 --> 00:11:44,400 +Bây giờ nếu còn lại lựa chọn 1, họ sẽ được + +252 +00:11:44,400 --> 00:11:46,560 +chuyển sang câu hỏi tiếp theo. + +253 +00:11:46,560 --> 00:11:48,510 +Bạn muốn bơi hay muốn đợi? + +254 +00:11:49,410 --> 00:11:51,450 +Vì vậy, hãy tiếp tục và + +255 +00:11:51,450 --> 00:11:55,230 +tiếp tục trò chơi và tạo một đầu vào khác. + +256 +00:11:55,230 --> 00:11:58,260 +Trong phần này, chúng ta sẽ hỏi họ một + +257 +00:11:58,260 --> 00:12:01,830 +câu hỏi và nói: "Bạn đã đến một cái hồ. + +258 +00:12:01,830 --> 00:12:06,330 +Có một hòn đảo ở giữa hồ. + +259 +00:12:06,330 --> 00:12:11,100 +Gõ "chờ" để đợi thuyền. + +260 +00:12:11,100 --> 00:12:15,990 +Gõ "bơi" để bơi qua. + +261 +00:12:15,990 --> 00:12:18,630 +Thật tuyệt, vậy là chúng ta thực + +262 +00:12:18,630 --> 00:12:23,610 +sự đã gặp phải vấn đề tương tự như trước đây, đó là vấn đề này được + +263 +00:12:23,610 --> 00:12:28,380 +hiểu là mã chứ không phải là một chuỗi đơn liên tục. + +264 +00:12:28,380 --> 00:12:31,080 +Vậy bạn có nhớ cách chúng tôi sửa lỗi này trước đây không? + +265 +00:12:31,080 --> 00:12:32,940 +Và nếu bạn gặp khó khăn ở vấn đề này, tôi khuyên + +266 +00:12:32,940 --> 00:12:34,920 +bạn nên tự mình giải quyết vấn đề này trước khi + +267 +00:12:34,920 --> 00:12:36,423 +tôi chỉ cho bạn câu trả lời. + +268 +00:12:37,913 --> 00:12:40,650 +Được rồi, trước đó chúng ta đã nói rằng + +269 +00:12:40,650 --> 00:12:42,690 +chúng ta sẽ chuyển nó sang dấu + +270 +00:12:42,690 --> 00:12:46,110 +ngoặc đơn để những dấu ngoặc kép này được hiểu là + +271 +00:12:46,110 --> 00:12:48,420 +các chuỗi thông thường. + +272 +00:12:48,420 --> 00:12:50,940 +Nhưng tất nhiên chúng ta có "You've", tất + +273 +00:12:50,940 --> 00:12:54,870 +nhiên chúng ta có thể đổi nó thành "you has" thay vì you've, nhưng + +274 +00:12:54,870 --> 00:12:58,500 +nếu muốn thoát khỏi chuỗi, chúng ta chỉ cần thêm \ và bây giờ + +275 +00:12:58,500 --> 00:13:01,590 +mọi thứ đã có màu có màu hơi hồng để cho biết tất cả đều + +276 +00:13:01,590 --> 00:13:04,980 +được hiểu dưới dạng một chuỗi, đó chính xác là những gì chúng + +277 +00:13:04,980 --> 00:13:07,053 +tôi đã làm trước đây. + +278 +00:13:07,950 --> 00:13:09,540 +Bây giờ xét về đầu vào này, + +279 +00:13:09,540 --> 00:13:12,390 +họ sẽ gõ "đợi" hoặc họ sẽ gõ "bơi". + +280 +00:13:12,390 --> 00:13:15,810 +Vì vậy, hãy tiếp tục và hạ thấp vỏ của nó xuống, sau + +281 +00:13:15,810 --> 00:13:18,990 +đó chúng ta sẽ lưu nó vào trong một lựa chọn. + +282 +00:13:18,990 --> 00:13:21,000 +Chúng ta sẽ nói sự lựa chọn2. + +283 +00:13:21,000 --> 00:13:25,470 +Bây giờ hãy thực sự cẩn thận và chú ý đến việc thụt đầu dòng + +284 +00:13:25,470 --> 00:13:28,020 +của bạn, bởi vì nếu bạn viết nó như + +285 +00:13:28,020 --> 00:13:31,170 +thế này thì nó sẽ tạo ra một số lỗi cho bạn vì + +286 +00:13:31,170 --> 00:13:34,530 +dòng đầu vào Choice2 này phải chạy khi Choice1 + +287 +00:13:34,530 --> 00:13:38,043 +này bằng bên trái, nếu không chúng ta sẽ làm như + +288 +00:13:39,030 --> 00:13:42,120 +vậy nhận được một lỗi thụt lề. + +289 +00:13:42,120 --> 00:13:44,790 +Vì vậy, hãy tiếp tục thụt lề ở đây + +290 +00:13:44,790 --> 00:13:48,810 +để cho thấy rằng phần này nằm bên trong câu lệnh if + +291 +00:13:48,810 --> 00:13:52,770 +này và sẽ chỉ được thực thi nếu điều này đúng. + +292 +00:13:52,770 --> 00:13:55,800 +Và sau đó chúng ta có thể kiểm tra lựa chọn của mình2. + +293 +00:13:55,800 --> 00:13:59,640 +Vì vậy, nếu Choice2 == "wait": thì điều đó có + +294 +00:14:01,020 --> 00:14:03,993 +nghĩa là trò chơi sẽ tiếp tục, nhưng + +295 +00:14:06,210 --> 00:14:09,930 +ngược lại, nếu họ gõ swim hoặc bất cứ điều gì + +296 +00:14:09,930 --> 00:14:12,180 +khác cho vấn đề đó thì trò chơi + +297 +00:14:12,180 --> 00:14:13,800 +sẽ kết thúc. + +298 +00:14:13,800 --> 00:14:15,030 +Vì vậy, chúng tôi + +299 +00:14:15,030 --> 00:14:17,370 +sẽ in và nói với họ rằng có điều gì + +300 +00:14:17,370 --> 00:14:22,173 +đó khủng khiếp đã xảy ra, "Bạn bị một con cá hồi giận dữ tấn công. + +301 +00:14:24,420 --> 00:14:25,253 +Trò chơi kết thúc. Bây giờ chúng ta + +302 +00:14:26,220 --> 00:14:28,272 +có thể tiếp tục đi theo con đường này. + +303 +00:14:28,272 --> 00:14:30,045 +Vậy bây giờ chúng ta xuống đây. + +304 +00:14:30,045 --> 00:14:32,850 +Và câu hỏi cuối cùng chúng tôi sẽ hỏi + +305 +00:14:32,850 --> 00:14:36,150 +người dùng là họ muốn chọn cánh cửa nào? + +306 +00:14:36,150 --> 00:14:38,376 +Vì vậy, ở đây tôi sẽ sử dụng input() + +307 +00:14:38,376 --> 00:14:40,830 +để gửi cho họ thông báo rằng "Bạn đến + +308 +00:14:40,830 --> 00:14:43,260 +hòn đảo mà không hề hấn gì. + +309 +00:14:43,260 --> 00:14:44,610 +Có một ngôi nhà có ba cửa. + +310 +00:14:44,610 --> 00:14:46,500 +Một màu đỏ, một màu vàng, một màu xanh. + +311 +00:14:46,500 --> 00:14:48,750 +Bạn chọn màu nào? Bây giờ tôi sẽ lưu lựa + +312 +00:14:48,750 --> 00:14:51,450 +chọn của họ bên trong một + +313 +00:14:51,450 --> 00:14:54,420 +biến có tên là Choice3, viết + +314 +00:14:54,420 --> 00:14:58,560 +thường câu trả lời mà họ cung cấp. + +315 +00:14:58,560 --> 00:15:01,740 +Và cuối cùng tôi sẽ sử dụng if, elif và else để kiểm + +316 +00:15:01,740 --> 00:15:03,930 +tra xem họ đã chọn cái nào. + +317 +00:15:03,930 --> 00:15:08,930 +Vì vậy, nếu Choice3 == "red": Elif + +318 +00:15:10,380 --> 00:15:15,003 +Choice3 == màu vàng, Elif Choice3 + +319 +00:15:18,060 --> 00:15:22,263 +bằng màu xanh. + +320 +00:15:23,310 --> 00:15:25,680 +Và sau đó tôi có một cái khác. + +321 +00:15:25,680 --> 00:15:28,500 +Vì vậy, đây là bốn điều có thể xảy ra. + +322 +00:15:28,500 --> 00:15:31,770 +Nếu họ chọn màu đỏ thì tôi sẽ nói với họ rằng + +323 +00:15:31,770 --> 00:15:33,900 +đó là Game Over, nhưng đó sẽ + +324 +00:15:33,900 --> 00:15:36,240 +là một phiên bản sáng tạo nào đó + +325 +00:15:36,240 --> 00:15:37,620 +của Game Over. + +326 +00:15:37,620 --> 00:15:41,460 +Vì vậy có thể đại loại như "Đó là một căn phòng đầy lửa. + +327 +00:15:41,460 --> 00:15:42,840 +Trò chơi kết thúc. Mặt khác, nếu + +328 +00:15:42,840 --> 00:15:46,500 +họ chọn màu vàng thì đó sẽ là căn + +329 +00:15:46,500 --> 00:15:49,170 +phòng chứa kho báu. + +330 +00:15:49,170 --> 00:15:51,750 +Vì vậy tôi sẽ in dòng chữ "Bạn đã tìm thấy kho báu! + +331 +00:15:51,750 --> 00:15:52,890 +Bạn thắng! Nếu họ chọn màu + +332 +00:15:52,890 --> 00:15:57,450 +xanh lam, họ cũng kết thúc Game Over và tôi phải đưa + +333 +00:15:57,450 --> 00:16:00,273 +ra cho họ một lý do khác. + +334 +00:16:01,110 --> 00:16:02,550 +Bây giờ nếu bạn đã quyết + +335 +00:16:02,550 --> 00:16:05,820 +định rằng nếu họ chọn bất cứ thứ gì ngoài màu vàng, + +336 +00:16:05,820 --> 00:16:09,390 +thì cách họ sẽ chơi trò chơi cũng giống như vậy, nếu bạn + +337 +00:16:09,390 --> 00:16:11,760 +chọn màu đỏ, "Đó là một căn phòng đầy + +338 +00:16:11,760 --> 00:16:12,840 +lửa. + +339 +00:16:12,840 --> 00:16:13,673 +Trò chơi kết thúc. Nếu bạn chọn màu xanh + +340 +00:16:13,673 --> 00:16:15,450 +lam, "Đó là một căn phòng đầy lửa. + +341 +00:16:15,450 --> 00:16:16,590 +Trò chơi kết thúc. Bất cứ điều gì + +342 +00:16:16,590 --> 00:16:18,623 +khác, nó cũng sẽ cháy. + +343 +00:16:18,623 --> 00:16:20,100 +Trò chơi kết thúc. + +344 +00:16:20,100 --> 00:16:22,800 +Vậy thì bạn chỉ có thể sử dụng if và else, nhưng nếu + +345 +00:16:22,800 --> 00:16:25,770 +bạn muốn mỗi lựa chọn hoặc mỗi cánh cửa mang lại kết quả + +346 +00:16:25,770 --> 00:16:27,690 +khác nhau cho người dùng, hãy nói: + +347 +00:16:27,690 --> 00:16:31,200 +"Cánh cửa màu đỏ có lửa. Cánh cửa màu xanh có những con thú. Và nếu họ chọn sai cánh + +348 +00:16:31,200 --> 00:16:33,420 +cửa thì họ sẽ nhận được câu hỏi + +349 +00:16:33,420 --> 00:16:35,420 +như "Bạn đã chọn một cánh cửa + +350 +00:16:36,720 --> 00:16:38,370 +không tồn tại. + +351 +00:16:38,370 --> 00:16:39,510 +Trò chơi kết thúc. Vì vậy, bạn có thể + +352 +00:16:39,510 --> 00:16:40,620 +thấy rằng tùy thuộc + +353 +00:16:40,620 --> 00:16:43,329 +vào việc bạn có muốn cung cấp cho người + +354 +00:16:43,329 --> 00:16:48,329 +dùng một câu lệnh in khác dựa trên lựa chọn của họ hay không, thì bạn sẽ sử + +355 +00:16:48,900 --> 00:16:51,600 +dụng if, elif, else, nhưng nếu bạn thực + +356 +00:16:51,600 --> 00:16:52,530 +sự chỉ muốn cung + +357 +00:16:52,530 --> 00:16:54,960 +cấp cho họ phản hồi tương tự, đó là Trò + +358 +00:16:54,960 --> 00:16:59,208 +chơi Kết thúc, bạn chỉ cần sử dụng if và else. + +359 +00:16:59,208 --> 00:17:03,330 +Bây giờ hãy chạy trò chơi của chúng ta và đảm bảo rằng nó hoạt động. + +360 +00:17:03,330 --> 00:17:06,869 +Vì vậy, tôi sẽ rẽ trái vì tôi biết nó vẫn tiếp tục, + +361 +00:17:06,869 --> 00:17:10,260 +và sau đó tôi sẽ đợi thuyền, và điều đó cho phép + +362 +00:17:10,260 --> 00:17:13,230 +tôi đạt được điều kiện cuối cùng. + +363 +00:17:13,230 --> 00:17:16,109 +Và nếu tôi chọn màu vàng, tôi biết mình sẽ thắng. + +364 +00:17:16,109 --> 00:17:18,150 +Bây giờ, nếu bạn muốn thay đổi + +365 +00:17:18,150 --> 00:17:21,510 +định dạng, vì việc nhập dữ liệu ở cuối câu có vẻ không + +366 +00:17:21,510 --> 00:17:24,060 +tốt bằng việc cho phép người dùng nhập + +367 +00:17:24,060 --> 00:17:27,480 +nó trên một dòng mới giống như những gì chúng tôi có + +368 +00:17:27,480 --> 00:17:31,860 +ở đây, thì bạn có thể chỉ cần, nếu bạn hãy nhớ rằng, chỉ cần thêm dòng + +369 +00:17:31,860 --> 00:17:36,393 +mới \n vào cuối thông tin đầu vào của bạn, như vậy. + +370 +00:17:38,490 --> 00:17:41,340 +Vậy bạn đã vượt qua thử thách này như thế nào? + +371 +00:17:41,340 --> 00:17:43,140 +Và nếu bạn không làm đúng hoặc + +372 +00:17:43,140 --> 00:17:46,980 +nếu bạn đã làm đúng, hãy quay lại và thử sửa đổi nó. + +373 +00:17:46,980 --> 00:17:49,530 +Xem liệu bạn có thể thêm một số điều kiện khác hoặc + +374 +00:17:49,530 --> 00:17:52,427 +xem liệu bạn có thể làm cho thông báo Game Over thú vị hơn + +375 +00:17:52,427 --> 00:17:55,200 +một chút so với những gì tôi đã viết hay không. + +376 +00:17:55,200 --> 00:17:58,830 +Hãy xem liệu bạn có thể sửa đổi và biến nó thành của riêng mình không. + +377 +00:17:58,830 --> 00:17:59,910 +Vui vẻ với điều đó. + +378 +00:17:59,910 --> 00:18:01,440 +Và trong bài học tiếp theo, + +379 +00:18:01,440 --> 00:18:03,900 +tôi sẽ có nhiều điều thú vị hơn dành cho bạn. + +380 +00:18:03,900 --> 00:18:06,840 +Vậy hy vọng các bạn đã sắp xếp được chút thời gian cho + +381 +00:18:06,840 --> 00:18:09,630 +ngày mai để hoàn thành bài học ngày hôm sau. + +382 +00:18:09,630 --> 00:18:11,643 +Nhưng bây giờ thì chúc tôi ngủ ngon. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Solution-Treasure-Island-Ending-Code.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Solution-Treasure-Island-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..32d40d6493b112e5f5eb869f1d0481215d7eece5 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Solution-Treasure-Island-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/treasure-island-end \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Flowchart-pdf.pdf b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Flowchart-pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dab42f0dc2b485d76070b45a3fc19b3ed0799d81 Binary files /dev/null and b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Flowchart-pdf.pdf differ diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Flowchart-website-.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Flowchart-website-.url new file mode 100644 index 0000000000000000000000000000000000000000..0c528731e1ba79cba7a5cd1d7a83b877734214d9 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Flowchart-website-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://viewer.diagrams.net/index.html?highlight=0000ff&edit=_blank&layers=1&nav=1&title=Treasure%20Island%20Conditional.drawio#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1oDe4ehjWZipYRsVfeAx2HyB7LCQ8_Fvi%26export%3Ddownload \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Starting-Code-replit.com-.url b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Starting-Code-replit.com-.url new file mode 100644 index 0000000000000000000000000000000000000000..1b7b870ea3857670df3826d89030c5ea730472cd --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/012 Treasure-Island-Starting-Code-replit.com-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/treasure-island-start?v=1 \ No newline at end of file diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/013 Share and Show off your Project!.mp4 b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/013 Share and Show off your Project!.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b03704185b39673396dfda57020f51f11027d8f0 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/013 Share and Show off your Project!.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43b52f8a1e4d0573c413ebf160da9c22e14a3b5c6472d79acdd30deb2f31e4c7 +size 17613230 diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/013 Share and Show off your Project!_vi.srt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/013 Share and Show off your Project!_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8ebade8dd534e8690e8feda89ba0562f7566927d --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/013 Share and Show off your Project!_vi.srt @@ -0,0 +1,40 @@ +1 +00:00:01,160 --> 00:00:05,000 +Này, tôi hy vọng bạn đã vui vẻ khi xây dựng dự án Đảo kho báu. + +2 +00:00:05,450 --> 00:00:10,190 +Bây giờ hãy nhớ rằng điều quan trọng nhất khi nói đến lập trình và học + +3 +00:00:10,190 --> 00:00:13,970 +kỹ năng mới này là thực sự tạo mã của riêng bạn. + +4 +00:00:14,510 --> 00:00:17,690 +Vì vậy, với dự án này, bầu trời thực sự là giới hạn. + +5 +00:00:17,810 --> 00:00:22,250 +Bạn có thể mang theo sự sáng tạo của mình và chạy theo nó. Làm cho câu chuyện, của riêng + +6 +00:00:22,250 --> 00:00:26,810 +bạn, thay đổi nó, thay đổi trò chơi. Biến nó thành thứ mà bạn tưởng tượng. + +7 +00:00:27,350 --> 00:00:30,710 +Và tôi nóng lòng muốn chơi trò chơi của bạn. + +8 +00:00:30,740 --> 00:00:33,860 +Vì vậy, khi bạn đã tạo phiên bản của riêng mình, hãy nhớ chia sẻ + +9 +00:00:34,130 --> 00:00:38,540 +nó trong phần bình luận bên dưới để tất cả chúng ta có thể chơi nó và tất cả chúng ta + +10 +00:00:38,540 --> 00:00:43,220 +có thể ngưỡng mộ công việc khó khăn của bạn. Vì vậy, hãy thử đi và tôi sẽ gặp bạn vào ngày mai. + diff --git a/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/external-links.txt b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d7f181f7ca33f9d1e4f1f7617f343b008b465ab8 --- /dev/null +++ b/part1/03 - Day 3 - Beginner - Control Flow and Logical Operators/external-links.txt @@ -0,0 +1,72 @@ + +001 Day-3-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/treasure-island-end?v=1 + +003 Ticketing-Flow-Chart-Version-1-if-else-statements +https://www.draw.io/?lightbox=1&target=blank&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%201#R1VfbcpswEP0apk%2FJAAJfHmM7aR%2FSjlt3ps2jYm1ArUCukC%2Fk67sywqDgJM7Eub0w6Ggl7Z49uwKPjLPNZ0UX6VfJQHihzzYemXhhOIhCfBqgrICIkApIFGcVFDTAjN%2BCBX2LLjmDwjHUUgrNFy44l3kOc%2B1gVCm5ds1upHBPXdAEOsBsTkUX%2FcWZTm1YYb%2FBvwBP0vrkoDesZjJaG9tIipQyuW5B5NwjYyWlrt6yzRiE4a7mpVp3cc%2FszjEFuT5kwTQf3Pz8rmYwjVc%2FVmxzyf%2FJExtGocs6YGAYvx1KpVOZyJyK8wYdKbnMGZhdfRw1NpdSLhAMEPwDWpc2mXSpJUKpzoSdRYdV%2BdusP%2B2RsAauEDjxT%2F1%2BXCOTjT2jGpXt0RQUz0CDsmAVh3H%2BXnosVMilmsMDnNQyoyoB%2FYBdvEsiih8keqNKXKdAUM1Xrh%2FUyjDZ2dmlZ0rRsmWwkDzXRWvnqQHQwBYUIbagbD0FcdzOOr5UO9ajlmsNtFXGE1QyfGOVREHUVon%2FQQQSHUMgHQUEkSuAoe%2FuULllFzXKeKrQer3X15nlYkXF0rJje6tpbT2aoXBGid4m0w%2Bw52ceuehIU6Uyu15ilKN1yjXMFnSbzDVeT67A7GGgNGwe1kQ3h%2FWCoO%2ByVF9b6%2BauCHoWS1v3xN2ktdPe4vjpFJK3KNUj1lZ4YG3dk5eDa%2BtZJIcdnc7QYd2V4o7Y4HE53nAhxlJItV1LWAwDZtpeoZX8C62ZQXhNsDqPI2DiCjjco99wj36jl9Jv1KF2TPNPpgPg5yE8j%2BEj8EV8l6499T7ovyJd8T663gtZYb%2F%2Fvtiqz2%2FR9U12aMKAtcsFFTzJ8X2OgZsPipGhheNPwpmdyDhjVSuFgt%2FS6%2B1WppnaWxb3jUdePDF7YfcsqkZ6JJoHd%2B4gMuywTPaUcPhiLHev8SsoPjzN%2BC%2F7KM%2FRcXjGYfNfWH1cNT%2FX5Pw%2F + +003 Fork-the-Day-3-Starting-Repl +https://repl.it/@appbrewery/day-3-start + +004 Exercise-8 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/f50f12c1-f7ab-46c3-8cb9-c2a8cb67574d + +004 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +005 Ticketing-Flow-Chart-Version-2-nested-if-else-statements +https://www.draw.io/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%202#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1J7_rw1flGeF0hmc_zrMzPX7t6xkbcsiX%26export%3Ddownload + +005 Ticketing-Flow-Chart-Version-3-if-elif-else-statements +https://www.draw.io/?lightbox=1&target=blank&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%202#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1XaUDMIKOxCUzJbsuZevgHZmgKr7rICbI%26export%3Ddownload + +006 Exercise-9 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/7a12b4b1-76d3-4d04-820d-938547daba55 + +006 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Exercise-10 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/3aa8ecef-1215-4988-8e52-a3c59e931231 + +007 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +008 Ticketing-Flow-Chart-Version-4-Multiple-if-statements +https://www.draw.io/?lightbox=1&target=blank&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Rollercoaster%204#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1aoRTeFOb2SJO7ofMnhTCneCEboHowF2A%26export%3Ddownload + +008 Multiple-if-statements-Ending-Code +https://repl.it/@appbrewery/day-3-multiple-if + +009 Exercise-11 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/f03cade4-f4f4-426c-84d8-eb26e34948fa + +009 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +010 Day-3-Ending-Code +https://repl.it/@appbrewery/day-3-end#main.py + +010 Ticketing-Flow-Chart-Version-5-with-Midlife-Crisis +https://viewer.diagrams.net/?highlight=0000ff&edit=_blank&layers=1&nav=1&title=Day%203%20Logical%20Operators.drawio#R7VtZc9o6FP41zH2iY0teH0uWZpqkQy%2BZ29CXOwYrthNjUVkQyK%2BvjGWwLbEFL6HTzCSxjyVhfec7myQ68GKy%2BEKcqX%2BPXRR2gOIuOvCyA4CqAYP9SyTLVGJqXOCRwOWNNoJB8Ia4UOHSWeCiuNCQYhzSYFoUjnEUoTEtyBxC8Gux2RMOi586dTwkCAZjJxSlPwKX%2BqnUAuZGfoMCz88%2BWTXs9MnEyRrzmcS%2B4%2BLXnAhedeAFwZimV5PFBQoT8DJc0n7XW56uX4ygiB7SoR9ZTw%2FfyQD19fm%2Fc3dxF%2FzCXT6NmC6zCSOXzZ%2FfYkJ97OHICa820h7Bs8hFyagKu9u0ucN4yoQqEz4jSpdcmc6MYiby6STkT9kLk%2BVj0v%2BTAUEmGDJBV%2FmkmHomuVzwz0jvlvm7PiLBBFFEuFBEgwMU4xkZox0QZKxyiIfojnZ62i7BJ%2FcBHOsvCLO3IUvWgKDQocG8yB%2BH09Bbt%2BNdPxPiLHMNpjiIaJwbuZ8IWANuUZABthqR25Oq63mts4t0xOwu92ob0YoZR7DEbpklmqrlWaJ8TIJotRBEYICqFQlgK8UR0vfknTbMOJZohtE8zzgWcyeccXS4b01cm%2BFMGHF6Hl0pU1GZz5904LVATeLjyWjGZtl79QOKBlNnpd1XFp%2BKBNvKiDkiFC126jB7qppFlLKw9bqJFarBZX4uTpSVlld7DuPjIYRtmOr7bQscaFtq1bZ1EshA4OmAzYCKVFwDq%2B6n41MQhhc4xGTVF7o6stzE7cWU4BeUe2KBEWTWWQ2BYZHAQMJfIOGvVhd%2FNQHaCyf6J%2FEALD1EpyFcAV5QKcIlsXfLrAeuy682%2BL%2F%2FzaXPLvk%2BvOl71zdexsRzMXddNHfptD6WuesyTn4URgKzZMENUlLuqhUBrm9YgInNjhaxcMLAi9j1mGGRZG29BIOAVWKf%2BYNJ4LopgVEcvDmj1VAJhXkqw8bVex39MhmLcTZO6VsRzFYp0ENbQBlK%2FCSoDWUxVxqi%2BOxhBpa2F2etJpylnkiMR2143FwttK6OD6mEDvLUuzzwXk9tVO2p5dUIUJKZ55kBgV4cZEvd847aRA6I8lfx%2BXZWWyFa%2FtZ%2FzbLQzm4tgVKGP3%2B8PfT6PwfImj8%2BPAS9STtZKloE9DF3Pdzoid1tNJPcFFaO2laoFMLWMuJdb52LiskyepsrMcASAoQiSYQlqYNeW23Wsk9qhsD1JADHrlaqsKh8zSpthpTzCRvual9c3tzbWy8XUzXnIoYkKWUq1HTRBBuuRu3i%2Bgi0RBu0a1pOkiJlCkjdoThOHK6%2FKuElecO5lUxqGfMD%2FV5tJRNoJVN%2BvwerPJPdsnMHyhFKL6ugZrdhbXEb4iZw84tYejl6t%2B051vRpJ3qrzUTvyuuEd0VvXTkuekPNOiF6l3s3Hb3tLWYoiUVN26FmfLD4LVnmVEFXtc4%2BakNV8Hi6iLXeZNxWoYg1A1rBJPnDpnb%2BoB%2BQKpmNpkqyTH6rD1D2%2BwBhs9gYW2j0VNpejnCUqMB1Yn%2FtXCqAVzeL8AKJ91Bl%2BK6PSJwCsH3%2F%2BGI8erfgFvwKlvfPN8v%2BfVekdBtR%2FaD4vGvZJ7885M%2FnXfx0iYKv9n%2Bz5a06uDNesnnWncPqalHDh2awRx8%2BsuSZcmWnj3ZgLcRlsZxpOiwbWnthWQqVaFafPYYHUJIlCKXLfnVxLeLcooVuvm9BsYpoITXyViqSg3zXLp%2B013dVfrD2JJBbCRDZXkW2IXHkXgWofrPiJI2aH0qjorN6dSJ%2BpjRMPNKIZbbG6lzp1MfMi5x0qlTIwJTVjzwDq8BLlQ%2FqrkNyPulSbNFNWXW5Ka1VC1pbzTD3pIXdvl2u7swMSDz%2FliZG4lnjoxKjpi0FlnZtDNlhbaWmNEoKrFj9%2FQlnuMo4r9fXGjjDtcuacjA%2F%2BCgxQ0ydpPMoSMeIVzFBW5wXrVmeWoDblKSpKrCz1aZGiC3uNPwBR0ABLEVaCa8rOgPKbjdfDEzr283XK%2BHVbw%3D%3D + +011 Exercise-12 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/6bd4bb59-cd10-4657-b677-a79a6f03f44b + +011 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +012 Add-your-own-ASCII-art +https://ascii.co.uk/art + +012 Solution-Treasure-Island-Ending-Code +https://repl.it/@appbrewery/treasure-island-end + +012 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +012 Treasure-Island-Flowchart-website- +https://viewer.diagrams.net/index.html?highlight=0000ff&edit=_blank&layers=1&nav=1&title=Treasure%20Island%20Conditional.drawio#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1oDe4ehjWZipYRsVfeAx2HyB7LCQ8_Fvi%26export%3Ddownload + +012 Treasure-Island-Starting-Code-replit.com- +https://replit.com/@appbrewery/treasure-island-start?v=1 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day 4 Goals what we will make by the end of the day.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day 4 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0f4595f312bec1fd7f7f4f29796816743ec2090d --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day 4 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6628947c086a8cf58ab2282f43300e23d0f81d9db8f4bc9a00b0fefb17881cac +size 2812762 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day 4 Goals what we will make by the end of the day_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day 4 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0d3431f9bb89fcb43e803c325c9af14b372d95d8 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day 4 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,96 @@ +1 +00:00:00,520 --> 00:00:03,610 +Xin chào các bạn, chào mừng bạn trở lại với 100 Ngày viết mã. + +2 +00:00:03,910 --> 00:00:05,650 +Hôm nay là ngày thứ + +3 +00:00:05,860 --> 00:00:10,060 +4 và chúng ta sẽ tập trung vào ngẫu nhiên hóa trong Python và chúng + +4 +00:00:10,420 --> 00:00:12,850 +ta sẽ tìm hiểu về danh sách Python. + +5 +00:00:13,270 --> 00:00:17,590 +Bây giờ ngẫu nhiên hóa trong bất kỳ loại ngôn ngữ lập trình nào thực sự, thực sự hữu + +6 +00:00:17,590 --> 00:00:20,770 +ích bởi vì nếu chúng ta muốn tạo một trò chơi, nếu + +7 +00:00:20,770 --> 00:00:24,040 +chúng ta muốn một chương trình làm điều gì đó khác biệt mỗi lần, + +8 +00:00:24,400 --> 00:00:27,730 +thì chúng ta cần giới thiệu một chút về tính ngẫu nhiên, phải không? + +9 +00:00:28,120 --> 00:00:32,380 +Vì vậy, chúng tôi sẽ xem xét việc sử dụng mô-đun ngẫu nhiên để + +10 +00:00:32,380 --> 00:00:35,050 +đạt được điều này. Và đến cuối ngày + +11 +00:00:35,080 --> 00:00:39,640 +hôm nay, bạn sẽ học đủ để có thể xây dựng trò chơi Oẳn tù tì này. + +12 +00:00:40,150 --> 00:00:45,150 +Vì vậy, nó bắt đầu yêu cầu bạn, người dùng, gõ 0 cho đá, 1 cho + +13 +00:00:45,970 --> 00:00:49,450 +giấy hoặc 2 cho kéo. Vì vậy, tôi sẽ tiếp tục với 0 cho nhạc rock. + +14 +00:00:50,080 --> 00:00:54,160 +Và nó cho tôi thấy bằng nghệ thuật ASCII rằng đây là những gì tôi đã chọn, rock. + +15 +00:00:54,610 --> 00:00:59,500 +Và sau đó máy tính đã chọn kéo và đá đập kéo. Vì vậy, tôi chiến thắng. + +16 +00:01:00,010 --> 00:01:02,230 +Bây giờ bạn có thể chạy nó bao nhiêu lần tùy thích. + +17 +00:01:02,620 --> 00:01:06,460 +Nếu tôi chọn giấy và máy tính chọn đá, thì tôi thắng. + +18 +00:01:06,760 --> 00:01:10,390 +Nếu tôi chọn giấy và máy tính chọn giấy hơn là kết quả hòa. + +19 +00:01:10,960 --> 00:01:15,160 +Nhưng nếu tôi chọn giấy và máy tính chọn kéo, thì tôi thua. + +20 +00:01:15,610 --> 00:01:17,140 +Vì vậy, đây là một trò chơi khá + +21 +00:01:17,590 --> 00:01:20,710 +đơn giản, nhưng chúng tôi sẽ lấy máy tính để chơi trò chơi này với chúng tôi. + +22 +00:01:20,890 --> 00:01:25,840 +Và chúng tôi sẽ làm điều đó bằng cách tìm hiểu về ngẫu nhiên hóa, danh sách và hơn + +23 +00:01:25,840 --> 00:01:27,190 +thế nữa. Tôi hy vọng bạn đã sẵn sàng. + +24 +00:01:27,520 --> 00:01:31,600 +Và khi bạn đã hiểu, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day-4-Goal-Click-Run-to-see-the-final-project.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day-4-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..7ca5c8b7485199bd6c6e8d936f018ec792055c2a --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/001 Day-4-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/rock-paper-scissors-end?v=1 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 AskPythons-Documentation-on-Random.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 AskPythons-Documentation-on-Random.url new file mode 100644 index 0000000000000000000000000000000000000000..2ca6d9c7bb812d641dc84aab9f415089cb8d38b7 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 AskPythons-Documentation-on-Random.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.askpython.com/python-modules/python-random-module-generate-random-numbers-sequences \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 For-the-Curious-Random-vs-Pseudorandom-Numbers.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 For-the-Curious-Random-vs-Pseudorandom-Numbers.url new file mode 100644 index 0000000000000000000000000000000000000000..104f651143020f3402bc4f0559b59c7449fe4a81 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 For-the-Curious-Random-vs-Pseudorandom-Numbers.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.khanacademy.org/computing/computer-science/cryptography/crypt/v/random-vs-pseudorandom-number-generators \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 For-the-Curious-The-Mersenne-Twister.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 For-the-Curious-The-Mersenne-Twister.url new file mode 100644 index 0000000000000000000000000000000000000000..175cd122bfeca5e3a8c918e7e0fa3b5c698ee86b --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 For-the-Curious-The-Mersenne-Twister.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/Mersenne_Twister \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Fork-the-Day-4-Starting-Repl.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Fork-the-Day-4-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..bc16385c379918e8019cba4969f34d3c25670600 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Fork-the-Day-4-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-4-start \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Random Module.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Random Module.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..86a97120114f47c46289d5d831ca64dd9f2237de --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Random Module.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d38ee23d9e476f2c04e21fa4c6b314c1b185289d22dc1fa5cb7537c1c9305a9d +size 52026322 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Random Module_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Random Module_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..49790d80fca7b58ff6ad8746fba5f703bba77a0c --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/002 Random Module_vi.srt @@ -0,0 +1,792 @@ +1 +00:00:00,250 --> 00:00:03,910 +Một trong những điều đầu tiên tôi muốn nói đến là sự ngẫu nhiên. + +2 +00:00:04,390 --> 00:00:07,930 +Và đây là một khái niệm mà chúng ta đã quá quen thuộc. + +3 +00:00:08,530 --> 00:00:10,690 +Ngẫu nhiên hóa thực sự rất + +4 +00:00:10,690 --> 00:00:14,890 +quan trọng khi chúng ta muốn tạo ra các chương trình máy tính có + +5 +00:00:14,950 --> 00:00:19,540 +mức độ không thể đoán trước được. Bây giờ, danh mục lớn nhất trong số đó, tất nhiên, là trò chơi phải không? + +6 +00:00:19,840 --> 00:00:23,440 +Bạn có thể tưởng tượng nếu bạn phải chơi Tetris và mỗi lần, khối + +7 +00:00:23,440 --> 00:00:25,780 +rơi xuống giống như có thể đoán trước được. + +8 +00:00:26,020 --> 00:00:30,430 +Bạn luôn biết rằng nó sẽ là một chữ T và sau đó nó sẽ là một chữ L, sẽ + +9 +00:00:30,460 --> 00:00:32,439 +chẳng có gì thú vị khi phải không? + +10 +00:00:32,770 --> 00:00:37,770 +Vậy làm cách nào để chúng ta tạo ra sự ngẫu nhiên này cho các chương trình của mình? Bây giờ trong tự nhiên và trong cuộc sống + +11 +00:00:38,950 --> 00:00:42,460 +hàng ngày của chúng ta, thật dễ dàng để tạo ra sự ngẫu nhiên. + +12 +00:00:42,760 --> 00:00:46,480 +Nếu bạn vẩy một ít sơn lên canvas, điều đó sẽ khá ngẫu nhiên. + +13 +00:00:46,600 --> 00:00:51,340 +Nếu bạn nhìn vào TV tĩnh từ TV analog, đó cũng là một + +14 +00:00:51,610 --> 00:00:53,890 +loạt các ngẫu nhiên ở đó. + +15 +00:00:54,370 --> 00:00:56,440 +Nhưng khi chúng ta đang nói về + +16 +00:00:56,740 --> 00:01:00,670 +máy tính, thì những cỗ máy này là thứ mà chúng ta gọi là xác định. + +17 +00:01:00,910 --> 00:01:05,910 +Họ sẽ thực hiện các hành động có thể lặp lại theo cách hoàn toàn có thể dự đoán được. + +18 +00:01:06,400 --> 00:01:11,400 +Vì vậy, làm thế nào để chúng ta kết hợp những cỗ máy hoạt động cơ bản trên những số một và số không để khiến + +19 +00:01:11,920 --> 00:01:15,280 +chúng tạo ra một số số ngẫu nhiên? Chà, có rất nhiều phép + +20 +00:01:15,280 --> 00:01:19,150 +toán có thể được áp dụng để tạo ra cái được gọi + +21 +00:01:19,180 --> 00:01:21,490 +là bộ tạo số giả ngẫu nhiên. + +22 +00:01:21,910 --> 00:01:25,420 +Và thứ mà Python sử dụng là thứ được gọi là Mersenne Twister. + +23 +00:01:25,900 --> 00:01:28,180 +Và nếu bạn thực sự muốn + +24 +00:01:28,210 --> 00:01:32,020 +đọc về nó, thì bạn có thể xem trên Wikipedia và + +25 +00:01:32,020 --> 00:01:36,310 +xem chi tiết thuật toán. Nhưng thành thật mà nói, nó hơi quá nhiều + +26 +00:01:36,670 --> 00:01:41,050 +thông tin đối với bất kỳ ai, trừ khi bạn thực sự quan tâm đến những loại máy phát số này. + +27 +00:01:41,560 --> 00:01:43,000 +Nhưng những gì tôi khuyên + +28 +00:01:43,000 --> 00:01:47,980 +bạn nên mặc dù, là một video miễn phí từ Học viện Khan, nơi họ giải thích các bộ + +29 +00:01:47,980 --> 00:01:50,950 +tạo số giả và nó thực sự được sản xuất tốt. + +30 +00:01:50,980 --> 00:01:55,980 +Và nó cho bạn biết rất nhiều khía cạnh khác nhau của quá trình tạo số giả ngẫu nhiên. + +31 +00:01:57,010 --> 00:01:57,790 +Hãy + +32 +00:01:57,790 --> 00:02:02,020 +xem qua nếu bạn muốn tìm hiểu thêm một chút về trình + +33 +00:02:02,020 --> 00:02:05,650 +tạo số giả ngẫu nhiên. Chúng ta đã nói rất nhiều về sự ngẫu + +34 +00:02:05,710 --> 00:02:07,180 +nhiên, nhưng hãy xem nó thực tế. + +35 +00:02:07,210 --> 00:02:11,980 +Hãy viết một số mã và tạo ra một số số ngẫu nhiên. Đi đến Ngày thứ 4 bắt đầu Repl + +36 +00:02:11,980 --> 00:02:15,340 +và sau đó tiếp tục và phân nhánh bản sao của riêng bạn. + +37 +00:02:15,760 --> 00:02:18,970 +Chúng tôi biết rằng chúng tôi muốn nắm giữ một số con số + +38 +00:02:19,300 --> 00:02:23,950 +ngẫu nhiên, nhưng chúng tôi không thực sự muốn tự mình triển khai Mersenne Twister vì nó phức + +39 +00:02:24,220 --> 00:02:28,480 +tạp khủng khiếp khi sử dụng rất nhiều và nhiều phép toán và có lẽ chúng + +40 +00:02:28,480 --> 00:02:33,250 +tôi sẽ mất hàng tháng để viết mã. Vì vậy, làm thế nào chúng ta có thể nhận được số ngẫu nhiên? + +41 +00:02:33,880 --> 00:02:37,870 +Nếu bạn nghĩ về nó, nó giống như tìm kiếm một cái gì đó trên Google. + +42 +00:02:38,530 --> 00:02:43,530 +Thuật toán của Google phức tạp khủng khiếp và họ phải mất hàng năm trời để tinh chỉnh + +43 +00:02:43,660 --> 00:02:48,370 +và hoàn thiện đến mức tôi nghĩ rằng Google hiểu tôi hơn chính bản thân tôi vì + +44 +00:02:48,370 --> 00:02:50,980 +khi tôi tìm kiếm thứ gì đó, nó luôn + +45 +00:02:50,980 --> 00:02:53,410 +cho tôi những kết quả phù hợp nhất. + +46 +00:02:53,920 --> 00:02:57,760 +Và nếu bạn đang thắc mắc về độ phức tạp của thuật toán + +47 +00:02:58,090 --> 00:03:02,980 +Google, chỉ cần truy cập Bing và thử tìm kiếm thứ gì đó và xem kết quả có + +48 +00:03:02,980 --> 00:03:06,100 +liên quan như thế nào. Vì vậy, họ có một thuật toán siêu + +49 +00:03:06,130 --> 00:03:09,340 +phức tạp, mà chúng ta sẽ không bao giờ có cơ hội nhìn thấy chứ đừng nói là hiểu. + +50 +00:03:09,850 --> 00:03:14,850 +Tuy nhiên, hàng ngày chúng ta có thể tìm kiếm mọi thứ trên Google và sử dụng thuật toán này + +51 +00:03:15,100 --> 00:03:17,680 +của Google để có được những thứ chúng ta + +52 +00:03:18,010 --> 00:03:21,640 +muốn, chẳng hạn như vận tốc không khí của một con chim én chất đầy. + +53 +00:03:22,240 --> 00:03:26,920 +Bây giờ chúng ta có thể làm điều tương tự khi chúng ta muốn tạo ra các số ngẫu nhiên. Bởi vì đây là + +54 +00:03:26,920 --> 00:03:29,410 +chức năng thường xuyên cần thiết, + +55 +00:03:29,710 --> 00:03:33,190 +nhóm Python đã tạo một mô-đun ngẫu nhiên. + +56 +00:03:33,700 --> 00:03:38,700 +Vì vậy, nếu bạn đi đến askpython. com và tìm kiếm mô-đun ngẫu nhiên Python, sau + +57 +00:03:39,100 --> 00:03:42,700 +đó bạn sẽ có thể xem tài liệu cho mô-đun ngẫu nhiên này. + +58 +00:03:43,180 --> 00:03:46,750 +Và bạn có thể thấy rằng nó chứa một loạt các hàm mà bạn có + +59 +00:03:47,170 --> 00:03:50,110 +thể sử dụng cho phép bạn tạo các số nguyên ngẫu + +60 +00:03:50,110 --> 00:03:53,650 +nhiên, vì vậy các số nguyên ngẫu nhiên hoặc số dấu phẩy động ngẫu nhiên. + +61 +00:03:54,040 --> 00:03:59,040 +Vì vậy, hãy xem làm thế nào chúng ta có thể khai thác vào mô-đun ngẫu nhiên này. Để khai thác vào mô-đun ngẫu + +62 +00:03:59,260 --> 00:04:02,410 +nhiên, trước tiên chúng ta phải nhập nó. + +63 +00:04:02,440 --> 00:04:07,440 +Vì vậy, chúng tôi viết nhập khẩu ngẫu nhiên. Và bây giờ chúng tôi có thể sử dụng mô-đun ngẫu nhiên này trong + +64 +00:04:10,000 --> 00:04:11,800 +chính của chúng tôi. mã py. + +65 +00:04:12,580 --> 00:04:17,470 +Chúng ta có thể bắt đầu sử dụng tài liệu để tạo một số nguyên ngẫu nhiên. Ví dụ: họ cho chúng ta thấy + +66 +00:04:17,709 --> 00:04:22,710 +trong đoạn mã ở đây rằng chúng ta có thể tạo một số nguyên ngẫu + +67 +00:04:23,320 --> 00:04:27,430 +nhiên bằng cách sử dụng hàm randint, cung cấp a và B. + +68 +00:04:27,850 --> 00:04:31,480 +Và nó sẽ trả về một số nguyên ngẫu nhiên giữa a và + +69 +00:04:31,630 --> 00:04:33,700 +b, bao gồm cả hai số đó. + +70 +00:04:34,150 --> 00:04:37,390 +Và thậm chí còn có một đoạn mã nhỏ để cho chúng ta thấy nó được thực hiện như thế nào. + +71 +00:04:37,720 --> 00:04:42,720 +Vì vậy, dòng mã này tạo ra một số nguyên ngẫu nhiên từ 100 đến 200 và + +72 +00:04:44,110 --> 00:04:48,310 +bao gồm cả hai số đó. Vì vậy, nó có thể là bất cứ điều gì giữa hai con số đó. + +73 +00:04:49,060 --> 00:04:51,340 +Vì vậy, hãy xem liệu chúng ta có thể triển khai điều này trong mã của chúng ta hay không. + +74 +00:04:51,820 --> 00:04:56,820 +Giả sử rằng chúng tôi muốn tạo một số nguyên ngẫu nhiên và chúng tôi sử dụng cùng một mã mà chúng tôi + +75 +00:04:56,950 --> 00:04:59,650 +đã thấy trong đoạn mã mà chúng tôi nói là ngẫu nhiên, + +76 +00:04:59,890 --> 00:05:04,600 +đó là khai thác vào mô-đun này tại đây ,. randint. + +77 +00:05:04,960 --> 00:05:09,960 +Và sau đó chúng ta ở một tập hợp các dấu ngoặc và sau đó chúng ta chỉ định phần bắt đầu và sau đó + +78 +00:05:10,360 --> 00:05:11,350 +là phần kết thúc. + +79 +00:05:11,830 --> 00:05:16,830 +Vì vậy, về cơ bản đây là một dải số mà chúng tôi đang chỉ định, bất kỳ số + +80 +00:05:16,960 --> 00:05:18,670 +nguyên nào từ 1 đến 10. + +81 +00:05:19,480 --> 00:05:24,480 +Và bây giờ chúng ta có thể tiếp tục và in số nguyên ngẫu nhiên của mình, giống như vậy. + +82 +00:05:26,050 --> 00:05:28,060 +Và mỗi khi tôi chạy nó, bạn sẽ + +83 +00:05:28,330 --> 00:05:32,050 +nhận thấy rằng tôi sẽ nhận được một số khác hoặc đôi khi giống nhau, nhưng + +84 +00:05:32,140 --> 00:05:35,650 +đó là một số ngẫu nhiên giữa phạm vi mà tôi đã chỉ định. + +85 +00:05:37,000 --> 00:05:41,890 +Bây giờ tôi đã đề cập rằng mô-đun ngẫu nhiên là một mô-đun Python. + +86 +00:05:41,980 --> 00:05:44,860 +Vì vậy, chính xác một mô-đun là gì? Chà, bạn đã thấy rằng + +87 +00:05:44,890 --> 00:05:49,480 +chúng ta chủ yếu viết mã của mình trên cùng một trang theo một kiểu + +88 +00:05:49,480 --> 00:05:50,920 +tập lệnh, phải không? + +89 +00:05:50,920 --> 00:05:53,980 +Và mọi thứ đều được thực thi từ trên xuống dưới. + +90 +00:05:54,460 --> 00:05:58,490 +Nhưng đôi khi mã của bạn sẽ dài quá vì bạn đang cố tạo + +91 +00:05:58,490 --> 00:06:03,490 +ra một thứ gì đó phức tạp và bạn không thể hiểu được điều gì đang xảy ra + +92 +00:06:03,620 --> 00:06:06,140 +trong một đoạn mã lớn như vậy nữa. + +93 +00:06:06,650 --> 00:06:11,650 +Những gì mọi người sẽ làm trong trường hợp đó là chia mã thành các mô-đun + +94 +00:06:13,190 --> 00:06:18,190 +riêng lẻ trong đó mỗi mô-đun chịu trách nhiệm về một chút chức năng khác + +95 +00:06:18,380 --> 00:06:22,430 +nhau của chương trình của bạn. Và nếu bạn có một dự án phức tạp với nhiều, + +96 +00:06:22,700 --> 00:06:25,520 +nhiều mô-đun, thì bạn có thể có sự cộng tác trong dự án của mình, phải không? + +97 +00:06:25,550 --> 00:06:29,630 +Rất nhiều người có thể làm việc trên nó, mỗi người làm một việc khác nhau. + +98 +00:06:29,990 --> 00:06:31,820 +Giả sử nếu một nhà máy đang chế tạo + +99 +00:06:32,150 --> 00:06:36,260 +một chiếc ô tô, thì việc một người chế tạo toàn bộ chiếc ô tô từ bánh xe, trục xe đến + +100 +00:06:36,260 --> 00:06:38,810 +khung gầm sẽ không hợp lý chút nào, điều đó thật điên rồ. + +101 +00:06:38,960 --> 00:06:43,220 +Thay vào đó, bạn có những người khác nhau làm việc trên các mô-đun khác + +102 +00:06:43,220 --> 00:06:47,000 +nhau như mô-đun lốp hoặc mô-đun khung gầm hoặc mô-đun động cơ. + +103 +00:06:47,420 --> 00:06:49,220 +Và sau đó khi họ kết hợp mọi + +104 +00:06:49,490 --> 00:06:53,990 +thứ lại với nhau, bạn sẽ có được chiếc xe cuối cùng hoặc trong trường hợp của chúng tôi, chương trình cuối cùng. + +105 +00:06:54,740 --> 00:06:59,570 +Vì vậy, chúng tôi biết rằng mô-đun ngẫu nhiên là một mô-đun mà nhóm Python đã tạo + +106 +00:06:59,570 --> 00:07:04,570 +ra để giúp chúng tôi tạo các số ngẫu nhiên dễ dàng hơn mà không cần phải đi + +107 +00:07:04,850 --> 00:07:09,850 +sâu vào sự phức tạp của tất cả các phép toán cần thiết để tạo ra các số + +108 +00:07:09,920 --> 00:07:10,753 +ngẫu nhiên. + +109 +00:07:10,970 --> 00:07:15,080 +Nhưng làm thế nào chúng ta có thể tạo các mô-đun của riêng mình và làm thế nào để các mô-đun hoạt động? + +110 +00:07:15,260 --> 00:07:19,430 +Nó thực sự rất đơn giản. Nếu bạn tiếp tục và nhấp vào biểu tượng tệp, + +111 +00:07:19,490 --> 00:07:23,120 +bạn có thể thấy, chúng tôi hiện chỉ có một tệp mà chúng tôi đang viết, đó + +112 +00:07:23,420 --> 00:07:25,100 +là tệp chính. py, + +113 +00:07:25,130 --> 00:07:29,150 +tệp Python. Và chính. py là điểm vào chương trình của chúng tôi. + +114 +00:07:29,300 --> 00:07:33,590 +Đây là tệp sẽ được thực thi khi chúng tôi chạy mã của mình. Bây giờ, nếu tôi tiếp tục + +115 +00:07:33,590 --> 00:07:37,100 +và nhấp vào biểu tượng này để thêm tệp mới, + +116 +00:07:37,490 --> 00:07:42,490 +giả sử tôi gọi nó là my_module. py và tôi tạo một tệp Python mới. + +117 +00:07:45,650 --> 00:07:50,270 +Và bên trong mô-đun của tôi, tôi có thể sẽ làm việc khác. + +118 +00:07:50,300 --> 00:07:53,270 +Giả sử tôi muốn vào cửa hàng, giá trị của PI. + +119 +00:07:55,850 --> 00:07:57,260 +Được chứ. Tôi nghĩ đó là tất cả những gì tôi nhớ. + +120 +00:07:57,680 --> 00:08:02,360 +Vì vậy, tôi biết giá trị của PI và tôi muốn có thể sử dụng nó trong các chương + +121 +00:08:02,360 --> 00:08:06,080 +trình khác nhau của mình. Bây giờ tôi đã tạo my_module. py, tốt, bây giờ tôi có thể + +122 +00:08:06,080 --> 00:08:11,080 +sử dụng mô-đun của mình ở bất cứ đâu tôi muốn chỉ bằng cách nhập nó. Vì vậy, tôi có + +123 +00:08:13,250 --> 00:08:17,480 +thể nhập my_module. Và bây giờ ở dưới đây, tôi + +124 +00:08:17,900 --> 00:08:22,900 +có thể nói, hãy tiếp tục và in my_module. số Pi. + +125 +00:08:24,440 --> 00:08:28,610 +Và bây giờ nếu tôi tiếp tục và nhận xét về mã này và nhấn chạy, + +126 +00:08:29,060 --> 00:08:29,810 +thì bạn + +127 +00:08:29,810 --> 00:08:34,809 +sẽ thấy, chúng tôi nhận được giá trị PI đó đã được kéo vào bởi vì tôi đã nhập mô-đun + +128 +00:08:35,780 --> 00:08:40,370 +của mình, nhưng bây giờ chúng tôi đã tách mã của chúng tôi thành riêng biệt mô-đun chịu + +129 +00:08:40,370 --> 00:08:42,110 +trách nhiệm cho những thứ khác nhau. + +130 +00:08:42,650 --> 00:08:46,460 +Và đó cũng là cách mô-đun ngẫu nhiên hoạt động. + +131 +00:08:46,880 --> 00:08:51,590 +Vì vậy, tôi sẽ tiếp tục và xóa tất cả những thứ này liên quan đến PI, nhưng bạn có thể + +132 +00:08:51,890 --> 00:08:55,500 +giữ lại của bạn nếu bạn muốn, nếu bạn muốn giữ nó để tham khảo. + +133 +00:08:57,390 --> 00:08:59,910 +Quay lại với việc tạo số ngẫu nhiên. + +134 +00:09:00,300 --> 00:09:03,840 +Chúng tôi đã thấy cách chúng tôi có thể tạo các số nguyên ngẫu nhiên, nhưng nếu tôi + +135 +00:09:04,080 --> 00:09:08,730 +muốn tạo một số dấu phẩy động ngẫu nhiên thì sao? Chà, nó cho tôi + +136 +00:09:08,730 --> 00:09:12,390 +biết cách thực hiện trong tài liệu AskPython. + +137 +00:09:12,780 --> 00:09:17,780 +Và tất cả những gì tôi phải làm là sử dụng mô-đun ngẫu nhiên có chứa hàm ngẫu + +138 +00:09:18,180 --> 00:09:23,180 +nhiên và nó sẽ trả về một số dấu phẩy động ngẫu nhiên từ 0 đến 1. + +139 +00:09:24,480 --> 00:09:29,130 +Nhưng điều quan trọng cần lưu ý là trong trường hợp này, nó không thực + +140 +00:09:29,130 --> 00:09:34,050 +sự bao gồm 1. Vì vậy, nó tăng lên như 0. 9999999, nhưng không bao gồm 1. + +141 +00:09:34,590 --> 00:09:36,150 +Hãy tiếp tục và thử điều đó. + +142 +00:09:36,510 --> 00:09:41,190 +Vì vậy, chúng tôi sẽ nói random_float = random. ngẫu nhiên và sau đó + +143 +00:09:41,250 --> 00:09:45,990 +tôi đặt các dấu ngoặc đơn. Và điều này sẽ cung cấp cho tôi + +144 +00:09:46,320 --> 00:09:50,040 +một số loại số trong khoảng từ 0 đến 1, nhưng không bao gồm 1. + +145 +00:09:50,910 --> 00:09:53,430 +Vì vậy, chúng ta hãy tiếp tục và xem nếu nó hoạt động. + +146 +00:09:56,820 --> 00:09:57,210 +Đầu + +147 +00:09:57,210 --> 00:10:01,650 +tiên, chúng tôi in một số nguyên ngẫu nhiên từ 1 đến 10 và sau đó chúng tôi + +148 +00:10:01,710 --> 00:10:06,210 +in số thực ngẫu nhiên giữa 0 và 1. Và mỗi khi chúng tôi chạy mã, bạn sẽ + +149 +00:10:06,240 --> 00:10:09,210 +nhận thấy rằng chúng tôi nhận được các số ngẫu nhiên khác nhau. + +150 +00:10:10,290 --> 00:10:11,610 +Bây giờ đây là một câu hỏi. + +151 +00:10:12,420 --> 00:10:17,420 +Hàm ngẫu nhiên này luôn tạo ra một số từ 0 đến 1 và nó có nhiều + +152 +00:10:18,210 --> 00:10:19,560 +chữ số thập phân. + +153 +00:10:20,160 --> 00:10:25,050 +Nhưng điều gì sẽ xảy ra nếu tôi muốn một số dấu phẩy động ngẫu nhiên từ 0 đến 5? + +154 +00:10:25,980 --> 00:10:28,620 +Làm thế nào chúng ta có thể làm điều đó? Bây giờ nó + +155 +00:10:28,680 --> 00:10:33,510 +không phức tạp như bạn nghĩ và bạn sẽ có thể làm điều đó chỉ bằng cách + +156 +00:10:33,510 --> 00:10:35,190 +xem mã bạn có ở đây. + +157 +00:10:35,880 --> 00:10:39,210 +Hãy suy nghĩ về nó và xem liệu bạn có thể đưa ra câu trả lời hay không. + +158 +00:10:39,330 --> 00:10:42,420 +Tôi sẽ trải qua nó với bạn sau. Tạm dừng video ngay bây giờ và tiếp tục. + +159 +00:10:44,430 --> 00:10:44,850 +Được rồi. + +160 +00:10:44,850 --> 00:10:49,850 +Vì vậy, chúng tôi biết rằng số thực ngẫu nhiên này có thể là bất kỳ thứ gì giữa + +161 +00:10:50,230 --> 00:10:51,300 +0. + +162 +00:10:51,370 --> 00:10:56,370 +000000 đến 0. 999999 ... , hiệu quả lặp lại phải không? Bây giờ điều gì + +163 +00:10:58,050 --> 00:11:03,050 +sẽ xảy ra nếu chúng ta có thể nhân số ngẫu nhiên này với một số? + +164 +00:11:05,970 --> 00:11:10,620 +Giả sử rằng tôi nhân random_float với 5. + +165 +00:11:11,310 --> 00:11:15,150 +Chà, điều gì sẽ xảy ra nếu random_float này không phải là 0. 1? + +166 +00:11:15,180 --> 00:11:19,050 +Chà, 0. 1 lần 5 sẽ là 0. 5. + +167 +00:11:20,070 --> 00:11:25,070 +Nhưng điều gì sẽ xảy ra nếu random_float là 0. 4? 0. 4 lần 5 sẽ là 2. + +168 +00:11:28,290 --> 00:11:30,090 +Hoặc nếu nó là 0 thì sao. 9? + +169 +00:11:30,120 --> 00:11:33,330 +0. 9 lần năm là 4. 5. + +170 +00:11:33,840 --> 00:11:38,840 +Vì vậy, hiệu quả bằng cách nhân random_float này với 5, tôi sẽ kết thúc với các + +171 +00:11:39,840 --> 00:11:42,540 +số ngẫu nhiên, nhưng tất nhiên bây giờ chúng + +172 +00:11:42,810 --> 00:11:46,920 +đang nổi, phải không? Vì vậy, nó có thể là 0. 000 ... tất cả các cách để 4. 999999 và + +173 +00:11:46,920 --> 00:11:50,940 +vân vân, vân vân. + +174 +00:11:51,360 --> 00:11:53,010 +Vì vậy, đây là cách chúng + +175 +00:11:53,410 --> 00:11:58,410 +ta có thể mở rộng phạm vi đó từ 0 đến 1 thành 0 đến 5, nhưng không bao gồm 5. + +176 +00:11:59,650 --> 00:12:02,050 +Vậy bạn có thể làm gì với các số ngẫu nhiên? Chà, nếu chúng ta nghĩ lại chiếc máy tính + +177 +00:12:03,130 --> 00:12:05,950 +tình yêu mà chúng ta + +178 +00:12:06,010 --> 00:12:10,870 +đã làm trong bài học trước, ừm, ý tôi là, loại dựa trên khoa học giả phải không? + +179 +00:12:11,380 --> 00:12:15,070 +Giống như chỉ vì bạn có một số chữ cái nhất định tồn + +180 +00:12:15,070 --> 00:12:20,050 +tại trong từ true và love, điều đó không có nghĩa là bạn thực sự sẽ hợp + +181 +00:12:20,050 --> 00:12:20,890 +nhau hơn. + +182 +00:12:20,890 --> 00:12:24,160 +Tôi xin lỗi vì đã làm tan nát trái tim của bất kỳ ai ngoài kia. Nhưng nếu đó là ngẫu nhiên, thì tại sao chúng ta không + +183 +00:12:24,950 --> 00:12:29,590 +sử dụng một bộ tạo số ngẫu + +184 +00:12:29,620 --> 00:12:34,270 +nhiên để cứu chính mình khỏi những rắc rối đó khỏi việc đếm Ts và đếm Us. + +185 +00:12:34,270 --> 00:12:37,510 +Thay vào đó, chúng ta có thể chỉ cần nói love_score = random. randint từ 1 + +186 +00:12:37,900 --> 00:12:42,900 +đến 100. Và sau đó tiếp tục và chỉ cần in "Điểm tình yêu của bạn là", và sau + +187 +00:12:47,830 --> 00:12:52,830 +đó chúng ta hãy chèn điểm tình yêu của chúng ta và biến nó thành Chuỗi. + +188 +00:12:56,620 --> 00:13:01,420 +Hãy in cái đó. Và bạn có thể thấy rằng chúng tôi nhận được một điểm tình yêu khác nhau + +189 +00:13:02,230 --> 00:13:06,310 +mỗi khi tôi chạy mã này. Nó nằm trong khoảng từ 1 đến một trăm và bạn + +190 +00:13:06,340 --> 00:13:10,540 +biết đấy, ai có thể biết rằng phương pháp này có gì + +191 +00:13:10,660 --> 00:13:12,400 +khác so với phương pháp trước đó, phải không? + +192 +00:13:12,520 --> 00:13:16,300 +Vì vậy, chúng tôi có thể sử dụng trình tạo số ngẫu nhiên của chúng tôi cho việc này. Chúng ta có thể sử dụng nó để tạo xúc xắc hoặc tung đồng xu hoặc chúng ta + +193 +00:13:16,660 --> 00:13:21,490 +có thể sử dụng nó trong các trò chơi mà chúng + +194 +00:13:21,520 --> 00:13:22,180 +ta tạo ra. + +195 +00:13:22,180 --> 00:13:27,180 +Nếu bạn chuyển sang bài học tiếp theo, tôi có một thử thách mã dành cho bạn, + +196 +00:13:28,540 --> 00:13:33,010 +nơi bạn sẽ xây dựng một chương trình để chọn từ các đầu hoặc + +197 +00:13:33,310 --> 00:13:37,990 +đuôi và giúp người dùng khi họ không có quyền truy cập vào đồng xu . Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp + +198 +00:13:37,990 --> 00:13:42,990 +bạn trong bài học tiếp theo. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 Exercise-13.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 Exercise-13.url new file mode 100644 index 0000000000000000000000000000000000000000..de9b3204fa9dfaa395b75128fe8045fea5259cfb --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 Exercise-13.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/23bb0d44-f578-4661-990b-6df00e5da175 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 How-to-join-Auditorium.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 [Interactive Coding Exercise] Heads or Tails.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 [Interactive Coding Exercise] Heads or Tails.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..770eb42303929cdc8f3bac5475d6e5596351e18b --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 [Interactive Coding Exercise] Heads or Tails.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9a4f43d3ae05fef622668a2c5a1acf18bf773784199946c2797b5140114f6a8 +size 4573219 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 [Interactive Coding Exercise] Heads or Tails_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 [Interactive Coding Exercise] Heads or Tails_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..385a34f6428a9a051231829b67a3c7d66d8f4f67 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/003 [Interactive Coding Exercise] Heads or Tails_vi.srt @@ -0,0 +1,132 @@ +1 +00:00:00,360 --> 00:00:01,380 +Trong bài tập này, + +2 +00:00:01,380 --> 00:00:04,410 +bạn sẽ tạo một chương trình tung đồng xu ảo và + +3 +00:00:04,410 --> 00:00:06,510 +nó sẽ ngẫu nhiên cho người dùng + +4 +00:00:06,510 --> 00:00:09,720 +biết họ nhận được "Ngửa" hay "Xuất". Điều quan trọng là chữ cái đầu tiên phải + +5 +00:00:09,720 --> 00:00:12,660 +được viết hoa và đánh vần chính xác + +6 +00:00:12,660 --> 00:00:14,880 +như trong ví dụ vì chúng tôi + +7 +00:00:14,880 --> 00:00:16,680 +sẽ kiểm tra nó. + +8 +00:00:16,680 --> 00:00:19,470 +Và có nhiều cách để bạn có thể làm điều + +9 +00:00:19,470 --> 00:00:22,080 +này, nhưng để thực hành tạo số ngẫu + +10 +00:00:22,080 --> 00:00:24,300 +nhiên, bạn sẽ tạo một số ngẫu + +11 +00:00:24,300 --> 00:00:27,330 +nhiên, 0 hoặc 1, sau đó sử dụng số đó để in + +12 +00:00:27,330 --> 00:00:29,370 +ra "Ngửa" hoặc "Đuôi" trong + +13 +00:00:29,370 --> 00:00:32,159 +đó 1 là Đầu và 0 là Đuôi. + +14 +00:00:32,159 --> 00:00:35,700 +Vì vậy, Đầu ra Ví dụ chỉ nên là Đầu hoặc + +15 +00:00:35,700 --> 00:00:38,040 +Đuôi và chỉ có vậy thôi. + +16 +00:00:38,040 --> 00:00:39,273 +Vì vậy, hãy thử điều này. + +17 +00:00:42,210 --> 00:00:44,490 +Vì vậy, bước đầu tiên để sử dụng mô-đun ngẫu + +18 +00:00:44,490 --> 00:00:47,220 +nhiên là thực sự nhập mô-đun ngẫu nhiên và chúng + +19 +00:00:47,220 --> 00:00:50,680 +tôi thực hiện điều đó trên dòng một, "nhập ngẫu nhiên". + +20 +00:00:51,660 --> 00:00:55,140 +Sau đó, chúng ta sử dụng một hàm bên trong mô-đun ngẫu nhiên + +21 +00:00:55,140 --> 00:00:59,010 +có tên randint(), hàm này tạo ra một số nguyên ngẫu nhiên, một số + +22 +00:00:59,010 --> 00:01:00,690 +nguyên ngẫu nhiên và chúng ta + +23 +00:01:00,690 --> 00:01:03,540 +có thể xác định số nguyên đó có thể là gì. + +24 +00:01:03,540 --> 00:01:06,600 +Và chúng ta làm điều đó bằng cách + +25 +00:01:06,600 --> 00:01:09,120 +viết 0, 1 nên 0 hoặc 1. + +26 +00:01:09,120 --> 00:01:12,450 +Và sau đó chúng tôi gán giá trị được tạo ra từ việc + +27 +00:01:12,450 --> 00:01:14,550 +tung đồng xu ngẫu nhiên này vào + +28 +00:01:14,550 --> 00:01:17,553 +một biến mà tôi gọi là Random_side. + +29 +00:01:18,720 --> 00:01:20,220 +Cuối cùng, vì chúng ta biết + +30 +00:01:20,220 --> 00:01:24,060 +rằng Random_side chỉ có thể là 0 hoặc 1 nên chúng ta thực hiện kiểm tra + +31 +00:01:24,060 --> 00:01:26,760 +có điều kiện để kiểm tra xem nó có phải là một hay không + +32 +00:01:26,760 --> 00:01:29,370 +thì chúng ta sẽ in ra "Heads" và nếu nó bằng 0 thì + +33 +00:01:29,370 --> 00:01:31,923 +chúng ta sẽ tiến hành để in ra "Đuôi". + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 List-Practice-Repl-US-States-Veg-.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 List-Practice-Repl-US-States-Veg-.url new file mode 100644 index 0000000000000000000000000000000000000000..93f5222ad16b3ae8fcba3390758ca0d116139330 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 List-Practice-Repl-US-States-Veg-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-4-list-practice \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Things-that-lists-can-do-in-Python.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Things-that-lists-can-do-in-Python.url new file mode 100644 index 0000000000000000000000000000000000000000..3aa7b25eb83ebb885e5a06b9f8eb879626a7b315 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Things-that-lists-can-do-in-Python.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/tutorial/datastructures.html \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Understanding the Offset and Appending Items to Lists.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Understanding the Offset and Appending Items to Lists.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0ba20c05a470c9ea8ad551719c4a305b08f358fa --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Understanding the Offset and Appending Items to Lists.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d8f425b1a30c9c2dd1340f5a86044229b6c0c08ebabebd07cef3fc31c6f2129 +size 114038397 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Understanding the Offset and Appending Items to Lists_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Understanding the Offset and Appending Items to Lists_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7d35e79929909b35b553c0bef36ff92abd518917 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/004 Understanding the Offset and Appending Items to Lists_vi.srt @@ -0,0 +1,792 @@ +1 +00:00:00,160 --> 00:00:04,480 +Này các cậu. Hôm nay tôi muốn nói về một thứ thực + +2 +00:00:04,510 --> 00:00:07,150 +sự, thực sự quan trọng và bạn sẽ sử dụng rất + +3 +00:00:07,570 --> 00:00:10,570 +nhiều lần trong tương lai, và đây là khái niệm về danh sách Python. + +4 +00:00:11,140 --> 00:00:15,520 +Và danh sách là những gì bạn sẽ gọi là cấu trúc dữ liệu. + +5 +00:00:15,880 --> 00:00:17,170 +Điều đó nghĩa là gì? Chà, + +6 +00:00:17,200 --> 00:00:21,910 +đó chỉ là một cách tổ chức và lưu trữ dữ liệu bằng Python. + +7 +00:00:22,540 --> 00:00:27,370 +Bây giờ chúng ta đã thấy các cách lưu trữ các phần dữ liệu đơn lẻ + +8 +00:00:27,760 --> 00:00:32,759 +và điều đó đã được thực hiện thông qua biến đơn giản mà chúng ta vừa nói + +9 +00:00:33,250 --> 00:00:35,680 +a = 3 hoặc b = hello. + +10 +00:00:35,920 --> 00:00:40,900 +Nhưng đó chỉ là lưu trữ một phần dữ liệu, phải không? Có thể là một số hoặc một chuỗi. + +11 +00:00:41,650 --> 00:00:45,370 +Nhưng đôi khi bạn có thể muốn lưu trữ các phần dữ liệu được nhóm lại, dữ + +12 +00:00:45,460 --> 00:00:49,690 +liệu có một số loại kết nối với nhau. Ví dụ, nếu bạn muốn lưu + +13 +00:00:49,750 --> 00:00:54,750 +trữ tất cả các tên của các Quốc gia ở Hoa Kỳ thì việc lưu + +14 +00:00:55,240 --> 00:00:59,710 +trữ chúng riêng lẻ sẽ không thực sự hợp lý vì chúng thuộc về + +15 +00:00:59,710 --> 00:01:02,140 +nhau, phải không? Họ có một mối quan hệ với nhau. + +16 +00:01:02,470 --> 00:01:06,970 +Vì vậy, sẽ rất tuyệt nếu bạn có một biến được gọi là States_in_the_US và + +17 +00:01:06,970 --> 00:01:10,990 +sau đó bạn có thể lưu trữ tất cả tên của các bang cùng + +18 +00:01:10,990 --> 00:01:13,900 +nhau trong một biến. Bây giờ, trong các trường hợp khác, + +19 +00:01:13,960 --> 00:01:18,790 +bạn cũng có thể muốn có thứ tự trong dữ liệu của mình. Vì vậy, ví dụ: nếu bạn đang + +20 +00:01:19,000 --> 00:01:22,930 +lưu trữ tất cả mọi người trong một hàng đợi ảo, thì + +21 +00:01:23,230 --> 00:01:27,370 +bạn muốn có thể giữ thứ tự mà họ tham gia vào hàng đợi. + +22 +00:01:27,760 --> 00:01:31,330 +Bạn không muốn người cuối cùng bằng cách nào đó bỏ qua hàng đợi vì bạn không + +23 +00:01:31,330 --> 00:01:33,100 +có cấu trúc dữ liệu tốt, phải không? + +24 +00:01:33,760 --> 00:01:38,760 +Đây là lý do tại sao chúng ta cần tìm hiểu về danh sách. Và danh sách trông khá đơn giản. + +25 +00:01:38,950 --> 00:01:43,480 +Nó chỉ là một tập hợp các dấu ngoặc vuông với nhiều vật dụng được cất giữ bên trong. + +26 +00:01:43,570 --> 00:01:47,820 +Và những mục đó có thể là bất kỳ kiểu dữ liệu nào. Chúng thậm chí có thể có các kiểu dữ liệu + +27 +00:01:47,820 --> 00:01:52,000 +hỗn hợp như bạn có thể lưu trữ các chuỗi cùng với các số hoặc một tập hợp các boolean. + +28 +00:01:52,330 --> 00:01:53,500 +Nó không thực sự quan trọng. + +29 +00:01:53,620 --> 00:01:58,620 +Nhưng điều quan trọng là cú pháp. Trong Python, danh sách luôn bắt đầu + +30 +00:01:59,980 --> 00:02:04,900 +bằng dấu ngoặc vuông mở như thế này và dấu ngoặc vuông đóng như thế này. + +31 +00:02:05,410 --> 00:02:09,009 +Và sau đó ở giữa bạn có các mục của bạn được phân tách bằng dấu phẩy. + +32 +00:02:09,280 --> 00:02:13,570 +Rất đơn giản. Để lưu trữ nó bên trong biến, sau đó nó + +33 +00:02:13,750 --> 00:02:15,730 +giống như cách chúng ta đã làm trước đây. + +34 +00:02:16,150 --> 00:02:19,360 +Sự khác biệt duy nhất là bên phải của dấu bằng. + +35 +00:02:19,780 --> 00:02:22,300 +Đây là cấu trúc dữ liệu danh sách. + +36 +00:02:23,170 --> 00:02:25,690 +Ví dụ, nếu chúng ta lưu trữ một loạt các loại + +37 +00:02:25,750 --> 00:02:28,240 +trái cây, nó có thể trông giống như sau: + +38 +00:02:28,240 --> 00:02:32,410 +Cherry, Apple, Pear, được phân tách bằng dấu phẩy bên trong một tập hợp các dấu ngoặc vuông. + +39 +00:02:32,920 --> 00:02:35,170 +Hãy xem điều này bằng cách sử dụng mã thực. + +40 +00:02:35,590 --> 00:02:40,300 +Bây giờ tôi sẽ tiếp tục và nhận xét mã từ bài học trước của chúng ta về tính ngẫu nhiên + +41 +00:02:40,330 --> 00:02:41,163 +và bạn có + +42 +00:02:41,500 --> 00:02:45,790 +thể làm tương tự nếu bạn muốn ghi chú lại mã trước đó và sử dụng nó như một + +43 +00:02:45,790 --> 00:02:49,870 +cuốn sách giáo khoa trực tiếp nơi bạn có thể nhận xét hoặc nhận xét lại mã đó + +44 +00:02:49,870 --> 00:02:52,990 +để xem nó hoạt động như thế nào hoặc bạn có thể xóa nó. + +45 +00:02:53,140 --> 00:02:54,280 +Nó hoàn toàn phụ thuộc vào bạn. + +46 +00:02:55,030 --> 00:02:59,710 +Bây giờ, hãy nói rằng tôi muốn lưu trữ tất cả các tên của Hợp chủng quốc Hoa Kỳ. + +47 +00:03:00,160 --> 00:03:03,520 +Trước đây, nếu không biết về cấu + +48 +00:03:03,820 --> 00:03:07,450 +trúc dữ liệu danh sách này, chúng ta + +49 +00:03:08,530 --> 00:03:13,530 +có thể đã viết state1 = Delaware, state2 = Pennsylvania, v.v. + +50 +00:03:13,720 --> 00:03:16,840 +Và chúng tôi sẽ tạo càng nhiều biến khi chúng tôi có các Bang. + +51 +00:03:17,470 --> 00:03:19,720 +Nhưng bây giờ chúng ta đã biết về danh + +52 +00:03:20,080 --> 00:03:25,080 +sách, sau đó chúng ta chỉ có thể tạo một biến duy nhất và chúng ta gọi nó là state_of_america. + +53 +00:03:26,680 --> 00:03:31,680 +Và bây giờ chúng ta có thể tạo một danh sách bằng cách tạo một tập hợp các dấu ngoặc vuông và bên trong các dấu ngoặc vuông + +54 +00:03:32,230 --> 00:03:35,560 +đó, chúng ta thêm các mục của mình. Vì vậy, một + +55 +00:03:35,620 --> 00:03:38,710 +lần nữa, mục đầu tiên là bang + +56 +00:03:38,740 --> 00:03:42,880 +Delaware, sẽ là một chuỗi và sau đó chúng + +57 +00:03:43,570 --> 00:03:47,710 +ta có Pennsylvania, v.v. Và chúng ta có thể tiếp tục danh sách + +58 +00:03:48,160 --> 00:03:52,450 +này chỉ bằng cách thêm dấu phẩy, thêm một phần dữ liệu, thêm một dấu phẩy khác, thêm phần dữ liệu. + +59 +00:03:52,900 --> 00:03:57,430 +Và theo cách này, chúng ta kết thúc với một cấu trúc dữ liệu danh sách. + +60 +00:03:58,390 --> 00:04:03,630 +Bây giờ, một trong những điều thú vị về Hoa Kỳ là các quốc gia khác nhau + +61 +00:04:03,820 --> 00:04:08,530 +ở Hoa Kỳ thực sự gia nhập liên minh vào những thời điểm khác nhau. + +62 +00:04:08,890 --> 00:04:13,630 +Bạn thực sự có thể truy cập Wikipedia và xem hình ảnh động + +63 +00:04:13,780 --> 00:04:18,490 +nhỏ này và xem từng bang tham gia liên minh và tại thời + +64 +00:04:18,490 --> 00:04:23,490 +điểm họ đã làm như vậy. Thứ tự của dữ liệu này bây giờ khá quan trọng + +65 +00:04:25,960 --> 00:04:30,960 +bởi vì nếu chúng ta muốn có một danh sách các Quốc gia Hoa Kỳ theo thứ tự mà họ đã tham + +66 +00:04:31,930 --> 00:04:36,930 +gia liên minh, thì thứ tự mà chúng được lưu trữ trong cấu trúc dữ liệu của chúng ta bây giờ + +67 +00:04:37,660 --> 00:04:39,010 +cũng vô cùng quan trọng. + +68 +00:04:39,520 --> 00:04:42,700 +Và đây là một điều khác mà bạn nhận được với danh sách. + +69 +00:04:43,120 --> 00:04:47,590 +Bạn có thể sử dụng một danh sách để lưu trữ nhiều phần dữ liệu + +70 +00:04:48,010 --> 00:04:50,770 +liên quan, nhưng chúng cũng có thứ tự. + +71 +00:04:50,950 --> 00:04:54,760 +Và thứ tự được xác định bởi thứ tự trong danh sách. + +72 +00:04:55,120 --> 00:04:59,050 +Vì vậy, đây là phần dữ liệu đầu tiên, đây là phần dữ liệu thứ hai. + +73 +00:04:59,380 --> 00:05:01,270 +Và khi bạn lưu trữ nó bên + +74 +00:05:01,480 --> 00:05:06,340 +trong biến, thứ tự đó sẽ không bị mất và bạn sẽ có thể sử dụng nó sau này khi + +75 +00:05:06,340 --> 00:05:07,173 +cần danh sách. + +76 +00:05:07,510 --> 00:05:12,510 +Đây là danh sách các Quốc gia Hoa Kỳ được sắp xếp theo ngày họ + +77 +00:05:14,110 --> 00:05:17,680 +gia nhập liên minh. Và bạn có thể thấy + +78 +00:05:17,680 --> 00:05:22,420 +rằng nếu sau này, tôi quyết định rằng tôi muốn biết trạng thái nào đã tham + +79 +00:05:22,480 --> 00:05:25,420 +gia trước, thì tôi có thể in biến state_of_america này. + +80 +00:05:25,810 --> 00:05:28,270 +Tôi có thể thêm một tập hợp các + +81 +00:05:28,660 --> 00:05:32,590 +dấu ngoặc vuông, sau đó tôi nhập số 0 làm chỉ mục của phần + +82 +00:05:32,620 --> 00:05:35,860 +dữ liệu tôi muốn lấy ra từ danh sách bang_of_america của mình. + +83 +00:05:36,250 --> 00:05:40,660 +Vì vậy, bây giờ nếu tôi tiếp tục và chạy mã này, bạn có thể thấy nó in ra Delaware. + +84 +00:05:40,930 --> 00:05:43,090 +Và nếu tôi tiếp tục tăng con số này, + +85 +00:05:43,390 --> 00:05:48,190 +bạn có thể thấy rằng nó đang đi qua danh sách của tôi theo thứ tự nó đã được lưu. + +86 +00:05:48,880 --> 00:05:50,770 +Vì vậy, bạn có + +87 +00:05:51,010 --> 00:05:55,930 +thể tự hỏi, thật kỳ lạ khi bạn gõ số 0 và bạn + +88 +00:05:55,930 --> 00:06:00,200 +nhận được Delaware, phải không? Chắc chắn, Delaware nên là mặt hàng đầu tiên trong danh sách. + +89 +00:06:00,830 --> 00:06:05,720 +Chà, đây là một loại đặc thù với máy tính và ngôn ngữ lập trình. + +90 +00:06:06,080 --> 00:06:10,520 +Bạn sẽ có xu hướng thấy rằng các lập trình viên bắt đầu đếm từ con số không. + +91 +00:06:10,700 --> 00:06:14,240 +Vì vậy, Delaware là 0, Pennsylvania là 1 và New Jersey là 2. + +92 +00:06:14,870 --> 00:06:17,570 +Và ý tưởng này, thoạt nghe có vẻ hơi + +93 +00:06:17,600 --> 00:06:21,170 +kỳ lạ, tại sao mục đầu tiên lại ở vị trí 0? + +94 +00:06:21,860 --> 00:06:26,030 +Nhưng nếu bạn nghĩ về số chỉ mục đó, thì 0, 1 hoặc + +95 +00:06:26,720 --> 00:06:28,910 +2, thay vì là vị trí, + +96 +00:06:29,330 --> 00:06:34,330 +thực sự là một phần bù hoặc một sự thay đổi so với đầu danh sách. + +97 +00:06:35,810 --> 00:06:40,520 +Vậy thì trong trường hợp này, Cherry ở ngay đầu danh sách, vì vậy + +98 +00:06:40,520 --> 00:06:44,030 +nó có độ lệch hoặc dịch chuyển bằng 0. + +99 +00:06:44,540 --> 00:06:49,540 +Nhưng Apple đã thay đổi từ đầu bằng 1, Pear thay đổi + +100 +00:06:49,790 --> 00:06:52,100 +từ đầu bằng 2, v.v. + +101 +00:06:52,400 --> 00:06:56,240 +Sau đó, sẽ có ý nghĩa hơn khi mục đầu tiên trong danh sách nằm + +102 +00:06:56,240 --> 00:06:59,480 +ở đầu danh sách. Vì vậy, nó không có bù đắp. Vì vậy, nó là 0. + +103 +00:07:00,770 --> 00:07:03,410 +Và bạn sẽ thấy rằng trong rất nhiều ngôn ngữ lập + +104 +00:07:03,680 --> 00:07:05,960 +trình, có cấu trúc dữ liệu tương tự như + +105 +00:07:06,230 --> 00:07:10,760 +danh sách và đây là cách chúng thường được sắp xếp bắt đầu từ 0 và sau đó + +106 +00:07:10,760 --> 00:07:11,593 +thêm 1. + +107 +00:07:11,900 --> 00:07:16,400 +Bây giờ bạn có thể thấy rằng khi bạn muốn nắm giữ một phần dữ liệu cụ + +108 +00:07:16,670 --> 00:07:18,830 +thể được lưu trữ bên trong danh sách, + +109 +00:07:19,190 --> 00:07:24,190 +việc bạn làm là lấy tên của danh sách và sau đó bạn thêm một tập hợp các + +110 +00:07:25,340 --> 00:07:28,250 +dấu ngoặc vuông khác. Vì vậy, bất cứ khi + +111 +00:07:28,520 --> 00:07:30,200 +nào bạn nhìn thấy dấu ngoặc + +112 +00:07:30,230 --> 00:07:34,850 +vuông, bạn nên tự nghĩ rằng, điều này có thể liên quan đến một danh sách vì khi bạn + +113 +00:07:34,880 --> 00:07:39,260 +tạo danh sách, bạn sử dụng dấu ngoặc vuông. Và khi bạn cố gắng lấy các mục ra khỏi danh sách, + +114 +00:07:39,320 --> 00:07:40,820 +bạn cũng sử dụng dấu ngoặc vuông. + +115 +00:07:41,420 --> 00:07:45,860 +Và bên trong dấu ngoặc vuông là nơi bạn đặt chỉ mục hoặc phần bù + +116 +00:07:45,950 --> 00:07:49,490 +của mục mà bạn muốn. Vì vậy, nếu chúng tôi muốn New + +117 +00:07:49,490 --> 00:07:52,340 +Jersey, nó sẽ được bù đắp ngay từ đầu bằng một hai. + +118 +00:07:52,790 --> 00:07:56,990 +Vì vậy, bây giờ phần này của mã bằng với New Jersey. + +119 +00:07:57,530 --> 00:07:58,280 +Và chúng tôi + +120 +00:07:58,280 --> 00:08:03,280 +có thể, nếu chúng tôi muốn lưu nó vào một biến khác hoặc chúng tôi có thể chỉ cần in nó như chúng tôi + +121 +00:08:04,400 --> 00:08:06,320 +đã làm trước đây. Bây giờ, + +122 +00:08:06,350 --> 00:08:09,560 +ngoài việc sử dụng chỉ số dương, chẳng hạn + +123 +00:08:09,770 --> 00:08:12,350 +như 0, 1, 2, 3, bạn cũng có + +124 +00:08:12,620 --> 00:08:14,960 +thể sử dụng chỉ số âm. + +125 +00:08:15,320 --> 00:08:20,320 +Vì vậy, nếu tôi đã viết -1 hoặc -2, thì nó thực sự bắt đầu + +126 +00:08:22,460 --> 00:08:26,330 +đếm từ cuối danh sách. Vì vậy, nếu tôi + +127 +00:08:26,540 --> 00:08:31,010 +viết bang_of_america [-1] làm chỉ mục, thì tôi nhận được Hawaii. + +128 +00:08:31,430 --> 00:08:36,429 +-1 là mục cuối cùng trong danh sách bởi vì bạn không thể thực sự có trừ số 0. + +129 +00:08:36,679 --> 00:08:40,400 +Đó không thực sự là một điều thực tế trong toán học. Bây giờ, khi + +130 +00:08:40,460 --> 00:08:42,799 +tôi tiếp tục và tôi đi + +131 +00:08:42,799 --> 00:08:47,780 +đến -2, sau đó là Alaska, -3 sẽ là Arizona, v.v. + +132 +00:08:47,840 --> 00:08:50,870 +Vì vậy, bạn có thể có chỉ số dương và chỉ số tiêu cực. + +133 +00:08:51,440 --> 00:08:56,370 +Nhưng cho đến nay chúng tôi chỉ kéo mọi thứ ra khỏi danh sách của mình bằng cách sử dụng dấu ngoặc vuông + +134 +00:08:56,370 --> 00:08:57,840 +và chỉ mục của chúng tôi. + +135 +00:08:58,260 --> 00:09:03,090 +Nhưng bạn cũng có thể thay đổi các mục trong danh sách bằng cách sử dụng mã tương tự. + +136 +00:09:03,480 --> 00:09:03,990 +Ví + +137 +00:09:03,990 --> 00:09:08,990 +dụ: nếu tôi quyết định rằng Pennsylvania thực sự không được đánh vần là + +138 +00:09:10,020 --> 00:09:13,440 +Pennsylvania và tôi muốn đổi nó thành Pencilvania, thì + +139 +00:09:14,280 --> 00:09:18,270 +tôi có thể chỉ cần viết mã của mình như thế này. + +140 +00:09:18,810 --> 00:09:22,530 +Tôi nắm giữ danh sách của mình. Và sau đó sử dụng dấu ngoặc + +141 +00:09:22,590 --> 00:09:25,890 +vuông, tôi nhận được mục ở chỉ mục 1, chính là mục này. + +142 +00:09:26,790 --> 00:09:30,570 +Và sau đó tôi đặt nó bằng một phần dữ liệu mới. + +143 +00:09:31,140 --> 00:09:36,140 +Vì vậy, bây giờ nếu tôi tiếp tục và in danh sách bang_of_america của mình, bạn sẽ thấy rằng + +144 +00:09:37,440 --> 00:09:40,050 +danh sách bây giờ trông hơi khác một chút. + +145 +00:09:40,200 --> 00:09:44,250 +Thay vì Pennsylvania, bây giờ là Pencilvania. + +146 +00:09:45,150 --> 00:09:48,090 +Vì vậy, bạn có thể thay đổi bất kỳ mục nào bên + +147 +00:09:48,120 --> 00:09:51,150 +trong danh sách khá dễ dàng bằng cách sử dụng loại cú pháp này. + +148 +00:09:51,540 --> 00:09:55,650 +Bạn cũng có thể thêm vào danh sách nếu bạn muốn. Vì vậy, ví dụ, nếu + +149 +00:09:55,650 --> 00:09:58,620 +bạn muốn thêm một mục vào cuối danh sách, đó + +150 +00:09:58,650 --> 00:10:01,170 +là điều thường xảy ra nhất, phải không? + +151 +00:10:01,170 --> 00:10:05,340 +Nếu bạn đã có danh sách những người đang quản lý cửa hàng của mình, + +152 +00:10:05,550 --> 00:10:08,790 +thì mọi người tiếp theo thường được thêm vào cuối. + +153 +00:10:09,090 --> 00:10:12,210 +Nếu bạn có một tiểu bang mới gia nhập Mỹ, thì có + +154 +00:10:12,480 --> 00:10:17,040 +thể nó sẽ được thêm vào sau Hawaii. làm sao chúng ta làm việc đó bây giờ? + +155 +00:10:17,370 --> 00:10:19,830 +Vâng, chúng ta có thể viết tên + +156 +00:10:20,340 --> 00:10:25,340 +của danh sách và sau đó chúng ta sử dụng một chức năng được gọi là append + +157 +00:10:25,410 --> 00:10:29,130 +và append sẽ thêm một mục duy nhất vào cuối danh sách. + +158 +00:10:29,580 --> 00:10:34,580 +Vì vậy, giả sử rằng Angelaland đang gia nhập Hợp chủng quốc Hoa Kỳ. + +159 +00:10:36,600 --> 00:10:41,600 +Vì vậy, bây giờ khi tôi đã thêm Angelaland vào cuối danh sách bang_of_america của mình + +160 +00:10:42,870 --> 00:10:47,730 +và tôi in các bang_of_america, bạn có thể thấy, nó được thêm vào cuối. + +161 +00:10:48,870 --> 00:10:52,080 +Bây giờ thực sự có một loạt các chức năng khác mà bạn + +162 +00:10:52,080 --> 00:10:56,610 +có thể sử dụng ngoài việc thêm vào. Và bạn sẽ tìm thấy điều này trên tài liệu dành cho Python. + +163 +00:10:57,300 --> 00:11:02,250 +Ngoài hàm append mà chúng ta đã thấy ngay bây giờ khi chúng ta thêm một mục vào cuối danh sách, + +164 +00:11:02,250 --> 00:11:03,083 +có một lượng + +165 +00:11:03,390 --> 00:11:07,110 +lớn tất cả các hàm mà bạn có thể sử dụng với các danh sách. + +166 +00:11:07,470 --> 00:11:09,750 +Ví dụ: bạn có thể sử dụng phần mở rộng, phần + +167 +00:11:09,990 --> 00:11:14,880 +mở rộng này sẽ thêm một loạt các mục vào cuối danh sách. Và trong trường hợp này, những gì + +168 +00:11:14,910 --> 00:11:18,540 +bạn đang thực sự thêm sẽ trở thành một danh sách. + +169 +00:11:18,900 --> 00:11:23,850 +Vì vậy, tôi sẽ tạo danh sách bằng cách sử dụng dấu ngoặc vuông và sau đó thêm các mục của + +170 +00:11:23,880 --> 00:11:24,713 +tôi vào đây. + +171 +00:11:25,620 --> 00:11:30,620 +Và bây giờ những gì đang xảy ra là tôi đang mở rộng danh sách bang_of_america này + +172 +00:11:31,500 --> 00:11:35,640 +với danh sách bổ sung này. Vì vậy, bây giờ nếu chúng + +173 +00:11:35,910 --> 00:11:40,910 +ta in bang_of_america, bạn có thể thấy rằng hai mục từng nằm trong danh sách này giờ + +174 +00:11:41,370 --> 00:11:44,580 +đã được thêm vào danh sách trước đó và giờ nó + +175 +00:11:44,910 --> 00:11:47,640 +đã được mở rộng thêm hai mục nữa. + +176 +00:11:48,630 --> 00:11:52,890 +Nhưng điều quan trọng là bạn không cần phải ghi nhớ các hàm này. + +177 +00:11:52,930 --> 00:11:57,790 +Đó là toàn bộ điểm của tài liệu và lý do tại sao chúng tôi có Google vì có + +178 +00:11:57,790 --> 00:12:00,820 +quá nhiều thông tin trên thế giới để bạn ghi nhớ. + +179 +00:12:01,240 --> 00:12:04,330 +Và đó là một cách học rất kém hiệu quả. + +180 +00:12:04,900 --> 00:12:09,220 +Và nếu bạn đã cố gắng ghi nhớ mọi phương pháp, điều đó không phải là không thể, nhưng điều + +181 +00:12:09,220 --> 00:12:12,850 +đó có nghĩa là bạn không có không gian trong não cho những thứ quan trọng, đó + +182 +00:12:12,850 --> 00:12:14,350 +là cách mọi thứ hoạt động. + +183 +00:12:14,380 --> 00:12:17,650 +Làm thế nào để bạn thực sự sử dụng nó để làm những gì bạn muốn nó làm? + +184 +00:12:18,070 --> 00:12:22,300 +Vì vậy, điều tôi khuyên bạn nên làm khi bạn bắt gặp một thứ + +185 +00:12:22,600 --> 00:12:27,370 +mới, chẳng hạn như cấu trúc dữ liệu danh sách là chỉ cần xem qua tài + +186 +00:12:27,790 --> 00:12:31,690 +liệu, đọc qua nó và xem bạn có thể làm gì. + +187 +00:12:32,140 --> 00:12:34,870 +Và một khi bạn có ý tưởng về điều này là khả + +188 +00:12:35,020 --> 00:12:39,040 +thi, thì lần sau khi bạn cần sử dụng nó bên trong mã của mình, bạn sẽ biết, + +189 +00:12:39,070 --> 00:12:41,050 +ah, tôi nhớ điều này là có thể. + +190 +00:12:41,290 --> 00:12:44,290 +Và tất cả những gì bạn phải làm là có thể + +191 +00:12:44,530 --> 00:12:47,500 +sử dụng Google, để tìm chính xác từng bit của + +192 +00:12:47,770 --> 00:12:52,770 +tài liệu và sau đó triển khai nó. Lập trình giống như một kỳ thi mở sách. + +193 +00:12:53,140 --> 00:12:55,660 +Bạn không cần phải ghi nhớ bất cứ điều gì. + +194 +00:12:55,870 --> 00:12:59,440 +Thay vào đó, bạn nên dành thời gian để thử mọi thứ + +195 +00:12:59,440 --> 00:13:04,330 +và cố gắng hoàn thành công việc. Bây giờ tôi đã giới thiệu cho bạn cấu trúc dữ liệu mới này, + +196 +00:13:04,420 --> 00:13:05,410 +danh sách tuyệt vời, đã + +197 +00:13:05,740 --> 00:13:09,880 +đến lúc thực hiện một bài tập viết mã để xem liệu bạn có thể sử dụng nó trong thực tế hay không. + +198 +00:13:10,210 --> 00:13:13,600 +Vì vậy, hãy chuyển sang bài học tiếp theo và đưa ra thử thách. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 Exercise-14.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 Exercise-14.url new file mode 100644 index 0000000000000000000000000000000000000000..fca013bfd5fa0692c510153ad45dcaa857bbbbbc --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 Exercise-14.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d45f0fbf-1651-4287-9c65-9aec95c8fed4 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 How-to-join-Auditorium.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 [Interactive Coding Exercise] Banker Roulette - Who will pay the bill.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 [Interactive Coding Exercise] Banker Roulette - Who will pay the bill.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8992e3daecf8fd3f4b4b7a227e704698abbe1e8c --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 [Interactive Coding Exercise] Banker Roulette - Who will pay the bill.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:055a8b03dcb43468897fad6f1d64665ba0573affb0749c5860eabf34984c6030 +size 12057319 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 [Interactive Coding Exercise] Banker Roulette - Who will pay the bill_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 [Interactive Coding Exercise] Banker Roulette - Who will pay the bill_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9a5f6db64a4db13b500672f1c884fb8908a2db60 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/005 [Interactive Coding Exercise] Banker Roulette - Who will pay the bill_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,540 --> 00:00:01,589 +Trong bài tập + +2 +00:00:01,589 --> 00:00:03,570 +này, bạn sẽ viết một chương + +3 +00:00:03,570 --> 00:00:08,570 +trình chọn một tên ngẫu nhiên từ danh sách các tên. + +4 +00:00:09,090 --> 00:00:11,040 +Và người được chọn sẽ phải thanh + +5 +00:00:11,040 --> 00:00:12,840 +toán tiền ăn cho mọi người. + +6 +00:00:12,840 --> 00:00:14,910 +Điều này có thể hữu ích khi bạn đi + +7 +00:00:14,910 --> 00:00:17,220 +ăn tối với bạn bè hoặc có thể khi bạn đi + +8 +00:00:17,220 --> 00:00:20,670 +chơi với đồng nghiệp và bạn muốn mọi thứ đơn giản. + +9 +00:00:20,670 --> 00:00:24,660 +Vì vậy, đây là Roulette Ngân hàng và ý tưởng là + +10 +00:00:24,660 --> 00:00:27,120 +chúng ta sẽ đặt một loạt tên vào + +11 +00:00:27,120 --> 00:00:29,520 +khu vực Nhập liệu và những tên + +12 +00:00:29,520 --> 00:00:34,230 +này sẽ được phân tách bằng dấu phẩy và dấu cách. + +13 +00:00:34,230 --> 00:00:36,006 +Cái này rất quan trọng. + +14 +00:00:36,006 --> 00:00:39,840 +Ở dòng một, chúng ta có một số mã sẽ thực hiện + +15 +00:00:39,840 --> 00:00:42,000 +một số bước xử lý trước. + +16 +00:00:42,000 --> 00:00:45,780 +Nó sẽ nhận dữ liệu đầu vào và sẽ chia chuỗi + +17 +00:00:45,780 --> 00:00:49,260 +đó bằng dấu phẩy và dấu cách. + +18 +00:00:49,260 --> 00:00:53,220 +Và sau đó nó sẽ thêm từng tên đó vào một danh sách, sau + +19 +00:00:53,220 --> 00:00:56,853 +đó bạn có thể truy cập vào biến của tên đó. + +20 +00:00:57,990 --> 00:01:00,090 +Bây giờ, đừng lo lắng về việc + +21 +00:01:00,090 --> 00:01:03,240 +nắm giữ Đầu vào, chúng tôi đã sắp xếp hậu trường + +22 +00:01:03,240 --> 00:01:08,240 +cho bạn, tất cả những gì bạn phải làm là đưa ra một danh sách các tên, + +23 +00:01:09,420 --> 00:01:13,530 +làm cách nào bạn có thể chọn một tên ngẫu nhiên từ những + +24 +00:01:13,530 --> 00:01:18,300 +tên đó và sau đó in ra cái tên đó và sau đó là cụm từ "Hôm nay tôi sẽ + +25 +00:01:18,300 --> 00:01:20,100 +mua bữa ăn. Vì vậy, hãy xem bên trong + +26 +00:01:20,100 --> 00:01:22,320 +Đầu vào mẫu và Đầu ra ví dụ và + +27 +00:01:22,320 --> 00:01:24,604 +tìm ra cách bạn có thể làm cho + +28 +00:01:24,604 --> 00:01:26,130 +nó hoạt động. + +29 +00:01:26,130 --> 00:01:29,160 +Sau khi hoàn tất, hãy nhấn Gửi rồi kiểm tra mã của bạn dựa trên + +30 +00:01:29,160 --> 00:01:32,130 +các trường hợp kiểm thử được định dạng trước của chúng tôi. + +31 +00:01:32,130 --> 00:01:35,100 +Bây giờ hãy nhớ, đầu ra của bạn chỉ có thể có một dòng + +32 +00:01:35,100 --> 00:01:38,433 +và nó phải khớp với định dạng được ghi trong đầu ra ví dụ. + +33 +00:01:41,160 --> 00:01:44,130 +Được rồi, chúng ta hãy cùng nhau tìm ra giải pháp. + +34 +00:01:44,130 --> 00:01:46,740 +Điều đầu tiên chúng ta sẽ làm + +35 +00:01:46,740 --> 00:01:50,610 +là lấy tổng số mục trong danh sách. + +36 +00:01:50,610 --> 00:01:52,910 +Vì vậy, chúng tôi đang tạo một biến có + +37 +00:01:53,910 --> 00:01:58,200 +tên là num_items và chúng tôi đang sử dụng hàm len() trong Python + +38 +00:01:58,200 --> 00:02:01,230 +để tính xem có bao nhiêu mục trong danh sách của + +39 +00:02:01,230 --> 00:02:03,453 +chúng tôi, đó là danh sách tên. + +40 +00:02:06,450 --> 00:02:09,360 +Tiếp theo, chúng tôi lấy số lượng + +41 +00:02:09,360 --> 00:02:11,520 +mục, chúng tôi trừ đi 1 + +42 +00:02:11,520 --> 00:02:15,600 +vì hãy nhớ rằng, danh sách bắt đầu từ 0 rồi đến + +43 +00:02:15,600 --> 00:02:18,210 +chỉ mục cuối cùng. + +44 +00:02:18,210 --> 00:02:20,580 +Vì vậy, nếu một danh sách + +45 +00:02:20,580 --> 00:02:24,060 +có ba mục thì nó sẽ ở vị trí 0, 1 và 2. + +46 +00:02:24,060 --> 00:02:27,420 +Đó là lý do vì sao chúng ta trừ number_items cho 1. + +47 +00:02:27,420 --> 00:02:29,580 +Và sau đó chúng tôi đang sử dụng ngẫu nhiên. randint() + +48 +00:02:29,580 --> 00:02:32,430 +để lấy số ngẫu nhiên từ 0 đến chỉ + +49 +00:02:32,430 --> 00:02:34,350 +mục cuối cùng. + +50 +00:02:34,350 --> 00:02:36,090 +Và đó sẽ là con số chúng ta sẽ sử + +51 +00:02:36,090 --> 00:02:39,570 +dụng để chọn ra một cái tên ngẫu nhiên trong bước tiếp theo. + +52 +00:02:39,570 --> 00:02:41,310 +Khi chúng ta đã có số ngẫu + +53 +00:02:41,310 --> 00:02:44,820 +nhiên, việc đơn giản là lấy danh sách tên của chúng + +54 +00:02:44,820 --> 00:02:46,950 +ta, đặt dấu ngoặc vuông [ ] sau đó + +55 +00:02:46,950 --> 00:02:48,600 +đặt lựa chọn ngẫu nhiên, + +56 +00:02:48,600 --> 00:02:51,090 +số ngẫu nhiên đó vào dấu ngoặc vuông + +57 +00:02:51,090 --> 00:02:53,700 +để chọn ra một tên ngẫu nhiên. + +58 +00:02:53,700 --> 00:02:57,450 +Và cuối cùng, chúng tôi ghi tên đó vào bản + +59 +00:02:57,450 --> 00:03:01,323 +in và in ra người đó sẽ mua bữa ăn hôm nay. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 For-the-Curious-The-Dirty-Dozen.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 For-the-Curious-The-Dirty-Dozen.url new file mode 100644 index 0000000000000000000000000000000000000000..64e9a46cc4e057b15e4ee028325e9862d12b96fd --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 For-the-Curious-The-Dirty-Dozen.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.delish.com/food-news/a26872638/dirty-dozen-foods-list-2019/ \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 IndexErrors and Working with Nested Lists.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 IndexErrors and Working with Nested Lists.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d7b67622fae0caede6f3bdb4b24836510f20ec6e --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 IndexErrors and Working with Nested Lists.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e54beebeadd4f37e8f0fa5a8b68076f9d85b1f77d46ec4326f19b26831b955f8 +size 49304391 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 IndexErrors and Working with Nested Lists_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 IndexErrors and Working with Nested Lists_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9aba05f4c6b897bae9bdc50983a92a5bc08a9bd4 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/006 IndexErrors and Working with Nested Lists_vi.srt @@ -0,0 +1,308 @@ +1 +00:00:00,250 --> 00:00:02,380 +Bây giờ, khi bạn đang làm việc với danh + +2 +00:00:02,740 --> 00:00:06,760 +sách, một trong những lỗi phổ biến nhất mà bạn sẽ gặp là lỗi được gọi là lỗi + +3 +00:00:06,790 --> 00:00:09,880 +chỉ mục nằm ngoài phạm vi. Trên thực tế, đến thời điểm này, + +4 +00:00:09,940 --> 00:00:14,560 +bạn có thể đã thấy nó. Bây giờ, nó có nghĩa là gì? Chà, hãy lấy + +5 +00:00:14,560 --> 00:00:19,090 +tất cả các bang_of_america và xóa dòng nơi chúng ta đã thêm + +6 +00:00:19,300 --> 00:00:21,250 +vùng đất Angelaland và Jack Bauer. + +7 +00:00:21,580 --> 00:00:26,580 +Vì vậy, chúng tôi quay trở lại ban đầu. Và bạn có thể nhớ rằng có 50 + +8 +00:00:26,950 --> 00:00:30,490 +tiểu bang ở Mỹ. Nhưng nếu bạn không làm vậy vì + +9 +00:00:30,640 --> 00:00:35,640 +bạn là một lập trình viên, thì cũng dễ dàng như viết len và sau đó chuyển qua bang_of_america + +10 +00:00:36,880 --> 00:00:38,140 +sẽ in ra 50. + +11 +00:00:38,710 --> 00:00:43,710 +Vì vậy, bây giờ chúng ta biết rằng có tổng cộng 50 mục trong danh sách này, + +12 +00:00:44,560 --> 00:00:47,320 +và hãy nhớ rằng, bởi vì chúng tôi bắt + +13 +00:00:47,890 --> 00:00:51,190 +đầu đếm từ 0, Hawaii thực sự ở chỉ số 49. + +14 +00:00:51,580 --> 00:00:56,580 +Vì vậy, nếu chúng tôi in bang_of_america và sau đó chúng tôi cố gắng lấy mặt hàng ở số 49, + +15 +00:00:57,070 --> 00:01:00,340 +chúng tôi nhấn in, bạn sẽ thấy rằng chúng tôi in Hawaii. + +16 +00:01:01,660 --> 00:01:05,260 +Bây giờ điều gì sẽ xảy ra nếu chúng ta vượt xa hơn thế? + +17 +00:01:05,319 --> 00:01:09,280 +Điều gì sẽ xảy ra nếu chúng tôi cố gắng có được một cái ở chỉ số 50, ở một + +18 +00:01:09,460 --> 00:01:14,350 +nơi nào đó ngoài đây, chúng tôi nhận được gì thay thế? Vâng, chúng tôi nhận được một lỗi. + +19 +00:01:14,860 --> 00:01:19,860 +Nó được gọi là lỗi chỉ mục. Và điều này là do nó nằm ngoài Hawaii và không có + +20 +00:01:20,650 --> 00:01:23,350 +gì ở đó mà chúng ta có thể nhìn thấy bằng mắt của mình. + +21 +00:01:23,950 --> 00:01:27,790 +Nhưng khi bạn đang làm việc với các danh sách lớn và không phải lúc nào bạn cũng + +22 +00:01:27,790 --> 00:01:28,623 +xem dữ liệu, + +23 +00:01:28,720 --> 00:01:33,720 +thì những lỗi này có thể khó hiểu hơn một chút. Rất thường xuyên khi bạn đang làm + +24 +00:01:33,880 --> 00:01:37,690 +việc với các danh sách, bạn sẽ gặp phải một lỗi. + +25 +00:01:37,690 --> 00:01:42,690 +Vì vậy, thật bất thường khi bạn sẽ cố gắng lấy một thứ gì đó ở chỉ mục số 90 bởi + +26 +00:01:43,120 --> 00:01:46,300 +vì đó chỉ là cách vượt quá kích thước danh sách của bạn. + +27 +00:01:46,690 --> 00:01:51,640 +Nhưng rất thường xuyên, bạn có thể gặp phải tình huống mà bạn + +28 +00:01:51,640 --> 00:01:55,330 +có một số loại giá trị nói rằng + +29 +00:01:55,380 --> 00:01:59,500 +num_of_states = len và sau đó chúng ta chuyển qua bang_of_america. + +30 +00:01:59,740 --> 00:02:01,870 +Vì vậy, điều này sẽ bằng 50. + +31 +00:02:02,290 --> 00:02:07,290 +Và sau đó chúng tôi chuyển nó vào bên trong đây dưới dạng số chỉ mục của các trạng thái. + +32 +00:02:08,620 --> 00:02:13,360 +Và sau đó chúng tôi nhấn run và chúng tôi gặp lỗi tương tự, phải không? Trên dòng 16, nơi chúng tôi cố gắng nắm + +33 +00:02:13,930 --> 00:02:18,190 +giữ chỉ mục này trong danh sách này. Một lần nữa, danh sách chỉ mục + +34 +00:02:18,220 --> 00:02:19,540 +nằm ngoài phạm vi. + +35 +00:02:20,020 --> 00:02:25,020 +Và đây chỉ là một lỗi do tất cả những gì chúng ta cần làm chỉ + +36 +00:02:26,380 --> 00:02:27,213 +đơn giản + +37 +00:02:27,400 --> 00:02:32,050 +là trừ đi 1 để 1 trở thành 0 và 50 trở thành 49. + +38 +00:02:32,560 --> 00:02:34,180 +Và sau đó chúng tôi loại bỏ lỗi đó. + +39 +00:02:36,010 --> 00:02:39,730 +Bây giờ có thể dễ dàng hơn nếu chúng ta làm việc với thứ gì đó đơn giản hơn một chút. + +40 +00:02:40,300 --> 00:02:45,300 +Gần đây, tôi đang đọc trực tuyến và tôi bắt gặp cái gọi là Dirty Dozen, nơi nhóm + +41 +00:02:47,320 --> 00:02:48,730 +làm việc về môi + +42 +00:02:48,760 --> 00:02:53,050 +trường, một nhóm người, xử lý rất nhiều dữ liệu, có thể là sử dụng Python. + +43 +00:02:53,530 --> 00:02:58,530 +Và họ đã phát hành Dirty Dozen của họ, một danh sách các loại trái cây và + +44 +00:02:59,170 --> 00:03:04,170 +rau quả có nhiều thuốc trừ sâu nhất. Và thật là điên rồ khi họ thực sự rửa và bóc tất + +45 +00:03:05,650 --> 00:03:08,740 +cả những loại thực phẩm này và sau đó kiểm tra chúng để tìm thuốc trừ sâu. + +46 +00:03:09,280 --> 00:03:14,280 +Và danh sách trông giống như thế này, trong đó dâu tây dường như là một trong những đối tượng + +47 +00:03:14,650 --> 00:03:16,510 +vi phạm thuốc trừ sâu nhiều nhất. + +48 +00:03:17,080 --> 00:03:20,110 +Vì vậy, hãy tạo một danh sách hàng tá bẩn, + +49 +00:03:20,530 --> 00:03:24,640 +nhưng bạn sẽ nhận thấy rằng một số trong số này là trái cây như + +50 +00:03:24,670 --> 00:03:27,460 +dâu tây, táo, và những thứ khác là rau. + +51 +00:03:27,700 --> 00:03:32,700 +Vì vậy, làm thế nào chúng ta có thể sử dụng danh sách của mình để vẫn giữ chúng bên trong + +52 +00:03:33,580 --> 00:03:35,650 +cùng một loại thùng chứa, một tá đồ + +53 +00:03:36,040 --> 00:03:39,460 +bẩn, nhưng bằng cách nào đó tách chúng ra thành trái cây và rau? + +54 +00:03:40,900 --> 00:03:44,500 +Chà, chúng ta có thể chỉ cần tạo hai + +55 +00:03:44,530 --> 00:03:49,390 +danh sách, trái cây và rau. Nhưng hai danh sách này có một mối quan hệ, phải + +56 +00:03:49,390 --> 00:03:49,780 +không? + +57 +00:03:49,780 --> 00:03:54,780 +Loại đó có liên quan vì tất cả chúng đều nằm trong danh sách thực phẩm có hàm lượng thuốc trừ sâu cao. + +58 +00:03:55,450 --> 00:04:00,160 +Vì vậy, làm thế nào chúng ta có thể có danh sách trong một danh sách? Đó là, cái được gọi là + +59 +00:04:00,190 --> 00:04:04,300 +danh sách lồng nhau. Thay vì hàng tá bẩn ban + +60 +00:04:04,690 --> 00:04:08,500 +đầu, chúng ta có thể tạo một danh sách mới có tên + +61 +00:04:08,950 --> 00:04:13,750 +là dirty_dozen và chúng ta đặt nó bằng một danh sách chứa hai danh sách. + +62 +00:04:13,930 --> 00:04:17,560 +Nó chứa trái cây và nó chứa rau. + +63 +00:04:18,370 --> 00:04:23,370 +Vì vậy, bây giờ những gì hiệu quả đã xảy ra là chúng tôi đã chèn danh sách này vào bên trong đây + +64 +00:04:25,480 --> 00:04:28,810 +và sau đó chúng tôi đã chèn danh sách này vào bên trong đây. + +65 +00:04:29,290 --> 00:04:33,460 +Vì vậy, bây giờ chúng ta có một danh sách chứa hai danh sách. + +66 +00:04:34,270 --> 00:04:38,980 +Và nếu tôi tiếp tục và in ra danh sách này, bạn sẽ có thể thấy cấu trúc của nó. + +67 +00:04:40,990 --> 00:04:42,160 +Và nó trông như thế này. + +68 +00:04:42,760 --> 00:04:47,440 +Bạn sẽ nhận thấy rằng có hai dấu ngoặc ở đầu và + +69 +00:04:47,800 --> 00:04:51,340 +cuối và lý do là vì đây là một + +70 +00:04:52,210 --> 00:04:57,210 +danh sách, đây là danh sách khác và đây cũng là một danh sách. + +71 +00:04:58,180 --> 00:05:03,180 +Vì vậy, đây là một cách khác để sử dụng danh sách và cho bạn thấy tính linh hoạt của + +72 +00:05:04,420 --> 00:05:06,280 +cấu trúc dữ liệu cụ thể này. + +73 +00:05:06,910 --> 00:05:11,380 +Đó là thứ mà bạn sẽ sử dụng nhiều khi viết mã Python. + +74 +00:05:12,520 --> 00:05:15,130 +Bây giờ chúng ta đã nói nhiều hơn về lỗi + +75 +00:05:15,130 --> 00:05:18,040 +chỉ mục, cách khắc phục chúng và cả danh sách lồng nhau, bạn + +76 +00:05:18,340 --> 00:05:21,070 +đã sẵn sàng để đi đến thử thách mã hóa tiếp theo. + +77 +00:05:21,460 --> 00:05:23,980 +Vì vậy, hãy đến đó và thử đi. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/007 List and IndexError Quiz.html b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/007 List and IndexError Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..56498395af0384ad25774c45597e517342edbe03 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/007 List and IndexError Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 Exercise-15.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 Exercise-15.url new file mode 100644 index 0000000000000000000000000000000000000000..48a63fb6028c26bbbf4114d02937ca82fa083779 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 Exercise-15.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/e806e25c-5f84-4d7c-9c7c-2c0fcd0bfe84 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 How-to-join-Auditorium.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 [Interactive Coding Exercise] Treasure Map.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 [Interactive Coding Exercise] Treasure Map.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f46a1d7cf302ef83cc794d349272e644acba8089 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 [Interactive Coding Exercise] Treasure Map.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca88f4362679089819f3f51a0718c8e8f9ecadacdc6d5391e264fd34124e3568 +size 25281465 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 [Interactive Coding Exercise] Treasure Map_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 [Interactive Coding Exercise] Treasure Map_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5decdd5d1190eb992aa936ff3b7b105cc268b20a --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/008 [Interactive Coding Exercise] Treasure Map_vi.srt @@ -0,0 +1,512 @@ +1 +00:00:01,200 --> 00:00:02,670 +Được rồi, đã đến lúc thực hiện + +2 +00:00:02,670 --> 00:00:04,410 +một bài tập viết mã khó khác. + +3 +00:00:04,410 --> 00:00:06,090 +Vì vậy đây là một thử thách khó khăn. + +4 +00:00:06,090 --> 00:00:08,340 +Những gì bạn sắp làm là bạn sẽ giả làm + +5 +00:00:08,340 --> 00:00:09,750 +một tên cướp biển. + +6 +00:00:09,750 --> 00:00:10,890 +Ý tôi là gì? + +7 +00:00:10,890 --> 00:00:13,800 +Chúng ta sẽ sử dụng những gì đã học về danh + +8 +00:00:13,800 --> 00:00:15,750 +sách và đặc biệt là danh sách + +9 +00:00:15,750 --> 00:00:18,120 +lồng nhau để tạo Bản đồ kho báu. + +10 +00:00:18,120 --> 00:00:22,560 +Vì vậy, chúng tôi đã tạo Bản đồ kho báu bằng cách tạo ba danh sách mà + +11 +00:00:22,560 --> 00:00:25,860 +tôi gọi là dòng 1, dòng 2 và dòng 3, đồng thời tôi đã + +12 +00:00:25,860 --> 00:00:29,130 +kết hợp chúng thành một danh sách lồng nhau bằng + +13 +00:00:29,130 --> 00:00:31,200 +cách sử dụng dòng mã 4, như tôi đã + +14 +00:00:31,200 --> 00:00:33,240 +nói, bản đồ tương đương với một + +15 +00:00:33,240 --> 00:00:36,150 +danh sách khác chứa ba danh sách. + +16 +00:00:36,150 --> 00:00:40,860 +Công việc của bạn là lấy dữ liệu đầu vào có định dạng tương tự như cách + +17 +00:00:40,860 --> 00:00:43,440 +bạn nhìn thấy bản đồ được định dạng, + +18 +00:00:43,440 --> 00:00:46,410 +trong đó chúng ta có thể lấy một chữ cái và một + +19 +00:00:46,410 --> 00:00:48,750 +số, sau đó sử dụng các chữ cái và số + +20 +00:00:48,750 --> 00:00:52,290 +đó để truy cập vào một vị trí cụ thể trong danh sách + +21 +00:00:52,290 --> 00:00:57,000 +của chúng ta và chuyển đổi mục nhập thành chữ X để đánh dấu một vị trí + +22 +00:00:57,000 --> 00:01:01,230 +trên bản đồ nơi chúng ta đã chôn kho báu của mình. + +23 +00:01:01,230 --> 00:01:04,170 +Hãy đọc kỹ hướng dẫn, tìm hiểu cách thức + +24 +00:01:04,170 --> 00:01:06,930 +hoạt động của nó và sau đó viết mã của + +25 +00:01:06,930 --> 00:01:09,630 +bạn vào main. py giữa hai + +26 +00:01:09,630 --> 00:01:13,290 +phần mà tôi đã viết cho bạn. + +27 +00:01:13,290 --> 00:01:14,850 +Vì vậy, chúng tôi đã có một + +28 +00:01:14,850 --> 00:01:16,920 +câu lệnh in in ra cả ba dòng và bạn + +29 +00:01:16,920 --> 00:01:18,930 +không nên thay đổi bất kỳ mã hiện + +30 +00:01:18,930 --> 00:01:21,450 +có nào để hoàn thành thử thách này. + +31 +00:01:21,450 --> 00:01:22,410 +Đó là một điều khó khăn. + +32 +00:01:22,410 --> 00:01:23,550 +Hãy suy nghĩ về nó. + +33 +00:01:23,550 --> 00:01:26,310 +Hãy suy nghĩ về Đầu vào mẫu và Đầu ra mẫu + +34 +00:01:26,310 --> 00:01:28,773 +trong hướng dẫn và thực hiện. + +35 +00:01:39,601 --> 00:01:40,600 +Được rồi. + +36 +00:01:40,600 --> 00:01:41,460 +Tôi đã cảnh báo bạn + +37 +00:01:41,460 --> 00:01:43,860 +rằng đây là một vấn đề khó, nhưng không có gì xấu hổ khi + +38 +00:01:43,860 --> 00:01:46,500 +kiểm tra giải pháp, đặc biệt nếu bạn đã thực hiện tốt. + +39 +00:01:46,500 --> 00:01:48,750 +Điều đầu tiên mà mã của chúng + +40 +00:01:48,750 --> 00:01:53,750 +ta thực hiện là giữ chữ cái đầu tiên trong đầu vào. + +41 +00:01:53,820 --> 00:01:57,780 +Trong trường hợp này, đó là B trong đầu vào ví dụ. + +42 +00:01:57,780 --> 00:02:00,180 +Và điều chúng ta sắp làm là sử + +43 +00:02:00,180 --> 00:02:02,100 +dụng vị trí lấy toàn bộ + +44 +00:02:02,100 --> 00:02:05,640 +dữ liệu đầu vào, lấy chữ cái ở chỉ mục đầu tiên, + +45 +00:02:05,640 --> 00:02:08,490 +do đó, vị trí [0] và bây giờ chúng ta + +46 +00:02:08,490 --> 00:02:12,093 +có chữ cái đầu tiên đó từ đầu vào. + +47 +00:02:13,050 --> 00:02:14,400 +Bây giờ điều tiếp theo + +48 +00:02:14,400 --> 00:02:17,940 +chúng ta sẽ làm là chuyển chữ cái này thành chữ thường để + +49 +00:02:17,940 --> 00:02:21,570 +chúng ta có thể so sánh nó với chữ cái có thể so sánh được. + +50 +00:02:21,570 --> 00:02:23,790 +Tôi đã sử dụng . low() trên dòng thứ + +51 +00:02:23,790 --> 00:02:27,030 +tám để viết thường chữ cái đầu vào đề phòng trường + +52 +00:02:27,030 --> 00:02:29,430 +hợp người dùng sử dụng chữ hoa. + +53 +00:02:29,430 --> 00:02:32,580 +Và ở dòng thứ chín, tôi đã tạo một danh sách đại + +54 +00:02:32,580 --> 00:02:34,950 +diện cho ba chữ cái có thể có. + +55 +00:02:34,950 --> 00:02:36,600 +Chúng ta có a, b và c. + +56 +00:02:36,600 --> 00:02:39,358 +Bây giờ, bạn có thể làm theo cách khác và chuyển + +57 +00:02:39,358 --> 00:02:40,860 +nó thành chữ hoa, nhưng + +58 +00:02:40,860 --> 00:02:42,720 +mọi thứ phải thống nhất để đảm + +59 +00:02:42,720 --> 00:02:46,020 +bảo rằng đầu vào của người dùng không thành vấn đề nếu + +60 +00:02:46,020 --> 00:02:48,600 +họ viết chữ thường hoặc chữ hoa, mã của chúng + +61 +00:02:48,600 --> 00:02:51,480 +tôi sẽ vẫn hoạt động và có thể so sánh nó với các + +62 +00:02:51,480 --> 00:02:54,633 +giá trị trong danh sách a, b, c. + +63 +00:02:55,560 --> 00:02:57,750 +Để thực hiện so sánh, chúng tôi + +64 +00:02:57,750 --> 00:03:01,560 +đang sử dụng một phương thức lấy từ danh sách Python + +65 +00:03:01,560 --> 00:03:03,300 +có tên là index. + +66 +00:03:03,300 --> 00:03:05,010 +Vì vậy, cách chúng tôi làm điều + +67 +00:03:05,010 --> 00:03:08,610 +này là chúng tôi lấy tên của danh sách, đó là a, b, c, rồi chúng + +68 +00:03:08,610 --> 00:03:10,710 +tôi viết . chỉ mục, sau đó trong + +69 +00:03:10,710 --> 00:03:13,170 +dấu ngoặc đơn của phương thức đó, chúng tôi chuyển + +70 +00:03:13,170 --> 00:03:15,630 +vào bất cứ thứ gì chúng tôi muốn kiểm tra xem có tồn + +71 +00:03:15,630 --> 00:03:17,760 +tại trong danh sách hay không. + +72 +00:03:17,760 --> 00:03:22,760 +Nếu chữ cái là b, như trong trường hợp này trong dữ liệu đầu + +73 +00:03:22,950 --> 00:03:27,630 +vào của chúng ta, thì abc. index(b) sẽ cho chúng ta một số, nó + +74 +00:03:27,630 --> 00:03:29,280 +sẽ cho chúng ta 1, vì hãy + +75 +00:03:29,280 --> 00:03:31,320 +nhớ danh sách bắt đầu từ 0. + +76 +00:03:31,320 --> 00:03:34,320 +Vậy a ở chỉ số 0, b ở 1, c ở 2. + +77 +00:03:34,320 --> 00:03:37,980 +Vì vậy, bây giờ letter_index là 1 và chúng + +78 +00:03:37,980 --> 00:03:41,670 +ta có thể làm việc với nó để giữ mục trong bản + +79 +00:03:41,670 --> 00:03:44,400 +đồ mà chúng ta muốn thay đổi. + +80 +00:03:44,400 --> 00:03:47,730 +Phần này hơi khó để khái niệm hóa, nhưng + +81 +00:03:47,730 --> 00:03:50,460 +bạn có thể thử nghĩ về đoạn mã này, + +82 +00:03:50,460 --> 00:03:52,290 +in ra các giá trị là gì và + +83 +00:03:52,290 --> 00:03:54,450 +đảm bảo rằng bạn hiểu. + +84 +00:03:54,450 --> 00:03:57,690 +Phần tiếp theo là lấy number_index dễ + +85 +00:03:57,690 --> 00:03:58,740 +dàng hơn nhiều + +86 +00:03:58,740 --> 00:04:01,260 +vì chúng ta có thể chỉ cần lấy + +87 +00:04:01,260 --> 00:04:03,960 +đầu vào thông qua vị trí biến, lấy + +88 +00:04:03,960 --> 00:04:05,670 +giá trị ở chỉ mục 1 là + +89 +00:04:05,670 --> 00:04:10,590 +chữ số hoặc chữ cái thứ hai trong đầu vào và trong trường + +90 +00:04:10,590 --> 00:04:12,990 +hợp này , đó là số 3 + +91 +00:04:12,990 --> 00:04:14,460 +Và trong bản đồ của chúng + +92 +00:04:14,460 --> 00:04:18,660 +ta vì chúng ta có một danh sách và ghi nhớ các danh sách bắt đầu + +93 +00:04:18,660 --> 00:04:22,770 +từ 0, nên thực ra vị trí 3 tương đương với chỉ số 2. + +94 +00:04:22,770 --> 00:04:27,210 +Vì vậy, chúng ta luôn phải trừ 1 để lấy chỉ + +95 +00:04:27,210 --> 00:04:30,270 +số vì nó bắt đầu đếm từ 0. + +96 +00:04:30,270 --> 00:04:32,613 +Vậy là bây giờ chúng ta đã có number_index. + +97 +00:04:33,570 --> 00:04:37,770 +Cuối cùng, chúng ta có thể hiển thị danh sách + +98 +00:04:37,770 --> 00:04:40,740 +lồng nhau, bản đồ và nhập cả hai + +99 +00:04:40,740 --> 00:04:44,550 +chỉ mục này để thay đổi mục ở vị trí đó thành + +100 +00:04:44,550 --> 00:04:46,410 +chữ X. + +101 +00:04:46,410 --> 00:04:49,170 +Điều có thể hơi khó hiểu ở đây là phần + +102 +00:04:49,170 --> 00:04:53,610 +đầu tiên thực sự là number_index vì hãy nhớ rằng chúng + +103 +00:04:53,610 --> 00:04:57,150 +ta đã nói rằng với các danh sách lồng nhau, chúng + +104 +00:04:57,150 --> 00:05:00,090 +ta sẽ đi từ ngoài vào trong. + +105 +00:05:00,090 --> 00:05:03,660 +Và điều đó có nghĩa là chúng ta có một danh sách các danh sách. + +106 +00:05:03,660 --> 00:05:08,660 +Vì vậy, nếu bạn nhìn vào dòng thứ tư, danh sách bên ngoài của + +107 +00:05:09,270 --> 00:05:11,910 +chúng ta là bản đồ với dòng 1, dòng + +108 +00:05:11,910 --> 00:05:15,510 +2, dòng 3 và phần đầu vào xác định dòng nào + +109 +00:05:15,510 --> 00:05:18,060 +chúng ta sẽ chọn thực sự là số, + +110 +00:05:18,060 --> 00:05:20,670 +không phải chữ cái. + +111 +00:05:20,670 --> 00:05:23,400 +Vì vậy, đó là lý do tại sao chỉ mục đầu tiên được + +112 +00:05:23,400 --> 00:05:24,990 +đưa vào là number_index. + +113 +00:05:24,990 --> 00:05:27,540 +Và sau đó, khi chúng ta đã vào đúng dòng + +114 +00:05:27,540 --> 00:05:29,730 +1, dòng 2 hoặc dòng 3, chúng ta + +115 +00:05:29,730 --> 00:05:31,290 +sẽ sử dụng letter_index + +116 +00:05:31,290 --> 00:05:33,210 +để chọn ra phần tử phù hợp trong + +117 +00:05:33,210 --> 00:05:36,840 +danh sách lồng nhau bên trong đó. + +118 +00:05:36,840 --> 00:05:38,940 +Điều này một lần nữa, là một chút tâm trí. + +119 +00:05:38,940 --> 00:05:41,310 +Thật khó để bạn suy nghĩ, nhưng sẽ + +120 +00:05:41,310 --> 00:05:44,070 +không sao nếu bạn thử vài lần, thử mã, thử + +121 +00:05:44,070 --> 00:05:47,040 +một số kết hợp khác nhau và cuối cùng bạn sẽ + +122 +00:05:47,040 --> 00:05:49,200 +hiểu được cách suy nghĩ của lập + +123 +00:05:49,200 --> 00:05:51,300 +trình viên này, hơi khác một chút + +124 +00:05:51,300 --> 00:05:52,890 +so với những gì bạn có thể + +125 +00:05:52,890 --> 00:05:54,660 +làm. đã từng. + +126 +00:05:54,660 --> 00:05:56,010 +Hãy kiên nhẫn với chính mình. + +127 +00:05:56,010 --> 00:05:57,600 +Nếu bạn có bất kỳ thay đổi nào cần thực hiện, hãy + +128 +00:05:57,600 --> 00:05:59,900 +quay lại trang trình bày trước đó và thực hiện ngay bây giờ. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Course-Fixes-Report-an-Issue.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Day 4 Project Rock Paper Scissors.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Day 4 Project Rock Paper Scissors.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7ba43843939654ac7f66c70d772f5dc65c0f5503 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Day 4 Project Rock Paper Scissors.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d663d82431531b9d0ebf607028350f5d68d672beb1faef03a0d9a61bc1a6597 +size 208266542 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Day 4 Project Rock Paper Scissors_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Day 4 Project Rock Paper Scissors_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7d52c34dafdd4387a8a365ef73efce40ebd6e7c1 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Day 4 Project Rock Paper Scissors_vi.srt @@ -0,0 +1,1104 @@ +1 +00:00:00,120 --> 00:00:05,580 +Được rồi, các bạn, bây giờ chúng ta đã nạp đầy đủ kiến thức cần thiết vào bộ não của mình, + +2 +00:00:05,580 --> 00:00:08,730 +đã đến lúc giải quyết dự án cuối cùng trong ngày. + +3 +00:00:09,140 --> 00:00:14,460 +Và như tôi đã giới thiệu cho các bạn vào đầu ngày hôm nay, đó là một trò chơi Rock Paper Scissors mà chúng ta có thể + +4 +00:00:14,460 --> 00:00:15,380 +chơi trên máy tính. + +5 +00:00:16,050 --> 00:00:22,170 +Vì vậy, trò chơi bắt đầu bằng cách yêu cầu bạn gõ 0 cho đá, 1 cho giấy hoặc 2 cho kéo. + +6 +00:00:22,420 --> 00:00:29,820 +Vì vậy, hãy tiếp tục và gõ hai cái kéo, sau đó nó sẽ hiển thị cho bạn một hình ảnh về chiếc kéo mà bạn lựa chọn, và sau đó là lựa chọn + +7 +00:00:30,210 --> 00:00:35,730 +do máy tính tạo ra, đó là sự lựa chọn tuyệt vời. Và tất nhiên, oẳn tù tì để bạn + +8 +00:00:35,730 --> 00:00:36,870 +thua cuộc. + +9 +00:00:37,380 --> 00:00:44,610 +Trò chơi này tóm lại là một số cách ngẫu nhiên đưa ra lựa chọn giữa oẳn tù tì, hoặc kéo và + +10 +00:00:45,030 --> 00:00:50,970 +sau đó so sánh lựa chọn mà máy tính tạo ra ngẫu nhiên với lựa chọn của bạn. + +11 +00:00:51,330 --> 00:00:57,450 +Và sau đó dựa trên các quy tắc oẳn tù tì, và kéo để xác định xem bạn thắng, bạn thua + +12 +00:00:57,450 --> 00:00:59,790 +hoặc liệu bạn có hòa hay không. + +13 +00:01:01,080 --> 00:01:06,570 +Trong khi tôi đang quan sát xung quanh, tôi thực sự bắt gặp hiệp hội oẳn tù tì trên thế giới. + +14 +00:01:07,440 --> 00:01:12,630 +Và họ có các quy tắc chính thức của bang Rock Paper Scissors. + +15 +00:01:13,200 --> 00:01:17,080 +Nếu bạn không quen thuộc với trò chơi này, có thể nên xem trang web này. + +16 +00:01:17,610 --> 00:01:20,100 +Đây là ba hình dạng của đá, giấy, kéo. + +17 +00:01:20,490 --> 00:01:27,330 +Và sau đó luật chơi là oẳn tù tì thắng kéo, kéo thắng trước giấy, và giấy sẽ + +18 +00:01:27,330 --> 00:01:28,440 +thắng đá. + +19 +00:01:29,100 --> 00:01:36,420 +Có tất cả những điều này trong tâm trí, hãy đến replit / @ appbrewery / o-paper-pull-start và tiếp tục + +20 +00:01:36,780 --> 00:01:40,170 +và chỉ cần fork dự án bắt đầu. + +21 +00:01:40,860 --> 00:01:47,700 +Bây giờ bạn sẽ nhận thấy rằng trong dự án bắt đầu, tôi đã có nghệ thuật ASCII cho oẳn tù tì và + +22 +00:01:47,700 --> 00:01:50,870 +kéo ở đây và chúng được lưu vào một biến. + +23 +00:01:51,390 --> 00:01:58,170 +Vì vậy, điều đó có nghĩa là bạn có thể bắt đầu bằng cách in ra một tảng đá. + +24 +00:01:59,040 --> 00:02:01,110 +Và hãy nhớ rằng đây là những tên biến. + +25 +00:02:01,110 --> 00:02:04,410 +Chúng không phải là chuỗi, vì vậy chúng không cần dấu ngoặc kép xung quanh chúng. + +26 +00:02:04,860 --> 00:02:05,910 +Vì vậy, hãy chạy điều đó. + +27 +00:02:05,910 --> 00:02:12,450 +Và bạn có thể thấy những gì chúng tôi nhận được in là nghệ thuật ASCII cụ thể mà tôi đã chọn trong báo cáo in của mình. + +28 +00:02:13,380 --> 00:02:16,080 +Vì vậy, đây đã là của bạn. + +29 +00:02:16,080 --> 00:02:22,890 +Nhưng như bạn sẽ thấy, không có logic nào khác mà tôi đã cung cấp cho bạn và bạn sẽ dựa vào những gì bạn đã học được + +30 +00:02:22,890 --> 00:02:28,650 +trong những ngày trước và quan trọng nhất, những gì bạn đã học được trong các bài học hôm nay để có thể hoàn + +31 +00:02:28,650 --> 00:02:30,090 +thành thử thách này . + +32 +00:02:30,420 --> 00:02:36,330 +Và thật đáng để so sánh kết quả với trò chơi Rock Paper Scissors mà tôi sẽ liên kết. + +33 +00:02:37,200 --> 00:02:42,030 +Có một vài điều cần suy nghĩ, đó là, bạn sẽ quyết định ai thắng hay ai thua? + +34 +00:02:42,330 --> 00:02:49,170 +Bạn sẽ làm thế nào để máy tính chọn một hình dạng ngẫu nhiên, oẳn tù tì, kéo và làm thế nào để trò + +35 +00:02:49,170 --> 00:02:54,420 +chơi này thực sự hoạt động giống như cách được demo trong phiên bản cuối cùng này? + +36 +00:02:55,320 --> 00:02:59,400 +Bây giờ tôi sẽ im lặng và tôi sẽ cho phép bạn tạm dừng video. + +37 +00:02:59,790 --> 00:03:04,980 +Và tôi muốn bạn dành ít nhất mười hoặc mười lăm phút để làm việc này. + +38 +00:03:05,250 --> 00:03:10,170 +Và nếu bạn gặp khó khăn, chỉ cần thử một số thứ hoặc có thể xem một số + +39 +00:03:10,470 --> 00:03:12,840 +video trước đó trong ngày và cố gắng hết + +40 +00:03:12,840 --> 00:03:15,120 +sức mình, và cố gắng rất nhiều. + +41 +00:03:15,510 --> 00:03:16,950 +Hy vọng rằng bạn sẽ thành công. + +42 +00:03:16,950 --> 00:03:20,940 +Và khi bạn đã hoàn tất, hãy quay lại đây và tôi sẽ cùng bạn tìm hiểu giải pháp. + +43 +00:03:21,180 --> 00:03:22,320 +Vì vậy, hãy tạm dừng video ngay bây giờ. + +44 +00:03:25,760 --> 00:03:30,860 +Được rồi, vì vậy chúng tôi biết rằng chúng tôi đã có tất cả nghệ thuật ASCII này, nhưng hiện + +45 +00:03:30,860 --> 00:03:35,150 +tại, tôi chỉ bắt đầu bằng cách đặt ra logic cơ bản của trò chơi này. + +46 +00:03:35,570 --> 00:03:41,840 +Và nó cũng thực sự hữu ích cho bạn nếu bạn bắt đầu nghĩ đến việc chia nhỏ vấn đề lớn hơn, đó + +47 +00:03:41,840 --> 00:03:47,930 +là biến trò chơi Rock Paper Scissors thành những vấn đề nhỏ hơn mà bạn có thể giải quyết, như tạo một + +48 +00:03:47,930 --> 00:03:50,110 +số ngẫu nhiên từ một đến ba. + +49 +00:03:50,420 --> 00:03:55,820 +Vì vậy, chúng tôi có một số loại proxy cho Rock Paper Scissors. Và sau đó có thể suy nghĩ + +50 +00:03:55,820 --> 00:04:02,360 +về việc đặt logic xuống, tốt, nếu máy tính chọn kéo và tôi chọn giấy, thì tôi sẽ thua. + +51 +00:04:02,690 --> 00:04:07,150 +Hoặc nếu máy tính chọn rock và tôi chọn giấy, thì tôi sẽ thắng. + +52 +00:04:07,550 --> 00:04:14,270 +Và đưa điều đó xuống một sơ đồ bằng cách sử dụng vẽ. io hoặc thứ gì đó tương tự cũng có thể làm cho thử thách này dễ + +53 +00:04:14,270 --> 00:04:15,350 +dàng hơn rất nhiều. + +54 +00:04:16,579 --> 00:04:22,100 +Nhưng không cần phải quảng cáo thêm, điều đầu tiên tôi cần làm là đưa ra lựa chọn của người dùng. + +55 +00:04:22,610 --> 00:04:28,120 +Bây giờ, đây sẽ là giá trị mà người dùng đã chọn khi họ nhập một giá trị. + +56 +00:04:28,610 --> 00:04:32,900 +Và để nhận được giá trị từ chúng, tôi sẽ cần sử dụng đầu vào. + +57 +00:04:33,440 --> 00:04:40,610 +Và bên trong đầu vào, tôi sẽ đặt lời nhắc sau đây hỏi người dùng, bạn chọn gì? + +58 +00:04:40,610 --> 00:04:44,180 +Loại 0 cho đá, 1 cho giấy hoặc 2 cho kéo. + +59 +00:04:44,750 --> 00:04:51,140 +Bây giờ, khi tôi nắm được thông tin đầu vào này, hy vọng nếu người dùng làm theo hướng dẫn của tôi, họ + +60 +00:04:51,140 --> 00:04:54,610 +sẽ nhập một số loại số, không hoặc một hoặc hai. + +61 +00:04:55,190 --> 00:05:01,130 +Bây giờ tôi đã nắm được những gì người dùng muốn chọn, điều tiếp theo cần làm là tìm ra những + +62 +00:05:01,130 --> 00:05:02,690 +gì máy tính sẽ chọn. + +63 +00:05:03,080 --> 00:05:09,050 +Vì vậy, tôi sẽ tạo một biến khác có tên là computer_choice và tôi sẽ tạo một số ngẫu nhiên. + +64 +00:05:09,410 --> 00:05:13,070 +Vì vậy, để làm điều đó, hãy nhớ rằng, chúng ta phải nhập mô-đun ngẫu nhiên. + +65 +00:05:15,020 --> 00:05:22,250 +Và sau đó chúng ta có thể bắt đầu sử dụng nó để tạo các số nguyên ngẫu nhiên bằng cách sử dụng ngẫu nhiên. randint. + +66 +00:05:23,090 --> 00:05:30,170 +Và sau đó phạm vi sẽ nằm trong khoảng từ 0 đến 2, bởi vì đây là những gì tôi yêu cầu người dùng làm. + +67 +00:05:30,170 --> 00:05:33,190 +Loại 0 cho đá, 1 cho giấy, 2 cho kéo. + +68 +00:05:33,530 --> 00:05:37,850 +Vì vậy, máy tính cũng sẽ chọn giữa 0, 1 hoặc 2. + +69 +00:05:39,110 --> 00:05:44,870 +Bây giờ tôi đã có computer_choice, tôi thực sự sẽ chỉ in nó ra bây giờ thay vì + +70 +00:05:44,870 --> 00:05:48,860 +in ra hình dạng thực tế, tôi sẽ chỉ in ra số. + +71 +00:05:48,890 --> 00:05:54,680 +Vì vậy, máy tính đã chọn và sau đó chúng ta hãy tiếp tục và thêm một chuỗi. + +72 +00:05:57,020 --> 00:06:00,300 +Và tất nhiên, điều đó yêu cầu F ở phía trước của chuỗi. + +73 +00:06:01,130 --> 00:06:07,130 +Vì vậy, bây giờ nếu chúng ta chỉ chơi trò chơi như nó vốn có, hãy nhớ rằng thử nghiệm trong khi bạn đang phát triển nó thực + +74 +00:06:07,130 --> 00:06:08,150 +sự rất, rất tốt. + +75 +00:06:08,360 --> 00:06:14,120 +Nó sẽ tìm ra những lỗi mà bạn mắc phải thay vì đợi đến cuối khi bạn đã hoàn thành mọi thứ và + +76 +00:06:14,120 --> 00:06:14,540 +sau + +77 +00:06:14,540 --> 00:06:18,500 +đó nó không hoạt động và bạn phải gỡ rối tất cả các dòng mã. + +78 +00:06:19,160 --> 00:06:24,200 +Tại thời điểm này, tôi đã nhận ra rằng việc người dùng gõ vào dòng này thực sự không quá tuyệt + +79 +00:06:24,200 --> 00:06:24,670 +vời. + +80 +00:06:25,460 --> 00:06:29,940 +Điều tôi muốn là bắt đầu một dòng mới để họ nhập câu trả lời của họ. + +81 +00:06:30,560 --> 00:06:34,040 +Vì vậy, nếu tôi chạy lại mã, thì nó sẽ trông giống như thế này. + +82 +00:06:34,040 --> 00:06:37,970 +Lời nhắc của tôi bây giờ là ở đây. Vì vậy, tôi sẽ chọn 0 cho Rock. + +83 +00:06:38,510 --> 00:06:41,840 +Và sau đó nó cho tôi biết rằng máy tính cũng chọn số không. + +84 +00:06:42,290 --> 00:06:44,000 +Vì vậy, trong trường hợp này, đây sẽ là một trận hòa. + +85 +00:06:44,450 --> 00:06:49,730 +Nhưng nếu tôi chơi lại trò chơi này, bạn có thể thấy rằng máy tính có thể sẽ chọn thứ gì + +86 +00:06:49,730 --> 00:06:50,260 +đó khác. + +87 +00:06:50,450 --> 00:06:51,860 +Vì vậy, tôi chọn rock một + +88 +00:06:51,860 --> 00:06:54,140 +lần nữa máy tính đã chọn 1, đó là giấy. + +89 +00:06:54,950 --> 00:07:02,960 +Vì vậy, bây giờ chúng ta có thể bắt đầu suy nghĩ về cách chúng ta so sánh hai lựa chọn này và làm thế nào chúng ta có thể xác + +90 +00:07:02,960 --> 00:07:04,610 +định logic của Rock Paper Scissors? + +91 +00:07:05,240 --> 00:07:12,230 +Vì vậy, tôi biết rằng giấy đánh bại đá, kéo đập giấy và đá sẽ đánh bại kéo. + +92 +00:07:12,680 --> 00:07:21,280 +Vì vậy, nếu số không là đá, một là giấy và hai là kéo, thì hai phách một và một là số không. + +93 +00:07:21,590 --> 00:07:28,280 +Vì vậy, rất đơn giản để chúng ta kiểm tra trong điều kiện sử dụng câu lệnh if, phải không? + +94 +00:07:28,280 --> 00:07:29,930 +Chúng ta có thể chỉ + +95 +00:07:30,410 --> 00:07:40,550 +cần kiểm tra tốt, nếu lựa chọn của máy tính lớn hơn lựa chọn của người dùng, thì điều này có thể có nghĩa là máy + +96 +00:07:40,760 --> 00:07:42,350 +tính đó thắng. + +97 +00:07:43,590 --> 00:07:51,810 +Nhưng điều này không đúng trong mọi trường hợp, phải không? Bởi vì nếu máy tính chọn 2 để kéo và người dùng + +98 +00:07:51,810 --> 00:07:57,240 +chọn 0 cho đá, thì người dùng nên thắng chứ không phải là máy tính thắng. + +99 +00:07:57,450 --> 00:08:01,880 +Vì vậy, chúng tôi thực sự có một số ngoại lệ cho quy tắc này. + +100 +00:08:02,790 --> 00:08:08,520 +Làm thế nào chúng ta có thể nắm bắt các ngoại lệ trước khi chúng ta đi xuống mức độ tổng quát hóa này? + +101 +00:08:09,240 --> 00:08:16,830 +Chà, chúng ta có thể thay vì sử dụng giá trị này dưới dạng if, chúng ta sử dụng nó như + +102 +00:08:16,830 --> 00:08:27,210 +một elif và chúng ta tạo một câu lệnh if khác có nội dung là, nếu user_choice bằng 0, vì vậy nếu người dùng chọn rock và computer_choice là + +103 +00:08:27,660 --> 00:08:34,169 +2, thì thì điều này có nghĩa là trong trường hợp này, người dùng thực sự thắng. + +104 +00:08:35,950 --> 00:08:41,140 +Bây giờ, nếu chúng ta đang nghĩ từ góc độ của người dùng khi họ chơi trò chơi này, thì họ không + +105 +00:08:41,140 --> 00:08:47,430 +thực sự quan tâm đến việc máy tính thắng hay người dùng thắng. Họ muốn biết, họ đã thắng hay đã thua? + +106 +00:08:47,890 --> 00:08:50,080 +Vì vậy, hãy thay đổi từ ngữ này một chút. + +107 +00:08:50,350 --> 00:08:54,930 +Chúng tôi sẽ nói, thay vì người dùng thắng, chúng tôi sẽ nói rằng bạn thắng. + +108 +00:08:56,020 --> 00:09:00,730 +Và nếu máy tính thắng, thì chúng tôi sẽ nói bạn thua. + +109 +00:09:01,690 --> 00:09:10,510 +Vì vậy, bây giờ nếu chúng tôi chạy chương trình của mình và kiểm tra nó, giả sử tôi sẽ nhập 0 cho rock và + +110 +00:09:10,510 --> 00:09:14,590 +máy tính chọn 2, nhưng chúng tôi thực sự gặp lỗi. + +111 +00:09:14,740 --> 00:09:22,770 +Nó cho chúng ta biết rằng so sánh lớn hơn không được hỗ trợ giữa các trường hợp của int và string. + +112 +00:09:23,200 --> 00:09:24,100 +Những gì đang xảy ra ở đây? + +113 +00:09:24,310 --> 00:09:32,830 +À, hãy nhớ rằng chúng ta lấy đầu vào dưới dạng số, nhưng đầu vào luôn là một chuỗi. + +114 +00:09:33,340 --> 00:09:34,900 +Vì vậy, nếu chúng ta muốn đây + +115 +00:09:34,900 --> 00:09:37,910 +là một số, thì chúng ta sẽ phải bọc nó bên trong một số nguyên. + +116 +00:09:38,500 --> 00:09:41,020 +Vì vậy, bây giờ chúng ta chuyển nó thành một số nguyên. + +117 +00:09:42,070 --> 00:09:43,880 +Bây giờ, đây có thể là một điểm + +118 +00:09:43,900 --> 00:09:49,950 +tốt để giải quyết tốt, điều gì sẽ xảy ra nếu họ gõ một cái gì đó không phải là 0, 1 hoặc 2, cho dù họ đã gõ 34? + +119 +00:09:50,440 --> 00:09:52,780 +Chà, vậy thì tự nhiên có lẽ họ sẽ thua, phải + +120 +00:09:52,780 --> 00:09:53,070 +không? + +121 +00:09:53,290 --> 00:10:01,060 +Vì vậy, chúng tôi có thể thêm một câu lệnh khác giải quyết tình huống này. Vì vậy, chúng tôi có thể nói cách khác, chúng tôi chỉ + +122 +00:10:01,360 --> 00:10:04,310 +in Bạn đã nhập một số không hợp lệ. + +123 +00:10:05,020 --> 00:10:07,480 +Bạn đã thua. Mát mẻ. + +124 +00:10:07,540 --> 00:10:08,690 +Vì vậy, đó là loại ra. + +125 +00:10:09,100 --> 00:10:13,060 +Bây giờ chúng ta hãy chạy lại mã của chúng ta và xem nó có hoạt động không. + +126 +00:10:13,270 --> 00:10:13,990 +Bạn chọn cái gì? + +127 +00:10:13,990 --> 00:10:15,130 +Nhập 0 cho Rock. + +128 +00:10:15,160 --> 00:10:16,440 +Tôi sẽ chọn rock một lần nữa. + +129 +00:10:16,960 --> 00:10:21,970 +Máy tính đã chọn số 0 và nó cho tôi biết rằng bạn đã nhập một số không hợp lệ. + +130 +00:10:22,960 --> 00:10:26,000 +Thực ra, số 0 không phải là một số không hợp lệ. + +131 +00:10:26,020 --> 00:10:27,280 +Vậy điều gì đang xảy ra ở đây? + +132 +00:10:27,820 --> 00:10:30,930 +Chà, đó là vì nó không phù hợp với tiêu chí này. + +133 +00:10:31,630 --> 00:10:32,830 +Vì vậy, tôi đã + +134 +00:10:32,830 --> 00:10:39,530 +có số 0, máy tính có số 0 và nó không phù hợp với tiêu chí này vì số 0 không lớn hơn 0. + +135 +00:10:40,000 --> 00:10:43,720 +Vì vậy, về cơ bản nó được mặc định là câu lệnh else cuối cùng. + +136 +00:10:44,440 --> 00:10:48,350 +Nhưng những gì thực sự đang xảy ra ở đây là một trận hòa. + +137 +00:10:48,940 --> 00:10:50,050 +Máy tính chọn rock, + +138 +00:10:50,050 --> 00:10:50,940 +tôi chọn rock. + +139 +00:10:51,100 --> 00:10:55,840 +Đó là kết quả hòa trong các quy tắc chính thức của Rock Paper Scissors. + +140 +00:10:56,620 --> 00:10:58,660 +Vậy làm cách nào để nắm bắt được điều đó? + +141 +00:10:58,690 --> 00:11:05,650 +Chà, tôi có thể tạo một câu lệnh elif khác nói rằng, nếu computer_choice bằng với user_choice, + +142 +00:11:05,650 --> 00:11:08,610 +thì chúng ta sẽ in nó là một + +143 +00:11:09,520 --> 00:11:10,690 +trận hòa. + +144 +00:11:12,130 --> 00:11:17,680 +Bây giờ, hãy kiểm tra lại ứng dụng của chúng tôi và xem liệu có bất kỳ tình huống nào khác mà mã của chúng tôi hoạt động không bình + +145 +00:11:17,680 --> 00:11:18,250 +thường hay không. + +146 +00:11:19,030 --> 00:11:23,350 +Tôi sẽ chọn rock một lần nữa, máy tính cũng chọn rock. + +147 +00:11:23,560 --> 00:11:26,150 +Và tôi đoán đó là một trận hòa, vì vậy điều đó khá tốt. + +148 +00:11:27,850 --> 00:11:33,970 +Bây giờ, nếu tôi chọn 0 và máy tính chọn 2, thì đây sẽ là câu lệnh được + +149 +00:11:33,970 --> 00:11:35,830 +kích hoạt và tôi thắng. + +150 +00:11:35,980 --> 00:11:37,030 +Vì vậy, đó là khá tốt. + +151 +00:11:37,960 --> 00:11:44,030 +Bây giờ, điều gì sẽ xảy ra nếu tôi chọn 2 cho cái kéo và máy tính chọn 0? + +152 +00:11:44,980 --> 00:11:48,270 +Chà, trong trường hợp này, oẳn tù tì nên thực + +153 +00:11:48,280 --> 00:11:50,770 +ra nó phải nói là tôi thua. + +154 +00:11:51,310 --> 00:11:54,250 +Nhưng thay vào đó, nó cho biết bạn đã nhập một số không hợp lệ. + +155 +00:11:54,640 --> 00:12:02,260 +Vì vậy, nó lại mặc định thành câu lệnh else vì tình huống cụ thể này không bị bắt bởi bất kỳ câu lệnh nào trong + +156 +00:12:02,260 --> 00:12:03,070 +số này. + +157 +00:12:03,940 --> 00:12:05,590 +Vậy thay vào đó chúng ta phải làm gì? + +158 +00:12:06,070 --> 00:12:15,250 +Chà, chúng ta thực sự cần một elif khác để nói rằng, nếu computer_choice bằng 0 và user_choice + +159 +00:12:15,250 --> 00:12:21,510 +bằng 2, thì, điều này có nghĩa là trò oẳn tù tì + +160 +00:12:21,760 --> 00:12:25,480 +nên tôi thua và máy tính thắng. + +161 +00:12:26,320 --> 00:12:30,040 +Bây giờ, điều cuối cùng mà chúng ta cần nắm bắt là trường hợp này. + +162 +00:12:30,640 --> 00:12:39,430 +Nếu tôi gõ 1 cho giấy và máy tính chọn 0 cho rock, nó lại mặc định là các câu lệnh khác trong khi thực tế trong trường + +163 +00:12:40,120 --> 00:12:43,870 +hợp này, nó sẽ cho tôi biết rằng tôi đã thắng. + +164 +00:12:44,500 --> 00:12:45,820 +Vậy điều gì còn thiếu ở đây? + +165 +00:12:46,090 --> 00:12:49,740 +Vâng, đó là đối tác của tuyên bố cụ thể này. + +166 +00:12:50,350 --> 00:12:54,360 +Nếu computer_choice lớn hơn user_choice thì tôi thua. + +167 +00:12:54,700 --> 00:13:03,070 +Nhưng mặt khác, nếu user_choice lớn hơn computer_choice, thì tôi thực sự nên thắng. + +168 +00:13:05,730 --> 00:13:15,480 +Vì vậy, bây giờ điều cuối cùng chúng ta có thể phải sửa là câu lệnh else này thực sự không bao giờ được gọi bởi vì đây là những + +169 +00:13:15,480 --> 00:13:16,980 +gì sẽ xảy ra. + +170 +00:13:17,430 --> 00:13:20,460 +Vì vậy, giả sử rằng tôi chọn 456. + +171 +00:13:20,910 --> 00:13:23,730 +Nó cho tôi biết rằng máy tính đã chọn 2, tôi thắng. + +172 +00:13:24,060 --> 00:13:24,930 +Điều gì đang xảy ra ở đây? + +173 +00:13:24,960 --> 00:13:29,970 +Chà, nó thực sự là dòng cụ thể này đang được thực hiện. + +174 +00:13:29,970 --> 00:13:32,320 +user_choice lớn hơn computer_choice. + +175 +00:13:32,820 --> 00:13:34,080 +Đây không phải là những gì chúng tôi muốn. + +176 +00:13:34,090 --> 00:13:35,910 +Chúng tôi muốn nó để mặc định là Bạn + +177 +00:13:36,210 --> 00:13:37,650 +đã nhập một số không hợp lệ. + +178 +00:13:37,650 --> 00:13:42,690 +Bạn đã thua. Vì vậy, chúng tôi thực sự chỉ có thể sử dụng else trong tình huống này. + +179 +00:13:43,260 --> 00:13:45,540 +Chúng tôi thực sự cần cung cấp một điều kiện. + +180 +00:13:46,380 --> 00:13:54,610 +Chúng tôi sẽ sử dụng elif để kiểm tra xem user_choice lớn hơn hay bằng ba, bây giờ, máy tính sẽ không bao giờ chọn + +181 +00:13:55,500 --> 00:13:59,910 +bất kỳ thứ gì khác 0, 1 và 2 nên chúng tôi không phải + +182 +00:13:59,910 --> 00:14:01,530 +kiểm tra cái đó. + +183 +00:14:01,800 --> 00:14:06,230 +Nhưng người dùng có thể chọn một cái gì đó trên 3 hoặc dưới 0. + +184 +00:14:06,450 --> 00:14:14,530 +Vì vậy, chúng ta có thể sử dụng một hoặc câu lệnh để bắt điều này. Hoặc nếu user_choice nhỏ hơn 0, tốt, trong trường hợp này, bạn + +185 +00:14:15,180 --> 00:14:18,900 +đã nhập một số không hợp lệ, bạn sẽ thua cuộc. + +186 +00:14:19,740 --> 00:14:22,110 +Nhưng đó không phải là tất cả những gì chúng ta phải làm. + +187 +00:14:22,410 --> 00:14:29,760 +Nếu chúng tôi nhấn run và chúng tôi lại gõ một số cực kỳ lớn, bạn sẽ thấy rằng nó vẫn cho biết máy + +188 +00:14:29,760 --> 00:14:31,230 +tính đã chọn 1. + +189 +00:14:31,230 --> 00:14:32,040 +Bạn thắng. + +190 +00:14:32,520 --> 00:14:33,240 +Chuyện gì đang xảy ra vậy? + +191 +00:14:33,240 --> 00:14:39,290 +Chúng tôi có tuyên bố này nên nắm bắt được tình huống này, nhưng nó nằm ngay dưới cùng. + +192 +00:14:39,510 --> 00:14:44,370 +Vì vậy, nó sẽ không được kiểm tra cho đến khi một trong những cái trước đó được kiểm tra. + +193 +00:14:44,880 --> 00:14:48,720 +Cụ thể, đó là một trong những vấn đề này sẽ là vấn đề. + +194 +00:14:49,260 --> 00:14:57,240 +Vì vậy, những gì chúng ta phải làm là chúng ta phải di chuyển câu lệnh này lên trên tất cả các dòng để trước tiên + +195 +00:14:57,240 --> 00:15:02,390 +chúng ta kiểm tra xem user_choice có lớn hơn ba hay nhỏ hơn 0 hay không. + +196 +00:15:03,060 --> 00:15:08,850 +Và nếu điều đó không đúng, chúng tôi thực sự tiếp tục kiểm tra xem ai đã thắng trò chơi. + +197 +00:15:09,750 --> 00:15:16,830 +Bây giờ, cuối cùng, chúng tôi có thể chạy mã của mình nhập một số không hợp lệ và giúp bạn nhập một số không hợp lệ. Bạn đã thua. + +198 +00:15:18,120 --> 00:15:24,600 +Vì vậy, bây giờ chúng ta đã thực sự sắp xếp xong logic của mình, bước tiếp theo là bao gồm các hình ảnh của chúng ta. + +199 +00:15:25,320 --> 00:15:29,340 +Và để làm được điều đó, chúng ta phải bằng cách nào đó khớp nó với những con số mà chúng ta + +200 +00:15:29,340 --> 00:15:30,870 +có, phải không? 0, 1 và 2. + +201 +00:15:31,590 --> 00:15:36,870 +Bây giờ, có rất nhiều cách mà bạn có thể làm điều này và bạn có thể giải quyết dự án này. + +202 +00:15:37,230 --> 00:15:45,540 +Nhưng cách dễ nhất có lẽ là đưa các hình ảnh trò chơi vào một danh sách trong đó chúng ta có đá là hình + +203 +00:15:45,540 --> 00:15:50,170 +đầu tiên, giấy là hình thứ hai và kéo là hình cuối cùng. + +204 +00:15:50,640 --> 00:15:58,410 +Vì vậy, chúng tôi đang sử dụng thực tế là các danh sách có thứ tự luôn được tuân theo. Vì vậy, bây giờ chúng ta có thể nắm bắt + +205 +00:15:58,410 --> 00:16:02,060 +bức tranh đá bằng cách tải game_images [0]. + +206 +00:16:02,400 --> 00:16:09,570 +Chúng ta có thể lấy kéo bằng cách thực hiện game_images [2], vân vân và vân vân. Và chúng tôi có thể so khớp những thứ đó theo + +207 +00:16:09,570 --> 00:16:12,210 +lựa chọn của chúng tôi, user_choice và computer_choice. + +208 +00:16:12,810 --> 00:16:20,790 +Vì vậy, khi người dùng chọn một số, sau đó chúng tôi sẽ in từ game_images và chúng tôi sẽ sử dụng + +209 +00:16:20,790 --> 00:16:26,340 +dấu ngoặc vuông nhỏ để chọn hình ảnh chúng tôi muốn từ danh sách này. + +210 +00:16:26,790 --> 00:16:31,140 +Và cái mà chúng tôi muốn sẽ dựa trên sự lựa chọn của người dùng, phải không? + +211 +00:16:31,320 --> 00:16:33,630 +0 cho đá, 1 cho giấy, 2 cho kéo. + +212 +00:16:33,960 --> 00:16:42,600 +Vì vậy, chúng tôi sẽ đặt user_choice làm chỉ mục để chọn một hình ảnh từ game_images. Bây giờ ở đây cho computer_choice, thay vì in + +213 +00:16:42,600 --> 00:16:49,950 +số mà máy tính đã chọn, tôi sẽ xóa số đó và thêm một dấu hai + +214 +00:16:49,950 --> 00:16:51,480 +chấm nhỏ. + +215 +00:16:52,680 --> 00:16:56,550 +Vì vậy, theo cách đó, nó sẽ hiển thị máy tính đã + +216 +00:16:56,910 --> 00:17:02,130 +chọn và sau đó tôi sẽ in hình ảnh của lựa chọn mà máy tính đã thực hiện. + +217 +00:17:02,520 --> 00:17:04,290 +Vì vậy, tôi sẽ thêm + +218 +00:17:04,560 --> 00:17:10,890 +một câu lệnh in khác, tôi sẽ nhấn vào game_images và sau đó bên trong một số dấu ngoặc vuông, tôi + +219 +00:17:11,130 --> 00:17:17,819 +sẽ sử dụng lựa chọn máy tính sẽ nằm giữa 0, 1 và 2 làm chỉ mục để chọn hình ảnh tương + +220 +00:17:18,180 --> 00:17:20,339 +ứng từ danh sách game_images của tôi. + +221 +00:17:20,930 --> 00:17:28,170 +Vì vậy, bây giờ cuối cùng chúng tôi đã sẵn sàng để chạy mã của mình và tôi sẽ chọn 0 cho rock và máy tính + +222 +00:17:28,170 --> 00:17:28,920 +chọn giấy. + +223 +00:17:29,220 --> 00:17:31,920 +Vì vậy, giấy đánh bại rock, tôi thua. + +224 +00:17:32,790 --> 00:17:33,840 +Hãy thử lại lần nữa. + +225 +00:17:33,840 --> 00:17:37,860 +Tôi sẽ chọn kéo và máy tính đã chọn kéo. + +226 +00:17:37,860 --> 00:17:42,090 +Đó là một trận hòa. Nhưng chúng tôi cũng đã giới thiệu một lỗi. + +227 +00:17:42,690 --> 00:17:47,730 +Vì vậy, nếu chúng tôi kiểm tra điều này bằng cách sử dụng một số nằm ngoài phạm vi này, 0, + +228 +00:17:47,730 --> 00:17:51,330 +1 hoặc 2, vậy hãy thử 5. Và chúng ta nhấn enter, chúng ta nhận + +229 +00:17:51,330 --> 00:17:52,020 +được gì? + +230 +00:17:52,050 --> 00:17:53,970 +Chúng tôi gặp lỗi chỉ mục. + +231 +00:17:54,480 --> 00:17:56,110 +Vậy điều gì đã xảy ra ở đây? + +232 +00:17:56,250 --> 00:17:58,680 +Vâng, điều này là vào bạn để gỡ lỗi. + +233 +00:17:59,070 --> 00:18:02,970 +Chà, đây là một cơ hội thực sự tốt để bạn thực hành gỡ lỗi của mình. + +234 +00:18:03,300 --> 00:18:04,620 +Vì vậy, hãy nghĩ về + +235 +00:18:04,730 --> 00:18:12,280 +những gì đã thay đổi kể từ lần cuối cùng chúng tôi kiểm tra điều này và cách bạn có thể sửa mã để nó hoạt động như mong đợi, vì vậy, cho + +236 +00:18:12,590 --> 00:18:18,290 +chúng tôi biết rằng bạn đã nhập một số không hợp lệ, bạn sẽ mất bất cứ khi nào chúng tôi nhập một số + +237 +00:18:18,290 --> 00:18:20,360 +lớn hơn hoặc bằng ba hoặc nhỏ hơn 0. + +238 +00:18:20,840 --> 00:18:25,880 +Vì vậy, tôi muốn bạn tạm dừng video và xem liệu bạn có thể gỡ lỗi thử thách này hay không để khi bạn nhập + +239 +00:18:26,090 --> 00:18:29,330 +5, bạn sẽ in được thông báo này. Tạm dừng video ngay bây giờ. + +240 +00:18:32,680 --> 00:18:39,070 +Được rồi, vậy điều gì đang xảy ra ở đây, vì chúng tôi đã thử nghiệm điều này và nó hoạt động, nhưng + +241 +00:18:39,070 --> 00:18:46,480 +giữa thời gian đó, chúng tôi cũng thêm dòng này vì chúng tôi muốn nắm giữ hình ảnh trò chơi dựa trên lựa chọn của người dùng. + +242 +00:18:46,930 --> 00:18:51,490 +Bây giờ, tại thời điểm này, lựa chọn của người dùng không được kiểm tra bởi câu lệnh if. + +243 +00:18:51,850 --> 00:18:56,110 +Vì vậy, nó vẫn có thể bằng 4 hoặc 5 hoặc 10 hoặc một triệu. + +244 +00:18:56,560 --> 00:19:04,300 +Vì vậy, nếu trong trường hợp đó, nó cố gắng lấy hình ảnh thứ năm từ danh sách game_images, thì nó không tồn + +245 +00:19:04,300 --> 00:19:04,690 +tại. + +246 +00:19:04,810 --> 00:19:06,850 +Chỉ có 0, 1 và 2. + +247 +00:19:07,750 --> 00:19:14,500 +Vì vậy, để khắc phục điều này, chúng ta cần di chuyển câu lệnh if này để nó được kiểm tra trước khi dòng mã này + +248 +00:19:14,500 --> 00:19:15,370 +được thực hiện. + +249 +00:19:15,940 --> 00:19:22,330 +Vì vậy, hãy tiếp tục và cắt dòng mã này ra và đặt nó ngay trên câu lệnh in này. + +250 +00:19:22,840 --> 00:19:30,340 +Vì vậy, trong trường hợp này, nếu người dùng nhập một lựa chọn lớn hơn hoặc bằng ba hoặc nhỏ hơn 0, chúng + +251 +00:19:30,670 --> 00:19:32,020 +tôi sẽ in ra. + +252 +00:19:32,440 --> 00:19:38,670 +Nhưng ngược lại, nếu họ nhập bất kỳ số nào khác, thì chúng tôi muốn phần còn lại của mã tiếp tục. + +253 +00:19:39,010 --> 00:19:44,070 +Vì vậy, chúng ta hãy chọn phần còn lại của mã, nhấn tab và chuyển nó qua để phần + +254 +00:19:44,080 --> 00:19:46,510 +đó được bao gồm trong câu lệnh else. + +255 +00:19:47,050 --> 00:19:54,010 +Bây giờ hãy tiếp tục và thay đổi điều này từ elif just thành if vì chúng ta không còn kiểm tra nó như một câu + +256 +00:19:54,010 --> 00:19:54,430 +lệnh + +257 +00:19:54,430 --> 00:19:56,890 +else- if khác nữa. Nó + +258 +00:19:56,890 --> 00:20:05,590 +chỉ là một thẳng lên nếu. Vì vậy, trong trường hợp này, nếu họ gõ 5, thì nó sẽ đi vào rổ này và nó sẽ kết thúc ở đó. + +259 +00:20:05,890 --> 00:20:10,670 +Nhưng nếu không, nó sẽ đi vào giỏ này và nó sẽ tiếp tục kiểm tra sau này. + +260 +00:20:11,260 --> 00:20:14,570 +Vì vậy, bạn đã quản lý để gỡ lỗi mã của bạn và tìm ra vấn đề? + +261 +00:20:15,040 --> 00:20:17,320 +Đây là một trong những kỹ năng quan + +262 +00:20:17,320 --> 00:20:21,760 +trọng nhất của một lập trình viên. Bạn có rất nhiều cơ hội sắp tới để thực hành gỡ lỗi của mình. + +263 +00:20:22,330 --> 00:20:27,790 +Và nếu bạn muốn thực hành nhiều hơn, hãy xem phần Hỏi và Đáp và xem những sinh viên khác gặp vấn đề gì và xem + +264 +00:20:27,790 --> 00:20:31,810 +liệu bạn có thể giúp họ bằng cách thực hành kỹ năng gỡ lỗi của mình hay không. + +265 +00:20:32,590 --> 00:20:40,570 +Bây giờ, chúng tôi đã hoàn thành dự án bằng cách sử dụng mọi thứ từ danh sách đến ngẫu nhiên hóa đến các biến cho + +266 +00:20:40,570 --> 00:20:43,370 +đến câu lệnh if và rất nhiều logic. + +267 +00:20:43,630 --> 00:20:47,660 +Vì vậy, làm thế nào bạn có được với dự án này? Nếu bạn gặp khó khăn, đây + +268 +00:20:47,680 --> 00:20:54,970 +là lúc một lần nữa để quay lại với nó và có thể vạch ra mọi thứ bằng cách sử dụng sơ đồ luồng hoặc + +269 +00:20:54,970 --> 00:20:59,080 +thử chạy mã bằng Thonny để xem nó hoạt động như thế nào từng bước. + +270 +00:20:59,590 --> 00:21:04,180 +Nhưng điều quan trọng là bạn phải viết mã của riêng mình và bạn phải làm cho nó hoạt động. + +271 +00:21:04,420 --> 00:21:09,580 +Và đây là cách duy nhất để bạn hiểu chuyện gì đang xảy ra để có thể tiếp tục. + +272 +00:21:09,910 --> 00:21:15,670 +Và khi mọi thứ trở nên khó khăn hơn, bạn sẽ có thể học được nhiều hơn vì bạn đã hiểu tất cả các kiến + +273 +00:21:15,670 --> 00:21:16,570 +thức trước đó. + +274 +00:21:17,320 --> 00:21:19,150 +Vì vậy, tôi hy vọng bạn đã vui vẻ + +275 +00:21:19,150 --> 00:21:24,550 +với tôi ngày hôm nay trong việc học tập và xây dựng, và hy vọng tôi sẽ gặp lại bạn vào ngày mai tươi sáng và sớm mai. + +276 +00:21:24,880 --> 00:21:27,100 +Vì vậy, đó là một đêm tốt từ tôi cho ngày hôm nay. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Rock-Paper-Scissors-Starter-Code.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Rock-Paper-Scissors-Starter-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..2c70d96c105d67be38d43ccc6293446a79fe3998 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Rock-Paper-Scissors-Starter-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/rock-paper-scissors-start \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Solution-Rock-Paper-Scissors-Completed-Code.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Solution-Rock-Paper-Scissors-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..adcff08f2e24ab3264b29ba4e7f1b29c109c2993 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 Solution-Rock-Paper-Scissors-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/rock-paper-scissors-end \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 The-World-Rock-Paper-Scissors-Association.url b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 The-World-Rock-Paper-Scissors-Association.url new file mode 100644 index 0000000000000000000000000000000000000000..0927fe6f733e2587ff16a94fea37fd78f6d5bb2c --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/009 The-World-Rock-Paper-Scissors-Association.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.wrpsa.com/ \ No newline at end of file diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/010 Programming is like going to the Gym.mp4 b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/010 Programming is like going to the Gym.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..dd640f5bf19efc255d363467084d30015aa48bc3 --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/010 Programming is like going to the Gym.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e61d8fe5c873bf2763ddade829289ea49735f0bdee4f85aa923ca1c373a574e +size 39068650 diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/010 Programming is like going to the Gym_vi.srt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/010 Programming is like going to the Gym_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..92f3d1fb95aed6020b618d3a7ab72f6e32b665df --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/010 Programming is like going to the Gym_vi.srt @@ -0,0 +1,72 @@ +1 +00:00:01,290 --> 00:00:04,350 +Này, rất tốt vì đã hoàn thành ngày thứ 4. + +2 +00:00:04,560 --> 00:00:06,930 +Tôi có thể thấy rằng bạn đang thực sự + +3 +00:00:06,960 --> 00:00:10,530 +lặp đi lặp lại, tập luyện. Và đây là những gì sẽ đưa bạn thực + +4 +00:00:10,890 --> 00:00:15,090 +sự tiến xa, bởi vì chúng ta đều biết rằng lập trình không phải là thứ mà bạn chỉ có thể + +5 +00:00:15,090 --> 00:00:17,460 +học một cách thụ động. Bạn không thể ngồi + +6 +00:00:17,730 --> 00:00:21,840 +trước TV, xem ai đó nói về lập trình và đột nhiên trở thành lập trình viên. + +7 +00:00:22,230 --> 00:00:24,270 +Bạn phải bỏ thời gian và nỗ lực. + +8 +00:00:24,510 --> 00:00:26,610 +Nó hơi giống như đi đến phòng tập thể dục thực sự. + +9 +00:00:26,940 --> 00:00:29,370 +Bạn sẽ không bao giờ trở nên cơ bắp và mạnh mẽ + +10 +00:00:29,580 --> 00:00:34,290 +nếu chỉ xem một buổi biểu diễn thể hình, phải không? Thậm chí, bạn biết đấy, nếu bạn + +11 +00:00:34,290 --> 00:00:38,790 +xem Arnold Schwartzenegger mỗi ngày, 8 tiếng, 8 tiếng mỗi ngày, bạn sẽ + +12 +00:00:39,330 --> 00:00:43,980 +không bao giờ phát triển được những cơ mà anh ấy có trừ khi + +13 +00:00:43,980 --> 00:00:47,850 +bạn thực sự tập gym. Vì vậy, phiên bản phòng tập thể dục của chúng tôi đang được mã hóa. + +14 +00:00:47,880 --> 00:00:52,880 +Chúng tôi sẽ sử dụng trình chỉnh sửa mã hóa và chúng tôi sẽ nhập mỗi ngày cho đến khi + +15 +00:00:53,010 --> 00:00:55,550 +chúng tôi nhận được nó. Vì vậy, có một thời + +16 +00:00:55,790 --> 00:00:59,330 +gian nghỉ ngơi, có một phần còn lại và trở lại vào ngày mai sảng khoái. + +17 +00:00:59,390 --> 00:01:02,240 +Và chúng tôi sẽ đưa vào một số đại diện nữa và chúng tôi sẽ đào tạo + +18 +00:01:02,240 --> 00:01:03,920 +bạn để trở thành một lập trình viên giỏi. + diff --git a/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/external-links.txt b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..45282259e19918a426016f6d7e2ed6cc43a0c09a --- /dev/null +++ b/part1/04 - Day 4 - Beginner - Randomisation and Python Lists/external-links.txt @@ -0,0 +1,54 @@ + +001 Day-4-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/rock-paper-scissors-end?v=1 + +002 For-the-Curious-The-Mersenne-Twister +https://en.wikipedia.org/wiki/Mersenne_Twister + +002 For-the-Curious-Random-vs-Pseudorandom-Numbers +https://www.khanacademy.org/computing/computer-science/cryptography/crypt/v/random-vs-pseudorandom-number-generators + +002 Fork-the-Day-4-Starting-Repl +https://repl.it/@appbrewery/day-4-start + +002 AskPythons-Documentation-on-Random +https://www.askpython.com/python-modules/python-random-module-generate-random-numbers-sequences + +003 Exercise-13 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/23bb0d44-f578-4661-990b-6df00e5da175 + +003 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +004 Things-that-lists-can-do-in-Python +https://docs.python.org/3/tutorial/datastructures.html + +004 List-Practice-Repl-US-States-Veg- +https://repl.it/@appbrewery/day-4-list-practice + +005 Exercise-14 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d45f0fbf-1651-4287-9c65-9aec95c8fed4 + +005 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +006 For-the-Curious-The-Dirty-Dozen +https://www.delish.com/food-news/a26872638/dirty-dozen-foods-list-2019/ + +008 Exercise-15 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/e806e25c-5f84-4d7c-9c7c-2c0fcd0bfe84 + +008 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +009 The-World-Rock-Paper-Scissors-Association +https://www.wrpsa.com/ + +009 Rock-Paper-Scissors-Starter-Code +https://repl.it/@appbrewery/rock-paper-scissors-start + +009 Solution-Rock-Paper-Scissors-Completed-Code +https://repl.it/@appbrewery/rock-paper-scissors-end + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/001 Day 5 Goals what we will make by the end of the day.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/001 Day 5 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1c3bb31994090de126d0d7b1216c9f410f0f14c2 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/001 Day 5 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70d790cef8d56060ff93b1cfeda58051093851c16d9e2742905ad4465e768e72 +size 48554382 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/001 Day 5 Goals what we will make by the end of the day_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/001 Day 5 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e449e6adedfe0a96c835b43a3bc72816751708d --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/001 Day 5 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,200 @@ +1 +00:00:00,430 --> 00:00:02,800 +Tất cả các bạn, làm tốt cho việc gắn bó với nó. + +2 +00:00:02,830 --> 00:00:06,220 +Bạn hiện đang ở ngày thứ 5 trong số 100 Ngày viết mã. + +3 +00:00:06,610 --> 00:00:09,190 +Và hôm nay tôi có một dự án thú vị dành cho bạn. + +4 +00:00:09,730 --> 00:00:13,660 +Và nguồn cảm hứng cho dự án đến từ thực tế là những ngày này dường như tất + +5 +00:00:13,660 --> 00:00:17,440 +cả các công ty đang bị tấn công. Tất cả mọi thứ từ Ashley Madison + +6 +00:00:17,440 --> 00:00:18,820 +đến Verizon, mọi người + +7 +00:00:18,850 --> 00:00:22,690 +dường như thực sự kém trong việc giữ mật khẩu của bạn an toàn. + +8 +00:00:23,200 --> 00:00:28,200 +Vì vậy, làm thế nào chúng tôi có thể đảm bảo rằng những tin tặc mặc áo hoodie và đeo khẩu trang, không + +9 +00:00:29,110 --> 00:00:33,200 +truy cập vào bạn và tài khoản của bạn? Tôi không biết tại sao các hacker luôn + +10 +00:00:33,220 --> 00:00:36,640 +được miêu tả như thế này? Ý tôi là, họ đang + +11 +00:00:36,670 --> 00:00:40,630 +ở trong nhà riêng của họ. Họ không cần phải giấu mặt. + +12 +00:00:41,410 --> 00:00:44,620 +Nhưng ít nhất họ có ý thức không lây lan mầm bệnh và giữ ấm. + +13 +00:00:44,650 --> 00:00:49,210 +Vậy là tốt rồi. Nhưng làm thế nào để những tin tặc này xâm nhập vào tài khoản của bạn? + +14 +00:00:49,630 --> 00:00:50,050 +Một trong + +15 +00:00:50,050 --> 00:00:55,050 +những lý do phổ biến nhất là sử dụng lại mật khẩu. Sử dụng cùng một mật khẩu trên 20 trang + +16 +00:00:55,540 --> 00:00:58,960 +web khác nhau từ Google, Facebook, Skype, Spotify, đến tất cả các dịch + +17 +00:00:59,230 --> 00:01:01,600 +vụ ngẫu nhiên mà chúng tôi đăng ký. + +18 +00:01:02,110 --> 00:01:04,480 +Vấn đề là khi một trong những trang web này + +19 +00:01:04,629 --> 00:01:09,190 +bị tấn công, thì tổ hợp email và mật khẩu bạn sử dụng để đăng ký sẽ bị xâm phạm. + +20 +00:01:09,400 --> 00:01:13,600 +Vì vậy, tất cả những gì một hacker phải làm là thử các thông tin đăng nhập đó trên một loạt các trang web + +21 +00:01:13,600 --> 00:01:17,200 +khác và xem chúng có hoạt động hay không. Vì vậy, làm thế nào bạn biết, nếu email và + +22 +00:01:17,200 --> 00:01:21,610 +mật khẩu của bạn nằm trên cơ sở dữ liệu ở đâu đó? Bạn có thể đi qua + +23 +00:01:21,610 --> 00:01:24,520 +để có ibeenpwned. com, để ý chính tả ở + +24 +00:01:24,910 --> 00:01:29,410 +đó, và nhập email của bạn để xem liệu nó có liên quan đến một trang web đã bị tấn + +25 +00:01:29,410 --> 00:01:30,243 +công hay không. + +26 +00:01:30,280 --> 00:01:35,050 +Vì vậy, chúng ta hãy thử một email ở đây: elon @ tesla. com Và nó cho chúng ta biết, + +27 +00:01:36,850 --> 00:01:40,210 +Ồ, không, có vẻ như email này đã được soạn thảo. + +28 +00:01:40,810 --> 00:01:43,570 +Và đây là nơi các trang web bị tấn + +29 +00:01:43,630 --> 00:01:48,040 +công có khả năng làm rò rỉ email này và mật khẩu liên kết của nó. + +30 +00:01:48,850 --> 00:01:52,150 +Tôi thực sự khuyên bạn nên thử các địa chỉ email của chính mình ngay + +31 +00:01:52,150 --> 00:01:55,300 +bây giờ và xem dịch vụ nào bạn đăng ký đã bị xâm phạm. + +32 +00:01:55,600 --> 00:01:57,490 +Nhưng nếu bạn muốn bảo mật tốt + +33 +00:01:57,550 --> 00:02:01,630 +hơn, thì bạn sẽ thực sự cần mật khẩu duy nhất cho mỗi và mọi trang web. + +34 +00:02:02,380 --> 00:02:06,340 +Và chúng thực sự phải là mật khẩu mạnh, không + +35 +00:02:06,340 --> 00:02:10,810 +phải 12345 6 hay qwerty. Nếu tôi vừa gọi ra mật khẩu của bạn, vui lòng + +36 +00:02:11,080 --> 00:02:11,913 +thay đổi nó. + +37 +00:02:13,390 --> 00:02:17,890 +Bây giờ những gì chúng tôi sẽ xây dựng chính xác là như vậy. Chúng tôi sẽ xây dựng một + +38 +00:02:17,920 --> 00:02:19,600 +trình tạo mật + +39 +00:02:19,870 --> 00:02:24,870 +khẩu, một thứ sẽ tạo ra những mật khẩu mạnh với các chữ + +40 +00:02:25,450 --> 00:02:29,860 +cái, ký hiệu và số. Đầu tiên, họ hỏi chúng tôi rằng bạn muốn có bao nhiêu chữ cái trong mật khẩu của mình? + +41 +00:02:30,160 --> 00:02:34,270 +Tôi muốn 12. Bạn muốn có bao nhiêu ký hiệu? Tôi muốn 2 cái. + +42 +00:02:34,930 --> 00:02:38,050 +Và tôi cũng muốn có 2 số trong mật khẩu của mình. + +43 +00:02:38,560 --> 00:02:43,560 +Và sau đó tôi nhấn enter và nó cung cấp cho tôi mật khẩu mà nó + +44 +00:02:45,100 --> 00:02:49,150 +đã tạo với hai biểu tượng, hai số và 12 chữ cái. + +45 +00:02:49,210 --> 00:02:52,000 +Vì vậy, đó là một mật khẩu + +46 +00:02:52,300 --> 00:02:57,300 +khá mạnh nếu bạn hỏi tôi. Bây giờ tôi có thể sử dụng điều này và cập nhật mật khẩu của mình + +47 +00:02:58,210 --> 00:03:00,040 +thành một thứ gì đó rất mạnh và rất an toàn. + +48 +00:03:00,610 --> 00:03:05,470 +Vì vậy, đây là những gì chúng tôi sẽ xây dựng vào cuối ngày hôm nay. Nhưng để làm được điều đó, trước + +49 +00:03:05,530 --> 00:03:09,580 +tiên chúng ta cần học một số kỹ năng mới và khái niệm mới. + +50 +00:03:09,760 --> 00:03:12,400 +Vì vậy, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/001 Day-5-Goal-Click-Run-to-see-the-final-project.url b/part1/05 - Day 5 - Beginner - Python Loops/001 Day-5-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..9f3f95c88ad76c86484017b8fb4b57bb1ae97884 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/001 Day-5-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/password-generator-end?v=1 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/001 Have-I-been-pwned-.url b/part1/05 - Day 5 - Beginner - Python Loops/001 Have-I-been-pwned-.url new file mode 100644 index 0000000000000000000000000000000000000000..938ebc228f93f2e5f09b7a50378dcd10e2b8fd68 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/001 Have-I-been-pwned-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://haveibeenpwned.com/ \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/002 For-Loop-Practice-Completed-Code.url b/part1/05 - Day 5 - Beginner - Python Loops/002 For-Loop-Practice-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..000be4b0241bd3caed3aa43082434966bf1ca1da --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/002 For-Loop-Practice-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-5-for-loops-end#main.py \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/002 Fork-the-Day-5-Starting-Repl.url b/part1/05 - Day 5 - Beginner - Python Loops/002 Fork-the-Day-5-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..140a3f92353a461303ded20d1fb875e6d6cc83fa --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/002 Fork-the-Day-5-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-5-start \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/002 Using the for loop with Python Lists.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/002 Using the for loop with Python Lists.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..db5d2cda55a49c39f4353425c59ca0ceadfbbac3 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/002 Using the for loop with Python Lists.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d62bf692eab2664feb8ee6c0ccea91d07cfb33742b369a20f9736b0ed6ce3d6a +size 25120526 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/002 Using the for loop with Python Lists_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/002 Using the for loop with Python Lists_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..da78f4aadb3004ff408443b93341e83d96600b0f --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/002 Using the for loop with Python Lists_vi.srt @@ -0,0 +1,464 @@ +1 +00:00:00,280 --> 00:00:04,300 +Chủ đề đầu tiên tôi muốn nói đến ngày hôm nay là khái niệm về vòng + +2 +00:00:04,660 --> 00:00:07,450 +lặp, những thứ phải diễn ra lặp đi lặp lại. + +3 +00:00:08,020 --> 00:00:11,560 +Loại vòng lặp đầu tiên tôi muốn giới thiệu + +4 +00:00:11,560 --> 00:00:16,560 +với bạn là vòng lặp For. Và nó có thể được sử dụng thực sự dễ dàng kết hợp với một thứ mà + +5 +00:00:16,960 --> 00:00:21,520 +chúng ta đã học trong các bài học ngày hôm qua, đó là danh sách. Bằng cách sử dụng vòng lặp for như thế + +6 +00:00:21,520 --> 00:00:22,600 +này, chúng ta có + +7 +00:00:22,660 --> 00:00:26,860 +thể xem qua từng mục trong danh sách và thực hiện một số hành động với từng + +8 +00:00:26,890 --> 00:00:27,880 +mục riêng lẻ. + +9 +00:00:28,600 --> 00:00:32,290 +Vì vậy, chúng ta hãy thử nó trong thực tế. Để làm theo cùng, hãy + +10 +00:00:32,590 --> 00:00:36,730 +tiếp tục và ngã ba vào ngày thứ 5 bắt đầu cuộc nổi dậy. + +11 +00:00:37,210 --> 00:00:41,200 +Và khi tôi đã giải thích về khái niệm này, thì tôi muốn bạn tự mình thử nó. + +12 +00:00:41,920 --> 00:00:46,920 +Nhưng trước tiên, hãy nói rằng chúng tôi có một danh sách gọi là trái cây và nó có + +13 +00:00:48,430 --> 00:00:50,320 +ba mặt hàng, táo, đào và lê. + +14 +00:00:51,370 --> 00:00:55,660 +Nếu chúng ta muốn truy cập từng mục trong danh sách này và in từng mục + +15 +00:00:55,660 --> 00:00:58,390 +một, thì chúng ta sẽ sử dụng vòng lặp for. + +16 +00:00:59,290 --> 00:01:01,270 +Vì vậy, nếu chúng ta bắt đầu + +17 +00:01:01,720 --> 00:01:05,620 +với từ khóa cho, và sau đó chúng ta đặt tên cho một mục duy nhất. + +18 +00:01:06,250 --> 00:01:09,160 +Vì vậy, trong trường hợp này, chúng ta có thể gọi nó là trái cây. + +19 +00:01:09,880 --> 00:01:12,130 +Và sau đó chúng tôi sử dụng từ khóa in + +20 +00:01:12,430 --> 00:01:15,640 +và cuối cùng là danh sách mà chúng tôi muốn lặp lại, đó là + +21 +00:01:16,090 --> 00:01:17,860 +thành quả của chúng tôi ở đây. + +22 +00:01:18,580 --> 00:01:23,580 +Bây giờ chúng ta mở đầu nó bằng dấu hai chấm và chúng ta chuyển sang dòng tiếp theo và để ý xem nó được thụt vào + +23 +00:01:24,730 --> 00:01:25,690 +như thế nào ở đó. + +24 +00:01:26,770 --> 00:01:31,770 +Bây giờ tôi sẽ tiếp tục và in giá trị của từng biến trái cây. + +25 +00:01:35,080 --> 00:01:36,520 +Và nếu tôi chạy + +26 +00:01:36,580 --> 00:01:41,580 +mã này, bạn sẽ thấy rằng nó lặp qua danh sách trái cây của tôi và đối với + +27 +00:01:42,370 --> 00:01:46,540 +mỗi loại trái cây trong danh sách, nó sẽ in nó ra bảng điều khiển, + +28 +00:01:46,780 --> 00:01:50,260 +táo, đào, lê, theo thứ tự đó. Bây giờ, điều quan trọng + +29 +00:01:50,290 --> 00:01:54,670 +cần nhận ra ở đây là về cơ bản bạn có thể tưởng tượng rằng đằng + +30 +00:01:54,670 --> 00:01:58,170 +sau hậu trường, những gì mã này đang làm là nó lấy + +31 +00:01:58,170 --> 00:02:00,670 +danh sách các loại trái cây này và nó + +32 +00:02:01,060 --> 00:02:05,140 +ký một tên biến, trái cây, cho từng loại trái cây trong số chúng. + +33 +00:02:05,260 --> 00:02:09,039 +Vì vậy, lần đầu tiên trái cây chạy bằng quả táo, lần thứ hai + +34 +00:02:09,190 --> 00:02:12,100 +quả chạy này bằng quả đào và chúng ta có thể + +35 +00:02:12,610 --> 00:02:15,160 +thấy điều này rõ ràng hơn nếu bạn chạy + +36 +00:02:15,220 --> 00:02:17,650 +nó qua Thonny IDE, mà tôi đã nói với + +37 +00:02:17,680 --> 00:02:21,250 +bạn ở đầu khóa học. Bây giờ, nếu tôi tiếp + +38 +00:02:21,280 --> 00:02:25,870 +tục và nhấp vào biểu tượng gỡ lỗi và tôi bước vào từng bước, bạn có + +39 +00:02:26,170 --> 00:02:31,060 +thể thấy trước tiên nó thiết lập rằng chúng tôi có danh sách ba chuỗi, táo, đào, + +40 +00:02:31,090 --> 00:02:34,750 +lê và sau đó chúng tôi đi vào vòng lặp for . + +41 +00:02:35,170 --> 00:02:40,120 +Bây giờ lưu ý ở bên phải đây, tôi đã tính toán tất cả các biến. + +42 +00:02:40,420 --> 00:02:43,300 +Và điều đầu tiên nó được chú ý là biến trái cây, + +43 +00:02:43,540 --> 00:02:46,870 +chứa một danh sách các chuỗi. Bây giờ, khi tôi tiếp + +44 +00:02:46,930 --> 00:02:49,090 +tục vào vòng lặp for, hãy chú + +45 +00:02:49,510 --> 00:02:53,530 +ý cách nó sẽ xem qua danh sách các loại trái cây này + +46 +00:02:54,160 --> 00:02:59,160 +và nó sẽ gán tên biến trái cây cho mỗi mục bắt đầu từ một quả + +47 +00:03:00,460 --> 00:03:01,930 +táo đầu tiên. + +48 +00:03:02,410 --> 00:03:05,950 +Vì vậy, bây giờ khi đến dòng 3, chúng ta đã có + +49 +00:03:06,130 --> 00:03:08,260 +biến này được gọi là fruit được + +50 +00:03:08,620 --> 00:03:12,790 +gán cho giá trị của apple. Và vì vậy tại thời điểm này, + +51 +00:03:12,820 --> 00:03:15,640 +việc in ra giá trị của loại trái cây này rõ + +52 +00:03:15,880 --> 00:03:20,200 +ràng là nó sẽ in ra quả táo và bạn sẽ thấy trong bước tiếp theo. + +53 +00:03:21,880 --> 00:03:25,000 +Chúng ta bắt đầu. Bây giờ, khi tôi đã hoàn + +54 +00:03:25,120 --> 00:03:28,510 +thành ở đây, sau đó nó sẽ lặp lại phần bắt đầu của vòng + +55 +00:03:28,960 --> 00:03:33,960 +lặp for và bây giờ biến trái cây này sẽ được gán cho giá trị tiếp theo bên trong danh sách + +56 +00:03:34,540 --> 00:03:35,410 +các trái cây. + +57 +00:03:35,800 --> 00:03:40,180 +Vì vậy, bây giờ hãy chú ý cách biến trái cây được gắn vào giá trị + +58 +00:03:40,570 --> 00:03:45,570 +đào, và sau đó nó tiếp tục điều này và cứ thế tiếp tục cho đến khi nó in ra + +59 +00:03:46,720 --> 00:03:47,553 +từng trái cây. + +60 +00:03:49,390 --> 00:03:53,020 +Và điều này thực sự nhấn mạnh khía cạnh quan trọng nhất của vòng lặp. + +61 +00:03:53,410 --> 00:03:57,940 +Vòng lặp cho phép chúng ta thực thi cùng một dòng mã nhiều lần. + +62 +00:03:58,390 --> 00:04:01,600 +Trong trường hợp này, chúng tôi đang thực hiện câu lệnh print ba lần, nhưng + +63 +00:04:01,960 --> 00:04:05,590 +vòng lặp for của chúng tôi không giới hạn ở việc chỉ thực hiện một câu lệnh duy nhất. + +64 +00:04:06,010 --> 00:04:08,950 +Chúng tôi không chỉ phải in ra tên của một mục trong danh sách. + +65 +00:04:09,310 --> 00:04:12,460 +Chúng ta có thể thực thi toàn bộ một khối câu lệnh nhiều lần + +66 +00:04:12,910 --> 00:04:17,769 +và chúng ta có thể làm nhiều thứ bên trong vòng lặp for này và bên trong, ý tôi là thụt lề. + +67 +00:04:18,790 --> 00:04:21,820 +Vì vậy, giả sử ngoài việc in ra trái cây, tôi + +68 +00:04:22,240 --> 00:04:26,980 +sẽ viết một câu lệnh in khác và tôi sẽ không chỉ in tên của loại trái + +69 +00:04:26,980 --> 00:04:27,940 +cây mà tôi + +70 +00:04:28,240 --> 00:04:33,240 +còn nói trái cây + + "Pie . "Vậy khi tôi chạy đoạn mã + +71 +00:04:33,820 --> 00:04:36,940 +này, bạn nghĩ điều gì sẽ xảy ra? + +72 +00:04:39,730 --> 00:04:44,680 +Chà, nó in ra quả táo, và sau đó nó in ra Apple Pie Và sau đó nó + +73 +00:04:45,220 --> 00:04:49,270 +quay lại từ đầu và nó chỉ định loại trái cây có thể thay đổi + +74 +00:04:49,270 --> 00:04:52,360 +được cho món tiếp theo, bánh đào, bánh lê lê. + +75 +00:04:53,080 --> 00:04:58,080 +Vì vậy, đây là cách chúng ta có thể triển khai một vòng lặp for đơn giản lặp qua + +76 +00:04:58,930 --> 00:05:03,370 +một danh sách và gán một tên biến cho từng mục trong danh sách theo thứ + +77 +00:05:03,760 --> 00:05:07,870 +tự và sau đó bên trong vòng lặp for sau dấu hai chấm, sau + +78 +00:05:08,140 --> 00:05:13,140 +một số thụt lề, chúng ta có thể làm gì đó với biến tạm thời đó cho từng mục. + +79 +00:05:14,470 --> 00:05:19,470 +Bây giờ tôi đã nói nhiều về khái niệm bên trong vòng lặp for so + +80 +00:05:20,530 --> 00:05:25,210 +với bên ngoài vòng lặp for. Và điều này thực sự, thực sự quan trọng. + +81 +00:05:25,510 --> 00:05:30,130 +Bất cứ khi nào bạn nhìn thấy dấu hai chấm trong câu lệnh if mà chúng ta đã + +82 +00:05:30,190 --> 00:05:32,350 +thấy trước đây hoặc vòng lặp for + +83 +00:05:32,860 --> 00:05:35,380 +mà chúng ta đang sử dụng ở đây, thì thụt + +84 +00:05:35,380 --> 00:05:38,470 +lề thực sự, thực sự quan trọng vì nếu nó được thụt + +85 +00:05:38,770 --> 00:05:42,760 +lề, thì điều đó có nghĩa là nó nằm trong vòng lặp for và các + +86 +00:05:42,820 --> 00:05:47,320 +hướng dẫn này tất cả đều được thực hiện nhiều lần vì vòng lặp cần lặp lại. + +87 +00:05:47,920 --> 00:05:52,540 +Bây giờ, nếu tôi quyết định rằng tôi muốn nói in, uh, trái cây của tôi, vì + +88 +00:05:52,600 --> 00:05:54,250 +vậy danh sách các loại + +89 +00:05:54,430 --> 00:05:59,430 +trái cây của tôi ở đây và tôi đặt nó bên trong vòng lặp for của mình, được thụt + +90 +00:05:59,510 --> 00:06:03,410 +vào sau vòng lặp for, thì như bạn có thể tưởng tượng, nó sẽ + +91 +00:06:03,410 --> 00:06:07,160 +in nó bao nhiêu lần khi vòng lặp chạy, sẽ là ba vì + +92 +00:06:07,430 --> 00:06:12,290 +có ba mục trong danh sách của chúng tôi. Bây giờ, nếu tôi đã thụt lề + +93 +00:06:12,320 --> 00:06:15,800 +đó trở lại từ đầu, vì vậy bây giờ nó + +94 +00:06:16,160 --> 00:06:18,860 +không còn bên trong vòng lặp for nữa, + +95 +00:06:19,340 --> 00:06:24,340 +thì nó sẽ chỉ in một lần và nó sẽ in nó sau khi + +96 +00:06:24,800 --> 00:06:29,480 +vòng lặp for hoàn tất. Vì vậy, hãy chú ý cách nó hoạt động trên toàn + +97 +00:06:29,480 --> 00:06:32,090 +bộ Apple, Apple pie, v.v. Và sau khi vòng + +98 +00:06:32,150 --> 00:06:36,770 +lặp kết thúc, nó sẽ nhảy sang dòng tiếp theo và thực hiện lệnh này. + +99 +00:06:37,280 --> 00:06:39,500 +Vì vậy, việc thụt lề thực sự rất quan trọng và + +100 +00:06:39,500 --> 00:06:41,450 +bạn phải thực sự cẩn thận với điều này. + +101 +00:06:42,620 --> 00:06:44,630 +Hãy chơi một vòng với mã này và nếu + +102 +00:06:44,870 --> 00:06:47,300 +bạn vẫn đang loay hoay không biết nó hoạt động + +103 +00:06:47,300 --> 00:06:52,160 +như thế nào thì hãy chuyển mã sang Thonny và thực hiện từng bước một và xem nó hoạt động + +104 +00:06:52,160 --> 00:06:53,120 +như thế nào. + +105 +00:06:53,600 --> 00:06:57,260 +Nhưng tôi hy vọng bạn đang bắt đầu thấy các vòng lặp thực sự hữu ích như thế + +106 +00:06:57,260 --> 00:06:59,600 +nào khi thực hiện lặp đi lặp lại một lệnh, giúp + +107 +00:06:59,990 --> 00:07:02,510 +máy tính tiết kiệm thời gian và năng lượng cho chúng ta. + +108 +00:07:03,110 --> 00:07:07,970 +Một ví dụ thực sự tốt về thời điểm các vòng lặp thực sự hữu ích là, bạn biết đấy, Bart Simpson + +109 +00:07:08,000 --> 00:07:09,920 +bị trừng phạt như thế nào và nó + +110 +00:07:09,920 --> 00:07:14,450 +phải viết đi viết lại một câu trên Bảng đen. Chà, nếu chỉ có Bart là một lập trình + +111 +00:07:14,600 --> 00:07:19,070 +viên, thì anh ấy sẽ có thể sử dụng các vòng lặp để làm điều này và anh ấy + +112 +00:07:19,310 --> 00:07:22,520 +sẽ có thể lạnh sống lưng. Bây giờ, khi bạn đã hài lòng + +113 +00:07:22,760 --> 00:07:24,890 +với loại vòng lặp for này, thì hãy chuyển sang + +114 +00:07:25,190 --> 00:07:28,730 +bài học tiếp theo, nơi tôi có một bài tập mã hóa sẽ đưa kiến thức của + +115 +00:07:28,940 --> 00:07:31,370 +bạn vào bài kiểm tra. Được rồi. + +116 +00:07:31,370 --> 00:07:32,150 +Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/003 Exercise-16.url b/part1/05 - Day 5 - Beginner - Python Loops/003 Exercise-16.url new file mode 100644 index 0000000000000000000000000000000000000000..6c0e92870c821ce4fd3606032c3644c6f08f6717 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/003 Exercise-16.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/4a109ef8-ac17-4a51-85b1-61a61a20bb66 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/003 How-to-join-Auditorium.url b/part1/05 - Day 5 - Beginner - Python Loops/003 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/003 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/003 [Interactive Coding Exercise] Average Height.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/003 [Interactive Coding Exercise] Average Height.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5f5c45f6c9bbb865636152b725c50d05c2954090 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/003 [Interactive Coding Exercise] Average Height.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f99d7e2d080403b893513e4f8a3255a1dd20c6b8a025caccc95c96281eadff2e +size 12509473 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/003 [Interactive Coding Exercise] Average Height_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/003 [Interactive Coding Exercise] Average Height_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c8c0355eeab96abcf3861e3bf330cbd014beb8e3 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/003 [Interactive Coding Exercise] Average Height_vi.srt @@ -0,0 +1,300 @@ +1 +00:00:00,570 --> 00:00:01,620 +Trong bài tập này, + +2 +00:00:01,620 --> 00:00:03,180 +bạn sẽ viết một chương + +3 +00:00:03,180 --> 00:00:07,650 +trình tính chiều cao trung bình của một lớp học sinh. + +4 +00:00:07,650 --> 00:00:08,730 +Trong khung Nhập liệu, + +5 +00:00:08,730 --> 00:00:12,150 +chúng tôi có tất cả chiều cao của học sinh tính bằng centimet + +6 +00:00:12,150 --> 00:00:17,150 +và từ các dòng từ hai đến bốn, chúng tôi chuyển đổi chiều cao đó thành một danh sách. + +7 +00:00:17,970 --> 00:00:22,970 +Và bạn có thể làm việc với nó bằng cách sử dụng danh sách sinh viên_heights. + +8 +00:00:25,080 --> 00:00:29,850 +Quy tắc duy nhất là bạn phải viết ít nhất một vòng lặp for, đó là toàn + +9 +00:00:29,850 --> 00:00:32,009 +bộ mục đích của bài tập. + +10 +00:00:32,009 --> 00:00:35,430 +Có các phương thức đơn giản hóa từ Python, chẳng hạn như + +11 +00:00:35,430 --> 00:00:38,370 +phương thức len() và phương thức sum(), sẽ giúp + +12 +00:00:38,370 --> 00:00:41,880 +bạn làm việc với danh sách dễ dàng hơn rất nhiều, nhưng + +13 +00:00:41,880 --> 00:00:44,400 +mục tiêu ở đây là bỏ qua chúng, coi như chúng + +14 +00:00:44,400 --> 00:00:46,170 +không tồn tại. + +15 +00:00:46,170 --> 00:00:49,350 +Thay vào đó, bạn sẽ tự viết hàm + +16 +00:00:49,350 --> 00:00:53,640 +len và hàm tổng bằng vòng lặp for. + +17 +00:00:53,640 --> 00:00:56,580 +Và trong quá trình này bạn sẽ thực hành kỹ năng + +18 +00:00:56,580 --> 00:00:58,260 +viết vòng lặp for. + +19 +00:00:58,260 --> 00:01:00,540 +Hãy suy nghĩ về cách bạn có thể đạt được điều này. + +20 +00:01:00,540 --> 00:01:02,610 +Hãy xem Đầu vào Ví dụ và Đầu ra Ví + +21 +00:01:02,610 --> 00:01:05,190 +dụ dự kiến, tôi muốn xem tổng chiều cao + +22 +00:01:05,190 --> 00:01:07,140 +được in, số học sinh được in + +23 +00:01:07,140 --> 00:01:08,610 +và chiều cao trung bình + +24 +00:01:08,610 --> 00:01:10,410 +được in theo định dạng chính + +25 +00:01:10,410 --> 00:01:13,590 +xác mà bạn thấy trong Đầu ra Ví dụ. + +26 +00:01:13,590 --> 00:01:14,763 +Vì vậy, hãy thử ngay bây giờ. + +27 +00:01:20,490 --> 00:01:22,800 +Được rồi, quy tắc duy nhất trong bài tập + +28 +00:01:22,800 --> 00:01:25,530 +này là bạn phải viết một số vòng lặp for và không + +29 +00:01:25,530 --> 00:01:28,410 +sử dụng các phương thức len() hoặc sum(). + +30 +00:01:28,410 --> 00:01:32,400 +Tất cả chúng ta đều biết các phương pháp của Python có tác dụng cứu mạng như + +31 +00:01:32,400 --> 00:01:34,860 +thế nào và nó có thể dễ dàng hơn rất nhiều, nhưng + +32 +00:01:34,860 --> 00:01:37,830 +trong bài tập này, chúng ta đang thực hành các vòng lặp + +33 +00:01:37,830 --> 00:01:40,383 +for nên sẽ giả vờ như chúng không tồn tại. + +34 +00:01:41,880 --> 00:01:44,310 +Bước đầu tiên là tôi sẽ tạo một biến + +35 +00:01:44,310 --> 00:01:47,730 +có tên là Total_height và đặt nó bằng 0, sau đó + +36 +00:01:47,730 --> 00:01:50,460 +tôi sẽ tích lũy chiều cao mà tôi có được + +37 +00:01:50,460 --> 00:01:53,010 +trong danh sách cho biến này. + +38 +00:01:53,010 --> 00:01:54,870 +Tôi tạo một vòng lặp for với + +39 +00:01:54,870 --> 00:01:59,010 +nội dung là, với mỗi chiều cao trong danh sách của tôi, sinh + +40 +00:01:59,010 --> 00:02:03,210 +viên_heights, tôi sẽ cộng chiều cao mà tôi có trong danh sách + +41 +00:02:03,210 --> 00:02:07,140 +với tổng chiều cao và bằng cách sử dụng ký hiệu dấu cộng bằng + +42 +00:02:07,140 --> 00:02:10,830 +(+=), tôi có thể tích lũy giá trị vào biến đó. + +43 +00:02:10,830 --> 00:02:13,920 +Và cuối cùng, tôi có thể in ra Total_height bằng + +44 +00:02:13,920 --> 00:02:17,610 +bất cứ giá trị nào ở cuối, khi vòng lặp for đã chạy qua tất + +45 +00:02:17,610 --> 00:02:21,480 +cả các phần tử trong danh sách school_heights. + +46 +00:02:21,480 --> 00:02:24,600 +Và cuối cùng tôi có thể in ra tổng_height bằng, + +47 +00:02:24,600 --> 00:02:27,908 +bất kể nó là gì ở cuối, khi vòng lặp for đã chạy qua + +48 +00:02:27,908 --> 00:02:32,100 +tất cả các phần tử trong danh sách chiều cao của học sinh. + +49 +00:02:32,100 --> 00:02:36,030 +Tiếp theo, tôi làm điều tương tự bằng cách sử dụng number_of_students. + +50 +00:02:36,030 --> 00:02:40,770 +Vì vậy, tôi bắt đầu từ 0 và thêm 1 cho mỗi học sinh trong danh sách chiều + +51 +00:02:40,770 --> 00:02:42,780 +cao học sinh của chúng tôi. + +52 +00:02:42,780 --> 00:02:44,670 +Tất nhiên, điều này sao chép + +53 +00:02:44,670 --> 00:02:47,460 +chức năng Python của len, nhưng thực sự hữu + +54 +00:02:47,460 --> 00:02:50,520 +ích khi ít nhất có thể chia nhỏ các hàm này và đôi + +55 +00:02:50,520 --> 00:02:52,080 +khi tự viết chúng, nếu không + +56 +00:02:52,080 --> 00:02:53,880 +chỉ để có thể chứng minh với + +57 +00:02:53,880 --> 00:02:55,200 +bản thân rằng bạn có + +58 +00:02:55,200 --> 00:02:57,000 +thể làm được. + +59 +00:02:57,000 --> 00:02:59,580 +Và cuối cùng, khi tôi đã tích lũy tất + +60 +00:02:59,580 --> 00:03:02,370 +cả số học sinh trong danh sách của mình, + +61 +00:03:02,370 --> 00:03:04,810 +tôi có thể in nó ra, số học sinh bằng + +62 +00:03:04,810 --> 00:03:08,130 +nhau rồi chèn nó vào bằng chuỗi f của tôi. + +63 +00:03:08,130 --> 00:03:09,900 +Cuối cùng, chúng ta tính giá trị + +64 +00:03:09,900 --> 00:03:14,340 +trung bình bằng cách chia tổng_height cho tổng số_of_students, sau đó + +65 +00:03:14,340 --> 00:03:17,880 +chúng ta có thể làm tròn() số đó để lấy số nguyên rồi in ra, chiều + +66 +00:03:17,880 --> 00:03:19,260 +cao trung bình bằng bất + +67 +00:03:19,260 --> 00:03:23,100 +cứ giá trị nào chúng ta đã tính toán và bất kể giá trị nào khác nhau + +68 +00:03:23,100 --> 00:03:25,440 +thông tin đầu vào bạn nhập vào, miễn là + +69 +00:03:25,440 --> 00:03:29,340 +chúng là các số khác nhau cách nhau bởi dấu cách, mã này sẽ hoạt động + +70 +00:03:29,340 --> 00:03:32,070 +để tính giá trị trung bình mà không cần sử dụng + +71 +00:03:32,070 --> 00:03:36,450 +bất kỳ phương pháp đơn giản hóa nào như len() hoặc sum(). + +72 +00:03:36,450 --> 00:03:38,250 +Rất tốt nếu bạn làm được điều đó. + +73 +00:03:38,250 --> 00:03:40,110 +Nếu bạn đã sử dụng len() hoặc sum() + +74 +00:03:40,110 --> 00:03:43,230 +thì đã đến lúc quay lại và thay đổi mã của bạn và đảm bảo rằng + +75 +00:03:43,230 --> 00:03:45,813 +bạn đang thực hành sử dụng các vòng lặp. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/004 Exercise-17.url b/part1/05 - Day 5 - Beginner - Python Loops/004 Exercise-17.url new file mode 100644 index 0000000000000000000000000000000000000000..d82f31cdb4f1cb4ff7f7952af54b23e51c52f743 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/004 Exercise-17.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/69cffc56-5ac8-4b20-b067-b7ac13386989 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/004 How-to-join-Auditorium.url b/part1/05 - Day 5 - Beginner - Python Loops/004 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/004 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/004 [Interactive Coding Exercise] High Score.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/004 [Interactive Coding Exercise] High Score.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..64dae961043afea2cdbff4c5b083f3afa972f3d5 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/004 [Interactive Coding Exercise] High Score.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:630e48c3a7e85005fb90d208163a8433a5e1ea6c9a914964b2727fa98ad1ea59 +size 9743652 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/004 [Interactive Coding Exercise] High Score_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/004 [Interactive Coding Exercise] High Score_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..dc8918533bac7eb059127f20179890f459c96c98 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/004 [Interactive Coding Exercise] High Score_vi.srt @@ -0,0 +1,212 @@ +1 +00:00:00,450 --> 00:00:02,460 +Trong bài tập này, bạn + +2 +00:00:02,460 --> 00:00:05,160 +sẽ viết một số mã để tạo một chương + +3 +00:00:05,160 --> 00:00:09,930 +trình tính số cao nhất trong danh sách các số. + +4 +00:00:09,930 --> 00:00:12,870 +Tình huống là bạn làm việc tại một trường học và + +5 +00:00:12,870 --> 00:00:16,290 +học sinh của bạn đã đạt được tất cả những điểm số này và + +6 +00:00:16,290 --> 00:00:18,300 +bạn sẽ sử dụng Python để tìm ra đâu + +7 +00:00:18,300 --> 00:00:21,990 +là điểm cao nhất mà một học sinh nhất định đạt được. + +8 +00:00:21,990 --> 00:00:24,330 +Về cơ bản, những gì chúng tôi đang + +9 +00:00:24,330 --> 00:00:28,020 +làm là sao chép hàm max() của Python nhưng bạn không + +10 +00:00:28,020 --> 00:00:30,600 +được sử dụng hàm max(). + +11 +00:00:30,600 --> 00:00:34,770 +Thay vào đó, tôi muốn bạn sử dụng vòng lặp for để tự tạo + +12 +00:00:34,770 --> 00:00:36,570 +chức năng này và thực hành + +13 +00:00:36,570 --> 00:00:38,940 +cách sử dụng vòng lặp for. + +14 +00:00:38,940 --> 00:00:41,070 +Hãy xem Đầu vào mẫu và + +15 +00:00:41,070 --> 00:00:44,910 +xem Đầu ra mẫu dự kiến sẽ như thế nào. + +16 +00:00:44,910 --> 00:00:48,782 +Hãy chắc chắn rằng bạn khớp chính xác định dạng và các từ. + +17 +00:00:48,782 --> 00:00:51,123 +Hãy thực hiện thử thách này ngay bây giờ. + +18 +00:00:58,350 --> 00:01:02,100 +Vì vậy, các dòng từ hai đến bốn đã được viết sẵn + +19 +00:01:02,100 --> 00:01:05,190 +cho bạn và việc này chỉ lấy từng số trong + +20 +00:01:05,190 --> 00:01:09,273 +Đầu vào và đưa chúng vào danh sách gọi là điểm. + +21 +00:01:10,140 --> 00:01:13,200 +Bây giờ những gì bạn đang làm là viết một vòng + +22 +00:01:13,200 --> 00:01:15,750 +lặp for để theo dõi điểm số cao nhất. + +23 +00:01:15,750 --> 00:01:17,490 +Điều đầu tiên chúng ta làm + +24 +00:01:17,490 --> 00:01:21,600 +là tạo một biến có tên là high_score và đặt nó thành 0. + +25 +00:01:21,600 --> 00:01:25,080 +Tiếp theo, chúng ta viết vòng lặp for + +26 +00:01:25,080 --> 00:01:30,080 +để lặp qua từng điểm trong danh sách sinh viên. + +27 +00:01:30,690 --> 00:01:34,110 +Trong khi vòng lặp đang chạy, bên trong vòng lặp for, + +28 +00:01:34,110 --> 00:01:36,450 +chúng tôi kiểm tra một điều kiện, chúng + +29 +00:01:36,450 --> 00:01:38,370 +tôi sử dụng câu lệnh if để kiểm + +30 +00:01:38,370 --> 00:01:40,985 +tra xem current_score mà chúng tôi đang + +31 +00:01:40,985 --> 00:01:45,210 +lặp qua có lớn hơn high_score hiện tại hay không. + +32 +00:01:45,210 --> 00:01:46,800 +Bây giờ, lần đầu tiên + +33 +00:01:46,800 --> 00:01:48,500 +vòng lặp này chạy tất nhiên + +34 +00:01:49,423 --> 00:01:50,310 +nó sẽ lớn hơn + +35 +00:01:50,310 --> 00:01:52,560 +vì điểm cao hơn là 0 nên trừ khi + +36 +00:01:52,560 --> 00:01:56,220 +ai đó có điểm âm thì đó sẽ là điểm cao nhất. + +37 +00:01:56,220 --> 00:02:00,030 +Mỗi lần lặp qua vòng lặp for, chúng ta tiếp tục kiểm + +38 +00:02:00,030 --> 00:02:02,970 +tra biến high_score và đảm bảo rằng chúng + +39 +00:02:02,970 --> 00:02:06,450 +ta lưu trữ giá trị cao nhất mà chúng ta gặp. + +40 +00:02:06,450 --> 00:02:10,229 +Vì vậy, nếu điều kiện đúng, thì điểm hiện tại lớn hơn điểm + +41 +00:02:10,229 --> 00:02:13,710 +cao nhất mà chúng ta có trước đó, chúng ta đặt điểm_score + +42 +00:02:13,710 --> 00:02:16,757 +cao nhất cho điểm hiện tại đó. + +43 +00:02:16,757 --> 00:02:21,550 +Và cuối cùng, chúng ta sử dụng câu lệnh in để in ra "Điểm cao nhất trong + +44 +00:02:22,471 --> 00:02:23,820 +lớp là:" và sau đó chúng + +45 +00:02:24,698 --> 00:02:27,480 +ta chèn high_score bằng chuỗi f. + +46 +00:02:27,480 --> 00:02:30,420 +Và bởi vì câu lệnh in này xảy ra sau khi vòng lặp + +47 +00:02:30,420 --> 00:02:33,442 +for hoàn thành, hãy chú ý đến phần thụt lề của câu + +48 +00:02:33,442 --> 00:02:36,170 +lệnh in, đảm bảo dòng này không được thụt vào + +49 +00:02:36,170 --> 00:02:37,620 +bên trong vòng lặp for, + +50 +00:02:37,620 --> 00:02:39,240 +khi đó câu lệnh in này sẽ được + +51 +00:02:39,240 --> 00:02:41,610 +thực hiện sau khi tất cả các điểm đã được + +52 +00:02:41,610 --> 00:02:44,340 +hoàn tất. kiểm tra trong danh sách điểm của + +53 +00:02:44,340 --> 00:02:46,473 +học sinh đó. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/005 for loops and the range() function.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/005 for loops and the range() function.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..02600248a3985977f5d736e9c02e9180ca8b79ed --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/005 for loops and the range() function.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3bf4609dd23a0cc396ce133674788f787899842d1e2e5a6e9254acb64c1561b +size 17805387 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/005 for loops and the range() function_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/005 for loops and the range() function_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bb4985591c9dcd0c407bc8cf9426df11116bda09 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/005 for loops and the range() function_vi.srt @@ -0,0 +1,320 @@ +1 +00:00:00,580 --> 00:00:01,960 +Cho đến thời điểm + +2 +00:00:01,990 --> 00:00:06,640 +này, chúng tôi chỉ sử dụng vòng lặp for kết hợp với danh sách. + +3 +00:00:07,030 --> 00:00:11,830 +Vì vậy, chúng tôi đã lặp lại danh sách và nắm giữ từng mục trong danh sách và sau + +4 +00:00:11,830 --> 00:00:14,200 +đó làm điều gì đó với nó, phải không? + +5 +00:00:14,740 --> 00:00:18,940 +Nhưng không phải lúc nào chúng ta cũng làm việc với danh sách và sử dụng vòng lặp for. + +6 +00:00:19,390 --> 00:00:23,920 +Đôi khi chúng ta có thể muốn sử dụng một vòng lặp hoàn toàn độc lập với một danh sách. + +7 +00:00:24,640 --> 00:00:29,080 +Và một ví dụ điển hình về điều này là khi Carl Gauss nhà toán học người Đức + +8 +00:00:29,080 --> 00:00:32,380 +mới 10 tuổi, giáo viên toán của anh ấy đã đưa cho anh + +9 +00:00:32,710 --> 00:00:36,790 +ấy một bài tập mà có lẽ cô ấy nghĩ rằng sẽ trói anh ấy lại + +10 +00:00:36,790 --> 00:00:37,623 +cho bằng được. + +11 +00:00:38,080 --> 00:00:43,080 +Và ý tưởng là khiến anh ta cộng tất cả các số từ 1 đến 100. + +12 +00:00:43,990 --> 00:00:47,470 +Vì vậy, 1 + 2 + 3 + 4 + 5, + +13 +00:00:47,710 --> 00:00:49,660 +vân vân, cho đến một trăm. + +14 +00:00:50,500 --> 00:00:54,010 +Và mặc dù cô ấy nghĩ rằng điều này sẽ khiến anh ấy bận rộn trong một giờ + +15 +00:00:54,010 --> 00:00:58,000 +hoặc lâu hơn để bắt đứa trẻ nhỏ này cộng những con số này và tôi có thể có một số + +16 +00:00:58,000 --> 00:00:59,020 +yên tĩnh và yên + +17 +00:00:59,440 --> 00:01:03,160 +tĩnh cuộn trên Facebook, nhưng không may anh ấy đã quay lại với cô ấy trong vòng hai phút và + +18 +00:01:03,160 --> 00:01:06,880 +đưa cho cô ấy câu trả lời. Vậy anh ấy đã giải quyết nó như thế nào? Chà, đây thực + +19 +00:01:06,910 --> 00:01:11,140 +sự là một đứa trẻ thực sự thông minh và nó đã phát hiện + +20 +00:01:11,140 --> 00:01:14,560 +ra rằng nếu bạn lật các con số xung quanh, 100 + +21 +00:01:14,950 --> 00:01:17,650 ++ 99 + 98, và bạn sẽ nhìn vào + +22 +00:01:17,980 --> 00:01:21,700 +cả hai dòng này, bạn có thể thấy rằng 1 + 100 + +23 +00:01:21,700 --> 00:01:26,410 += 101, 2 + 99 = 101, 3 + 98 = 101, về cơ bản, nếu + +24 +00:01:26,410 --> 00:01:28,450 +bạn gắn tất cả các số + +25 +00:01:28,720 --> 00:01:31,690 +này lại với nhau, thực tế có 50 cặp 101. + +26 +00:01:31,960 --> 00:01:36,960 +Vì vậy, anh ta có thể chỉ cần thực hiện 50 nhân với 101 được 5,050. + +27 +00:01:38,080 --> 00:01:39,790 +Và đó là cách anh ấy tìm ra câu trả lời. + +28 +00:01:40,450 --> 00:01:45,450 +Nhưng chúng ta thực sự có thể đánh bại Gaus vì chúng ta có thể thực hiện phép tính này trong vòng chưa đầy + +29 +00:01:45,670 --> 00:01:50,230 +một phút, chỉ bằng cách viết một vài dòng mã. Nhưng để làm được điều này, trước + +30 +00:01:50,380 --> 00:01:55,380 +tiên chúng ta phải tìm hiểu về cách sử dụng vòng lặp for với hàm range. + +31 +00:01:56,770 --> 00:02:00,460 +Bây giờ hàm phạm vi là một cái gì đó thực sự, thực + +32 +00:02:00,760 --> 00:02:04,510 +sự hữu ích nếu bạn muốn tạo một phạm vi số để lặp lại. + +33 +00:02:05,290 --> 00:02:08,229 +Và cú pháp trông giống như thế này. + +34 +00:02:08,410 --> 00:02:12,940 +Vì vậy, chúng tôi vẫn có các từ khóa for và của chúng tôi được đánh dấu + +35 +00:02:13,570 --> 00:02:16,540 +bằng màu xanh lam, nhưng thay vì lặp qua một + +36 +00:02:17,050 --> 00:02:21,910 +danh sách, chúng tôi xác định cách thức hoạt động của vòng lặp bằng cách tạo một phạm vi. + +37 +00:02:22,300 --> 00:02:23,050 +Vì vậy, + +38 +00:02:23,050 --> 00:02:28,050 +trong trường hợp này, tôi đang tạo một phạm vi từ a đến b và sau đó tôi sẽ nắm giữ + +39 +00:02:29,050 --> 00:02:32,320 +từng số trong phạm vi đó và làm điều gì đó với số đó. + +40 +00:02:33,700 --> 00:02:38,200 +Vì vậy, ví dụ: nếu tôi đã viết cho số trong phạm vi, và + +41 +00:02:38,560 --> 00:02:42,130 +sau đó phạm vi của tôi sẽ là 1, 10. + +42 +00:02:42,520 --> 00:02:46,510 +Vì vậy, đây sẽ là phạm vi mà tôi sẽ tạo từ 1 đến 10 + +43 +00:02:46,870 --> 00:02:50,470 +và sau đó tôi muốn nắm giữ từng số trong phạm vi đó. + +44 +00:02:50,980 --> 00:02:55,810 +Và con số này sẽ nằm trong khoảng từ 1 đến 10 và không bao gồm 10. + +45 +00:02:56,170 --> 00:03:00,340 +Vì vậy, nếu tôi tiếp tục và in ra số mà tôi tạo từ vòng lặp for + +46 +00:03:00,820 --> 00:03:05,800 +của mình, thì bạn sẽ thấy rằng điều gì sẽ xảy ra là nó in ra 1 2 3 4 5 + +47 +00:03:05,800 --> 00:03:10,210 +6 7 8 9, nhưng không phải là chữ số cuối cùng mà tôi đã bao gồm nơi đây. + +48 +00:03:10,660 --> 00:03:14,680 +Vì vậy, nếu tôi muốn tất cả các số từ 1 đến 10, tôi thực + +49 +00:03:15,010 --> 00:03:17,920 +sự phải đặt một phạm vi từ 1 đến 11. + +50 +00:03:18,610 --> 00:03:20,230 +Và bây giờ khi bạn chạy + +51 +00:03:20,290 --> 00:03:23,050 +mã, bạn có thể thấy rằng nó đi từ 1 đến 10. + +52 +00:03:24,580 --> 00:03:26,320 +Bây giờ theo mặc định, hàm + +53 +00:03:26,380 --> 00:03:31,380 +phạm vi sẽ đi qua tất cả các số từ đầu đến cuối và nó sẽ + +54 +00:03:32,710 --> 00:03:35,170 +tăng lên 1. Bây giờ, nếu + +55 +00:03:35,170 --> 00:03:37,870 +bạn muốn nó tăng thêm bất kỳ số + +56 +00:03:38,020 --> 00:03:43,020 +nào khác, thì bạn phải thêm một dấu phẩy khác vào cuối nó và chỉ định + +57 +00:03:44,140 --> 00:03:48,910 +mức độ lớn mà bạn muốn bước. Vì vậy, giả sử chúng tôi đã thay đổi kích thước bước thành ba. + +58 +00:03:49,390 --> 00:03:51,610 +Bây giờ, nếu tôi chạy lại cùng một mã, + +59 +00:03:51,850 --> 00:03:55,930 +bạn sẽ thấy rằng nó đi từ một rồi đến từng bước từ ba đến bốn và + +60 +00:03:55,930 --> 00:03:59,260 +sau đó là từng bước một. Và sau đó nó từng bước lên ba, cuối cùng là 10. + +61 +00:04:01,000 --> 00:04:04,180 +Bây giờ chúng ta hãy quay trở lại vấn đề mà tôi đã đề cập + +62 +00:04:04,180 --> 00:04:05,013 +ở đầu bài. + +63 +00:04:05,170 --> 00:04:10,170 +Làm thế nào chúng ta có thể cộng tất cả các số từ 1 đến 100 bằng cách sử dụng mã? + +64 +00:04:10,720 --> 00:04:14,590 +Chà, nó sẽ liên quan đến vòng lặp for và nó sẽ liên + +65 +00:04:15,070 --> 00:04:20,070 +quan đến hàm phạm vi vì chúng ta sẽ nắm giữ mọi số trong phạm vi từ + +66 +00:04:20,769 --> 00:04:21,490 +1 đến + +67 +00:04:21,490 --> 00:04:26,050 +100, vì vậy chúng ta cần viết 101. Khi chúng tôi đã nắm được tất + +68 +00:04:26,110 --> 00:04:29,830 +cả những con số này, nó đơn giản như sử dụng bộ tích + +69 +00:04:29,860 --> 00:04:34,810 +lũy, vì vậy giả sử tổng = 0. Và sau đó bên trong vòng + +70 +00:04:34,810 --> 00:04:36,100 +lặp for, nghĩa + +71 +00:04:36,370 --> 00:04:41,370 +là được thụt lề, chúng ta sẽ nói tổng số + =. + +72 +00:04:43,090 --> 00:04:48,090 +Vì vậy, bây giờ nó sẽ thêm mọi số trong phạm vi này vào tổng số bắt đầu từ + +73 +00:04:48,790 --> 00:04:49,623 +số không. + +74 +00:04:49,900 --> 00:04:54,760 +Và điều này về cơ bản sẽ cho chúng ta tổng của mọi số từ 1 đến 100. + +75 +00:04:55,150 --> 00:04:59,770 +Vì vậy, hãy tiếp tục và in nó ra và xem nó có phù hợp với giá trị của Gauss không. + +76 +00:05:01,690 --> 00:05:04,570 +Và bạn có nó 5,050. + +77 +00:05:05,440 --> 00:05:09,160 +Vì vậy, bây giờ chúng ta đã đánh bại Gauss trong trò chơi toán học sử dụng lập + +78 +00:05:09,430 --> 00:05:13,240 +trình của riêng anh ấy, hãy chuyển sang bài học tiếp theo và cố gắng hoàn thành một + +79 +00:05:13,240 --> 00:05:17,770 +thử thách bằng cách sử dụng hàm phạm vi để xem liệu bạn có quản lý và hiểu được mọi thứ chúng + +80 +00:05:17,770 --> 00:05:21,760 +ta đã nói trong bài học này không . Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/006 Exercise-18.url b/part1/05 - Day 5 - Beginner - Python Loops/006 Exercise-18.url new file mode 100644 index 0000000000000000000000000000000000000000..67b14f2228540e5e3383cd0c3f920ad893e90e01 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/006 Exercise-18.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/c8a70cc6-7b64-42ad-880b-e2034e8cb8bc \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/006 How-to-join-Auditorium.url b/part1/05 - Day 5 - Beginner - Python Loops/006 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/006 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/006 [Interactive Coding Exercise] Adding Even Numbers.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/006 [Interactive Coding Exercise] Adding Even Numbers.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bf4c4cdfffe9310af68eca447f42c7f26805e151 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/006 [Interactive Coding Exercise] Adding Even Numbers.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:942fc88cf540a31360ab5c296463e3fbf42aee41dea1dd6ec9ba712508fad42d +size 20169633 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/006 [Interactive Coding Exercise] Adding Even Numbers_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/006 [Interactive Coding Exercise] Adding Even Numbers_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e80a3331d829ab8325554c2c7007251385ccbfee --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/006 [Interactive Coding Exercise] Adding Even Numbers_vi.srt @@ -0,0 +1,480 @@ +1 +00:00:00,440 --> 00:00:01,620 +Trong bài tập + +2 +00:00:01,620 --> 00:00:04,890 +này, bạn sẽ viết một chương trình tính + +3 +00:00:04,890 --> 00:00:09,890 +tổng của tất cả các số chẵn từ 1 đến một số cụ thể. + +4 +00:00:11,280 --> 00:00:15,480 +Vì vậy, trong phần Đầu vào, chúng ta sẽ nhập + +5 +00:00:15,480 --> 00:00:20,480 +một số cụ thể và sau đó mã sẽ bắt đầu từ 1, tìm tất cả các + +6 +00:00:20,640 --> 00:00:23,250 +số chẵn từ 1 đến số Đầu vào, sau + +7 +00:00:23,250 --> 00:00:27,240 +đó cộng tất cả chúng lại với nhau. + +8 +00:00:27,240 --> 00:00:28,080 +Để đảm bảo mã không + +9 +00:00:28,080 --> 00:00:30,630 +mất quá nhiều thời gian để chạy, chúng tôi + +10 +00:00:30,630 --> 00:00:34,080 +đang đảm bảo dữ liệu đầu vào không vượt quá 1.000 vì bạn + +11 +00:00:34,080 --> 00:00:36,480 +có thể đã ngồi đây rất lâu. + +12 +00:00:36,480 --> 00:00:39,930 +Vì vậy, hãy đảm bảo rằng bạn nhập dữ liệu đầu vào dưới + +13 +00:00:39,930 --> 00:00:44,070 +dạng số nhỏ như dưới một trăm hoặc ít nhất là dưới một nghìn. + +14 +00:00:44,070 --> 00:00:47,280 +Càng dài thì mã của bạn sẽ chạy càng lâu. + +15 +00:00:47,280 --> 00:00:50,700 +Nhưng hãy đảm bảo rằng mã của bạn đạt được chức năng của nó. + +16 +00:00:50,700 --> 00:00:52,170 +Kiểm tra khung Mô tả, xem + +17 +00:00:52,170 --> 00:00:54,090 +xét Đầu vào mẫu và Đầu ra mẫu dự kiến, + +18 +00:00:54,090 --> 00:00:56,550 +đồng thời xem liệu bạn có thể tìm ra cách thực + +19 +00:00:56,550 --> 00:00:59,040 +hiện việc này bằng cách sử dụng bất kỳ hàm + +20 +00:00:59,040 --> 00:01:01,980 +Python nào mà bạn có thể gặp cũng như sử dụng tất cả + +21 +00:01:01,980 --> 00:01:04,200 +các kỹ năng cơ bản trong lập trình Python + +22 +00:01:04,200 --> 00:01:06,453 +mà bạn không. đã có. + +23 +00:01:07,410 --> 00:01:10,890 +Và như một gợi ý, bạn có thể muốn tra cứu hàm range() để giúp + +24 +00:01:10,890 --> 00:01:12,873 +bạn hoàn thành bài tập này. + +25 +00:01:15,360 --> 00:01:18,870 +Bây giờ, có một số cách để đạt được điều này và + +26 +00:01:18,870 --> 00:01:23,760 +tôi đã đưa hai cách vào giải pháp hoàn chỉnh nhưng chúng ta hãy xem + +27 +00:01:23,760 --> 00:01:25,510 +xét cách đầu tiên. + +28 +00:01:26,370 --> 00:01:29,190 +Chúng ta bắt đầu với một biến có tên + +29 +00:01:29,190 --> 00:01:31,980 +là Even_sum và đặt nó bằng 0. + +30 +00:01:31,980 --> 00:01:33,660 +Đây sẽ là bộ tích lũy của chúng tôi. + +31 +00:01:33,660 --> 00:01:36,690 +Chúng ta sẽ sử dụng biến này để cộng vào nó và có + +32 +00:01:36,690 --> 00:01:38,673 +thể nhận được tổng cuối cùng. + +33 +00:01:40,140 --> 00:01:43,500 +Bây giờ, làm thế nào chúng ta sẽ tích lũy vào nó? + +34 +00:01:43,500 --> 00:01:46,320 +Chà, chúng ta sẽ sử dụng vòng + +35 +00:01:46,320 --> 00:01:50,910 +lặp for để lặp qua từng số trong phạm vi, + +36 +00:01:50,910 --> 00:01:55,910 +bắt đầu từ 2, là số chẵn đầu tiên sau 1. + +37 +00:01:56,220 --> 00:01:58,800 +Vì vậy, hãy nhớ rằng chúng ta đang tìm + +38 +00:01:58,800 --> 00:02:02,220 +kiếm tất cả các số chẵn từ 1 đến số mục tiêu. + +39 +00:02:02,220 --> 00:02:06,060 +Và hàm range() lấy điểm bắt đầu, điểm kết thúc và + +40 +00:02:06,060 --> 00:02:07,380 +điểm tăng dần, tương + +41 +00:02:07,380 --> 00:02:11,730 +tự như vòng lặp for truyền thống của chúng tôi mà bạn có thể + +42 +00:02:11,730 --> 00:02:12,930 +gặp phải nếu đã học + +43 +00:02:12,930 --> 00:02:15,420 +ngôn ngữ lập trình C hoặc các ngôn + +44 +00:02:15,420 --> 00:02:18,300 +ngữ lập trình cũ khác. + +45 +00:02:18,300 --> 00:02:20,730 +Về cơ bản, chúng ta có thể cung cấp ba + +46 +00:02:20,730 --> 00:02:23,400 +thông tin đầu vào thông qua hàm range() + +47 +00:02:23,400 --> 00:02:27,930 +bắt đầu, kết thúc và mức tăng mà chúng ta sẽ thực hiện mỗi lần. + +48 +00:02:27,930 --> 00:02:31,020 +Bây giờ bạn có thể đọc hàm range() của Python + +49 +00:02:31,020 --> 00:02:33,270 +nhưng về cơ bản những gì chúng + +50 +00:02:33,270 --> 00:02:35,130 +ta đang làm ở đây là tạo một + +51 +00:02:35,130 --> 00:02:37,440 +vòng lặp for và chúng ta đang tạo + +52 +00:02:37,440 --> 00:02:41,940 +một phạm vi, bắt đầu từ 2, kết thúc ở đích + 1. + +53 +00:02:41,940 --> 00:02:44,820 +Và lý do tại sao nó kết thúc ở target + +54 +00:02:44,820 --> 00:02:49,820 ++1 là vì phạm vi sẽ dừng ngay trước khi kết thúc. + +55 +00:02:49,830 --> 00:02:53,640 +Vì vậy, nếu mục tiêu của bạn là 100 thì phạm + +56 +00:02:53,640 --> 00:02:56,640 +vi sẽ cung cấp cho bạn một phạm vi số + +57 +00:02:56,640 --> 00:02:58,860 +bắt đầu từ 2 cho đến 99. + +58 +00:02:58,860 --> 00:03:02,310 +Vì vậy, chúng ta phải sửa đổi điều đó bằng cách + +59 +00:03:02,310 --> 00:03:06,240 +thêm 1 nếu muốn bao gồm số mục tiêu trong phạm vi này. + +60 +00:03:06,240 --> 00:03:09,030 +Vì vậy, 2 dấu phẩy rồi nhắm mục tiêu + 1, + +61 +00:03:09,030 --> 00:03:11,880 +rồi con số cuối cùng là số tiền chúng ta + +62 +00:03:11,880 --> 00:03:14,370 +muốn thêm vào số bắt đầu mỗi lần. + +63 +00:03:14,370 --> 00:03:17,640 +Vậy khoảng cách giữa mỗi số là bao nhiêu. + +64 +00:03:17,640 --> 00:03:19,410 +Bởi vì chúng ta muốn tất cả + +65 +00:03:19,410 --> 00:03:21,900 +các số chẵn, mỗi lần chúng ta sẽ cộng + +66 +00:03:21,900 --> 00:03:23,520 +2 và sau đó chúng ta sẽ lặp + +67 +00:03:23,520 --> 00:03:25,653 +qua từng số trong phạm vi đó. + +68 +00:03:27,480 --> 00:03:30,300 +Tôi khuyên bạn, nếu điều này gây nhầm lẫn, + +69 +00:03:30,300 --> 00:03:33,840 +bạn chỉ cần in ra những gì phạm vi đó tạo ra, sau đó thay + +70 +00:03:33,840 --> 00:03:37,170 +đổi từng đầu vào trong phạm vi đó, sau đó đảm bảo bạn + +71 +00:03:37,170 --> 00:03:39,873 +hiểu cách hoạt động của phạm vi đó. + +72 +00:03:41,670 --> 00:03:44,910 +Nhưng một khi bạn đã hiểu thì nó thực sự khá đơn giản, + +73 +00:03:44,910 --> 00:03:46,560 +chúng ta lặp qua từng số trong + +74 +00:03:46,560 --> 00:03:49,230 +phạm vi nhân tạo mà chúng ta đã tạo này, sau + +75 +00:03:49,230 --> 00:03:51,720 +đó chúng ta chỉ cần cộng từng số trong + +76 +00:03:51,720 --> 00:03:54,690 +phạm vi đó với nhau và cuối cùng chúng ta sẽ có + +77 +00:03:54,690 --> 00:03:58,890 +với tổng của tất cả các số trong phạm vi đó, và sau đó chúng ta có + +78 +00:03:58,890 --> 00:04:00,813 +thể in nó ra. + +79 +00:04:02,400 --> 00:04:06,150 +Trong phương pháp thứ hai để hoàn thành bài tập viết mã này, và tin + +80 +00:04:06,150 --> 00:04:07,590 +tôi đi, có nhiều hơn hai cách + +81 +00:04:07,590 --> 00:04:09,810 +để đạt được điều này, đây chỉ là một cách + +82 +00:04:09,810 --> 00:04:12,420 +khác mà tôi muốn giới thiệu cho bạn. + +83 +00:04:12,420 --> 00:04:14,160 +Trong trường hợp này, chúng tôi đang + +84 +00:04:14,160 --> 00:04:16,350 +tạo một phạm vi chỉ có phần đầu và phần cuối. + +85 +00:04:16,350 --> 00:04:18,959 +Bây giờ, khi chúng ta không chỉ định + +86 +00:04:18,959 --> 00:04:21,779 +mức tăng, giá trị thứ ba trong hàm phạm + +87 +00:04:21,779 --> 00:04:24,060 +vi, thì nó sẽ tăng thêm 1. + +88 +00:04:24,060 --> 00:04:29,060 +Vì vậy, chúng tôi bắt đầu từ 1 và kết thúc phạm vi của mình ở mục tiêu + 1 để bao gồm mục tiêu, + +89 +00:04:29,070 --> 00:04:32,280 +không vượt lên trên mục tiêu, đó chỉ là điểm đặc biệt về + +90 +00:04:32,280 --> 00:04:35,040 +cách hoạt động của phạm vi, sau đó chúng tôi lặp + +91 +00:04:35,040 --> 00:04:37,080 +qua phạm vi và sau đó chúng tôi sử dụng + +92 +00:04:37,080 --> 00:04:39,030 +công cụ kiểm tra chẵn của mình. chúng + +93 +00:04:39,030 --> 00:04:42,660 +tôi đã tạo trước đây bằng cách sử dụng modulo (%). + +94 +00:04:42,660 --> 00:04:45,660 +Vì vậy, chúng ta nói rằng nếu số mà chúng ta + +95 +00:04:45,660 --> 00:04:47,910 +hiện đang lặp qua, modulo 2 bằng + +96 +00:04:47,910 --> 00:04:50,070 +0, thì nó hoàn toàn chia hết cho + +97 +00:04:50,070 --> 00:04:52,800 +2, do đó nó phải là số chẵn, trong trường + +98 +00:04:52,800 --> 00:04:56,280 +hợp đó, chúng ta sẽ thêm số này vào alternative_sum + +99 +00:04:56,280 --> 00:04:59,430 +để tích lũy những số đó là số chẵn. + +100 +00:04:59,430 --> 00:05:01,590 +Và cuối cùng, chúng tôi in nó ra. + +101 +00:05:01,590 --> 00:05:06,330 +Vì vậy, nếu bạn đã tạo một chương trình khác nhưng nó vẫn hoạt động + +102 +00:05:06,330 --> 00:05:10,440 +và bạn đã sử dụng được vòng lặp for thì xin chúc mừng. + +103 +00:05:10,440 --> 00:05:12,690 +Đó là tất cả những gì tôi muốn thấy. + +104 +00:05:12,690 --> 00:05:14,670 +Bây giờ, rất thường xuyên khi lập + +105 +00:05:14,670 --> 00:05:18,060 +trình, bạn có thể có những nhu cầu nhất định mà bạn có thể + +106 +00:05:18,060 --> 00:05:20,790 +muốn lấy tổng của tất cả các số trong một danh + +107 +00:05:20,790 --> 00:05:24,480 +sách hoặc số lớn nhất của tất cả các số trong danh sách. + +108 +00:05:24,480 --> 00:05:26,130 +Bây giờ, nếu bạn sử dụng Google + +109 +00:05:26,130 --> 00:05:29,400 +nhanh chóng và không thể tìm ra cách nào hay để thực + +110 +00:05:29,400 --> 00:05:33,210 +hiện việc đó, một cách đơn giản như hàm len() hoặc hàm sum(), + +111 +00:05:33,210 --> 00:05:36,660 +thì bạn biết rằng bạn luôn có thể tự viết nó. + +112 +00:05:36,660 --> 00:05:38,370 +Nhưng nếu bạn tìm kiếm nó và tìm thấy thứ + +113 +00:05:38,370 --> 00:05:39,930 +gì đó, chẳng hạn như trong trường hợp + +114 +00:05:39,930 --> 00:05:41,700 +này là hàm range() và bạn thực sự muốn sử + +115 +00:05:41,700 --> 00:05:43,020 +dụng nó, thì nó thường có thể giúp + +116 +00:05:43,020 --> 00:05:45,150 +bạn tiết kiệm rất nhiều thời gian. + +117 +00:05:45,150 --> 00:05:46,710 +Vì thế có rất nhiều lựa chọn và càng + +118 +00:05:46,710 --> 00:05:49,230 +có nhiều lựa chọn hơn khi bạn có nhiều kỹ năng hơn. + +119 +00:05:49,230 --> 00:05:52,530 +Vì vậy, hy vọng bài tập này có hiệu quả với bạn. + +120 +00:05:52,530 --> 00:05:56,043 +Nếu không, hãy nhớ quay lại và sửa đổi mã của bạn nếu cần. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/007 Exercise-19.url b/part1/05 - Day 5 - Beginner - Python Loops/007 Exercise-19.url new file mode 100644 index 0000000000000000000000000000000000000000..93c28ccc4ccd3d6b9809576662fb74a822170ca3 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/007 Exercise-19.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/40e95268-2b4a-4b56-9dee-3df9e198213e \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/007 How-to-join-Auditorium.url b/part1/05 - Day 5 - Beginner - Python Loops/007 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/007 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/007 [Interactive Coding Exercise] The FizzBuzz Job Interview Question.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/007 [Interactive Coding Exercise] The FizzBuzz Job Interview Question.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d4e3f6562e09e9ed268dbcd0ddc95152b566a514 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/007 [Interactive Coding Exercise] The FizzBuzz Job Interview Question.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a3ea073e0da337b06458b8ca617ae6c37a84ca93392e48936e0c501b81c0f0b +size 14884518 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/007 [Interactive Coding Exercise] The FizzBuzz Job Interview Question_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/007 [Interactive Coding Exercise] The FizzBuzz Job Interview Question_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0fa65deec21944d9561bdba4c501d19a648ad8d2 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/007 [Interactive Coding Exercise] The FizzBuzz Job Interview Question_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,510 --> 00:00:02,670 +Trong bài tập viết mã này, bạn + +2 +00:00:02,670 --> 00:00:05,850 +sẽ viết một chương trình thường được yêu cầu + +3 +00:00:05,850 --> 00:00:08,940 +trong các cuộc phỏng vấn viết mã, vì vậy nếu + +4 +00:00:08,940 --> 00:00:11,850 +bạn đang tìm việc, hãy lưu ý. + +5 +00:00:11,850 --> 00:00:16,850 +Rất thường xuyên, giám khảo hoặc người phỏng vấn có thể yêu cầu bạn viết + +6 +00:00:17,400 --> 00:00:21,090 +một chương trình để tạo lại trò chơi FizzBuzz. + +7 +00:00:21,090 --> 00:00:23,100 +Bây giờ, nếu bạn chưa bao giờ + +8 +00:00:23,100 --> 00:00:24,420 +chơi trò chơi FizzBuzz + +9 +00:00:24,420 --> 00:00:26,820 +thì điều đó khá đơn giản, giả sử bạn + +10 +00:00:26,820 --> 00:00:28,500 +có năm người bạn, bạn đứng + +11 +00:00:28,500 --> 00:00:33,500 +thành vòng tròn và mỗi người bạn gọi số tiếp theo bắt đầu từ 1. + +12 +00:00:33,810 --> 00:00:38,810 +Tuy nhiên, bây giờ trò chơi bắt đầu khi bạn gặp một + +13 +00:00:39,720 --> 00:00:44,720 +số chia hết cho 3 thì thay vào đó bạn nên nói Fizz. + +14 +00:00:45,810 --> 00:00:48,990 +Và nếu bạn gặp một số chia hết cho 5 thì thay + +15 +00:00:48,990 --> 00:00:51,870 +vì nói số đó, bạn nên nói Buzz. + +16 +00:00:51,870 --> 00:00:53,970 +Và nếu số đó chia hết cho + +17 +00:00:53,970 --> 00:00:57,420 +cả 3 và 5, chẳng hạn như 15 thì thay + +18 +00:00:57,420 --> 00:01:01,110 +vì nói số đó, bạn nói, FizzBuzz. + +19 +00:01:01,110 --> 00:01:05,459 +Đây là trò chơi toán học đã làm khổ biết bao đứa trẻ + +20 +00:01:05,459 --> 00:01:10,460 +trong những chuyến đi xa của bố mẹ, trong đó có tôi. + +21 +00:01:10,708 --> 00:01:13,740 +Nhưng trong trường hợp này, chúng ta sẽ chuyển + +22 +00:01:13,740 --> 00:01:17,100 +nó thành mã để nó có thể làm điều đó cho chúng ta. + +23 +00:01:17,100 --> 00:01:19,290 +Chương trình của bạn sẽ in + +24 +00:01:19,290 --> 00:01:23,370 +lần lượt từng số từ 1 đến 100, vì vậy bắt đầu từ 1, + +25 +00:01:23,370 --> 00:01:25,140 +2, nhưng khi gặp số chia + +26 +00:01:25,140 --> 00:01:26,520 +hết cho 3, chương + +27 +00:01:26,520 --> 00:01:31,050 +trình sẽ in ra Fizz, chia hết cho 5 Buzz, và nếu chia + +28 +00:01:31,050 --> 00:01:35,070 +hết cho cả hai, nó sẽ in FizzBuzz. + +29 +00:01:35,070 --> 00:01:37,410 +Hãy nhìn vào bên trong khung Mô + +30 +00:01:37,410 --> 00:01:39,990 +tả và xem nó trông như thế nào. + +31 +00:01:39,990 --> 00:01:44,790 +Và tôi chỉ lên tới 15, nhưng mục tiêu của bạn là lên tới 100 và đảm bảo + +32 +00:01:44,790 --> 00:01:47,760 +rằng bạn đang sử dụng mã để thực hiện việc + +33 +00:01:47,760 --> 00:01:50,040 +này thay vì chỉ làm việc. + +34 +00:01:50,040 --> 00:01:53,400 +Và hãy nhớ rằng câu trả lời của bạn phải + +35 +00:01:53,400 --> 00:01:57,360 +bắt đầu từ 1 và in đến và bao gồm 100. + +36 +00:01:57,360 --> 00:02:00,600 +Bây giờ, 100 có thể không phải là 100 có thể là Fizz, có thể là + +37 +00:02:00,600 --> 00:02:01,950 +Buzz, có thể là FizzBuzz, + +38 +00:02:01,950 --> 00:02:04,170 +bạn sẽ phải sử dụng mã của mình để tính ra + +39 +00:02:04,170 --> 00:02:06,390 +và mỗi số văn bản sẽ được in trên một dòng + +40 +00:02:06,390 --> 00:02:07,410 +riêng biệt. + +41 +00:02:07,410 --> 00:02:09,240 +Đó là những quy tắc. + +42 +00:02:09,240 --> 00:02:13,293 +Bây giờ hãy thử xem bạn có thể hoàn thành thử thách này không. + +43 +00:02:16,560 --> 00:02:20,160 +Điều đầu tiên tôi sẽ làm là đặt mục tiêu và chúng + +44 +00:02:20,160 --> 00:02:22,950 +tôi sẽ đặt mục tiêu là 100. + +45 +00:02:22,950 --> 00:02:26,400 +Và sau đó tôi sẽ sử dụng mục tiêu đó để tạo ra một phạm vi. + +46 +00:02:26,400 --> 00:02:29,640 +Bây giờ, hãy nhớ rằng, như bạn đã thấy trong + +47 +00:02:29,640 --> 00:02:33,330 +bài tập viết mã trước, hàm range() nhận số bắt đầu + +48 +00:02:33,330 --> 00:02:36,570 +và số kết thúc, nhưng nó không bao gồm số kết + +49 +00:02:36,570 --> 00:02:37,530 +thúc đó. + +50 +00:02:37,530 --> 00:02:40,770 +Vì vậy, chúng ta phải thêm một giá trị vào mục tiêu + +51 +00:02:40,770 --> 00:02:43,530 +của mình để tạo phạm vi lên tới 100. + +52 +00:02:43,530 --> 00:02:45,660 +Bây giờ, khi chúng ta đã có phạm + +53 +00:02:45,660 --> 00:02:49,350 +vi của mình, nó sẽ tăng dần trong phạm vi lên 1 vì + +54 +00:02:49,350 --> 00:02:51,960 +chúng ta chưa chỉ định khác và sau + +55 +00:02:51,960 --> 00:02:54,690 +đó chúng ta sẽ lặp qua từng số trong + +56 +00:02:54,690 --> 00:02:56,913 +phạm vi từ 1 đến 100. + +57 +00:02:57,900 --> 00:02:59,130 +Bây giờ, điều đầu + +58 +00:02:59,130 --> 00:03:02,640 +tiên chúng ta sẽ kiểm tra là liệu số mà chúng ta đang + +59 +00:03:02,640 --> 00:03:07,640 +lặp qua có thể được chia rõ ràng cho 3 và chia rõ ràng cho 5 hay không, + +60 +00:03:08,670 --> 00:03:11,340 +thì chúng ta sẽ in FizzBuzz. + +61 +00:03:11,340 --> 00:03:12,810 +Hãy nhớ rằng thứ tự + +62 +00:03:12,810 --> 00:03:17,460 +rất quan trọng, một câu lệnh if bắt đầu kiểm tra từ đầu + +63 +00:03:17,460 --> 00:03:22,460 +và Elif sẽ xuất hiện nếu những câu lệnh đầu tiên sai. + +64 +00:03:22,830 --> 00:03:25,260 +Vì vậy, nếu lần đầu tiên chúng ta + +65 +00:03:25,260 --> 00:03:28,200 +kiểm tra, nếu số đó hoàn toàn chia hết + +66 +00:03:28,200 --> 00:03:29,580 +cho 3 và chúng ta in + +67 +00:03:29,580 --> 00:03:31,650 +ra Fizz thì chúng ta sẽ bỏ sót + +68 +00:03:31,650 --> 00:03:34,710 +trường hợp nó cũng chia hết cho 5. + +69 +00:03:34,710 --> 00:03:37,350 +Đây là điều quan trọng cần nhận ra trong + +70 +00:03:37,350 --> 00:03:39,840 +logic của chương trình này và có thể + +71 +00:03:39,840 --> 00:03:43,830 +bạn đã giải quyết được nó bằng cách thử một số thứ hoặc bằng + +72 +00:03:43,830 --> 00:03:46,290 +cách nhận ra nó ngay từ đầu nhưng đây + +73 +00:03:46,290 --> 00:03:49,260 +là điều mà bạn có thể đã bỏ sót và có thể cần phải + +74 +00:03:49,260 --> 00:03:51,180 +quay lại và kiểm tra. + +75 +00:03:51,180 --> 00:03:53,850 +Bây giờ, các phần tiếp theo khá đơn giản. + +76 +00:03:53,850 --> 00:03:56,190 +Nếu điều kiện đầu tiên không được đáp + +77 +00:03:56,190 --> 00:03:59,160 +ứng, tức là nó không phải là một số có thể chia + +78 +00:03:59,160 --> 00:04:02,130 +cho 3 và 5 cùng một lúc, thì chúng ta sẽ kiểm tra + +79 +00:04:02,130 --> 00:04:04,530 +xem nó có chia hết cho 3 không? + +80 +00:04:04,530 --> 00:04:06,510 +Trong trường hợp đó chúng tôi sẽ in Fizz. + +81 +00:04:06,510 --> 00:04:09,000 +Ngược lại, nó có chia hết cho 5 không, trong + +82 +00:04:09,000 --> 00:04:10,590 +đó chúng ta sẽ in Buzz và ngược + +83 +00:04:10,590 --> 00:04:13,530 +lại, nếu nó không chia cho bất kỳ số nào trong số đó và + +84 +00:04:13,530 --> 00:04:15,510 +không đáp ứng bất kỳ điều kiện nào trong + +85 +00:04:15,510 --> 00:04:17,850 +số đó thì chúng ta chỉ in số đó. + +86 +00:04:17,850 --> 00:04:20,430 +Và bởi vì chúng ta lặp qua từng số một + +87 +00:04:20,430 --> 00:04:23,820 +nên chúng ta sẽ in chúng ra theo thứ tự từng số + +88 +00:04:23,820 --> 00:04:26,823 +một và kiểm tra từng tiêu chí này. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/008 Course-Fixes-Report-an-Issue.url b/part1/05 - Day 5 - Beginner - Python Loops/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/008 Day 5 Project Create a Password Generator.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/008 Day 5 Project Create a Password Generator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..077b68b617a4e5b8cb61cfbcf09b1c95b5118ae6 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/008 Day 5 Project Create a Password Generator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a47c00e33d5b26dcf6beea5bc583fbea70ef5372630e5a081b28397f4cf97df +size 172559948 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/008 Day 5 Project Create a Password Generator_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/008 Day 5 Project Create a Password Generator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..866cdde62f3d18e98f2a2c0b9fb0e7898b965012 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/008 Day 5 Project Create a Password Generator_vi.srt @@ -0,0 +1,1008 @@ +1 +00:00:00,450 --> 00:00:03,210 +Bây giờ chúng ta đã tìm hiểu tất cả về các vòng + +2 +00:00:03,540 --> 00:00:06,960 +lặp trong Python, cuối cùng chúng ta đã sẵn sàng giải quyết dự án cuối cùng + +3 +00:00:07,290 --> 00:00:09,690 +của chúng ta trong ngày, đó là trình tạo PyPassword. + +4 +00:00:10,440 --> 00:00:14,100 +Chương trình của chúng tôi sẽ hỏi chúng tôi bạn muốn có bao nhiêu chữ cái trong mật khẩu của mình? + +5 +00:00:14,100 --> 00:00:17,640 +Vì vậy, tôi sẽ nói rằng tôi muốn một mật khẩu dài, giả sử là 14. + +6 +00:00:18,300 --> 00:00:22,290 +Có bao nhiêu ký hiệu, 3, bao nhiêu số, 4, và nó sẽ + +7 +00:00:22,950 --> 00:00:27,390 +tạo cho tôi một mật khẩu mà hầu như không thể bị hacker nào bẻ + +8 +00:00:27,390 --> 00:00:30,840 +khóa được, cho dù họ có tài giỏi đến đâu. + +9 +00:00:31,620 --> 00:00:35,640 +Vì vậy, dự án của ngày hôm nay là xây dựng trình tạo mật khẩu này. + +10 +00:00:36,180 --> 00:00:38,670 +Nếu bạn đi đến Repl cụ thể này. nó, mật khẩu-tạo-bắt + +11 +00:00:38,670 --> 00:00:43,320 +đầu, sau đó bạn sẽ thấy rằng ở đây tôi đã đưa vào cho + +12 +00:00:43,320 --> 00:00:48,320 +bạn danh sách tất cả các chữ cái trong bảng chữ cái từ A đến + +13 +00:00:48,360 --> 00:00:51,630 +Z, bao gồm cả chữ hoa và chữ thường. + +14 +00:00:52,200 --> 00:00:56,850 +Tôi có một loạt các số và một loạt các ký hiệu thường được các trang web + +15 +00:00:56,850 --> 00:00:58,260 +chấp nhận trong mật khẩu. + +16 +00:00:59,040 --> 00:01:03,330 +Và tôi cũng đã tạo các đầu vào mà bạn đã thấy khi chúng tôi thực hiện bản demo. + +17 +00:01:03,870 --> 00:01:07,440 +Vì vậy, nó sẽ hỏi chúng tôi có bao nhiêu chữ cái, bao nhiêu ký + +18 +00:01:07,920 --> 00:01:12,270 +hiệu, bao nhiêu số và sau đó bạn sẽ chuyển tất cả kiến thức đó cũng như sử + +19 +00:01:12,270 --> 00:01:13,080 +dụng các danh + +20 +00:01:13,080 --> 00:01:18,060 +sách này và những gì bạn đã học về các vòng lặp vào cùng một trình tạo mật khẩu. bạn đã + +21 +00:01:18,060 --> 00:01:19,890 +thấy trong bản trình diễn cuối cùng. + +22 +00:01:20,340 --> 00:01:23,160 +Vì vậy, hãy tự mình chơi thử bản demo + +23 +00:01:23,700 --> 00:01:27,900 +cuối cùng và sau đó suy nghĩ về cách bạn có thể đạt được + +24 +00:01:27,900 --> 00:01:32,900 +mục tiêu này là tạo mật khẩu ngẫu nhiên cho người dùng dựa trên số chữ cái, + +25 +00:01:33,330 --> 00:01:35,670 +ký hiệu và số mà họ muốn. + +26 +00:01:37,050 --> 00:01:40,110 +Bây giờ có hai cấp độ cho dự án này. + +27 +00:01:40,200 --> 00:01:45,200 +Bạn có thể sử dụng phiên bản dễ dàng mà tất cả những gì bạn phải làm là + +28 +00:01:46,680 --> 00:01:51,180 +tạo mật khẩu của mình theo trình tự. Vì vậy, ví dụ: nếu người dùng muốn bốn + +29 +00:01:51,540 --> 00:01:53,250 +chữ cái, hai ký hiệu và + +30 +00:01:53,550 --> 00:01:58,550 +hai số, thì nó có thể giống như bốn chữ cái này, sau đó là hai ký hiệu và sau + +31 +00:02:01,080 --> 00:02:04,650 +đó là hai số. Vì vậy, chúng theo trình tự phải không? Đầu tiên, bạn có các + +32 +00:02:04,950 --> 00:02:07,110 +chữ cái, sau đó bạn có số lượng ký hiệu cần + +33 +00:02:07,260 --> 00:02:11,490 +thiết, và sau đó bạn có các số bắt buộc. Vì vậy, đây là mức độ dễ dàng. + +34 +00:02:12,060 --> 00:02:17,060 +Và sau đó là mức độ khó. Và mức độ khó đòi hỏi bạn + +35 +00:02:18,330 --> 00:02:21,810 +phải tạo mật khẩu theo thứ tự hoàn toàn ngẫu nhiên. + +36 +00:02:21,840 --> 00:02:25,500 +Vì vậy, thay vì có nó là số ký hiệu chữ cái, nó phải có thể + +37 +00:02:25,800 --> 00:02:30,800 +là chữ cái và sau đó là một ký hiệu và sau đó là một số, sau đó là một chữ cái, + +38 +00:02:30,810 --> 00:02:33,930 +sau đó là một ký hiệu và sau đó là một số. + +39 +00:02:34,980 --> 00:02:37,950 +Nhưng hãy để ý xem điều này hoàn toàn ngẫu nhiên. + +40 +00:02:38,310 --> 00:02:40,020 +Mỗi lần bạn tạo nó, thứ tự + +41 +00:02:40,110 --> 00:02:45,110 +vị trí các ký hiệu và vị trí các số xuất hiện trong mật khẩu của bạn là hoàn + +42 +00:02:45,450 --> 00:02:47,430 +toàn ngẫu nhiên. Vì vậy, ví + +43 +00:02:47,430 --> 00:02:51,210 +dụ, nếu bạn nhìn vào phiên bản demo và tôi làm điều + +44 +00:02:51,210 --> 00:02:53,190 +tương tự, bốn chữ cái, hai + +45 +00:02:53,190 --> 00:02:58,110 +ký hiệu, hai số, nơi các con số và nơi các ký hiệu xảy ra là + +46 +00:02:58,110 --> 00:03:02,500 +hoàn toàn không thể đoán trước được. Và mỗi khi tôi tạo một mật khẩu mới, + +47 +00:03:02,770 --> 00:03:04,240 +nó sẽ lại chuyển nó lên. + +48 +00:03:04,360 --> 00:03:09,220 +Vì vậy, đó là mức độ khó. Tôi khuyên bạn nên thử mức độ dễ trước và + +49 +00:03:09,430 --> 00:03:13,660 +sau đó khi bạn đã làm được, sau đó nâng bản thân lên mức độ khó nếu + +50 +00:03:13,690 --> 00:03:17,710 +bạn nghĩ mình đã đạt được nó. Nhưng hãy nhớ rằng nếu bạn làm + +51 +00:03:17,770 --> 00:03:22,450 +ở mức độ khó, bạn có thể phải Google nhanh chóng một chút để tìm ra cách làm điều + +52 +00:03:22,450 --> 00:03:24,850 +gì đó mà bạn có thể chưa thấy trước đây. + +53 +00:03:25,330 --> 00:03:29,560 +Nhưng tất cả đều là một phần của thử thách và tôi hy vọng bạn sẽ thực hiện nó một cách mạnh mẽ. + +54 +00:03:29,710 --> 00:03:33,670 +Vì vậy, hãy tạm dừng video ngay bây giờ và cố gắng hoàn thành dự án cuối cùng. + +55 +00:03:42,580 --> 00:03:42,870 +Được + +56 +00:03:42,870 --> 00:03:47,730 +rồi, vì vậy, trước tiên hãy giải quyết mức độ dễ dàng, nơi chúng tôi chỉ tạo mật khẩu với + +57 +00:03:48,090 --> 00:03:52,680 +số lượng chữ cái cần thiết, sau đó là số lượng ký hiệu được yêu cầu và sau đó + +58 +00:03:52,680 --> 00:03:54,540 +là số lượng chữ số bắt buộc. + +59 +00:03:55,050 --> 00:03:57,060 +Vì vậy, hãy tiếp tục và giải quyết vấn đề này trước. + +60 +00:03:57,810 --> 00:04:01,680 +Bây giờ chúng tôi biết rằng chúng tôi có những danh sách này mà chúng tôi + +61 +00:04:01,890 --> 00:04:06,660 +có thể rút ra từ đó và chúng tôi biết rằng chúng tôi có thể sử dụng mô-đun ngẫu nhiên + +62 +00:04:06,660 --> 00:04:11,190 +để lấy một mục ngẫu nhiên từ danh sách. Vì vậy, tất cả những gì chúng ta phải làm trước tiên là lấy bốn chữ cái ngẫu nhiên. + +63 +00:04:11,610 --> 00:04:14,010 +Vì vậy, giả sử rằng chúng ta có + +64 +00:04:14,040 --> 00:04:16,769 +một mật khẩu bắt đầu dưới dạng một chuỗi trống. + +65 +00:04:17,430 --> 00:04:22,430 +Sau đó, chúng ta có thể sử dụng vòng lặp for để lặp qua tất cả các ký tự mà chúng ta + +66 +00:04:23,580 --> 00:04:27,030 +cần tạo cho mật khẩu của mình. Ví dụ, tôi + +67 +00:04:27,030 --> 00:04:32,030 +có thể nói cho char, viết tắt của ký tự, trong phạm + +68 +00:04:32,850 --> 00:04:38,100 +vi, ừm, từ 1 đến số chữ cái mà người dùng muốn. + +69 +00:04:41,010 --> 00:04:43,380 +Vì vậy, trong trường hợp này, nếu người dùng + +70 +00:04:43,440 --> 00:04:48,240 +muốn bốn chữ cái, thì nó sẽ là một phạm vi từ một đến bốn, nhưng không bao gồm bốn. + +71 +00:04:48,660 --> 00:04:50,820 +Vì vậy, nó thực sự là từ một đến + +72 +00:04:51,180 --> 00:04:54,240 +ba, chỉ có ba ký tự. Để sửa đổi điều này, + +73 +00:04:54,270 --> 00:04:56,430 +chúng tôi phải làm những gì chúng tôi đã + +74 +00:04:56,430 --> 00:04:59,730 +làm trước đây, chỉ là thêm một vào cuối phạm vi của chúng tôi. + +75 +00:05:00,240 --> 00:05:04,620 +Vì vậy, bây giờ chúng ta sẽ tạo một phạm vi dựa trên số lượng chữ cái mà + +76 +00:05:04,620 --> 00:05:05,460 +người dùng muốn. + +77 +00:05:05,610 --> 00:05:08,640 +Và tôi chỉ đi cùng với giả định rằng số + +78 +00:05:08,670 --> 00:05:11,910 +lượng chữ cái bằng bốn. Hãy giả sử đó là những gì người dùng sẽ nhập. + +79 +00:05:12,420 --> 00:05:16,200 +Vì vậy, khi đó phạm vi này trở thành 1, 2, 4 + 1 là 5. + +80 +00:05:16,470 --> 00:05:21,470 +Vì vậy, phạm vi trên thực tế sẽ là 1 đến 4. Đối với mỗi số trong phạm vi từ một đến + +81 +00:05:22,620 --> 00:05:25,050 +hai đến ba đến bốn, tôi sẽ tạo cho chúng + +82 +00:05:25,350 --> 00:05:28,200 +một chữ cái ngẫu nhiên và tôi sẽ chọn nó ra khỏi + +83 +00:05:28,260 --> 00:05:32,010 +danh sách các chữ cái này. Để làm điều đó, tôi có thể + +84 +00:05:32,190 --> 00:05:37,190 +tạo một số ngẫu nhiên và sử dụng nó làm chỉ mục hoặc bạn có thể đã thấy trước đây + +85 +00:05:37,830 --> 00:05:38,910 +tôi đã chỉ + +86 +00:05:38,970 --> 00:05:43,970 +cho bạn số ngẫu nhiên. chức năng lựa chọn. Và bên trong ngẫu nhiên này. lựa chọn, chúng ta + +87 +00:05:45,450 --> 00:05:47,610 +có thể chuyển một chuỗi mà trong + +88 +00:05:47,640 --> 00:05:50,760 +trường hợp của chúng ta là danh sách các chữ cái. + +89 +00:05:51,450 --> 00:05:56,450 +Sau đó, nó sẽ xem qua danh sách các chữ cái này và nó sẽ cung cấp cho chúng ta một mục ngẫu nhiên từ + +90 +00:05:58,490 --> 00:05:59,323 +danh sách đó. + +91 +00:05:59,780 --> 00:06:04,340 +Vì vậy, bây giờ bức thư ngẫu nhiên đó sẽ là một cái gì đó mà chúng ta sẽ cần + +92 +00:06:04,340 --> 00:06:06,320 +thêm vào mật khẩu của mình, phải không? + +93 +00:06:06,740 --> 00:06:11,210 +Vì vậy, chúng ta có thể đặt giá trị này bằng một ký tự ngẫu nhiên. + +94 +00:06:12,140 --> 00:06:14,570 +Và bây giờ chúng ta hãy tiếp tục và chỉ cần in nó ra. + +95 +00:06:15,490 --> 00:06:16,323 +1: Đúng không? + +96 +00:06:19,690 --> 00:06:24,690 +0: Vì vậy, giả sử chúng ta muốn có bốn chữ cái trong mật khẩu của mình và chúng ta có thể nhập bất kỳ thứ + +97 +00:06:24,940 --> 00:06:27,910 +gì cho những chữ cái khác, nhưng hãy chú ý khi vòng lặp for + +98 +00:06:28,000 --> 00:06:33,000 +chạy, nó sẽ cung cấp cho chúng ta một số ký tự ngẫu nhiên được chọn ra khỏi danh sách chữ cái của chúng ta. + +99 +00:06:34,540 --> 00:06:35,470 +Vì vậy, có + +100 +00:06:35,500 --> 00:06:40,500 +a, có P viết hoa, d và có J. viết hoa. Làm cách nào chúng ta có thể thêm từng chữ cái + +101 +00:06:41,050 --> 00:06:43,900 +đó vào mật khẩu của mình? Chà, chúng ta có + +102 +00:06:43,900 --> 00:06:48,900 +thể sử dụng cách nối chuỗi mà chúng ta đã học rất sớm trong Ngày 1. + +103 +00:06:49,720 --> 00:06:53,380 +Có thể nói mật khẩu bằng với mật khẩu trước đó cộng + +104 +00:06:53,710 --> 00:06:57,460 +với ký tự ngẫu nhiên. Tất nhiên, phiên bản + +105 +00:06:57,460 --> 00:07:01,960 +rút gọn của điều này chỉ là mật khẩu + = random_char. + +106 +00:07:02,440 --> 00:07:06,070 +Và bây giờ hãy tiếp tục và thay vì in ký tự ngẫu nhiên, + +107 +00:07:06,400 --> 00:07:09,610 +hãy in mật khẩu ở mỗi giai đoạn của vòng lặp. + +108 +00:07:14,050 --> 00:07:14,290 +1: Đúng không? + +109 +00:07:14,290 --> 00:07:14,830 +0: + +110 +00:07:14,830 --> 00:07:19,750 +Và một lần nữa, tôi sẽ chọn bốn chữ cái và bạn có thể thấy rằng lần đầu tiên + +111 +00:07:19,750 --> 00:07:24,700 +vòng lặp chạy, tôi nhận được M. Vì vậy, mật khẩu bằng M. Lần thứ hai tôi nhận được + +112 +00:07:24,700 --> 00:07:29,700 +Q vì vậy tôi thêm Q vào M, tôi nhận được MQ, v.v. cho đến khi tôi nhận + +113 +00:07:30,100 --> 00:07:35,100 +được bốn ký tự này ở đầu thứ dường như là mật khẩu ngẫu nhiên của tôi sẽ + +114 +00:07:35,530 --> 00:07:36,490 +được tạo. + +115 +00:07:38,340 --> 00:07:39,680 +1: Đúng 0: Bây + +116 +00:07:39,680 --> 00:07:43,550 +giờ, nếu bạn muốn, bạn thực sự có thể đơn giản hóa điều này + +117 +00:07:43,850 --> 00:07:46,160 +xuống chỉ còn một bước, bởi vì thay vì + +118 +00:07:46,160 --> 00:07:48,140 +có trung gian này, là biến ký + +119 +00:07:48,410 --> 00:07:53,060 +tự ngẫu nhiên, chúng ta có thể chỉ cần thay thế nó bằng mã, như thế này. + +120 +00:07:53,330 --> 00:07:57,470 +Vì vậy, trong trường hợp này, chúng tôi nhận được một lựa chọn ngẫu nhiên từ danh sách các chữ cái của mình, vì + +121 +00:07:57,560 --> 00:08:01,490 +vậy chúng tôi nhận được một chữ cái ngẫu nhiên, và sau đó chúng tôi thêm nó vào mật khẩu của mình. + +122 +00:08:02,330 --> 00:08:04,730 +Bây giờ chúng ta đã làm điều đó cho chữ cái, + +123 +00:08:04,910 --> 00:08:09,020 +sau đó khá dễ dàng để xem làm thế nào chúng ta có thể tiếp tục làm điều này + +124 +00:08:09,020 --> 00:08:12,620 +cho biểu tượng và các con số. Chúng tôi chỉ cần tiếp tục thêm nó vào cuối mật khẩu của chúng tôi. + +125 +00:08:12,980 --> 00:08:15,140 +Vì vậy, hãy để tôi nhanh chóng viết ra mã cho việc này. + +126 +00:08:23,510 --> 00:08:23,770 +1: Đúng không? + +127 +00:08:23,770 --> 00:08:27,880 +0: Vì vậy, bây giờ khi người dùng yêu cầu rằng họ muốn có bốn chữ cái trong mật + +128 +00:08:28,240 --> 00:08:31,510 +khẩu của họ, thì chúng tôi tạo một phạm vi từ một đến năm. + +129 +00:08:31,900 --> 00:08:34,570 +Và sau đó đối với mỗi vị trí + +130 +00:08:34,600 --> 00:08:38,650 +đó, chúng tôi tạo ra một ký tự ngẫu nhiên để điền mật khẩu. + +131 +00:08:39,190 --> 00:08:42,730 +Và sau đó chúng tôi thêm vào số lượng ký hiệu cần thiết + +132 +00:08:42,730 --> 00:08:46,600 +và số lượng số cần thiết. Và cuối cùng, chúng tôi in ra mật khẩu cuối cùng. + +133 +00:08:47,110 --> 00:08:50,830 +Hãy tiếp tục và chạy mã này. Và một lần nữa, tôi + +134 +00:08:50,830 --> 00:08:54,310 +sẽ chọn bốn chữ cái, hai số và hai biểu tượng. + +135 +00:08:54,990 --> 00:08:57,780 +Và tôi kết thúc với mật khẩu cuối cùng của + +136 +00:08:58,050 --> 00:09:01,920 +mình, nó phù hợp chính xác với tiêu chí đó và nó trông khá ngẫu nhiên. + +137 +00:09:02,670 --> 00:09:07,670 +Nhưng vấn đề duy nhất là nếu một hacker biết rằng bạn luôn có hai + +138 +00:09:08,190 --> 00:09:11,310 +ký hiệu ở vị trí này và hai số + +139 +00:09:11,640 --> 00:09:16,640 +ở vị trí này, thì rất dễ bẻ khóa mật khẩu đó vì để lấy + +140 +00:09:16,650 --> 00:09:20,940 +được chữ số cuối cùng, họ chỉ có để thử chín biến + +141 +00:09:20,940 --> 00:09:22,920 +thể khác nhau, 12 3456789. + +142 +00:09:23,400 --> 00:09:28,400 +Và điều này chỉ giới hạn độ mạnh của mật khẩu của bạn. Để giải quyết điều đó, bạn sẽ phải giải + +143 +00:09:29,460 --> 00:09:31,620 +quyết nó ở mức độ khó, đó là + +144 +00:09:31,890 --> 00:09:36,660 +cách bạn có được một mật khẩu có tất cả các chữ cái và số này theo + +145 +00:09:36,660 --> 00:09:40,500 +thứ tự hoàn toàn ngẫu nhiên. Để làm điều đó, chúng tôi đã đề cập rằng + +146 +00:09:40,650 --> 00:09:43,680 +bạn phải thực hiện một chút googling vì nó có thể yêu cầu một số + +147 +00:09:43,680 --> 00:09:46,950 +thứ mà bạn chưa làm trước đây. Nhưng về bản chất, bạn + +148 +00:09:47,010 --> 00:09:50,940 +đã có quyền truy cập vào mọi thứ bạn cần để thực hiện logic. + +149 +00:09:51,480 --> 00:09:53,280 +Vì vậy, nếu bạn chưa cho phép, + +150 +00:09:53,520 --> 00:09:57,210 +thì đây có thể là thời điểm tốt để tạm dừng và suy nghĩ về + +151 +00:09:57,210 --> 00:10:02,210 +cách bạn có thể cấu trúc logic hoặc cách bạn có thể tạo một biểu đồ để thể hiện logic + +152 +00:10:03,060 --> 00:10:05,730 +này mà bạn muốn. Và khi bạn đã hoàn thành + +153 +00:10:05,820 --> 00:10:08,490 +việc đó, và nếu bạn muốn xem giải pháp và cùng tôi + +154 +00:10:08,670 --> 00:10:13,230 +vượt qua nó, hãy quay lại đây và tôi sẽ hướng dẫn bạn cách thực hiện, nhưng trước tiên hãy thử. + +155 +00:10:15,870 --> 00:10:16,703 +1: Đúng không? + +156 +00:10:17,110 --> 00:10:19,720 +0: Được rồi. Để vượt qua mức + +157 +00:10:20,050 --> 00:10:25,050 +độ khó, những gì chúng ta cần làm là thay vì thêm từng chữ cái này vào + +158 +00:10:25,300 --> 00:10:29,050 +một chuỗi, chúng ta thực sự muốn thêm nó vào một danh sách. + +159 +00:10:30,040 --> 00:10:32,410 +Vì vậy, tôi sẽ sao chép tất cả những thứ + +160 +00:10:32,500 --> 00:10:37,500 +này ở đây, và tôi sẽ bình luận nó ra và tôi sẽ dán nó dưới mức độ khó của + +161 +00:10:37,720 --> 00:10:42,250 +tôi và làm việc trên nó ở đây. Vì vậy, thay vì sử dụng một chuỗi mật khẩu, tôi sẽ + +162 +00:10:42,430 --> 00:10:45,280 +tạo một danh sách và để mô tả rõ hơn về nó, tôi sẽ thay + +163 +00:10:45,730 --> 00:10:49,660 +đổi tên biến của mình, danh sách mật khẩu. Vì vậy, bây giờ, thay vì + +164 +00:10:49,660 --> 00:10:54,660 +sử dụng mật khẩu để thêm từng chữ cái, số và biểu tượng này, tôi sẽ + +165 +00:10:55,990 --> 00:10:58,240 +thêm nó vào danh sách của mình. + +166 +00:10:59,650 --> 00:11:00,420 +1: + +167 +00:11:00,420 --> 00:11:01,253 +Đúng, 0: Đúng, + +168 +00:11:02,210 --> 00:11:03,000 +1: Đúng 0: + +169 +00:11:03,000 --> 00:11:05,130 +Bây giờ, để thêm mọi thứ vào danh + +170 +00:11:05,340 --> 00:11:09,240 +sách, bạn có thể sử dụng cú pháp tương tự như bạn đã + +171 +00:11:09,660 --> 00:11:14,660 +làm với chuỗi, đó là thêm mục mới vào danh sách và cập nhật danh sách cũ . + +172 +00:11:17,430 --> 00:11:20,340 +Mặc dù vậy, bạn có thể quen thuộc hơn + +173 +00:11:20,340 --> 00:11:23,850 +với cú pháp là append và cả hai đều hoạt động. + +174 +00:11:23,940 --> 00:11:28,110 +Bạn có thể sử dụng một trong hai cách này nếu bạn muốn, nhưng cuối cùng chúng + +175 +00:11:28,170 --> 00:11:32,580 +sẽ làm điều tương tự, đó là thêm từng thứ bạn đã tạo theo thứ tự mà bạn + +176 +00:11:32,580 --> 00:11:34,560 +đã tạo vào mật khẩu của mình. + +177 +00:11:34,800 --> 00:11:39,120 +Vì vậy, bây giờ chúng ta kết thúc với một danh sách có bốn chữ + +178 +00:11:39,510 --> 00:11:42,030 +cái, hai ký hiệu và hai số, tất + +179 +00:11:42,210 --> 00:11:46,650 +cả được lưu trữ dưới dạng chuỗi vì có dấu ngoặc kép xung quanh chúng. + +180 +00:11:47,460 --> 00:11:51,360 +Vì vậy, bây giờ chúng ta đã có một danh sách, rồi chúng ta phải nghĩ xem, làm thế nào chúng ta + +181 +00:11:51,570 --> 00:11:53,800 +có thể xáo trộn danh sách của mình, làm thế nào + +182 +00:11:53,800 --> 00:11:56,890 +chúng ta có thể xáo trộn thứ tự của các mục trong danh sách của chúng ta? + +183 +00:11:57,730 --> 00:12:01,420 +Và điều đó có thể đưa bạn đến Google và bạn có thể + +184 +00:12:01,420 --> 00:12:05,410 +tìm kiếm điều gì đó như cách thay đổi thứ tự các mục trong danh sách. + +185 +00:12:05,680 --> 00:12:09,160 +Và sau đó, chúng tôi cũng phải thêm từ khóa của mình, đó là Python, + +186 +00:12:09,190 --> 00:12:12,490 +bởi vì rõ ràng là có rất nhiều ngôn ngữ lập trình khác. + +187 +00:12:12,910 --> 00:12:15,910 +Và chúng tôi đưa ra câu hỏi đầu tiên về Stack Overflow, làm cách nào + +188 +00:12:15,910 --> 00:12:19,930 +để tôi có thể sắp xếp lại một danh sách? Chà, điều đó nghe giống như những gì + +189 +00:12:19,930 --> 00:12:22,450 +tôi muốn làm, phải không? Vì vậy, nếu + +190 +00:12:22,510 --> 00:12:27,510 +chúng ta cuộn xuống, bạn có thể thấy rằng cách thực hiện là sử dụng vòng + +191 +00:12:27,910 --> 00:12:30,430 +lặp for, tương tự như vậy hoặc + +192 +00:12:30,700 --> 00:12:33,520 +đơn giản là sử dụng chức năng xáo trộn. + +193 +00:12:34,630 --> 00:12:39,630 +Đây là một cách đơn giản hơn nhiều vì nó cho phép chúng ta cập nhật danh sách hiện có + +194 +00:12:41,740 --> 00:12:43,990 +chỉ bằng cách gọi hàm xáo trộn trên đó. + +195 +00:12:44,650 --> 00:12:49,510 +Và điều này thực sự yêu cầu chúng tôi tạo một danh sách mới và chúng tôi phải tạo một loạt + +196 +00:12:49,510 --> 00:12:52,270 +các số ngẫu nhiên cho thứ tự, sau đó sắp xếp lại + +197 +00:12:52,600 --> 00:12:54,910 +chúng bằng cách sử dụng một vòng lặp bốn. + +198 +00:12:55,300 --> 00:12:58,840 +Vì vậy, tôi sẽ đi với phiên bản này và chúng ta hãy thử nó. + +199 +00:12:59,350 --> 00:13:01,420 +Thay vì in password_list, + +200 +00:13:01,480 --> 00:13:04,270 +hãy in password_list trước khi xáo trộn, + +201 +00:13:04,600 --> 00:13:09,600 +sau đó sử dụng ngẫu nhiên. xáo trộn và chuyển vào password_list. + +202 +00:13:10,150 --> 00:13:13,480 +Và sau đó hãy in kết quả của lần xáo trộn + +203 +00:13:13,480 --> 00:13:15,640 +đó, vì vậy hãy in lại password_list. + +204 +00:13:17,740 --> 00:13:20,380 +Vì vậy, bây giờ bạn có thể thấy rằng chúng tôi đã có một phiên bản trước đó + +205 +00:13:20,590 --> 00:13:22,210 +và sau đó chúng tôi có một phiên bản sau đó. + +206 +00:13:22,420 --> 00:13:26,920 +Vì vậy, nếu tôi chạy mã của mình và tôi viết lại, bốn chữ cái, hai + +207 +00:13:26,980 --> 00:13:29,020 +ký hiệu, hai số, bạn có thể + +208 +00:13:29,590 --> 00:13:34,210 +thấy rằng trước đó nó đã được sắp xếp theo thứ tự mà chúng tôi đã thêm + +209 +00:13:34,210 --> 00:13:36,580 +từng ký tự. Sau khi xáo + +210 +00:13:36,610 --> 00:13:40,570 +trộn, chúng bây giờ khá ngẫu nhiên. Có những chữ cái ở những nơi ngẫu nhiên, có những + +211 +00:13:40,600 --> 00:13:42,160 +biểu tượng ở những nơi ngẫu nhiên. + +212 +00:13:42,550 --> 00:13:45,970 +Vì vậy, giá như chúng ta có thể biến nó trở lại thành một chuỗi, + +213 +00:13:46,450 --> 00:13:49,870 +thì chúng ta đã có mật khẩu của mình được xáo trộn độc đáo. + +214 +00:13:50,260 --> 00:13:53,290 +Vậy làm thế nào chúng ta có thể biến nó trở lại thành một chuỗi? Chà, chúng ta có thể + +215 +00:13:53,290 --> 00:13:55,720 +đơn giản sử dụng vòng lặp for, phải không? + +216 +00:13:55,810 --> 00:13:59,080 +Chúng ta có thể nói đối với mỗi, um, + +217 +00:13:59,440 --> 00:14:03,910 +ký tự trong password_list, chúng ta sẽ thêm nó vào một biến + +218 +00:14:04,690 --> 00:14:08,980 +được gọi là mật khẩu, biến này sẽ bắt đầu lại dưới + +219 +00:14:09,370 --> 00:14:12,610 +dạng một chuỗi trống và sau đó chúng + +220 +00:14:13,240 --> 00:14:15,430 +ta sẽ thêm vào đó. + +221 +00:14:15,460 --> 00:14:20,440 +Vì vậy, chúng tôi sẽ nói password + = char trong password_list của chúng tôi. + +222 +00:14:21,040 --> 00:14:24,790 +Và bây giờ nếu tôi tiếp tục và chỉ in mật khẩu cuối cùng của + +223 +00:14:25,180 --> 00:14:27,070 +mình, tôi cũng sẽ thêm một chuỗi. + +224 +00:14:27,550 --> 00:14:30,310 +Giả sử mật khẩu của bạn là, và + +225 +00:14:31,360 --> 00:14:33,460 +sau đó hãy chèn mật khẩu. + +226 +00:14:34,840 --> 00:14:38,230 +Và bây giờ nếu tôi chạy mã của mình + +227 +00:14:38,230 --> 00:14:40,900 +và giả sử, tôi muốn 12 chữ + +228 +00:14:40,930 --> 00:14:43,330 +cái, uh, ba ký hiệu và + +229 +00:14:43,870 --> 00:14:47,530 +bốn số, thì nó sẽ tạo cho tôi toàn bộ + +230 +00:14:47,740 --> 00:14:52,550 +mật khẩu hoàn toàn ngẫu nhiên theo thứ tự của các ký hiệu + +231 +00:14:52,550 --> 00:14:53,383 +và số. + +232 +00:14:53,660 --> 00:14:58,660 +Và bây giờ tôi đã giải quyết được phần khó của dự án thử thách này. + +233 +00:15:00,080 --> 00:15:03,530 +Điều đó có ý nghĩa với bạn không? Bạn có quản lý để làm cho nó làm + +234 +00:15:03,530 --> 00:15:04,940 +những gì bạn muốn nó làm không? + +235 +00:15:06,800 --> 00:15:10,070 +Nếu bạn hoàn toàn nhầm lẫn về mã mà chúng tôi đã + +236 +00:15:10,370 --> 00:15:14,510 +đề cập ở đây, thì hãy nhớ xem dự án cuối cùng mà tôi có + +237 +00:15:14,510 --> 00:15:16,700 +ở đây, đó là phần cuối của Trình + +238 +00:15:17,150 --> 00:15:20,600 +tạo ứng dụng và xem mức độ dễ dàng như thế nào được + +239 +00:15:20,630 --> 00:15:25,160 +triển khai, cách triển khai mức độ khó và thử chuyển đổi nó để bạn thực sự + +240 +00:15:25,160 --> 00:15:26,390 +hiểu về nó. + +241 +00:15:26,720 --> 00:15:31,070 +Thay vì cố gắng để người dùng cho bạn biết có bao nhiêu chữ cái, bao + +242 +00:15:31,070 --> 00:15:34,970 +nhiêu ký hiệu, bao nhiêu số, thay vào đó chỉ cần tự xác định + +243 +00:15:35,000 --> 00:15:37,790 +những chữ cái đó hoặc sử dụng một số ngẫu + +244 +00:15:37,790 --> 00:15:42,440 +nhiên các chữ cái, số và ký hiệu. Chơi xung quanh mã cho đến khi nó bắt đầu làm những gì + +245 +00:15:42,440 --> 00:15:44,240 +bạn muốn và nó bắt đầu có ý nghĩa. + +246 +00:15:44,840 --> 00:15:48,770 +Nhưng tôi hy vọng bạn đã vui vẻ khi xây dựng dự án này với tôi ngày hôm nay và tìm + +247 +00:15:48,770 --> 00:15:51,440 +hiểu tất cả về các vòng lặp. Trong bài học tiếp theo, + +248 +00:15:51,440 --> 00:15:54,800 +chúng ta sẽ tìm hiểu thêm về những thứ mà chúng ta đã và + +249 +00:15:55,160 --> 00:16:00,110 +đang sử dụng rất nhiều, đó là các hàm Python. Vì vậy, tôi sẽ chúc bạn ngủ ngon cho ngày hôm nay, + +250 +00:16:00,200 --> 00:16:03,200 +và hy vọng rằng tôi sẽ gặp lại bạn vào sáng sớm mai và chúng + +251 +00:16:03,680 --> 00:16:06,860 +ta sẽ học một số kỹ năng mới và làm việc trên một số dự án mới. + +252 +00:16:07,070 --> 00:16:09,710 +Vì vậy, đó là tất cả từ tôi, chúc ngủ ngon từ Angela. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/008 Password-Generator-Start.url b/part1/05 - Day 5 - Beginner - Python Loops/008 Password-Generator-Start.url new file mode 100644 index 0000000000000000000000000000000000000000..6a203e4dd93b3d618fba4c93542a4701674c8f49 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/008 Password-Generator-Start.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/password-generator-start \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/008 Solution-Password-Generator-Completed-Code.url b/part1/05 - Day 5 - Beginner - Python Loops/008 Solution-Password-Generator-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..4e639846194b33c2b4cfc1ebaf75731ef4c367bb --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/008 Solution-Password-Generator-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/password-generator-end \ No newline at end of file diff --git a/part1/05 - Day 5 - Beginner - Python Loops/009 Hard Work and Perseverance beats Raw Talent Every Time.mp4 b/part1/05 - Day 5 - Beginner - Python Loops/009 Hard Work and Perseverance beats Raw Talent Every Time.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b620baa70d166478d7aff09588263c0eccc2e9a4 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/009 Hard Work and Perseverance beats Raw Talent Every Time.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6eea756966f6f5c6f3eccffb5c37f0dada05ee2746f5383e9a7c09b02032007 +size 41560766 diff --git a/part1/05 - Day 5 - Beginner - Python Loops/009 Hard Work and Perseverance beats Raw Talent Every Time_vi.srt b/part1/05 - Day 5 - Beginner - Python Loops/009 Hard Work and Perseverance beats Raw Talent Every Time_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..690d801cd3355fec15440df1229468b42843e205 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/009 Hard Work and Perseverance beats Raw Talent Every Time_vi.srt @@ -0,0 +1,68 @@ +1 +00:00:01,440 --> 00:00:04,350 +Xin chào, hoàn thành tốt ngày thứ năm. + +2 +00:00:04,500 --> 00:00:08,520 +Bây giờ tôi biết rằng ngày thứ năm đó có một thử thách thực sự khó khăn vào cuối. + +3 +00:00:08,820 --> 00:00:13,080 +Vì vậy, bạn phải cần một chút kiên trì mà bạn phải rút ra từ bản + +4 +00:00:13,080 --> 00:00:16,770 +thân để thực sự làm được. Bây giờ, tại thời điểm này, bạn + +5 +00:00:16,800 --> 00:00:20,970 +có thể cảm thấy rất nhiều cảm giác giống như tôi đã có khi + +6 +00:00:20,970 --> 00:00:24,810 +tôi mới bắt đầu học cách viết mã, đó là cảm giác vô + +7 +00:00:24,870 --> 00:00:29,870 +cùng thích, có lẽ điều này không dành cho tôi bởi vì mọi thứ quá choáng ngợp và + +8 +00:00:30,480 --> 00:00:34,920 +Tôi không hiểu nó. Và nó chỉ là không nhấp chuột. Có lẽ tôi không có ý định này. + +9 +00:00:34,920 --> 00:00:38,640 +Có lẽ tôi được sinh ra để trở thành một con tôm hùm, bạn biết đấy, thay vì một lập trình viên. + +10 +00:00:39,270 --> 00:00:43,200 +Nhưng, bạn biết điều gì đã xảy ra không? Tôi tiếp tục, tôi kiên trì. + +11 +00:00:43,290 --> 00:00:46,260 +Và tại một thời điểm nào đó, nó thực sự bắt đầu nhấp chuột. + +12 +00:00:46,260 --> 00:00:50,970 +Nó bắt đầu có ý nghĩa hơn. Vì vậy, chỉ cần tin tưởng vào quá trình + +13 +00:00:51,030 --> 00:00:54,540 +này, tiếp tục xuất hiện và chỉ cần đặt những đại diện đó hàng ngày + +14 +00:00:54,900 --> 00:00:58,800 +và tôi hứa rằng đến cuối khóa học, bạn sẽ không cảm thấy như thế này. + +15 +00:00:58,800 --> 00:01:02,070 +Bạn sẽ cảm thấy như bạn đang ở trên đỉnh của điều này và bạn đã có được nó. + +16 +00:01:02,370 --> 00:01:06,530 +Điều này sẽ xảy ra. Vì vậy, hãy tiếp tục, hãy tiếp tục làm những gì bạn đang làm. + +17 +00:01:06,570 --> 00:01:07,770 +Bạn đang làm một công việc tuyệt vời. + diff --git a/part1/05 - Day 5 - Beginner - Python Loops/external-links.txt b/part1/05 - Day 5 - Beginner - Python Loops/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..635e04948b9ad1f3ea07f72e961cbce74e211352 --- /dev/null +++ b/part1/05 - Day 5 - Beginner - Python Loops/external-links.txt @@ -0,0 +1,45 @@ + +001 Have-I-been-pwned- +https://haveibeenpwned.com/ + +001 Day-5-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/password-generator-end?v=1 + +002 Fork-the-Day-5-Starting-Repl +https://repl.it/@appbrewery/day-5-start + +002 For-Loop-Practice-Completed-Code +https://repl.it/@appbrewery/day-5-for-loops-end#main.py + +003 Exercise-16 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/4a109ef8-ac17-4a51-85b1-61a61a20bb66 + +003 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +004 Exercise-17 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/69cffc56-5ac8-4b20-b067-b7ac13386989 + +004 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +006 Exercise-18 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/c8a70cc6-7b64-42ad-880b-e2034e8cb8bc + +006 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Exercise-19 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/40e95268-2b4a-4b56-9dee-3df9e198213e + +007 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +008 Password-Generator-Start +https://repl.it/@appbrewery/password-generator-start + +008 Solution-Password-Generator-Completed-Code +https://repl.it/@appbrewery/password-generator-end + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/001 Day 6 Goals what we will make by the end of the day.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/001 Day 6 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..92258845e1f38e0baddc3ab01fdefc4f20b49259 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/001 Day 6 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ec7b788d13702a37aced599c235b21ccdbd9d66992f5eaddcff3e768f1e1554 +size 2498649 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/001 Day 6 Goals what we will make by the end of the day_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/001 Day 6 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..923619475dfc9bd11c9edc666325c13efbf04403 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/001 Day 6 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,68 @@ +1 +00:00:00,130 --> 00:00:00,730 +Xin chào các + +2 +00:00:00,730 --> 00:00:05,730 +bạn, chào mừng bạn đến với Ngày thứ 6 của 100 Ngày viết mã. Và làm tốt từ việc làm cho nó + +3 +00:00:07,150 --> 00:00:07,983 +đến nay. + +4 +00:00:08,200 --> 00:00:13,200 +Vì vậy, hôm nay chúng ta sẽ nói về các khối mã và thụt lề cũng như các hàm + +5 +00:00:13,540 --> 00:00:18,540 +và một hương vị khác với các vòng lặp for mà chúng ta đã thấy ngày hôm qua. + +6 +00:00:19,810 --> 00:00:20,110 +Hôm + +7 +00:00:20,110 --> 00:00:24,580 +nay chúng ta cũng sẽ nói về vòng lặp while. Và để tìm hiểu tất cả những điều này, chúng + +8 +00:00:24,880 --> 00:00:26,530 +ta sẽ sử dụng sự trợ + +9 +00:00:26,680 --> 00:00:28,930 +giúp của một thứ rất giống với người máy Karel. + +10 +00:00:29,560 --> 00:00:32,409 +Và đây là thứ mà tôi sử dụng khi lần đầu + +11 +00:00:32,800 --> 00:00:35,950 +tiên học cách viết mã và nó là một trong những công + +12 +00:00:36,130 --> 00:00:41,130 +cụ yêu thích của tôi để học lập trình, đặc biệt khi chúng ta gặp phải những khái niệm khó + +13 +00:00:41,140 --> 00:00:45,970 +hơn như hàm và vòng lặp while, vân vân. Và vào cuối ngày, chúng tôi sẽ viết + +14 +00:00:46,210 --> 00:00:51,210 +mã cần thiết để hướng dẫn robot nhỏ của chúng tôi có thể hoàn thành bất kỳ mê + +15 +00:00:51,640 --> 00:00:55,390 +cung nào được tạo ngẫu nhiên. Vì vậy, đó là mục tiêu và nếu + +16 +00:00:55,690 --> 00:00:57,430 +bạn chuyển sang bài học tiếp theo, + +17 +00:00:57,640 --> 00:01:00,820 +chúng ta hãy bắt đầu và bắt đầu tìm hiểu về một số điều này. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Built-in-Python-Functions.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Built-in-Python-Functions.url new file mode 100644 index 0000000000000000000000000000000000000000..5057f4011c3be21dde9bd7b123df6642337b03f3 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Built-in-Python-Functions.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/functions.html \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Defining and Calling Python Functions.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Defining and Calling Python Functions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cd87230ee2f3c10043c05bf73eb09207055e9baf --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Defining and Calling Python Functions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ade203d6aa1508ebde348917042be03e816885a6c52e4579ac9a2ad324cab0a +size 64227246 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Defining and Calling Python Functions_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Defining and Calling Python Functions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..41547b55ee860dc2b1bb0055fd1347e05d3ae261 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Defining and Calling Python Functions_vi.srt @@ -0,0 +1,948 @@ +1 +00:00:00,640 --> 00:00:05,590 +Khái niệm đầu tiên tôi muốn giới thiệu với bạn là một cái gì đó được gọi là chức năng. + +2 +00:00:06,250 --> 00:00:11,200 +Và cũng giống như chúng ta thực hiện nhiều chức năng khác nhau có thể là mẹ, cha, con + +3 +00:00:11,220 --> 00:00:12,490 +trai, con gái, chúng + +4 +00:00:12,970 --> 00:00:17,470 +ta cũng có thể lấy mã của mình để thực hiện các phần chức năng khác nhau. + +5 +00:00:18,250 --> 00:00:20,110 +Bây giờ, nếu chúng ta nghĩ lại, + +6 +00:00:20,230 --> 00:00:25,230 +chúng ta thực sự đã bắt gặp các hàm và tôi đã đề cập đến chúng mỗi khi chúng + +7 +00:00:25,750 --> 00:00:27,610 +ta cần sử dụng một hàm. + +8 +00:00:28,510 --> 00:00:31,960 +Nếu bạn xem liên kết này trong tài nguyên khóa học + +9 +00:00:32,020 --> 00:00:34,750 +đưa bạn đến tài liệu Python, thì bạn có + +10 +00:00:35,290 --> 00:00:39,340 +thể thấy rằng Python có một loạt các hàm tích hợp sẵn mà chúng + +11 +00:00:39,340 --> 00:00:42,370 +tôi đang sử dụng. Ví dụ, hàm len, + +12 +00:00:42,400 --> 00:00:47,400 +cung cấp cho chúng ta số lượng các mục trong một tập hợp hoặc hàm int + +13 +00:00:47,860 --> 00:00:52,420 +để biến một cái gì đó thành một số nguyên hoặc hàm in, hàm + +14 +00:00:52,420 --> 00:00:55,840 +phạm vi và những cái khác mà chúng ta chưa thấy. + +15 +00:00:56,770 --> 00:00:58,720 +Nếu bạn chuyển sang + +16 +00:00:58,750 --> 00:01:03,070 +Ngày thứ 6 bắt đầu Repl. nó và tiếp tục và chuyển tiếp một bản sao của nó. + +17 +00:01:03,910 --> 00:01:08,290 +Sau đó, chúng ta có thể bắt đầu nhập một trong những hàm mà chúng ta đã và đang sử dụng + +18 +00:01:08,320 --> 00:01:09,850 +rất nhiều, đó là hàm in. + +19 +00:01:10,480 --> 00:01:14,680 +Và lý do tại sao chúng ta biết đó là một hàm là vì nó là tên + +20 +00:01:14,680 --> 00:01:18,010 +của một hàm theo sau bởi một tập hợp các dấu ngoặc đơn. + +21 +00:01:18,550 --> 00:01:22,960 +Bây giờ chúng ta biết rằng nếu chúng ta đặt một cái gì đó bên trong các dấu + +22 +00:01:23,290 --> 00:01:27,070 +ngoặc đơn này, chẳng hạn như xin chào, thì khi tôi chạy mã, bất cứ + +23 +00:01:27,430 --> 00:01:29,110 +thứ gì bên trong các dấu + +24 +00:01:29,110 --> 00:01:32,650 +ngoặc đơn đó sẽ được xuất ra ở đây trong bảng điều khiển. + +25 +00:01:33,820 --> 00:01:37,360 +Bây giờ tất cả các chức năng hoạt động khá giống nhau. + +26 +00:01:37,450 --> 00:01:41,560 +Vì vậy, nếu tôi muốn sử dụng hàm len để xem, có bao nhiêu ký + +27 +00:01:41,560 --> 00:01:45,580 +tự trong từ Xin chào này? Tôi, một lần nữa, đặt + +28 +00:01:45,640 --> 00:01:50,260 +lời chào của tôi bên trong dấu ngoặc đơn vì trong dấu ngoặc đơn, + +29 +00:01:50,290 --> 00:01:55,290 +chúng tôi biết rằng đây là một hàm và sau đó tôi có thể lưu kết + +30 +00:01:55,870 --> 00:01:59,680 +quả của hàm độ dài này vào một biến, giả sử, hãy + +31 +00:01:59,740 --> 00:02:02,230 +gọi nó là số ký tự, num_char. + +32 +00:02:02,740 --> 00:02:07,270 +Và sau đó tôi có thể tiếp tục và in nó để xem nó bên trong bảng điều khiển. + +33 +00:02:07,270 --> 00:02:10,870 +Vì vậy, hãy in num_char, và bây giờ bạn có thể thấy + +34 +00:02:11,560 --> 00:02:15,610 +rằng hàm len này bắt đầu hoạt động, tính toán số ký tự, + +35 +00:02:15,610 --> 00:02:18,970 +là năm ký tự, và sau đó nó được in. + +36 +00:02:19,300 --> 00:02:24,300 +Vì vậy, tất cả các chức năng này đã đạt được nhờ các hàm tích hợp sẵn + +37 +00:02:25,240 --> 00:02:27,430 +này từ Python, như print và len. + +38 +00:02:28,810 --> 00:02:32,350 +Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn tạo ra các chức năng của riêng mình? + +39 +00:02:32,410 --> 00:02:37,360 +Chúng ta nên làm việc đó như thế nào? Vâng, nếu chúng ta muốn tạo một hàm của + +40 +00:02:37,750 --> 00:02:40,780 +riêng mình, trước tiên chúng ta bắt đầu với một từ + +41 +00:02:41,260 --> 00:02:43,030 +khóa, được gọi là def. + +42 +00:02:43,540 --> 00:02:48,070 +Và điều này là do chúng tôi đang tạo hoặc xác định chức năng của mình. + +43 +00:02:49,090 --> 00:02:50,740 +Bây giờ, sau từ khóa def, + +44 +00:02:51,070 --> 00:02:56,070 +chúng ta có thể đặt tên cho hàm của mình và tôi sẽ gọi nó là my_ Chức năng. + +45 +00:02:57,220 --> 00:03:00,910 +Tuy nhiên, điều phân biệt một hàm với một + +46 +00:03:01,330 --> 00:03:05,980 +biến là dấu ngoặc đơn. Vì vậy, sau tên có dấu ngoặc đơn, + +47 +00:03:06,580 --> 00:03:08,170 +và bây giờ là điều + +48 +00:03:08,170 --> 00:03:13,170 +cuối cùng, kết thúc định nghĩa hàm của chúng ta là dấu hai chấm vì điều + +49 +00:03:13,720 --> 00:03:18,720 +đó cho biết mọi thứ xuất hiện sau dòng đó và được thụt vào đều thuộc + +50 +00:03:19,180 --> 00:03:20,013 +về hàm. + +51 +00:03:20,710 --> 00:03:24,280 +Hãy tạo một hàm thực sự đơn giản chỉ có hai dòng mã. + +52 +00:03:24,340 --> 00:03:29,080 +Có lẽ nó in Hello và sau đó nó in Bye. + +53 +00:03:29,980 --> 00:03:32,590 +Vì vậy, bây giờ tôi đã tạo hàm của + +54 +00:03:32,740 --> 00:03:37,090 +mình, tôi đã đặt các dòng mã được liên kết với hàm này, tất cả đều + +55 +00:03:37,090 --> 00:03:40,600 +được thụt lề sau định nghĩa. Nhưng hãy lưu ý rằng, + +56 +00:03:40,660 --> 00:03:45,370 +nếu tôi tiếp tục và chạy mã của mình, thực tế sẽ không có gì xảy ra. + +57 +00:03:45,580 --> 00:03:49,930 +Và nguyên nhân là do chúng ta chưa thực thi hàm. + +58 +00:03:50,590 --> 00:03:54,460 +Bây giờ chúng ta có thể xác định trước rất nhiều hàm. + +59 +00:03:54,850 --> 00:03:57,100 +Và chỉ khi chúng ta thực sự cần nó, + +60 +00:03:57,280 --> 00:04:02,280 +chúng ta mới tiếp tục và kích hoạt nó và để kích hoạt nó hoặc trong ngôn ngữ lập trình, + +61 +00:04:02,320 --> 00:04:04,720 +chúng ta sẽ gọi hàm, tất cả những gì chúng + +62 +00:04:05,050 --> 00:04:08,140 +ta phải làm là nhập tên của hàm, đó là my_ functions và + +63 +00:04:08,530 --> 00:04:10,180 +sau đó để thêm dấu + +64 +00:04:10,720 --> 00:04:15,720 +ngoặc đơn và bất kỳ đầu vào cần thiết nào. Trong trường hợp của chúng tôi, hàm của chúng + +65 +00:04:16,060 --> 00:04:20,860 +tôi không yêu cầu bất kỳ đầu vào nào nên chúng tôi có thể để trống + +66 +00:04:20,950 --> 00:04:25,120 +dấu ngoặc đơn một lần nữa. Và bây giờ nếu tôi tiếp tục và chạy + +67 +00:04:25,480 --> 00:04:29,470 +mã của mình một lần nữa, thì bạn sẽ thấy rằng vào thời điểm máy tính đến dòng + +68 +00:04:29,770 --> 00:04:32,230 +5, nó sẽ tìm kiếm thứ được gọi là hàm my_. + +69 +00:04:32,590 --> 00:04:35,470 +Nó thấy rằng nó đã được định nghĩa ngay tại đây + +70 +00:04:35,770 --> 00:04:40,770 +trên dòng 1 và nó đi qua tất cả nội dung và thực hiện chúng lần lượt từng dòng một. + +71 +00:04:41,650 --> 00:04:44,890 +Và đó là lý do tại sao chúng tôi nhận được lời chào và tạm biệt được in ở đây. + +72 +00:04:46,420 --> 00:04:50,710 +Vì vậy, chỉ để tóm tắt lại, đây là cách chúng ta tạo một hàm trong Python. + +73 +00:04:51,190 --> 00:04:56,140 +Có hai bước để thực hiện. Bước đầu tiên là thực sự xác định chức năng, + +74 +00:04:56,440 --> 00:04:58,480 +xác định những gì nó phải làm. + +75 +00:04:58,990 --> 00:05:03,990 +Và chúng tôi làm điều đó trước tiên bằng cách sử dụng từ khóa def và sau đó chúng tôi đặt tên + +76 +00:05:04,390 --> 00:05:06,370 +cho hàm của mình. Vì vậy, ví dụ, trong + +77 +00:05:06,370 --> 00:05:11,370 +trường hợp này, tôi gọi nó là my_ Chức năng và sau đó đi kèm một tập hợp các dấu ngoặc đơn và dấu hai chấm. + +78 +00:05:12,670 --> 00:05:16,030 +Và sau đó, chúng ta phải đặt các dòng mã sẽ được + +79 +00:05:16,030 --> 00:05:20,260 +bao gồm trong chức năng này. Và hãy nhớ rằng những dòng mã + +80 +00:05:20,260 --> 00:05:22,180 +này đi vào hàm sẽ + +81 +00:05:22,210 --> 00:05:24,880 +được thực hiện khi hàm này được kích + +82 +00:05:25,150 --> 00:05:27,790 +hoạt phải được thụt vào như thế này. + +83 +00:05:28,720 --> 00:05:32,410 +Vì vậy, khi bạn đã xác định hàm, bạn đã tạo công + +84 +00:05:32,440 --> 00:05:36,610 +thức, bước tiếp theo là thực sự sử dụng nó, trong thuật ngữ + +85 +00:05:36,640 --> 00:05:41,640 +lập trình, chúng ta sẽ gọi hàm. Và chúng ta gọi hàm chỉ bằng cách chỉ + +86 +00:05:42,520 --> 00:05:45,130 +định tên và một tập hợp các dấu ngoặc đơn. + +87 +00:05:45,640 --> 00:05:50,640 +Và một khi máy tính nhìn thấy dòng mã này, nó sẽ biết để đi và thực hiện tất cả + +88 +00:05:50,770 --> 00:05:52,570 +các hướng dẫn bên trong nơi chúng + +89 +00:05:52,600 --> 00:05:56,560 +ta đã xác định chức năng của mình. Và để tìm hiểu về các chức + +90 +00:05:56,890 --> 00:06:01,190 +năng, tôi xin giới thiệu với các bạn một thứ rất giống với người máy Karel. + +91 +00:06:02,030 --> 00:06:07,030 +Robot sẽ trở thành một thứ chỉ thực hiện các nhiệm vụ + +92 +00:06:07,070 --> 00:06:10,550 +mà chúng ta muốn, không hơn không kém. + +93 +00:06:11,060 --> 00:06:12,290 +Vì vậy, ví dụ, nếu + +94 +00:06:12,470 --> 00:06:17,470 +chúng ta muốn một con rô-bốt đi đến cửa hàng và lấy một ít sữa cho chúng ta, chúng ta + +95 +00:06:18,410 --> 00:06:20,510 +không thể chỉ nói với nó rằng, Ồ + +96 +00:06:20,540 --> 00:06:24,620 +vâng, hãy đi mua một ít sữa vì nó sẽ không biết cách làm điều đó. + +97 +00:06:24,800 --> 00:06:25,580 +trừ khi + +98 +00:06:25,580 --> 00:06:29,810 +chúng tôi hướng dẫn cụ thể cho nó, chẳng hạn như ra khỏi nhà, đi bộ hai + +99 +00:06:29,840 --> 00:06:34,550 +dãy nhà bên phải, đi bộ bốn dãy nhà trở lại và sau đó hai dãy phố bên phải. + +100 +00:06:34,940 --> 00:06:36,140 +Khi bạn đến cửa hàng, + +101 +00:06:36,140 --> 00:06:39,590 +hãy cho họ một số tiền và sau đó lấy sữa và quay trở lại. + +102 +00:06:40,130 --> 00:06:44,030 +Chúng ta phải lập trình từng bước. Nhưng giả sử, nếu + +103 +00:06:44,030 --> 00:06:49,010 +chức năng này để robot đi và lấy sữa cho chúng ta là + +104 +00:06:49,010 --> 00:06:51,110 +cần thiết mỗi ngày thì + +105 +00:06:51,500 --> 00:06:55,970 +chúng ta phải viết ra tất cả các hướng dẫn đó + +106 +00:06:55,970 --> 00:07:00,260 +ngày này qua ngày khác. Và một lúc nào đó ngón tay của chúng ta sẽ bị đau, phải không? + +107 +00:07:00,350 --> 00:07:05,350 +Chúng tôi đang nhập quá nhiều mã lặp lại bởi vì chúng tôi không có cách nào để kết hợp tất cả + +108 +00:07:05,450 --> 00:07:08,870 +các hướng dẫn đó lại với nhau. Và đó là nơi các chức năng xuất hiện. + +109 +00:07:09,260 --> 00:07:12,890 +Các hàm sẽ cung cấp cho chúng ta cách tham chiếu đến tất cả các hướng + +110 +00:07:13,010 --> 00:07:14,240 +dẫn đó cùng một lúc. + +111 +00:07:14,690 --> 00:07:19,610 +Bằng cách đó, chúng ta có thể cung cấp cho robot của mình một chỉ dẫn duy nhất và nó sẽ thực hiện tất cả các + +112 +00:07:19,610 --> 00:07:22,430 +bước nhỏ đó cho chúng ta và lấy cho chúng ta một ít sữa. + +113 +00:07:23,510 --> 00:07:25,460 +Bây giờ để tự mình thử điều + +114 +00:07:25,490 --> 00:07:30,490 +này, tôi muốn bạn truy cập tài nguyên khóa học và nhấp vào liên kết đưa bạn + +115 +00:07:31,070 --> 00:07:32,690 +đến Thế giới của Reeborg. + +116 +00:07:33,290 --> 00:07:37,610 +Bây giờ Thế giới của Reeborg rất giống với Karel người máy mà tôi đã cho bạn + +117 +00:07:37,640 --> 00:07:38,473 +xem trước + +118 +00:07:38,630 --> 00:07:43,630 +đó, nhưng nó cho phép chúng ta viết mã Python. Và nó rất dễ dàng để bắt đầu. + +119 +00:07:44,570 --> 00:07:48,710 +Bây giờ chúng ta có khu vực này ở đây mà chúng ta sẽ sử dụng để viết mã Python của chúng ta. + +120 +00:07:49,370 --> 00:07:52,340 +Và sau khi hoàn tất, chúng ta có thể nhấp + +121 +00:07:52,340 --> 00:07:57,340 +vào play để chạy mã Python và xem các hướng dẫn do rô bốt của chúng ta thực hiện. + +122 +00:07:58,340 --> 00:08:00,650 +Nhưng nếu bạn nhấp vào bàn phím của + +123 +00:08:00,980 --> 00:08:05,480 +Reeborg, bạn có thể thấy tất cả các chức năng mà chúng tôi có thể sử dụng để + +124 +00:08:05,930 --> 00:08:09,950 +chỉ huy robot của mình, như di chuyển hoặc rẽ trái hoặc xây tường, v.v. + +125 +00:08:11,270 --> 00:08:15,170 +Hãy xem nếu chúng ta tiếp tục và chạy dòng mã này ở đây, di chuyển. + +126 +00:08:16,280 --> 00:08:18,380 +Điều gì xảy ra? Khi tôi nhấp + +127 +00:08:18,710 --> 00:08:23,710 +vào chơi, bạn có thể thấy rằng rô bốt của chúng tôi di chuyển về phía trước theo + +128 +00:08:23,720 --> 00:08:28,550 +hướng mà nó phải đối mặt bằng một bước. Vì vậy, nếu chúng ta muốn nó di chuyển, chẳng hạn như + +129 +00:08:28,880 --> 00:08:32,270 +ba bước, tất cả những gì chúng ta phải làm là gọi hàm di chuyển ba lần. + +130 +00:08:32,900 --> 00:08:37,280 +Bây giờ hãy đặt lại bằng cách nhấp vào nút quay lại để đưa rô-bốt của chúng ta trở lại + +131 +00:08:37,280 --> 00:08:38,299 +vị trí ban đầu. + +132 +00:08:38,750 --> 00:08:42,950 +Bây giờ, hãy nhấp vào phát lại để rô bốt của chúng ta thực hiện các + +133 +00:08:42,950 --> 00:08:43,789 +hướng dẫn mới. + +134 +00:08:44,840 --> 00:08:49,640 +Lưu ý rằng tất cả các hướng dẫn đã được thực hiện rất nhanh chóng. Để thực hiện từng hướng dẫn từng + +135 +00:08:49,640 --> 00:08:52,850 +bước một, từng dòng một, chúng ta có thể sử + +136 +00:08:53,030 --> 00:08:55,200 +dụng nút chuyển từng bước này. + +137 +00:08:55,680 --> 00:09:00,680 +Nút này cho phép chúng ta xem từng lệnh được thực thi như thế nào và + +138 +00:09:01,380 --> 00:09:05,490 +sau mỗi lệnh, nó sẽ tạm dừng và đánh dấu lệnh tiếp theo. + +139 +00:09:05,760 --> 00:09:07,530 +Điều này rất hữu ích cho việc gỡ lỗi. + +140 +00:09:08,370 --> 00:09:13,080 +Vì vậy, hãy chú ý cách chúng tôi đánh dấu dòng 2. Vì vậy, nếu tôi nhấp vào bước một + +141 +00:09:13,380 --> 00:09:17,220 +lần nữa, nó sẽ thực hiện chức năng đó và sau đó nó sẽ + +142 +00:09:17,220 --> 00:09:20,430 +thực hiện dòng 3 và cuối cùng nó đi đến cuối. + +143 +00:09:20,730 --> 00:09:25,710 +Và đó là phần cuối của mã của chúng tôi. Bây giờ, ngoài ra, chúng ta có + +144 +00:09:25,740 --> 00:09:29,760 +thể sử dụng một số lệnh khác trong bàn phím, ví + +145 +00:09:30,120 --> 00:09:31,890 +dụ như rẽ trái. + +146 +00:09:32,550 --> 00:09:37,550 +Nếu tôi quyết định nói di chuyển ba lần, sau đó rẽ trái và sau đó có thể di chuyển + +147 +00:09:38,250 --> 00:09:42,660 +ba lần nữa, bạn có thể dự đoán hình vuông mà robot sẽ đi đến không? + +148 +00:09:44,250 --> 00:09:49,230 +Bạn đã sẵn sàng chưa? Hãy tiếp tục và chạy mã. Chúng ta bắt đầu. + +149 +00:09:49,440 --> 00:09:51,810 +Chúng tôi kết thúc trên hình vuông 4,4. + +150 +00:09:51,990 --> 00:09:56,160 +Nó di chuyển ba bước về phía trước, rẽ trái và sau đó lại di chuyển ba bước, bởi vì đó là những + +151 +00:09:56,430 --> 00:09:59,250 +gì chúng tôi đã yêu cầu nó làm với mã Python của chúng tôi. + +152 +00:10:00,150 --> 00:10:04,440 +Vì vậy, bây giờ đây là một câu hỏi. Nếu bạn nhìn vào bên trong tập hợp các lệnh, bạn + +153 +00:10:04,500 --> 00:10:08,790 +sẽ nhận thấy rằng có di chuyển và có rẽ trái. Nhưng không có lối + +154 +00:10:08,790 --> 00:10:11,460 +rẽ phải và không có lối rẽ. + +155 +00:10:12,030 --> 00:10:16,680 +Vậy làm thế nào chúng ta có thể sử dụng một hàm để tạo các lệnh đó? + +156 +00:10:17,310 --> 00:10:20,340 +Tất nhiên, vì chúng ta chỉ + +157 +00:10:20,400 --> 00:10:25,140 +có thể viết đơn giản, rẽ trái rồi lại rẽ trái. + +158 +00:10:27,180 --> 00:10:31,470 +Và điều này sẽ giúp robot quay ngược lại một cách hiệu quả, phải không? + +159 +00:10:32,280 --> 00:10:35,700 +Nhưng nếu chúng ta muốn làm điều đó nhiều lần, chẳng + +160 +00:10:35,700 --> 00:10:39,510 +hạn như nếu chúng ta muốn đến số ba, quay lại, quay lại + +161 +00:10:39,510 --> 00:10:44,340 +một, quay lại, quay lại ba, thì chúng ta sẽ phải viết mã trông giống như đây. + +162 +00:10:44,340 --> 00:10:45,960 +Chúng ta sẽ phải nói + +163 +00:10:47,550 --> 00:10:51,360 +di chuyển hai lần để đến hình vuông ba, rẽ trái, rẽ trái, + +164 +00:10:51,480 --> 00:10:56,480 +và sau đó di chuyển hai lần một lần nữa để đến một và sau đó rẽ + +165 +00:10:57,120 --> 00:10:59,640 +trái, rẽ trái một lần nữa để quay lại. + +166 +00:11:00,390 --> 00:11:05,390 +Đây là tất cả mã chúng ta phải viết để đạt được hiệu ứng này. + +167 +00:11:06,900 --> 00:11:11,430 +Nhưng thay vì tất cả những điều này, chúng ta chỉ có thể xác định một hàm mới. + +168 +00:11:11,970 --> 00:11:15,930 +Vì vậy, chúng tôi sử dụng từ khóa def để nói rằng đoạn mã này đang xác định một + +169 +00:11:16,200 --> 00:11:17,880 +hàm mới được gọi là turn_around và + +170 +00:11:19,410 --> 00:11:24,410 +hàm này chỉ đơn giản là sẽ được rẽ trái hai lần. Và hãy nhớ rằng, tất cả mã + +171 +00:11:26,190 --> 00:11:29,640 +sẽ đi vào bên trong hàm phải được thụt lề. + +172 +00:11:30,330 --> 00:11:33,480 +Và bây giờ thay vì viết, rẽ trái, rẽ trái, chúng ta + +173 +00:11:33,510 --> 00:11:37,950 +có thể đơn giản hóa mã của mình bằng cách yêu cầu nó gọi hàm, turn_around, và + +174 +00:11:38,250 --> 00:11:42,960 +chúng ta có thể làm điều đó ở đây và chúng ta có thể làm điều đó ở đây. + +175 +00:11:43,710 --> 00:11:45,780 +Vì vậy, bây giờ khi chúng tôi chạy + +176 +00:11:45,840 --> 00:11:48,930 +mã, bạn sẽ thấy rằng nó hoạt động giống hệt như trước + +177 +00:11:49,500 --> 00:11:52,590 +đây, nhưng lần này chúng tôi đã cắt giảm hai dòng mã. + +178 +00:11:53,320 --> 00:11:56,350 +Vì vậy, thay vì tám dòng mã cho các hướng dẫn của chúng + +179 +00:11:56,680 --> 00:11:58,870 +tôi, bây giờ chúng tôi chỉ cần sáu dòng. + +180 +00:11:59,410 --> 00:12:02,950 +Và bạn có thể thấy rằng bạn càng cần sử dụng chức năng này nhiều hơn + +181 +00:12:03,310 --> 00:12:08,080 +thì việc nhập nó sẽ giúp bạn tiết kiệm hơn. Nhưng quan trọng hơn việc giảm số + +182 +00:12:08,080 --> 00:12:13,080 +lượng dòng mã là mã của chúng ta cũng trở nên dễ đọc hơn + +183 +00:12:13,090 --> 00:12:13,923 +rất nhiều. + +184 +00:12:14,350 --> 00:12:19,350 +Vì vậy, hàm turn_around rõ ràng hơn nhiều so với việc rẽ trái hai lần. + +185 +00:12:20,260 --> 00:12:23,140 +Bây giờ chúng ta hãy xem điều gì sẽ xảy ra khi chúng ta sử dụng nút từng bước. + +186 +00:12:23,560 --> 00:12:26,830 +Hãy xem xét kỹ cách từng dòng trong mã của chúng tôi được thực thi. + +187 +00:12:27,850 --> 00:12:32,320 +Vì vậy, bây giờ những gì chúng ta sẽ thực hiện di chuyển từng cái, di chuyển từng cái + +188 +00:12:32,740 --> 00:12:37,740 +một và bây giờ nó sẽ gọi turn_around, hàm đó. Và nó nhảy qua để tìm + +189 +00:12:38,020 --> 00:12:42,610 +chức năng này và thực hiện code bên trong lần lượt từ + +190 +00:12:42,610 --> 00:12:46,870 +trên xuống dưới. Vì vậy, rẽ trái, rẽ trái. Và bây giờ một khi + +191 +00:12:46,900 --> 00:12:51,280 +chức năng đó được thực hiện, nó sẽ trở lại vị trí cũ và tiếp tục chạy, di chuyển, + +192 +00:12:51,700 --> 00:12:53,770 +di chuyển, và sau đó quay lại lần nữa. + +193 +00:12:55,330 --> 00:12:57,310 +Vì vậy, đây là thách thức của bạn. + +194 +00:12:57,610 --> 00:13:02,560 +Hãy thử và tạo một chức năng riêng để quay rô-bốt của chúng tôi sang bên phải. + +195 +00:13:03,310 --> 00:13:04,240 +Tạm dừng + +196 +00:13:04,360 --> 00:13:09,070 +video, truy cập tài nguyên khóa học và nhấp vào liên kết đưa bạn đến Thế + +197 +00:13:09,070 --> 00:13:10,030 +giới của Reeborg, sau + +198 +00:13:10,420 --> 00:13:14,500 +đó tiếp tục và tạo chức năng của riêng bạn có tên là turn_right. + +199 +00:13:15,860 --> 00:13:16,693 +1: Đúng. + +200 +00:13:16,780 --> 00:13:17,140 +Được rồi. + +201 +00:13:17,140 --> 00:13:22,030 +Vì vậy, điều này sẽ khá đơn giản vì tất cả những gì chúng ta phải làm là + +202 +00:13:22,030 --> 00:13:23,770 +xác định một hàm mới có + +203 +00:13:24,580 --> 00:13:29,470 +tên là turn_right và hàm này sẽ chỉ đơn giản là quay sang trái ba lần 1: + +204 +00:13:30,100 --> 00:13:30,933 +Phải không? + +205 +00:13:33,630 --> 00:13:37,890 +bởi vì rẽ trái ba lần sẽ giúp rô-bốt của chúng ta rẽ phải một cách + +206 +00:13:37,890 --> 00:13:38,723 +hiệu quả. + +207 +00:13:38,940 --> 00:13:43,940 +Vì vậy, mặc dù chúng ta chỉ có một cách này để xoay robot của mình, chúng ta có thể xác + +208 +00:13:44,700 --> 00:13:47,790 +định các chức năng của riêng mình để cung cấp cho nó rất + +209 +00:13:47,790 --> 00:13:50,280 +nhiều lệnh khác mà nó có thể sử dụng. + +210 +00:13:50,940 --> 00:13:54,360 +Vì vậy, bây giờ bằng cách sử dụng chức năng rẽ phải + +211 +00:13:54,810 --> 00:13:59,810 +này, hãy xem liệu bạn có thể viết một số mã khiến rô-bốt của chúng ta vẽ một hình + +212 +00:14:00,450 --> 00:14:04,410 +vuông nhỏ đi từ đây đến đây rồi đến đây và quay lại từ đầu. + +213 +00:14:05,340 --> 00:14:09,720 +Sau khi bạn hoàn thành và chơi, đây là những gì sẽ xảy ra. + +214 +00:14:12,350 --> 00:14:15,710 +Vì vậy, hãy tạm dừng video ngay bây giờ và xem liệu bạn có thể hoàn thành thử thách đó không. + +215 +00:14:19,730 --> 00:14:20,460 +1: Đúng không? + +216 +00:14:20,460 --> 00:14:23,010 +0: Được rồi. Vì vậy, chúng ta hãy đi từ đầu. + +217 +00:14:23,430 --> 00:14:26,730 +Chúng ta bắt đầu quay mặt về phía bên phải tại vị trí + +218 +00:14:26,730 --> 00:14:30,600 +1,1 một để vẽ hình vuông, bắt đầu từ cách này, trước tiên chúng ta + +219 +00:14:30,840 --> 00:14:32,520 +phải rẽ trái và sau đó + +220 +00:14:34,110 --> 00:14:38,220 +chúng ta phải di chuyển một bước và điều đó sẽ đưa chúng ta đến đây. + +221 +00:14:38,970 --> 00:14:43,740 +Và bây giờ chúng ta phải rẽ phải, tiến thêm một bước, + +222 +00:14:43,740 --> 00:14:46,770 +lại rẽ phải, tiến thêm một bước + +223 +00:14:49,080 --> 00:14:54,080 +nữa và cuối cùng rẽ phải lần cuối và tiến thêm một bước + +224 +00:14:55,580 --> 00:14:56,413 +nữa. + +225 +00:14:57,770 --> 00:15:02,770 +Vì vậy, sử dụng chức năng tuyệt vời của chúng tôi có nghĩa là chúng ta không cần phải rẽ phải, + +226 +00:15:03,110 --> 00:15:05,780 +rẽ trái ba lần mỗi khi chúng ta cần rẽ phải. + +227 +00:15:06,260 --> 00:15:11,260 +Vì vậy, mã của chúng tôi có thể chỉ dài tám dòng thay vì dài 14 dòng và chúng + +228 +00:15:12,200 --> 00:15:16,070 +tôi đang sử dụng chức năng của mình để cắt giảm nhiều lần nhập. + +229 +00:15:16,970 --> 00:15:19,370 +Nhưng không chỉ có ít dòng mã hơn, hãy + +230 +00:15:19,670 --> 00:15:24,020 +xem mã của chúng ta đã trở nên dễ đọc hơn như thế nào nhờ vào + +231 +00:15:24,020 --> 00:15:28,670 +chức năng rẽ phải của chúng ta. Giờ đây, việc đọc, rẽ phải và hiểu + +232 +00:15:28,820 --> 00:15:33,740 +những gì cần làm dễ dàng hơn rất nhiều so với việc nhìn thấy rẽ trái ba lần + +233 +00:15:33,740 --> 00:15:34,573 +trong mã. + +234 +00:15:35,210 --> 00:15:39,710 +Vì vậy, bây giờ nó dễ đọc hơn và dễ dàng hơn để tuân theo logic trong mã của chúng tôi. + +235 +00:15:40,400 --> 00:15:41,600 +Trong bài học + +236 +00:15:41,690 --> 00:15:46,640 +tiếp theo, tôi có một thử thách cho bạn. Hãy đến đó và áp dụng những gì bạn đã học về + +237 +00:15:46,670 --> 00:15:50,120 +các hàm để thử và giải quyết nó. Tôi sẽ gặp bạn ở đó. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 FAQ-I-Cant-Access-Reborgs-World.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 FAQ-I-Cant-Access-Reborgs-World.url new file mode 100644 index 0000000000000000000000000000000000000000..63cea420d1d9b44ccaab0f754e795d29341e928f --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 FAQ-I-Cant-Access-Reborgs-World.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/19110416#questions/13317630 \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Fork-the-Day-6-Starting-Repl.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Fork-the-Day-6-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..c3932b9b16b58544320765f834a5ffe7c9797749 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Fork-the-Day-6-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-6-start \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Reeborgs-World-Start.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Reeborgs-World-Start.url new file mode 100644 index 0000000000000000000000000000000000000000..6b8b621d159b968e184539447b8db96041d270ce --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/002 Reeborgs-World-Start.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Alone&url=worlds%2Ftutorial_en%2Falone.json \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 Reeborgs-World-Hurdles-Challenge.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 Reeborgs-World-Hurdles-Challenge.url new file mode 100644 index 0000000000000000000000000000000000000000..800f4567b6a5ed3c86b3774a90d67a026802c6e3 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 Reeborgs-World-Hurdles-Challenge.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%201&url=worlds%2Ftutorial_en%2Fhurdle1.json \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 The Hurdles Loop Challenge.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 The Hurdles Loop Challenge.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..31b5894ab2ce58cb65d6874ed59acc891b92d35e --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 The Hurdles Loop Challenge.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3ad51669b97c31aa25a046b255fa0e9e3534e2ccb5df4003dff37af0331c2b8 +size 65863325 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 The Hurdles Loop Challenge_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 The Hurdles Loop Challenge_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6a750b9dae80052fd49cc46aa3a26dca34cb4e29 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/003 The Hurdles Loop Challenge_vi.srt @@ -0,0 +1,660 @@ +1 +00:00:00,390 --> 00:00:03,150 +Được rồi. Vì vậy, bây giờ bạn đã học + +2 +00:00:03,300 --> 00:00:07,680 +về các hàm, tôi có một thách thức mã hóa cho bạn. Nếu bạn truy cập liên kết này, trong + +3 +00:00:07,800 --> 00:00:12,300 +tài nguyên của khóa học và đi đến thử thách này có tên là Vội vàng + +4 +00:00:12,300 --> 00:00:13,710 +1, ý tưởng là + +5 +00:00:14,310 --> 00:00:19,310 +chúng ta có một robot ở đây cần thực hiện một số rào cản để nhảy qua từng + +6 +00:00:19,590 --> 00:00:23,190 +những rào cản này, để đạt được mục tiêu cuối cùng ở đây. + +7 +00:00:23,820 --> 00:00:27,900 +Bây giờ bạn cần sử dụng kiến thức của mình về các hàm cũng như + +8 +00:00:28,140 --> 00:00:30,810 +một số điều bạn đã học trước đây, chẳng + +9 +00:00:30,810 --> 00:00:34,920 +hạn như vòng lặp for hoặc hàm phạm vi, để có thể đạt được điều này. + +10 +00:00:35,640 --> 00:00:39,810 +Bây giờ, hãy nhớ rằng bạn có thể yêu cầu rô bốt di chuyển bằng cách nhập, di + +11 +00:00:40,290 --> 00:00:43,350 +chuyển () và khi chạy, nó sẽ di chuyển theo một dấu cách. + +12 +00:00:43,890 --> 00:00:46,200 +Và bạn cũng có thể sử + +13 +00:00:46,230 --> 00:00:50,160 +dụng, chẳng hạn như turn_left để yêu cầu rô bốt rẽ trái. + +14 +00:00:50,700 --> 00:00:52,320 +Và trong trường hợp này, khi + +15 +00:00:52,320 --> 00:00:55,530 +tôi chạy mã, nó sẽ di chuyển một khoảng trắng và hướng sang trái. + +16 +00:00:56,640 --> 00:00:59,130 +Để hoàn thành toàn bộ thử thách này, bạn + +17 +00:00:59,190 --> 00:01:03,030 +có thể thấy một số bước mà robot phải trải qua trước khi có + +18 +00:01:03,030 --> 00:01:07,830 +thể đạt được mục tiêu cuối cùng này. Và nếu bạn viết ra từng bước này, + +19 +00:01:08,160 --> 00:01:12,360 +giống như tôi đã làm ở đây cái này đến bước khác, thì sẽ mất rất + +20 +00:01:12,390 --> 00:01:16,950 +nhiều, hàng chục dòng mã. Và đó không phải là những gì chúng ta đang làm. Chúng tôi là lập trình viên. + +21 +00:01:16,980 --> 00:01:18,660 +Vì vậy, chúng ta sinh ra để lười biếng. + +22 +00:01:19,080 --> 00:01:23,400 +Hãy thử và xem liệu bạn có thể giảm thiểu số dòng mã trong khi vẫn + +23 +00:01:23,400 --> 00:01:28,400 +giữ cho mã của bạn có thể đọc và hiểu được bởi người khác và có thể yêu cầu rô bốt + +24 +00:01:28,710 --> 00:01:33,300 +của bạn hoàn thành các hướng dẫn này và đưa rô bốt đến mục tiêu cuối cùng hay không. + +25 +00:01:34,140 --> 00:01:36,930 +Và khi bạn đã hoàn thành thử thách thành công, bạn + +26 +00:01:37,200 --> 00:01:42,200 +sẽ nhận được một cửa sổ bật lên màu xanh lục cho biết bạn đang ở đúng vị trí X và Y. + +27 +00:01:42,990 --> 00:01:44,520 +Vì vậy, hãy tạm dừng + +28 +00:01:44,550 --> 00:01:48,150 +video ngay bây giờ, truy cập liên kết này và thực hiện thử thách này. + +29 +00:01:48,390 --> 00:01:49,223 +1: Đúng. + +30 +00:01:54,290 --> 00:01:57,050 +0: Được rồi. Vậy bạn đã làm thế nào với thử thách này? + +31 +00:01:57,830 --> 00:02:02,720 +Bạn đã mất bao nhiêu dòng mã để nói cho robot này đến mục tiêu? + +32 +00:02:03,560 --> 00:02:06,230 +Được rồi. Hãy suy nghĩ về cách chúng ta có thể giải quyết vấn đề này. + +33 +00:02:06,500 --> 00:02:10,460 +Chúng tôi biết rằng trong số những điều mà chúng tôi có thể yêu cầu robot làm, + +34 +00:02:10,460 --> 00:02:13,190 +những điều hữu ích nhất là di chuyển và rẽ trái. + +35 +00:02:13,670 --> 00:02:17,480 +Nhưng vì rô bốt không có chức năng rẽ phải tích hợp, nên chúng + +36 +00:02:17,720 --> 00:02:19,820 +tôi phải tự xác định điều đó. + +37 +00:02:20,360 --> 00:02:23,750 +Và lý do tại sao chúng ta cần làm điều đó là vì bạn có thể thấy rằng tại một số điểm + +38 +00:02:23,750 --> 00:02:27,920 +trong quá trình vượt chướng ngại vật, chúng ta sẽ phải rẽ phải. Ví dụ, khi robot ở đây + +39 +00:02:27,920 --> 00:02:32,570 +ở vị trí thứ 2, thứ 2, nó sẽ phải rẽ phải, sau đó di chuyển + +40 +00:02:32,630 --> 00:02:35,810 +và sau đó lại rẽ phải và sau đó di chuyển. + +41 +00:02:36,290 --> 00:02:39,650 +Vì vậy, hãy tạo một hàm mới có tên là turn_right. + +42 +00:02:40,190 --> 00:02:44,990 +Vì vậy, chúng ta bắt đầu với từ khóa def key và sau đó đặt tên cho hàm của + +43 +00:02:44,990 --> 00:02:46,280 +chúng ta sẽ là turn_right. + +44 +00:02:47,270 --> 00:02:50,180 +Và sau đó chúng tôi thêm các dấu ngoặc đơn mà không có gì bên trong + +45 +00:02:50,210 --> 00:02:52,880 +bởi vì chúng tôi không chuyển bất kỳ đầu vào nào cho hàm này. + +46 +00:02:53,360 --> 00:02:58,360 +Chúng tôi sẽ chỉ sử dụng chức năng này như một cách để + +47 +00:02:59,350 --> 00:03:03,970 +xác định rẽ trái ba lần. Vì vậy, khi bạn rẽ trái ba lần, tất nhiên bạn sẽ rẽ phải. + +48 +00:03:04,480 --> 00:03:07,330 +Và bây giờ chúng tôi có khả năng rẽ phải. + +49 +00:03:07,870 --> 00:03:12,280 +Vì vậy, hãy chú ý đây là khối mã cho chức năng rẽ phải của chúng ta + +50 +00:03:12,730 --> 00:03:16,690 +và nó kết thúc ở dòng cuối cùng, được thụt vào, là dòng 4. + +51 +00:03:17,230 --> 00:03:19,030 +Vì vậy, mọi dòng tiếp + +52 +00:03:19,060 --> 00:03:22,560 +theo bắt đầu ở phần đầu của tệp mã bên cạnh + +53 +00:03:22,580 --> 00:03:27,430 +lề trái đều nằm ngoài khối mã này và nó sẽ hoạt động độc lập. + +54 +00:03:28,000 --> 00:03:28,810 +Vì vậy, + +55 +00:03:28,810 --> 00:03:33,430 +trên thực tế, dòng mã đầu tiên thực sự chạy trong tệp của chúng ta + +56 +00:03:33,430 --> 00:03:36,760 +sẽ là dòng 6 này. Và bạn có thể thấy rằng khi tôi + +57 +00:03:36,820 --> 00:03:39,370 +nhấn chạy, bạn có thể thấy đó là điều đầu tiên được đánh dấu. + +58 +00:03:40,030 --> 00:03:42,340 +Và nếu tôi đi qua bước này một cách + +59 +00:03:42,400 --> 00:03:47,260 +khôn ngoan, bạn có thể thấy dòng đầu tiên sẽ là dòng 6 và nó yêu cầu máy tính đi + +60 +00:03:47,260 --> 00:03:51,520 +và tìm hàm này có tên là turn_right. Vì vậy, nếu tôi bỏ qua bước tiếp + +61 +00:03:51,700 --> 00:03:55,930 +theo, tôi thấy rằng, và nó sẽ bắt đầu đi qua các dòng 2, 3 và 4, + +62 +00:03:55,930 --> 00:03:56,763 +quay rô-bốt của + +63 +00:03:57,040 --> 00:04:02,040 +chúng tôi ba lần cho đến khi nó rẽ phải. Bây giờ chúng ta có khả năng rẽ + +64 +00:04:03,970 --> 00:04:05,440 +phải, chúng ta hãy + +65 +00:04:05,560 --> 00:04:10,560 +suy nghĩ về cách chúng ta có thể khiến robot của mình thực hiện một bước nhảy. + +66 +00:04:11,440 --> 00:04:16,440 +Hãy xem nào. Điều đầu tiên có lẽ chúng tôi muốn robot của mình làm + +67 +00:04:16,570 --> 00:04:19,120 +là tiến lên phía trước một bước, điều này sẽ xảy ra ở đây. + +68 +00:04:19,630 --> 00:04:24,630 +Và sau đó, điều tiếp theo chúng tôi muốn nó làm là rẽ trái để nó hướng về + +69 +00:04:24,760 --> 00:04:25,593 +phía trên. + +70 +00:04:28,680 --> 00:04:28,940 +1: Đúng không? + +71 +00:04:28,940 --> 00:04:31,220 +0: Và khi nó ở vị trí + +72 +00:04:31,250 --> 00:04:34,580 +này, chúng tôi muốn nó tiến lên một bước, và sau đó + +73 +00:04:35,210 --> 00:04:39,920 +chúng tôi có thể muốn nó rẽ phải. Bây giờ, hãy để ý xem tôi đang + +74 +00:04:39,950 --> 00:04:44,950 +thực sự kiểm tra mã của mình như thế nào ở hầu hết các dòng khác mà + +75 +00:04:45,260 --> 00:04:46,093 +tôi viết. + +76 +00:04:46,400 --> 00:04:50,570 +Và điều này có nghĩa là bạn sẽ không rơi vào một tình huống mà bạn đến cuối và + +77 +00:04:50,570 --> 00:04:54,020 +bạn đã viết rất nhiều và rất nhiều dòng mã, và nó không hoạt động. + +78 +00:04:54,530 --> 00:04:58,430 +Trong trường hợp đó, bạn phải xem lại tất cả các mã bạn đã viết và tìm + +79 +00:04:58,430 --> 00:05:01,190 +ra vấn đề nằm ở đâu. Vì vậy, trong trường hợp này, chúng + +80 +00:05:01,220 --> 00:05:04,310 +tôi chỉ có bốn dòng và chúng tôi đã thử nghiệm nó từng bước khôn ngoan. + +81 +00:05:04,700 --> 00:05:09,020 +Vì vậy, chúng tôi có thể thấy rằng chúng tôi đang đi đúng hướng và rô bốt của chúng tôi hiện đã được quay sang + +82 +00:05:09,350 --> 00:05:11,210 +bên phải, sẵn sàng di chuyển thêm một bước nữa. + +83 +00:05:13,670 --> 00:05:15,350 +Và sau đó khi nó đến đây, + +84 +00:05:15,350 --> 00:05:18,410 +chúng ta phải rẽ phải một lần nữa và di chuyển thêm một bước nữa. + +85 +00:05:23,980 --> 00:05:24,280 +1: Đúng không? + +86 +00:05:24,280 --> 00:05:27,910 +0: Và bây giờ nó sẽ kết thúc ở đây, nhưng chúng ta hãy kiểm tra nó. + +87 +00:05:28,630 --> 00:05:32,230 +Vì vậy, rô bốt của chúng ta rẽ trái rẽ phải, lại rẽ phải. + +88 +00:05:32,650 --> 00:05:35,110 +Và nó kết thúc ở đây đối mặt với phía dưới. + +89 +00:05:35,710 --> 00:05:40,480 +Vì vậy, điều cuối cùng chúng ta cần làm là lấy nó, rẽ trái một lần nữa, + +90 +00:05:42,010 --> 00:05:44,350 +sao cho nó hướng về phía trước. + +91 +00:05:47,630 --> 00:05:47,900 +1: Đúng không? + +92 +00:05:47,900 --> 00:05:50,750 +0: Vì vậy, khi bạn đã xác nhận rằng mã của mình đang hoạt động, + +93 +00:05:51,230 --> 00:05:54,110 +thì bạn thực sự nên nghĩ về bước tiếp theo là gì, bởi vì chúng + +94 +00:05:54,140 --> 00:05:57,950 +tôi đã cố gắng vượt qua một trở ngại. Và hãy chú ý khi chúng + +95 +00:05:57,980 --> 00:06:01,700 +ta ở vị trí này, 3,1, hình vuông cụ thể này, nó gần + +96 +00:06:02,120 --> 00:06:05,000 +giống như khi chúng ta ở vị trí 1, 1, + +97 +00:06:05,120 --> 00:06:10,040 +bởi vì chúng ta phải di chuyển lại một bước, rẽ trái, di chuyển, rẽ phải, di chuyển, + +98 +00:06:10,070 --> 00:06:12,080 +quay, sang phải, di chuyển, rẽ trái. + +99 +00:06:12,380 --> 00:06:17,380 +Vì vậy, về cơ bản nó lặp lại tất cả các hướng dẫn này, thay vì thực + +100 +00:06:18,140 --> 00:06:22,490 +hiện các hướng dẫn này sáu lần, bởi vì có sáu rào cản. + +101 +00:06:23,120 --> 00:06:25,430 +Vì vậy, nếu tôi quay lại và bắt đầu, + +102 +00:06:25,520 --> 00:06:28,910 +thì bạn sẽ thấy rằng mã này thực sự sẽ hoàn thành thử thách. + +103 +00:06:31,980 --> 00:06:32,813 +1: Đúng không? + +104 +00:06:32,820 --> 00:06:35,790 +0: Nó nói rằng tôi đã hoàn thành. Và chúng ta đang ở đúng vị trí, + +105 +00:06:35,940 --> 00:06:38,160 +nhưng hãy chú ý xem chúng ta có bao nhiêu dòng mã. + +106 +00:06:38,160 --> 00:06:41,340 +Chúng tôi có một cái gì đó giống như 58 dòng mã. + +107 +00:06:41,400 --> 00:06:44,700 +Tôi biết tôi đã để lại một số khoảng trắng trong chúng để bạn có + +108 +00:06:44,700 --> 00:06:49,290 +thể thấy phần nào đang lặp lại, nhưng đó vẫn là một lượng lớn mã cho một thứ rất đơn giản. + +109 +00:06:49,860 --> 00:06:53,040 +Bây giờ chúng ta biết rằng chúng ta có thể sử dụng các hàm để đóng + +110 +00:06:53,100 --> 00:06:55,680 +gói một tập hợp các hướng dẫn lại với nhau dưới một tên, + +111 +00:06:56,040 --> 00:06:58,560 +giống như những gì chúng ta đã làm ở đây với turn_right. + +112 +00:06:58,920 --> 00:07:02,010 +Chúng tôi đã đóng gói ba dòng mã rẽ trái, rẽ trái, + +113 +00:07:02,010 --> 00:07:05,040 +rẽ trái thành một hàm duy nhất gọi là turn_right để khi + +114 +00:07:05,460 --> 00:07:09,930 +chúng ta cần chức năng đó, tất cả những gì chúng ta cần làm chỉ là gọi + +115 +00:07:09,930 --> 00:07:12,360 +hàm và thêm dấu ngoặc đơn vào cuối. + +116 +00:07:12,960 --> 00:07:17,550 +Vì vậy, chúng ta có thể thực hiện chính xác điều tương tự với bộ hướng dẫn này, + +117 +00:07:17,610 --> 00:07:21,360 +về cơ bản giúp robot của chúng ta thực hiện một bước nhảy. + +118 +00:07:22,050 --> 00:07:25,260 +Vì vậy, hãy tạo một def và chúng ta hãy gọi hàm này là bước nhảy. + +119 +00:07:25,920 --> 00:07:30,420 +Và sau đó, hãy thêm dấu ngoặc đơn và dấu hai chấm. Và rất quan trọng, tất cả các dòng + +120 +00:07:30,450 --> 00:07:34,590 +mã này phải được thụt lề. Vì vậy, để thụt lề toàn + +121 +00:07:34,590 --> 00:07:36,090 +bộ khối mã + +122 +00:07:36,330 --> 00:07:41,330 +với nhau, bạn giữ phím lệnh và nhấp vào dấu ngoặc vuông bên trái + +123 +00:07:41,460 --> 00:07:45,600 +hoặc dấu ngoặc vuông bên phải. Trên cửa sổ, nó giữ phím điều khiển và + +124 +00:07:45,600 --> 00:07:48,450 +một lần nữa, dấu ngoặc vuông cuối cùng hoặc dấu ngoặc vuông bên phải. + +125 +00:07:49,140 --> 00:07:54,140 +Vì vậy, bây giờ điều này về cơ bản nói rằng tất cả các hướng dẫn này nằm bên trong + +126 +00:07:54,660 --> 00:07:58,890 +khối mã này được gọi là bước nhảy. Và khi chúng ta gọi jump, + +127 +00:07:59,760 --> 00:08:03,300 +thì nó sẽ thực hiện tất cả các dòng mã này. + +128 +00:08:04,680 --> 00:08:09,680 +Vì vậy, bây giờ những gì chúng ta có thể làm để hoàn thành thử thách là chỉ cần gọi + +129 +00:08:09,810 --> 00:08:11,610 +hàm này là nhảy sáu lần. + +130 +00:08:12,690 --> 00:08:13,523 +1: Đúng không? + +131 +00:08:14,740 --> 00:08:19,740 +0: Và bây giờ chúng ta có thể giải quyết toàn bộ vấn đề này một lần nữa chỉ bằng 21 dòng mã. + +132 +00:08:23,050 --> 00:08:28,050 +Và chúng tôi đã quản lý để hoàn thành thử thách này bằng cách sử dụng hai hàm + +133 +00:08:28,720 --> 00:08:32,559 +có hướng dẫn lặp lại và sau đó gọi hàm nhảy sáu lần. + +134 +00:08:33,130 --> 00:08:37,750 +Nhưng bởi vì chúng tôi đã học về vòng lặp và hàm phạm vi, chúng tôi biết rằng chúng + +135 +00:08:38,110 --> 00:08:41,350 +tôi thực sự có thể cắt giảm điều này ngắn hơn nữa. + +136 +00:08:41,890 --> 00:08:44,290 +Vì vậy, thay vì gọi hàm jump + +137 +00:08:44,320 --> 00:08:49,320 +sáu lần, chúng ta thực sự có thể viết một vòng lặp for lặp + +138 +00:08:50,290 --> 00:08:50,860 +lại + +139 +00:08:50,860 --> 00:08:55,860 +và gọi hàm jump này sáu lần. Chúng ta có thể nói điều gì đó như + +140 +00:08:56,880 --> 00:09:00,090 +for step in, và hãy nhớ rằng hai từ khóa này + +141 +00:09:00,090 --> 00:09:02,730 +đến từ for ... trong vòng lặp và chúng luôn phải giữ nguyên. + +142 +00:09:03,480 --> 00:09:05,280 +Và sau từ khóa in, chúng ta + +143 +00:09:05,400 --> 00:09:09,600 +xác định các quy tắc cho số lần chúng ta muốn vòng lặp của mình lặp lại. + +144 +00:09:10,050 --> 00:09:13,020 +Trong trường hợp của tôi, tôi sẽ sử dụng hàm trong phạm vi. + +145 +00:09:13,530 --> 00:09:17,370 +Và tôi sẽ nói từ 0 đến 6, nhưng + +146 +00:09:17,700 --> 00:09:22,380 +không bao gồm 6. Vì vậy, trong trường hợp này nó sẽ là 0, + +147 +00:09:22,410 --> 00:09:23,910 +1, 2, 3, 4, 5. + +148 +00:09:24,270 --> 00:09:27,420 +Vì vậy, điều đó thực sự sẽ xảy ra sáu lần. + +149 +00:09:28,020 --> 00:09:32,070 +Và bây giờ tôi sẽ thêm dấu hai chấm. Và cuối cùng, bên trong vòng + +150 +00:09:32,160 --> 00:09:33,930 +lặp for này, tôi + +151 +00:09:33,960 --> 00:09:37,650 +sẽ gọi jump chỉ một lần. Bây giờ, hãy xem + +152 +00:09:37,650 --> 00:09:41,790 +điều gì sẽ xảy ra. Đầu tiên, nó bắt đầu từ vòng lặp + +153 +00:09:42,180 --> 00:09:47,180 +for, nó gọi jump và nó đi qua điều này một lần và sau đó nó quay lại vòng lặp + +154 +00:09:47,880 --> 00:09:51,690 +lại, gọi nó vào lần tiếp theo. Và sau đó một lần nữa, + +155 +00:09:51,840 --> 00:09:55,680 +lần thứ ba trong vòng lặp, lần thứ tư trong vòng lặp, lần thứ + +156 +00:09:56,280 --> 00:09:59,520 +năm trong vòng lặp và lần thứ sáu trong vòng lặp. + +157 +00:10:01,880 --> 00:10:03,500 +Bạn đã xoay sở để đi được bao xa? + +158 +00:10:03,950 --> 00:10:08,630 +Bạn có gặp khó khăn trong phần này khi chúng tôi cần tạo vòng lặp for không? + +159 +00:10:09,200 --> 00:10:10,610 +Trong trường hợp đó, tôi khuyên + +160 +00:10:10,640 --> 00:10:14,840 +bạn nên quay lại bài học mà chúng ta đã đề cập đến vòng lặp for và + +161 +00:10:14,840 --> 00:10:19,520 +xem xét chi tiết vòng lặp for và hàm phạm vi trước khi bạn quay lại và thử giải + +162 +00:10:19,520 --> 00:10:21,980 +lại thử thách này. Điều thực sự, rất + +163 +00:10:21,980 --> 00:10:26,600 +quan trọng ở giai đoạn này là bạn đã hiểu và bạn đã nắm vững một số + +164 +00:10:26,600 --> 00:10:31,250 +ý tưởng này bởi vì chúng ta sẽ ngày càng sử dụng chúng nhiều hơn trong tương lai. + +165 +00:10:31,910 --> 00:10:35,360 +Thực sự đảm bảo rằng bạn đã hiểu mọi thứ trước khi tiếp tục. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 Indentation in Python.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 Indentation in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2a2793209e3a90557ccb130095982c0fde323d24 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 Indentation in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73e48ca29c1de07e0c90e1263b69fa86ccea27c0b68eb8b47fd6ecbdf8595f6e +size 83752222 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 Indentation in Python_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 Indentation in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..22e8fcbc0aaed61a08ccbb38a7bc17503f10424f --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 Indentation in Python_vi.srt @@ -0,0 +1,536 @@ +1 +00:00:00,760 --> 00:00:02,260 +Trong các bài + +2 +00:00:02,290 --> 00:00:07,150 +học trước, tôi đã đề cập đến tầm quan trọng của việc nhận + +3 +00:00:07,150 --> 00:00:12,010 +biết thụt lề của bạn trong Python. Vì vậy, chúng ta biết rằng khi + +4 +00:00:12,040 --> 00:00:15,850 +chúng ta tạo một hàm như thế này, mọi dòng đứng + +5 +00:00:16,120 --> 00:00:20,590 +sau định nghĩa này được thụt vào sẽ nằm bên trong hàm này. + +6 +00:00:21,130 --> 00:00:23,050 +Vì vậy, bằng cách thụt vào, tôi có + +7 +00:00:23,050 --> 00:00:26,650 +nghĩa là nó được dịch sang bên phải bởi bốn dấu cách như thế này. + +8 +00:00:27,280 --> 00:00:31,990 +Vì vậy, nếu bạn tưởng tượng mỗi dấu chấm là một khoảng trắng, thì đây là một khối mã duy nhất. + +9 +00:00:33,580 --> 00:00:37,900 +Và nếu chúng ta muốn tiếp tục thêm vào khối mã này bên trong hàm của tôi, + +10 +00:00:38,170 --> 00:00:41,650 +thì chúng ta sẽ tiếp tục thêm các dòng mã được thụt vào. + +11 +00:00:42,430 --> 00:00:47,430 +Vì vậy, bạn gần như phải tự mình hình dung ra dòng vô hình xung quanh các khối + +12 +00:00:47,560 --> 00:00:51,100 +mã này, được thụt vào trong. Bây giờ, nếu mã của + +13 +00:00:51,190 --> 00:00:54,190 +tôi được viết như thế này mặt khác, thì khối + +14 +00:00:54,550 --> 00:00:59,550 +mã trên thực tế chỉ là phần này. Và câu lệnh in này sẽ không được + +15 +00:01:02,110 --> 00:01:07,000 +kích hoạt khi hàm này được kích hoạt vì nó độc lập với hàm này + +16 +00:01:07,270 --> 00:01:12,130 +vì nó không được thụt lề. Bây giờ, một cách đơn giản mà + +17 +00:01:12,130 --> 00:01:16,840 +tôi thích nghĩ về kiểu thụt lề này giống như cấu trúc tệp bạn thấy khi + +18 +00:01:16,840 --> 00:01:19,840 +truy cập vào công cụ tìm kiếm trên Mac hoặc + +19 +00:01:19,870 --> 00:01:22,390 +khi bạn truy cập vào Explorer trên Windows. + +20 +00:01:23,380 --> 00:01:24,910 +Nếu chúng ta có một + +21 +00:01:25,000 --> 00:01:29,950 +hàm, nó giống như một thư mục và bất cứ thứ gì bên trong hàm, ví dụ, + +22 +00:01:29,980 --> 00:01:33,100 +nếu tôi ném tệp này vào bên trong hàm, thì bạn + +23 +00:01:33,460 --> 00:01:36,160 +nhận thấy rằng nó bị thụt vào, phải không? + +24 +00:01:36,670 --> 00:01:39,250 +Và bằng cách này, nó cho + +25 +00:01:39,250 --> 00:01:42,130 +bạn thấy rất, rất rõ ràng rằng hai + +26 +00:01:42,130 --> 00:01:46,420 +tệp print- hello và print-world đang sống bên trong thư mục + +27 +00:01:46,480 --> 00:01:50,920 +này, chức năng của tôi. Và đây là mã tương đương với mã này. + +28 +00:01:51,400 --> 00:01:56,400 +Chúng tôi có thư mục này nói, my_ Chức năng, và nó chứa hai dòng mã này. + +29 +00:01:58,090 --> 00:01:59,260 +Mặt khác, nếu + +30 +00:01:59,290 --> 00:02:04,290 +tôi lấy thế giới in này và tôi đặt nó bên ngoài thư mục chức năng, thì + +31 +00:02:05,470 --> 00:02:09,490 +bạn có thể thấy rằng nó hoàn toàn độc lập với thư mục đó. + +32 +00:02:10,030 --> 00:02:14,170 +Và bây giờ nó được thụt vào ở cùng cấp với hàm. + +33 +00:02:14,800 --> 00:02:19,780 +Vì vậy, đây là mã tương đương với mã này, nơi chúng ta có bản in + +34 +00:02:19,780 --> 00:02:21,820 +này - xin chào là bên trong + +35 +00:02:21,820 --> 00:02:26,820 +my_ Chức năng và thế giới in này ở bên ngoài và ở cùng mức thụt lề + +36 +00:02:28,240 --> 00:02:31,840 +như định nghĩa hàm này. Bây giờ, việc thụt + +37 +00:02:31,840 --> 00:02:35,920 +lề trở nên phức tạp hơn một chút khi chúng ta + +38 +00:02:35,920 --> 00:02:40,240 +có các khối mã khác. Vì vậy, ví dụ, các câu lệnh if / elif / else. + +39 +00:02:40,420 --> 00:02:41,800 +Chúng có các khối + +40 +00:02:42,190 --> 00:02:45,430 +mã cần được thụt lề để nằm bên trong khối. + +41 +00:02:45,940 --> 00:02:49,240 +Đối với vòng lặp cần phải được thụt lề để nằm bên trong vòng lặp. + +42 +00:02:49,870 --> 00:02:54,820 +Và điều rất quan trọng là bạn phải quen với việc xem xét các + +43 +00:02:54,820 --> 00:02:58,720 +khối mã như thế này. Vì vậy, ví dụ, nếu chúng + +44 +00:02:59,410 --> 00:03:03,640 +ta mở rộng my_ function đơn giản của mình và thêm một loạt mã vào + +45 +00:03:04,150 --> 00:03:08,890 +đó, thì chúng ta sẽ phải thụt lề tất cả các dòng mã đó bằng bốn dấu cách + +46 +00:03:09,070 --> 00:03:13,810 +được biểu thị bằng bốn dấu chấm ở đây. Bây giờ, nếu chúng ta muốn + +47 +00:03:13,810 --> 00:03:17,740 +có một khối mã khác bên trong câu lệnh if + +48 +00:03:18,040 --> 00:03:20,950 +này, thì dòng này phải được thụt + +49 +00:03:21,190 --> 00:03:23,470 +vào, thêm bốn dấu cách. + +50 +00:03:24,310 --> 00:03:27,070 +Vì vậy, đây là khối chức năng, + +51 +00:03:28,000 --> 00:03:30,910 +đây là khối if, đây là khối elif + +52 +00:03:31,600 --> 00:03:36,600 +và bạn phải có thể nhìn thấy tất cả những điều này trong khi + +53 +00:03:38,230 --> 00:03:43,120 +chỉ nhìn vào phần thụt lề. Nếu chúng ta muốn thể hiện điều này, thì nó + +54 +00:03:43,180 --> 00:03:47,500 +gần giống như tạo một thư mục mới. Hãy gọi nó + +55 +00:03:47,530 --> 00:03:50,770 +là If sky == clear. + +56 +00:03:52,480 --> 00:03:56,740 +Và khối if này đi vào bên trong hàm của tôi, vì vậy nó được thụt vào. + +57 +00:03:57,490 --> 00:04:01,810 +Bây giờ, nếu tôi muốn có một câu lệnh in, + +58 +00:04:01,840 --> 00:04:06,190 +hãy gọi nó là print-blue bên trong câu lệnh if này. + +59 +00:04:06,220 --> 00:04:10,390 +Vì vậy, đây là những gì sẽ được thực thi nếu hàm này được + +60 +00:04:10,510 --> 00:04:13,630 +gọi và nếu bầu trời bằng với bầu trời trong, + +61 +00:04:13,630 --> 00:04:16,390 +thì dòng này được thụt vào hai lần. + +62 +00:04:17,140 --> 00:04:22,140 +Và đó là tương đương với bốn khoảng trắng trong mã của chúng ta, như thế này. + +63 +00:04:24,100 --> 00:04:26,470 +Bây giờ, mỗi khi tôi nói về + +64 +00:04:26,500 --> 00:04:31,500 +thụt lề, tôi đều nói về khoảng trắng và thực sự có hai cách để + +65 +00:04:31,750 --> 00:04:35,080 +tạo ra thụt lề. Bạn không cần phải chỉ sử dụng dấu cách. + +66 +00:04:35,260 --> 00:04:40,260 +Bạn cũng có thể sử dụng các tab và được tạo bằng phím tab trên bàn phím của bạn, + +67 +00:04:40,720 --> 00:04:42,730 +có thể trông giống như thế này. + +68 +00:04:43,840 --> 00:04:48,550 +Bây giờ có rất nhiều cuộc tranh luận xung quanh dấu cách và tab trong đó một số người + +69 +00:04:48,550 --> 00:04:52,570 +thích sử dụng dấu cách để thụt lề, những người khác thích tab để thụt lề. + +70 +00:04:53,050 --> 00:04:56,740 +Và có rất nhiều người tranh cãi trong cộng đồng mã hóa. + +71 +00:04:57,250 --> 00:05:01,720 +Và tôi nghĩ đoạn trích này từ một trong những chương trình yêu thích của tôi thực sự chứng minh điều này. + +72 +00:05:11,980 --> 00:05:15,940 +1: Richard có chuyện gì vậy? Không có gì, không có gì, theo nghĩa đen. Tất cả đều tốt. + +73 +00:05:20,640 --> 00:05:24,750 +0: Nào. Ôi chúa ơi. Bạn cùng phòng của bạn đã đúng. Bạn thực sự ghét không gian. + +74 +00:05:25,050 --> 00:05:28,920 +Không, không, không, không. Tôi không. Nó không phải là ghét, ghét là một từ mạnh mẽ. Ừm, nói + +75 +00:05:29,460 --> 00:05:32,490 +thật là tôi có chút thích các tab, nhưng + +76 +00:05:32,520 --> 00:05:34,360 +đó chỉ vì tôi là người + +77 +00:05:34,360 --> 00:05:37,590 +hậu đậu và vì tôi thích độ chính xác hơn. + +78 +00:05:40,390 --> 00:05:42,160 +0: Chà, không phải để chọn một cuộc chiến ở + +79 +00:05:42,160 --> 00:05:45,580 +đây, nhưng nếu bạn thực sự quan tâm đến độ chính xác, tại sao bạn không sử dụng dấu cách? + +80 +00:05:46,360 --> 00:05:50,050 +Nhưng bất cứ điều gì, một khi nó đi qua trình biên dịch, nó sẽ giống nhau, phải không? + +81 +00:05:51,230 --> 00:05:53,300 +1: Vâng. Ừ. Về mặt kỹ thuật, có. + +82 +00:05:53,630 --> 00:05:54,463 +2: Đúng. + +83 +00:05:59,150 --> 00:06:03,380 +1: Tôi đoán là tôi chỉ, tôi không hiểu tại sao mọi người lại sử dụng dấu cách trên các tab. + +84 +00:06:03,380 --> 00:06:04,850 +Giống như nếu tất cả đều giống + +85 +00:06:04,920 --> 00:06:08,300 +nhau, tại sao không chỉ sử dụng các tab? Bởi vì nó có thể trông khác trên + +86 +00:06:08,300 --> 00:06:11,480 +máy tính của người khác. Các tab tạo ra kích thước tệp nhỏ hơn. Được rồi. + +87 +00:06:11,480 --> 00:06:13,160 +Tôi điều hành một công ty nén. Hãy tin tôi. + +88 +00:06:13,160 --> 00:06:17,090 +Tôi đã dành cả cuộc đời mình để tối giản hóa kích thước tệp. Đó là những gì tôi làm. Ý tôi là, tôi không hiểu + +89 +00:06:17,090 --> 00:06:21,440 +tại sao mọi người lại sử dụng dấu cách trên các tab. Ý tôi là, tại sao không chỉ sử + +90 +00:06:21,440 --> 00:06:26,390 +dụng VIM thay vì Emacs? Tôi sử dụng VIM thay vì Emacs. Chúa giúp chúng tôi. + +91 +00:06:26,930 --> 00:06:31,220 +Được chứ. Uh, bạn biết gì không? Tôi chỉ, tôi không nghĩ điều này sẽ thành công. + +92 +00:06:31,310 --> 00:06:33,080 +Tôi rất xin lỗi. Uh, ý tôi là như thế + +93 +00:06:33,260 --> 00:06:35,720 +nào, chúng tôi sẽ đưa những đứa trẻ vào thế giới này với điều đó trên đầu. + +94 +00:06:35,720 --> 00:06:37,820 +Stuff không thực sự công bằng đối với họ. Bạn có nghĩ vậy không? Trẻ em? + +95 +00:06:37,820 --> 00:06:39,800 +chúng tôi thậm chí còn chưa ngủ cùng nhau. Và đoán xem? + +96 +00:06:40,010 --> 00:06:42,920 +Điều đó sẽ không bao giờ xảy ra bây giờ vì không đời nào + +97 +00:06:42,920 --> 00:06:45,440 +tôi đi với một người sử dụng dấu cách trên các tab. + +98 +00:06:46,260 --> 00:06:50,520 +0: Vì vậy, bạn nên sử dụng dấu cách hay bạn nên sử dụng tab? + +99 +00:06:50,580 --> 00:06:55,580 +Câu hỏi cũ và mức độ mà mọi người ám ảnh với câu hỏi này, nó thực sự cho thấy + +100 +00:06:56,430 --> 00:07:01,050 +trong cuộc khảo sát dành cho nhà phát triển Stack Overflow năm 2017 này, nơi họ được hỏi + +101 +00:07:01,140 --> 00:07:05,070 +các nhà phát triển, bạn sử dụng dấu cách hay bạn sử dụng tab? + +102 +00:07:05,490 --> 00:07:08,010 +Và sau đó, họ so sánh nó với mức lương hàng + +103 +00:07:08,070 --> 00:07:13,070 +năm của họ và bằng cách nào đó đã chứng minh được rằng những người sử dụng dấu cách dường như kiếm + +104 +00:07:13,320 --> 00:07:15,480 +được nhiều hơn những người sử dụng tab. + +105 +00:07:16,830 --> 00:07:21,830 +Bây giờ, hướng dẫn chính thức từ cộng đồng Python trên thực tế là sử dụng dấu cách. + +106 +00:07:23,010 --> 00:07:25,890 +Vì vậy, nếu bạn nhấp vào phần, tab hoặc dấu cách, + +107 +00:07:26,220 --> 00:07:28,350 +chúng sẽ không cho bạn biết bằng những + +108 +00:07:28,350 --> 00:07:31,650 +từ không chắc chắn, rằng dấu cách là phương pháp thụt lề ưu tiên. + +109 +00:07:32,220 --> 00:07:34,620 +Và trên thực tế, trong Python 3, + +110 +00:07:34,980 --> 00:07:39,980 +bạn không thể trộn một tệp mã sử dụng các tab và dấu cách để + +111 +00:07:41,190 --> 00:07:45,720 +thụt lề trong cùng một tệp. Và nó cũng cho bạn biết rằng để thụt lề + +112 +00:07:45,750 --> 00:07:49,110 +một dòng mã, nó phải được thụt lề bằng cách sử dụng bốn dấu cách, + +113 +00:07:49,350 --> 00:07:53,520 +do đó bốn lần nhấn vào phím cách. Bây giờ, đối với nhiều người, + +114 +00:07:53,520 --> 00:07:57,270 +điều đó có vẻ không hiệu quả vì tôi phải nhấn + +115 +00:07:57,270 --> 00:07:58,103 +phím cách + +116 +00:08:00,060 --> 00:08:03,480 +bốn lần để đạt được một thụt lề duy nhất. + +117 +00:08:03,600 --> 00:08:08,070 +Và bạn đã thấy chúng tôi thụt lề bao nhiêu trong toàn bộ mã của chúng tôi. Vì vậy, nó có vẻ rất, rất + +118 +00:08:08,130 --> 00:08:09,420 +kém hiệu quả. + +119 +00:08:10,110 --> 00:08:13,410 +Nhưng may mắn thay, trong hầu hết các trình chỉnh sửa + +120 +00:08:13,680 --> 00:08:18,680 +mã, chúng thực sự có một cài đặt cho phép bạn thụt lề bằng cách sử dụng + +121 +00:08:19,830 --> 00:08:22,860 +dấu cách, thay đổi kích thước thụt lề thành bốn. + +122 +00:08:23,430 --> 00:08:25,140 +Và khi bạn nhấn + +123 +00:08:25,500 --> 00:08:28,920 +phím tab, nó sẽ tự động chèn bốn khoảng trắng, bạn + +124 +00:08:29,220 --> 00:08:33,030 +có thể biết khi nào bạn đang cố đánh dấu khoảng trắng này, + +125 +00:08:33,030 --> 00:08:36,120 +bạn có thể thấy con trỏ đang nhảy bốn lần. + +126 +00:08:36,990 --> 00:08:41,990 +Điều này có nghĩa là bạn có thể nhấn tab một lần và mã của bạn phù hợp + +127 +00:08:42,840 --> 00:08:45,510 +với hướng dẫn bởi vì các cảnh phía + +128 +00:08:45,510 --> 00:08:48,900 +sau trình soạn thảo mã của bạn là chèn bốn dấu cách. + +129 +00:08:50,430 --> 00:08:54,420 +Vì vậy, tôi hy vọng điều đó sẽ rõ ràng hơn một chút về tab so với khoảng trắng. + +130 +00:08:54,750 --> 00:08:59,400 +Và tôi thực sự khuyên bạn nên truy cập vào các tài nguyên của khóa học + +131 +00:08:59,430 --> 00:09:03,660 +và nhấp vào liên kết để đi tới hướng dẫn kiểu cho mã Python và + +132 +00:09:03,660 --> 00:09:08,190 +xem qua các phần về thụt lề. Bây giờ trong bài học tiếp theo, tôi có một bài kiểm tra nhanh + +133 +00:09:08,370 --> 00:09:12,720 +để bạn kiểm tra kiến thức của mình về cách thụt đầu dòng. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp + +134 +00:09:13,110 --> 00:09:14,340 +lại bạn trong bài học tiếp theo. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 PEP-8-The-Python-Style-Guide.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 PEP-8-The-Python-Style-Guide.url new file mode 100644 index 0000000000000000000000000000000000000000..0e7dd6d77a3bbda847099720c1e35ff17f82f13b --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/004 PEP-8-The-Python-Style-Guide.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.python.org/dev/peps/pep-0008/ \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/005 Code Indentation Quiz.html b/part1/06 - Day 6 - Beginner - Python Functions & Karel/005 Code Indentation Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..9b0db3cf642dca2f017ee0c239e94affaa24d694 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/005 Code Indentation Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 Reeborgs-World-Hurdles-2-Challenge.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 Reeborgs-World-Hurdles-2-Challenge.url new file mode 100644 index 0000000000000000000000000000000000000000..54c152f0bd73d8b1bdbffdbae5264059d30f96b5 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 Reeborgs-World-Hurdles-2-Challenge.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%202&url=worlds%2Ftutorial_en%2Fhurdle2.json \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 While Loops.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 While Loops.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fc2afba307da5ff3fb50405ab0c8ff2212d9a0f5 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 While Loops.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e0ef90fda84ffeb1fef84170691975ed01513e16335d3eb2ab46dfb2e18340b +size 154643430 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 While Loops_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 While Loops_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f7b82ab073e29e0575793eec60dabe95661fe431 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/006 While Loops_vi.srt @@ -0,0 +1,712 @@ +1 +00:00:00,430 --> 00:00:02,080 +Được rồi các bạn, trong bài + +2 +00:00:02,110 --> 00:00:07,110 +học này tôi muốn nói về vòng lặp while, vòng lặp sẽ tiếp tục chạy trong khi một + +3 +00:00:07,810 --> 00:00:09,640 +điều kiện cụ thể là đúng. + +4 +00:00:10,660 --> 00:00:15,100 +Đây là một phiên bản thực sự đơn giản của robot sử dụng vòng lặp while. + +5 +00:00:15,520 --> 00:00:16,810 +Vì vậy, trong trường + +6 +00:00:16,990 --> 00:00:21,580 +hợp này, hướng dẫn sẽ là khi bạn cắm điện vào tường và bạn có điện + +7 +00:00:21,580 --> 00:00:26,050 +di chuyển về phía trước. Vì vậy, đây là những gì xảy ra. + +8 +00:00:26,260 --> 00:00:31,260 +Nó sẽ dừng lại sau khi rút ổ cắm ra khỏi tường và ngừng + +9 +00:00:31,720 --> 00:00:34,990 +nhận điện. Hãy so sánh điều này với vòng lặp + +10 +00:00:34,990 --> 00:00:39,190 +for mà chúng ta đã thấy trước đây. Vì vậy, chúng ta đã thấy hai loại vòng lặp + +11 +00:00:39,190 --> 00:00:43,660 +for: một loại trong đó chúng ta đang lặp qua danh sách các mục để thực hiện điều gì đó với + +12 +00:00:43,690 --> 00:00:45,070 +từng mục trong danh sách và + +13 +00:00:45,490 --> 00:00:50,490 +loại còn lại sử dụng hàm phạm vi trong đó chúng ta tạo một phạm vi giữa một và b và sau đó chúng tôi sử + +14 +00:00:51,160 --> 00:00:55,990 +dụng mọi số trong phạm vi đó để làm điều gì đó. Ví dụ, trong trường hợp + +15 +00:00:55,990 --> 00:01:00,610 +này sẽ là in nó ra. Vòng lặp while trông giống + +16 +00:01:00,640 --> 00:01:03,520 +như thế này. Và trong trường hợp này, + +17 +00:01:03,880 --> 00:01:07,810 +trong khi điều kiện cụ thể này là đúng, thì chúng ta đi vào + +18 +00:01:08,440 --> 00:01:12,400 +bên trong vòng lặp và lặp đi lặp lại một việc gì đó. + +19 +00:01:12,910 --> 00:01:17,290 +Và chỉ khi một cái gì đó trở thành sai thì vòng lặp mới dừng lại. + +20 +00:01:18,610 --> 00:01:22,120 +Vì vậy, hãy xem mã sẽ trông như thế nào trong cuộc sống thực. + +21 +00:01:22,570 --> 00:01:27,250 +Vì vậy, ở đây tôi có thử thách Vượt rào 1 mà bạn đã thực hiện trước đó. + +22 +00:01:27,850 --> 00:01:28,750 +Và để làm điều + +23 +00:01:28,810 --> 00:01:33,810 +này, chúng tôi đã tạo một vòng lặp for để rô-bốt của chúng tôi nhảy qua rào + +24 +00:01:34,450 --> 00:01:36,970 +cản sáu lần để đến đích cuối cùng. + +25 +00:01:37,630 --> 00:01:42,010 +Bây giờ chúng ta cũng có thể làm điều tương tự, nhưng sử dụng vòng lặp while. + +26 +00:01:42,280 --> 00:01:43,540 +Và đây là cách chúng tôi sẽ làm điều đó. + +27 +00:01:43,930 --> 00:01:48,310 +Giả sử chúng ta tạo một biến có tên là number_of_hurdles và chúng + +28 +00:01:48,730 --> 00:01:52,120 +ta đặt giá trị đó bằng sáu vì có sáu rào cản. + +29 +00:01:52,690 --> 00:01:57,690 +Và sau đó chúng tôi sử dụng một vòng lặp while để vượt qua các chướng ngại vật này cho đến khi trở + +30 +00:01:59,140 --> 00:02:03,683 +ngại này giảm xuống bằng không. Vì vậy, chúng ta có thể nói while number_of_hurdles + +31 +00:02:07,100 --> 00:02:14,360 +1: Right, 0: > 0: và sau đó chúng ta yêu cầu nó làm điều gì đó. + +32 +00:02:14,360 --> 00:02:14,360 +Trong + +33 +00:02:14,360 --> 00:02:17,900 +trường hợp này, điều chúng ta cần làm là thực hiện chức năng nhảy. + +34 +00:02:18,860 --> 00:02:23,150 +Và khi kết thúc vòng lặp, ngay trước khi chúng ta quay lại + +35 +00:02:23,270 --> 00:02:26,270 +từ đầu, chúng ta sẽ giảm số chướng ngại vật, + +36 +00:02:26,390 --> 00:02:27,223 +1: Đúng 0: xuống + +37 +00:02:28,700 --> 00:02:31,040 +một. , -= 1. + +38 +00:02:31,730 --> 00:02:36,730 +Vì vậy, bây giờ hãy tiếp tục và xóa phiên bản này bằng vòng lặp for. Và để hình dung rõ hơn những gì + +39 +00:02:37,610 --> 00:02:39,350 +đang xảy ra ở đây, tôi + +40 +00:02:39,350 --> 00:02:44,120 +thực sự cũng sẽ thêm một câu lệnh in để in biến đó. + +41 +00:02:44,700 --> 00:02:45,533 +1: Phải không? + +42 +00:02:47,930 --> 00:02:49,880 +0: Vì vậy, bây giờ chúng ta hãy bước qua điều này. + +43 +00:02:50,300 --> 00:02:55,300 +Và lần đầu tiên chúng ta bước vào vòng lặp while, number_of_hurdles bằng + +44 +00:02:55,430 --> 00:02:56,900 +sáu, sáu lớn hơn 0. + +45 +00:02:57,200 --> 00:03:01,900 +Sau đó, bạn hãy bắt đầu nhảy vào vòng lặp và thực + +46 +00:03:01,900 --> 00:03:06,730 +thi ba dòng mã này. Vì vậy, bây giờ chúng ta đi vào và nó thực hiện chức năng nhảy. + +47 +00:03:09,430 --> 00:03:13,090 +Và sau khi hoàn thành, nó sẽ quay lại, chuyển sang dòng tiếp + +48 +00:03:13,450 --> 00:03:17,620 +theo, number_of_hurdles trừ đi một, vì vậy sáu sẽ trở thành năm. + +49 +00:03:17,860 --> 00:03:22,750 +Vì vậy, bây giờ khi nó thực hiện chức năng in này, chúng ta sẽ thấy năm bản được in. + +50 +00:03:23,530 --> 00:03:28,270 +Vì vậy, hãy di chuyển cửa sổ bật lên nhỏ này sang một bên và tiếp tục. + +51 +00:03:28,270 --> 00:03:31,900 +Vì vậy, bây giờ nó quay trở lại điểm bắt đầu của vòng lặp while và + +52 +00:03:31,900 --> 00:03:36,900 +nó đang kiểm tra điều kiện này một lần nữa: số chướng ngại vật, năm, có lớn hơn 0 không. + +53 +00:03:37,330 --> 00:03:38,770 +Chà, vì vậy nếu nó đúng, + +54 +00:03:38,860 --> 00:03:43,860 +thì nó sẽ quay lại vòng lặp while và thực hiện tất cả các dòng mã đó. + +55 +00:03:45,250 --> 00:03:49,000 +Vì vậy, bây giờ nó là âm một và bây giờ nó sẽ là bốn. + +56 +00:03:49,720 --> 00:03:54,720 +Và nó tiếp tục cho đến khi điều kiện number_of_hurdles + +57 +00:03:56,140 --> 00:03:59,020 +lớn hơn 0 trở thành sai. + +58 +00:04:00,280 --> 00:04:05,280 +Vì vậy, bây giờ đây là thời điểm mà chúng ta sẽ trừ một con nữa từ số chướng ngại + +59 +00:04:05,980 --> 00:04:08,650 +vật của chúng ta, hiện tại là một. + +60 +00:04:08,980 --> 00:04:12,760 +Vì vậy, điều đó sẽ đưa nó xuống không. Và một khi đã xong, điều + +61 +00:04:13,120 --> 00:04:17,709 +kiện này không còn đúng nữa. Số không không lớn hơn số không. + +62 +00:04:18,040 --> 00:04:20,529 +Số không bằng số không, nhưng nó không lớn hơn. + +63 +00:04:20,980 --> 00:04:25,980 +Vì vậy, bây giờ điều này là sai và chúng tôi thoát khỏi vòng lặp while và chúng tôi kết thúc chương trình của mình. + +64 +00:04:27,700 --> 00:04:31,000 +Đây là cú pháp của vòng lặp while. Đầu tiên, chúng tôi có từ khóa + +65 +00:04:31,030 --> 00:04:34,960 +while và sau đó chúng tôi có một số loại điều kiện mà chúng tôi sẽ + +66 +00:04:34,960 --> 00:04:35,860 +kiểm tra. + +67 +00:04:36,130 --> 00:04:40,660 +Vì vậy, trước đây bạn đã thấy đó là số rào cản lớn hơn 0 và bất cứ khi nào điều kiện + +68 +00:04:41,110 --> 00:04:43,240 +đó đúng, thì nó sẽ nhìn vào bên trong + +69 +00:04:43,540 --> 00:04:48,070 +vòng lặp while tại các dòng mã được thụt vào để thực hiện các hướng dẫn đó, để + +70 +00:04:48,070 --> 00:04:52,420 +thực hiện điều này, sau đó thực hiện điều này, sau đó làm điều này. + +71 +00:04:52,720 --> 00:04:55,120 +Và cuối cùng, khi kết thúc vòng lặp while, + +72 +00:04:55,150 --> 00:04:59,080 +nó sẽ quay lại từ đầu và kiểm tra điều kiện này một lần nữa. + +73 +00:04:59,230 --> 00:05:00,370 +Và nếu nó vẫn đúng, + +74 +00:05:00,640 --> 00:05:05,230 +thì nó sẽ tiếp tục lặp lại và lặp lại và lặp lại cho đến khi điều kiện này trở thành + +75 +00:05:05,230 --> 00:05:09,310 +sai tại thời điểm đó nó kết thúc và thoát khỏi vòng lặp while. + +76 +00:05:10,120 --> 00:05:13,390 +Vì vậy, bây giờ quay trở lại Thế giới Reeborg của chúng ta, + +77 +00:05:13,450 --> 00:05:17,260 +tôi muốn bạn nhấp vào danh sách thả xuống này và đi đến rào cản số 2. + +78 +00:05:17,950 --> 00:05:19,930 +Bây giờ điều này là một chút khác nhau. + +79 +00:05:20,080 --> 00:05:22,630 +Và nếu bạn muốn xem lời giải thích cho bài tập + +80 +00:05:22,960 --> 00:05:27,550 +này, thì chỉ cần nhấp vào 'Thông tin thế giới' này và bạn sẽ thấy lời giải thích. + +81 +00:05:28,210 --> 00:05:32,380 +Vì vậy, về cơ bản cuộc đua vượt chướng ngại vật này hơi khác một chút so với cuộc đua lần trước. + +82 +00:05:33,010 --> 00:05:34,000 +Trong khi điều cuối + +83 +00:05:34,000 --> 00:05:38,890 +cùng chúng tôi biết rằng chúng tôi phải luôn hoàn thành sáu chướng ngại vật để đến được cột gôn. + +84 +00:05:39,190 --> 00:05:43,570 +Trong trường hợp này, chúng tôi không còn biết lá cờ sẽ ở đâu. + +85 +00:05:43,570 --> 00:05:47,080 +Vì vậy, nó có thể ở đây, nó có thể ở đây, nó có thể ở đây, vân vân. + +86 +00:05:47,290 --> 00:05:50,890 +Và nó sẽ được đặt ngẫu nhiên ở một trong những vị trí này. + +87 +00:05:51,460 --> 00:05:55,780 +Nhưng những gì chúng tôi nhận được bây giờ là một số loại điều kiện được gọi là at_goal. + +88 +00:05:56,470 --> 00:06:01,470 +Và nếu at_goal này là đúng thì có nghĩa là robot của chúng ta đã hạ cánh trên một lá cờ. + +89 +00:06:03,320 --> 00:06:05,540 +Nhưng nếu at_goal này không + +90 +00:06:06,020 --> 00:06:09,320 +đúng thì có nghĩa là chưa tới cờ. + +91 +00:06:09,860 --> 00:06:14,860 +Vì vậy, chúng ta có thể sử dụng kiến thức của mình về các vòng lặp while cũng như điều kiện này để + +92 +00:06:15,110 --> 00:06:20,110 +sử dụng mã mà chúng ta đã có từ trước để giúp rô-bốt của mình hoàn thành cuộc đua vượt rào này. + +93 +00:06:21,260 --> 00:06:24,830 +Vì vậy, bạn vẫn nên có mã từ thử thách trước và tất + +94 +00:06:25,220 --> 00:06:30,220 +cả những gì bạn phải làm là suy nghĩ về cách tạo vòng lặp while để + +95 +00:06:31,190 --> 00:06:36,190 +khi bạn chạy chương trình này và cờ được đặt ngẫu nhiên... + +96 +00:06:36,890 --> 00:06:41,030 +Vì vậy, lần này nó được đặt ở đây, nhưng lần sau khi tôi chạy nó, bạn + +97 +00:06:41,120 --> 00:06:45,380 +có thể thấy nó hiện được đặt ở đây. Không quan trọng lá cờ ở đâu, robot + +98 +00:06:45,500 --> 00:06:49,700 +của bạn sẽ có thể phát hiện xem nó có ở cờ không, nếu nó ở mục tiêu + +99 +00:06:50,000 --> 00:06:53,030 +và nếu không thì nó sẽ tiếp tục nhảy. + +100 +00:06:53,720 --> 00:06:58,280 +Hãy nhanh chóng tạm dừng video và xem liệu bạn có thể hoàn thành thử thách này hay không, sau đó quay + +101 +00:06:58,280 --> 00:07:00,440 +lại và chúng ta sẽ cùng nhau tìm ra giải pháp. + +102 +00:07:03,250 --> 00:07:03,980 +2: Phải không? + +103 +00:07:03,980 --> 00:07:04,300 +0: Được rồi. + +104 +00:07:04,300 --> 00:07:08,650 +Vì vậy, trước tiên, chúng tôi biết rằng chúng tôi sẽ cần sử dụng vòng + +105 +00:07:08,650 --> 00:07:13,650 +lặp while và điều kiện mà chúng tôi sẽ kiểm tra là điều kiện này, at_goal. + +106 +00:07:14,230 --> 00:07:17,800 +Điều kiện này có thể đúng hoặc có thể sai. + +107 +00:07:18,490 --> 00:07:23,490 +Và về cơ bản, chúng tôi muốn xem trong khi at_goal không bằng true, vì vậy trong + +108 +00:07:27,940 --> 00:07:30,790 +khi robot của chúng tôi không ở mục tiêu, thì + +109 +00:07:31,150 --> 00:07:33,970 +chúng tôi muốn thực hiện chức năng nhảy. + +110 +00:07:34,630 --> 00:07:39,630 +Vì vậy, chúng tôi sẽ nhảy bao nhiêu lần tùy thích cho đến khi at_goal này trở + +111 +00:07:40,810 --> 00:07:41,830 +thành sự thật. + +112 +00:07:42,850 --> 00:07:47,850 +Một cách khác để diễn đạt điều này at_goal là không đúng là nói while not at_goal. + +113 +00:07:52,690 --> 00:07:56,980 +Vì vậy, đây là ý nghĩa của sự phủ định của điều kiện này. + +114 +00:07:58,030 --> 00:08:01,900 +Cả hai cách kiểm tra này sẽ hoạt động. Và bây giờ nếu tôi nhấn chạy, bạn + +115 +00:08:01,930 --> 00:08:05,500 +có thể thấy rằng mặc dù chúng ta chỉ cần thực hiện một vượt + +116 +00:08:05,800 --> 00:08:10,800 +rào, nhưng ngay khi robot của chúng ta đến đây và nó kiểm tra xem at_goal có đúng không + +117 +00:08:12,340 --> 00:08:14,560 +thì nó sẽ dừng vòng lặp này. + +118 +00:08:15,610 --> 00:08:19,660 +Nhưng nếu vòng lặp của chúng ta tiếp tục lâu hơn nữa, chẳng hạn + +119 +00:08:20,170 --> 00:08:24,040 +như mục tiêu đã kết thúc ở đây, thì một khi nó đến đây và at_goal + +120 +00:08:24,580 --> 00:08:29,230 +vẫn sai, thì nó sẽ tiếp tục nhảy cho đến khi at_goal trở thành đúng. + +121 +00:08:30,250 --> 00:08:32,919 +Vì vậy, điều đó đòi hỏi một chút jujitsu + +122 +00:08:32,919 --> 00:08:36,669 +tinh thần, tôi nghĩ bởi vì toàn bộ điều kiện này phải + +123 +00:08:37,210 --> 00:08:42,210 +đúng, nhưng mục tiêu này thực sự sẽ sai cho đến thời điểm chúng tôi đạt + +124 +00:08:42,730 --> 00:08:45,580 +được mục tiêu. Vì vậy, bằng cách thêm điều này không phải, + +125 +00:08:45,610 --> 00:08:49,390 +chúng tôi lật at_goal này một cách hiệu quả. Vì vậy, nếu nó là đúng, trở thành + +126 +00:08:49,390 --> 00:08:54,390 +sai hoặc nếu nó sai trở thành đúng để tiếp tục nhảy trong khi chúng tôi không + +127 +00:08:54,910 --> 00:08:56,100 +ở mục tiêu. + +128 +00:08:56,610 --> 00:09:01,610 +Tôi thích kiểu cú pháp cụ thể này hơn vì nó đọc giống tiếng Anh hơn: trong khi không + +129 +00:09:01,830 --> 00:09:04,770 +đạt được mục tiêu thì hãy thực hiện bước nhảy. + +130 +00:09:05,220 --> 00:09:09,420 +Và nếu nó là at_goal thì nó sẽ dừng lại. + +131 +00:09:10,680 --> 00:09:13,560 +Và một trong những điều bạn có thể thắc mắc lúc này + +132 +00:09:13,650 --> 00:09:17,310 +là, tôi đã học về vòng lặp for và tôi đã học về vòng lặp while. + +133 +00:09:17,880 --> 00:09:22,050 +Và nếu tôi có thể sử dụng cả hai, tại sao tôi lại chọn cái này hơn cái kia? + +134 +00:09:22,110 --> 00:09:26,640 +Khi nào tôi sẽ sử dụng vòng lặp for? Và khi nào tôi sẽ sử dụng vòng lặp while? Chà, điều tôi muốn + +135 +00:09:26,700 --> 00:09:30,480 +nói là vòng lặp for thực sự tuyệt vời khi bạn + +136 +00:09:30,480 --> 00:09:35,480 +muốn lặp lại một thứ gì đó và bạn cần phải làm gì đó với từng + +137 +00:09:35,580 --> 00:09:40,320 +thứ mà bạn đang lặp lại. Vì vậy, ví dụ: nếu bạn đang lặp qua + +138 +00:09:40,320 --> 00:09:45,320 +một danh sách và bạn đang nói về từng loại trái cây trong danh sách trái + +139 +00:09:45,780 --> 00:09:50,670 +cây của chúng tôi và bạn muốn có thể nói, tôi không biết, hãy làm gì đó + +140 +00:09:50,730 --> 00:09:55,110 +với từng mục này ở đây. Chẳng hạn, nó có thể đơn + +141 +00:09:55,320 --> 00:09:59,010 +giản như việc in nó. Chà, điều này sẽ yêu + +142 +00:09:59,010 --> 00:10:01,320 +cầu một vòng lặp for. + +143 +00:10:01,470 --> 00:10:05,130 +Bạn không thể làm điều này rất dễ dàng bằng cách sử dụng vòng lặp while. Bây giờ, tương tự như vậy, + +144 +00:10:05,130 --> 00:10:08,520 +chúng ta đã sử dụng hàm phạm vi, phải không? + +145 +00:10:08,520 --> 00:10:13,520 +Vì vậy, đối với phạm vi từ một đến sáu, hãy in từng số trong phạm vi. + +146 +00:10:15,420 --> 00:10:18,330 +Chà, điều này cũng dễ thực hiện với vòng lặp for. + +147 +00:10:19,050 --> 00:10:23,850 +Bây giờ bạn muốn sử dụng vòng lặp while khi bạn không thực sự quan tâm bạn đang + +148 +00:10:23,850 --> 00:10:24,450 +ở số nào trong + +149 +00:10:24,450 --> 00:10:29,450 +chuỗi, bạn đang lặp qua mục nào trong danh sách và bạn chỉ đơn giản muốn thực + +150 +00:10:30,270 --> 00:10:32,760 +hiện một số loại chức năng, nhiều lần cho + +151 +00:10:32,760 --> 00:10:36,690 +đến khi một số loại điều kiện mà bạn thiết lập. + +152 +00:10:37,740 --> 00:10:42,240 +Và đây cũng là một điểm hay để đề cập rằng các vòng lặp while nguy hiểm hơn một + +153 +00:10:42,240 --> 00:10:46,710 +chút so với các vòng lặp for bởi vì trong các vòng lặp for, bạn đang đặt trước + +154 +00:10:46,740 --> 00:10:48,750 +số lần một thứ gì đó sẽ chạy. + +155 +00:10:49,110 --> 00:10:52,650 +Nó sẽ dừng khi đến cuối danh sách các mục trong trường hợp + +156 +00:10:52,950 --> 00:10:57,120 +này và nó sẽ dừng khi đạt đến giới hạn trên của phạm vi trong trường + +157 +00:10:57,120 --> 00:10:58,950 +hợp này. Nhưng đối với vòng + +158 +00:10:58,980 --> 00:11:03,980 +lặp while, chúng sẽ tiếp tục chạy cho đến khi điều kiện cụ thể này chuyển thành sai. + +159 +00:11:05,670 --> 00:11:10,230 +Vì vậy, nếu bạn có một số loại điều kiện thực sự không bao giờ sai, thì vòng lặp while của bạn + +160 +00:11:10,230 --> 00:11:15,230 +sẽ trở thành một thứ được gọi là vòng lặp vô hạn. Bởi vì giả sử rằng vòng lặp while + +161 +00:11:15,840 --> 00:11:20,490 +của chúng ta đã kiểm tra while five lớn hơn ba, sau đó thực hiện + +162 +00:11:20,850 --> 00:11:23,730 +ba dòng mã này. Chà, năm sẽ + +163 +00:11:23,760 --> 00:11:28,760 +luôn lớn hơn ba cho đến hết thời gian. + +164 +00:11:29,580 --> 00:11:34,470 +Và điều đó có nghĩa là mã của bạn cũng sẽ chạy cho đến hết thời gian, đây có thể không phải là điều + +165 +00:11:34,710 --> 00:11:39,330 +bạn muốn trong hầu hết các trường hợp. Nếu thay vì nói, trong khi không + +166 +00:11:39,330 --> 00:11:43,320 +đạt được mục tiêu, tôi nói, trong khi năm lớn hơn ba, thì + +167 +00:11:43,680 --> 00:11:48,360 +bạn sẽ thấy người máy này thực hiện cú nhảy này cho đến vĩnh viễn. + +168 +00:11:48,450 --> 00:11:53,450 +Và về cơ bản, nó sẽ chỉ dừng lại khi nó gặp sự cố và hết thời gian chờ. + +169 +00:11:55,090 --> 00:12:00,090 +Giờ đây, mọi chương trình đơn lẻ tại một thời điểm nào đó trong cuộc đời của chúng sẽ tạo ra một + +170 +00:12:00,460 --> 00:12:03,790 +vòng lặp vô hạn. Đừng lo lắng về nó. Chỉ cần thoát khỏi chương + +171 +00:12:03,850 --> 00:12:08,050 +trình, khởi động lại và cố gắng ngăn điều này xảy ra trong tương lai. + +172 +00:12:10,240 --> 00:12:15,240 +Và tôi thường thấy rằng nó thực sự hữu ích khi bạn không biết tại sao bạn nhận được + +173 +00:12:15,250 --> 00:12:19,210 +một vòng lặp vô hạn chỉ đơn giản là in ra điều kiện của bạn. + +174 +00:12:19,750 --> 00:12:23,350 +Vì vậy, trong trường hợp này, nếu tôi in ra năm lớn + +175 +00:12:23,590 --> 00:12:26,170 +hơn ba, thì nó sẽ luôn luôn in đúng. + +176 +00:12:27,820 --> 00:12:32,680 +Và nó sẽ không bao giờ trở thành sai về cơ bản. Trong bài học tiếp theo, tôi sẽ có + +177 +00:12:32,740 --> 00:12:36,880 +thêm các bài tập dành cho bạn, cụ thể là rào cản 3 và 4. + +178 +00:12:37,240 --> 00:12:41,320 +Vì vậy, hãy đến đó và áp dụng những gì bạn đã học được về vòng lặp while vào thực tế. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Hurdles Challenge using While Loops.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Hurdles Challenge using While Loops.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b803adbe2d29c2e518f7a9c418170879df86cee5 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Hurdles Challenge using While Loops.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a8f53238e30f4d594a58334bbc274c46e4652b1a688a196ab4106b4e447e793 +size 94226459 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Hurdles Challenge using While Loops_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Hurdles Challenge using While Loops_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c9b03286bcf56c4e7e7539955f2c058922bc142d --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Hurdles Challenge using While Loops_vi.srt @@ -0,0 +1,424 @@ +1 +00:00:00,760 --> 00:00:04,210 +Được rồi, đã đến lúc cho một thử thách mã hóa khác. + +2 +00:00:04,240 --> 00:00:08,320 +Và thử thách viết mã này sẽ đưa vào sử dụng những gì bạn đã học về + +3 +00:00:08,320 --> 00:00:09,153 +các vòng lặp + +4 +00:00:09,490 --> 00:00:13,540 +while, đồng thời kiểm tra một số kiến thức trước đây bạn có về các hàm. + +5 +00:00:13,990 --> 00:00:18,190 +Vì vậy, tôi muốn bạn quay trở lại Thế giới của Reeborg và chuyển sang chướng ngại vật số 3. + +6 +00:00:18,790 --> 00:00:23,380 +Và hãy xem tiền đề cho cuộc đua cụ thể này. + +7 +00:00:24,680 --> 00:00:25,513 +1: Đúng không? + +8 +00:00:25,670 --> 00:00:30,670 +0: Về cơ bản những gì đã xảy ra lần này là vị trí tường + +9 +00:00:31,100 --> 00:00:35,240 +đã trở nên ngẫu nhiên. Vì vậy, giả sử chúng ta khởi động lại trò chơi này, bạn có thể thấy rằng trong trường + +10 +00:00:35,240 --> 00:00:38,960 +hợp này, có một bức tường ở đây, một ở đây, một ở đây, một ở đây. Tổng cộng có bốn cái. + +11 +00:00:39,410 --> 00:00:41,660 +Nhưng nếu chúng tôi thử một phiên bản + +12 +00:00:41,690 --> 00:00:45,590 +khác, thì bạn có thể thấy rằng mỗi lần có vị trí tường khác nhau. + +13 +00:00:46,820 --> 00:00:49,310 +Chúng ta không chỉ không biết bức tường sẽ ở + +14 +00:00:49,340 --> 00:00:52,250 +đâu, chúng ta cũng không biết sẽ có bao nhiêu bức tường. + +15 +00:00:52,370 --> 00:00:55,730 +Vì vậy, mã như những gì chúng ta đã làm trước khi sử + +16 +00:00:55,970 --> 00:00:59,870 +dụng vòng lặp for yêu cầu robot của chúng ta nhảy sáu lần sẽ không hoạt động. + +17 +00:01:01,310 --> 00:01:04,400 +Và thay vào đó, chúng ta sẽ phải sử dụng các điều kiện + +18 +00:01:04,459 --> 00:01:09,350 +xem liệu phía trước có rõ ràng hay không hoặc liệu có bức tường phía trước hay không hoặc liệu chúng + +19 +00:01:09,350 --> 00:01:12,740 +ta có đang ở mục tiêu hay không và cũng là sự phủ nhận + +20 +00:01:12,770 --> 00:01:15,980 +của chúng, vì vậy không phải phía trước là rõ ràng, không phải + +21 +00:01:16,070 --> 00:01:20,960 +bức tường phía trước , không có mục tiêu. Xem liệu bạn có thể sử dụng những gì bạn đã + +22 +00:01:21,080 --> 00:01:25,670 +học về vòng lặp while cũng như kiến thức trước đây của bạn về câu lệnh if và hàm để + +23 +00:01:25,730 --> 00:01:29,450 +hoàn thành thử thách này hay không. Khi bạn đã viết đúng mã, + +24 +00:01:29,690 --> 00:01:34,670 +cho dù họ có gặp phải tình huống bức tường hay rào cản nào đi chăng nữa, + +25 +00:01:34,910 --> 00:01:37,760 +thì nó vẫn luôn có thể đạt được mục tiêu. + +26 +00:01:38,810 --> 00:01:42,530 +Và trong khi tôi đang xem xét thử thách này, tôi biết có + +27 +00:01:42,560 --> 00:01:45,380 +một cách rất, rất đơn giản để vượt qua thử + +28 +00:01:45,410 --> 00:01:49,490 +thách này, đơn giản là đưa robot đi lên đây và xuống tận đây, vượt + +29 +00:01:49,880 --> 00:01:52,040 +qua tất cả các chướng ngại vật. + +30 +00:01:52,130 --> 00:01:56,450 +Nhưng đó không phải là điểm của thử thách. Để hoàn thành thử thách này, bạn + +31 +00:01:56,510 --> 00:02:00,650 +phải yêu cầu robot của mình đi theo con đường được vạch ra trong các đường + +32 +00:02:00,950 --> 00:02:04,460 +chấm thay vì bỏ qua nó và làm điều gì đó hoàn toàn + +33 +00:02:04,460 --> 00:02:09,410 +khác chỉ để đạt được mục tiêu cuối cùng. Hãy tạm dừng video, suy nghĩ về điều này, đọc cửa sổ + +34 +00:02:09,620 --> 00:02:12,440 +bật lên thông tin thế giới tại đây và sau đó suy nghĩ về + +35 +00:02:12,830 --> 00:02:16,700 +cách bạn có thể giải quyết thử thách này. Vì vậy, hãy thử ngay bây giờ. + +36 +00:02:17,170 --> 00:02:18,003 +1: Đúng không? + +37 +00:02:21,740 --> 00:02:26,300 +0: Được rồi. Vì vậy, về cơ bản, nếu chúng ta + +38 +00:02:26,600 --> 00:02:30,470 +không biết vị trí của các bức tường, thì chúng ta phải kiểm tra xem có + +39 +00:02:30,830 --> 00:02:33,680 +bức tường phía trước, hoặc nếu không có bức tường phía trước. + +40 +00:02:34,610 --> 00:02:37,970 +Và nếu có một bức tường phía trước, thì chúng ta sẽ nhảy. + +41 +00:02:38,120 --> 00:02:41,570 +Nhưng nếu không có bức tường phía trước, thì chúng ta sẽ tiến về phía trước. + +42 +00:02:42,170 --> 00:02:47,170 +Và chúng tôi sẽ làm điều này và kiểm tra điều này miễn là chúng tôi không đạt được mục tiêu. + +43 +00:02:47,780 --> 00:02:49,460 +Vì vậy, chúng ta sẽ cần một vòng lặp while rất giống + +44 +00:02:49,460 --> 00:02:54,350 +với vòng lặp while trước đây của chúng tôi mà tôi đã cho bạn thấy trong bản demo. Mặc dù chúng ta không + +45 +00:02:54,350 --> 00:02:58,820 +đạt được mục tiêu hay đúng hơn là trong khi + +46 +00:02:58,900 --> 00:03:02,890 +điều kiện cụ thể này không đúng, thì chúng + +47 +00:03:03,580 --> 00:03:08,110 +ta sẽ lặp lại và lặp lại một số dòng mã. + +48 +00:03:08,800 --> 00:03:13,090 +Điều đầu tiên chúng ta sẽ làm là sử dụng câu lệnh if để kiểm + +49 +00:03:13,150 --> 00:03:16,240 +tra xem liệu có bức tường phía trước hay không. + +50 +00:03:17,260 --> 00:03:20,890 +Vì vậy, tôi sẽ nói, nếu bức tường phía trước, nếu + +51 +00:03:21,880 --> 00:03:23,530 +điều này là đúng, + +52 +00:03:23,980 --> 00:03:28,980 +thì tôi sẽ thực hiện chức năng nhảy và làm cho nó nhảy qua bức tường. + +53 +00:03:30,430 --> 00:03:34,570 +Nhưng nếu không có bức tường phía trước, cụ thể là một bức tường khác, thì, trong + +54 +00:03:35,230 --> 00:03:38,860 +trường hợp này, chúng ta chỉ đơn giản là sẽ tiến lên phía trước. + +55 +00:03:39,370 --> 00:03:44,370 +Và bởi vì hàm nhảy của chúng ta luôn giúp chúng ta đối mặt với đúng + +56 +00:03:44,590 --> 00:03:47,200 +hướng, hướng này ở đây là hướng tới + +57 +00:03:47,620 --> 00:03:52,620 +mục tiêu, nên bước tiến của một hàm này sẽ luôn đưa chúng ta đi theo + +58 +00:03:53,050 --> 00:03:53,883 +hướng này. + +59 +00:03:54,130 --> 00:03:58,390 +Vì vậy, chúng ta hãy xem mã này và chúng ta hãy làm từng bước một. + +60 +00:03:59,170 --> 00:04:03,460 +Vì vậy, điều đầu tiên chúng ta sẽ kiểm tra là chúng ta có đạt được mục tiêu hay không. At_goal sẽ là + +61 +00:04:03,460 --> 00:04:07,180 +false. Vì vậy, không phải sai là sẽ đúng. + +62 +00:04:07,510 --> 00:04:09,340 +Vì vậy, trong khi điều kiện này là + +63 +00:04:09,340 --> 00:04:11,800 +đúng, chúng tôi sẽ thực hiện tất cả các dòng mã bên trong. + +64 +00:04:12,310 --> 00:04:16,480 +Vì vậy, điều đó có nghĩa là chúng ta nên nhảy vào câu lệnh if này và kiểm tra + +65 +00:04:16,750 --> 00:04:19,899 +xem có bức tường phía trước không? Vì vậy, tại thời điểm + +66 +00:04:19,930 --> 00:04:23,440 +này, điều này sẽ là sai vì không có gì ở phía trước. + +67 +00:04:23,980 --> 00:04:28,980 +Vì vậy, nó sẽ bỏ qua câu lệnh if và nó sẽ chuyển sang câu lệnh else. + +68 +00:04:29,650 --> 00:04:34,600 +Trong trường hợp đó, nó sẽ tiến lên một bước. Vậy là kết thúc một vòng lặp và chúng ta quay lại + +69 +00:04:34,720 --> 00:04:38,920 +từ đầu: chúng ta đã đạt được mục tiêu chưa? Không, chúng tôi không. + +70 +00:04:39,190 --> 00:04:41,770 +Nhưng bây giờ khi chúng ta chạy vào câu lệnh if, kiểm tra + +71 +00:04:42,070 --> 00:04:44,380 +này bây giờ sẽ trở thành sự thật, bởi vì có + +72 +00:04:44,500 --> 00:04:48,910 +một bức tường ngay trước mặt robot của chúng ta. Vì vậy, trong trường hợp + +73 +00:04:48,910 --> 00:04:53,770 +này, nó sẽ đi vào câu lệnh if và thực hiện hàm nhảy. + +74 +00:04:55,270 --> 00:04:59,560 +Bây giờ, chức năng nhảy của chúng tôi mà chúng tôi đã xác định trước đây thực sự + +75 +00:04:59,560 --> 00:05:01,900 +giúp chúng tôi tiến lên trước một bước, trước khi + +76 +00:05:02,170 --> 00:05:06,700 +chúng tôi thực sự vượt qua bức tường này. Vì vậy, trong trường hợp này, nếu chúng ta + +77 +00:05:06,700 --> 00:05:08,380 +cố gắng làm điều tương tự, + +78 +00:05:08,410 --> 00:05:11,320 +thì nó thực sự sẽ đập robot của chúng ta vào tường. + +79 +00:05:11,770 --> 00:05:16,770 +Chúng tôi phải sửa đổi chức năng nhảy của mình bằng cách loại bỏ chức năng di chuyển đầu tiên này. + +80 +00:05:19,090 --> 00:05:23,410 +Vì vậy, thay vào đó chúng ta chỉ cần rẽ trái, đi lên, rẽ phải, + +81 +00:05:23,470 --> 00:05:28,240 +đi phải, rẽ phải, đi xuống và sau đó rẽ trái để đối mặt với hướng bên phải. + +82 +00:05:28,540 --> 00:05:32,710 +Đây là một trở ngại thuần túy nếu không có bước bổ sung đó ngay từ đầu. + +83 +00:05:33,370 --> 00:05:37,300 +Và thay vào đó, chúng ta sẽ chỉ di chuyển nếu không có bức tường phía trước. + +84 +00:05:38,020 --> 00:05:39,250 +Vì vậy, chúng tôi đã thay đổi mã. + +85 +00:05:39,280 --> 00:05:43,030 +Hãy sao lưu nó và thử lại với một thiết lập khác. + +86 +00:05:44,230 --> 00:05:47,710 +Và trong trường hợp này, bạn có thể thấy mã của tôi đang trải qua các bước khác nhau, nó đang kiểm + +87 +00:05:47,920 --> 00:05:50,860 +tra xem có bức tường phía trước hay không. Nếu có, thì nó sẽ + +88 +00:05:50,920 --> 00:05:53,350 +nhảy qua nó. Nếu không, nó + +89 +00:05:53,350 --> 00:05:57,830 +sẽ tiến lên trước một bước và sau đó sẽ đánh giá lại. + +90 +00:05:58,160 --> 00:06:00,380 +Vì vậy, theo cách này, khi nó đến + +91 +00:06:00,470 --> 00:06:04,460 +đây, nó thực sự sẽ đánh giá lại vòng lặp while khá nhiều lần và mỗi + +92 +00:06:04,760 --> 00:06:07,520 +lần nó sẽ là một câu lệnh khác được kích hoạt. + +93 +00:06:07,520 --> 00:06:11,450 +Nó sẽ di chuyển, di chuyển, di chuyển, di chuyển, di chuyển cho đến khi nó chạm vào + +94 +00:06:11,600 --> 00:06:15,320 +tường một lần nữa và sau đó nó sẽ nhảy qua và đưa chúng ta về đích. + +95 +00:06:15,980 --> 00:06:20,090 +Bạn đã quản lý để làm cho điều này chính xác? Bạn đã quản lý để có được giải pháp đúng? + +96 +00:06:20,510 --> 00:06:25,070 +Nếu bạn không chắc chắn đã xem lại các bài học trước về vòng lặp while để làm quen + +97 +00:06:25,070 --> 00:06:26,600 +với nó và nếu bạn + +98 +00:06:27,050 --> 00:06:30,350 +gặp khó khăn trong việc thay đổi hàm nhảy, thì hãy nhớ rằng + +99 +00:06:30,680 --> 00:06:33,620 +bất cứ khi nào bạn gặp khó khăn, điều quan trọng là + +100 +00:06:33,680 --> 00:06:37,700 +phải kiểm tra các giả định của bạn. Và trong trường hợp này, bạn có thể + +101 +00:06:37,970 --> 00:06:42,350 +đã nhấn nút bước qua nhiều lần để xem dòng mã nào đang được kích hoạt + +102 +00:06:42,350 --> 00:06:43,970 +tại thời điểm đó và + +103 +00:06:44,330 --> 00:06:47,840 +đó là thời điểm mã của chúng ta thực sự bị lỗi để + +104 +00:06:47,870 --> 00:06:50,090 +bạn có thể tìm ra và sửa nó. + +105 +00:06:51,290 --> 00:06:54,590 +Bây giờ trong bài học tiếp theo, tôi có một thử thách mã khác dành cho bạn. + +106 +00:06:54,650 --> 00:06:56,780 +Vì vậy, đi đến đó và thử một chút. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Reeborgs-World-Hurdles-3-Challenge.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Reeborgs-World-Hurdles-3-Challenge.url new file mode 100644 index 0000000000000000000000000000000000000000..3a2b3de0064eb9868e0aef5f7e640a96ff520b25 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/007 Reeborgs-World-Hurdles-3-Challenge.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%203&url=worlds%2Ftutorial_en%2Fhurdle3.json \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Jumping over Hurdles with Variable Heights.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Jumping over Hurdles with Variable Heights.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9810c3d1b9d9c50b6b4a128e667dec656096cf4d --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Jumping over Hurdles with Variable Heights.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e29516fd91bc7468c5f48e84779b19446d81690c17a1c5449d0623571317d35 +size 39634177 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Jumping over Hurdles with Variable Heights_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Jumping over Hurdles with Variable Heights_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..16bfbf8717e3443afe0f6502aabe150d441a468f --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Jumping over Hurdles with Variable Heights_vi.srt @@ -0,0 +1,500 @@ +1 +00:00:00,070 --> 00:00:03,220 +Được rồi, các bạn, đã đến lúc vượt qua rào cản cuối cùng trước + +2 +00:00:03,250 --> 00:00:07,060 +khi chúng ta đến mục tiêu của mình. Trong bài học này, tôi muốn + +3 +00:00:07,090 --> 00:00:11,200 +bạn chuyển sang thử thách vượt rào cuối cùng, đó là rào cản 4. + +4 +00:00:11,770 --> 00:00:15,250 +Và trong phiên bản vượt rào cụ thể này, + +5 +00:00:15,730 --> 00:00:20,730 +bức tường mà robot phải nhảy qua hiện có chiều cao thay đổi. + +6 +00:00:21,280 --> 00:00:24,550 +Vì vậy, chiều cao của mỗi chướng ngại vật này là hoàn toàn + +7 +00:00:24,610 --> 00:00:27,190 +ngẫu nhiên, vị trí của các chướng ngại vật + +8 +00:00:27,550 --> 00:00:31,240 +là ngẫu nhiên và số lượng các chướng ngại vật cũng sẽ ngẫu nhiên. + +9 +00:00:31,600 --> 00:00:35,050 +Bạn có thể thấy rằng mỗi lần điều này tái + +10 +00:00:35,770 --> 00:00:40,270 +tạo, nó lại tạo ra một bộ hồ sơ rào cản hoàn toàn khác. + +11 +00:00:40,780 --> 00:00:45,780 +Và bây giờ chúng ta không thể chỉ nhảy vì chúng ta không biết độ cao sẽ là bao + +12 +00:00:47,590 --> 00:00:48,423 +nhiêu mỗi lần. + +13 +00:00:48,520 --> 00:00:53,520 +Vì vậy, chúng ta phải sử dụng những gì chúng ta đã học về vòng lặp while để sửa đổi chức năng nhảy + +14 +00:00:54,190 --> 00:00:59,190 +này và xem liệu chúng ta có thể thực hiện bước nhảy để nhảy cao đến mức cần thiết hay không tùy + +15 +00:01:00,520 --> 00:01:04,930 +thuộc vào chiều cao của những bức tường này. Xin nhắc lại, để hoàn thành thử + +16 +00:01:04,930 --> 00:01:06,580 +thách này, bạn nên + +17 +00:01:06,580 --> 00:01:11,580 +xem qua cửa sổ bàn phím của Reeborg và chuyển đến tab này có tên là điều + +18 +00:01:12,070 --> 00:01:17,050 +kiện và xem bạn có thể kiểm tra xem mặt trước của robot có rõ ràng không, + +19 +00:01:17,380 --> 00:01:21,280 +nếu đúng thì rõ ràng, nếu có một bức tường ở phía trước, + +20 +00:01:21,280 --> 00:01:24,940 +nếu có một bức tường ở bên phải và nhiều thứ khác. + +21 +00:01:25,630 --> 00:01:29,950 +Những thứ có lẽ sẽ hữu ích nhất là hàng trên cùng ở đây. + +22 +00:01:30,280 --> 00:01:32,950 +Vì vậy, tôi muốn bạn xem xét các điều kiện này, xem + +23 +00:01:33,130 --> 00:01:35,290 +chúng được đánh vần như thế nào và cách + +24 +00:01:35,740 --> 00:01:40,270 +bạn có thể sử dụng chúng, sau đó cố gắng sử dụng và kiểm tra chúng bằng robot Reeborg của bạn. + +25 +00:01:40,840 --> 00:01:42,130 +Bây giờ, mục tiêu + +26 +00:01:42,130 --> 00:01:46,000 +tất nhiên là đạt được lá cờ cuối cùng này vượt qua nhiều rào cản + +27 +00:01:46,030 --> 00:01:50,860 +khác nhau bằng cách sử dụng đường chấm chấm này làm đường dẫn, sẽ khác nhau mỗi lần. + +28 +00:01:51,250 --> 00:01:56,170 +Cũng giống như một hướng lên, điều này sẽ yêu cầu bạn sửa đổi chức năng nhảy này. + +29 +00:01:56,560 --> 00:02:00,610 +Hãy suy nghĩ nghiêm túc về nó vì nó không dễ dàng và bạn sẽ cần sử dụng nhiều vòng + +30 +00:02:01,030 --> 00:02:06,030 +lặp while hơn để đạt được kết quả cuối cùng này. Và hãy thử xem liệu bạn có + +31 +00:02:06,550 --> 00:02:11,440 +thể giải quyết thử thách này trong ít dòng mã nhất có thể hay không. + +32 +00:02:11,800 --> 00:02:14,950 +Vì vậy, tôi đã quản lý để làm điều đó trong ít nhất 24 dòng mã, vì vậy hãy + +33 +00:02:15,220 --> 00:02:17,590 +xem liệu bạn có thể đặt mục tiêu đạt được điều đó hay không. + +34 +00:02:18,190 --> 00:02:20,980 +Hãy tạm dừng video ngay bây giờ và bắt đầu thử thách này. + +35 +00:02:22,310 --> 00:02:23,143 +1: Đúng không? + +36 +00:02:25,680 --> 00:02:26,100 +0: Được rồi. + +37 +00:02:26,100 --> 00:02:31,100 +Vì vậy, sự khác biệt chính giữa rào cản cụ thể này và phiên bản trước là chiều + +38 +00:02:31,650 --> 00:02:36,650 +cao của bức tường hiện là ngẫu nhiên. Thay vì chỉ nhảy qua một ô vuông, nơi chúng + +39 +00:02:37,530 --> 00:02:40,860 +ta rẽ trái, di chuyển, rẽ phải, di chuyển, rẽ phải khi di chuyển, + +40 +00:02:41,220 --> 00:02:44,700 +giờ chúng ta phải xem phía bên phải có tường không, hoặc nó có + +41 +00:02:44,940 --> 00:02:48,270 +hoàn toàn rõ ràng hay không. Bây giờ, trong trường hợp + +42 +00:02:48,300 --> 00:02:52,950 +này, điều tôi muốn xảy ra là trước hết tôi muốn quay người máy của mình sang + +43 +00:02:53,460 --> 00:02:57,990 +trái, sau đó tôi muốn kiểm tra xem có bức tường ở bên phải hay không. + +44 +00:02:58,380 --> 00:03:02,620 +Vì vậy, tôi có thể sử dụng bức tường điều kiện này ở bên phải để đạt được điều này. + +45 +00:03:03,550 --> 00:03:04,720 +Và nếu điều đó + +46 +00:03:04,750 --> 00:03:09,550 +là đúng, thì tôi muốn tiếp tục đi về phía trước cho đến khi không còn bức tường + +47 +00:03:09,550 --> 00:03:12,850 +bên phải nữa, trong trường hợp đó tôi sẽ rẽ phải, rẽ + +48 +00:03:13,000 --> 00:03:17,290 +phải và sau đó bắt đầu đi xuống. Vì vậy, hãy sửa đổi chức năng nhảy này. + +49 +00:03:17,740 --> 00:03:21,730 +Chúng tôi chắc chắn cần rô-bốt rẽ trái, nhưng sau khi nó rẽ trái, chúng tôi + +50 +00:03:21,760 --> 00:03:26,760 +sẽ sử dụng một vòng lặp while để nói rằng trong khi có một bức tường ở bên phải + +51 +00:03:28,360 --> 00:03:32,080 +thì trong trường hợp này, chúng tôi sẽ di chuyển về phía trước. + +52 +00:03:32,890 --> 00:03:35,800 +Vì vậy, về cơ bản chúng ta sẽ đi lên theo hướng này + +53 +00:03:35,800 --> 00:03:37,570 +vì chúng ta đã rẽ trái rồi. + +54 +00:03:38,260 --> 00:03:41,500 +Hãy kiểm tra điều này và hãy chạy mã này. + +55 +00:03:41,800 --> 00:03:43,450 +Bạn có thể thấy trong phiên + +56 +00:03:43,510 --> 00:03:48,100 +bản sự kiện này, robot của tôi sẽ tiếp tục hoạt động cho đến cuối màn hình. + +57 +00:03:48,580 --> 00:03:49,780 +Đây không phải là những gì chúng tôi muốn. + +58 +00:03:50,200 --> 00:03:54,970 +Vì vậy, những gì chúng tôi muốn làm là khi điều này không còn đúng nữa, nó + +59 +00:03:55,180 --> 00:03:58,330 +sẽ chuyển đến dòng 10. Vì vậy, tại thời điểm này, + +60 +00:03:58,360 --> 00:04:00,880 +không còn một bức tường nào ở bên phải nữa, + +61 +00:04:01,150 --> 00:04:05,530 +bởi vì nếu không nó sẽ tiếp tục lặp lại và gọi dòng này là số 9, nơi + +62 +00:04:05,800 --> 00:04:09,880 +nó giúp nó di chuyển về phía trước. Khi không còn bức tường ở + +63 +00:04:10,030 --> 00:04:12,190 +bên phải, chúng tôi muốn làm những gì + +64 +00:04:12,190 --> 00:04:15,550 +chúng tôi đã làm trước đây là làm cho rô bốt của + +65 +00:04:15,850 --> 00:04:19,990 +chúng tôi rẽ phải, sau đó rẽ phải. Bây giờ tại thời điểm này, chúng ta phải di chuyển xuống bức tường. + +66 +00:04:20,350 --> 00:04:24,430 +Và những gì chúng ta sẽ kiểm tra là liệu phía trước có rõ ràng + +67 +00:04:24,460 --> 00:04:29,440 +hay không, bởi vì chỉ khi chúng ta chạm đến đáy ở đây, khi phía trước bị chặn, + +68 +00:04:29,650 --> 00:04:34,650 +chúng ta mới thực sự rẽ trái một lần nữa và tiếp tục quay lại vòng lặp while ở + +69 +00:04:35,830 --> 00:04:40,450 +đây để tiến về phía trước. . Để làm điều này, chúng tôi sẽ thêm một vòng lặp while khác. + +70 +00:04:41,410 --> 00:04:45,490 +Và trong trường hợp này, chúng ta sẽ sử dụng điều kiện front_is_clear. + +71 +00:04:45,910 --> 00:04:48,070 +Trong khi phía trước rất rõ ràng, + +72 +00:04:48,310 --> 00:04:51,430 +chúng tôi sẽ yêu cầu robot tiếp tục tiến về phía trước. + +73 +00:04:51,760 --> 00:04:56,440 +Vì vậy, một khi nó quay mặt về hướng này và không có bức tường phía trước, nó sẽ + +74 +00:04:56,440 --> 00:04:59,530 +tiếp tục đi cho đến khi điều này không còn đúng nữa. + +75 +00:04:59,950 --> 00:05:02,590 +Và đó là sự kết thúc của bước nhảy của chúng tôi. + +76 +00:05:02,860 --> 00:05:07,860 +Vì vậy, bây giờ về cơ bản chúng tôi đã sửa đổi chức năng nhảy này để tính đến tất + +77 +00:05:08,080 --> 00:05:12,250 +cả những điều mới này, chẳng hạn như trong khi có một bức tường ở bên phải + +78 +00:05:12,250 --> 00:05:16,540 +thì tiếp tục di chuyển lên trên, trong khi phía trước rõ ràng khi nó đi xuống + +79 +00:05:16,570 --> 00:05:20,980 +sau đó tiếp tục di chuyển xuống dưới. Và cuối cùng, chúng tôi sẽ yêu cầu rô-bốt + +80 +00:05:21,010 --> 00:05:26,010 +của mình rẽ trái để chúng tôi sẵn sàng đi và kiểm tra xem chúng tôi có đang ở mục + +81 +00:05:28,240 --> 00:05:30,340 +tiêu hay không. Và nếu chúng ta + +82 +00:05:30,370 --> 00:05:32,380 +không đạt được mục tiêu, thì chúng ta sẽ kiểm + +83 +00:05:32,740 --> 00:05:34,750 +tra xem có bức tường phía trước hay không, nếu + +84 +00:05:34,930 --> 00:05:39,610 +có bức tường phía trước chúng ta sẽ nhảy, nếu không chúng ta sẽ tiếp tục di chuyển về phía trước hoặc đúng hơn + +85 +00:05:39,610 --> 00:05:42,700 +là sang bên phải để đến mục tiêu. Vì vậy, bây giờ đây là mã cuối cùng. + +86 +00:05:43,330 --> 00:05:46,540 +Và tùy thuộc vào số lượng khoảng trắng bạn đã thêm vào + +87 +00:05:46,600 --> 00:05:51,600 +đây, rõ ràng là nó sẽ dễ đọc hơn một chút nếu bạn thực sự có nó như thế này. + +88 +00:05:52,090 --> 00:05:56,410 +Nhưng tùy thuộc vào cách bạn sắp xếp các thứ trong mã của mình, + +89 +00:05:56,530 --> 00:06:00,860 +bạn sẽ kết thúc bằng bất kỳ đâu trong khoảng từ 20 đến 24 dòng mã. + +90 +00:06:01,880 --> 00:06:05,720 +Vì vậy, tôi muốn bạn có thể nhìn thấy tất cả các dòng mã này ở bên phải khi chúng + +91 +00:06:05,720 --> 00:06:06,553 +tôi chạy mã này. + +92 +00:06:06,770 --> 00:06:10,970 +Và tôi thực sự có một lỗi đánh máy ở đây mà nó sẽ cho tôi biết. + +93 +00:06:11,180 --> 00:06:12,830 +Vì vậy, nó sẽ nói cú pháp không hợp + +94 +00:06:12,860 --> 00:06:17,270 +lệ và vấn đề chỉ là do tôi quên dấu hai chấm ở đây. Nếu bạn nhận được cú pháp không hợp lệ + +95 +00:06:17,270 --> 00:06:18,860 +của cửa sổ bật lên đó, + +96 +00:06:18,890 --> 00:06:23,890 +hãy nhớ kiểm tra xem bạn có gặp vấn đề gì ở đây không và nó có thể hơi phức tạp + +97 +00:06:24,410 --> 00:06:28,310 +nếu bạn để mã của mình trong một khoảng thời gian dài trước khi kiểm tra. + +98 +00:06:28,340 --> 00:06:31,430 +Vì vậy, hãy kiểm tra mã của bạn sau mỗi lần lặp lại nhỏ và sau đó khi + +99 +00:06:31,700 --> 00:06:34,700 +bạn thực sự nhận được một cái gì đó giống như cú pháp không hợp lệ, bạn + +100 +00:06:34,940 --> 00:06:36,530 +sẽ có thể nắm bắt nó dễ dàng hơn. + +101 +00:06:36,740 --> 00:06:41,740 +Vì vậy, bây giờ chúng ta hãy tiếp tục và tạo lại bản đồ của chúng ta và hãy thử lại. + +102 +00:06:42,620 --> 00:06:46,730 +Vì vậy, khi chúng ta thực hiện một bước nhảy và sau đó chúng ta sẽ rẽ phải, và chúng ta sẽ + +103 +00:06:46,880 --> 00:06:50,390 +tiếp tục đi xuống cho đến khi chạm tường và rẽ trái, và bây giờ chúng ta không + +104 +00:06:50,780 --> 00:06:53,660 +vượt ra ngoài mục tiêu, và có vẫn là một bức tường phía trước. + +105 +00:06:53,660 --> 00:06:58,130 +Vì vậy, chúng tôi thực hiện một bước nhảy khác và chúng tôi đi xuống bức tường lớn hơn rất nhiều này. + +106 +00:06:58,640 --> 00:07:03,170 +Và sau đó, chúng tôi tiếp tục quá trình này bằng cách sử dụng một số vòng lặp + +107 +00:07:03,710 --> 00:07:06,590 +while, kiểm tra xem có bức tường ở bên phải không, + +108 +00:07:06,830 --> 00:07:07,250 +kiểm + +109 +00:07:07,250 --> 00:07:12,250 +tra xem phía trước có thông thoáng không, kiểm tra xem có bức tường phía trước để đạt được mục + +110 +00:07:12,440 --> 00:07:16,880 +tiêu và đến đích cuối cùng hay không. Bây giờ để mã của bạn hoàn thành thành công + +111 +00:07:17,270 --> 00:07:22,100 +thử thách này, dòng mà rô bốt của bạn vẽ phải theo dòng bắt đầu ở đây, giống như những + +112 +00:07:22,130 --> 00:07:23,540 +gì bạn thấy ở đây. + +113 +00:07:24,050 --> 00:07:27,920 +Vì vậy, thay vì chỉ vượt qua đỉnh và đạt được mục tiêu cuối cùng, nó nên + +114 +00:07:28,010 --> 00:07:30,770 +làm theo từng bước sau và cuối cùng bạn sẽ nhận + +115 +00:07:30,770 --> 00:07:34,820 +được cửa sổ bật lên màu xanh lá cây mà nó cho biết nó ở đúng vị trí. + +116 +00:07:35,570 --> 00:07:37,910 +Vậy bạn đã xoay sở để hoàn thành thử thách này chưa? + +117 +00:07:38,240 --> 00:07:43,240 +Nếu không, hãy nhớ xem lại bài học về vòng lặp while và chỉ chơi với vòng + +118 +00:07:43,370 --> 00:07:44,120 +lặp while. + +119 +00:07:44,120 --> 00:07:48,800 +Hãy thử một số điều kiện khác nhau và xem điều gì sẽ xảy ra khi bạn chạy + +120 +00:07:48,800 --> 00:07:53,480 +mã và xem cách hoạt động của rô-bốt để bạn nắm rõ cách những thứ này thực + +121 +00:07:53,480 --> 00:07:54,500 +sự hoạt động. + +122 +00:07:55,130 --> 00:08:00,110 +Bây giờ trong bài học tiếp theo là dự án cuối cùng của chúng ta và chúng ta sẽ làm cho robot + +123 +00:08:00,110 --> 00:08:04,220 +của chúng ta có thể tự điều hướng mê cung bằng cách sử dụng những gì chúng + +124 +00:08:04,250 --> 00:08:08,810 +ta đã học bao gồm các hàm cũng như các vòng lặp while, cũng như sử dụng thụt lề tốt. + +125 +00:08:09,170 --> 00:08:12,290 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Reeborgs-World-Hurdles-4-Challenge.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Reeborgs-World-Hurdles-4-Challenge.url new file mode 100644 index 0000000000000000000000000000000000000000..f4a1dd5048f83c5deb39c2736f7007340c1467b0 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/008 Reeborgs-World-Hurdles-4-Challenge.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%204&url=worlds%2Ftutorial_en%2Fhurdle4.json \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Course-Fixes-Report-an-Issue.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Final Project Escaping the Maze.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Final Project Escaping the Maze.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f8ec7be70021155994e8347ab58c382243b50c3f --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Final Project Escaping the Maze.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fe6778945f37a333424386f8b441247ac39db78149fd674442048602a5b0f17 +size 141005037 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Final Project Escaping the Maze_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Final Project Escaping the Maze_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2d76555fff4fd562fdc2c9c381416bae67d65945 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Final Project Escaping the Maze_vi.srt @@ -0,0 +1,956 @@ +1 +00:00:00,180 --> 00:00:04,230 +Được rồi các bạn, đã đến lúc cho dự án cuối cùng của ngày hôm nay. + +2 +00:00:04,860 --> 00:00:09,860 +Và mục tiêu là có thể viết một số mã ở đây trong thế giới của Reeborg, + +3 +00:00:10,590 --> 00:00:13,320 +để có thể khiến người máy nhỏ của chúng + +4 +00:00:13,350 --> 00:00:17,730 +ta có thể điều hướng đến mục tiêu và đi qua mê cung bất kể mê cung + +5 +00:00:18,000 --> 00:00:22,230 +trông như thế nào. Vì vậy, nếu bạn quay lại thế giới Reeborgs, + +6 +00:00:22,230 --> 00:00:23,640 +nếu bạn đã mở một liên kết.. + +7 +00:00:23,910 --> 00:00:28,080 +nếu không, bạn chỉ cần nhấp vào liên kết trực tiếp trong tài nguyên khóa học + +8 +00:00:28,380 --> 00:00:29,760 +và nó sẽ đưa bạn đến đây. + +9 +00:00:30,180 --> 00:00:34,770 +Và chúng ta đã chọn mê cung trong danh sách thả xuống, ở ngay đây. + +10 +00:00:36,150 --> 00:00:41,130 +Ở đây, chúng ta có một mê cung. Và mặc dù mê cung không thay đổi, + +11 +00:00:41,520 --> 00:00:46,520 +nhưng người máy thì có. Hướng mà robot sẽ đối mặt là hoàn + +12 +00:00:46,920 --> 00:00:51,390 +toàn ngẫu nhiên, vị trí của robot cũng là ngẫu nhiên. + +13 +00:00:51,420 --> 00:00:54,180 +Vì vậy, bạn có thể thấy mỗi khi tôi khởi động lại trò + +14 +00:00:54,600 --> 00:00:58,800 +chơi, nó sẽ quay về một hướng khác. Vì vậy, trong trường hợp này, nó hướng + +15 +00:00:59,160 --> 00:01:02,730 +lên Nhưng lần sau nó có thể hướng xuống, trong trường hợp này. + +16 +00:01:03,210 --> 00:01:08,130 +Và nó cũng sẽ luôn bắt đầu ở một vị trí ngẫu nhiên trong mê cung. + +17 +00:01:08,640 --> 00:01:10,380 +Nếu bạn nhấp vào thông tin + +18 +00:01:10,590 --> 00:01:15,240 +thế giới, nó sẽ cho bạn biết rằng bí quyết để rô-bốt hoàn thành mê cung + +19 +00:01:15,240 --> 00:01:18,540 +là khiến nó đi dọc theo mép phải của mê cung. + +20 +00:01:19,110 --> 00:01:23,520 +Nếu nó bắt đầu ở bất kỳ đâu trong mê cung và nó chỉ tiếp tục đi dọc + +21 +00:01:23,520 --> 00:01:24,510 +theo bức tường + +22 +00:01:24,810 --> 00:01:28,770 +bên phải, thì cuối cùng nó sẽ đến đích cuối cùng. + +23 +00:01:29,340 --> 00:01:33,060 +Ví dụ như thế này. Bây giờ trong trường hợp này, + +24 +00:01:33,090 --> 00:01:38,090 +rô-bốt không đi thẳng đến lối ra như thể nó có thể thấy những gì chúng ta có thể thấy, + +25 +00:01:38,940 --> 00:01:43,890 +mà nó đang tuân theo một chiến lược hay đúng hơn là cái mà bạn gọi trong lập trình, + +26 +00:01:43,890 --> 00:01:45,600 +một thuật toán. + +27 +00:01:46,020 --> 00:01:50,760 +Và thuật toán ở đây chỉ đơn giản là đi dọc theo mép phải của bức tường. + +28 +00:01:51,360 --> 00:01:52,980 +Và nếu phía bên phải rõ + +29 +00:01:53,010 --> 00:01:58,010 +ràng, thì hãy tiếp tục đi bên phải cho đến khi không còn rõ ràng tại + +30 +00:01:59,010 --> 00:02:03,900 +điểm nào thì nên đi thẳng. Và nếu bạn không thể đi thẳng và bạn không + +31 +00:02:04,230 --> 00:02:07,710 +thể rẽ phải, thì lựa chọn cuối cùng là rẽ trái. + +32 +00:02:08,160 --> 00:02:12,480 +Gần giống như rô-bốt đang nhận được một bộ + +33 +00:02:12,480 --> 00:02:17,040 +hướng dẫn về thứ bậc. Quan trọng nhất là bảo nó rẽ phải nếu rẽ phải, rẽ + +34 +00:02:17,430 --> 00:02:20,520 +phải không được thì đi thẳng. Và cuối cùng, nếu không + +35 +00:02:20,520 --> 00:02:22,770 +thể rẽ phải hoặc đi thẳng, thì + +36 +00:02:23,070 --> 00:02:25,920 +rẽ trái là phương án cuối cùng. + +37 +00:02:26,400 --> 00:02:30,120 +Vì vậy, bạn sẽ cần sử dụng nhiều chức năng mà bạn đã thấy trước đây chẳng hạn + +38 +00:02:30,120 --> 00:02:33,240 +như di chuyển, quay_trái và kiểm tra xem phía trước có trống + +39 +00:02:33,240 --> 00:02:36,270 +hay bên phải có trống hay không, hoặc có bức tường phía trước + +40 +00:02:36,660 --> 00:02:40,710 +hay bức tường phía sau bên phải. Và liệu robot có phải + +41 +00:02:40,710 --> 00:02:45,300 +là mục tiêu hay không. Hãy suy nghĩ về cách bạn có thể sử + +42 +00:02:45,660 --> 00:02:47,370 +dụng vòng lặp while và cả + +43 +00:02:47,400 --> 00:02:51,990 +các câu lệnh điều kiện if, elif, other để đạt được mục tiêu này và + +44 +00:02:52,140 --> 00:02:54,660 +giúp rô-bốt của chúng ta có thể đi đến + +45 +00:02:54,990 --> 00:02:59,160 +đích cuối cùng bất kể nó bắt đầu từ đâu và hướng đi của nó. + +46 +00:02:59,830 --> 00:03:00,820 +Tạm dừng video ngay bây + +47 +00:03:00,850 --> 00:03:03,970 +giờ và cố gắng sử dụng những gì bạn đã học để hoàn thành dự án cuối cùng này. + +48 +00:03:04,410 --> 00:03:09,410 +1: [không nghe được] 0: Được + +49 +00:03:10,620 --> 00:03:14,700 +rồi. Vì vậy, bạn đã quản lý để hoàn thành thử thách này? Nếu không, hãy cùng + +50 +00:03:14,910 --> 00:03:18,870 +nhau tìm ra giải pháp. Điều đầu tiên chúng ta cần làm, + +51 +00:03:19,050 --> 00:03:23,880 +điều mà chúng ta luôn rất cần để hoàn thành từng thử thách này, là chúng ta + +52 +00:03:23,880 --> 00:03:27,180 +cần một cách để rẽ phải. Vì vậy, tôi sẽ không gõ tất cả ra một lần nữa. + +53 +00:03:27,480 --> 00:03:29,640 +Điều này đã khá rõ ràng; turn_right + +54 +00:03:29,640 --> 00:03:32,280 +chỉ rẽ trái ba lần. Bây giờ, điều tiếp + +55 +00:03:32,280 --> 00:03:36,960 +theo chúng ta cần làm là ra lệnh cho robot làm mọi việc và kiểm + +56 +00:03:36,960 --> 00:03:40,500 +tra mọi thứ cho đến khi đạt được mục tiêu. + +57 +00:03:40,890 --> 00:03:44,310 +Chúng tôi biết rằng chúng tôi có bài kiểm tra này được gọi là at_goal. + +58 +00:03:44,700 --> 00:03:49,700 +Vì vậy, chúng ta có thể sử dụng vòng lặp while để robot tiếp tục làm việc + +59 +00:03:50,880 --> 00:03:55,880 +cho đến khi đạt được mục tiêu. Để xác định điều đó, chúng ta có thể nói while + +60 +00:03:57,270 --> 00:04:02,270 +not at target, vì vậy về cơ bản, hãy tiếp tục lặp lại các hướng dẫn bên trong vòng lặp while + +61 +00:04:03,510 --> 00:04:07,050 +này cho đến khi at_goal trở thành true và not true là false. + +62 +00:04:07,230 --> 00:04:11,100 +Vì vậy, một khi điều kiện này trở thành sai, thì vòng lặp while của chúng ta sẽ dừng lại. + +63 +00:04:12,090 --> 00:04:17,089 +Vì vậy, những gì chúng tôi đã nói trong thông tin thế giới là chúng tôi nên đi dọc theo mép phải. + +64 +00:04:17,519 --> 00:04:22,520 +Chúng ta nên chạy thử xem phía bên phải có thông thoáng không, nếu thông + +65 +00:04:22,920 --> 00:04:25,650 +thoáng thì rẽ phải và đi thẳng. + +66 +00:04:25,830 --> 00:04:28,470 +Vì vậy, điều đó về cơ bản có nghĩa là di chuyển sang phải. + +67 +00:04:28,950 --> 00:04:30,870 +Hãy sử dụng câu lệnh if để kiểm + +68 +00:04:30,900 --> 00:04:35,900 +tra xem right_is_clear và trong trường hợp này, vì vậy trong khối + +69 +00:04:36,390 --> 00:04:40,890 +if này, chúng ta sẽ nói tốt turn_right bằng cách sử dụng hàm + +70 +00:04:40,920 --> 00:04:43,530 +dựng sẵn của chúng ta ở đây. + +71 +00:04:44,250 --> 00:04:49,020 +Và sau đó khi bạn đang quay mặt về bên phải thì hãy tiến về phía trước. + +72 +00:04:49,680 --> 00:04:54,090 +Điều này sẽ đạt được một bước đi đúng đắn, vì vậy từ đây đến đây + +73 +00:04:54,090 --> 00:04:54,923 +chẳng hạn. + +74 +00:04:55,650 --> 00:05:00,030 +Bây giờ hãy kiểm tra điều này và xem điều gì sẽ xảy ra. Trong trường hợp này, bên phải rõ ràng + +75 +00:05:00,030 --> 00:05:03,270 +nên nó di chuyển sang bên phải. Bên phải không rõ ràng nên + +76 +00:05:03,330 --> 00:05:05,160 +nó không biết phải làm gì khác và + +77 +00:05:05,160 --> 00:05:09,270 +bây giờ nó bị mắc kẹt trong cái mà chúng ta gọi là một vòng lặp vô hạn. + +78 +00:05:11,010 --> 00:05:16,010 +Và nó sẽ không bao giờ dừng cho đến khi trình duyệt thực sự buộc nó phải dừng lại bằng cách gặp sự cố. + +79 +00:05:16,860 --> 00:05:21,860 +Vì vậy, những gì chúng ta phải làm thay vào đó là chúng ta phải cung cấp một điều kiện + +80 +00:05:22,770 --> 00:05:25,860 +thay thế; khi quyền không rõ ràng thì phải làm sao? + +81 +00:05:26,460 --> 00:05:29,790 +Vì vậy, chúng tôi sẽ cung cấp điều kiện đó bằng cách sử dụng câu lệnh elif. + +82 +00:05:30,300 --> 00:05:34,650 +Và điều chúng tôi muốn nói là nếu bên phải không rõ ràng, thì có + +83 +00:05:35,460 --> 00:05:39,150 +lẽ bạn nên kiểm tra xem phía trước có rõ ràng không. + +84 +00:05:41,460 --> 00:05:45,450 +Và nếu đó là trường hợp, thì chỉ cần tiến về phía trước. + +85 +00:05:46,410 --> 00:05:50,970 +Bây giờ, điều này sẽ hiệu quả trừ khi chúng ta ở trong tình huống mà chúng ta đang ở ngay + +86 +00:05:51,030 --> 00:05:52,260 +lúc này khi chúng ta bị + +87 +00:05:52,620 --> 00:05:56,820 +đóng hộp và bên duy nhất rõ ràng thực sự là bên còn lại, tức là bên trái. + +88 +00:05:58,040 --> 00:06:00,590 +Đó là lý do tại sao chúng ta phải đặt dòng + +89 +00:06:00,950 --> 00:06:05,900 +mã cuối cùng sẽ là một câu lệnh khác. Vì vậy, trong tất cả các điều kiện khác, ừm, + +90 +00:06:05,930 --> 00:06:09,170 +khi bên phải không rõ ràng và phía trước không rõ ràng, vì + +91 +00:06:09,380 --> 00:06:12,230 +vậy một khi cả hai điều này đã được kiểm tra và chúng + +92 +00:06:12,590 --> 00:06:15,110 +đều sai, thì thực sự chỉ cần rẽ trái. + +93 +00:06:16,730 --> 00:06:17,540 +2: Vì vậy, bây giờ + +94 +00:06:17,540 --> 00:06:20,300 +0: bạn có thể thấy rằng khi robot của chúng tôi có thể đi + +95 +00:06:20,540 --> 00:06:23,420 +sang phải, nó sẽ cố gắng đi dọc theo bức tường bên phải. + +96 +00:06:24,110 --> 00:06:28,500 +Nhưng khi nó không thể đi đúng, nó sẽ tiến lên. + +97 +00:06:28,500 --> 00:06:32,540 +Và khi nó không thể đi sang phải hoặc đi tiếp, thì nó sẽ rẽ trái + +98 +00:06:32,810 --> 00:06:35,600 +và hy vọng lần tới khi nó kiểm tra vòng lặp, + +99 +00:06:35,900 --> 00:06:39,380 +phía trước sẽ trống và nó sẽ có thể tiến lên. + +100 +00:06:40,010 --> 00:06:45,010 +Vì vậy, hãy lưu ý cách rô bốt của chúng tôi điều hướng hơi lộn xộn trong mê cung + +101 +00:06:45,980 --> 00:06:49,550 +này, nhưng nó tuân theo thuật toán mà chúng tôi đã chỉ định, + +102 +00:06:49,580 --> 00:06:54,580 +đó là đi dọc theo bức tường bên tay phải cho đến khi bạn đạt được mục tiêu. + +103 +00:06:56,180 --> 00:07:01,180 +Và đó là những gì mà một vài dòng mã này thực hiện bằng cách sử dụng các câu lệnh while, các câu + +104 +00:07:01,490 --> 00:07:05,360 +lệnh if, elif, other của chúng ta và cả hàm turn_right của chúng ta. + +105 +00:07:06,260 --> 00:07:09,050 +Bây giờ, mặc dù mọi thứ dường như đều ổn, nhưng + +106 +00:07:09,440 --> 00:07:14,440 +có một số trường hợp chọn lọc mà rô-bốt có thể bắt đầu ở một vị trí và quay mặt + +107 +00:07:16,490 --> 00:07:21,200 +về một hướng cụ thể khiến rô-bốt rơi vào một vòng lặp vô tận. + +108 +00:07:21,770 --> 00:07:23,360 +Vì vậy, đây là một ví dụ. + +109 +00:07:23,720 --> 00:07:28,310 +Giả sử rô-bốt bắt đầu ở vị trí cụ thể này úp mặt xuống. + +110 +00:07:28,850 --> 00:07:32,270 +Nếu chúng ta tiếp tục và để rô-bốt chạy đoạn mã, bạn + +111 +00:07:32,720 --> 00:07:37,250 +có thể thấy rằng trước tiên, có hơn một nghìn bước trong đoạn mã. + +112 +00:07:37,850 --> 00:07:42,740 +Và điều xảy ra là do rô-bốt không có bức tường ở bên phải, nó sẽ tiếp tục + +113 +00:07:43,160 --> 00:07:48,160 +đi vòng qua vòng tròn vì sau tất cả, chúng tôi đang nói với nó nếu phía + +114 +00:07:49,520 --> 00:07:50,930 +bên phải của bạn trống, + +115 +00:07:50,960 --> 00:07:55,910 +hãy rẽ phải và di chuyển. Và bên phải luôn rõ ràng khi nó nằm + +116 +00:07:56,000 --> 00:08:00,560 +trong hộp ranh giới này. Vì vậy, tùy thuộc vào vị trí bắt đầu + +117 +00:08:00,860 --> 00:08:04,940 +của rô-bốt, nó có thể tự đi vào cái mà chúng tôi gọi là vòng lặp + +118 +00:08:04,970 --> 00:08:08,180 +vô hạn, bởi vì bạn có thể thấy mã cứ lặp đi lặp lại, + +119 +00:08:08,240 --> 00:08:12,950 +thông qua câu lệnh while này và rô-bốt sẽ không bao giờ có thể thoát khỏi + +120 +00:08:13,220 --> 00:08:14,210 +vị trí này. + +121 +00:08:15,050 --> 00:08:20,050 +Vì vậy, đây là một trong những điều xảy ra với các chương trình của bạn. + +122 +00:08:20,540 --> 00:08:24,650 +Đôi khi có những trường hợp cạnh mà bạn có thể không nghĩ tới nhưng + +123 +00:08:25,010 --> 00:08:28,040 +chỉ khi kiểm tra mã bạn mới phát hiện ra chúng. + +124 +00:08:28,940 --> 00:08:33,940 +Bây giờ, vấn đề cụ thể này mà tôi muốn nói là vấn đề gỡ lỗi trung + +125 +00:08:34,940 --> 00:08:35,773 +gian hơn. + +126 +00:08:36,169 --> 00:08:41,169 +Vì vậy, nếu bạn là người đã thực sự thoải mái với Python và + +127 +00:08:42,260 --> 00:08:46,190 +bạn muốn thử gỡ lỗi vấn đề cụ thể này, thì tôi đã + +128 +00:08:46,670 --> 00:08:51,670 +đưa vào một số thế giới vấn đề để bạn kiểm tra mã của mình. + +129 +00:08:54,530 --> 00:08:54,800 +Bây giờ, + +130 +00:08:54,800 --> 00:08:59,610 +nếu bạn là người vẫn đang làm quen với Python, tôi sẽ nói rằng đây không + +131 +00:08:59,640 --> 00:09:03,600 +phải là thời điểm thích hợp để giải quyết thử thách này và + +132 +00:09:04,020 --> 00:09:09,020 +tôi sẽ tiếp tục và ghi chú cho chính mình rằng sau khi bạn hoàn thành ngày + +133 +00:09:09,330 --> 00:09:14,330 +15 và bạn chắc chắn đang ở trong lãnh thổ trung gian của Python để quay lại + +134 +00:09:16,260 --> 00:09:21,260 +vấn đề này và tiếp tục gỡ lỗi trường hợp cạnh cụ thể này. + +135 +00:09:22,350 --> 00:09:26,820 +Bây giờ, nếu bạn là người mới bắt đầu, tôi khuyên bạn nên bỏ qua phần còn lại của video nhưng hãy + +136 +00:09:27,060 --> 00:09:31,680 +đánh dấu và ghi chú ở đây để bạn biết mà quay lại. Bây giờ, nếu bạn là một lập + +137 +00:09:31,710 --> 00:09:33,990 +trình viên trung cấp, thì + +138 +00:09:34,350 --> 00:09:36,780 +hãy tiếp tục và gỡ lỗi này. + +139 +00:09:37,590 --> 00:09:42,590 +Vì vậy, những gì bạn có thể làm với thế giới của Reeborg là bạn thực sự có thể tạo một + +140 +00:09:43,650 --> 00:09:46,530 +tệp để tải lên một bản đồ và vị trí rô-bốt cụ thể. + +141 +00:09:47,610 --> 00:09:52,410 +Vì vậy, những gì tôi đã làm là tôi đã tạo ra một loạt thế giới vấn đề để bạn kiểm tra mã của mình + +142 +00:09:52,410 --> 00:09:56,070 +dựa trên điều mà chúng tôi biết nếu bạn sử dụng mã bình thường, chắc chắn + +143 +00:09:56,100 --> 00:09:58,140 +nó sẽ đi vào một vòng lặp vô hạn. + +144 +00:09:58,860 --> 00:10:02,970 +Vì vậy, điều bạn cần làm là truy cập tài nguyên khóa học cho + +145 +00:10:03,360 --> 00:10:05,610 +bài học này, sau đó tải xuống tệp + +146 +00:10:05,670 --> 00:10:09,720 +zip chứa ba thế giới vấn đề để bạn kiểm tra mã của mình. + +147 +00:10:10,350 --> 00:10:14,490 +Và sau đó trong thế giới Reeborgs, bạn sẽ nhấp vào các tùy chọn + +148 +00:10:14,970 --> 00:10:19,020 +bổ sung, mở thế giới từ tệp và bạn sẽ chọn thư mục mà hy vọng bạn + +149 +00:10:19,020 --> 00:10:23,340 +đã giải nén và xem qua từng thế giới vấn đề này để kiểm tra mã của bạn + +150 +00:10:23,400 --> 00:10:27,630 +trong tất cả các trường hợp. Bây giờ, khi bạn mở hộp này + +151 +00:10:27,660 --> 00:10:32,490 +ra, bạn có thể đóng hộp này lại và rô-bốt sẽ bắt đầu ở một vị trí + +152 +00:10:32,490 --> 00:10:37,490 +có vấn đề cụ thể, hướng về một hướng sẽ khiến nó đi vào một vòng + +153 +00:10:37,590 --> 00:10:40,380 +lặp vô hạn. Và bạn có thể biết trước điều + +154 +00:10:40,380 --> 00:10:45,380 +này bởi vì khi bạn thực sự bắt đầu khởi động rô-bốt và nhấn play, khi bạn thấy số bước ở đây + +155 +00:10:45,660 --> 00:10:48,150 +trên một nghìn, điều đó thường có nghĩa là bạn + +156 +00:10:48,510 --> 00:10:52,680 +có thể đang ở trong một tình huống mà rô-bốt sẽ quay đầu. thành một vòng lặp + +157 +00:10:52,680 --> 00:10:53,520 +vô tận. + +158 +00:10:54,180 --> 00:10:59,180 +Vì vậy, hãy viết mã của bạn ở đây và sau đó kiểm tra mã để đảm bảo rằng số bước giảm xuống dưới 1000 và rô-bốt + +159 +00:10:59,250 --> 00:11:04,250 +của bạn không bị mắc kẹt trong vòng tròn vô tận này. Bây giờ, vì các thế giới vấn đề khác + +160 +00:11:06,480 --> 00:11:10,680 +nhau có thể có các giải pháp khác nhau, nhưng mục tiêu của + +161 +00:11:10,980 --> 00:11:15,630 +bạn là một mã giải pháp có thể giải quyết tất cả các thế giới vấn + +162 +00:11:15,630 --> 00:11:16,350 +đề, tôi muốn + +163 +00:11:16,350 --> 00:11:22,073 +bạn kiểm tra mã của mình với cả ba thế giới vấn đề mà tôi đã tạo cho bạn. + +164 +00:11:23,250 --> 00:11:27,660 +Vì vậy, đây là lúc, nếu bạn muốn giải quyết thử thách này, hãy tiếp tục + +165 +00:11:27,660 --> 00:11:32,400 +và tạm dừng video và xem liệu bạn có thể gỡ lỗi vấn đề khá khó này không. + +166 +00:11:32,910 --> 00:11:36,450 +Tôi phải mất một lúc. Vì vậy, tôi nghĩ rằng bạn cũng sẽ mất một thời gian. + +167 +00:11:36,690 --> 00:11:40,950 +Nhưng bạn có thể thông minh hơn. Nó có thể mất ít thời gian hơn. Vì vậy, chúc may mắn, + +168 +00:11:41,100 --> 00:11:45,030 +hãy tạm dừng video và chúng ta sẽ cùng nhau tìm hiểu giải + +169 +00:11:45,030 --> 00:11:45,863 +pháp sau. + +170 +00:11:51,380 --> 00:11:55,510 +Được rồi. Vì vậy, trước tiên hãy thử và tìm ra vấn đề là gì. + +171 +00:11:55,870 --> 00:12:00,870 +Vấn đề ở đây là mỗi khi phía bên phải của rô-bốt trống, mã của chúng tôi sẽ + +172 +00:12:01,600 --> 00:12:06,430 +yêu cầu nó quay về hướng đó, di chuyển về phía trước và sau đó kiểm tra xem + +173 +00:12:06,880 --> 00:12:11,860 +liệu nó có ở mục tiêu hay không. Như vậy là không, lại bên phải + +174 +00:12:11,860 --> 00:12:15,610 +rõ ràng nên nó rẽ phải và chuyển, rẽ phải và chuyển, + +175 +00:12:15,670 --> 00:12:20,200 +rẽ phải và chuyển. Vì vậy, về cơ bản ở bất kỳ vị trí nào trong bốn + +176 +00:12:20,590 --> 00:12:22,360 +vị trí này, tùy thuộc vào cách nó đối + +177 +00:12:22,660 --> 00:12:26,170 +diện, có thể không có bức tường nào ở phía bên phải của rô-bốt. + +178 +00:12:26,620 --> 00:12:29,860 +Vì vậy, đó là chìa khóa để giải quyết lỗi này. + +179 +00:12:30,820 --> 00:12:35,820 +Chúng ta phải đưa rô-bốt của mình đến vị trí bắt đầu nơi nó có một bức tường ở phía bên + +180 +00:12:36,760 --> 00:12:38,050 +phải của rô-bốt. + +181 +00:12:39,520 --> 00:12:43,960 +Bây giờ tôi đã suy nghĩ về nhiều cách khác nhau để làm điều này và cách + +182 +00:12:43,960 --> 00:12:48,910 +ngắn nhất, cô đọng nhất và cũng dễ hiểu nhất, tôi nghĩ, là cách này. + +183 +00:12:49,510 --> 00:12:53,500 +Vì vậy, nếu chúng ta tạo một vòng lặp while khác trước khi vòng lặp while này chạy, + +184 +00:12:53,530 --> 00:12:55,750 +hãy nhớ rằng mã đi từ trên xuống dưới, nó sẽ chạm + +185 +00:12:55,810 --> 00:12:57,670 +vào vòng lặp while này trước. + +186 +00:12:58,390 --> 00:13:03,220 +Và chúng tôi kiểm tra trong khi phía trước rõ ràng, vậy thì rô-bốt không + +187 +00:13:04,030 --> 00:13:08,170 +ở cạnh bức tường, phải không? Chẳng hạn như trong trường hợp này. + +188 +00:13:08,740 --> 00:13:13,270 +Chà, nếu đúng như vậy, chúng ta sẽ bảo robot của mình tiến về phía trước. + +189 +00:13:13,870 --> 00:13:18,580 +Vì vậy, điều này có nghĩa là robot của chúng ta sẽ tìm kiếm một bức tường. Vì vậy, trong trường hợp này, + +190 +00:13:18,580 --> 00:13:19,413 +ví dụ, nó sẽ + +191 +00:13:20,080 --> 00:13:25,080 +đi về phía trước cho đến khi chạm vào một bức tường. + +192 +00:13:27,970 --> 00:13:32,740 +Vì vậy, nó sẽ lặp qua vòng lặp đó hai lần và di chuyển hai lần cho đến khi va vào + +193 +00:13:32,740 --> 00:13:35,950 +bức tường phía trước. Bây giờ đây là điểm mà chúng tôi muốn, + +194 +00:13:36,250 --> 00:13:40,240 +bởi vì chúng tôi muốn đảm bảo rằng bây giờ nó đã va phải một bức tường phía trước, rằng nó chắc + +195 +00:13:40,690 --> 00:13:45,400 +chắn sẽ có một bức tường ở phía bên phải của rô-bốt. Vậy ta phải làm sao? + +196 +00:13:45,790 --> 00:13:49,330 +Chà, một khi nó đâm vào tường, vậy là nó đã thoát khỏi vòng lặp + +197 +00:13:49,570 --> 00:13:52,000 +while này, chúng ta sẽ bảo nó rẽ trái. + +198 +00:13:52,420 --> 00:13:56,080 +Vì vậy, vòng lặp này đảm bảo rằng robot có một bức tường phía trước nó. + +199 +00:13:56,590 --> 00:13:59,890 +Và khi nó tìm thấy một bức tường phía trước, chúng tôi bảo nó rẽ trái + +200 +00:14:00,190 --> 00:14:03,010 +để chuyển bức tường đó sang phía bên phải của rô-bốt. + +201 +00:14:03,610 --> 00:14:08,350 +Vì vậy, bây giờ bạn có thể thấy chúng ta đang trải qua vòng lặp while này. Mặt trước rõ ràng, vì vậy + +202 +00:14:08,350 --> 00:14:10,150 +nó sẽ di chuyển. + +203 +00:14:12,220 --> 00:14:15,760 +Và sau đó phía trước vẫn trống sau một lần di chuyển đó, vì vậy nó sẽ di chuyển + +204 +00:14:15,820 --> 00:14:20,770 +một lần nữa cho đến khi va phải bức tường phía trước. Bây giờ, tại thời điểm này, nó thoát + +205 +00:14:20,770 --> 00:14:21,400 +khỏi vòng + +206 +00:14:21,400 --> 00:14:24,910 +lặp while và chuyển sang dòng hướng dẫn tiếp theo + +207 +00:14:25,180 --> 00:14:29,770 +yêu cầu nó rẽ trái. Bây giờ rô-bốt đã rẽ trái, giờ nó + +208 +00:14:29,890 --> 00:14:34,890 +có một bức tường ở phía bên phải và nó sẽ đi vào vòng lặp tiếp theo. + +209 +00:14:35,770 --> 00:14:40,420 +Vì vậy, trong vòng lặp này, nếu phía bên phải trống, hãy rẽ phải và di chuyển. + +210 +00:14:40,720 --> 00:14:45,070 +Nếu phía trước thông thoáng, chỉ cần tiến về phía trước, nếu không thì rẽ trái. + +211 +00:14:45,490 --> 00:14:50,230 +Vì vậy, miễn là robot bắt đầu ở vị trí có bức tường ở phía bên phải + +212 +00:14:50,230 --> 00:14:54,440 +của nó, ngay bên cạnh nó, nó sẽ không bao giờ đi vào vòng + +213 +00:14:55,130 --> 00:14:59,320 +lặp vô tận đó với mã này. Vì vậy, đây là một giải pháp cho vấn đề này. + +214 +00:14:59,800 --> 00:15:02,080 +Bây giờ có rất nhiều giải pháp khác, nhưng + +215 +00:15:02,320 --> 00:15:07,320 +bạn phải đảm bảo rằng giải pháp của mình hoạt động trong mọi trường hợp thử nghiệm + +216 +00:15:08,410 --> 00:15:09,280 +này. + +217 +00:15:09,640 --> 00:15:13,870 +Vì vậy, chúng tôi có thể tiếp tục và mở ra thế giới vấn đề 2 nơi robot bắt đầu ở một vị trí khác, + +218 +00:15:13,870 --> 00:15:16,240 +đối mặt với một vị trí khác và chúng tôi muốn đảm bảo + +219 +00:15:16,570 --> 00:15:21,280 +rằng chúng tôi vẫn không có một vòng lặp vô hạn. Trong trường hợp này, + +220 +00:15:21,340 --> 00:15:25,930 +nó không. Vì vậy, đó là tuyệt vời. Và cuối cùng, hãy kiểm tra vấn + +221 +00:15:26,170 --> 00:15:27,760 +đề cuối cùng, đó là vấn đề thế giới + +222 +00:15:28,420 --> 00:15:33,420 +thứ 3, và bây giờ chúng ta có thể chạy chương trình của mình và bạn có thể thấy nó cũng chưa đầy một + +223 +00:15:34,240 --> 00:15:36,190 +nghìn bước. Vì vậy, nó hoạt động. + +224 +00:15:37,000 --> 00:15:41,980 +Vì vậy, đây là một chút sửa lỗi nâng cao vì chúng tôi hiện đang kiểm tra mã của mình trước + +225 +00:15:41,980 --> 00:15:46,980 +các tình huống khủng khiếp khác nhau khi rô-bốt bắt đầu ở vị trí thực sự nguy hiểm và + +226 +00:15:48,310 --> 00:15:53,260 +có thể đi vào các vòng lặp vô hạn này. Bây giờ, nếu bạn không thể tìm ra giải + +227 +00:15:53,290 --> 00:15:55,600 +pháp, đừng tuyệt vọng và đừng quá + +228 +00:15:55,810 --> 00:15:59,410 +khắt khe với bản thân. Đây là một trong những thực sự, thực + +229 +00:15:59,830 --> 00:16:00,670 +sự khó khăn. + +230 +00:16:00,670 --> 00:16:05,470 +Và tôi đã mất một thời gian dài để tìm ra một giải pháp mà tôi nghĩ là có thể đọc được, + +231 +00:16:05,590 --> 00:16:08,080 +có thể giải thích được và có ý nghĩa. + +232 +00:16:08,800 --> 00:16:13,800 +Bây giờ, có thể bạn nên ghi chú vào lịch của mình để đến và xem lại + +233 +00:16:14,440 --> 00:16:16,510 +vấn đề này sau một tuần khi + +234 +00:16:16,690 --> 00:16:20,950 +bạn đã có thời gian để suy nghĩ về nó, và để thực sự hiểu và + +235 +00:16:20,950 --> 00:16:23,860 +hiểu giải pháp, sau đó tự viết mã . + +236 +00:16:24,460 --> 00:16:27,460 +Bởi vì bạn có thể đã quên chính xác đoạn mã đó là gì, nhưng + +237 +00:16:27,520 --> 00:16:32,470 +bạn vẫn nhớ nó hoạt động như thế nào. Vì vậy, nếu đó là một trường hợp, + +238 +00:16:32,770 --> 00:16:37,240 +đây là những gì bạn nên làm. Nếu bạn tự giải quyết được thì xin chúc mừng. + +239 +00:16:37,240 --> 00:16:40,450 +Đây thực sự, thực sự là một nhiệm vụ khá khó khăn. + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Reeborg-World-Tests.zip b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Reeborg-World-Tests.zip new file mode 100644 index 0000000000000000000000000000000000000000..851ca846fa792fe449dddc75d9c0b934049a8a19 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Reeborg-World-Tests.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:522c364955e6d484598f7de9d7b0f1af7046af5c14835195cbbd8a69e05e954e +size 3425 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Reeborgs-World-Maze-Challenge.url b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Reeborgs-World-Maze-Challenge.url new file mode 100644 index 0000000000000000000000000000000000000000..a18d1d9ee099e4420ecb29b571a8f196d63aa630 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/009 Reeborgs-World-Maze-Challenge.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Maze&url=worlds%2Ftutorial_en%2Fmaze1.json \ No newline at end of file diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/010 Why is this so Hard! Can I really do this.mp4 b/part1/06 - Day 6 - Beginner - Python Functions & Karel/010 Why is this so Hard! Can I really do this.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..720a0738bb4f578575b82b23a66dcf627906d71d --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/010 Why is this so Hard! Can I really do this.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b305bdb854fbaf84e35a0db21f3895e2e4e4f73cb6ad679044b842ba388765e3 +size 51760562 diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/010 Why is this so Hard! Can I really do this_vi.srt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/010 Why is this so Hard! Can I really do this_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..45bea461647309cd3c7ac359448ec6346290a84d --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/010 Why is this so Hard! Can I really do this_vi.srt @@ -0,0 +1,76 @@ +1 +00:00:08,940 --> 00:00:11,970 +Đúng, 1: Đúng. + +2 +00:00:11,970 --> 00:00:15,420 +2: Này, rất tốt vì đã hoàn thành ngày thứ sáu. + +3 +00:00:15,990 --> 00:00:20,460 +Bây giờ tôi nhớ lại khi tôi học cách lướt gió, học một kỹ + +4 +00:00:20,520 --> 00:00:23,610 +năng mới có thể khó khăn như thế nào. + +5 +00:00:24,180 --> 00:00:26,820 +Và tôi nghĩ khi bạn trở thành một người + +6 +00:00:26,850 --> 00:00:31,500 +lớn, đây giống như một cảm giác thực sự lạ lẫm, học hỏi một điều gì đó mới. + +7 +00:00:31,980 --> 00:00:33,930 +Bởi vì thường xuyên hơn không, có thể + +8 +00:00:34,080 --> 00:00:36,540 +bạn đang làm công việc mà bạn đã làm trong nhiều năm. + +9 +00:00:36,570 --> 00:00:38,220 +Bạn có thể đã thực sự giỏi + +10 +00:00:38,580 --> 00:00:43,470 +nó và bạn không thực sự cần phải đấu tranh để thực sự cảm thấy nỗi đau mà bạn cảm + +11 +00:00:43,470 --> 00:00:44,520 +thấy với việc học. + +12 +00:00:44,970 --> 00:00:49,500 +Và đây có thể là lần đầu tiên bạn làm điều đó trong một thời gian. Vì vậy, giống như khi bạn + +13 +00:00:49,530 --> 00:00:54,530 +lên ván lướt sóng và bạn đập nước vài lần rất đau, tôi đã + +14 +00:00:55,230 --> 00:00:59,700 +đập vào mặt mình rất nhiều lần, ừm, bạn cảm thấy như thế + +15 +00:01:00,300 --> 00:01:03,180 +này là quá khó, nhưng thực sự sự + +16 +00:01:03,360 --> 00:01:07,680 +cố gắng là cần thiết. Bạn càng đấu tranh, bạn càng + +17 +00:01:07,680 --> 00:01:11,910 +học được nhiều hơn. Vì vậy, đừng hiểu cuộc đấu tranh là một điều xấu. + +18 +00:01:12,240 --> 00:01:14,850 +Đó là một điều tốt. Nó có nghĩa là bạn đang tiến bộ. + +19 +00:01:15,210 --> 00:01:19,810 +Vì vậy, hãy tiếp tục và tôi sẽ tiếp tục luyện tập những cú hat trick của mình, 1: Đúng không? + diff --git a/part1/06 - Day 6 - Beginner - Python Functions & Karel/external-links.txt b/part1/06 - Day 6 - Beginner - Python Functions & Karel/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..3156dbfa083ae88023a64d718b3615ea09742ad7 --- /dev/null +++ b/part1/06 - Day 6 - Beginner - Python Functions & Karel/external-links.txt @@ -0,0 +1,33 @@ + +002 Fork-the-Day-6-Starting-Repl +https://repl.it/@appbrewery/day-6-start + +002 Built-in-Python-Functions +https://docs.python.org/3/library/functions.html + +002 Reeborgs-World-Start +https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Alone&url=worlds%2Ftutorial_en%2Falone.json + +002 FAQ-I-Cant-Access-Reborgs-World +https://www.udemy.com/course/100-days-of-code/learn/lecture/19110416#questions/13317630 + +003 Reeborgs-World-Hurdles-Challenge +https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%201&url=worlds%2Ftutorial_en%2Fhurdle1.json + +004 PEP-8-The-Python-Style-Guide +https://www.python.org/dev/peps/pep-0008/ + +006 Reeborgs-World-Hurdles-2-Challenge +https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%202&url=worlds%2Ftutorial_en%2Fhurdle2.json + +007 Reeborgs-World-Hurdles-3-Challenge +https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%203&url=worlds%2Ftutorial_en%2Fhurdle3.json + +008 Reeborgs-World-Hurdles-4-Challenge +https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%204&url=worlds%2Ftutorial_en%2Fhurdle4.json + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +009 Reeborgs-World-Maze-Challenge +https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Maze&url=worlds%2Ftutorial_en%2Fmaze1.json diff --git a/part1/07 - Day 7 - Beginner - Hangman/001 Day 7 Goals what we will make by the end of the day.mp4 b/part1/07 - Day 7 - Beginner - Hangman/001 Day 7 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..351b5678819a8578a2d26efacf118e817b1af53a --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/001 Day 7 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9129cfb7bcb6d279f82494709d65e9ce4270eb9d5795dd8931ce54d6d093d1e +size 3365443 diff --git a/part1/07 - Day 7 - Beginner - Hangman/001 Day 7 Goals what we will make by the end of the day_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/001 Day 7 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..428d79946d2ecc6a50b70b8413feeb9ad125929d --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/001 Day 7 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,132 @@ +1 +00:00:00,310 --> 00:00:01,030 +Xin chào + +2 +00:00:01,030 --> 00:00:05,320 +các bạn, chào mừng bạn đến với Ngày thứ 7 của 100 Ngày viết mã. + +3 +00:00:06,010 --> 00:00:06,430 +Bây + +4 +00:00:06,430 --> 00:00:11,430 +giờ, hôm nay chúng tôi có cả ngày dành riêng cho một dự án thực sự thú vị. + +5 +00:00:11,920 --> 00:00:16,810 +Và những gì chúng ta sẽ xây dựng trong suốt ngày hôm nay về cơ bản là Hangman hoặc + +6 +00:00:16,810 --> 00:00:18,700 +mã tương đương của trò chơi này. + +7 +00:00:19,180 --> 00:00:24,180 +Vì vậy, cách thức hoạt động của trò chơi là bạn phải đoán một từ và đối với mỗi chữ cái + +8 +00:00:24,250 --> 00:00:25,840 +bạn gửi sai, bạn sẽ lấy + +9 +00:00:26,200 --> 00:00:30,670 +đi mạng sống của người đàn ông nhỏ bé này. Và tất nhiên, bạn càng mất nhiều thời gian để tiếp + +10 +00:00:30,910 --> 00:00:32,680 +cận lời nói, bạn càng khiến người + +11 +00:00:32,920 --> 00:00:34,930 +đàn ông nhỏ bé của mình gặp nguy hiểm. + +12 +00:00:35,770 --> 00:00:39,250 +Đây là những gì dự án hoàn thành cuối cùng sẽ trông như thế nào. + +13 +00:00:39,550 --> 00:00:43,420 +Chúng tôi sẽ có một số tác phẩm nghệ thuật ASCII thực sự thú vị như biểu tượng người treo cổ này ở đây + +14 +00:00:43,840 --> 00:00:47,920 +và nó sẽ yêu cầu chúng tôi đoán hoặc một chữ cái. Vì vậy, hãy thử A, và bạn + +15 +00:00:48,700 --> 00:00:50,830 +có thể thấy điều đó không có trong từ. + +16 +00:00:50,860 --> 00:00:55,180 +Vì vậy, chúng tôi mất một mạng sống và nó bắt đầu vẽ người treo cổ nhỏ của chúng tôi. + +17 +00:00:55,240 --> 00:00:58,750 +Vì vậy, chúng ta hãy thử một chữ cái khác, E. Có rất nhiều Es trong đó. + +18 +00:00:58,810 --> 00:01:01,870 +Vì vậy, chúng tôi đã quản lý để có được điều đó. Hãy thử một chữ T, 1: + +19 +00:01:03,460 --> 00:01:04,293 +Đúng không? + +20 +00:01:09,680 --> 00:01:14,270 +0: Và tôi nghĩ tôi biết từ bây giờ là gì ngay trước khi người đàn ông nhỏ bé + +21 +00:01:14,270 --> 00:01:18,200 +của tôi sắp chết. Tôi nghĩ đó là người nuôi ong. Chúng ta bắt đầu. Chúng tôi hiểu rồi. + +22 +00:01:18,290 --> 00:01:20,840 +Vì vậy, nếu chúng tôi chỉ mất thêm một mạng sống, chân + +23 +00:01:21,140 --> 00:01:23,750 +sẽ được thêm vào và chúng tôi sẽ mất, nhưng cuối cùng + +24 +00:01:23,780 --> 00:01:25,340 +chúng tôi đã đến được đó. + +25 +00:01:25,790 --> 00:01:29,270 +Vì vậy, đây là trò chơi đã hoàn thành trông như thế nào và nó diễn ra như thế nào. + +26 +00:01:29,450 --> 00:01:34,450 +Và bạn có thể chuyển đến URL cuối cùng và chạy mã và xem nó hoạt + +27 +00:01:34,610 --> 00:01:37,280 +động nếu bạn muốn. Nhưng chỉ bằng cách xây + +28 +00:01:37,280 --> 00:01:41,600 +dựng trò chơi này, chúng tôi sẽ có thể xem xét và kiểm tra bản thân về + +29 +00:01:41,600 --> 00:01:42,500 +một loạt các + +30 +00:01:42,740 --> 00:01:46,730 +khái niệm mà chúng tôi đã đề cập, như vòng lặp for và while hoặc các + +31 +00:01:46,760 --> 00:01:51,050 +câu lệnh if và khác, danh sách, chuỗi, phạm vi, hàm , mô-đun, và nhiều hơn nữa. + +32 +00:01:51,410 --> 00:01:54,710 +Vì vậy, tôi hy vọng bạn cũng hào hứng như tôi khi bắt + +33 +00:01:55,010 --> 00:01:59,170 +đầu dự án này, và khi bạn đã chuyển sang bài học tiếp theo và hãy bắt đầu. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/001 Day-7-Goal-Click-Run-to-see-the-final-project.url b/part1/07 - Day 7 - Beginner - Hangman/001 Day-7-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..a4dcb5a9f9f9d224a403f006ca9a68774f1b1f73 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/001 Day-7-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/Day-7-Hangman-Final?v=1 \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/002 How to break a Complex Problem down into a Flow Chart.mp4 b/part1/07 - Day 7 - Beginner - Hangman/002 How to break a Complex Problem down into a Flow Chart.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6e5077c39a6fc2585fdfbf3b8ed5733be392b557 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/002 How to break a Complex Problem down into a Flow Chart.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be31365edb227f5f8bc5094f0b6cf0c80e8222c74ea3acdf2ceb212a066d8b9e +size 23238100 diff --git a/part1/07 - Day 7 - Beginner - Hangman/002 How to break a Complex Problem down into a Flow Chart_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/002 How to break a Complex Problem down into a Flow Chart_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cf3fdec0513e18e4438c1470eb290169372fbac9 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/002 How to break a Complex Problem down into a Flow Chart_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:00,610 --> 00:00:04,150 +Tất cả các quyền. Vì vậy, trước khi bắt đầu với + +2 +00:00:04,420 --> 00:00:09,420 +dự án của mình, điều thực sự quan trọng là tất cả chúng ta đều ở trên cùng một trang và + +3 +00:00:09,550 --> 00:00:13,660 +chúng ta hiểu cách mã sẽ hoạt động vì chúng ta biết cách trò chơi hoạt động. + +4 +00:00:14,290 --> 00:00:17,440 +Vì vậy, tôi khuyên bạn nếu bạn chưa bao giờ nghe nói về trò chơi treo + +5 +00:00:17,740 --> 00:00:22,600 +cổ này, thì trước khi bạn tiếp tục truy cập bài viết trên Wikipedia về người treo cổ và thậm chí có thể dễ dàng + +6 +00:00:22,960 --> 00:00:26,290 +hơn nếu bạn chọn ngôn ngữ của riêng mình vì tôi biết rằng nó có một ngôn + +7 +00:00:26,560 --> 00:00:30,340 +ngữ khác. tên bằng các ngôn ngữ khác nhau. Bây giờ, nếu bạn chưa bao + +8 +00:00:30,340 --> 00:00:31,840 +giờ chơi trò chơi + +9 +00:00:31,840 --> 00:00:35,350 +này, tôi luôn khuyên bạn chỉ cần truy cập và trực tuyến. + +10 +00:00:35,590 --> 00:00:39,910 +Vì vậy, một liên kết đến địa chỉ này, và nếu bạn nhấp vào trình phát đơn không đúng thời gian, bạn + +11 +00:00:40,390 --> 00:00:43,480 +có thể thấy rằng bạn có một từ mà bạn phải đoán, và sau đó + +12 +00:00:43,810 --> 00:00:47,410 +bạn bắt đầu chọn một số chữ cái. Và nếu nó đúng, thì nó + +13 +00:00:47,410 --> 00:00:49,930 +sẽ đi vào và nếu nó sai, thì giá + +14 +00:00:49,960 --> 00:00:54,960 +treo cổ bắt đầu được rút ra và người đàn ông nhỏ bé của chúng ta có + +15 +00:00:56,380 --> 00:00:59,740 +nguy cơ bị treo cổ. Khi bạn đã hiểu cách + +16 +00:00:59,770 --> 00:01:03,610 +trò chơi hoạt động, đã đến lúc chúng tôi kiểm tra logic của chương + +17 +00:01:03,610 --> 00:01:07,540 +trình của chúng tôi sẽ như thế nào. Và để làm điều đó, chúng ta sẽ sử dụng lập trình lưu đồ. + +18 +00:01:07,570 --> 00:01:08,980 +Vì vậy, nó rất đơn giản. + +19 +00:01:09,280 --> 00:01:14,280 +Nó chỉ có nghĩa là chúng ta có thể vẽ ra một biểu đồ để thể hiện logic của trò + +20 +00:01:14,500 --> 00:01:16,690 +chơi của chúng ta. Tại thời điểm này, + +21 +00:01:16,750 --> 00:01:21,190 +tôi muốn bạn tạm dừng video và suy nghĩ nhanh về cách bạn lập trình + +22 +00:01:21,190 --> 00:01:22,023 +treo cổ. + +23 +00:01:22,210 --> 00:01:25,690 +Hãy thử và đưa ra một biểu đồ thể hiện logic của trò chơi này. + +24 +00:01:26,230 --> 00:01:29,470 +Chia nhỏ nó thành các bước nhỏ. Điều gì cần xảy ra trước, điều + +25 +00:01:29,710 --> 00:01:33,250 +gì cần xảy ra khi người dùng đoán, và điều gì sẽ xảy ra khi khách không + +26 +00:01:33,250 --> 00:01:37,240 +chính xác, khi nào trò chơi nên kết thúc? Tạm dừng video ngay bây giờ, lấy + +27 +00:01:37,240 --> 00:01:42,130 +bút chì và một mảnh giấy hoặc sử dụng vẽ. io để tạo lưu đồ của bạn. + +28 +00:01:42,480 --> 00:01:43,313 +1: Đúng không? + +29 +00:01:46,010 --> 00:01:48,860 +0: Vậy điều đó diễn ra như thế nào? Bạn đã chia nhỏ vấn đề? + +30 +00:01:49,400 --> 00:01:52,640 +Điều thực sự quan trọng phải nói rằng không có câu trả lời đúng duy nhất ở đây. + +31 +00:01:53,030 --> 00:01:55,820 +Và có vô số cách mà bạn có thể làm được điều này, nhưng hãy để + +32 +00:01:56,180 --> 00:01:57,800 +tôi chỉ cho bạn cách tiếp cận của tôi, + +33 +00:01:57,920 --> 00:02:01,070 +đó là cách chúng ta sẽ viết chương trình của mình trong một vài bài học tiếp theo. + +34 +00:02:02,570 --> 00:02:05,570 +Vì vậy, đây là những gì nó trông như thế nào từ đầu đến cuối. + +35 +00:02:05,990 --> 00:02:09,530 +Và nếu chúng ta phóng to một chút, hãy xem qua biểu đồ luồng này từng bước + +36 +00:02:09,530 --> 00:02:13,580 +để chúng ta đều ở trên cùng một trang. Khi bắt đầu trò chơi, điều đầu tiên + +37 +00:02:13,580 --> 00:02:18,410 +chúng ta làm là tạo ra một từ ngẫu nhiên. Giả sử, trong trường hợp này, đó + +38 +00:02:18,410 --> 00:02:19,760 +là từ chuột. + +39 +00:02:20,270 --> 00:02:25,270 +Bây giờ, bước tiếp theo là tạo càng nhiều ô trống như các chữ cái trong từ. + +40 +00:02:25,910 --> 00:02:28,610 +Vì vậy, chúng tôi có những ô trống này để cho người dùng biết có + +41 +00:02:28,790 --> 00:02:33,140 +bao nhiêu chữ cái trong từ này mà họ cần đoán. Họ không thấy cái này, nhưng họ + +42 +00:02:33,140 --> 00:02:37,100 +có thể thấy cái này. Và bước tiếp theo họ đoán + +43 +00:02:37,130 --> 00:02:38,360 +một chữ cái. + +44 +00:02:38,900 --> 00:02:43,130 +Vì vậy, giả sử người dùng trong trường hợp này đoán chữ O. Điều tiếp theo chúng ta phải + +45 +00:02:43,130 --> 00:02:47,960 +kiểm tra là, chữ cái được đoán có thực sự nằm trong từ không? + +46 +00:02:48,440 --> 00:02:51,050 +Chà, trong trường hợp này, o nó thực sự là chuột. + +47 +00:02:51,050 --> 00:02:52,790 +Nó là một ở vị trí thứ hai. + +48 +00:02:53,330 --> 00:02:58,070 +Và vì vậy chúng tôi đi xuống con đường này và chúng tôi trả lời có cho câu hỏi đó. + +49 +00:02:58,430 --> 00:03:02,350 +Vì vậy, bây giờ chúng ta thay thế chỗ trống đó bằng chữ O. + +50 +00:03:03,940 --> 00:03:08,940 +Bây giờ công đoạn tiếp theo là chúng ta phải kiểm tra xem các ô trống đã được lấp đầy chưa, tất cả các ô trống này + +51 +00:03:09,160 --> 00:03:11,260 +đã được loại bỏ chưa vì trong trường hợp đó, nghĩa + +52 +00:03:11,260 --> 00:03:15,820 +là người dùng đã đoán đúng tất cả các chữ cái chưa? Hiện tại, chắc chắn là không, + +53 +00:03:16,060 --> 00:03:19,300 +vì chúng tôi chỉ đoán được một chữ cái. + +54 +00:03:19,690 --> 00:03:23,800 +Vì vậy, sau đó chúng tôi quay lại từ đầu và yêu cầu người dùng + +55 +00:03:23,860 --> 00:03:27,040 +đoán một chữ cái khác. Bây giờ ở một số giai đoạn + +56 +00:03:27,070 --> 00:03:31,840 +của trò chơi, tất cả các chữ cái sẽ được đoán. Và sau đó chúng tôi có thể trả lời có cho câu + +57 +00:03:32,320 --> 00:03:36,940 +hỏi này, có nghĩa là trò chơi đã kết thúc. Người dùng đã thắng vì họ đã đoán đúng tất + +58 +00:03:36,940 --> 00:03:39,100 +cả các chữ cái. Bây giờ, nếu + +59 +00:03:39,250 --> 00:03:43,180 +chúng ta quay lại phần mà chúng ta yêu cầu người dùng đoán một chữ cái + +60 +00:03:43,570 --> 00:03:46,510 +và họ đoán một chữ cái, hãy nói chữ z không + +61 +00:03:46,630 --> 00:03:51,250 +thực sự tồn tại trong con chuột từ này, trong khi trong trường hợp này, chúng ta đi + +62 +00:03:51,280 --> 00:03:54,160 +xuống phần này đường dẫn đúng để trả lời không và + +63 +00:03:54,730 --> 00:03:56,650 +người dùng mất mạng, có nghĩa là chúng + +64 +00:03:56,800 --> 00:04:01,630 +ta bắt đầu vẽ ra hình người treo cổ. Bây giờ, tùy thuộc vào việc họ + +65 +00:04:01,870 --> 00:04:04,690 +có hết sống hay không, nếu người treo cổ + +66 +00:04:04,750 --> 00:04:08,620 +đã được vẽ hoàn toàn, thì họ sẽ đi xuống con đường này. + +67 +00:04:08,650 --> 00:04:13,180 +Nhưng hiện tại họ mới chỉ mất một mạng người và con số này vẫn chưa hoàn chỉnh nên + +68 +00:04:13,210 --> 00:04:14,710 +câu trả lời là không. + +69 +00:04:15,250 --> 00:04:18,430 +Và điều đó có nghĩa là chúng ta quay trở lại từ đầu và để chúng đoán chữ + +70 +00:04:18,430 --> 00:04:19,779 +cái tiếp theo. Bây giờ, + +71 +00:04:19,839 --> 00:04:24,400 +nếu ở giai đoạn mà họ đã dùng hết sinh lực của mình và hình người + +72 +00:04:24,400 --> 00:04:28,120 +treo cổ đã hoàn thành, thì đó là kết thúc của trò + +73 +00:04:28,330 --> 00:04:32,140 +chơi và về cơ bản họ chỉ thua mà không cần đoán tất + +74 +00:04:32,230 --> 00:04:35,950 +cả các chữ cái trong từ. Vì vậy, đây là logic và bạn + +75 +00:04:35,980 --> 00:04:38,500 +có thể cần phải quay lại video này một vài + +76 +00:04:38,830 --> 00:04:43,270 +lần nếu bạn gặp khó khăn trong quá trình thực hiện chỉ để xem lại cách chương trình chạy. + +77 +00:04:43,690 --> 00:04:48,690 +Nhưng nó cũng có thể đáng để tạo lưu đồ của riêng bạn hoặc chỉ cần tải xuống lưu đồ đã + +78 +00:04:48,820 --> 00:04:52,270 +hoàn chỉnh này mà tôi có ở đây trong tài nguyên khóa học. + +79 +00:04:52,810 --> 00:04:57,640 +Đó là một công cụ thực sự hữu ích để quay lại và tham khảo khi bạn đang viết mã, vì + +80 +00:04:57,640 --> 00:04:58,390 +điều này + +81 +00:04:58,390 --> 00:05:02,170 +sẽ cung cấp cho bạn cái nhìn tổng quan về những gì bạn đang cố gắng + +82 +00:05:02,170 --> 00:05:03,003 +lấy mã của mình. + +83 +00:05:03,010 --> 00:05:06,700 +Và hy vọng điều này sẽ giúp bạn dễ dàng hoàn thành các + +84 +00:05:06,700 --> 00:05:11,350 +thử thách sắp tới trong dự án này. Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp + +85 +00:05:11,500 --> 00:05:12,520 +theo và bắt đầu. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/002 How-the-Hangman-Game-works.url b/part1/07 - Day 7 - Beginner - Hangman/002 How-the-Hangman-Game-works.url new file mode 100644 index 0000000000000000000000000000000000000000..fe88e34d47cc68000cd797968bf5257e5c007aa1 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/002 How-the-Hangman-Game-works.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/Hangman_(game) \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/002 Play-Hangman-with-Friends-Online.url b/part1/07 - Day 7 - Beginner - Hangman/002 Play-Hangman-with-Friends-Online.url new file mode 100644 index 0000000000000000000000000000000000000000..ad3f4f4e615346700966fdfe937c455bb74c460c --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/002 Play-Hangman-with-Friends-Online.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://hangmanwordgame.com/?fca=1&success=0#/ \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/002 Solution-Hangman-Flowchart-1.png b/part1/07 - Day 7 - Beginner - Hangman/002 Solution-Hangman-Flowchart-1.png new file mode 100644 index 0000000000000000000000000000000000000000..64f99231f7b102de6a4d44a3fa8f01ff71e861fd Binary files /dev/null and b/part1/07 - Day 7 - Beginner - Hangman/002 Solution-Hangman-Flowchart-1.png differ diff --git a/part1/07 - Day 7 - Beginner - Hangman/003 Challenge 1 - Picking a Random Words and Checking Answers.mp4 b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge 1 - Picking a Random Words and Checking Answers.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e00ed798607c8d33acf3e69729733080570da9d0 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge 1 - Picking a Random Words and Checking Answers.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d0f0a705782537b7c9abdb4a3a292c3d74cee3e346ec21e5804d083e93bdd7f +size 11514685 diff --git a/part1/07 - Day 7 - Beginner - Hangman/003 Challenge 1 - Picking a Random Words and Checking Answers_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge 1 - Picking a Random Words and Checking Answers_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..970ce9c66c1cdcf44e2db54432a5d4b9a9a4b74e --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge 1 - Picking a Random Words and Checking Answers_vi.srt @@ -0,0 +1,120 @@ +1 +00:00:00,070 --> 00:00:04,750 +Tất cả các quyền. Vì vậy, để bắt đầu, hãy đến với Repl bắt đầu. đó là tệp + +2 +00:00:04,960 --> 00:00:07,660 +mà bạn có thể tìm thấy trong tài + +3 +00:00:08,080 --> 00:00:13,080 +nguyên khóa học và bạn sẽ thấy một tệp trống khá nhiều cũng như ba + +4 +00:00:13,930 --> 00:00:18,790 +việc cần làm để bạn hoàn thành. Tất cả những gì tôi có ở đây là danh sách + +5 +00:00:18,850 --> 00:00:20,890 +ba từ, ardvark, khỉ đầu chó và lạc đà. + +6 +00:00:21,340 --> 00:00:25,660 +Và chúng ta sẽ chọn một từ ngẫu nhiên từ danh sách đó và sau đó chúng ta + +7 +00:00:26,110 --> 00:00:28,930 +sẽ yêu cầu người dùng đoán một chữ cái, và sau + +8 +00:00:29,440 --> 00:00:34,440 +đó chúng ta sẽ kiểm tra xem chữ cái đó có khớp với một trong các chữ cái trong từ đã + +9 +00:00:35,140 --> 00:00:35,980 +chọn hay không. + +10 +00:00:36,310 --> 00:00:40,930 +Vì vậy, về cơ bản chúng tôi chỉ giải quyết phần đầu tiên của sơ + +11 +00:00:40,930 --> 00:00:44,680 +đồ này cho đến khoảng đây. Khi bạn đã hoàn thành tất cả ba việc + +12 +00:00:45,010 --> 00:00:48,610 +cần làm ở đây, bạn sẽ có một cái gì đó sẽ hoạt động ít nhiều như thế này. + +13 +00:00:48,790 --> 00:00:51,430 +Vì vậy, đây là kết quả cuối cùng của bước 1 và + +14 +00:00:51,880 --> 00:00:56,320 +nó sẽ yêu cầu chúng ta đoán một chữ cái. Vậy để tôi thử a. + +15 +00:00:57,010 --> 00:01:02,010 +Và nó cho tôi thấy rằng điều này phù hợp với chữ cái đầu tiên trong từ, cũng + +16 +00:01:04,120 --> 00:01:06,310 +như chữ cái thứ tư trong từ. + +17 +00:01:06,640 --> 00:01:11,640 +Vì vậy, tôi khá chắc chắn rằng từ mà nó chọn ngẫu nhiên thực sự là ardvark. + +18 +00:01:12,340 --> 00:01:17,340 +Về cơ bản, mã của bạn sẽ lặp qua từng chữ cái trong từ đã chọn, sau đó + +19 +00:01:17,590 --> 00:01:18,310 +kiểm tra + +20 +00:01:18,310 --> 00:01:23,110 +nó với từ mà người dùng đã nhập và báo cáo lại xem nó có khớp với bất + +21 +00:01:23,200 --> 00:01:27,910 +kỳ chữ cái nào trong từ hay không. Bây giờ, nếu bạn cần gợi ý, + +22 +00:01:27,910 --> 00:01:29,110 +hãy truy + +23 +00:01:29,170 --> 00:01:34,170 +cập tài nguyên khóa học và bạn sẽ thấy một liên kết được đánh + +24 +00:01:34,810 --> 00:01:37,270 +dấu là gợi ý. Và khi bạn + +25 +00:01:37,390 --> 00:01:42,100 +nhấp vào nó, nó sẽ đưa bạn đến trang này, nơi nó nói về cách sử dụng + +26 +00:01:42,160 --> 00:01:47,110 +vòng lặp for với một danh sách bằng Python. Hãy đọc hết phần này và sau đó quay lại, cố gắng giải quyết những + +27 +00:01:47,210 --> 00:01:51,520 +việc cần làm và xem điều đó có giúp ích cho bạn không. Được rồi. + +28 +00:01:51,520 --> 00:01:55,390 +Vì vậy, hãy thử chơi với phiên bản cuối cùng và khi bạn đã sẵn + +29 +00:01:55,510 --> 00:02:00,510 +sàng, hãy tiếp tục fork một bản sao của tệp bắt đầu cho ngày thứ 7 bước một và giải + +30 +00:02:01,570 --> 00:02:04,720 +quyết từng việc cần làm. Chúc may mắn. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/003 Challenge-1-Starting-Code.url b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge-1-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..6e5909cccec000903f66ee48f7eb1e5d6255833f --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge-1-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-1-Start \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/003 Challenge-1-Target-Behaviour.url b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge-1-Target-Behaviour.url new file mode 100644 index 0000000000000000000000000000000000000000..e4a72db1f4572f0e971d3b23bee64b19af2aaba7 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/003 Challenge-1-Target-Behaviour.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-1-End?embed=1&output=1#main.py \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/003 Hint-Python-List-Documentation.url b/part1/07 - Day 7 - Beginner - Hangman/003 Hint-Python-List-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..ee1e3ca87c1a8ca8d106e3fe185a81dd841a7ca1 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/003 Hint-Python-List-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://developers.google.com/edu/python/lists#for-and-in \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/004 Challenge 1 Solution - How to Check the User's Answer.mp4 b/part1/07 - Day 7 - Beginner - Hangman/004 Challenge 1 Solution - How to Check the User's Answer.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..992b0225115c81b986dd558bbc5a8a33b6c7ae63 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/004 Challenge 1 Solution - How to Check the User's Answer.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d516bcc597f668671c96c0ce47f48954e38b299cbf7815f544ff067049c9c62 +size 76877645 diff --git a/part1/07 - Day 7 - Beginner - Hangman/004 Challenge 1 Solution - How to Check the User's Answer_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/004 Challenge 1 Solution - How to Check the User's Answer_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2184c6769e86b7c2fb2778edcac93213c933a747 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/004 Challenge 1 Solution - How to Check the User's Answer_vi.srt @@ -0,0 +1,380 @@ +1 +00:00:00,070 --> 00:00:00,400 +Được rồi. + +2 +00:00:00,400 --> 00:00:05,400 +Vì vậy, làm thế nào bạn có được trên? Bây giờ nếu bạn gặp khó khăn hoặc bạn muốn xem có thể + +3 +00:00:05,530 --> 00:00:09,160 +tôi đã làm như thế nào, thì hãy tiếp tục xem và tôi sẽ cùng bạn tìm ra giải pháp. + +4 +00:00:09,820 --> 00:00:13,870 +Vì vậy, điều đầu tiên, hãy truy cập liên kết và phân nhánh bản sao của chính bạn. + +5 +00:00:15,640 --> 00:00:18,730 +Khi bạn đã hoàn thành việc đó, chúng tôi sẽ giải quyết từng việc cần + +6 +00:00:18,730 --> 00:00:20,560 +làm theo thứ tự. Đầu tiên, yêu + +7 +00:00:20,560 --> 00:00:25,560 +cầu chúng tôi chọn ngẫu nhiên một từ từ danh sách từ và gán nó vào một biến + +8 +00:00:27,820 --> 00:00:28,870 +được gọi là select_word. + +9 +00:00:29,500 --> 00:00:32,890 +Vì vậy, để lấy ngẫu nhiên một mục ra khỏi + +10 +00:00:33,190 --> 00:00:36,580 +danh sách, chúng ta sẽ cần nhập mô-đun ngẫu nhiên. + +11 +00:00:37,900 --> 00:00:42,760 +Và một khi chúng ta đã nắm được điều đó, thì chúng ta có thể nói là ngẫu nhiên. và nếu chúng ta đặt + +12 +00:00:43,030 --> 00:00:45,490 +bên trong dấu ngoặc đơn danh sách + +13 +00:00:45,790 --> 00:00:48,610 +mà chúng ta muốn chọn ngẫu nhiên, thì + +14 +00:00:48,970 --> 00:00:53,830 +chúng ta sẽ có thể lấy ngẫu nhiên một mục từ danh sách này. + +15 +00:00:54,370 --> 00:00:58,090 +Và cuối cùng, chúng ta sẽ gán nó cho một biến được gọi là select_word. + +16 +00:00:58,510 --> 00:01:03,490 +Vì vậy, hãy gọi đó là select_word và sau đó đặt nó bằng kết quả này. + +17 +00:01:04,900 --> 00:01:09,900 +Vậy là việc cần làm 1 đã hoàn thành. Việc làm tiếp theo, chúng ta phải yêu cầu người dùng đoán một chữ cái + +18 +00:01:10,060 --> 00:01:15,060 +và gán câu trả lời của họ cho một biến được gọi là đoán. Và cuối cùng hãy đoán + +19 +00:01:16,030 --> 00:01:20,650 +đó là chữ thường. Để hỏi người dùng về bất cứ điều gì, chúng + +20 +00:01:20,680 --> 00:01:24,490 +ta sẽ phải tạo một đầu vào. Và giả sử, "Đoán một + +21 +00:01:24,550 --> 00:01:26,650 +chữ cái:" Và sau đó chúng ta + +22 +00:01:29,470 --> 00:01:31,690 +có thể chỉ định câu trả lời + +23 +00:01:31,720 --> 00:01:36,190 +của họ sẽ thay thế dòng mã này bằng một biến được gọi là đoán. + +24 +00:01:36,430 --> 00:01:40,210 +Vì vậy, chúng tôi sẽ chỉ đặt điều đó bằng để đoán. Và cuối cùng, chúng tôi sẽ đặt suy đoán + +25 +00:01:40,240 --> 00:01:45,240 +này viết thường và chúng tôi thực hiện điều đó bằng cách viết. thấp hơn. + +26 +00:01:46,840 --> 00:01:51,790 +Bây giờ, bước 3 yêu cầu chúng tôi kiểm tra xem chữ cái mà người + +27 +00:01:51,970 --> 00:01:56,970 +dùng đoán, là biến đoán này, có phải là một trong các chữ cái trong select_word không. + +28 +00:01:57,550 --> 00:02:02,550 +Vì vậy, từ được chọn ngẫu nhiên này có thể là bất kỳ từ nào trong số sau: ardvack, khỉ đầu chó hoặc lạc đà. + +29 +00:02:04,210 --> 00:02:08,080 +Và bằng cách nào đó chúng ta phải kiểm tra xem chữ + +30 +00:02:08,410 --> 00:02:13,410 +cái được lưu trữ bên trong biến này có khớp với bất kỳ chữ cái nào trong + +31 +00:02:13,780 --> 00:02:17,890 +danh sách các từ này không. Vì vậy, như tôi đã đề cập như + +32 +00:02:18,100 --> 00:02:22,120 +một gợi ý, bạn có thể xem tài liệu này từ Google dành cho giáo dục, tài liệu + +33 +00:02:22,420 --> 00:02:24,550 +này nói về nhiều thứ khác nhau bằng Python. + +34 +00:02:25,000 --> 00:02:28,690 +Và phần tôi muốn thu hút sự chú ý của bạn là vòng lặp for + +35 +00:02:28,720 --> 00:02:33,400 +mà chúng ta đã đề cập trước đó. Vì vậy, chúng ta biết rằng chúng ta có thể + +36 +00:02:33,700 --> 00:02:38,700 +sử dụng vòng lặp for như thế này để lặp qua một danh sách cụ thể và nắm giữ từng mục + +37 +00:02:40,060 --> 00:02:43,150 +trong danh sách, như thế này. Vì vậy, trong trường hợp + +38 +00:02:43,180 --> 00:02:48,180 +của chúng ta, tất cả những gì chúng ta phải làm là nói cho chữ cái trong từ + +39 +00:02:49,000 --> 00:02:54,000 +đã chọn, vì vậy điều này sẽ đi qua từng chữ cái đã chọn này và mỗi khi + +40 +00:02:55,390 --> 00:02:57,130 +vòng lặp chạy, chúng ta sẽ + +41 +00:02:57,400 --> 00:03:00,460 +nắm được một trong các chữ cái bên trong từ. . + +42 +00:03:00,850 --> 00:03:05,290 +Vì vậy, lần đầu tiên biến chữ cái đó sẽ bằng a, lần sau + +43 +00:03:05,320 --> 00:03:08,140 +sẽ bằng r, vân vân và vân vân. + +44 +00:03:08,680 --> 00:03:10,900 +Vì vậy, bây giờ bên trong vòng lặp + +45 +00:03:10,990 --> 00:03:15,990 +for của chúng tôi, chúng tôi có thể kiểm tra xem liệu ký tự mà chúng tôi đang xem có + +46 +00:03:18,370 --> 00:03:23,370 +trùng khớp với ký tự mà người dùng đoán hay không và trong trường hợp này, điều đó có + +47 +00:03:23,530 --> 00:03:25,480 +nghĩa là nó trùng khớp, phải không? + +48 +00:03:25,510 --> 00:03:29,470 +Vì vậy, chúng tôi sẽ in một que diêm hoặc trong trường hợp của + +49 +00:03:29,800 --> 00:03:33,850 +tôi, tôi sẽ viết, uh, Đúng vậy. Và khác, cụ thể là nếu nó không + +50 +00:03:33,910 --> 00:03:37,510 +khớp, thì chúng ta sẽ in sai. Đó là nó. + +51 +00:03:37,570 --> 00:03:40,870 +Đó là tất cả những gì chúng ta phải làm để hoàn thành cả ba việc cần làm. + +52 +00:03:41,380 --> 00:03:43,210 +Và bây giờ nếu tôi chạy mã này, bạn + +53 +00:03:43,330 --> 00:03:47,980 +có thể thấy nó sẽ yêu cầu tôi đoán một chữ cái. Vì vậy, hãy đặt một, và sau + +54 +00:03:48,640 --> 00:03:51,850 +đó nó đi qua vòng lặp này từng dòng một để kiểm + +55 +00:03:51,880 --> 00:03:56,740 +tra lại chữ cái mà tôi đã đoán này. Vì vậy, tôi đoán trong trường + +56 +00:03:56,740 --> 00:03:59,230 +hợp này từ được chọn là aardvark. + +57 +00:03:59,590 --> 00:04:04,420 +Vì vậy, khi vòng lặp chạy qua chữ cái đầu tiên a và một kết quả + +58 +00:04:04,480 --> 00:04:08,740 +khớp, vì vậy nó nói đúng. Sau đó, lần tiếp theo nó nhìn + +59 +00:04:08,800 --> 00:04:11,080 +vào chữ cái r, a và r không khớp, + +60 +00:04:11,080 --> 00:04:16,079 +vì vậy chúng tôi sai và nó tiếp tục cho đến khi nó tìm thấy tất cả các điểm trùng + +61 +00:04:16,930 --> 00:04:21,700 +khớp và tất cả các chữ cái không khớp. Bây giờ, nếu bạn muốn kiểm tra mã của + +62 +00:04:22,089 --> 00:04:26,890 +mình với mã của tôi, chỉ cần truy cập vào URL được liệt kê trong tài nguyên khóa học + +63 +00:04:26,890 --> 00:04:29,560 +thuộc nhà máy bia ứng dụng / day-7-Hangman-1-End và tại + +64 +00:04:30,010 --> 00:04:33,070 +đây bạn sẽ có thể xem tất cả mã Tôi đã trải + +65 +00:04:33,070 --> 00:04:36,430 +qua với bạn vừa rồi. Bây giờ, nếu bạn gặp bất + +66 +00:04:36,460 --> 00:04:41,260 +kỳ vấn đề nào khi hiểu cách mã hoạt động hoặc cách đi đến giải pháp cuối + +67 +00:04:41,680 --> 00:04:43,300 +cùng và nếu bạn hoàn + +68 +00:04:43,390 --> 00:04:48,390 +toàn bối rối, tôi khuyên bạn nên đặt mã qua Thonny và chỉ cần nhấp vào gỡ lỗi + +69 +00:04:48,880 --> 00:04:53,290 +để thực hiện từng bước từng cái một. Vì vậy, trong dòng này, chúng + +70 +00:04:53,320 --> 00:04:58,320 +ta sẽ sử dụng mô-đun ngẫu nhiên và giữ một mục ngẫu nhiên từ danh + +71 +00:05:01,360 --> 00:05:02,193 +sách này. + +72 +00:05:02,260 --> 00:05:07,260 +Vì vậy, trong trường hợp này, đó là lạc đà được hái. Và bây giờ con lạc đà đó + +73 +00:05:08,380 --> 00:05:10,600 +sẽ bằng với biến select_word. + +74 +00:05:11,260 --> 00:05:15,010 +Vì vậy, trong bước tiếp theo, chúng tôi yêu cầu người dùng đoán một chữ cái. + +75 +00:05:15,640 --> 00:05:17,290 +Và một khi chúng ta + +76 +00:05:17,530 --> 00:05:21,610 +bước vào đó, nó sẽ in nó ra bảng điều khiển gỡ lỗi. + +77 +00:05:21,910 --> 00:05:26,910 +Và nếu tôi đặt a và nhấn enter, thì dự đoán bây giờ bằng a và có + +78 +00:05:30,280 --> 00:05:33,610 +dự đoán biến thứ hai của chúng tôi, bằng a. + +79 +00:05:34,270 --> 00:05:38,800 +Bây giờ chúng ta rơi vào vòng lặp for của chúng ta. Và nếu chúng ta bước vào vòng + +80 +00:05:39,100 --> 00:05:43,900 +lặp, thì bạn có thể thấy rằng select_word sẽ được thay thế bằng + +81 +00:05:43,930 --> 00:05:48,930 +camel và từng chữ cái sẽ được thay thế bằng từng chữ cái trong + +82 +00:05:49,060 --> 00:05:52,030 +từ đã chọn. Vì vậy, lần đầu tiên + +83 +00:05:52,630 --> 00:05:57,590 +vòng lặp chạy, nó sẽ là c, và sau đó nó kiểm tra xem, nếu c bằng nhau để đoán, + +84 +00:05:57,620 --> 00:06:00,890 +đó là a, có khớp không? Không, nó không. + +85 +00:06:00,890 --> 00:06:05,060 +Vì vậy, nó nhảy sang phần khác và nó in sai. + +86 +00:06:07,460 --> 00:06:10,340 +Và sau đó vòng lặp sẽ bắt đầu lại từ đầu + +87 +00:06:10,400 --> 00:06:13,130 +và chúng ta sẽ chuyển sang chữ cái tiếp theo + +88 +00:06:13,460 --> 00:06:17,480 +trong từ đã chọn, đó là a. Bây giờ trong trường hợp này, chữ cái là + +89 +00:06:17,900 --> 00:06:22,820 +a và khách là a và do đó nên khớp với nhau. Và vì vậy nó sẽ in, + +90 +00:06:22,940 --> 00:06:23,773 +đúng. + +91 +00:06:25,160 --> 00:06:29,030 +Và sau đó về cơ bản nó sẽ lặp đi lặp lại tất cả những điều + +92 +00:06:29,090 --> 00:06:33,230 +này cho đến khi chúng ta đi đến cuối từ và chúng ta in được từ này ra. + +93 +00:06:33,800 --> 00:06:38,090 +Vì vậy, hãy thử chơi với nó và bảng điều khiển gỡ lỗi + +94 +00:06:38,090 --> 00:06:40,940 +để quấn lấy nó. Và một khi bạn tự tin, bạn + +95 +00:06:41,210 --> 00:06:44,240 +biết điều gì đang xảy ra, hãy chuyển sang bài học tiếp theo và hoàn thành bước 2. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/004 Challenge-1-Completed-Code.url b/part1/07 - Day 7 - Beginner - Hangman/004 Challenge-1-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..a6548a47ee238376d175c20b0aac277478394907 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/004 Challenge-1-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-1-End \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/005 Challenge 2 - Replacing Blanks with Guesses.mp4 b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge 2 - Replacing Blanks with Guesses.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9067dbc9ce7ffeea27ed8ac1d1fdffb974b4f37b --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge 2 - Replacing Blanks with Guesses.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48053170a9de09835ce9ec20bd5ada2369b9f1cec7b723611c19558c6f06cecb +size 27996003 diff --git a/part1/07 - Day 7 - Beginner - Hangman/005 Challenge 2 - Replacing Blanks with Guesses_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge 2 - Replacing Blanks with Guesses_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0cb8268556297ed632ecf4cd9ad3edbcfe90c645 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge 2 - Replacing Blanks with Guesses_vi.srt @@ -0,0 +1,176 @@ +1 +00:00:00,180 --> 00:00:02,440 +Được rồi. Vì vậy, bây giờ bạn đã giải quyết + +2 +00:00:02,440 --> 00:00:07,180 +xong bước một, hãy tiếp tục xây dựng dự án của chúng ta bằng cách thực hiện bước hai. Một lần nữa, chúng tôi có + +3 +00:00:07,180 --> 00:00:09,850 +ba việc cần làm trong tệp bắt đầu. + +4 +00:00:10,330 --> 00:00:15,330 +Và những gì chúng tôi sẽ thử và làm ở đây là chúng tôi sẽ + +5 +00:00:15,850 --> 00:00:17,710 +tạo một danh sách với + +6 +00:00:17,740 --> 00:00:22,740 +nhiều ô trống trong số này được thể hiện bằng một chuỗi gạch dưới vì + +7 +00:00:23,110 --> 00:00:28,090 +có các chữ cái trong từ đã chọn. Vì vậy, ví dụ, nếu từ được chọn là quả táo + +8 +00:00:28,450 --> 00:00:33,450 +với năm chữ cái, thì chúng ta sẽ có thể tạo một danh sách với năm mục và mỗi mục trong + +9 +00:00:34,210 --> 00:00:37,810 +số đó là một dấu gạch dưới. Vì vậy, trong giai đoạn tiếp theo, + +10 +00:00:38,140 --> 00:00:43,140 +chúng ta có thể thay thế một số mục bên trong danh sách đó bằng chữ cái chính xác + +11 +00:00:45,100 --> 00:00:48,280 +nếu người dùng đoán đúng. Vì vậy, ví dụ, nếu + +12 +00:00:48,490 --> 00:00:52,090 +từ là quả táo và người dùng đoán chữ cái p, thì + +13 +00:00:52,540 --> 00:00:56,200 +chúng ta sẽ có thể lặp lại từng chữ cái trong từ. + +14 +00:00:56,740 --> 00:01:00,070 +Và đối với mỗi ký tự trùng khớp, chúng tôi thay + +15 +00:01:00,340 --> 00:01:03,190 +thế dấu gạch dưới bằng ký tự thực. + +16 +00:01:03,550 --> 00:01:08,050 +Vì vậy, sau đó chúng tôi kết thúc với một danh sách trông như thế này. Cuối cùng, bạn sẽ in + +17 +00:01:08,080 --> 00:01:13,000 +nó ra và chúng ta sẽ có thể thấy nó trong bảng điều khiển. + +18 +00:01:13,480 --> 00:01:17,230 +Trong tệp bắt đầu, bạn sẽ nhận thấy rằng tôi đã thêm một chút mã thử + +19 +00:01:17,530 --> 00:01:21,970 +nghiệm, đây chỉ là một câu lệnh in cho chúng tôi biết loại gỗ đã chọn là gì và điều + +20 +00:01:22,240 --> 00:01:26,290 +này sẽ giúp chúng tôi gỡ lỗi và tìm ra mã của chúng tôi dễ dàng hơn không + +21 +00:01:26,290 --> 00:01:30,430 +làm những gì chúng ta muốn nó làm. Vì vậy, khi bạn đã hoàn thành tất cả những việc + +22 +00:01:30,430 --> 00:01:35,410 +cần làm trong bước hai, thì đây là những gì bạn sẽ nhận được. Trong trường hợp này, từ được chọn + +23 +00:01:35,470 --> 00:01:38,410 +là khỉ đầu chó. Vì vậy, nếu, tôi + +24 +00:01:38,410 --> 00:01:42,520 +đoán chữ b, bởi vì tôi gian lận và cũng bởi vì tôi đang + +25 +00:01:42,670 --> 00:01:46,060 +cố gắng kiểm tra mã và tôi nhấn enter, thì bạn có + +26 +00:01:46,300 --> 00:01:51,160 +thể thấy rằng nó sẽ in ra một danh sách với một, hai, ba, bốn , năm, + +27 +00:01:51,160 --> 00:01:53,140 +sáu, sáu mục trong đó vì + +28 +00:01:53,410 --> 00:01:56,290 +có sáu chữ cái trong khỉ đầu chó, và mỗi + +29 +00:01:56,860 --> 00:02:00,550 +chữ cái mà tôi đã đoán đúng ở bên phải được thay thế + +30 +00:02:00,890 --> 00:02:05,890 +trong danh sách ở vị trí chính xác. B xuất hiện ở chữ cái đầu tiên và chữ + +31 +00:02:06,670 --> 00:02:07,503 +cái thứ + +32 +00:02:07,750 --> 00:02:12,490 +ba, vì vậy đó là những gì hiển thị trong danh sách này và mọi thứ khác vẫn là + +33 +00:02:12,520 --> 00:02:16,030 +dấu gạch dưới vì chúng là khoảng trống và vẫn cần được đoán. + +34 +00:02:17,530 --> 00:02:20,770 +Hãy thử xem phiên bản cuối cùng của mã và khi bạn đã + +35 +00:02:21,220 --> 00:02:24,490 +sẵn sàng, hãy quay lại, phân nhánh dự án bắt đầu và hoàn + +36 +00:02:24,500 --> 00:02:28,630 +thành việc cần làm theo thứ tự. Bây giờ, nếu bạn cần gợi + +37 +00:02:28,630 --> 00:02:30,940 +ý và gặp khó khăn, hãy nhớ + +38 +00:02:31,270 --> 00:02:35,800 +kiểm tra tài nguyên khóa học để tìm liên kết liên kết đến, trang + +39 +00:02:35,890 --> 00:02:37,630 +Google for Education và đọc + +40 +00:02:37,690 --> 00:02:42,690 +qua phần về hàm phạm vi mà chúng ta đã học trong các bài học + +41 +00:02:43,390 --> 00:02:44,530 +trước . + +42 +00:02:44,800 --> 00:02:49,330 +Nhắc nhở bản thân về cách nó hoạt động và sau đó quay lại mã của bạn và cố gắng giải quyết nó và xem liệu bạn có + +43 +00:02:49,330 --> 00:02:53,320 +thể làm cho nó làm những gì nó cần hay không. Chúc may mắn và tôi sẽ gặp lại + +44 +00:02:53,560 --> 00:02:54,940 +bạn ở phía bên kia, + diff --git a/part1/07 - Day 7 - Beginner - Hangman/005 Challenge-2-Starting-Code.url b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge-2-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..72c91a766918c4bff822b92665dfdd3ba0e58df9 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge-2-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-2-Start \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/005 Challenge-2-Target-Behaviour.url b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge-2-Target-Behaviour.url new file mode 100644 index 0000000000000000000000000000000000000000..1aa883e6b1dde926883939358553be94bfd85a04 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/005 Challenge-2-Target-Behaviour.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-2-End?embed=1&output=1#main.py \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/005 Hint-Python-Lists-and-Range-.url b/part1/07 - Day 7 - Beginner - Hangman/005 Hint-Python-Lists-and-Range-.url new file mode 100644 index 0000000000000000000000000000000000000000..4831055e10543dd59aa7f486990a1bd38433536f --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/005 Hint-Python-Lists-and-Range-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://developers.google.com/edu/python/lists#range \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/006 Challenge 2 Solution - How to Replace the Blanks.mp4 b/part1/07 - Day 7 - Beginner - Hangman/006 Challenge 2 Solution - How to Replace the Blanks.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..97a1b29a897b09874db7ed90a29d4f45b827a618 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/006 Challenge 2 Solution - How to Replace the Blanks.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e20f8c74ae8a267189e90865e9db99312b6206e585ae84b5e3a8a4b38149c6f1 +size 141084249 diff --git a/part1/07 - Day 7 - Beginner - Hangman/006 Challenge 2 Solution - How to Replace the Blanks_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/006 Challenge 2 Solution - How to Replace the Blanks_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8b9ec7608102346ed05aa505304b13aa38d5fc92 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/006 Challenge 2 Solution - How to Replace the Blanks_vi.srt @@ -0,0 +1,640 @@ +1 +00:00:00,430 --> 00:00:03,969 +Được rồi, chúng ta hãy tiếp tục và xem xét giải pháp cùng nhau. Đầu tiên, tôi sẽ phân + +2 +00:00:03,969 --> 00:00:07,870 +tách bản sao tệp bắt đầu của chính mình cho bước hai và + +3 +00:00:08,530 --> 00:00:11,890 +sau đó tôi sẽ xem xét việc cần làm số một. + +4 +00:00:12,400 --> 00:00:15,880 +Vì vậy, mục tiêu là tạo một danh sách trống được gọi là + +5 +00:00:16,480 --> 00:00:19,810 +display, và đối với mỗi chữ cái trong từ đã chọn, hãy + +6 +00:00:20,050 --> 00:00:22,600 +nhớ rằng một từ ngẫu nhiên từ danh + +7 +00:00:23,050 --> 00:00:27,580 +sách này, chúng ta sẽ thêm dấu gạch dưới vào danh sách này được gọi là display. + +8 +00:00:28,270 --> 00:00:30,850 +Vì vậy, nó cho chúng ta biết rằng nếu từ là + +9 +00:00:30,850 --> 00:00:35,650 +quả táo, thì màn hình hiển thị phải chứa năm dấu gạch dưới đại diện cho mỗi chữ cái mà người + +10 +00:00:35,650 --> 00:00:36,640 +dùng cần đoán. + +11 +00:00:37,570 --> 00:00:41,260 +Hãy tiếp tục và chỉ cần nhấp vào chạy trước khi làm bất cứ điều gì đầu tiên. + +12 +00:00:41,770 --> 00:00:46,210 +Và câu lệnh in này sẽ thực thi và nó sẽ cho chúng ta biết rằng + +13 +00:00:46,240 --> 00:00:49,870 +giải pháp là ardvark. Đây là một từ gồm bảy chữ cái. Vì vậy, trong trường + +14 +00:00:49,900 --> 00:00:54,900 +hợp này, chúng ta sẽ cần tạo một danh sách với bảy dấu gạch dưới và bảy mục. + +15 +00:00:55,630 --> 00:00:58,630 +Hãy tiếp tục và tạo một danh sách trống được gọi là hiển thị. + +16 +00:00:59,230 --> 00:01:03,640 +Một danh sách trống chỉ là một tập hợp các dấu ngoặc vuông không có gì bên trong. + +17 +00:01:04,300 --> 00:01:07,090 +Bây giờ, đối với mỗi chữ cái trong từ + +18 +00:01:07,150 --> 00:01:10,690 +đã chọn, chúng ta sẽ thêm dấu gạch dưới vào danh sách này. + +19 +00:01:11,320 --> 00:01:14,230 +Làm thế nào chúng ta có thể thêm một cái gì đó cho mỗi chữ cái? + +20 +00:01:14,770 --> 00:01:19,420 +Cách đơn giản nhất là sử dụng vòng lặp for. Bây giờ, trong trường hợp này, chúng ta có một + +21 +00:01:19,450 --> 00:01:20,283 +sự lựa chọn. + +22 +00:01:20,590 --> 00:01:24,850 +Chúng ta có thể sử dụng kiểu vòng lặp for mà chúng ta đã sử dụng trước đây + +23 +00:01:25,270 --> 00:01:28,060 +ở đây, đó là một cách lặp qua một danh sách. + +24 +00:01:28,390 --> 00:01:31,240 +Vì vậy, chúng ta có thể nói cho chữ cái trong + +25 +00:01:31,600 --> 00:01:35,620 +select_word, vì vậy nó sẽ chạy điều này cho bao nhiêu chữ cái có trong từ này. + +26 +00:01:36,250 --> 00:01:38,260 +Và đối với mỗi chữ cái, + +27 +00:01:38,590 --> 00:01:43,590 +chúng tôi chỉ cần lấy danh sách của mình, hiển thị và thêm một mục vào đó. + +28 +00:01:44,230 --> 00:01:47,230 +Và mục đó sẽ là chuỗi, dấu gạch dưới. + +29 +00:01:48,190 --> 00:01:53,190 +Vì vậy, bây giờ nếu chúng ta tiếp tục và in ra màn hình của mình và xem những gì chúng ta nhận được. + +30 +00:01:56,080 --> 00:01:57,580 +Giải pháp là khỉ + +31 +00:01:57,610 --> 00:02:02,440 +đầu chó có sáu chữ cái và màn hình được in với một, hai, ba, + +32 +00:02:02,440 --> 00:02:05,050 +bốn, năm, sáu dấu gạch dưới bên trong. + +33 +00:02:05,680 --> 00:02:10,680 +Bây giờ hãy chú ý cách ở đây chúng ta không thực sự sử dụng ký tự biến được + +34 +00:02:10,750 --> 00:02:13,990 +tạo ra như thế nào. Chúng tôi đang lặp lại từng chữ cái trong + +35 +00:02:14,020 --> 00:02:17,920 +từ đã chọn, nhưng chúng tôi không làm gì với từng chữ cái. Vì vậy, trên thực tế, chúng ta có thể chỉ + +36 +00:02:17,920 --> 00:02:21,610 +cần thay thế nó bằng một dấu gạch dưới. Ngoài ra, bây giờ chúng + +37 +00:02:21,640 --> 00:02:25,720 +ta có thể tạo vòng lặp for này với một hàm phạm vi. + +38 +00:02:26,230 --> 00:02:31,230 +Và hãy nhớ rằng hàm phạm vi tạo ra một phạm vi số từ 0 đến một + +39 +00:02:32,290 --> 00:02:36,760 +số cụ thể mà bạn chỉ định. Vì vậy, chúng ta cũng có thể + +40 +00:02:37,060 --> 00:02:41,680 +thay vì lặp lại từ đã chọn, hãy sử dụng phạm vi và bên trong ở + +41 +00:02:41,680 --> 00:02:45,250 +đây, chúng ta có thể đặt độ dài của từ đã chọn. + +42 +00:02:46,210 --> 00:02:51,040 +Vì vậy, phạm vi của chúng ta sẽ nằm trong khoảng từ 0 đến độ dài của từ đã chọn. + +43 +00:02:51,310 --> 00:02:56,080 +Vì vậy, nó là một con khỉ đầu chó thì nó sẽ từ 0 đến 6, nhưng không bao gồm 6. + +44 +00:02:56,080 --> 00:02:58,600 +Hãy nhớ rằng đó là cách toán tử phạm vi hoạt động. + +45 +00:02:59,050 --> 00:03:04,050 +Vì vậy, nó sẽ là số không và sau đó nó sẽ là một và cứ thế tiếp tục cho + +46 +00:03:04,210 --> 00:03:05,560 +đến khi nó lên năm. + +47 +00:03:06,280 --> 00:03:11,280 +Và do đó, đó sẽ là tổng cộng sáu vòng lặp thêm sáu trong số những dấu gạch dưới này. + +48 +00:03:11,710 --> 00:03:15,220 +Vì tôi đã cập nhật vòng lặp for này, nếu chúng tôi chạy lại, + +49 +00:03:15,430 --> 00:03:17,140 +bạn có thể thấy nó giống + +50 +00:03:17,380 --> 00:03:21,430 +hệt nhau, nó sẽ tạo ra càng nhiều dấu gạch dưới trong danh sách cũng như + +51 +00:03:21,430 --> 00:03:25,150 +các chữ cái trong từ đã chọn. Vì vậy, trong trường hợp này, bạn + +52 +00:03:25,240 --> 00:03:28,780 +đã sử dụng phiên bản nào không thực sự quan trọng, phiên bản này + +53 +00:03:28,780 --> 00:03:32,200 +của vòng lặp for sử dụng hàm phạm vi hoặc phiên bản trước đó + +54 +00:03:32,410 --> 00:03:37,210 +chỉ lặp lại qua danh sách. Đó là sự lựa chọn của bạn. Cả hai đều làm việc như nhau. + +55 +00:03:38,050 --> 00:03:41,380 +Vì vậy, bây giờ chúng ta hãy chuyển sang việc cần làm số hai. + +56 +00:03:41,950 --> 00:03:45,550 +Bây giờ chúng ta phải lặp lại từng vị trí trong từ đã + +57 +00:03:46,060 --> 00:03:50,350 +chọn và nếu chữ cái ở vị trí đó khớp với chữ cái mà người dùng + +58 +00:03:50,650 --> 00:03:55,090 +đoán, thì chúng ta sẽ hiển thị chữ cái đó trên màn hình ở vị trí đó. + +59 +00:03:55,120 --> 00:04:00,120 +Vì vậy, về cơ bản chúng tôi sẽ thay thế dấu gạch dưới bằng ký tự mà + +60 +00:04:00,220 --> 00:04:02,500 +người dùng đoán nếu họ đoán đúng. + +61 +00:04:03,850 --> 00:04:08,850 +Vì vậy, bây giờ đây có lẽ là phần khó nhất của toàn bộ bước này vì để + +62 +00:04:09,700 --> 00:04:10,420 +làm được + +63 +00:04:10,420 --> 00:04:14,800 +điều này, chúng ta thực sự phải thay đổi vòng lặp for này thành một + +64 +00:04:14,800 --> 00:04:19,800 +vòng lặp sử dụng hàm phạm vi vì chúng ta cần nắm được vị trí khi ký + +65 +00:04:20,800 --> 00:04:25,000 +tự và đoán thực sự. phù hợp. Bằng cách đó, chúng tôi có + +66 +00:04:25,030 --> 00:04:30,030 +thể khai thác vào danh sách và chỉ thay đổi mục ở vị trí cụ thể đó. + +67 +00:04:31,810 --> 00:04:33,970 +Vì vậy, hãy để tôi chỉ cho bạn cách mã sẽ trông như thế nào. + +68 +00:04:34,450 --> 00:04:36,790 +Thay vì nói cho chữ cái + +69 +00:04:36,820 --> 00:04:41,020 +trong ô select_word, chúng ta sẽ nói cho vị trí trong phạm vi + +70 +00:04:42,850 --> 00:04:47,290 +và phạm vi sẽ nằm trong khoảng từ 0 đến chiều dài của ô_cách_chọn. + +71 +00:04:47,740 --> 00:04:50,080 +Và một khi chúng ta đã có điều đó, + +72 +00:04:50,080 --> 00:04:55,080 +thì vòng lặp for sẽ chạy nhiều lần khi có các chữ cái trong từ và đối với mỗi + +73 +00:04:55,120 --> 00:04:56,500 +chữ cái đó, nó + +74 +00:04:56,530 --> 00:05:00,250 +sẽ cho chúng ta một con số, một vị trí để làm việc. + +75 +00:05:00,670 --> 00:05:05,530 +Vì vậy, lần đầu tiên nó chạy, vị trí của nó sẽ bằng 0 vì + +76 +00:05:05,530 --> 00:05:09,490 +chúng ta sẽ xem xét mục đầu tiên trong select_word, trong trường hợp + +77 +00:05:09,610 --> 00:05:11,170 +này sẽ là a. + +78 +00:05:11,620 --> 00:05:14,620 +Và lần sau, vị trí chạy của vòng lặp trở thành một và chúng + +79 +00:05:14,920 --> 00:05:17,440 +ta sẽ xem xét mục thứ hai trong danh sách. + +80 +00:05:18,610 --> 00:05:21,850 +Bây giờ chúng tôi không còn có thư đó để làm việc nữa, đó là lý + +81 +00:05:22,030 --> 00:05:24,130 +do tại sao chúng tôi gặp lỗi ở đây. + +82 +00:05:25,000 --> 00:05:29,440 +Vậy làm thế nào chúng ta có thể nắm được chữ cái hiện tại trong từ đã chọn + +83 +00:05:29,470 --> 00:05:33,640 +mà chúng ta đã biết vị trí? Chà, nó sẽ + +84 +00:05:33,640 --> 00:05:38,640 +đơn giản như nói letter = select_word + +85 +00:05:40,420 --> 00:05:41,320 +[position]. + +86 +00:05:42,250 --> 00:05:47,170 +Bây giờ chúng ta có thể kiểm tra xem chữ cái đó có bằng với chữ cái mà người dùng + +87 +00:05:47,170 --> 00:05:48,130 +đoán hay không. + +88 +00:05:48,670 --> 00:05:53,670 +Sau đó, chúng tôi có thể giữ màn hình của mình và lấy mục ở vị trí hiện tại + +89 +00:05:57,380 --> 00:05:59,900 +và sau đó đặt nó bằng với chữ cái. + +90 +00:06:01,700 --> 00:06:04,160 +Và chúng ta có thể loại bỏ hoàn toàn câu lệnh else. + +91 +00:06:07,990 --> 00:06:12,460 +Vì vậy, bây giờ hãy lưu ý rằng chúng tôi đang sử dụng độ dài của từ đã chọn + +92 +00:06:12,460 --> 00:06:14,830 +ở một số nơi. Vì vậy, nếu bạn muốn, + +93 +00:06:14,830 --> 00:06:19,830 +bạn thực sự có thể đơn giản hóa mã bằng cách tạo một biến mới được gọi là độ + +94 +00:06:19,990 --> 00:06:20,823 +dài từ. + +95 +00:06:23,410 --> 00:06:26,380 +Và bây giờ mỗi khi chúng ta cần sử dụng word_length, chúng ta + +96 +00:06:26,410 --> 00:06:28,990 +chỉ có thể tham chiếu đến biến đó 1: Đúng + +97 +00:06:31,240 --> 00:06:31,560 +không? + +98 +00:06:31,560 --> 00:06:34,140 +điều này sẽ làm cho mã của chúng tôi dễ đọc hơn một chút. + +99 +00:06:35,480 --> 00:06:36,310 +1: Đúng không? + +100 +00:06:36,310 --> 00:06:41,020 +Cuối cùng, tất cả những gì chúng ta phải làm cho bước ba chỉ là in danh sách của + +101 +00:06:41,080 --> 00:06:44,740 +chúng ta được gọi là hiển thị. Và sau đó khi chúng tôi + +102 +00:06:45,190 --> 00:06:48,730 +chạy mã của mình, bạn sẽ có thể thấy rằng nếu giải pháp là + +103 +00:06:49,180 --> 00:06:54,180 +lạc đà, ban đầu, màn hình của chúng tôi bắt đầu với năm ô trống vì có năm chữ cái. + +104 +00:06:55,120 --> 00:06:57,130 +Và khi chúng ta đã đoán được một + +105 +00:06:57,550 --> 00:07:02,550 +chữ cái, thì nó sẽ thay thế chữ cái đó ở đúng vị trí trong danh sách hiển thị đó. + +106 +00:07:04,420 --> 00:07:07,720 +Vì vậy, a chỉ khớp với chữ cái thứ hai, do + +107 +00:07:08,050 --> 00:07:11,650 +đó ô trống thứ hai được thay thế bằng chữ cái này. + +108 +00:07:12,610 --> 00:07:13,210 +Và một + +109 +00:07:13,210 --> 00:07:18,070 +lần nữa, tôi khuyên bạn nên xem lại mã nếu nó khó hiểu hoặc nếu bạn không quản + +110 +00:07:18,070 --> 00:07:23,070 +lý để lấy nó lần đầu tiên thông qua Thonny IDE chỉ để xem nó từng bước và xem + +111 +00:07:23,410 --> 00:07:27,100 +điều gì đang thực sự xảy ra. Chúng tôi đã chọn từ ngẫu nhiên + +112 +00:07:27,700 --> 00:07:30,070 +của mình, trong trường hợp này hóa ra là lạc đà. + +113 +00:07:30,610 --> 00:07:34,210 +Và một khi chúng tôi vào màn hình của mình, nó bắt + +114 +00:07:34,240 --> 00:07:36,190 +đầu như một danh sách trống. + +115 +00:07:36,670 --> 00:07:39,610 +Nhưng ngay sau khi chúng ta tính độ dài từ, + +116 +00:07:40,060 --> 00:07:44,380 +chúng ta có thể tiếp tục và lặp qua phạm vi các số từ 0 + +117 +00:07:44,380 --> 00:07:49,120 +đến độ dài của từ, là năm. Và nó sẽ chạy mã trong vòng + +118 +00:07:49,120 --> 00:07:49,900 +lặp + +119 +00:07:49,900 --> 00:07:54,640 +for chỉ để thêm dấu gạch dưới vào danh sách này năm lần. + +120 +00:07:54,970 --> 00:07:58,660 +Và cuối cùng, sau khi hoàn thành, nó sẽ in nó ra. + +121 +00:07:59,620 --> 00:08:03,640 +Vì vậy, đây là những gì chúng ta nhận được, năm ô trống cho từ lạc đà. + +122 +00:08:04,480 --> 00:08:07,270 +Bây giờ nó yêu cầu người dùng phỏng đoán. + +123 +00:08:07,390 --> 00:08:12,390 +Vì vậy, tôi sẽ đoán ký tự a đó và đi vào vòng lặp for cuối cùng này. + +124 +00:08:13,480 --> 00:08:14,950 +Đây là nơi nó thực sự thú vị. + +125 +00:08:14,950 --> 00:08:17,590 +Vì vậy, chúng ta sẽ đi vào nó để xem nó chi tiết hơn. + +126 +00:08:18,370 --> 00:08:23,370 +Vì vậy, bây giờ phạm vi là một phạm vi giữa không và độ dài từ. + +127 +00:08:24,070 --> 00:08:25,690 +Vì vậy, độ + +128 +00:08:25,840 --> 00:08:30,010 +dài từ là năm để phạm vi đó trở thành từ không + +129 +00:08:30,010 --> 00:08:34,120 +đến năm, không bao gồm năm. Vì vậy, không, một, hai, ba, bốn. + +130 +00:08:34,539 --> 00:08:37,720 +Và điều đó sẽ làm cho vòng lặp chạy năm lần. + +131 +00:08:38,470 --> 00:08:43,470 +Vị trí bắt đầu bằng 0. Và khi vị trí bằng 0 thì + +132 +00:08:44,860 --> 00:08:49,860 +nó sẽ đi vào dòng tiếp theo này, dòng 18, và đặt số 0 ở + +133 +00:08:50,860 --> 00:08:54,400 +đây làm vị trí. Và sau đó chúng ta đi vào + +134 +00:08:54,430 --> 00:08:58,260 +từ đã chọn, đó là lạc đà và chọn ra mục ở vị trí số không. + +135 +00:08:58,980 --> 00:09:03,980 +Và vì vậy chữ cái này trở thành bằng chữ cái c vì đó là chữ cái + +136 +00:09:04,950 --> 00:09:09,180 +ở vị trí số không của từ. Vì vậy, bây giờ trong câu lệnh + +137 +00:09:09,300 --> 00:09:13,560 +if của chúng tôi, chúng tôi kiểm tra xem liệu chữ cái, là c, có + +138 +00:09:13,590 --> 00:09:17,280 +bằng với dự đoán, là a. Trong trường hợp này, c không bằng a + +139 +00:09:17,790 --> 00:09:22,020 +vì vậy chúng ta quay trở lại phần đầu của vòng lặp for và chúng ta chuyển đến số + +140 +00:09:22,020 --> 00:09:23,970 +tiếp theo trong phạm vi, bây giờ là một. + +141 +00:09:24,480 --> 00:09:28,410 +Và chúng tôi sẽ lặp lại điều này nhiều lần. Nhưng trong trường hợp này, + +142 +00:09:28,470 --> 00:09:33,470 +hãy chú ý rằng chữ cái ở vị trí một của lạc đà bằng a. + +143 +00:09:37,110 --> 00:09:41,670 +Vì vậy, bây giờ chữ cái bằng a và đoán là bằng a. + +144 +00:09:41,910 --> 00:09:44,880 +Vì vậy, nếu hai cái đó bằng nhau, thì câu + +145 +00:09:44,910 --> 00:09:49,910 +lệnh if này là đúng và cuối cùng chúng ta sẽ vào bên trong nó để thực + +146 +00:09:50,520 --> 00:09:53,790 +hiện chức năng này. Chữ cái của chúng ta bằng + +147 +00:09:54,540 --> 00:09:58,800 +a, và chúng ta sẽ xem danh sách của chúng ta, cái này được gọi + +148 +00:09:59,430 --> 00:10:03,990 +là display, cái này, và chúng ta sẽ thay thế ký tự thứ hai đó bằng + +149 +00:10:03,990 --> 00:10:07,200 +chữ cái phù hợp. Và nó sẽ làm điều này + +150 +00:10:07,290 --> 00:10:11,970 +lặp đi lặp lại cho đến khi chúng tôi lặp lại năm lần qua tất cả các + +151 +00:10:11,970 --> 00:10:12,720 +chữ cái + +152 +00:10:12,720 --> 00:10:17,720 +trong từ đã chọn và cuối cùng chúng tôi in phiên bản cuối cùng của màn hình với các + +153 +00:10:18,900 --> 00:10:22,500 +chữ cái chính xác được thay thế. Hãy thử giải quyết vấn đề này + +154 +00:10:22,530 --> 00:10:27,420 +nếu bạn hoàn toàn bối rối và có thể bạn cần tra cứu một số nội dung trên Stack Overflow + +155 +00:10:27,450 --> 00:10:28,470 +hoặc bạn có + +156 +00:10:28,710 --> 00:10:33,300 +thể cần xem lại một số bài học mà chúng tôi đã thực hiện trước đây về những thứ + +157 +00:10:33,300 --> 00:10:37,170 +như hàm phạm vi và đối với các vòng lặp, để bạn thực sự, thực sự + +158 +00:10:37,170 --> 00:10:38,370 +chắc chắn rằng bạn biết + +159 +00:10:38,370 --> 00:10:42,570 +điều gì đang xảy ra và chỉ khi đó bạn mới nên tiếp tục bước tiếp theo. + +160 +00:10:43,230 --> 00:10:46,560 +Hãy dành một chút thời gian cho điều này và tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/006 Challenge-2-Completed-Code.url b/part1/07 - Day 7 - Beginner - Hangman/006 Challenge-2-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..3a22b604265aa72b1379416594dce476847f0f1d --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/006 Challenge-2-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-2-End \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/007 Challenge 3 - Checking if the Player has Won.mp4 b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge 3 - Checking if the Player has Won.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..27bc26fd3a2f4f8a8bf8b47375842ec00807d93f --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge 3 - Checking if the Player has Won.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c680de5f4b09375fae0d3074f014f3a7ecc5cc8ffb8d46212593308a9b3a8cb +size 33663259 diff --git a/part1/07 - Day 7 - Beginner - Hangman/007 Challenge 3 - Checking if the Player has Won_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge 3 - Checking if the Player has Won_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6797a3bc0454a338a5827c4365ae280d831af478 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge 3 - Checking if the Player has Won_vi.srt @@ -0,0 +1,204 @@ +1 +00:00:00,220 --> 00:00:01,960 +Được rồi. Vì vậy, cho + +2 +00:00:02,050 --> 00:00:07,050 +đến nay, trò chơi của chúng tôi thực sự không đặc biệt thú vị và đó là bởi vì chúng tôi chưa kích + +3 +00:00:09,220 --> 00:00:10,330 +hoạt khả năng lặp lại. + +4 +00:00:10,810 --> 00:00:15,810 +Vì vậy, chúng tôi cần trò chơi của mình cho phép người dùng đoán chữ cái tiếp theo và + +5 +00:00:17,170 --> 00:00:17,650 +chữ + +6 +00:00:17,650 --> 00:00:22,270 +cái tiếp theo và tiếp tục cho đến khi họ chết hoặc họ tìm được giải pháp. + +7 +00:00:23,430 --> 00:00:26,130 +Vì vậy, trong trường hợp này, giải pháp là ardvark. + +8 +00:00:26,460 --> 00:00:29,040 +Vì vậy, tôi sẽ đoán một chữ cái, a, và + +9 +00:00:29,520 --> 00:00:32,490 +chữ cái đó sẽ được thay thế vào các vị trí chính xác. + +10 +00:00:33,180 --> 00:00:35,820 +Và bây giờ tôi được phép đoán lại. + +11 +00:00:36,510 --> 00:00:41,400 +Và tôi sẽ tiếp tục cho đến khi tôi điền hết các ký tự. + +12 +00:00:41,640 --> 00:00:45,000 +Vì vậy, tôi gần như chỉ cần một chữ 'k' và + +13 +00:00:45,120 --> 00:00:47,970 +chúng tôi sẽ hoàn thành toàn bộ trò chơi. + +14 +00:00:48,480 --> 00:00:51,510 +Và nó cho tôi biết rằng nó đã hoàn thành và tôi đã thắng và trò + +15 +00:00:51,870 --> 00:00:56,870 +chơi cuối cùng cũng kết thúc và thoát ra khỏi vòng lặp. Để đạt được điều này và làm cho trò + +16 +00:00:58,830 --> 00:01:03,420 +chơi của chúng tôi giống một trò chơi hơn, chúng tôi chỉ có một việc cần làm. + +17 +00:01:04,590 --> 00:01:05,040 +Bây + +18 +00:01:05,040 --> 00:01:10,040 +giờ, ý tưởng ở đây là bạn sẽ sử dụng vòng lặp while để cho phép người dùng trở + +19 +00:01:11,010 --> 00:01:15,450 +lại khách sau khi họ đã đoán trước đó. Bây giờ vòng lặp sẽ chỉ dừng + +20 +00:01:15,480 --> 00:01:19,770 +lại khi người dùng đã đoán được tất cả các chữ cái trong từ đã + +21 +00:01:20,220 --> 00:01:25,220 +chọn và điều này có nghĩa là danh sách hiển thị sẽ không còn ô trống trong đó. + +22 +00:01:26,400 --> 00:01:27,420 +Và sau đó tại thời điểm + +23 +00:01:27,450 --> 00:01:30,930 +đó, bạn có thể nói với họ rằng họ đã thắng. Bây giờ để làm được điều + +24 +00:01:31,020 --> 00:01:35,640 +này, và như một gợi ý nhanh, bạn có thể cần phải đọc lại phần mà tôi sẽ + +25 +00:01:35,670 --> 00:01:39,870 +liên kết đến trong tài nguyên khóa học. Và đặc biệt, tôi muốn bạn tập + +26 +00:01:39,930 --> 00:01:42,630 +trung vào từ khóa 'trong' này, bởi vì chúng tôi đã + +27 +00:01:42,870 --> 00:01:46,110 +đề cập nó trước đây trong khóa học chỉ một cách ngắn gọn. + +28 +00:01:46,410 --> 00:01:50,130 +Vì vậy, tôi muốn bạn đọc qua phần này và xem nó hoạt động như thế nào, bởi vì bạn sẽ + +29 +00:01:50,370 --> 00:01:53,760 +cần nó để làm cho phần này hoạt động. Bây giờ, điều + +30 +00:01:53,760 --> 00:01:58,230 +khác cần nhớ là bạn có phủ định trong Python. + +31 +00:01:59,040 --> 00:01:59,910 +Vì vậy, bạn + +32 +00:01:59,910 --> 00:02:04,910 +có thể nói, nếu điều gì đó không đúng và sau đó làm điều gì đó hoặc điều khác. + +33 +00:02:05,700 --> 00:02:10,699 +Vì vậy, không phải là phủ định và điều này về cơ bản lật ngược bất cứ điều gì ở đây. + +34 +00:02:10,830 --> 00:02:14,310 +Vì vậy, nó có thể là, ừm, a = 3. + +35 +00:02:14,940 --> 00:02:19,940 +Nếu không phải là một> 1. + +36 +00:02:21,330 --> 00:02:26,310 +Vì vậy, trong trường hợp này, a là ba, ba lớn hơn một. Vì vậy, điều này trở thành sự thật. + +37 +00:02:26,760 --> 00:02:31,560 +Nhưng bởi vì không có phía trước nó, nên toàn bộ điều này trở thành sai và vì vậy câu + +38 +00:02:31,860 --> 00:02:35,070 +lệnh if này sẽ không được thực hiện trong trường hợp này. + +39 +00:02:35,520 --> 00:02:39,540 +Nhưng nếu giá trị này là 0 và 0 không lớn hơn một, thì điều + +40 +00:02:39,540 --> 00:02:43,470 +này bây giờ là sai và không sai trở thành đúng và bây giờ câu + +41 +00:02:43,830 --> 00:02:46,110 +lệnh if này sẽ được thực hiện đúng. + +42 +00:02:46,530 --> 00:02:50,670 +Vì vậy, đó là cách bạn sử dụng phủ định. Và cuối cùng, bạn có thể cần phải nhắc + +43 +00:02:50,910 --> 00:02:55,500 +nhở bản thân về những gì chúng ta đã học được trong các bài học ngày hôm qua và cách hoạt + +44 +00:02:55,500 --> 00:02:58,140 +động của vòng lặp while. Về cơ bản, bạn + +45 +00:02:58,140 --> 00:03:03,140 +muốn có thể làm cho phần này lặp đi lặp lại nhiều lần, cho đến + +46 +00:03:03,820 --> 00:03:05,080 +khi tất + +47 +00:03:05,080 --> 00:03:09,880 +cả các khoảng trống trong màn hình biến mất và chúng được lấp đầy. + +48 +00:03:10,060 --> 00:03:12,790 +Và tại thời điểm đó, người dùng đã chiến thắng. Và hãy nhớ rằng bạn + +49 +00:03:12,790 --> 00:03:16,750 +không cần phải lo lắng về việc trừng phạt người dùng nếu trả lời sai, chúng ta sẽ + +50 +00:03:16,840 --> 00:03:18,610 +thực hiện điều đó trong bước tiếp theo. + +51 +00:03:18,970 --> 00:03:23,380 +Nhưng hiện tại, hãy tập trung vào việc cần làm này và xem liệu bạn có thể giải quyết được thách thức này hay không. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/007 Challenge-3-Starting-Code.url b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge-3-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..70a05fa373d0aba2d3b850c848dad539807095a1 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge-3-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-3-Start \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/007 Challenge-3-Target-Behaviour.url b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge-3-Target-Behaviour.url new file mode 100644 index 0000000000000000000000000000000000000000..289235432ec6512129bf7b1d7d07f570de750f98 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/007 Challenge-3-Target-Behaviour.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-3-End?embed=1&output=1#main.py \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/008 Challenge 3 Solution - How to Check if the Player Won.mp4 b/part1/07 - Day 7 - Beginner - Hangman/008 Challenge 3 Solution - How to Check if the Player Won.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..65ff72d3114920ac72dea0aeae5efa2cf94d4f00 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/008 Challenge 3 Solution - How to Check if the Player Won.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9b5941ceb6ee98be1fa10eb9bfcea69d8868665cf73e4df35a1368720bb6628 +size 25078292 diff --git a/part1/07 - Day 7 - Beginner - Hangman/008 Challenge 3 Solution - How to Check if the Player Won_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/008 Challenge 3 Solution - How to Check if the Player Won_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d3e3ce54ddb748ef04b851668a59de4c31af4a50 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/008 Challenge 3 Solution - How to Check if the Player Won_vi.srt @@ -0,0 +1,220 @@ +1 +00:00:00,070 --> 00:00:02,170 +Được rồi, vậy chúng ta hãy cùng nhau tìm hiểu giải pháp. + +2 +00:00:02,680 --> 00:00:07,680 +Bây giờ chúng ta biết rằng phần mà chúng ta cần lặp lại là phần này mà chúng ta + +3 +00:00:08,530 --> 00:00:11,890 +yêu cầu người dùng đoán đi đoán lại một chữ cái cho + +4 +00:00:12,220 --> 00:00:16,090 +đến khi họ điền vào tất cả các ô trống trong màn hình này. + +5 +00:00:16,720 --> 00:00:21,720 +Bước đầu tiên là quấn một vòng lặp xung quanh khối mã này để chúng + +6 +00:00:23,200 --> 00:00:28,200 +ta có thể chọn toàn bộ khối mã và bạn có thể thụt lề riêng + +7 +00:00:28,510 --> 00:00:33,510 +lẻ hoặc chỉ chọn tất cả và nhấn lệnh và dấu ngoặc vuông bên phải. + +8 +00:00:34,360 --> 00:00:37,600 +Và điều đó sẽ thay đổi mọi thứ theo một mức thụt lề và + +9 +00:00:37,870 --> 00:00:41,140 +điều đó có hiệu quả đưa nó vào bên trong vòng lặp while của chúng tôi. + +10 +00:00:41,650 --> 00:00:43,960 +Vì vậy, bây giờ chúng ta phải xác định vòng lặp while của chúng ta. + +11 +00:00:44,290 --> 00:00:48,100 +Vì vậy, trong khi điều gì đó là đúng hoặc trong khi điều gì đó + +12 +00:00:48,340 --> 00:00:53,170 +là sai, hãy lặp lại mã này nhiều lần. Vậy chính xác thì tình trạng của chúng ta là gì? + +13 +00:00:54,130 --> 00:00:59,130 +Chúng tôi biết rằng chúng tôi chỉ muốn vòng lặp của chúng tôi kết thúc khi không còn + +14 +00:00:59,710 --> 00:01:02,830 +khoảng trống nào bên trong danh sách được gọi là display. + +15 +00:01:03,550 --> 00:01:08,550 +Tại sao chúng ta không tạo một biến mà chúng ta sẽ gọi là end_of_game và đặt biến đó thành + +16 +00:01:10,750 --> 00:01:11,320 +false để + +17 +00:01:11,320 --> 00:01:16,320 +bắt đầu vì nó vẫn chưa kết thúc trò chơi. Và mặc dù nó vẫn chưa kết thúc trò chơi, + +18 +00:01:17,290 --> 00:01:22,240 +vì vậy mặc dù điều này là sai. Vì vậy, bạn có thể nói khi kết + +19 +00:01:22,240 --> 00:01:26,710 +thúc trò chơi bằng sai hoặc theo cách khác và tôi nghĩ dễ đọc hơn + +20 +00:01:26,800 --> 00:01:31,800 +một chút là bạn có thể nói khi chưa kết thúc trò chơi, sau đó lặp + +21 +00:01:32,440 --> 00:01:36,250 +lại điều này liên tục. Bây giờ, nếu chúng ta + +22 +00:01:36,280 --> 00:01:38,290 +chạy mã của mình ngay bây giờ, + +23 +00:01:38,320 --> 00:01:41,530 +nó sẽ thực sự lặp lại cho đến mãi mãi. + +24 +00:01:41,620 --> 00:01:44,380 +Nó sẽ không dừng lại bởi vì không có nơi nào trong mã của chúng + +25 +00:01:44,590 --> 00:01:47,410 +tôi, chúng tôi thực sự lật công tắc và thay đổi điều này thành sự thật. + +26 +00:01:48,100 --> 00:01:50,770 +Vậy khi nào thì trò chơi thực sự kết thúc? Chà, đó là + +27 +00:01:50,770 --> 00:01:53,650 +khi màn hình không còn ô trống. + +28 +00:01:54,640 --> 00:01:59,640 +Vì vậy, tại sao chúng ta không kiểm tra cuối cùng sau khi đã in xong + +29 +00:02:01,630 --> 00:02:06,040 +màn hình để xem liệu các ô trống không được hiển thị hay không. + +30 +00:02:07,180 --> 00:02:12,180 +Vì vậy, hãy nhớ điều này trong từ khóa đến từ Python và về cơ bản nó cho phép chúng ta kiểm tra xem liệu một phần tử + +31 +00:02:12,760 --> 00:02:17,760 +cụ thể có tồn tại bên trong một danh sách cụ thể hay không. Vì vậy, trong trường hợp này, chúng tôi đang + +32 +00:02:18,730 --> 00:02:23,260 +kiểm tra xem liệu xoăn có tồn tại trong danh sách hay không và nó có ở đó không. + +33 +00:02:23,260 --> 00:02:26,980 +Tôi có thể xem nó là một trong những yếu tố. Vì vậy, điều này sẽ trở thành sự thật. + +34 +00:02:28,270 --> 00:02:30,220 +Bây giờ, nếu ô trống trong danh + +35 +00:02:30,310 --> 00:02:34,150 +sách không còn đúng nữa, điều đó có nghĩa là chúng tôi đã loại bỏ + +36 +00:02:34,150 --> 00:02:38,110 +tất cả các ô trống và chúng tôi thay thế chúng bằng các chữ cái + +37 +00:02:38,110 --> 00:02:39,700 +mà người dùng đã đoán. + +38 +00:02:40,090 --> 00:02:44,140 +Vì vậy, bây giờ đây là điều kiện cho người dùng đã chiến thắng. + +39 +00:02:44,530 --> 00:02:47,710 +Vì vậy, chúng tôi có thể lật kết thúc trò chơi thành true và điều này có + +40 +00:02:48,340 --> 00:02:50,380 +nghĩa là đây là lần cuối cùng vòng lặp + +41 +00:02:50,500 --> 00:02:55,500 +while của chúng tôi sẽ chạy và chúng tôi sẽ in "Bạn thắng. “Vậy đó, đó là tất cả những + +42 +00:02:57,580 --> 00:03:01,870 +gì chúng tôi cần làm. Và nếu nó hữu ích, bạn có thể một + +43 +00:03:01,930 --> 00:03:06,130 +lần nữa, lấy mã này, đặt nó vào Thonny và chạy qua nó bằng cách sử dụng gỡ lỗi + +44 +00:03:06,220 --> 00:03:10,060 +từng bước để xem nó đang làm gì. Bây giờ điều quan trọng + +45 +00:03:10,120 --> 00:03:15,120 +ở đây là nhận ra rằng các câu lệnh while yêu cầu một số loại thay + +46 +00:03:15,820 --> 00:03:19,090 +đổi xảy ra bên trong vòng lặp while thay đổi + +47 +00:03:19,390 --> 00:03:23,320 +điều kiện mà vòng lặp while phụ thuộc vào và nó có nghĩa + +48 +00:03:23,680 --> 00:03:28,240 +là mã thoát khỏi vòng lặp while. Vì vậy, trong trường hợp này, đó + +49 +00:03:28,270 --> 00:03:32,380 +là khi không còn khoảng trống nào bên trong danh sách hiển thị. + +50 +00:03:32,920 --> 00:03:34,330 +Nhưng trong các bước + +51 +00:03:34,390 --> 00:03:37,600 +sau, chúng tôi sẽ thay đổi điều đó để khi người dùng + +52 +00:03:37,870 --> 00:03:41,620 +hết mạng, thì trò chơi cũng sẽ kết thúc và họ sẽ thua cuộc. + +53 +00:03:42,880 --> 00:03:45,220 +Vì vậy, hãy dành một chút thời gian, xem lại bài học này, + +54 +00:03:45,370 --> 00:03:47,500 +đảm bảo rằng bạn hiểu mọi thứ đang diễn ra. + +55 +00:03:47,890 --> 00:03:51,520 +Sau đó, hãy chuyển sang bài học tiếp theo và chúng ta sẽ giải quyết bước tiếp theo. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/008 Challenge-3-Completed-Code.url b/part1/07 - Day 7 - Beginner - Hangman/008 Challenge-3-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..92b3a06d4b6bf82fedfbb5915eec87369cdd8a09 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/008 Challenge-3-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-3-End \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/009 Amended-Hangman-Flowchart.png b/part1/07 - Day 7 - Beginner - Hangman/009 Amended-Hangman-Flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..2770fabc1b656ae7c2f7c9290ad4292dc5dbfc4f Binary files /dev/null and b/part1/07 - Day 7 - Beginner - Hangman/009 Amended-Hangman-Flowchart.png differ diff --git a/part1/07 - Day 7 - Beginner - Hangman/009 Challenge 4 - Keeping Track of the Player's Lives.mp4 b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge 4 - Keeping Track of the Player's Lives.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..126ef7d81fbbf450affd4b92c3b86c50804b29fa --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge 4 - Keeping Track of the Player's Lives.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9022fb220c55b29d0631f40526264360215350fb40adf7f54e8fdd82eee7f987 +size 12844795 diff --git a/part1/07 - Day 7 - Beginner - Hangman/009 Challenge 4 - Keeping Track of the Player's Lives_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge 4 - Keeping Track of the Player's Lives_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ffeae4c4d59b264a92c1fa38270852aba4fe7b00 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge 4 - Keeping Track of the Player's Lives_vi.srt @@ -0,0 +1,136 @@ +1 +00:00:00,230 --> 00:00:04,640 +Làm tốt để chuyển sang bước 4. Bây giờ trong bước này khi + +2 +00:00:04,700 --> 00:00:07,310 +bạn xem tệp bắt đầu, bạn sẽ thấy rằng + +3 +00:00:07,340 --> 00:00:11,390 +tôi đã kết hợp một loạt các nghệ thuật ASCII, vì vậy nghệ thuật + +4 +00:00:11,420 --> 00:00:15,050 +được tạo ra bằng cách sử dụng các nét của bàn phím. + +5 +00:00:15,560 --> 00:00:20,560 +Và bạn có thể thấy rằng điều này đại diện cho các giai đoạn của trò chơi treo cổ của chúng tôi bắt + +6 +00:00:20,930 --> 00:00:25,790 +đầu từ nơi họ có tất cả sáu mạng sống và sau đó đi xuống các mạng sống cho đến khi họ + +7 +00:00:25,850 --> 00:00:28,970 +không còn mạng sống nữa, nơi mà nhân vật treo cổ đã hoàn thành. + +8 +00:00:29,630 --> 00:00:33,710 +Điều này đã được bao gồm dưới dạng một danh sách và bên trong danh + +9 +00:00:33,860 --> 00:00:36,980 +sách mỗi tác phẩm nghệ thuật này là một chuỗi đơn. + +10 +00:00:37,040 --> 00:00:40,610 +Vì vậy, chúng tôi sẽ in nó ra trong bước này và chúng tôi + +11 +00:00:40,730 --> 00:00:44,000 +sẽ sử dụng nó để cung cấp cho người dùng phản hồi. + +12 +00:00:45,080 --> 00:00:49,670 +Vì vậy, việc cần làm cho bước bốn bao gồm tạo một biến gọi + +13 +00:00:49,670 --> 00:00:54,670 +là cuộc sống để theo dõi số lượng cuộc sống và cuộc sống phải bằng sáu. + +14 +00:00:55,760 --> 00:00:57,080 +Bây giờ trong việc cần làm + +15 +00:00:57,380 --> 00:01:02,120 +tiếp theo, chúng tôi đang kiểm tra xem liệu dự đoán có thực sự không phải là một chữ cái trong từ đã chọn + +16 +00:01:02,420 --> 00:01:05,480 +hay không, sau đó chúng tôi sẽ giảm thời gian sống của biến đó đi một. + +17 +00:01:05,840 --> 00:01:09,020 +Vì vậy, cuối cùng nó sẽ đi xuống hoàn toàn bằng không. + +18 +00:01:09,230 --> 00:01:13,940 +Và khi điều đó xảy ra, trò chơi sẽ dừng lại và nó sẽ in "Bạn thua. "Bây giờ, phần này thực sự + +19 +00:01:14,420 --> 00:01:18,950 +quan trọng bởi vì chúng tôi muốn trò chơi dừng lại khi số + +20 +00:01:18,980 --> 00:01:21,620 +mạng đã trôi về con số không. + +21 +00:01:22,040 --> 00:01:26,120 +Vì vậy, mã sẽ thoát khỏi vòng lặp while và in "Bạn thua. “Vì vậy ngoài thắng là điều kiện + +22 +00:01:26,330 --> 00:01:29,780 +để kết thúc trò chơi thì thua cũng là điều kiện + +23 +00:01:30,050 --> 00:01:34,070 +để kết thúc trò chơi. Bây giờ, việc cuối cùng cần + +24 +00:01:34,070 --> 00:01:38,360 +làm chỉ là in tác phẩm ASCII từ các giai đoạn là danh sách + +25 +00:01:38,360 --> 00:01:40,160 +này ở trên đây và giai + +26 +00:01:40,610 --> 00:01:44,360 +đoạn phải đại diện cho số lượng mạng hiện tại mà người + +27 +00:01:44,360 --> 00:01:46,790 +dùng còn lại. Vì vậy, theo cách + +28 +00:01:46,790 --> 00:01:50,300 +này, khi chúng tôi thực sự chơi trò chơi và chúng tôi viết + +29 +00:01:50,810 --> 00:01:55,810 +sai tất cả các chữ cái, mỗi lần một phần mới của người treo cổ sẽ được vẽ cho đến + +30 +00:01:56,060 --> 00:02:01,060 +khi cuối cùng chúng tôi kết thúc với toàn bộ bản vẽ và trò chơi kết thúc, và nó cho + +31 +00:02:01,400 --> 00:02:05,450 +biết chúng tôi mà chúng tôi đã mất. Nếu nó hữu ích, hãy tham + +32 +00:02:05,480 --> 00:02:08,389 +khảo lưu đồ. Và khi bạn đã + +33 +00:02:08,419 --> 00:02:12,110 +sẵn sàng, hãy tiếp tục và phân nhánh mã bắt đầu và + +34 +00:02:12,110 --> 00:02:15,950 +giải quyết từng việc cần làm. Chúc may mắn và tôi sẽ gặp lại bạn ở phía bên kia. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/009 Challenge-4-Starting-Code.url b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge-4-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..479c5f474d472a2e80f9f7a79a4333190492d1b3 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge-4-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-4-Start \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/009 Challenge-4-Target-Behaviour.url b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge-4-Target-Behaviour.url new file mode 100644 index 0000000000000000000000000000000000000000..5f3222eefb3af19017deda23a945c2638d5e3198 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/009 Challenge-4-Target-Behaviour.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-4-End?embed=1&output=1#main.py \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/010 Challenge 4 Solution - How to Keep Track of the Player's Lives.mp4 b/part1/07 - Day 7 - Beginner - Hangman/010 Challenge 4 Solution - How to Keep Track of the Player's Lives.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fffc57e1d5d26a4e463c28ca184cecac0d7624f9 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/010 Challenge 4 Solution - How to Keep Track of the Player's Lives.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43945ec44321a1ed451b5bdcc3e237ed8f2ad750bc588d9e40dd5bbc5a42c768 +size 76045279 diff --git a/part1/07 - Day 7 - Beginner - Hangman/010 Challenge 4 Solution - How to Keep Track of the Player's Lives_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/010 Challenge 4 Solution - How to Keep Track of the Player's Lives_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d32364d1cd271100836f6d9b74f582d633b2fa50 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/010 Challenge 4 Solution - How to Keep Track of the Player's Lives_vi.srt @@ -0,0 +1,368 @@ +1 +00:00:00,070 --> 00:00:04,120 +Được rồi. Vì vậy, hãy chắc chắn rằng bạn đã thử + +2 +00:00:04,330 --> 00:00:09,160 +trước khi đến đây, vì tôi sắp tiết lộ giải pháp. Về bước 4, ở đây tôi đã có + +3 +00:00:09,160 --> 00:00:13,660 +một bản sao mã được chia nhỏ. Và nếu tôi cuộn xuống việc cần + +4 +00:00:13,660 --> 00:00:16,180 +làm số một, điều này khá đơn giản. + +5 +00:00:16,360 --> 00:00:19,300 +Nó chỉ yêu cầu chúng ta tạo một biến mới được gọi + +6 +00:00:19,660 --> 00:00:23,350 +là cuộc sống và biến này sẽ là biến sẽ theo dõi số lượng cuộc + +7 +00:00:23,350 --> 00:00:27,040 +sống mà người dùng còn lại. Và để bắt + +8 +00:00:27,070 --> 00:00:32,049 +đầu, nó sẽ bằng sáu. Bây giờ chúng ta chuyển sang việc cần làm số hai. + +9 +00:00:32,380 --> 00:00:36,910 +Và nó cho chúng ta biết rằng nếu người đoán không phải là một chữ cái trong từ + +10 +00:00:37,150 --> 00:00:40,210 +đã chọn, thì chúng ta phải giảm số mạng người đi một. + +11 +00:00:40,690 --> 00:00:45,340 +Bây giờ có thể thực sự hấp dẫn nếu đặt điều này như một tuyên bố khác ở + +12 +00:00:45,820 --> 00:00:48,250 +đây, bởi vì nếu chữ cái giống nhau để + +13 +00:00:48,260 --> 00:00:52,600 +đoán, thì rõ ràng là nó khớp. Vậy thì khác, điều đó có nghĩa là nó không khớp. + +14 +00:00:53,020 --> 00:00:56,500 +Nhưng hãy kiểm tra những gì sẽ xảy ra ở đây nếu tôi chỉ in một câu lệnh đơn giản. + +15 +00:00:58,090 --> 00:01:01,870 +Vì vậy, bây giờ nếu tôi nhấn run và chúng tôi nhìn vào phía bên phải, + +16 +00:01:02,140 --> 00:01:04,209 +bạn có thể thấy rằng nếu tôi đoán + +17 +00:01:04,569 --> 00:01:09,190 +là a, thì bạn có thể thấy rằng chúng tôi nhận được 'không khớp' được in năm lần và + +18 +00:01:09,640 --> 00:01:14,640 +điều đó sẽ cho bạn thấy rằng điều này thực sự không phải nơi chúng ta muốn viết mã cho việc + +19 +00:01:14,650 --> 00:01:16,300 +cần làm số hai, vì hãy + +20 +00:01:16,330 --> 00:01:21,330 +nhớ việc cần làm số hai cho biết nếu chữ cái được đoán không phải là chữ cái trong từ đã + +21 +00:01:21,520 --> 00:01:26,260 +chọn, thì chúng ta nên giảm số mạng đi một. Nhưng trên thực tế, những gì đang xảy + +22 +00:01:26,260 --> 00:01:31,260 +ra ở đây là nó lặp lại toàn bộ độ dài của từ và đối với mỗi + +23 +00:01:31,930 --> 00:01:35,260 +chữ cái trong từ đã chọn đó, nếu chữ cái không + +24 +00:01:35,680 --> 00:01:37,750 +khớp với dự đoán, thì nó sẽ + +25 +00:01:37,810 --> 00:01:39,580 +kích hoạt câu lệnh khác. + +26 +00:01:40,780 --> 00:01:43,930 +Đây không phải là những gì chúng tôi muốn bởi vì trong trường hợp này, + +27 +00:01:43,990 --> 00:01:46,900 +a thực sự khớp với một chữ cái trong từ khỉ đầu chó, nhưng + +28 +00:01:47,140 --> 00:01:49,690 +chúng tôi sẽ không trùng khớp khi được gọi năm lần. + +29 +00:01:50,260 --> 00:01:53,680 +Vì vậy, thay vào đó, chúng tôi muốn viết nó bên ngoài vòng + +30 +00:01:53,710 --> 00:01:55,990 +lặp for, vì vậy ở cùng một mức thụt + +31 +00:01:56,380 --> 00:02:01,380 +lề và gợi ý là việc cần làm thực sự ở cùng mức với nơi mã câu trả lời + +32 +00:02:01,480 --> 00:02:04,150 +của bạn cần đi. Vì vậy, ở đây, + +33 +00:02:04,150 --> 00:02:09,150 +chúng ta sẽ viết một câu lệnh if và chúng ta sẽ kiểm tra xem liệu đoán + +34 +00:02:09,160 --> 00:02:11,560 +có nằm trong từ đã chọn hay không. + +35 +00:02:12,220 --> 00:02:14,560 +Và về cơ bản điều này thực hiện một kiểm tra riêng biệt. + +36 +00:02:14,590 --> 00:02:17,320 +Nó đi qua toàn bộ từ này và kiểm tra + +37 +00:02:17,350 --> 00:02:20,710 +xem liệu chữ cái được đoán có tồn tại trong đó hay không. + +38 +00:02:20,950 --> 00:02:22,690 +Và nếu điều này là + +39 +00:02:22,990 --> 00:02:27,850 +đúng, thì chúng ta sẽ giảm số mạng người đi một, vì vậy - = 1. + +40 +00:02:29,110 --> 00:02:30,430 +Bây giờ, nếu ở giai + +41 +00:02:30,460 --> 00:02:35,460 +đoạn này sau khi chúng ta lấy đi một mạng sống và số mạng sống giảm xuống còn 0, thì trò chơi sẽ + +42 +00:02:36,280 --> 00:02:39,760 +dừng lại và nó sẽ in "Bạn thua. "Vì vậy, hãy thêm + +43 +00:02:40,210 --> 00:02:44,470 +một câu lệnh if khác vào đây để kiểm tra xem + +44 +00:02:44,470 --> 00:02:48,160 +số lượng mạng sống có bằng, gấp đôi bằng, không. + +45 +00:02:48,340 --> 00:02:53,140 +Và nếu rơi vào trường hợp này thì chúng ta nên thoát game. Và hãy nhớ để làm được điều đó chúng ta + +46 +00:02:53,140 --> 00:02:54,730 +cần thoát khỏi vòng lặp while. + +47 +00:02:55,180 --> 00:02:58,540 +Và vòng lặp while phụ thuộc vào biến end_of_game này, + +48 +00:02:58,900 --> 00:03:03,430 +biến này bắt đầu là sai. Và khi chúng tôi muốn thoát khỏi trò chơi, khi thực tế là kết + +49 +00:03:03,430 --> 00:03:06,850 +thúc trò chơi, chúng tôi chuyển nó thành true. Ví dụ như, trong trường + +50 +00:03:06,850 --> 00:03:10,660 +hợp này, khi người dùng đã thắng. Vì vậy, ở đây, khi số + +51 +00:03:10,720 --> 00:03:15,280 +mạng bằng 0, chúng ta có thể nói, end_of_game = True, và chúng ta + +52 +00:03:16,270 --> 00:03:19,090 +sẽ in "Bạn thua. "Vì vậy, đó là tất + +53 +00:03:19,990 --> 00:03:23,530 +cả những gì cần thiết để giải quyết việc cần làm số hai. + +54 +00:03:24,490 --> 00:03:26,260 +Vì vậy, bây giờ chúng ta hãy chạy lại mã của chúng ta. + +55 +00:03:27,910 --> 00:03:32,500 +Và bạn có thể thấy rằng nếu tôi cứ đoán sai chữ cái sáu lần, thì + +56 +00:03:34,750 --> 00:03:37,990 +cuối cùng tôi thoát ra khỏi vòng lặp while của mình. + +57 +00:03:38,020 --> 00:03:40,030 +Bạn có thể thấy lời nhắc của tôi hiển thị trở lại. + +58 +00:03:40,420 --> 00:03:44,830 +Và điều này có nghĩa là bây giờ chúng tôi đã bước ra khỏi trò chơi và nó cho chúng tôi biết rằng + +59 +00:03:44,830 --> 00:03:45,663 +chúng tôi đã thua. + +60 +00:03:46,150 --> 00:03:50,020 +Vì vậy, bây giờ tất cả những gì chúng ta phải làm là giải quyết việc cần làm số ba. + +61 +00:03:50,470 --> 00:03:54,940 +Chúng ta phải in tác phẩm ASCII từ danh sách được gọi là các giai đoạn tương ứng với + +62 +00:03:55,270 --> 00:03:59,590 +số mạng hiện tại mà người dùng còn lại. Bây giờ, thật may mắn cho + +63 +00:03:59,620 --> 00:04:00,700 +bạn, tôi + +64 +00:04:00,730 --> 00:04:05,730 +đã sắp xếp từng bức ảnh này theo thứ tự sinh mệnh giảm dần. + +65 +00:04:06,190 --> 00:04:08,830 +Vì vậy, khi bạn có đầy đủ sáu mạng + +66 +00:04:09,250 --> 00:04:12,700 +sống, hình ảnh ở chỉ số sáu là hình ảnh bắt đầu. + +67 +00:04:13,090 --> 00:04:14,770 +Và khi bạn không còn mạng + +68 +00:04:14,800 --> 00:04:19,800 +sống, vì vậy hình ảnh ở chỉ số 0 là hình ảnh mà người treo cổ được vẽ đầy đủ. + +69 +00:04:22,120 --> 00:04:26,710 +Vì vậy, tất cả những gì chúng ta phải làm ở đây chỉ + +70 +00:04:26,980 --> 00:04:28,300 +đơn giản là + +71 +00:04:28,900 --> 00:04:33,580 +in các giai đoạn và tương ứng với số lượng cuộc sống hiện tại. + +72 +00:04:33,610 --> 00:04:35,830 +Vì vậy, chúng tôi đặt các mạng sống bên trong dấu ngoặc vuông. + +73 +00:04:36,340 --> 00:04:40,180 +Và bây giờ nếu chúng tôi chạy lại mã và tiếp tục đoán, bạn có + +74 +00:04:41,920 --> 00:04:46,920 +thể thấy rằng chúng tôi đang xem qua bức tranh treo cổ cho đến khi chúng tôi được vẽ đầy + +75 +00:04:47,110 --> 00:04:49,840 +đủ và chúng tôi thua và kết thúc trò chơi. + +76 +00:04:50,770 --> 00:04:53,170 +Hãy xem nhanh giải pháp và nếu bạn muốn + +77 +00:04:53,620 --> 00:04:55,930 +xem đoạn mã này mà tôi đã viết, thì + +78 +00:04:55,990 --> 00:04:58,960 +như mọi khi, hãy truy cập tài nguyên của khóa học + +79 +00:04:59,200 --> 00:05:02,950 +và bạn sẽ tìm thấy một liên kết đến Day-7-Hangman-4-End và bạn sẽ có thể + +80 +00:05:03,280 --> 00:05:07,510 +xem tất cả mã mà tôi đã viết trong đó, bao gồm, ừm, những thứ hữu ích + +81 +00:05:07,570 --> 00:05:11,500 +như một câu lệnh in mà bạn có thể kích hoạt, chỉ hiển thị cho + +82 +00:05:11,920 --> 00:05:13,840 +bạn vị trí hiện tại, chữ + +83 +00:05:13,840 --> 00:05:16,450 +cái hiện tại và chữ cái đang được đoán . + +84 +00:05:16,480 --> 00:05:18,940 +Vì vậy, bạn có thể thấy như vòng lặp đang + +85 +00:05:19,210 --> 00:05:24,190 +diễn ra những gì thực sự đang xảy ra và nó sẽ giúp bạn gỡ lỗi bất kỳ sự cố nào + +86 +00:05:24,190 --> 00:05:27,760 +trong mã của mình dễ dàng hơn. Vì vậy, nếu bạn gặp bất kỳ sự cố nào + +87 +00:05:28,060 --> 00:05:32,140 +trong mã mà bạn đã viết, đây là một dòng thực sự hữu ích để có thể giúp bạn gỡ lỗi những gì đã xảy ra. + +88 +00:05:32,890 --> 00:05:35,050 +Hy vọng rằng bạn quản lý để làm điều + +89 +00:05:35,200 --> 00:05:39,100 +đó ổn, và khi bạn đã xem xét nhanh chóng và bạn hài lòng với mọi thứ + +90 +00:05:39,100 --> 00:05:40,570 +được đề cập trong bài học + +91 +00:05:40,840 --> 00:05:44,650 +này, hãy chuyển sang bài học tiếp theo và chúng ta sẽ hoàn thành bước cuối + +92 +00:05:44,650 --> 00:05:47,020 +cùng, bước năm dự án treo cổ của chúng tôi. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/010 Challenge-4-Completed-Code.url b/part1/07 - Day 7 - Beginner - Hangman/010 Challenge-4-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..e1af8f8e5974d189dd49fc5fb3e2f46527dd6869 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/010 Challenge-4-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-4-End \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/011 Challenge 5 - Improving the User Experience.mp4 b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge 5 - Improving the User Experience.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9bc46cad2cb7f1e2be6b1877d1ca9af3ad98d1c8 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge 5 - Improving the User Experience.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4b4d26669ae6906aee4fdc7f57dacdcae26a3be0ad6b7349e074820279bb973 +size 40329497 diff --git a/part1/07 - Day 7 - Beginner - Hangman/011 Challenge 5 - Improving the User Experience_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge 5 - Improving the User Experience_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..74aae6573b9d40595c65299db0a351f6e026ad26 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge 5 - Improving the User Experience_vi.srt @@ -0,0 +1,288 @@ +1 +00:00:00,070 --> 00:00:03,969 +Chào! Làm tốt lắm vì đã đến bước cuối cùng của dự án treo cổ. + +2 +00:00:04,450 --> 00:00:05,860 +Bây giờ trong bước + +3 +00:00:05,890 --> 00:00:10,210 +năm, chúng tôi sẽ hoàn thành dự án bằng cách cải thiện trải nghiệm người + +4 +00:00:10,210 --> 00:00:14,440 +dùng trong trò chơi của chúng tôi. Cho đến nay, chúng tôi đã có trò chơi hoạt động, + +5 +00:00:14,770 --> 00:00:19,180 +nhưng chúng tôi đang làm việc chỉ với ba từ, phải không? Ardvark, khỉ đầu chó và + +6 +00:00:19,420 --> 00:00:21,610 +lạc đà. Và đến một lúc nào + +7 +00:00:21,610 --> 00:00:24,970 +đó, trò chơi trở nên khá mệt mỏi khi bạn chỉ đoán được ba từ này. + +8 +00:00:25,480 --> 00:00:25,990 +Và + +9 +00:00:25,990 --> 00:00:29,590 +trên thực tế, các từ đã được chọn để nếu bạn nhìn thấy bảy + +10 +00:00:29,590 --> 00:00:30,423 +ký tự và + +11 +00:00:30,520 --> 00:00:35,520 +bạn biết đó là ardvark, sáu là khỉ đầu chó, năm là lạc đà để giúp bạn gỡ lỗi + +12 +00:00:36,040 --> 00:00:39,820 +mã dễ dàng hơn khi tạo nó. Và rất thường xuyên khi chúng tôi viết mã, + +13 +00:00:39,820 --> 00:00:43,060 +điều đó thực sự rất quan trọng để giúp chính bạn khi bạn đang tạo mã. + +14 +00:00:43,330 --> 00:00:47,440 +Và chỉ khi bạn đã nắm được tất cả logic và mọi thứ hoạt động như mong đợi + +15 +00:00:47,710 --> 00:00:50,560 +thì lúc đó mới thực sự thêm đầy đủ chức năng. + +16 +00:00:51,370 --> 00:00:54,040 +Vì vậy, bên trong mã bắt đầu bước năm + +17 +00:00:54,310 --> 00:00:58,480 +này, nếu bạn xem các tệp ở đây, bạn sẽ nhận thấy hai tệp bổ sung. + +18 +00:00:58,960 --> 00:01:02,050 +Một là hangman_art. py, và ở đây + +19 +00:01:02,440 --> 00:01:07,440 +tôi đã chuyển các giai đoạn treo cổ và tất cả các bản vẽ cũng như + +20 +00:01:09,190 --> 00:01:12,760 +logo trong nghệ thuật ASCII. Vì vậy, khi chúng tôi thực sự + +21 +00:01:13,180 --> 00:01:17,770 +khởi chạy trò chơi của mình lần này, chúng tôi sẽ in logo high man như thế này vào + +22 +00:01:17,770 --> 00:01:18,603 +đầu trò chơi. + +23 +00:01:19,240 --> 00:01:22,870 +Bây giờ tệp thứ hai ở đây là hangman_words. py + +24 +00:01:23,320 --> 00:01:26,710 +Và danh sách từ này bây giờ mở rộng những gì chúng ta đã có trước đây. + +25 +00:01:27,070 --> 00:01:31,690 +Và bây giờ nó là một danh sách khổng lồ các từ, được sắp xếp theo thứ tự + +26 +00:01:32,080 --> 00:01:37,080 +bảng chữ cái mà chúng ta sẽ rút ra và thay thế danh sách từ rất đơn giản trước đây này. + +27 +00:01:39,520 --> 00:01:42,310 +Việc đầu tiên cần làm là cập nhật danh + +28 +00:01:42,310 --> 00:01:46,540 +sách từ để sử dụng danh sách từ đây thay vì danh sách này. + +29 +00:01:46,540 --> 00:01:51,100 +Vì vậy, xóa dòng này và thay thế nó bằng dòng kia. Và để làm điều này, bạn có + +30 +00:01:51,100 --> 00:01:53,530 +thể phải tra cứu các bài học trước, nơi + +31 +00:01:53,530 --> 00:01:58,530 +chúng ta đã nói về cách sử dụng các mô-đun trong Python và cách nhập các tệp khác nhau. + +32 +00:01:59,590 --> 00:02:01,390 +Bây giờ, nếu bạn gặp khó khăn về + +33 +00:02:01,630 --> 00:02:03,640 +cách thực hiện điều đó, hãy xem bên trong + +34 +00:02:03,760 --> 00:02:08,259 +tài nguyên khóa học và có những gợi ý đưa bạn đến tài liệu hướng dẫn cách thực hiện điều này. + +35 +00:02:09,370 --> 00:02:13,090 +Bây giờ, khi bạn đã giải quyết xong việc cần làm số một, hãy cuộn xuống hết cỡ để tìm việc cần làm + +36 +00:02:13,090 --> 00:02:17,470 +số hai, nơi chúng ta sẽ nhập các giai đoạn từ hangman_art. py và đây là điều tương tự khi + +37 +00:02:17,560 --> 00:02:21,160 +sử dụng mô-đun và nhập khẩu. Việc cần làm + +38 +00:02:21,160 --> 00:02:23,530 +thứ ba là nhập logo. + +39 +00:02:23,560 --> 00:02:26,440 +Vì vậy, một, hai, ba là tất cả để làm với các mô-đun và nhập. + +40 +00:02:27,040 --> 00:02:29,050 +Và sau đó khi bạn đến việc cần + +41 +00:02:29,080 --> 00:02:33,310 +làm số bốn, về cơ bản chúng tôi sẽ cải thiện trải nghiệm người dùng để cho người dùng + +42 +00:02:33,310 --> 00:02:36,400 +biết rằng họ đã nhập một bức thư mà họ đã đoán trước đó. + +43 +00:02:36,910 --> 00:02:40,480 +Và khi điều đó xảy ra, chúng tôi sẽ in thư và chỉ cho họ biết. + +44 +00:02:40,900 --> 00:02:42,100 +Bạn không phải trừng phạt chúng + +45 +00:02:42,320 --> 00:02:45,640 +và bạn không phải lấy đi một mạng sống và bạn không cần phải khởi động lại trò chơi. + +46 +00:02:45,730 --> 00:02:48,520 +Đó chỉ là một cú huých nhẹ nhàng và cho họ biết + +47 +00:02:48,520 --> 00:02:53,520 +rằng họ đã thực sự đoán được bức thư đó. Bây giờ đến số việc cần làm năm và việc cần làm cuối + +48 +00:02:53,800 --> 00:02:57,610 +cùng, chúng tôi sẽ cho người dùng biết nếu chữ cái mà họ đoán không có trong từ đã chọn. + +49 +00:02:58,030 --> 00:02:58,810 +Vì vậy, trong trường + +50 +00:02:58,810 --> 00:03:02,560 +hợp này, chúng tôi sẽ in ra chữ cái mà họ đoán và cho họ biết rằng nó không có + +51 +00:03:02,560 --> 00:03:03,130 +trong từ + +52 +00:03:03,130 --> 00:03:07,240 +đó, chỉ là một chút phản hồi để làm cho trò chơi dễ dàng hơn một chút đối với người dùng. + +53 +00:03:07,900 --> 00:03:09,790 +Vì vậy, một khi bạn đã hoàn thành tất cả những điều + +54 +00:03:10,090 --> 00:03:13,930 +đó, thì bạn sẽ kết thúc với một trò chơi như thế này. Vì vậy, bởi vì có quá nhiều từ, + +55 +00:03:13,930 --> 00:03:16,690 +tôi nghĩ điều thực sự rất quan trọng là bạn phải + +56 +00:03:16,690 --> 00:03:20,230 +thực sự có dòng mã thử nghiệm này để cho bạn biết giải pháp + +57 +00:03:20,230 --> 00:03:21,580 +thực sự là gì + +58 +00:03:21,880 --> 00:03:25,990 +để bạn có thể kiểm tra tất cả các phần của trò chơi của mình vì bạn + +59 +00:03:25,990 --> 00:03:30,130 +biết từ thực sự nên là gì . Vì vậy, hãy đoán một ký tự không có trong từ đó. + +60 +00:03:30,220 --> 00:03:34,630 +Hãy thử a, và bạn có thể thấy trò chơi cho chúng ta biết "Bạn đoán chữ a, đó không + +61 +00:03:34,990 --> 00:03:37,150 +phải là chữ. Bạn mất một cuộc sống. "Và chúng + +62 +00:03:37,570 --> 00:03:41,890 +tôi kết thúc với cái đầu đã được vẽ sẵn trong giá treo. + +63 +00:03:42,250 --> 00:03:46,360 +Vì vậy, bây giờ chúng ta hãy đoán một chữ cái khác nhau. Hãy đoán một t. + +64 +00:03:46,990 --> 00:03:51,430 +Sau đó, bạn có thể thấy rằng hoạt động như mong đợi. Nhưng nếu chúng ta thử đoán lại T thì sao? + +65 +00:03:51,760 --> 00:03:55,690 +Chà, sau đó nó cho chúng ta biết bạn đã đoán được t và nó cho chúng ta + +66 +00:03:55,720 --> 00:03:59,530 +thấy các ô trống bao gồm cả t. Bây giờ nếu họ đoán một chữ + +67 +00:03:59,560 --> 00:04:04,240 +cái thực sự không có trong từ, vì vậy hãy nói, trong trường hợp này, họ sẽ mất + +68 +00:04:04,240 --> 00:04:08,020 +mạng vì nó thực sự không có trong từ và chúng ta sẽ lấy + +69 +00:04:08,020 --> 00:04:09,370 +đi một mạng sống. + +70 +00:04:10,600 --> 00:04:15,250 +Vì vậy, hãy chơi một vòng với phiên bản cuối của trò chơi. Và như mọi khi, tất cả các liên kết đều + +71 +00:04:15,310 --> 00:04:19,120 +có trong tài nguyên của khóa học. Và khi bạn đã sẵn + +72 +00:04:19,209 --> 00:04:22,480 +sàng, hãy tiếp tục fork tệp bắt đầu và bắt đầu. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/011 Challenge-5-Starting-Code.url b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge-5-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..b483068a865936068591c61d9ccde09d61a94992 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge-5-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-5-Start \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/011 Challenge-5-Target-Behaviour.url b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge-5-Target-Behaviour.url new file mode 100644 index 0000000000000000000000000000000000000000..0946ffe1d6a1a3100a6b8ee306a5d0f1383ef957 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/011 Challenge-5-Target-Behaviour.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-5-End?embed=1&output=1#main.py \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/011 Hint-Flow-Chart-for-Hangman.url b/part1/07 - Day 7 - Beginner - Hangman/011 Hint-Flow-Chart-for-Hangman.url new file mode 100644 index 0000000000000000000000000000000000000000..3cf27eedc1cdddf83aa00152542137271c4b99fc --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/011 Hint-Flow-Chart-for-Hangman.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.diagrams.net/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Step%205#R7VtdW6M4FP41ffZqfcpn62XrOOqszjrq6nq1TywpMALphrS28%2Bs3gYSPBBUtFLR7VXJIgJw35z0fSQfGUbg%2BwWDhXSAHBgN96KwHxpeBrmtDbUh%2FmGSTSiz7MBW42Hd4p1xw7f%2BCYiSXLn0HxqWOBKGA%2BIuycIaiCM5ISQYwRk%2FlbnMUlN%2B6AC5UBNczEKjSO98hXiod66Ncfgp91xNv1sT8QiA685nEHnDQU0FkHA%2BMI4wQSa%2FC9REMmPKEXu7ONnfB%2BaN98u1H%2FC%2F4a%2FrHzffb39OHfX3LkGwKGEbk3Y%2BGehTa4Ofq8ZKsVtduPNXWG%2FHoFQiWXF98rmQjFAgdqk%2FeRJh4yEURCI5z6RSjZeRA9pohbeV9zhFaUKFGhT8hIRu%2BOMCSICrySBjwuzXnxz82Rks8gy%2F0M%2FgyA9iF5IXJc1zZBAtrhWvvBKIQEryhHTAMAPFX5QUF%2BLp0s3657ukFV%2F8bUDYUKK5vJlc3Ch65tpnqnjyfwOsFSBTyRE24rNk5ighXu0anNnUDEMccqJhg9JgZBeudrfDhm0FZQUzg%2BkU1irs21zsnFIM3n3Lr1ITJeQXLNIfbK75yGaiK%2F1g28NLaftUG9K5soJqO9hoLrTMwfujfkHexml4g78dkeTY2rm7X2fR2qnq49snfbPiBxVv3hTtf1vzJSWMjGhGdbmEQa94X7%2BXDkpYYV6ntdnGvVPRwS5T50Evk08%2FOeDaLWzjPaiOJQNPv4qOktZJ9xvtteaiY8gmMIAYEsm9g8wORg0LG%2FAg7LLTDScsDkRuC6B8mjQ8Wm84c4NwPgiMUIJy81nAAHM9n2bDCHXs2hg%2FzHbpMTevaZwqqegbdOImfIzaFhwBEj7EQBtT4IWZXfpQh%2F9kCHKuMVoZCES1zl2hZvfCq29F0Y6ys1%2FTGdtPOuB5Nm0ZrNF3pfIyP4uXb9tb6TuA17N16YZWnJ%2FEjW%2F4eI%2BplDHFSkEkKNTCOuWtOafrzMbOcenbuR8f%2FM7PCuK8y82E3zGxZ9Ux3gjHYFLotWIf4%2BfdosgewhtK6Sp%2FYKC9o4y55Xyuwfu4D2sjudr44tVHTq3MrgrEVgjmLM%2FpPKB%2By3Gug2wGd1fSBkr7tsivhAtJAPe2fhOvGV9UveCh8WMav%2B4TWiF0Kuc0qYq8KucdtEbtufZS4qif2dVjTvnSzV%2FZ1qNjXFVwEbP0Lo0kS4GQp0pUohE0EWG0ZkxQkWXWDJDlxaa7YoOav9zBWlEenR8oaKldqIhRBqazDRSDw3Yg2Z1STFBVjypTlz0Aw4TdC33ESC62CpGy1baEylhjOVlGpIji9NYLbk%2FJwYwQnAoPXGa6zfcnKAoG9Hzi3V1ioAr5S02aXjkx8ZYFkz1EsavWBP08uIxYsLnCav%2FBK%2FUAp3QNMti%2Fc96b6LjtE87CmQ5TzxeawUqOO72jP%2FKEhZ82dO8QPU0ntiUMUSLzuEPVehfxGNzW6bUonWgnmHPW%2BAd0rnMVnF1j2FKx4Ypd8xjKqLJ2gJfOOaJ74zRU7%2FNjDkokulUzs7ksm6l7FyeTimEr%2BvD2%2B2i6aaEuL8o7CqGqvd6c7Cnqnhd23b%2Bg1xzKNF4bqbQuMZChb3tEzuk283%2BN%2BskY37sf8mO7HVOhwgpMkLBmb1BFtEDKiix7iRaI32RNlh29YkA%2F7WbuXy42jmgzanh9Ss6v9KzfKm5J21%2BmVoUZj%2B4eKXAUeDbtGRT2wvX%2BViHHfTEX1HHsHiilhou8Ok%2BfPeJcgueRV1NOsihrQmGzQq2Kqou%2B6UNVOmLRxTXffxO5iJTJq1nkD8whLHJHz5zzv%2F22VxmAYAofNKz9DQTzA8Gzk7Fx%2F8DKtEl5GBbllpy92gpdKblV4lbfZRcVm5qVbGj6LiSPE4JKOtxx8FuBkBrSqgLOrgLPeDBxt5n%2BDTfPc%2FM%2FExvF%2F \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/011 Hint-Importing-Modules.url b/part1/07 - Day 7 - Beginner - Hangman/011 Hint-Importing-Modules.url new file mode 100644 index 0000000000000000000000000000000000000000..25d01c7edde0b5ef5ede1cd7afff926d834d8e01 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/011 Hint-Importing-Modules.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.askpython.com/python/python-import-statement \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/012 Challenge 5 Solution - How to Add ASCII Art and Improve the UI.mp4 b/part1/07 - Day 7 - Beginner - Hangman/012 Challenge 5 Solution - How to Add ASCII Art and Improve the UI.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9c67ef8d6983c861fffa7f34fa323f6253e49636 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/012 Challenge 5 Solution - How to Add ASCII Art and Improve the UI.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de1da8099b82b86c438c303e88f53e43d7984d864c88d225bdbf704789af113f +size 98945863 diff --git a/part1/07 - Day 7 - Beginner - Hangman/012 Challenge 5 Solution - How to Add ASCII Art and Improve the UI_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/012 Challenge 5 Solution - How to Add ASCII Art and Improve the UI_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9c8d4313a4bad1c26d46d926529c0c11adb97476 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/012 Challenge 5 Solution - How to Add ASCII Art and Improve the UI_vi.srt @@ -0,0 +1,388 @@ +1 +00:00:00,130 --> 00:00:03,730 +Được rồi. Vì vậy, chúng ta hãy cùng nhau đi qua giải pháp cho bước cuối cùng này. + +2 +00:00:04,300 --> 00:00:06,970 +Bước đầu tiên yêu cầu chúng ta cập + +3 +00:00:07,060 --> 00:00:10,900 +nhật danh sách từ để sử dụng danh sách từ từ hangman_words. + +4 +00:00:11,470 --> 00:00:13,870 +Và nó thực sự có cùng tên. + +5 +00:00:13,870 --> 00:00:16,540 +Vì vậy, chúng tôi thậm chí không phải thay đổi tất cả nhiều như vậy. + +6 +00:00:17,110 --> 00:00:20,920 +Nhưng những gì chúng ta phải làm là làm cho lỗi này biến mất. + +7 +00:00:21,700 --> 00:00:24,790 +Nếu bạn chưa có, hãy tiếp tục và xóa dòng này trong mã của + +8 +00:00:25,180 --> 00:00:28,300 +bạn nơi bạn có danh sách từ bằng cách sử dụng ba từ trước đó. + +9 +00:00:28,870 --> 00:00:33,870 +Và thay vào đó, chúng tôi sẽ nhập hangman_words. + +10 +00:00:35,860 --> 00:00:40,860 +Và bây giờ chúng ta có thể khai thác vào danh sách từ này bằng + +11 +00:00:41,470 --> 00:00:44,470 +cách viết hangman_ words. danh sách các từ. + +12 +00:00:44,980 --> 00:00:48,130 +Và đây cũng giống như cách chúng ta sử dụng mô-đun ngẫu nhiên. + +13 +00:00:48,140 --> 00:00:52,750 +Vì vậy, chúng tôi đã nhập mô-đun ngẫu nhiên và sau đó khi chúng tôi cần, chúng + +14 +00:00:52,810 --> 00:00:57,730 +tôi chỉ nói ngẫu nhiên. sự lựa chọn. Vì vậy, lựa chọn là một + +15 +00:00:58,000 --> 00:00:59,800 +chức năng bên trong mô-đun ngẫu nhiên, + +16 +00:00:59,800 --> 00:01:04,800 +và chúng ta có thể truy cập nó như vậy. Bây giờ nếu bạn muốn nó + +17 +00:01:05,050 --> 00:01:08,560 +đơn giản hơn một chút về mã mà bạn viết + +18 +00:01:08,560 --> 00:01:13,330 +và bạn không muốn viết lại hangman_words chấm như vậy và tương tự, thì + +19 +00:01:13,360 --> 00:01:16,690 +thay vì chỉ nhập từ treo cổ, bạn thực sự + +20 +00:01:16,690 --> 00:01:20,200 +có thể viết từ nhập từ hangman. danh sách từ. + +21 +00:01:20,680 --> 00:01:25,680 +Vì vậy, bây giờ chúng ta có thể loại bỏ phần này và chúng ta chỉ có thể sử dụng mã trước đó mà chúng ta + +22 +00:01:27,130 --> 00:01:28,300 +đã có trên dòng 7. + +23 +00:01:30,430 --> 00:01:33,460 +Sử dụng điều đó, bạn có thể làm điều tương tự + +24 +00:01:33,460 --> 00:01:37,540 +cho việc cần làm số hai. Từ hangman_art, bạn có thể nhập các giai + +25 +00:01:37,570 --> 00:01:42,570 +đoạn và điều đó sẽ làm cho lỗi này biến mất. Và đối với việc + +26 +00:01:43,810 --> 00:01:45,820 +cần làm + +27 +00:01:45,880 --> 00:01:49,300 +thứ ba, bạn có thể nói + +28 +00:01:49,330 --> 00:01:52,300 +lại từ hangman_art nhập logo. + +29 +00:01:53,080 --> 00:01:56,080 +Và sau đó chúng tôi có thể chỉ cần in logo. + +30 +00:01:56,770 --> 00:01:58,990 +Bây giờ hãy chú ý cách chúng + +31 +00:01:59,080 --> 00:02:03,460 +tôi đang nhập, ừm, hai thứ khác nhau từ cùng một tệp, nghệ thuật treo cổ. + +32 +00:02:03,640 --> 00:02:05,830 +Vì vậy, nếu bạn không muốn viết + +33 +00:02:05,860 --> 00:02:10,600 +nó hai lần, trên thực tế, bạn cũng có thể chỉ cần nói từ hangman_art nhập logo, + +34 +00:02:10,870 --> 00:02:15,640 +các giai đoạn và điều này sẽ nhập cả biểu trưng và các giai đoạn và bạn + +35 +00:02:15,730 --> 00:02:18,070 +sẽ thấy rằng không có lỗi ở đây. + +36 +00:02:19,810 --> 00:02:21,550 +Nếu điều đó hoàn toàn khó + +37 +00:02:21,670 --> 00:02:25,810 +hiểu, hãy nhớ đọc qua tài liệu mà tôi đã liên kết đến trong tài nguyên + +38 +00:02:25,810 --> 00:02:29,890 +khóa học nói về tất cả các mô-đun Python và nhập để bạn có thể + +39 +00:02:30,220 --> 00:02:35,220 +tự làm quen với điều này một lần nữa. Bây giờ là việc cần làm bốn, chúng + +40 +00:02:35,710 --> 00:02:39,400 +ta sẽ kiểm tra xem liệu người dùng đã nhập một chữ cái + +41 +00:02:39,400 --> 00:02:43,390 +mà họ đã đoán hay chưa. Và nếu đó là một bức thư mà họ đã đúng, thì + +42 +00:02:43,720 --> 00:02:47,650 +chúng tôi sẽ in bức thư và cho họ biết. Để làm điều này, chúng tôi + +43 +00:02:47,710 --> 00:02:49,930 +sẽ kiểm tra màn hình, đó là + +44 +00:02:50,140 --> 00:02:52,660 +danh sách các chữ cái mà họ đã đoán. + +45 +00:02:53,260 --> 00:02:58,260 +Và chúng tôi sẽ kiểm tra xem liệu đoán có trong danh sách hiển thị hay không, trong trường hợp này, họ + +46 +00:03:02,020 --> 00:03:05,260 +đã đoán được chữ cái đó và nó là một chữ cái chính xác. + +47 +00:03:05,590 --> 00:03:10,030 +Vì vậy, chúng tôi sẽ in ra các phản hồi rằng, ừm, "Bạn đã đoán được và + +48 +00:03:10,060 --> 00:03:12,460 +sau đó chúng tôi sẽ đưa vào lá thư + +49 +00:03:12,640 --> 00:03:15,220 +đã đoán của họ. "Tuy nhiên, bây + +50 +00:03:17,830 --> 00:03:21,070 +giờ, nếu chữ cái không có trong từ đã + +51 +00:03:21,130 --> 00:03:24,670 +chọn, thì chúng ta sẽ in chữ cái ra và + +52 +00:03:26,770 --> 00:03:30,250 +cho họ biết rằng" Bạn đoán chữ cái cụ thể + +53 +00:03:31,870 --> 00:03:34,120 +này, nó không có trong từ. + +54 +00:03:36,340 --> 00:03:40,630 +Bạn mất một cuộc sống. " Đó là nó. + +55 +00:03:40,720 --> 00:03:45,580 +Đó là tất cả những gì chúng tôi phải làm và nếu chúng tôi chạy ứng dụng của mình như hiện tại, + +56 +00:03:45,910 --> 00:03:48,730 +thì bạn có thể thấy rằng giải pháp đã bị hạn chế. + +57 +00:03:48,760 --> 00:03:51,700 +Vì vậy, nếu chúng ta chỉ kiểm tra, ừm, chống lại s + +58 +00:03:51,760 --> 00:03:55,090 +thì nó sẽ được thêm vào, và nếu chúng ta nhận được một chữ + +59 +00:03:55,600 --> 00:03:57,700 +cái sai, thì chúng ta sẽ được thông báo + +60 +00:03:58,510 --> 00:04:01,780 +rằng nó không có trong từ. Bạn mất một cuộc sống. + +61 +00:04:01,960 --> 00:04:04,030 +Và người treo cổ của chúng ta đang được rút ra. + +62 +00:04:04,630 --> 00:04:08,830 +Và nếu chúng ta đoán đúng một chữ cái mà chúng ta đã đoán lại giống như s, + +63 +00:04:09,250 --> 00:04:12,790 +thì nó cho chúng ta biết rằng bạn đã đoán được chữ cái đó. + +64 +00:04:13,510 --> 00:04:17,170 +Bây giờ bạn có thể chọn giữ lại tất cả các báo cáo in này nếu + +65 +00:04:17,200 --> 00:04:21,459 +nó giúp bạn hiểu chuyện gì đang xảy ra, hoặc cách khác ở giai đoạn này, nó có thể + +66 +00:04:21,620 --> 00:04:25,210 +khiến mọi thứ hơi khó hiểu và bạn có thể chỉ cần bình luận. + +67 +00:04:26,050 --> 00:04:28,570 +Hãy xem phiên bản cuối cùng bằng cách + +68 +00:04:28,600 --> 00:04:33,160 +truy cập tài nguyên khóa học, nơi tôi sẽ liên kết đến mã hoàn chỉnh + +69 +00:04:33,160 --> 00:04:37,720 +mà tôi đã viết ở đây. Và bạn có thể đọc qua nó và so sánh với của bạn. + +70 +00:04:38,200 --> 00:04:42,040 +Nhưng về cơ bản đây là tất cả những gì cần có đối với dự án này + +71 +00:04:42,130 --> 00:04:46,750 +và bây giờ bạn đã hoàn thành nó toàn bộ. Khi bạn hài lòng với mã của + +72 +00:04:46,780 --> 00:04:50,680 +mình, hãy tiếp tục và xóa tất cả các nhận xét không còn hữu ích + +73 +00:04:50,680 --> 00:04:54,190 +như tất cả các việc cần làm và mã thử nghiệm bởi vì + +74 +00:04:54,220 --> 00:04:57,760 +nếu bạn muốn chơi trò chơi thật, thì đó chỉ là gian lận. + +75 +00:04:58,240 --> 00:05:00,790 +Nếu bạn muốn để lại một số nhận xét cho + +76 +00:05:00,790 --> 00:05:04,030 +bạn biết mỗi phần của mã có tác dụng gì để khi bạn + +77 +00:05:04,330 --> 00:05:07,360 +quay lại, dễ hiểu hơn, thì hãy thoải mái làm điều đó. + +78 +00:05:07,930 --> 00:05:12,700 +Nhưng điều cuối cùng mà tôi muốn cho bạn thấy là điều gì xảy ra nếu bạn muốn + +79 +00:05:12,700 --> 00:05:16,450 +nó có thể xóa màn hình sau mỗi câu trả lời, bởi vì bạn + +80 +00:05:16,870 --> 00:05:20,650 +có thể thấy rằng một số điểm bạn phải tiếp tục cuộn và nó + +81 +00:05:20,650 --> 00:05:23,770 +hơi khó hiểu về giai đoạn nào. bạn đang ở trong. + +82 +00:05:24,250 --> 00:05:29,250 +Vì vậy, một trong những điều bạn có thể làm là bạn có thể khai thác vào mô-đun replit và bạn + +83 +00:05:30,940 --> 00:05:33,490 +có thể nhập một chức năng có tên là clear. + +84 +00:05:34,090 --> 00:05:36,730 +Khi bạn đã nhập chức năng rõ ràng này, sau + +85 +00:05:37,570 --> 00:05:42,570 +đó bạn có thể tiếp tục và thêm nó ngay sau khi người dùng đưa ra dự đoán của họ. + +86 +00:05:43,120 --> 00:05:46,030 +Vì vậy, bạn có thể gọi nó giống như cách bạn làm với bất kỳ + +87 +00:05:46,060 --> 00:05:50,710 +hàm nào khác khi bạn đã nhập nó vào tệp này. Và khi bạn chạy mã ngay bây + +88 +00:05:52,660 --> 00:05:56,890 +giờ, bạn có thể thấy rằng sau mỗi lần đoán, nó sẽ xóa màn hình. + +89 +00:05:57,290 --> 00:06:00,140 +Vì vậy, hãy đoán một chữ cái, hãy đoán một chữ cái khác. + +90 +00:06:01,140 --> 00:06:05,510 +Bây giờ điều đó có nghĩa là chúng ta không còn tồn đọng những phỏng đoán trước đó và chúng ta thực sự có + +91 +00:06:05,510 --> 00:06:09,920 +thể thấy những gì đang diễn ra ở mỗi giai đoạn. Trong các tài nguyên của khóa học, bạn + +92 +00:06:09,920 --> 00:06:14,920 +cũng sẽ tìm thấy một liên kết đến mã hoàn thành cuối cùng vào trận chung kết treo cổ ngày + +93 +00:06:15,890 --> 00:06:20,270 +thứ bảy và vui lòng sửa đổi mã này thành nội dung trái tim của bạn, làm + +94 +00:06:20,270 --> 00:06:24,020 +cho nó làm bất cứ điều gì bạn muốn và thúc đẩy ranh giới + +95 +00:06:24,020 --> 00:06:24,920 +của các kỹ + +96 +00:06:25,340 --> 00:06:29,660 +năng lập trình của bạn nếu bạn muốn. Rất tốt vì đã đạt được điều này và hoàn thành + +97 +00:06:29,660 --> 00:06:32,720 +tốt để giải quyết thử thách này. Hãy yên tâm, và tôi sẽ gặp lại bạn vào ngày mai. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/012 Challenge-5-Completed-Code.url b/part1/07 - Day 7 - Beginner - Hangman/012 Challenge-5-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..ce60a726ec0c424a664423edb0eda4f7522fb87d --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/012 Challenge-5-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-5-End \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/012 Course-Fixes-Report-an-Issue.url b/part1/07 - Day 7 - Beginner - Hangman/012 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/012 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/012 Final-Code.url b/part1/07 - Day 7 - Beginner - Hangman/012 Final-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..1347365cd7847b93aea68be6f45cdaec53baa2a5 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/012 Final-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Day-7-Hangman-Final \ No newline at end of file diff --git a/part1/07 - Day 7 - Beginner - Hangman/013 The Benefits of Daily Practice.mp4 b/part1/07 - Day 7 - Beginner - Hangman/013 The Benefits of Daily Practice.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..061316af103a772faa9cf84cef1c0f633192f6a2 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/013 The Benefits of Daily Practice.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f4574c12adb7b56d4aaf76145018f874503ed26a4fa5f4efab247e89aa358e4 +size 29149241 diff --git a/part1/07 - Day 7 - Beginner - Hangman/013 The Benefits of Daily Practice_vi.srt b/part1/07 - Day 7 - Beginner - Hangman/013 The Benefits of Daily Practice_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8350f66c00b1438e11b326811b86387e0702005f --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/013 The Benefits of Daily Practice_vi.srt @@ -0,0 +1,68 @@ +1 +00:00:00,990 --> 00:00:04,260 +Chào! Hoàn thành tốt ngày thứ 7. + +2 +00:00:04,530 --> 00:00:07,290 +Bây giờ bạn đã đi một chặng đường dài kể từ khi bắt + +3 +00:00:07,680 --> 00:00:10,470 +đầu và bạn đã ở đây đủ lâu để biết máy khoan là gì. + +4 +00:00:10,470 --> 00:00:13,680 +Bạn chỉ cần tiếp tục xuất hiện, tiếp tục làm các ngày. + +5 +00:00:14,040 --> 00:00:18,420 +Nhưng đừng lo lắng nếu bạn mất hơn một ngày để hoàn thành một trong những ngày trong + +6 +00:00:18,420 --> 00:00:21,120 +khóa học, bởi vì bạn có thể có con, bạn có + +7 +00:00:21,180 --> 00:00:25,740 +thể có thú cưng thực sự khắt khe, bạn có thể có một công việc thực sự khó khăn. + +8 +00:00:26,130 --> 00:00:30,060 +Và trên thực tế, tôi đã học cách phát triển iOS khi đang làm bác sĩ. + +9 +00:00:30,420 --> 00:00:35,420 +Và tôi đã phải làm điều đó sau khi tôi trở về từ một ca trực đêm và thật khó khăn khi não + +10 +00:00:35,640 --> 00:00:40,640 +tôi cảm thấy như hỗn độn và tôi quá mệt mỏi. Nhưng điều quan trọng là bạn đang + +11 +00:00:41,550 --> 00:00:46,110 +lặp đi lặp lại hàng ngày, rằng bạn làm nó liên tục và bạn không dành + +12 +00:00:46,110 --> 00:00:50,190 +thời gian nghỉ giữa mỗi bài học, bởi vì bằng cách này, nội dung + +13 +00:00:50,460 --> 00:00:54,660 +có thể cảm thấy tươi mới trong tâm trí bạn khi bạn xem nó. . + +14 +00:00:55,020 --> 00:00:59,880 +Vì vậy, đừng lo lắng nếu bạn mất hai hoặc ba ngày để làm mỗi ngày, hãy cứ tiếp tục. + +15 +00:01:00,120 --> 00:01:04,050 +Đó là một lịch tuyến tính toàn bộ. Đó là một quá trình toàn bộ tuyến tính. + +16 +00:01:04,440 --> 00:01:07,830 +Miễn là bạn làm theo thứ tự, cuối cùng bạn sẽ đến đó. + +17 +00:01:08,130 --> 00:01:11,520 +Vì vậy, tiếp tục đi, nghỉ ngơi và tôi sẽ gặp bạn vào ngày mai. + diff --git a/part1/07 - Day 7 - Beginner - Hangman/external-links.txt b/part1/07 - Day 7 - Beginner - Hangman/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..7a7baa5c1b79619c0084cccd142adac3bf631d21 --- /dev/null +++ b/part1/07 - Day 7 - Beginner - Hangman/external-links.txt @@ -0,0 +1,72 @@ + +001 Day-7-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/Day-7-Hangman-Final?v=1 + +002 How-the-Hangman-Game-works +https://en.wikipedia.org/wiki/Hangman_(game) + +002 Play-Hangman-with-Friends-Online +https://hangmanwordgame.com/?fca=1&success=0#/ + +003 Challenge-1-Starting-Code +https://repl.it/@appbrewery/Day-7-Hangman-1-Start + +003 Challenge-1-Target-Behaviour +https://repl.it/@appbrewery/Day-7-Hangman-1-End?embed=1&output=1#main.py + +003 Hint-Python-List-Documentation +https://developers.google.com/edu/python/lists#for-and-in + +004 Challenge-1-Completed-Code +https://repl.it/@appbrewery/Day-7-Hangman-1-End + +005 Challenge-2-Starting-Code +https://repl.it/@appbrewery/Day-7-Hangman-2-Start + +005 Challenge-2-Target-Behaviour +https://repl.it/@appbrewery/Day-7-Hangman-2-End?embed=1&output=1#main.py + +005 Hint-Python-Lists-and-Range- +https://developers.google.com/edu/python/lists#range + +006 Challenge-2-Completed-Code +https://repl.it/@appbrewery/Day-7-Hangman-2-End + +007 Challenge-3-Starting-Code +https://repl.it/@appbrewery/Day-7-Hangman-3-Start + +007 Challenge-3-Target-Behaviour +https://repl.it/@appbrewery/Day-7-Hangman-3-End?embed=1&output=1#main.py + +008 Challenge-3-Completed-Code +https://repl.it/@appbrewery/Day-7-Hangman-3-End + +009 Challenge-4-Starting-Code +https://repl.it/@appbrewery/Day-7-Hangman-4-Start + +009 Challenge-4-Target-Behaviour +https://repl.it/@appbrewery/Day-7-Hangman-4-End?embed=1&output=1#main.py + +010 Challenge-4-Completed-Code +https://repl.it/@appbrewery/Day-7-Hangman-4-End + +011 Challenge-5-Starting-Code +https://repl.it/@appbrewery/Day-7-Hangman-5-Start + +011 Challenge-5-Target-Behaviour +https://repl.it/@appbrewery/Day-7-Hangman-5-End?embed=1&output=1#main.py + +011 Hint-Importing-Modules +https://www.askpython.com/python/python-import-statement + +011 Hint-Flow-Chart-for-Hangman +https://app.diagrams.net/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Step%205#R7VtdW6M4FP41ffZqfcpn62XrOOqszjrq6nq1TywpMALphrS28%2Bs3gYSPBBUtFLR7VXJIgJw35z0fSQfGUbg%2BwWDhXSAHBgN96KwHxpeBrmtDbUh%2FmGSTSiz7MBW42Hd4p1xw7f%2BCYiSXLn0HxqWOBKGA%2BIuycIaiCM5ISQYwRk%2FlbnMUlN%2B6AC5UBNczEKjSO98hXiod66Ncfgp91xNv1sT8QiA685nEHnDQU0FkHA%2BMI4wQSa%2FC9REMmPKEXu7ONnfB%2BaN98u1H%2FC%2F4a%2FrHzffb39OHfX3LkGwKGEbk3Y%2BGehTa4Ofq8ZKsVtduPNXWG%2FHoFQiWXF98rmQjFAgdqk%2FeRJh4yEURCI5z6RSjZeRA9pohbeV9zhFaUKFGhT8hIRu%2BOMCSICrySBjwuzXnxz82Rks8gy%2F0M%2FgyA9iF5IXJc1zZBAtrhWvvBKIQEryhHTAMAPFX5QUF%2BLp0s3657ukFV%2F8bUDYUKK5vJlc3Ch65tpnqnjyfwOsFSBTyRE24rNk5ighXu0anNnUDEMccqJhg9JgZBeudrfDhm0FZQUzg%2BkU1irs21zsnFIM3n3Lr1ITJeQXLNIfbK75yGaiK%2F1g28NLaftUG9K5soJqO9hoLrTMwfujfkHexml4g78dkeTY2rm7X2fR2qnq49snfbPiBxVv3hTtf1vzJSWMjGhGdbmEQa94X7%2BXDkpYYV6ntdnGvVPRwS5T50Evk08%2FOeDaLWzjPaiOJQNPv4qOktZJ9xvtteaiY8gmMIAYEsm9g8wORg0LG%2FAg7LLTDScsDkRuC6B8mjQ8Wm84c4NwPgiMUIJy81nAAHM9n2bDCHXs2hg%2FzHbpMTevaZwqqegbdOImfIzaFhwBEj7EQBtT4IWZXfpQh%2F9kCHKuMVoZCES1zl2hZvfCq29F0Y6ys1%2FTGdtPOuB5Nm0ZrNF3pfIyP4uXb9tb6TuA17N16YZWnJ%2FEjW%2F4eI%2BplDHFSkEkKNTCOuWtOafrzMbOcenbuR8f%2FM7PCuK8y82E3zGxZ9Ux3gjHYFLotWIf4%2BfdosgewhtK6Sp%2FYKC9o4y55Xyuwfu4D2sjudr44tVHTq3MrgrEVgjmLM%2FpPKB%2By3Gug2wGd1fSBkr7tsivhAtJAPe2fhOvGV9UveCh8WMav%2B4TWiF0Kuc0qYq8KucdtEbtufZS4qif2dVjTvnSzV%2FZ1qNjXFVwEbP0Lo0kS4GQp0pUohE0EWG0ZkxQkWXWDJDlxaa7YoOav9zBWlEenR8oaKldqIhRBqazDRSDw3Yg2Z1STFBVjypTlz0Aw4TdC33ESC62CpGy1baEylhjOVlGpIji9NYLbk%2FJwYwQnAoPXGa6zfcnKAoG9Hzi3V1ioAr5S02aXjkx8ZYFkz1EsavWBP08uIxYsLnCav%2FBK%2FUAp3QNMti%2Fc96b6LjtE87CmQ5TzxeawUqOO72jP%2FKEhZ82dO8QPU0ntiUMUSLzuEPVehfxGNzW6bUonWgnmHPW%2BAd0rnMVnF1j2FKx4Ypd8xjKqLJ2gJfOOaJ74zRU7%2FNjDkokulUzs7ksm6l7FyeTimEr%2BvD2%2B2i6aaEuL8o7CqGqvd6c7Cnqnhd23b%2Bg1xzKNF4bqbQuMZChb3tEzuk283%2BN%2BskY37sf8mO7HVOhwgpMkLBmb1BFtEDKiix7iRaI32RNlh29YkA%2F7WbuXy42jmgzanh9Ss6v9KzfKm5J21%2BmVoUZj%2B4eKXAUeDbtGRT2wvX%2BViHHfTEX1HHsHiilhou8Ok%2BfPeJcgueRV1NOsihrQmGzQq2Kqou%2B6UNVOmLRxTXffxO5iJTJq1nkD8whLHJHz5zzv%2F22VxmAYAofNKz9DQTzA8Gzk7Fx%2F8DKtEl5GBbllpy92gpdKblV4lbfZRcVm5qVbGj6LiSPE4JKOtxx8FuBkBrSqgLOrgLPeDBxt5n%2BDTfPc%2FM%2FExvF%2F + +012 Challenge-5-Completed-Code +https://repl.it/@appbrewery/Day-7-Hangman-5-End + +012 Final-Code +https://repl.it/@appbrewery/Day-7-Hangman-Final + +012 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day 8 Goals what we will make by the end of the day.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day 8 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7803b6a3b72013b316c6799f23b1d16b358c84ba --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day 8 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bef261aaeef0d1e5cd9b9671fad443f147a27662998756741a5314f9fae104b4 +size 8756544 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day 8 Goals what we will make by the end of the day_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day 8 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b0b5ba60cac2d2f6dd849ae090957b2bce8179ea --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day 8 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,144 @@ +1 +00:00:00,790 --> 00:00:05,500 +Xin chào các bạn, chào mừng đến với Ngày thứ 8 của 100 Ngày viết mã. + +2 +00:00:05,890 --> 00:00:10,240 +Và hôm nay chúng ta sẽ xem xét các hàm cho phép bạn + +3 +00:00:10,270 --> 00:00:14,800 +cung cấp đầu vào cho chúng. Và một khi chúng ta đã học được tất cả những + +4 +00:00:15,070 --> 00:00:18,520 +điều đó và đã nắm được nó, thì chúng ta sẽ xây dựng một chương trình mật mã. + +5 +00:00:18,820 --> 00:00:21,610 +Và chương trình mật mã được gọi là mật mã Caesar. + +6 +00:00:22,150 --> 00:00:27,100 +Vì vậy, mật mã Caesar là một loại mã hóa thực sự khá cổ xưa. + +7 +00:00:27,640 --> 00:00:29,980 +Vì vậy, câu chuyện kể rằng, ừm, + +8 +00:00:30,010 --> 00:00:34,660 +khi Caesar muốn gửi những thông điệp quân sự rất nhạy cảm, anh ta sẽ + +9 +00:00:34,930 --> 00:00:39,930 +mã hóa thông điệp của mình để mỗi bức thư sẽ được dịch chuyển theo một số + +10 +00:00:40,150 --> 00:00:41,260 +lượng định trước. + +11 +00:00:41,800 --> 00:00:46,800 +Vì vậy, giả sử rằng chúng tôi muốn mã hóa chữ cái "A" và + +12 +00:00:47,710 --> 00:00:52,910 +chúng tôi chuyển nó đi ba, thì A trở thành D, B trở thành E, v.v. + +13 +00:00:54,250 --> 00:00:56,800 +Và đây là phiên bản cuối cùng sẽ trông như thế nào. + +14 +00:00:57,130 --> 00:00:59,200 +Hãy tiếp tục và mã hóa một cái gì đó. + +15 +00:00:59,740 --> 00:01:03,310 +Vì vậy, tôi sẽ nhập mã hóa để bắt đầu mã hóa một tin nhắn. + +16 +00:01:03,760 --> 00:01:07,210 +Và sau đó tôi sẽ nhập tin nhắn của mình mà không có dấu cách ở giữa. + +17 +00:01:08,560 --> 00:01:10,660 +Và sau đó tôi sẽ cung cấp cho nó một số thay đổi. + +18 +00:01:10,690 --> 00:01:12,130 +Vì vậy, đây sẽ là một + +19 +00:01:12,160 --> 00:01:15,700 +con số mà người nhận và tôi sẽ đồng ý để chúng tôi biết cách + +20 +00:01:15,700 --> 00:01:17,920 +giải mã tin nhắn. Hãy đặt nó ở mức chín. + +21 +00:01:18,550 --> 00:01:21,460 +Và sau đó nó sẽ cung cấp cho chúng ta kết quả + +22 +00:01:21,520 --> 00:01:23,230 +được mã hóa giống như thế này. + +23 +00:01:23,290 --> 00:01:26,440 +Và đây sẽ là thông điệp mà tôi sẽ truyền cho bạn tôi, qua một lá + +24 +00:01:26,500 --> 00:01:28,780 +thư hoặc qua email và điều đó có nghĩa là + +25 +00:01:29,080 --> 00:01:31,780 +bất cứ khi nào ai đó bắt gặp thông điệp này, họ sẽ + +26 +00:01:32,050 --> 00:01:35,350 +không thực sự biết chuyện gì đang xảy ra trừ khi họ biết số ca. . + +27 +00:01:35,890 --> 00:01:40,150 +Vì vậy, hãy nói rằng tôi là bạn của tôi. Tôi vừa nhận được tin nhắn này. + +28 +00:01:40,630 --> 00:01:45,340 +Và tôi sẽ tiếp tục và nhập yes để tiếp tục và trong trường hợp + +29 +00:01:45,430 --> 00:01:48,640 +này, tôi sẽ giải mã thay vì mã hóa. + +30 +00:01:49,090 --> 00:01:52,030 +Và sau đó tôi sẽ dán tin nhắn và nhấn enter. + +31 +00:01:52,510 --> 00:01:56,920 +Và tất nhiên, số ca là chín và bây giờ tôi có kết quả được giải + +32 +00:01:57,190 --> 00:02:01,720 +mã mà tôi có thể đọc và hiểu. Đến cuối ngày hôm nay, bạn + +33 +00:02:01,720 --> 00:02:04,030 +đã học về các hàm với đầu vào, + +34 +00:02:04,300 --> 00:02:08,020 +bạn sẽ biết sự khác biệt giữa các đối số và tham số. + +35 +00:02:08,590 --> 00:02:11,050 +Khi bạn đã sẵn sàng, khi bạn đã uống đầy + +36 +00:02:11,290 --> 00:02:13,960 +cà phê, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day-8-Goal-Click-Run-to-see-the-final-project.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day-8-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..6ee491eccf50939036518db0f6adcc735f181063 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/001 Day-8-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/caesar-cipher-completed?v=1 \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Fork-the-Day-8-Starting-Repl.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Fork-the-Day-8-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..e3f81648e6893875ff77abd602c9a28add15789b --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Fork-the-Day-8-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-8-start \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Functions with Inputs.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Functions with Inputs.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a0ac562a5dff5a17e921ac9c46b1eb317f80bd9c --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Functions with Inputs.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f71da9ae9d1a549143113ee87ad814731c5b974349114c54fa0755a2baec75e +size 30948090 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Functions with Inputs_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Functions with Inputs_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..465f16e1e0caefc45282fd844d47b96edeb46ed5 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/002 Functions with Inputs_vi.srt @@ -0,0 +1,584 @@ +1 +00:00:00,490 --> 00:00:03,850 +Để bắt đầu, chúng ta sẽ tìm hiểu thêm về các hàm. + +2 +00:00:04,330 --> 00:00:09,330 +Và trước đây chúng ta đã biết rằng các hàm là một cách thực sự tiện dụng để lấy + +3 +00:00:10,540 --> 00:00:15,540 +một tập hợp các hướng dẫn phức tạp và đóng gói chúng lại với nhau bên trong một khối + +4 +00:00:17,470 --> 00:00:19,540 +mã có tên được đặt cho nó. + +5 +00:00:20,080 --> 00:00:24,580 +Và khi chúng ta cần tất cả các dòng mã được đóng gói bên trong hàm này, tất cả những + +6 +00:00:24,580 --> 00:00:25,390 +gì chúng ta + +7 +00:00:25,390 --> 00:00:30,390 +phải làm tại bất kỳ thời điểm nào sau này trong mã của chúng ta chỉ là gọi hàm bằng cách nhập tên + +8 +00:00:30,940 --> 00:00:34,030 +của nó và sau đó là một tập hợp các dấu ngoặc đơn. + +9 +00:00:34,750 --> 00:00:36,760 +Và khi dòng mã này được + +10 +00:00:37,030 --> 00:00:41,440 +chạy, nó sẽ tìm kiếm nơi hàm này được xác định, ở trên đây, + +11 +00:00:41,830 --> 00:00:45,490 +và sau đó nó sẽ thực thi tất cả các dòng + +12 +00:00:45,490 --> 00:00:49,330 +mã chứa bên trong nó. Bây giờ đã được một thời gian ngắn kể từ khi chúng tôi thấy các chức năng. + +13 +00:00:49,390 --> 00:00:54,390 +Vì vậy, tôi muốn bạn tiếp tục và tìm bản sao bắt đầu cho ngày thứ 8 tại URL + +14 +00:00:55,030 --> 00:00:56,470 +này và sau đó phân + +15 +00:00:56,680 --> 00:01:01,270 +nhánh nó để tạo bản sao của riêng bạn. Để bắt đầu, tôi muốn bạn tạo một + +16 +00:01:01,330 --> 00:01:04,569 +hàm mới có tên là chào và tôi muốn bạn cung + +17 +00:01:05,110 --> 00:01:08,110 +cấp cho nó ba dòng câu lệnh in, yêu cầu + +18 +00:01:08,350 --> 00:01:12,220 +nó thực hiện ba điều. Và cuối cùng, khi bạn đã hoàn + +19 +00:01:12,250 --> 00:01:16,630 +tất, hãy tiếp tục và gọi hàm để nó được thực thi trong bảng điều khiển. + +20 +00:01:16,900 --> 00:01:20,560 +Vì vậy, hãy tạm dừng video và thử xem. Được rồi. + +21 +00:01:20,560 --> 00:01:23,770 +Vì vậy, để tạo một hàm, tất nhiên chúng ta cần có từ khóa def. + +22 +00:01:24,130 --> 00:01:26,710 +Và chúng tôi biết đó là một từ khóa, bởi vì ngay khi chúng + +23 +00:01:26,770 --> 00:01:30,790 +tôi nhập nó, nó sẽ chuyển sang màu xanh lam. Và sau từ khóa, chúng ta + +24 +00:01:30,850 --> 00:01:35,170 +phải đặt tên cho hàm của mình. Vì vậy, trong trường hợp của tôi, nó được gọi là chào. + +25 +00:01:35,860 --> 00:01:40,630 +Bây giờ sau lời chào, chúng ta thêm một tập hợp các dấu ngoặc đơn sau tên của hàm. + +26 +00:01:41,530 --> 00:01:42,363 +Cuối cùng, + +27 +00:01:42,430 --> 00:01:47,430 +chúng tôi thêm dấu hai chấm và chúng tôi nhập vào khối mã vì chúng tôi đã thụt vào. + +28 +00:01:48,880 --> 00:01:49,390 +Bây + +29 +00:01:49,390 --> 00:01:52,840 +giờ, điều đầu tiên tôi sẽ làm là tạo một câu lệnh + +30 +00:01:52,840 --> 00:01:55,720 +in chỉ nói Xin chào. Và sau đó tôi + +31 +00:01:56,200 --> 00:02:00,460 +sẽ nói, tốt, bạn làm thế nào? Không ai ở Anh thực sự nói điều + +32 +00:02:00,790 --> 00:02:04,990 +này, nhưng tôi luôn thấy nó trong các cuốn sách học tiếng Anh, điều này khá buồn cười. + +33 +00:02:05,440 --> 00:02:07,120 +Tôi nghĩ mọi người sẽ nhìn bạn rất kỳ lạ + +34 +00:02:07,150 --> 00:02:11,980 +nếu bạn đến gặp ai đó ở tiệm bánh và nói, chà, bạn làm thế nào? Nhưng dù sao đi nữa, cuối + +35 +00:02:12,880 --> 00:02:16,600 +cùng, chúng tôi sẽ thêm một báo cáo in + +36 +00:02:17,050 --> 00:02:21,670 +cuối cùng, phù hợp với chức năng của người Anh, sẽ hỏi + +37 +00:02:22,090 --> 00:02:23,710 +về thời tiết. + +38 +00:02:24,940 --> 00:02:29,770 +Mặt khác, dòng này là điều mà bạn sẽ thường nghe người dân + +39 +00:02:29,770 --> 00:02:32,080 +Anh nói. Họ bị ám ảnh + +40 +00:02:32,350 --> 00:02:34,750 +về thời tiết, chủ yếu là vì nó luôn khủng khiếp. + +41 +00:02:35,500 --> 00:02:37,930 +Vì vậy, bây giờ chúng ta đã tạo hàm của mình, + +42 +00:02:37,930 --> 00:02:42,100 +đã đến lúc thực sự kích hoạt hàm hoặc những gì chúng ta thấy trong biệt ngữ lập + +43 +00:02:42,400 --> 00:02:43,540 +trình, hãy gọi hàm. + +44 +00:02:43,900 --> 00:02:48,100 +Và chúng tôi làm điều đó bằng cách gọi tên của hàm và sau đó thêm + +45 +00:02:48,100 --> 00:02:51,940 +một tập hợp các dấu ngoặc đơn. Và bây giờ khi mã đạt đến + +46 +00:02:51,970 --> 00:02:55,750 +dòng thứ sáu, nó sẽ tìm kiếm hàm chào này, nó sẽ tìm thấy + +47 +00:02:56,050 --> 00:02:59,590 +ở đây và sau đó nó sẽ thực hiện từng dòng mã một. + +48 +00:03:00,040 --> 00:03:04,000 +Vì vậy, hãy chạy mã và bạn sẽ thấy từng câu lệnh trong số ba + +49 +00:03:04,060 --> 00:03:06,730 +câu lệnh in được gọi. Vì vậy, điều đó khá đơn giản. + +50 +00:03:08,470 --> 00:03:12,100 +Lưu ý rằng mỗi lần tôi gọi hàm chào, nó + +51 +00:03:12,640 --> 00:03:15,190 +sẽ hoạt động tương tự, phải không? + +52 +00:03:15,190 --> 00:03:19,630 +Nó chỉ cần in ra ba dòng mã đó. Bây giờ, trong thực tế, rất + +53 +00:03:19,630 --> 00:03:24,630 +hiếm khi bạn muốn lặp lại các hướng dẫn giống nhau mỗi lần khi + +54 +00:03:24,790 --> 00:03:28,090 +bạn gọi một hàm. Sẽ thật tuyệt, phải không, nếu + +55 +00:03:28,110 --> 00:03:33,110 +chúng ta có thể sửa đổi một số phần của mã bên trong hàm và cho phép + +56 +00:03:34,030 --> 00:03:36,790 +một chút thay đổi. Ví dụ, sẽ thật + +57 +00:03:36,790 --> 00:03:40,600 +tuyệt nếu chúng ta có thể chào ai đó bằng tên để người đó có + +58 +00:03:40,900 --> 00:03:45,580 +thể nói, xin chào Angela, thay vì chỉ chào. Bạn khỏe không Angela? + +59 +00:03:45,910 --> 00:03:49,480 +Vì vậy, nó có thể thay đổi mỗi khi tôi gọi hàm này. + +60 +00:03:49,570 --> 00:03:53,860 +Có thể lần sau sẽ như vậy, Jack Bauer sẽ thế nào, v.v. + +61 +00:03:54,130 --> 00:03:58,390 +Vậy làm thế nào chúng ta có thể đạt được loại chức năng này? Chà, chúng ta cần xem + +62 +00:03:58,390 --> 00:04:01,600 +xét kỹ hơn những dấu ngoặc đơn này. + +63 +00:04:02,200 --> 00:04:07,200 +Bây giờ những gì chúng ta có thể làm là chúng ta thực sự có thể thêm tên của một biến bên trong các dấu + +64 +00:04:08,800 --> 00:04:12,520 +ngoặc đơn đó để bắt đầu cung cấp cho các hàm của chúng ta một số đầu vào. + +65 +00:04:12,970 --> 00:04:17,079 +Vì vậy, giả sử rằng có một biến được gọi là một cái gì + +66 +00:04:17,110 --> 00:04:22,110 +đó sẽ được chuyển đến hàm của tôi. Và thứ này sau đó có thể được sử dụng bên trong khối + +67 +00:04:24,610 --> 00:04:25,443 +mã này, hàm này. + +68 +00:04:25,900 --> 00:04:30,520 +Và tôi có thể làm điều gì đó với nó. Bây giờ để thực sự chuyển giá trị + +69 +00:04:30,520 --> 00:04:35,380 +này khi tôi gọi hàm của mình, tôi phải thêm dữ liệu vào bên trong dấu ngoặc đơn. + +70 +00:04:35,650 --> 00:04:39,910 +Vì vậy, giả sử tôi quyết định vượt qua 123, tốt trong trường + +71 +00:04:39,910 --> 00:04:43,120 +hợp này, khi dòng mã này được kích hoạt, + +72 +00:04:43,570 --> 00:04:46,990 +máy tính sẽ tìm kiếm nơi hàm này được khai + +73 +00:04:47,020 --> 00:04:51,940 +báo, ở trên đây, và sau đó nó sẽ chuyển qua đoạn này dữ liệu, + +74 +00:04:52,300 --> 00:04:56,080 +123, đến biến này được gọi là một cái gì đó. + +75 +00:04:56,620 --> 00:05:00,940 +Vì vậy, bây giờ, một cách hiệu quả, bên trong hàm này được gọi là my_ + +76 +00:05:01,240 --> 00:05:05,680 +Chức năng, bây giờ chúng ta có một biến được gọi là một cái gì đó bằng 123 + +77 +00:05:06,400 --> 00:05:11,400 +và sau đó có thể được sử dụng bên trong khối mã để thực hiện điều gì đó với phần + +78 +00:05:11,410 --> 00:05:12,243 +dữ liệu đó. + +79 +00:05:14,470 --> 00:05:18,220 +Bây giờ nó giống như cắm USB vào máy tính. + +80 +00:05:18,790 --> 00:05:21,100 +Nếu chúng tôi lấy một phần đầu + +81 +00:05:21,190 --> 00:05:25,450 +vào khác, chúng tôi sẽ có một tệp khác được máy tính hiển thị. + +82 +00:05:25,900 --> 00:05:30,900 +Vì vậy, điều này có nghĩa là máy tính có thể làm điều gì đó khác nhau tùy thuộc vào đầu vào mà chúng + +83 +00:05:31,390 --> 00:05:33,880 +ta cung cấp cho nó. Và nếu chúng ta thay đổi + +84 +00:05:34,000 --> 00:05:36,280 +đầu vào đó, thì nó sẽ nhận được một phần dữ liệu khác. + +85 +00:05:37,180 --> 00:05:39,700 +Vì vậy ngoài một hàm đơn giản, chúng + +86 +00:05:39,730 --> 00:05:43,060 +ta còn có thể tạo một hàm cho phép nhập liệu. + +87 +00:05:44,140 --> 00:05:49,140 +Và để làm điều đó bạn đã thấy trước đó, cú pháp lại giống như trước khi chúng + +88 +00:05:49,690 --> 00:05:51,940 +ta sử dụng Def để tạo hàm. + +89 +00:05:52,360 --> 00:05:56,230 +Và sau đó hãy đặt cho nó một cái tên hơi khác + +90 +00:05:56,230 --> 00:05:59,150 +để phân biệt với hàm trước đó, welcome_with_name. + +91 +00:05:59,720 --> 00:06:03,650 +Và sau đó bên trong dấu ngoặc đơn, thay vì để trống, + +92 +00:06:03,890 --> 00:06:07,550 +chúng ta phải tạo tên của biến sẽ được chuyển qua. + +93 +00:06:08,000 --> 00:06:12,170 +Vì vậy, chúng ta hãy chỉ gọi nó là tên vì nó mô tả + +94 +00:06:12,170 --> 00:06:15,770 +dữ liệu sẽ được nhận. Đó sẽ là tên của người mà tôi muốn chào. + +95 +00:06:16,340 --> 00:06:21,140 +Vì vậy, bây giờ chúng ta hãy thêm dấu hai chấm và cuối cùng chúng ta có thể tạo các câu lệnh in của mình. + +96 +00:06:21,740 --> 00:06:25,640 +Vì vậy, tôi sẽ sao chép các câu lệnh in này từ + +97 +00:06:25,670 --> 00:06:30,530 +bên trên và bây giờ, thay vì đặt các tên này được mã hóa cứng ở đây, + +98 +00:06:30,680 --> 00:06:35,680 +tôi sẽ xóa nó và tôi sẽ thay thế các tên đó bằng giá trị của biến này. + +99 +00:06:36,110 --> 00:06:40,130 +Vì vậy, tôi sẽ đặt nó vào bằng cách sử dụng một chuỗi như thế này, + +100 +00:06:40,580 --> 00:06:43,250 +và sau đó tôi sẽ làm tương tự ở đây. + +101 +00:06:46,740 --> 00:06:47,573 +1: Đúng không? + +102 +00:06:47,910 --> 00:06:49,740 +0: Khi chúng ta thực sự gọi + +103 +00:06:49,770 --> 00:06:53,430 +hàm này, nó cũng sẽ khác một chút so với trước đây ở dòng sáu. + +104 +00:06:53,970 --> 00:06:57,180 +Vì vậy, trước tiên, tên của hàm đã thay đổi. + +105 +00:06:57,630 --> 00:07:02,630 +Nhưng hãy lưu ý cách nó mong đợi một số loại đầu vào bên trong dấu ngoặc đơn. + +106 +00:07:03,120 --> 00:07:05,640 +Và nó nói với tôi rằng nó muốn nhận được một cái tên. + +107 +00:07:06,180 --> 00:07:10,830 +Đó là khi chúng ta gọi hàm mà chúng ta thực sự chuyển qua phần dữ liệu + +108 +00:07:10,860 --> 00:07:15,570 +sẽ được lưu trữ bên trong biến này. Hãy đặt cho nó tên riêng + +109 +00:07:15,900 --> 00:07:19,110 +của tôi, Angela. Và bây giờ khi tôi nhấn run, + +110 +00:07:19,470 --> 00:07:21,420 +tôi muốn bạn dự đoán những gì sẽ xảy ra, + +111 +00:07:21,450 --> 00:07:23,190 +những gì thực sự sẽ được in ra. + +112 +00:07:23,400 --> 00:07:28,400 +Vì vậy, hãy tiếp tục và nhận xét dòng mã trước đó và bây giờ chạy mã của chúng tôi. + +113 +00:07:30,240 --> 00:07:34,020 +Và bạn sẽ thấy nó nói, xin chào Angela, bạn khỏe không Angela.? + +114 +00:07:34,020 --> 00:07:38,610 +Vì vậy, phần dữ liệu này về cơ bản đã được chèn dưới tên biến này và sau đó nó được + +115 +00:07:38,910 --> 00:07:42,810 +đưa vào cả hai câu lệnh in này. Bây giờ, nếu tôi tiếp tục + +116 +00:07:42,810 --> 00:07:47,100 +và gọi hàm này bằng một phần dữ liệu khác, nói một tên khác, + +117 +00:07:47,760 --> 00:07:49,230 +thì nó sẽ sử + +118 +00:07:49,650 --> 00:07:54,060 +dụng phần dữ liệu đó để sửa đổi chức năng này để nó thực hiện + +119 +00:07:54,300 --> 00:07:56,580 +điều gì đó hơi khác một chút. + +120 +00:07:57,090 --> 00:08:02,010 +Vì vậy, theo cách này, chúng ta có thể tạo một hàm thực hiện một số hướng dẫn, nhưng + +121 +00:08:02,310 --> 00:08:06,240 +mỗi khi chúng ta thực thi nó, nó sẽ được sửa đổi một chút bằng + +122 +00:08:06,510 --> 00:08:08,340 +cách thay đổi các đầu vào. + +123 +00:08:09,360 --> 00:08:11,760 +Khi chúng ta đang nói về các chức năng với đầu + +124 +00:08:12,030 --> 00:08:13,950 +vào, có hai thứ mà chúng ta + +125 +00:08:13,980 --> 00:08:16,200 +đang làm việc thực sự quan trọng để phân biệt. + +126 +00:08:17,190 --> 00:08:22,170 +Vì vậy, chúng tôi biết rằng khi chúng tôi gọi hàm này và chúng tôi chuyển qua phần dữ liệu này, + +127 +00:08:22,500 --> 00:08:23,460 +thực sự là + +128 +00:08:23,490 --> 00:08:28,490 +chúng tôi đang tạo một biến mới có tên là một cái gì đó và chúng tôi đang đặt nó bằng với + +129 +00:08:28,860 --> 00:08:33,030 +phần dữ liệu mà chúng tôi đang chuyển nó. Bây giờ trong thuật ngữ lập trình, + +130 +00:08:33,059 --> 00:08:38,059 +bạn sẽ nghe thấy điều này được gọi là tham số và phần dữ liệu này + +131 +00:08:38,460 --> 00:08:42,240 +được gọi là đối số. Bây giờ, đối số + +132 +00:08:42,240 --> 00:08:45,000 +là phần dữ liệu thực tế + +133 +00:08:45,030 --> 00:08:49,110 +sẽ được chuyển cho hàm này khi nó được gọi. + +134 +00:08:49,560 --> 00:08:52,920 +Trong khi tham số là tên của dữ liệu đó và + +135 +00:08:53,340 --> 00:08:57,990 +chúng ta sử dụng tham số bên trong hàm để tham chiếu đến nó và thực + +136 +00:08:57,990 --> 00:09:01,620 +hiện mọi việc với nó. Hiện nay rất thường xuyên trên internet + +137 +00:09:01,620 --> 00:09:03,090 +khi bạn bắt gặp + +138 +00:09:03,090 --> 00:09:06,060 +ai đó giải thích điều gì đó trên Stack Overflow hoặc trong + +139 +00:09:06,420 --> 00:09:09,600 +một số tài liệu, bạn sẽ nghe thấy họ đề cập đến hai + +140 +00:09:09,600 --> 00:09:11,550 +loại thứ này, tham số và đối số. + +141 +00:09:12,090 --> 00:09:15,930 +Vì vậy, nếu bạn cần, hãy quay lại bài học này và nhắc nhở bản thân về sự khác + +142 +00:09:15,930 --> 00:09:17,160 +biệt giữa hai điều đó. + +143 +00:09:17,550 --> 00:09:20,550 +Tham số là tên của dữ liệu được truyền vào, đối số + +144 +00:09:20,850 --> 00:09:24,990 +là giá trị thực của dữ liệu. Bây giờ, đôi khi mọi người cũng + +145 +00:09:25,020 --> 00:09:28,770 +bị nhầm lẫn trên internet giữa hai từ này, nhưng miễn là bạn biết chúng + +146 +00:09:29,040 --> 00:09:32,010 +có nghĩa là gì, thì bạn sẽ ở một nơi tốt. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Day-8-Ending-Code.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Day-8-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..4da05712cae74e1ab9d2000f3810f0c566fb5eeb --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Day-8-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-8-end \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Positional vs. Keyword Arguments.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Positional vs. Keyword Arguments.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..92f8df0836e1d2ccab9415042280ec3c61c6baff --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Positional vs. Keyword Arguments.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c568680b54eb1a36aa6ecb821feac6a77be820e4c4f0efc8809b03402ff5af31 +size 32502464 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Positional vs. Keyword Arguments_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Positional vs. Keyword Arguments_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..159d2ee1894dd91084d892e5976d61948b1f17f1 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/003 Positional vs. Keyword Arguments_vi.srt @@ -0,0 +1,524 @@ +1 +00:00:00,310 --> 00:00:01,420 +Trong bài học + +2 +00:00:01,450 --> 00:00:06,450 +trước, chúng ta đã thấy một dạng hàm rất đơn giản cho phép nhập dữ liệu vào. + +3 +00:00:07,360 --> 00:00:08,470 +Bây giờ trong + +4 +00:00:08,500 --> 00:00:13,150 +bài học này, tôi muốn đi sâu hơn nữa và tôi muốn tạo một hàm + +5 +00:00:13,150 --> 00:00:14,650 +cho phép nhiều đầu vào. + +6 +00:00:15,370 --> 00:00:19,390 +Vì vậy, chúng ta hãy nhận xét ra khỏi dòng mã trước đó và hãy tạo một nhận xét mới, các + +7 +00:00:19,720 --> 00:00:21,490 +chức năng với nhiều hơn một đầu vào. + +8 +00:00:22,840 --> 00:00:27,310 +Và tôi sẽ tạo một hàm mới có tên là welcome_with. + +9 +00:00:28,000 --> 00:00:31,660 +Và trong trường hợp này, nó sẽ nhận hai tham số. + +10 +00:00:31,960 --> 00:00:36,460 +Nó sẽ là tên và vị trí. Nếu bạn nhớ, đây là cách chúng tôi + +11 +00:00:36,460 --> 00:00:40,840 +đã thêm một tham số trước đó. Bây giờ, như một thử thách, tôi + +12 +00:00:40,870 --> 00:00:45,310 +muốn bạn nhanh chóng suy nghĩ về cách bạn có thể thêm hai tham + +13 +00:00:45,340 --> 00:00:49,540 +số, một tham số được gọi và một tham số được gọi, vào + +14 +00:00:49,540 --> 00:00:52,450 +khai báo hàm này. Hãy tạm dừng video, suy nghĩ ngắn gọn và sau + +15 +00:00:52,600 --> 00:00:55,420 +đó chúng ta sẽ cùng nhau xem qua. Được rồi. + +16 +00:00:55,420 --> 00:00:58,600 +Vì vậy, chúng tôi biết rằng nếu chúng tôi muốn thêm một tên tham số, thì + +17 +00:00:58,660 --> 00:01:02,740 +đây là cách chúng tôi sẽ làm điều đó. Chúng tôi chỉ thêm nó vào bên trong dấu ngoặc đơn. + +18 +00:01:03,490 --> 00:01:06,070 +Bây giờ, nếu chúng ta muốn có nhiều hơn một tham số, + +19 +00:01:06,520 --> 00:01:11,520 +tất cả những gì chúng ta phải làm chỉ là thêm dấu phẩy và sau đó thêm tham số thứ hai mà chúng ta + +20 +00:01:11,860 --> 00:01:13,720 +đã nói sẽ được gọi là vị trí. + +21 +00:01:14,290 --> 00:01:18,190 +Vì vậy, bây giờ hàm cụ thể này sẽ nhận hai đầu + +22 +00:01:18,190 --> 00:01:22,360 +vào, tên và vị trí. Và bên trong hàm này, chúng ta + +23 +00:01:22,390 --> 00:01:27,130 +sẽ sử dụng tên để in một cái gì đó như tên xin chào, sau đó + +24 +00:01:28,000 --> 00:01:29,980 +chúng ta sẽ in và + +25 +00:01:30,400 --> 00:01:34,540 +hỏi họ, nó như thế nào ở vị trí cụ thể của họ. + +26 +00:01:35,140 --> 00:01:39,850 +Xem liệu bạn có thể sửa đổi điều này để sử dụng các tham số thực tế và thay thế + +27 +00:01:39,850 --> 00:01:44,800 +chúng bằng các câu lệnh in để chúng tôi sử dụng các tham số này bên trong hàm của mình hay không. + +28 +00:01:45,100 --> 00:01:48,640 +Tạm dừng video ngay bây giờ và tiếp tục. Được rồi. + +29 +00:01:48,640 --> 00:01:53,260 +Vì vậy, về cơ bản chúng ta muốn tạo một câu lệnh print ở đây và các câu lệnh print in + +30 +00:01:53,320 --> 00:01:57,400 +các chuỗi, vì vậy chúng ta phải thêm một số dấu ngoặc kép xung quanh văn bản đó. + +31 +00:01:57,880 --> 00:01:58,810 +Và cuối cùng, + +32 +00:01:58,810 --> 00:02:03,810 +tôi sẽ sử dụng một chuỗi để thay thế tên tham số này bên trong chuỗi này để + +33 +00:02:06,850 --> 00:02:11,350 +dữ liệu được truyền vào sẽ được thay thế ở đây và nó nói, xin chào, bất + +34 +00:02:11,380 --> 00:02:13,210 +kể tên của chúng là gì. + +35 +00:02:13,870 --> 00:02:16,270 +Và sau đó tôi sẽ làm điều tương tự + +36 +00:02:20,230 --> 00:02:23,890 +ở đây và lưu ý rằng với replit và nhiều trình soạn thảo văn + +37 +00:02:23,890 --> 00:02:26,860 +bản khác, bạn có thể chỉ cần đánh dấu một từ + +38 +00:02:27,100 --> 00:02:32,100 +hoặc đánh dấu hoặc một câu, sau đó sử dụng dấu ngoặc nhọn mở để thực sự thêm dấu ngoặc + +39 +00:02:33,340 --> 00:02:37,750 +nhọn. xung quanh cả hai mặt của từ. Và bạn sẽ nhận thấy rằng tôi đã làm điều tương tự với dấu ngoặc kép. + +40 +00:02:37,750 --> 00:02:41,170 +Vì vậy, nó đánh dấu toàn bộ câu và sau đó nhấn phím dấu ngoặc kép + +41 +00:02:41,440 --> 00:02:45,400 +và nó sẽ tiếp tục thêm dấu ngoặc kép xung quanh cả hai mặt của phần đánh dấu của bạn. + +42 +00:02:46,570 --> 00:02:48,160 +Nhưng tôi thực sự chỉ cần một cái. + +43 +00:02:48,700 --> 00:02:51,880 +Như vậy là chức năng của chúng ta đã hoàn thành. + +44 +00:02:52,480 --> 00:02:56,230 +Và bây giờ nó có nghĩa là tôi có thể gọi hàm này + +45 +00:02:56,710 --> 00:03:00,880 +bằng cách gọi welcome_with và nó sẽ nhắc tôi thêm cả hai đầu vào này. + +46 +00:03:01,390 --> 00:03:04,870 +Và phần dữ liệu đầu tiên sẽ là tên và bạn + +47 +00:03:04,990 --> 00:03:09,610 +có thể thấy nó cho bạn gợi ý bằng cách gạch dưới tên của + +48 +00:03:09,610 --> 00:03:12,550 +tham số ở đây. Và hãy đặt Jack Bauer và + +49 +00:03:14,170 --> 00:03:18,790 +sau đó chúng ta có thể thêm phần dữ liệu thứ hai và phân tách nó bằng dấu phẩy. + +50 +00:03:19,270 --> 00:03:23,020 +Và bây giờ bạn có thể thấy phần gạch dưới này đã chuyển sang tham số vị trí. + +51 +00:03:23,080 --> 00:03:25,810 +Vì vậy, một lần nữa, một gợi ý về loại dữ liệu mà nó muốn. + +52 +00:03:26,260 --> 00:03:29,950 +Vì vậy, hãy nói rằng Jack Bauer không ở đâu cả. Bây giờ, nếu chúng ta tiếp tục + +53 +00:03:29,950 --> 00:03:31,750 +và chạy mã này, thì + +54 +00:03:31,840 --> 00:03:36,550 +bạn sẽ thấy rằng nó sẽ in lời chào và thay thế tên bằng Jack Bauer. + +55 +00:03:36,910 --> 00:03:40,120 +Và sau đó nó như thế nào trong hư không? Vì vậy, không có nơi + +56 +00:03:40,120 --> 00:03:42,100 +nào được thay thế bằng vị trí này. + +57 +00:03:42,700 --> 00:03:47,700 +Vì vậy, điều đó có nghĩa là bây giờ bạn có thể đưa vào bao nhiêu phần + +58 +00:03:48,070 --> 00:03:53,070 +tử đầu vào tùy thích và sửa đổi chức năng của hàm để mỗi lần hàm của + +59 +00:03:53,980 --> 00:03:57,850 +bạn làm những việc khác nhau. Bây giờ đây là một câu hỏi. + +60 +00:03:58,390 --> 00:04:02,620 +Điều gì sẽ xảy ra nếu tôi gọi cùng một hàm welcome_with, nhưng tôi chuyển + +61 +00:04:03,070 --> 00:04:06,760 +đổi thứ tự của dữ liệu mà tôi cung cấp cho nó. + +62 +00:04:07,210 --> 00:04:10,660 +Vì vậy, giả sử phần dữ liệu đầu tiên tôi cung cấp + +63 +00:04:11,320 --> 00:04:14,980 +không ở đâu cả, và phần dữ liệu thứ hai là Jack Bauer. + +64 +00:04:15,370 --> 00:04:19,690 +Vì vậy, chúng tôi vừa chuyển đổi thứ tự của các phần dữ liệu này. Bây giờ, bạn mong đợi điều + +65 +00:04:19,750 --> 00:04:21,279 +gì sẽ xảy ra? + +66 +00:04:21,640 --> 00:04:25,450 +Hãy tạm dừng một chút và suy nghĩ về những gì bạn mong đợi sẽ được in ở + +67 +00:04:25,990 --> 00:04:29,080 +đây và sau đó tiếp tục. Được rồi, hãy nhấp + +68 +00:04:29,080 --> 00:04:34,080 +vào chạy và bạn có thể thấy rằng bây giờ nó hoàn toàn vô nghĩa. + +69 +00:04:34,840 --> 00:04:39,430 +Xin chào, không ở đâu cả. Nó như thế nào ở Jack Bauer? Và điều thực sự đã xảy + +70 +00:04:39,640 --> 00:04:44,350 +ra ở đây là nó lấy vị trí của dữ liệu, xem xét cả hai đối số này và đối + +71 +00:04:44,710 --> 00:04:47,620 +số đầu tiên được gán cho tham số đầu tiên, đối số thứ + +72 +00:04:47,950 --> 00:04:51,940 +hai được gán cho tham số thứ hai. Vì vậy, trong trường hợp này, khi + +73 +00:04:51,970 --> 00:04:55,960 +nó thực sự đi vào đây, tên bây giờ không giống với hư không, đó là + +74 +00:04:55,990 --> 00:05:00,990 +lý do tại sao dòng này được in ra. sAand Jack Bauer hiện được gán cho vị trí, đó là lý + +75 +00:05:01,570 --> 00:05:06,520 +do tại sao nó lại in dòng thứ hai như vậy. Và trong lập trình Python, đây được gọi + +76 +00:05:06,550 --> 00:05:11,550 +là đối số vị trí vì khi chúng ta gọi hàm, chúng ta chưa chỉ + +77 +00:05:11,950 --> 00:05:16,950 +định bất kỳ nơi nào tham số cụ thể mà chúng ta muốn liên kết + +78 +00:05:17,800 --> 00:05:21,910 +các phần dữ liệu này. Vì vậy, nó chỉ đi và nhìn vào vị trí. + +79 +00:05:22,030 --> 00:05:26,290 +Bây giờ đây là cách gọi hàm mặc định, bởi vì một mặt, khi bạn + +80 +00:05:26,320 --> 00:05:27,640 +đang gõ mã, bạn + +81 +00:05:27,670 --> 00:05:32,020 +sẽ nhận được các gợi ý ở đây về phần dữ liệu bạn cần nhập. + +82 +00:05:32,470 --> 00:05:37,360 +Nhưng bạn cũng có thể tham khảo chức năng và xem thứ tự của các tham số. + +83 +00:05:38,260 --> 00:05:42,610 +Ngay cả khi chúng ta có nhiều đầu vào hơn, giả sử trong trường hợp + +84 +00:05:42,610 --> 00:05:47,380 +này, chúng ta có a, b và c, và chúng ta đặt các đối số một, + +85 +00:05:47,740 --> 00:05:51,310 +hai và ba, thì điều đó có nghĩa là các biến của + +86 +00:05:51,310 --> 00:05:52,840 +chúng ta được tạo + +87 +00:05:53,260 --> 00:05:56,950 +sẽ là a bằng một, b bằng hai và c bằng ba. + +88 +00:05:59,060 --> 00:06:03,590 +Bây giờ, nếu chúng ta chuyển đổi thứ tự của các đối số trong lời gọi hàm, + +89 +00:06:04,250 --> 00:06:08,600 +bây giờ điều sẽ xảy ra là a sẽ bằng với đối số đầu tiên. + +90 +00:06:08,600 --> 00:06:13,600 +Vì vậy, a bây giờ bằng ba, b bằng đối số thứ hai và + +91 +00:06:13,640 --> 00:06:18,560 +c bằng đối số thứ ba. Vì vậy, nó có thể đang làm những điều hơi khó đoán ở đây. + +92 +00:06:19,010 --> 00:06:22,730 +Vì vậy, bất cứ khi nào bạn đang tạo mã và bạn đang sử dụng các đối + +93 +00:06:23,030 --> 00:06:25,700 +số vị trí này và bạn chỉ cần chèn từng dữ liệu + +94 +00:06:26,000 --> 00:06:28,250 +một như thế này và nó thực hiện một điều + +95 +00:06:28,340 --> 00:06:32,990 +gì đó hoàn toàn không mong muốn, thì hãy nhớ kiểm tra vị trí của bạn và đảm bảo rằng nó + +96 +00:06:32,990 --> 00:06:36,770 +khớp với vị trí của các tham số. Bây giờ, điều gì sẽ xảy ra + +97 +00:06:36,800 --> 00:06:41,180 +nếu bạn muốn rõ ràng hơn khi bạn thực sự gọi hàm để không bao giờ + +98 +00:06:41,210 --> 00:06:44,690 +gặp phải vấn đề này? Thay vào đó, bạn có thể + +99 +00:06:44,690 --> 00:06:49,340 +sử dụng một thứ gọi là đối số từ khóa. Vì vậy, bây giờ, thay vì chỉ + +100 +00:06:49,370 --> 00:06:53,300 +thêm các đối số vào lệnh gọi hàm như thế này, chúng + +101 +00:06:53,690 --> 00:06:58,690 +ta thực sự có thể thêm từng tên tham số và một dấu bằng để nói + +102 +00:06:58,880 --> 00:07:00,260 +rằng tham số + +103 +00:07:00,260 --> 00:07:04,730 +đầu tiên a phải bằng một, b phải bằng hai và c bằng ba. + +104 +00:07:05,300 --> 00:07:07,940 +Và bây giờ khi chúng ta thực sự thay đổi thứ tự xung quanh, + +105 +00:07:07,970 --> 00:07:09,830 +không quan trọng là chúng ta sắp xếp nó + +106 +00:07:10,160 --> 00:07:14,540 +như thế nào, nó vẫn sẽ tuân theo những ràng buộc này. Vì vậy, c vẫn sẽ + +107 +00:07:14,540 --> 00:07:17,180 +là ba và a sẽ vẫn là một. + +108 +00:07:18,830 --> 00:07:22,160 +Như một thách thức, tôi muốn bạn sử dụng hàm trước + +109 +00:07:22,640 --> 00:07:24,710 +đó, welcome_with_name và vị trí, và + +110 +00:07:24,950 --> 00:07:29,120 +tôi muốn bạn gọi hàm này ở đây, nhưng lần này, thay vì sử + +111 +00:07:29,150 --> 00:07:33,650 +dụng các đối số vị trí, tôi muốn bạn sử dụng các đối số từ khóa. + +112 +00:07:34,160 --> 00:07:36,860 +Vì vậy, hãy tạm dừng video và thử xem. + +113 +00:07:39,770 --> 00:07:42,620 +Được rồi. Vì vậy, khi chúng ta gọi hàm, chúng ta vẫn sử dụng tên. + +114 +00:07:42,650 --> 00:07:46,610 +Vì vậy, nó là welcome_with, vì vậy mọi thứ cho đến dấu ngoặc đơn đầu tiên đều là tên. + +115 +00:07:47,150 --> 00:07:50,750 +Và sau đó chúng tôi thêm vào mỗi tên tham số này, sau + +116 +00:07:51,410 --> 00:07:56,180 +đó chúng tôi thêm một dấu bằng và cuối cùng, chúng tôi cung cấp cho nó giá trị thực. + +117 +00:07:56,240 --> 00:07:57,620 +Vì vậy, giả + +118 +00:07:57,800 --> 00:08:02,690 +sử Angela, và sau đó vị trí sẽ ngang bằng với London. + +119 +00:08:03,710 --> 00:08:05,030 +Bây giờ, khi tôi nhấn run, bạn + +120 +00:08:05,090 --> 00:08:09,200 +có thể thấy nó hoạt động khá giống với trước đây. Nó đặt Angela vào + +121 +00:08:09,260 --> 00:08:13,940 +tên, London vào vị trí. Nhưng lần này nếu tôi chuyển đổi thứ tự xung + +122 +00:08:14,000 --> 00:08:17,330 +quanh nó không còn quan trọng nữa. Và khi tôi nhấn run lần + +123 +00:08:17,360 --> 00:08:19,550 +nữa, bạn có thể thấy nó hoạt động giống + +124 +00:08:19,970 --> 00:08:24,470 +hệt như vậy, bởi vì nó bây giờ biết đối số nào được liên kết với tham số nào. + +125 +00:08:25,400 --> 00:08:27,500 +Vì vậy, điều này có thể làm cho mã của bạn + +126 +00:08:27,770 --> 00:08:30,230 +ít bị lỗi hơn nhưng nó làm cho mỗi dòng mã dài hơn. + +127 +00:08:30,620 --> 00:08:35,620 +Tôi khuyên bạn nên sử dụng phán đoán của mình để tìm ra khi bạn muốn sử dụng loại lập luận nào + +128 +00:08:35,900 --> 00:08:39,679 +và tùy thuộc vào nhu cầu, bạn có thể chọn giữa hai loại lập luận này. + +129 +00:08:41,210 --> 00:08:46,070 +Bây giờ trong bài học tiếp theo, tôi có một bài tập viết mã để bạn thực hành mọi thứ mà + +130 +00:08:46,340 --> 00:08:48,020 +bạn đã học cho đến nay. + +131 +00:08:48,260 --> 00:08:51,110 +Hãy đến đó khi bạn đã sẵn sàng và hãy bắt đầu. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 Exercise-20.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 Exercise-20.url new file mode 100644 index 0000000000000000000000000000000000000000..d7193c47edccd8512d3de2322adf4734742e50c4 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 Exercise-20.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/e242258e-5006-40f1-9228-8e3a8c7482cc \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 How-to-join-Auditorium.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 [Interactive Coding Exercise] Paint Area Calculator.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 [Interactive Coding Exercise] Paint Area Calculator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5a11e2af55c6a1f54f9b407c43664e45e5ad3ef9 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 [Interactive Coding Exercise] Paint Area Calculator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e679ca161c02bc6aa79d05e2b76858ed3d8e75509388c28c3341818ce5381bb +size 18687170 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 [Interactive Coding Exercise] Paint Area Calculator_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 [Interactive Coding Exercise] Paint Area Calculator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4a813ed00d80065334d1717959c20783da10ea0c --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/004 [Interactive Coding Exercise] Paint Area Calculator_vi.srt @@ -0,0 +1,372 @@ +1 +00:00:00,480 --> 00:00:01,680 +Trong bài tập + +2 +00:00:01,680 --> 00:00:04,590 +này, bạn sẽ viết một hàm tính toán + +3 +00:00:04,590 --> 00:00:07,800 +số lượng hộp sơn bạn cần để sơn một + +4 +00:00:07,800 --> 00:00:09,990 +bức tường, với chiều cao + +5 +00:00:09,990 --> 00:00:14,010 +và chiều rộng của bức tường. + +6 +00:00:14,010 --> 00:00:16,440 +Vì vậy, điều bạn sắp làm là viết + +7 +00:00:16,440 --> 00:00:20,220 +một hàm và nó phải được gọi là Paint_calc vì + +8 +00:00:20,220 --> 00:00:24,030 +mã trên dòng 10 đến 13 đảm bảo rằng chúng ta + +9 +00:00:24,030 --> 00:00:26,460 +nhận được dữ liệu đầu vào, chúng + +10 +00:00:26,460 --> 00:00:29,130 +ta tính toán phạm vi phủ của sơn + +11 +00:00:29,130 --> 00:00:32,369 +và chúng tôi sử dụng hàm Paint_calc + +12 +00:00:32,369 --> 00:00:36,150 +của bạn để in ra câu lệnh cho người dùng biết + +13 +00:00:36,150 --> 00:00:39,840 +họ cần bao nhiêu lon sơn. + +14 +00:00:39,840 --> 00:00:44,010 +Cách tính diện tích của bức tường là + +15 +00:00:44,010 --> 00:00:47,790 +nhân chiều cao với chiều rộng, sau + +16 +00:00:47,790 --> 00:00:52,790 +đó chia số đó cho độ che phủ của sơn để tính ra + +17 +00:00:53,610 --> 00:00:56,940 +số lượng lon chúng ta cần. + +18 +00:00:56,940 --> 00:01:01,230 +Bây giờ, vì các cửa hàng không bán cho bạn loại lon phân số, và tin + +19 +00:01:01,230 --> 00:01:03,720 +tôi đi, tôi đã cố gắng yêu cầu điều đó, + +20 +00:01:03,720 --> 00:01:06,150 +bạn phải luôn làm tròn lên, bạn không + +21 +00:01:06,150 --> 00:01:08,010 +thể làm tròn xuống. + +22 +00:01:08,010 --> 00:01:11,010 +Vì vậy, ngay cả khi nó là 1. 1 lon, bạn sẽ cần phải + +23 +00:01:11,010 --> 00:01:13,440 +mua hai lon, hoặc đại lý bán hàng tại + +24 +00:01:13,440 --> 00:01:18,060 +cửa hàng phần cứng gia đình ở địa phương của tôi nói như vậy. + +25 +00:01:18,060 --> 00:01:20,580 +Bây giờ, hãy xem hướng dẫn, bạn + +26 +00:01:20,580 --> 00:01:24,390 +sẽ thấy Đầu vào mẫu và Đầu ra mẫu cũng như định + +27 +00:01:24,390 --> 00:01:26,640 +dạng mà chúng cần có. + +28 +00:01:26,640 --> 00:01:29,040 +Trong trường hợp này, chúng tôi đang nói rằng số + +29 +00:01:29,040 --> 00:01:33,360 +đầu tiên trong Đầu vào là chiều cao và số thứ hai là chiều rộng, nhưng trên thực tế, điều + +30 +00:01:33,360 --> 00:01:35,130 +đó không thực sự quan trọng vì diện + +31 +00:01:35,130 --> 00:01:38,160 +tích được tính theo cả hai cách, chiều cao nhân chiều rộng hoặc + +32 +00:01:38,160 --> 00:01:39,870 +chiều rộng nhân chiều cao , và nó không + +33 +00:01:39,870 --> 00:01:41,580 +thực sự quan trọng. + +34 +00:01:41,580 --> 00:01:43,020 +Nhưng điều quan trọng + +35 +00:01:43,020 --> 00:01:46,080 +là tìm ra cách làm tròn một số và tôi đã đưa + +36 +00:01:46,080 --> 00:01:47,460 +một gợi ý vào hướng + +37 +00:01:47,460 --> 00:01:49,770 +dẫn từ Stack Overflow. + +38 +00:01:49,770 --> 00:01:52,770 +Bạn cũng có thể tìm kiếm cách riêng của + +39 +00:01:52,770 --> 00:01:54,720 +mình để tìm ra điều này. + +40 +00:01:54,720 --> 00:01:57,390 +Tuy nhiên, hãy thử viết mã và nhấn Gửi + +41 +00:01:57,390 --> 00:02:00,450 +khi bạn nghĩ mình đã sẵn sàng và kiểm tra mã đó + +42 +00:02:00,450 --> 00:02:03,033 +với các bài kiểm tra được tạo sẵn. + +43 +00:02:06,270 --> 00:02:10,229 +Điều đầu tiên chúng ta cần làm là xác định chức năng của mình. + +44 +00:02:10,229 --> 00:02:13,980 +Vì vậy, trong Python, đó là "từ khóa def", dấu cách và + +45 +00:02:13,980 --> 00:02:15,480 +sau đó là tên của hàm. + +46 +00:02:15,480 --> 00:02:19,020 +Và chúng ta đã nói rằng nó phải khớp với dòng + +47 +00:02:19,020 --> 00:02:22,140 +mà chúng ta đã tạo để gọi hàm ở dòng 12. + +48 +00:02:22,140 --> 00:02:24,200 +Vì vậy nó phải được gọi là Paint_calc. + +49 +00:02:25,350 --> 00:02:27,240 +Và sau đó chúng ta có một tập hợp dấu + +50 +00:02:27,240 --> 00:02:30,990 +ngoặc đơn () nơi chúng ta có thể đặt dữ liệu đầu vào cho hàm của mình. + +51 +00:02:30,990 --> 00:02:35,430 +Trong trường hợp này, đó là chiều cao, chiều rộng và phạm vi bao phủ. + +52 +00:02:35,430 --> 00:02:38,610 +Bây giờ, chúng ta chưa đưa bất kỳ thông tin đầu vào nào vào + +53 +00:02:38,610 --> 00:02:42,450 +hàm của mình vì hãy nhớ rằng, hàm của chúng ta là một công cụ đa dụng. + +54 +00:02:42,450 --> 00:02:45,000 +Đó là thứ mà chúng ta có thể sử dụng nhiều lần bằng + +55 +00:02:45,000 --> 00:02:47,190 +cách đưa vào các đầu vào khác nhau. + +56 +00:02:47,190 --> 00:02:51,180 +Vì vậy, ví dụ, hàm len() có thể lấy bất kỳ danh sách + +57 +00:02:51,180 --> 00:02:54,600 +nào và nó sẽ tính ra độ dài của danh sách hoặc + +58 +00:02:54,600 --> 00:02:57,120 +số lượng mục trong danh sách. + +59 +00:02:57,120 --> 00:02:59,220 +Vì vậy, các đầu vào luôn có thể thay đổi, nhưng + +60 +00:02:59,220 --> 00:03:00,840 +chúng ta xác định trong hàm của mình + +61 +00:03:00,840 --> 00:03:03,870 +cách chúng ta muốn làm việc với những đầu vào đó. + +62 +00:03:03,870 --> 00:03:07,950 +Sau khi định nghĩa tên hàm và thông tin đầu vào, chúng + +63 +00:03:07,950 --> 00:03:10,950 +ta tạo phần thân thực tế của hàm. + +64 +00:03:10,950 --> 00:03:14,580 +Và chúng tôi làm điều đó bằng cách thụt lề vào hàm. + +65 +00:03:14,580 --> 00:03:16,620 +Điều đầu tiên chúng ta làm là + +66 +00:03:16,620 --> 00:03:17,940 +tính số lượng lon cần + +67 +00:03:17,940 --> 00:03:21,180 +thiết bằng cách nhân chiều cao với chiều rộng + +68 +00:03:21,180 --> 00:03:23,580 +để tính diện tích, đặt dấu ngoặc + +69 +00:03:23,580 --> 00:03:28,290 +đơn xung quanh phần này, sau đó chia cho độ phủ của sơn. + +70 +00:03:28,290 --> 00:03:32,670 +Trong nhiều trường hợp, đây sẽ là số thập phân, vì vậy + +71 +00:03:32,670 --> 00:03:35,280 +chúng ta có một dòng khác ở dòng + +72 +00:03:35,280 --> 00:03:37,980 +5 nơi chúng ta làm tròn số lon. + +73 +00:03:37,980 --> 00:03:42,980 +Để làm tròn nó, chúng tôi sử dụng mô-đun toán học và chúng + +74 +00:03:43,980 --> 00:03:48,390 +tôi sử dụng hàm math. phương thức ceil(). + +75 +00:03:48,390 --> 00:03:51,450 +Điều này sẽ tăng đến mức trần của số, về cơ bản + +76 +00:03:51,450 --> 00:03:53,340 +có nghĩa là làm tròn nó lên + +77 +00:03:53,340 --> 00:03:55,320 +đến số nguyên gần nhất. + +78 +00:03:55,320 --> 00:03:57,270 +Và chúng tôi chuyển số lượng + +79 +00:03:57,270 --> 00:03:59,610 +lon của mình làm đầu vào cho hàm này, + +80 +00:03:59,610 --> 00:04:04,560 +sau đó chúng tôi tính toán và lưu trữ bên trong round_up_cans. + +81 +00:04:04,560 --> 00:04:06,810 +Và cuối cùng, chúng ta in + +82 +00:04:06,810 --> 00:04:09,960 +ra thông báo, Bạn sẽ cần các lon sơn + +83 +00:04:09,960 --> 00:04:14,310 +làm tròn, chèn số lon sơn đã làm tròn của chúng ta + +84 +00:04:14,310 --> 00:04:16,380 +vào câu lệnh in đó. + +85 +00:04:16,380 --> 00:04:19,050 +Và cách hàm của chúng ta hoạt động + +86 +00:04:19,050 --> 00:04:23,520 +là chúng ta đã xác định hàm của mình ở dòng 3 đến 6, và sau + +87 +00:04:23,520 --> 00:04:25,500 +đó ở dòng 12, chúng ta thực + +88 +00:04:25,500 --> 00:04:29,220 +sự gọi hàm, truyền vào các giá trị thực. + +89 +00:04:29,220 --> 00:04:32,820 +Vì vậy, trong trường hợp này, đầu vào đầu tiên là chiều cao, + +90 +00:04:32,820 --> 00:04:34,980 +đầu vào thứ hai là chiều rộng và phạm + +91 +00:04:34,980 --> 00:04:38,733 +vi bao phủ là bất kỳ thứ gì được xác định trên dòng 11. + +92 +00:04:39,660 --> 00:04:41,910 +Và khi dòng mã đó được chạy, + +93 +00:04:41,910 --> 00:04:46,143 +thì chúng tôi sẽ in đầu ra của mình vào vùng đầu ra. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 Exercise-21.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 Exercise-21.url new file mode 100644 index 0000000000000000000000000000000000000000..d69ff45657a10e069ca6e3750a350be5b1007cef --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 Exercise-21.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/4e31e198-3cbb-4dae-aad9-c0d99be60fa2 \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 How-to-join-Auditorium.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 [Interactive Coding Exercise] Prime Number Checker.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 [Interactive Coding Exercise] Prime Number Checker.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ffb52ceefedb654f1b4ac422d4b26d7e9a84b976 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 [Interactive Coding Exercise] Prime Number Checker.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13d3756b5334429716e896d26fa9455a633610eb02c45f24d087d719f261be60 +size 12851577 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 [Interactive Coding Exercise] Prime Number Checker_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 [Interactive Coding Exercise] Prime Number Checker_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d82866051d3150ceb8d947259cc5e82f696fe7b0 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/005 [Interactive Coding Exercise] Prime Number Checker_vi.srt @@ -0,0 +1,344 @@ +1 +00:00:01,110 --> 00:00:02,130 +Trong bài tập + +2 +00:00:02,130 --> 00:00:05,010 +này, bạn sẽ viết một hàm kiểm tra + +3 +00:00:05,010 --> 00:00:10,010 +xem dữ liệu đầu vào có phải là Số nguyên tố hay không. + +4 +00:00:10,410 --> 00:00:13,740 +Số nguyên tố là những số có thể chia rõ ràng + +5 +00:00:13,740 --> 00:00:17,730 +cho chính nó và 1 và không có số nào khác. + +6 +00:00:17,730 --> 00:00:20,370 +Có một số đặc điểm toán học và những + +7 +00:00:20,370 --> 00:00:21,420 +con số này thực + +8 +00:00:21,420 --> 00:00:23,850 +sự có vẻ đẹp nếu bạn đọc nó. + +9 +00:00:23,850 --> 00:00:24,690 +Bây giờ, trong phần + +10 +00:00:24,690 --> 00:00:27,510 +Mô tả, tôi đã liên kết đến trang Wikipedia về số nguyên tố. + +11 +00:00:27,510 --> 00:00:29,460 +Vì vậy, nếu tiếng Anh không phải là + +12 +00:00:29,460 --> 00:00:32,070 +ngôn ngữ đầu tiên của bạn và bạn không chắc tôi + +13 +00:00:32,070 --> 00:00:33,810 +đang nói đến điều gì, hãy xem Wikipedia + +14 +00:00:33,810 --> 00:00:37,923 +và thay đổi trang này sang ngôn ngữ địa phương của bạn. + +15 +00:00:38,790 --> 00:00:40,616 +Cách thức hoạt động của + +16 +00:00:40,616 --> 00:00:42,370 +hàm của bạn là nó sẽ được + +17 +00:00:44,190 --> 00:00:48,300 +gọi là prime_checker và nó sẽ sử dụng logic để tìm hiểu + +18 +00:00:48,300 --> 00:00:50,820 +xem liệu số đầu vào được đưa vào khung + +19 +00:00:50,820 --> 00:00:54,963 +Nhập liệu có phải là số nguyên tố hay không. + +20 +00:00:55,830 --> 00:00:58,080 +Bây giờ chúng tôi sẽ giới hạn số + +21 +00:00:58,080 --> 00:01:02,280 +lượng đầu vào tối đa 100 vì chương trình này có thể khá chuyên + +22 +00:01:02,280 --> 00:01:04,050 +sâu và có thể mất khá nhiều + +23 +00:01:04,050 --> 00:01:07,530 +thời gian nếu bạn sử dụng số lượng lớn. + +24 +00:01:07,530 --> 00:01:10,650 +Vì vậy, hãy suy nghĩ về cách bạn có thể đạt được + +25 +00:01:10,650 --> 00:01:14,910 +điều này bằng cách viết mã và cách bạn có thể đạt được điều này + +26 +00:01:14,910 --> 00:01:17,250 +chỉ bằng cách viết ra logic. + +27 +00:01:17,250 --> 00:01:18,210 +Nếu bạn gặp khó + +28 +00:01:18,210 --> 00:01:21,780 +khăn, hãy luôn thử tìm hiểu xem liệu bạn có thể nghĩ về + +29 +00:01:21,780 --> 00:01:26,280 +nó chỉ từ quan điểm logic và sau đó triển khai nó bằng mã hay không. + +30 +00:01:26,280 --> 00:01:28,740 +Dù bằng cách nào, hãy xem mô tả, xem thử liệu bạn có thể + +31 +00:01:28,740 --> 00:01:30,630 +tìm ra giải pháp hay không và chúng ta sẽ cùng + +32 +00:01:30,630 --> 00:01:32,130 +nhau tìm hiểu giải pháp trên trang + +33 +00:01:32,130 --> 00:01:33,120 +trình bày tiếp theo sau + +34 +00:01:33,120 --> 00:01:34,503 +khi bạn hoàn thành. + +35 +00:01:40,080 --> 00:01:43,560 +Điều đầu tiên chúng ta sẽ làm là xác định chức năng của mình. + +36 +00:01:43,560 --> 00:01:47,050 +Vì vậy, ở dòng một, tôi đã có định nghĩa cho hàm của chúng ta được + +37 +00:01:47,995 --> 00:01:48,900 +gọi là prime_checker() + +38 +00:01:48,900 --> 00:01:51,332 +và nó chỉ cần một đầu vào, số mà chúng ta muốn + +39 +00:01:51,332 --> 00:01:54,540 +kiểm tra. Ở dòng tiếp theo, tôi đã + +40 +00:01:54,540 --> 00:01:58,410 +xác định một biến được gọi là is_prime và tôi đang đặt nó + +41 +00:01:58,410 --> 00:01:59,730 +thành "Đúng" theo mặc + +42 +00:01:59,730 --> 00:02:04,050 +định và tôi sẽ đổi nó thành "Sai" nếu tại một thời điểm nào đó mã + +43 +00:02:04,050 --> 00:02:07,080 +của tôi phát hiện ra rằng nó thực sự là không + +44 +00:02:07,080 --> 00:02:08,913 +phải là số nguyên tố. + +45 +00:02:10,199 --> 00:02:11,670 +Vậy làm cách nào để kiểm tra xem đó + +46 +00:02:11,670 --> 00:02:13,170 +có phải là số nguyên tố hay không? + +47 +00:02:13,170 --> 00:02:16,530 +Chà, tôi sẽ tạo một phạm vi và tôi sẽ + +48 +00:02:16,530 --> 00:02:20,040 +bắt đầu từ số 2 vì chúng ta biết rằng + +49 +00:02:20,040 --> 00:02:24,570 +số nguyên tố là những số chỉ có thể chia hết cho + +50 +00:02:24,570 --> 00:02:27,780 +chính nó và 1, và điều đó cũng có nghĩa + +51 +00:02:27,780 --> 00:02:31,290 +là tôi không cần phải tăng số lượng + +52 +00:02:31,290 --> 00:02:34,263 +lên 1 ở cuối phạm vi. + +53 +00:02:35,100 --> 00:02:38,880 +Chúng ta sẽ lặp qua từng số đó trong vòng lặp for này + +54 +00:02:38,880 --> 00:02:40,470 +và chúng ta sẽ kiểm tra + +55 +00:02:40,470 --> 00:02:44,100 +số nguyên tố tiềm năng được lưu trong biến số làm + +56 +00:02:44,100 --> 00:02:46,050 +đầu vào cho hàm của chúng ta + +57 +00:02:46,050 --> 00:02:47,970 +và chúng ta sẽ kiểm tra xem + +58 +00:02:47,970 --> 00:02:52,080 +liệu chúng ta có chia nó cho số hiện tại trong phạm vi của + +59 +00:02:52,080 --> 00:02:55,320 +chúng tôi, nó có chia rõ ràng không? + +60 +00:02:55,320 --> 00:02:57,840 +Vì hãy nhớ rằng số nguyên tố chỉ + +61 +00:02:57,840 --> 00:03:00,720 +có thể chia hết cho 1 và chính nó. + +62 +00:03:00,720 --> 00:03:04,020 +Nếu bất kỳ số nào trong phạm vi từ 2 đến số + +63 +00:03:04,020 --> 00:03:08,520 +của chúng ta có thể thay thế cho i và có số dư là 0 thì rõ + +64 +00:03:08,520 --> 00:03:09,660 +ràng đó không + +65 +00:03:09,660 --> 00:03:11,880 +phải là số nguyên tố. + +66 +00:03:11,880 --> 00:03:14,733 +Vì vậy chúng tôi đặt is_prime thành "False". + +67 +00:03:16,170 --> 00:03:18,570 +Bây giờ phần cuối cùng là dễ nhất. + +68 +00:03:18,570 --> 00:03:19,890 +Chúng ta chỉ có một câu lệnh if và else. + +69 +00:03:19,890 --> 00:03:22,530 +Nếu ở cuối vòng lặp for, khi chúng + +70 +00:03:22,530 --> 00:03:26,130 +ta đã kiểm tra tất cả các số từ 2 đến số mà chúng + +71 +00:03:26,130 --> 00:03:30,210 +ta đang thắc mắc và không có số nào trong số đó cho + +72 +00:03:30,210 --> 00:03:34,050 +phép chúng ta chia số của mình cho số đó và không + +73 +00:03:34,050 --> 00:03:36,330 +có số dư, thì đó rõ ràng là một + +74 +00:03:36,330 --> 00:03:41,330 +số nguyên tố và biến is_prime của chúng tôi không bị ảnh hưởng, + +75 +00:03:41,400 --> 00:03:43,830 +vẫn là "True". + +76 +00:03:43,830 --> 00:03:45,870 +Nếu có điều gì khác xảy ra + +77 +00:03:45,870 --> 00:03:49,080 +thì rõ ràng đó không phải là số nguyên tố + +78 +00:03:49,080 --> 00:03:52,274 +và nó chia hết cho một số nào đó giữa 2 và số + +79 +00:03:52,274 --> 00:03:53,643 +của chúng ta. + +80 +00:03:54,480 --> 00:03:57,150 +Phần khó nhất của việc này là suy nghĩ + +81 +00:03:57,150 --> 00:04:00,150 +và suy luận về phạm vi mà chúng ta tạo và + +82 +00:04:00,150 --> 00:04:04,860 +sử dụng phạm vi đó trong vòng lặp để kiểm tra số của mình. + +83 +00:04:04,860 --> 00:04:07,770 +Hãy xem liệu bạn có thể hiểu cách logic hoạt động hay không + +84 +00:04:07,770 --> 00:04:10,230 +và nếu bạn gặp bất kỳ vấn đề nào khi vượt qua bài kiểm + +85 +00:04:10,230 --> 00:04:11,640 +tra trong bài học trước thì + +86 +00:04:11,640 --> 00:04:13,890 +hãy quay lại đó và thử sửa mã của mình. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar Cipher Part 1 - Encryption.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar Cipher Part 1 - Encryption.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0241f599ac0fbb326759c0fc468d32980e2a4bc7 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar Cipher Part 1 - Encryption.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eb6637deea268ba6065cb3c84c3a0a7acf797c19134d40683b2c8da3750913e +size 221781351 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar Cipher Part 1 - Encryption_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar Cipher Part 1 - Encryption_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fa2a0362768a87ef97552b090d2d6a040c6dc8eb --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar Cipher Part 1 - Encryption_vi.srt @@ -0,0 +1,880 @@ +1 +00:00:00,520 --> 00:00:04,480 +Được rồi. Cuối cùng đã đến lúc giải quyết dự án + +2 +00:00:04,540 --> 00:00:07,930 +cuối cùng của chúng ta, Caesar Cipher. Như tôi đã đề + +3 +00:00:08,109 --> 00:00:13,060 +cập trước đây, Caesar Cipher là cách mã hóa văn bản này, ừm, + +4 +00:00:13,090 --> 00:00:16,870 +được thấy sớm nhất là vào thời của Julius Caesar. + +5 +00:00:17,110 --> 00:00:20,170 +Vì vậy, khi có những thông điệp quân sự tuyệt + +6 +00:00:20,560 --> 00:00:25,560 +mật này, điều anh ta sẽ làm là chuyển từng chữ cái trong bảng chữ cái theo + +7 +00:00:26,830 --> 00:00:30,790 +một số lượng đã định trước. Tôi muốn nhanh chóng cho bạn thấy nó hoạt động như thế nào. + +8 +00:00:31,270 --> 00:00:36,270 +Vì vậy, chúng tôi có bảng chữ cái ở đây và giả sử chúng tôi muốn mã hóa chữ E. Vì vậy, bây giờ chúng ta có + +9 +00:00:36,970 --> 00:00:40,750 +thể sắp xếp bảng chữ cái với một bộ bảng chữ cái mới. + +10 +00:00:41,260 --> 00:00:42,430 +Và hiện tại, sự + +11 +00:00:42,490 --> 00:00:47,490 +thay đổi bằng 0 vì bảng chữ cái trên cùng và bảng chữ cái dưới cùng được xếp với + +12 +00:00:47,860 --> 00:00:52,840 +một sự khác biệt bằng không. Bây giờ, hãy nói rằng chúng ta đã có một sự thay đổi. Vâng, sau đó bảng chữ + +13 +00:00:52,840 --> 00:00:57,700 +cái di chuyển sang trái và A trở thành B, B trở thành C v.v. + +14 +00:00:58,090 --> 00:01:02,710 +Và chúng tôi có thể tiếp tục cho đến khi chúng tôi đạt được lượng ca làm việc mà chúng tôi muốn. + +15 +00:01:03,010 --> 00:01:07,060 +Vì vậy, giả sử chúng ta sẽ mã hóa tất cả văn bản của mình với sự thay đổi của ba. + +16 +00:01:07,480 --> 00:01:11,980 +Chà, rồi E trở thành H, F trở thành I, G trở thành J, vân + +17 +00:01:12,250 --> 00:01:13,660 +vân và vân vân. + +18 +00:01:14,020 --> 00:01:17,920 +Và họ đã thực sự phát hiện ra những đồ tạo tác này từ nhiều + +19 +00:01:17,920 --> 00:01:21,580 +năm trước, nơi mọi người đã tạo ra những loại mặt số này. + +20 +00:01:22,060 --> 00:01:27,060 +Và chỉ cần xoay mặt số đến một khoảng dịch chuyển nhất định, sau đó bạn có + +21 +00:01:27,400 --> 00:01:29,620 +thể xếp các chữ cái với nhau. + +22 +00:01:29,950 --> 00:01:34,510 +Vì vậy, A trở thành N và Z trở thành O, v.v. + +23 +00:01:34,750 --> 00:01:38,050 +Và đây là một cách mà mọi người thực sự mã hóa các thông điệp tuyệt mật. + +24 +00:01:38,830 --> 00:01:40,750 +Vào cuối ngày hôm nay, bạn + +25 +00:01:40,960 --> 00:01:45,070 +cũng sẽ xây dựng được một dạng kỹ thuật số của mật mã Caesar. + +26 +00:01:45,730 --> 00:01:50,440 +Và tất cả những gì bạn phải làm là gõ mã hóa để bắt đầu mã hóa một tin nhắn. + +27 +00:01:50,830 --> 00:01:53,380 +Hãy nói điều gì đó như Xin chào Thế giới. + +28 +00:01:54,130 --> 00:01:57,580 +Và khi chúng ta nhấn enter, chúng ta phải nhập số thay đổi, mà + +29 +00:01:57,910 --> 00:01:59,710 +tôi sẽ chọn một số ngẫu + +30 +00:02:00,100 --> 00:02:02,980 +nhiên, và nó cho chúng ta kết quả được mã hóa. + +31 +00:02:03,460 --> 00:02:08,460 +Vì vậy, bây giờ nếu tôi lấy kết quả được mã hóa này và tôi tiếp tục và nhập có, + +32 +00:02:08,800 --> 00:02:10,570 +để khởi động lại chương trình + +33 +00:02:10,870 --> 00:02:15,340 +của mình và tôi sẽ sử dụng hàm giải mã để giải mã tin nhắn của mình. + +34 +00:02:16,180 --> 00:02:18,820 +Bây giờ, khi tôi sử dụng cùng một số thay + +35 +00:02:19,450 --> 00:02:22,600 +đổi, thì tôi sẽ có thể lấy lại kết quả đã giải mã. + +36 +00:02:23,050 --> 00:02:26,470 +Vì vậy, nếu có người theo dõi điện thoại của bạn hoặc bạn đang cố + +37 +00:02:26,470 --> 00:02:28,000 +ném một tin nhắn cho bạn + +38 +00:02:28,330 --> 00:02:33,330 +mình vào một quả bóng giấy, thì đây là một cách dễ dàng để đảm bảo rằng nếu tin nhắn của bạn bị + +39 +00:02:33,430 --> 00:02:37,480 +chặn thì người kia sẽ không hiểu được. . Khi bạn đã sẵn sàng, + +40 +00:02:37,510 --> 00:02:42,510 +hãy bắt đầu bằng cách chuyển sang repl. it / @ appbrewery + +41 +00:02:42,940 --> 00:02:47,320 +/ caesar -cipher-1-start. Và điều này chứa mã bắt đầu cho dự án + +42 +00:02:47,710 --> 00:02:49,480 +này và đây là phần một trong bốn. + +43 +00:02:49,960 --> 00:02:54,520 +Vì vậy, ở đây tôi đã giúp bạn tiết kiệm cho bạn công việc nặng nhọc là gõ ra tất cả các chữ + +44 +00:02:54,520 --> 00:02:57,790 +cái trong bảng chữ cái và chúng được lưu trữ trong một danh sách duy nhất. + +45 +00:02:58,390 --> 00:03:01,600 +Bây giờ tôi cũng có ba đầu vào. + +46 +00:03:01,750 --> 00:03:03,820 +Vì vậy, đây là những gì người dùng sẽ nhập. + +47 +00:03:03,850 --> 00:03:06,610 +Họ sẽ nhập mã hóa hoặc giải mã, và điều + +48 +00:03:06,760 --> 00:03:10,630 +đó sẽ được lưu vào hướng. Tey sẽ nhập cho họ + +49 +00:03:10,660 --> 00:03:12,730 +thông báo sẽ được đổi thành chữ + +50 +00:03:13,090 --> 00:03:15,850 +thường và thông báo này sẽ được lưu thành + +51 +00:03:15,850 --> 00:03:17,800 +văn bản, và cuối cùng, họ sẽ + +52 +00:03:18,130 --> 00:03:22,180 +nhập một số shift sẽ được chuyển đổi thành số nguyên và được lưu + +53 +00:03:22,180 --> 00:03:27,040 +bên trong biến này được gọi là shift. Vì vậy, nếu bạn muốn, hãy chạy chương trình như hiện + +54 +00:03:27,280 --> 00:03:30,970 +tại để bạn hiểu đầy đủ những gì đang thực sự diễn ra trước khi bắt đầu. + +55 +00:03:31,390 --> 00:03:33,880 +Và hãy nhớ, đừng thay đổi bất kỳ đoạn mã + +56 +00:03:34,210 --> 00:03:37,150 +nào ở trên, mà hãy giải quyết từng việc cần làm một. + +57 +00:03:37,750 --> 00:03:40,330 +Bước đầu tiên là tạo một chức năng được + +58 +00:03:40,570 --> 00:03:45,430 +gọi là mã hóa sẽ lấy văn bản mà người dùng đã nhập vào và dịch chuyển mà + +59 +00:03:45,430 --> 00:03:47,260 +họ đã nhập làm đầu vào. + +60 +00:03:48,100 --> 00:03:51,310 +Và điều này sẽ sử dụng những gì bạn đã học về các hàm với đầu + +61 +00:03:51,340 --> 00:03:52,780 +vào, từ các bài học hôm nay. + +62 +00:03:53,530 --> 00:03:58,000 +Và sau đó khi bạn đã hoàn thành việc đó, bước 2 là vào bên + +63 +00:03:58,000 --> 00:04:03,000 +trong hàm mã hóa mà bạn vừa tạo và chuyển từng chữ cái của văn bản về + +64 +00:04:05,650 --> 00:04:09,870 +phía trước bằng số lượng shift. Vì vậy, một lần nữa, như chúng ta + +65 +00:04:09,880 --> 00:04:11,860 +đã thấy trước khi chuyển một, chuyển + +66 +00:04:12,100 --> 00:04:15,310 +hai, chuyển ba, về cơ bản chỉ cần di chuyển các ký + +67 +00:04:15,340 --> 00:04:19,060 +tự về phía trước để mỗi chữ cái trong bảng chữ cái trở thành một + +68 +00:04:19,089 --> 00:04:23,830 +chữ cái của bảng chữ cái xa hơn nhiều. Giả sử rằng người dùng đã nhập văn + +69 +00:04:23,860 --> 00:04:27,370 +bản Xin chào và nếu chúng tôi đã thử thay đổi + +70 +00:04:27,640 --> 00:04:31,000 +năm, thì kết quả cuối cùng sẽ là mjqqt và đầu + +71 +00:04:31,450 --> 00:04:35,530 +ra được in từ hàm này sẽ giống như văn bản được mã + +72 +00:04:35,530 --> 00:04:38,770 +hóa là thế này. Và cuối cùng, bạn sẽ gọi + +73 +00:04:38,770 --> 00:04:42,880 +hàm mã hóa và sau đó chuyển các đầu vào của người dùng từ đây + +74 +00:04:42,880 --> 00:04:43,713 +và bạn + +75 +00:04:43,900 --> 00:04:48,190 +sẽ có thể kiểm tra mã và mã hóa một tin nhắn và xem điều + +76 +00:04:48,190 --> 00:04:52,480 +gì đó xảy ra như thế này. Hãy tạm dừng video ngay bây giờ, xem qua mã bắt + +77 +00:04:52,720 --> 00:04:53,830 +đầu và khi bạn + +78 +00:04:53,980 --> 00:04:57,250 +đã sẵn sàng, hãy tiếp tục và giải quyết nó, sau đó quay lại và chúng + +79 +00:04:57,250 --> 00:05:02,200 +ta sẽ cùng nhau xem xét giải pháp. Chúc may mắn. Được rồi. + +80 +00:05:02,200 --> 00:05:07,200 +Vì vậy, tôi sẽ tách một bản sao của tệp bắt đầu và giải quyết việc cần làm đầu tiên, + +81 +00:05:07,930 --> 00:05:12,930 +đó là tạo một hàm được thực hiện bằng cách sử dụng Def và nó được gọi là mã hóa. + +82 +00:05:14,020 --> 00:05:18,250 +Và chức năng này sẽ nhận hai đầu vào. Vì vậy, bên trong dấu ngoặc, tôi + +83 +00:05:18,580 --> 00:05:22,300 +sẽ đặt hai tham số. Tất nhiên, bây giờ bạn có thể + +84 +00:05:22,300 --> 00:05:26,110 +sử dụng cùng một từ như các đầu vào mà bạn sẽ đưa vào nó. + +85 +00:05:26,380 --> 00:05:28,000 +Nhưng trong một thế giới lý + +86 +00:05:28,000 --> 00:05:31,600 +tưởng, bạn cố gắng không nhầm lẫn giữa các đối số và các tham số. + +87 +00:05:31,900 --> 00:05:34,690 +Vì vậy, tôi sẽ gọi điều này là trơn_text, tham + +88 +00:05:34,840 --> 00:05:37,570 +số đầu tiên này và tham số thứ hai tôi + +89 +00:05:37,600 --> 00:05:41,230 +sẽ gọi nó là shift_amount. Tất nhiên, bây giờ, vào một + +90 +00:05:41,230 --> 00:05:43,330 +ngày sau đó, khi chúng tôi gửi đầu vào + +91 +00:05:43,570 --> 00:05:47,860 +cho hàm này, chúng tôi sẽ gửi văn bản đến văn bản trơn_text và chuyển sang shift_amount. + +92 +00:05:48,460 --> 00:05:53,460 +Giữ tên của đối số và tham số khác nhau sẽ giúp chúng ta sau + +93 +00:05:54,430 --> 00:05:59,430 +này xem đó là đối số nào. Bước tiếp theo là vào bên trong hàm + +94 +00:06:00,200 --> 00:06:03,410 +mã hóa, tất nhiên có nghĩa là thụt lề từng chữ cái, chúng + +95 +00:06:03,710 --> 00:06:08,710 +ta sẽ chuyển từng chữ cái của văn bản chuyển tiếp trong bảng chữ cái theo số lượng dịch + +96 +00:06:08,930 --> 00:06:11,450 +chuyển, và sau đó in văn bản được mã hóa. + +97 +00:06:12,020 --> 00:06:15,230 +Đây sẽ là phần thử thách của toàn bộ bài tập này. + +98 +00:06:15,740 --> 00:06:18,020 +Nhưng về cơ bản, nếu chúng ta nghĩ về + +99 +00:06:18,050 --> 00:06:22,940 +vấn đề, điều chúng ta muốn làm là chúng ta muốn lấy từng chữ cái trong văn bản thuần túy. + +100 +00:06:23,000 --> 00:06:26,060 +Vì vậy, giả sử tất cả văn bản thuần túy đều bằng hello. + +101 +00:06:26,540 --> 00:06:31,540 +Sau đó, chúng ta sẽ lần lượt lấy từng chữ cái này và sau đó chuyển nó lên trong + +102 +00:06:31,790 --> 00:06:36,290 +bảng chữ cái theo số lượng dịch chuyển. Vì vậy, giả sử ví dụ, số lượng ca + +103 +00:06:36,290 --> 00:06:39,800 +của chúng tôi là năm và văn bản đơn giản của chúng tôi là xin chào, + +104 +00:06:40,340 --> 00:06:43,670 +điều đầu tiên chúng tôi sẽ làm là chúng tôi sẽ lấy chữ H ở đây, + +105 +00:06:43,670 --> 00:06:48,440 +và sau đó chúng tôi sẽ chuyển nó tăng lên năm. Vì vậy, một, hai, ba, bốn, năm, + +106 +00:06:48,680 --> 00:06:49,220 +và + +107 +00:06:49,220 --> 00:06:54,220 +chúng ta sẽ biến nó thành chữ M. Chúng ta có thể bắt đầu bằng cách viết + +108 +00:06:54,380 --> 00:06:58,520 +một vòng lặp for lặp qua từng chữ cái trong kiểu nhập văn bản thuần túy. + +109 +00:06:59,270 --> 00:07:04,270 +Và sau đó chúng ta có thể lấy từng chữ cái này và tìm ra vị trí của nó trong danh sách + +110 +00:07:05,390 --> 00:07:06,620 +bảng chữ cái ở đây. + +111 +00:07:07,340 --> 00:07:10,820 +Và chúng ta có thể làm điều đó bằng cách sử dụng phương pháp chỉ mục. + +112 +00:07:11,030 --> 00:07:15,140 +Vì vậy, chúng tôi có thể khai thác vào một danh sách, viết. chỉ mục, và sau đó nhập giá + +113 +00:07:15,470 --> 00:07:18,470 +trị mà chúng ta muốn lấy chỉ mục và kết quả là + +114 +00:07:18,800 --> 00:07:23,720 +chúng ta có thể nhận được giá trị đó. Vì vậy, trở lại đây, chúng ta sẽ + +115 +00:07:23,750 --> 00:07:24,890 +nói, bảng + +116 +00:07:25,010 --> 00:07:29,030 +chữ cái, là danh sách ,. chỉ mục và sau đó bên + +117 +00:07:29,360 --> 00:07:33,560 +trong dấu ngoặc đơn, chúng ta có thể đặt vào chữ cái của mình. + +118 +00:07:34,070 --> 00:07:39,070 +Vì vậy, chúng tôi muốn tìm ra chỉ mục của chữ cái mà chúng tôi đang lặp lại + +119 +00:07:39,410 --> 00:07:43,430 +trong bảng chữ cái này ở đây. Và một khi chúng tôi đã nắm được + +120 +00:07:43,460 --> 00:07:47,180 +điều đó, chúng tôi sẽ lưu nó vào một biến có tên là vị trí. + +121 +00:07:48,410 --> 00:07:52,790 +Bây giờ, khi chúng ta đã có được điều đó, chúng ta sẽ tính toán vị trí mới. + +122 +00:07:54,050 --> 00:07:57,320 +Bây giờ vị trí mới sẽ là vị trí + +123 +00:07:57,350 --> 00:08:02,270 +cũ, sẽ là một con số, và sau đó cộng với số tiền dịch chuyển. + +124 +00:08:03,230 --> 00:08:06,170 +Vì vậy, trong khi chúng ta đang xem xét đoạn + +125 +00:08:06,260 --> 00:08:11,260 +mã này, hãy xem từ H này. Vì vậy, lần đầu tiên vòng lặp chạy + +126 +00:08:11,330 --> 00:08:15,920 +chữ cái sẽ bằng H, vị trí sẽ bằng không một, hai, ba, bốn, năm, sáu, bảy. + +127 +00:08:16,610 --> 00:08:18,620 +Và sau đó số ca là + +128 +00:08:18,650 --> 00:08:21,620 +năm, vì vậy bảy cộng với năm sẽ là 12. + +129 +00:08:21,950 --> 00:08:24,680 +Vì vậy, bây giờ vị trí mới sẽ là + +130 +00:08:25,070 --> 00:08:29,150 +12 và chúng ta có thể khai thác danh sách bảng chữ cái ở + +131 +00:08:30,410 --> 00:08:33,320 +vị trí 12, bảy, tám, chín, mười, mười một, mười + +132 +00:08:33,409 --> 00:08:36,289 +hai và nắm giữ giá trị ở vị trí đó. + +133 +00:08:37,520 --> 00:08:42,520 +Vì vậy, chúng ta có thể nói rằng new_letter bằng bảng chữ cái tại new_position. + +134 +00:08:47,240 --> 00:08:50,120 +Và bây giờ khi chúng ta đã có bản tin mới này, + +135 +00:08:50,210 --> 00:08:55,040 +chúng ta có thể tạo một chuỗi trống ở đây mà chúng ta sẽ gọi là bản mã mà + +136 +00:08:56,160 --> 00:09:00,330 +sẽ là văn bản được mã hóa. Và nó bắt đầu là một chuỗi trống + +137 +00:09:00,810 --> 00:09:03,600 +và sau đó khi chúng ta đã có từng chữ cái mới, + +138 +00:09:03,870 --> 00:09:08,160 +chúng ta sẽ thêm nó vào văn bản mật mã. Bây giờ, điều cuối cùng chúng ta + +139 +00:09:08,160 --> 00:09:12,750 +phải làm bên trong hàm mã hóa này là sau khi vòng lặp for + +140 +00:09:12,750 --> 00:09:14,340 +chạy theo quy trình + +141 +00:09:14,730 --> 00:09:19,260 +của nó và chúng ta đã thêm tất cả các chữ cái mới vào + +142 +00:09:19,530 --> 00:09:24,180 +văn bản mật mã, thì tại thời điểm này, bạn nên in ra đầu ra. + +143 +00:09:24,600 --> 00:09:27,570 +Và nó cho chúng ta biết rằng chúng ta nên nói điều gì đó + +144 +00:09:27,870 --> 00:09:32,340 +như thế này, nơi chúng ta thay thế thứ cuối cùng này bằng văn bản được mã hóa thực tế, tất nhiên, + +145 +00:09:32,400 --> 00:09:35,250 +được gọi là văn bản mật mã trong trường hợp của chúng ta. + +146 +00:09:35,910 --> 00:09:38,250 +Bây giờ chúng ta chỉ cần làm cho nó thành một chuỗi để nó sẽ chèn + +147 +00:09:38,250 --> 00:09:43,080 +nó khi nó chạy và chúng tôi đã sẵn sàng giải quyết việc cần làm cuối cùng. Vì vậy, ở đây, chúng ta sẽ + +148 +00:09:43,080 --> 00:09:43,620 +gọi + +149 +00:09:43,620 --> 00:09:47,850 +hàm mã hóa và chúng ta sẽ chuyển tất cả các đầu vào + +150 +00:09:47,850 --> 00:09:48,750 +của người dùng. + +151 +00:09:49,140 --> 00:09:53,850 +Vì vậy, nó nhớ rằng tên tham số của chúng tôi là văn bản thuần túy và số lượng dịch chuyển. + +152 +00:09:54,270 --> 00:09:57,840 +Vì vậy, tôi thực sự sẽ sử dụng các đối số từ + +153 +00:09:57,870 --> 00:10:02,870 +khóa, vì vậy tôi sẽ nói văn bản thuần túy bằng văn bản mà người dùng đã nhập vào. + +154 +00:10:04,650 --> 00:10:07,380 +Và sau đó trong đối số tiếp + +155 +00:10:07,530 --> 00:10:12,530 +theo, tôi sẽ nói rằng số lượng shift bằng với shift mà người dùng + +156 +00:10:13,440 --> 00:10:14,273 +đã nhập. + +157 +00:10:17,100 --> 00:10:21,870 +Vì vậy, bây giờ chúng tôi đã sẵn sàng để kiểm tra mã của mình và hãy xem điều gì sẽ xảy ra. + +158 +00:10:22,290 --> 00:10:27,290 +Vì vậy, tôi sẽ sử dụng ví dụ này mà chúng tôi đã thực hiện ở đây bằng cách cố gắng mã + +159 +00:10:27,870 --> 00:10:31,980 +hóa hello với sự thay đổi của năm. Bây giờ, điều đầu tiên chúng ta nhập, hướng, + +160 +00:10:32,010 --> 00:10:35,820 +không thực sự quan trọng vì nó không được sử dụng ở bất kỳ đâu trong mã của + +161 +00:10:36,000 --> 00:10:39,060 +chúng ta, ít nhất là chưa. Vì vậy, bạn có thể gõ bất + +162 +00:10:39,060 --> 00:10:43,380 +cứ thứ gì bạn muốn, tôi sẽ gõ mã hóa. Và sau đó tin nhắn sẽ là lời chào. + +163 +00:10:44,310 --> 00:10:47,790 +Và số ca sẽ là năm. + +164 +00:10:48,390 --> 00:10:52,500 +Và bây giờ nó cho chúng ta biết rằng văn bản được mã hóa là + +165 +00:10:52,830 --> 00:10:55,410 +mjqqt, phù hợp với đầu ra mong đợi. + +166 +00:10:55,990 --> 00:11:00,430 +Bạn có thể nghĩ rằng chúng ta đã hoàn thành, phải không? Đây là hoàn hảo. Điều này thật tuyệt + +167 +00:11:00,430 --> 00:11:03,850 +và chúng tôi đã hoàn thành toàn bộ bài tập này. + +168 +00:11:04,390 --> 00:11:07,600 +Nhưng chúng ta hãy xem xét một kịch bản khác. + +169 +00:11:08,200 --> 00:11:13,200 +Điều gì sẽ xảy ra nếu chúng ta cố gắng mã hóa một từ có các chữ cái thực sự + +170 +00:11:15,190 --> 00:11:17,200 +gần với phần cuối của bảng chữ cái? + +171 +00:11:17,770 --> 00:11:22,360 +Giả sử rằng chúng tôi muốn mã hóa tin nhắn zulu. + +172 +00:11:23,320 --> 00:11:26,590 +Bây giờ tôi chỉ làm điều đó bởi vì nếu có một chữ z trong từ đó, tất nhiên. + +173 +00:11:27,100 --> 00:11:29,380 +Và chúng tôi muốn thay đổi nó lên năm. + +174 +00:11:29,560 --> 00:11:32,620 +Bây giờ chúng ta hãy nghĩ về những gì sẽ xảy ra phải không? Trong mã của chúng ta, + +175 +00:11:32,620 --> 00:11:36,130 +chúng ta sẽ lấy từng chữ cái, trước tiên chúng ta sẽ + +176 +00:11:36,490 --> 00:11:41,490 +lấy z và sau đó chúng ta sẽ lấy vị trí của nó trong bảng chữ cái và + +177 +00:11:41,530 --> 00:11:45,430 +thêm số lượng dịch chuyển vào vị trí để có được vị trí mới. + +178 +00:11:45,910 --> 00:11:50,620 +Bây giờ, cái này đã ở cuối bảng chữ cái. Vì vậy, nếu con số này sẽ là + +179 +00:11:50,620 --> 00:11:52,150 +25, bởi vì có + +180 +00:11:52,180 --> 00:11:57,180 +26 chữ cái trong bảng chữ cái và chúng ta bắt đầu vị trí ở số không. + +181 +00:11:57,820 --> 00:12:01,210 +Vì vậy, cộng với năm này sẽ là 30. + +182 +00:12:01,750 --> 00:12:06,580 +Và điều gì sẽ xảy ra khi chúng ta cố gắng lấy mục thứ 30 từ bảng chữ cái? Chà, bạn sẽ tìm ra khi + +183 +00:12:06,610 --> 00:12:07,900 +tôi nhấn enter. + +184 +00:12:08,350 --> 00:12:13,350 +Chúng tôi gặp lỗi chỉ mục và nó cho chúng tôi biết rằng chỉ mục danh sách nằm ngoài + +185 +00:12:13,690 --> 00:12:16,240 +phạm vi và nó xảy ra ở dòng 15. + +186 +00:12:16,660 --> 00:12:20,710 +Vì vậy, đúng như chúng tôi dự đoán, điều này không tồn tại. + +187 +00:12:21,100 --> 00:12:25,510 +Chúng ta phải cố gắng và giải quyết vấn đề này phải không? Vì vậy, nếu bạn chưa nghĩ đến điều này, + +188 +00:12:25,630 --> 00:12:29,440 +đây là lúc để suy nghĩ về cách bạn có thể giải quyết vấn đề này. + +189 +00:12:30,160 --> 00:12:35,160 +Tôi muốn bạn tạm dừng một chút và thử xem bạn có thể khắc phục được không. + +190 +00:12:39,480 --> 00:12:39,870 +Được rồi. + +191 +00:12:39,870 --> 00:12:44,870 +Vì vậy, chúng ta biết rằng điều này có độ dài cố định và những gì chúng ta muốn xảy + +192 +00:12:46,470 --> 00:12:51,470 +ra khi chúng ta có một chữ cái ở cuối mà chúng ta cần mã hóa là lặp lại phần + +193 +00:12:51,720 --> 00:12:54,360 +đầu của bảng chữ cái. Vì vậy, để giải quyết vấn + +194 +00:12:54,600 --> 00:12:59,600 +đề này, tất cả những gì chúng ta phải làm chỉ là sao chép các chữ cái hiện có trong bảng chữ cái và + +195 +00:13:00,450 --> 00:13:02,610 +sau đó chỉ cần sao chép nó một lần nữa. + +196 +00:13:03,120 --> 00:13:08,120 +Vì vậy, điều này có nghĩa là nếu chúng ta tìm thấy một chữ cái là z và nó cần + +197 +00:13:08,190 --> 00:13:13,020 +được chuyển lên năm chữ cái, thì nó sẽ tiếp tục cho đến khi nó chuyển sang chữ e. + +198 +00:13:13,650 --> 00:13:14,010 +Bây + +199 +00:13:14,010 --> 00:13:19,010 +giờ, điều thực sự tuyệt vời về hàm chỉ mục này là nó sẽ cung cấp cho bạn + +200 +00:13:19,080 --> 00:13:21,510 +chỉ mục đầu tiên mà nó tìm thấy. + +201 +00:13:21,960 --> 00:13:26,370 +Vì vậy, nếu chúng ta đang tìm kiếm chữ cái a, nó sẽ cung cấp cho bạn chỉ số 0 và + +202 +00:13:26,670 --> 00:13:28,080 +sau đó nó sẽ dừng lại. + +203 +00:13:28,170 --> 00:13:33,170 +Nó sẽ không tìm kiếm tất cả các chỉ số và tìm thấy chỉ số này ở vị trí 26. + +204 +00:13:33,690 --> 00:13:36,690 +Vì vậy, nó có nghĩa là mã của chúng ta bây + +205 +00:13:37,020 --> 00:13:41,670 +giờ sẽ hoạt động ngay cả khi chúng ta có một từ có nhiều chữ cái + +206 +00:13:41,670 --> 00:13:44,970 +ở cuối bảng chữ cái. Hãy tiếp tục và cho nó một vòng quay, + +207 +00:13:46,100 --> 00:13:46,890 +1: Phải không? + +208 +00:13:46,890 --> 00:13:51,240 +0: Hãy gõ mã hóa. Và thông điệp của chúng tôi + +209 +00:13:51,510 --> 00:13:55,140 +là một lần nữa, zulu. Và chúng tôi nhấn enter. + +210 +00:13:55,800 --> 00:14:00,300 +Và sau đó chúng ta có một số thay đổi là năm và chúng ta nhận được văn bản được mã hóa của mình. + +211 +00:14:00,540 --> 00:14:03,810 +z trở thành một, hai, ba, bốn, năm, + +212 +00:14:03,810 --> 00:14:08,250 +nó trở thành e, và u, một, hai, ba, bốn, + +213 +00:14:08,250 --> 00:14:12,870 +năm, trở thành z. Vì vậy, bây giờ chúng tôi đã giải quyết được lỗi nhỏ đó. + +214 +00:14:14,520 --> 00:14:17,280 +Bây giờ có rất nhiều cách khác mà bạn có thể giải quyết + +215 +00:14:17,310 --> 00:14:21,960 +lỗi này, nhưng tôi nghĩ đây là cách dễ nhất mà không làm ảnh hưởng đến logic của chúng ta ở đây + +216 +00:14:21,960 --> 00:14:24,330 +và không làm cho chức năng của chúng ta lâu hơn. + +217 +00:14:25,110 --> 00:14:29,310 +Nếu bạn gặp bất kỳ vấn đề nào với mã của mình, thì đây là lúc quay lại + +218 +00:14:29,310 --> 00:14:33,630 +và sửa nó và đảm bảo rằng bạn thực sự hiểu mọi thứ đang diễn ra ở đây trước + +219 +00:14:33,930 --> 00:14:37,530 +khi chuyển sang bài học tiếp theo. Nhưng khi bạn đã sẵn sàng, tôi sẽ + +220 +00:14:37,770 --> 00:14:41,160 +gặp bạn trong bài học tiếp theo, nơi chúng ta sẽ giải mã mã của chúng ta. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar-Cipher-1-End.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar-Cipher-1-End.url new file mode 100644 index 0000000000000000000000000000000000000000..8b6d27f124f02b0e8b34835eecf7047bc139c429 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar-Cipher-1-End.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-1-end \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar-Cipher-1-Start.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar-Cipher-1-Start.url new file mode 100644 index 0000000000000000000000000000000000000000..00eeabaaf309d24e880713e678e564148b6cc608 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Caesar-Cipher-1-Start.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-1-start \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Python-List-index-Method.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Python-List-index-Method.url new file mode 100644 index 0000000000000000000000000000000000000000..ec37bd5939c1791d964467ed30e0c0633d3bd12e --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/006 Python-List-index-Method.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/ref_list_index.asp \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar Cipher Part 2 - Decryption.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar Cipher Part 2 - Decryption.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c7bde6f460bc984b1cb7623cdc458b11c38472c5 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar Cipher Part 2 - Decryption.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51cb834fc6497bfd17c6a294ac8b5849d8d8cbd96b7b48f3eb4f6d45613635dc +size 89732069 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar Cipher Part 2 - Decryption_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar Cipher Part 2 - Decryption_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..026c1e73a7639270af9c8957e8d49dc60efddb28 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar Cipher Part 2 - Decryption_vi.srt @@ -0,0 +1,396 @@ +1 +00:00:00,780 --> 00:00:05,110 +Được rồi. Vì vậy, bây giờ chúng ta đã quản lý để chương + +2 +00:00:05,470 --> 00:00:07,960 +trình của mình mã hóa một số văn bản, đã đến lúc làm + +3 +00:00:07,990 --> 00:00:12,990 +theo hướng ngược lại, đó là cách chúng ta làm cho chương trình của mình có thể giải mã một đoạn văn bản dựa trên + +4 +00:00:13,210 --> 00:00:14,043 +một số shift. + +5 +00:00:14,470 --> 00:00:19,470 +Vì vậy, giả sử rằng chúng tôi cố gắng giải mã chữ G và chúng tôi có một số thay + +6 +00:00:19,690 --> 00:00:21,760 +đổi là ba. Chà, trong trường + +7 +00:00:21,790 --> 00:00:26,790 +hợp này, chúng ta thực sự phải làm việc lùi lại và chuyển lùi trong bảng + +8 +00:00:27,700 --> 00:00:31,960 +chữ cái để có được chữ cái có ba dấu cách trước đó. + +9 +00:00:32,320 --> 00:00:33,070 +Vì vậy, + +10 +00:00:33,070 --> 00:00:37,510 +trong trường hợp này, đó sẽ là D. Hãy tiếp tục và đi đến + +11 +00:00:37,510 --> 00:00:41,860 +caesar- cipher-2-start và phân nhánh bản sao của chính bạn về nó. + +12 +00:00:43,000 --> 00:00:46,720 +Được rồi, chúng ta đã có tất cả mã ở cuối phần một, + +13 +00:00:47,170 --> 00:00:50,170 +nhưng bây giờ chúng ta phải tạo hàm giải mã. + +14 +00:00:50,890 --> 00:00:52,960 +Và hàm giải mã một lần + +15 +00:00:52,960 --> 00:00:57,960 +nữa sẽ lấy văn bản mà người dùng đã nhập và số shift, và cả hai + +16 +00:00:58,810 --> 00:01:02,050 +thứ này sẽ đi vào hàm dưới dạng đầu vào. + +17 +00:01:02,710 --> 00:01:04,599 +Và sau đó bên trong hàm, chúng + +18 +00:01:04,660 --> 00:01:09,660 +ta sẽ chuyển từng chữ cái của văn bản về phía sau trong bảng chữ cái theo số + +19 +00:01:10,000 --> 00:01:12,100 +lượng dịch chuyển. Ví dụ: nếu chúng + +20 +00:01:12,220 --> 00:01:17,220 +ta bắt đầu với mã này và chúng ta cần dịch chuyển mỗi chữ cái đi năm chữ cái, thì chúng ta + +21 +00:01:17,980 --> 00:01:22,450 +sẽ kết thúc với văn bản thuần túy, xin chào. Và cuối cùng, chức năng của chúng ta cần in + +22 +00:01:22,510 --> 00:01:24,430 +văn bản đã giải mã, tùy thuộc + +23 +00:01:24,700 --> 00:01:29,700 +vào nó là gì mà chúng ta thực sự nhận được. Cuối cùng, trong phần việc cần làm thứ + +24 +00:01:30,760 --> 00:01:32,440 +ba, chúng ta sẽ + +25 +00:01:32,770 --> 00:01:35,830 +sử dụng biến hướng mà chúng ta đã bỏ + +26 +00:01:35,830 --> 00:01:40,660 +qua trước đó, nơi chúng ta yêu cầu người dùng nhập mã hóa nếu họ + +27 +00:01:40,720 --> 00:01:44,050 +muốn mã hóa và giải mã nếu họ muốn giải mã. + +28 +00:01:44,650 --> 00:01:49,450 +Và sau đó chúng ta sẽ sử dụng một câu lệnh if ở đây để kiểm tra xem họ đã + +29 +00:01:49,930 --> 00:01:54,280 +chọn cái nào và sau đó chúng ta sẽ gọi hàm tương ứng dựa trên hướng đó. + +30 +00:01:54,760 --> 00:01:57,580 +Và khi bạn đã hoàn thành cả ba việc cần + +31 +00:01:57,670 --> 00:02:02,050 +làm, bạn sẽ có thể chạy chương trình của mình và mã hóa thông báo cũng + +32 +00:02:03,340 --> 00:02:06,970 +như giải mã thông báo khi bạn nhấn chạy lại, tương tự + +33 +00:02:09,460 --> 00:02:10,293 +như vậy. + +34 +00:02:10,990 --> 00:02:15,340 +Hãy suy nghĩ về cách bạn có thể giải quyết từng việc trong ba việc cần làm, sau đó tạm + +35 +00:02:15,340 --> 00:02:16,630 +dừng video và tiếp tục. + +36 +00:02:21,380 --> 00:02:25,850 +Được rồi. Vậy điều đó đã diễn ra như thế nào? Phần đầu tiên sẽ khá dễ dàng. + +37 +00:02:26,150 --> 00:02:29,870 +Tất cả những gì chúng ta phải làm là xác định một hàm + +38 +00:02:30,410 --> 00:02:35,270 +mới được gọi là giải mã và giải mã này sẽ nhận các đầu vào giống như mã hóa + +39 +00:02:35,450 --> 00:02:39,710 +của chúng ta, đó là văn bản và sự dịch chuyển mà người dùng đã nhập. + +40 +00:02:40,220 --> 00:02:41,030 +Nhưng một lần + +41 +00:02:41,030 --> 00:02:45,020 +nữa, tôi sẽ sử dụng một số tên tham số khác nhau để có thể phân biệt các + +42 +00:02:45,020 --> 00:02:47,540 +đối số và tham số. Vì vậy, trong trường + +43 +00:02:47,540 --> 00:02:51,080 +hợp này, bởi vì văn bản mà tôi nhận được sẽ bị xáo + +44 +00:02:51,380 --> 00:02:53,990 +trộn, tôi sẽ gọi tham số đầu tiên là + +45 +00:02:54,620 --> 00:02:58,520 +cipher_text và tham số thứ hai tôi sẽ gọi lại nó, số lượng dịch chuyển. + +46 +00:02:59,170 --> 00:03:03,640 +Bây giờ, sau dấu hai chấm, tôi đã xong việc cần làm 1. Bây giờ chúng ta hãy chuyển sang việc + +47 +00:03:03,640 --> 00:03:04,630 +cần làm 2. + +48 +00:03:05,950 --> 00:03:09,520 +Vì vậy, ở đây tôi phải ở bên trong hàm giải mã, vì vậy + +49 +00:03:09,580 --> 00:03:11,950 +được thụt lề vào bên trong hàm, và sau + +50 +00:03:12,550 --> 00:03:17,230 +đó tôi sẽ dịch chuyển từng chữ cái của bản mã về phía sau trong bảng chữ cái theo + +51 +00:03:17,230 --> 00:03:19,390 +số lượng dịch chuyển và sau đó in + +52 +00:03:19,630 --> 00:03:23,110 +ra văn bản đã giải mã. Để làm điều đó, một lần nữa + +53 +00:03:23,110 --> 00:03:24,310 +tôi sẽ cần một + +54 +00:03:24,880 --> 00:03:28,990 +vòng lặp for và tôi sẽ lặp lại từng chữ cái trong văn bản mật mã. + +55 +00:03:29,710 --> 00:03:31,810 +Và đối với mỗi chữ cái + +56 +00:03:31,870 --> 00:03:36,870 +đó, điều tôi muốn làm là tôi muốn nắm được vị trí của chúng + +57 +00:03:37,390 --> 00:03:41,530 +trong bảng chữ cái. Vì vậy, tôi sẽ kiểm tra bảng chữ cái + +58 +00:03:41,530 --> 00:03:43,210 +và sau đó sử dụng lại, hàm + +59 +00:03:43,630 --> 00:03:46,570 +chỉ mục đó và sau đó nhấn vào vị trí của chữ cái. + +60 +00:03:47,950 --> 00:03:51,940 +Khi tôi đã có vị trí, tôi sẽ xác định vị trí mới sẽ + +61 +00:03:52,360 --> 00:03:55,570 +là vị trí hiện tại. Bây giờ, hãy nhớ rằng, + +62 +00:03:55,600 --> 00:03:58,420 +chúng ta đang di chuyển ngược lại bảng chữ cái. + +63 +00:03:58,450 --> 00:04:02,680 +Vì vậy, tôi sẽ trừ số tiền dịch chuyển từ vị trí. + +64 +00:04:03,520 --> 00:04:04,720 +Sau khi hoàn + +65 +00:04:04,780 --> 00:04:09,220 +tất, tôi có thể xác định một biến trống được gọi là văn bản thuần túy, + +66 +00:04:09,640 --> 00:04:11,770 +biến đó sẽ trở thành một chuỗi trống. + +67 +00:04:12,400 --> 00:04:15,790 +Và khi tôi đã nắm được từng vị trí mới, tôi có + +68 +00:04:16,149 --> 00:04:21,149 +thể thêm vào văn bản thuần túy đó bằng cách chạm vào bảng chữ cái và sau đó + +69 +00:04:22,780 --> 00:04:27,400 +nắm giữ chữ cái ở vị trí mới. Vì vậy, bây giờ cuối cùng, sau khi + +70 +00:04:27,400 --> 00:04:29,230 +hoàn thành vòng lặp for, sau + +71 +00:04:29,470 --> 00:04:34,470 +đó tôi có thể in ra kết quả và tôi sẽ sử dụng cùng một loại cấu trúc + +72 +00:04:34,660 --> 00:04:37,150 +đầu ra như tôi đã có trong ví dụ. + +73 +00:04:37,780 --> 00:04:42,780 +Và chúng tôi sẽ thay thế văn bản được mã hóa cứng đó bằng văn bản thuần túy mà chúng tôi + +74 +00:04:43,420 --> 00:04:45,280 +đã giải mã. Và cuối cùng, + +75 +00:04:45,280 --> 00:04:49,420 +tôi chỉ cần biến cái này thành một sợi dây để nó thực sự được đưa vào. + +76 +00:04:49,990 --> 00:04:54,130 +Bây giờ, điều cuối cùng tôi phải làm là việc cần làm thứ ba. + +77 +00:04:54,640 --> 00:04:58,300 +Vì vậy, ở đây chúng tôi thực sự sẽ kiểm tra biến hướng. + +78 +00:04:58,930 --> 00:05:02,890 +Và chúng ta sẽ thấy rằng nếu nó bằng với mã hóa, thì chúng ta + +79 +00:05:02,890 --> 00:05:07,180 +sẽ gọi phương thức mã hóa đó mà chúng ta đã có trước đó, vì vậy được + +80 +00:05:07,570 --> 00:05:11,410 +thụt vào bên trong câu lệnh if. Nhưng khác nếu hướng + +81 +00:05:11,440 --> 00:05:16,180 +thực sự bằng với giải mã, tốt trong trường hợp này, chúng + +82 +00:05:16,180 --> 00:05:20,740 +ta sẽ gọi hàm giải mã mới được tạo của chúng ta. + +83 +00:05:21,280 --> 00:05:26,280 +Và chúng ta sẽ chuyển văn bản mật mã vì văn bản và lượng shift + +84 +00:05:27,970 --> 00:05:31,360 +sẽ tương đương với shift. Vì vậy, một lần nữa, + +85 +00:05:31,480 --> 00:05:34,390 +các đối số này xuất phát từ đây khi chúng + +86 +00:05:34,450 --> 00:05:37,180 +tôi yêu cầu người dùng nhập các giá trị đó. + +87 +00:05:37,780 --> 00:05:41,890 +Và bây giờ nó sẽ chuyển sang chức năng giải mã và thực hiện mọi thứ bên + +88 +00:05:41,890 --> 00:05:43,630 +trong để giải mã văn bản. + +89 +00:05:44,110 --> 00:05:47,980 +Vì vậy, bây giờ chúng ta hãy chạy chương trình của chúng tôi và chỉ cần đảm + +90 +00:05:47,980 --> 00:05:52,240 +bảo rằng nó hoạt động như mong đợi. Vì vậy, tôi sẽ mã hóa tin nhắn xin + +91 +00:05:53,020 --> 00:05:56,530 +chào của chúng ta, dịch chuyển nó sang năm, và sau đó tôi sẽ chạy lại. + +92 +00:05:56,930 --> 00:05:59,540 +Và tôi sẽ thử giải mã tin nhắn này ngay bây giờ. + +93 +00:06:00,950 --> 00:06:05,450 +Vì vậy, tôi sẽ nhập giải mã và tôi sẽ dán vào thông báo mà chúng tôi đã có + +94 +00:06:06,140 --> 00:06:08,600 +trước đó và nhập cùng một số chuyển đổi + +95 +00:06:09,020 --> 00:06:11,810 +và bây giờ chúng tôi đã giải mã văn bản của mình. + +96 +00:06:12,590 --> 00:06:16,310 +Vì vậy, đó là cách bạn giải quyết bước 2 của dự án của chúng tôi. + +97 +00:06:16,970 --> 00:06:20,690 +Xem lại mã ở đây và khi bạn đã sẵn sàng, hãy + +98 +00:06:20,810 --> 00:06:25,040 +chuyển sang bài học tiếp theo và chúng ta sẽ đề cập đến phần + +99 +00:06:25,040 --> 00:06:29,060 +3 của mật mã Caeser. Vì vậy, về tất cả những điều đó, và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar-Cipher-2-End.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar-Cipher-2-End.url new file mode 100644 index 0000000000000000000000000000000000000000..a4fec3a9367a4b7003e0069568433f7fedd84b56 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar-Cipher-2-End.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-2-end \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar-Cipher-2-Start.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar-Cipher-2-Start.url new file mode 100644 index 0000000000000000000000000000000000000000..92d108f771c5d7e2cca77ecd29f20b87816a7fc3 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/007 Caesar-Cipher-2-Start.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-2-start \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar Cipher Part 3 - Reorganising our Code.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar Cipher Part 3 - Reorganising our Code.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5cbf5631055eb9cc5a7cd9dbd75adcef0582add1 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar Cipher Part 3 - Reorganising our Code.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f24cec3ad4b4baa1c80b185333c694397653a303d03cffcbaecd4deab2700216 +size 81113991 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar Cipher Part 3 - Reorganising our Code_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar Cipher Part 3 - Reorganising our Code_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..db73dfbc31001aed9f2998ef44067b408abdf778 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar Cipher Part 3 - Reorganising our Code_vi.srt @@ -0,0 +1,600 @@ +1 +00:00:00,360 --> 00:00:04,440 +Được rồi. Vì vậy, bây giờ chúng ta có thể mã hóa và giải mã tin + +2 +00:00:04,440 --> 00:00:08,010 +nhắn của mình, bạn có thể hỏi, à, còn gì nữa không? Chúng tôi đã hoàn + +3 +00:00:08,010 --> 00:00:11,670 +thành dự án, phải không? Chúng ta hãy nghĩ về cách chúng ta có thể cải thiện mã của mình. + +4 +00:00:12,300 --> 00:00:17,070 +Bởi vì nếu bạn nhìn vào các chức năng mã hóa và giải mã, bạn + +5 +00:00:17,460 --> 00:00:21,510 +sẽ nhận thấy rằng rất nhiều thứ mà chúng đang làm trong + +6 +00:00:21,510 --> 00:00:25,620 +đó rất giống nhau, phải không? Chúng tôi có một số đoạn chuỗi + +7 +00:00:25,890 --> 00:00:30,890 +trống để bắt đầu, chúng tôi lặp lại từng chữ cái trong văn bản mà chúng tôi được chuyển qua + +8 +00:00:31,470 --> 00:00:35,040 +và chúng tôi nhận được vị trí từ bảng chữ cái, có được một vị + +9 +00:00:35,280 --> 00:00:38,550 +trí mới và sau đó thêm chữ cái mới vào đó chuỗi rỗng. + +10 +00:00:39,390 --> 00:00:44,390 +Thử thách của bạn trong phần này của dự án mật mã Caesar là kết hợp + +11 +00:00:45,720 --> 00:00:50,720 +các hàm mã hóa và giải mã thành một hàm duy nhất có tên là Cesar. + +12 +00:00:52,140 --> 00:00:56,310 +Và chúng ta sẽ loại bỏ các câu lệnh if và + +13 +00:00:56,700 --> 00:01:01,170 +elif này, và chúng ta sẽ loại bỏ hai hàm chồng chéo. + +14 +00:01:01,230 --> 00:01:05,790 +Và thay vào đó, chúng ta sẽ chỉ có một chức năng duy nhất và + +15 +00:01:05,790 --> 00:01:10,350 +chúng ta sẽ gọi nó chỉ một lần chuyển qua văn bản, shift và hướng. + +16 +00:01:10,800 --> 00:01:15,690 +Vì vậy, nó sẽ có ba đầu vào và nó sẽ giúp chúng ta tiết kiệm rất nhiều lần lặp lại trong mã + +17 +00:01:15,720 --> 00:01:16,553 +của chúng ta. + +18 +00:01:17,130 --> 00:01:22,130 +Hãy suy nghĩ về những gì bạn đã học về các hàm với đầu vào và xem liệu bạn có + +19 +00:01:22,170 --> 00:01:26,040 +thể hoàn thành thử thách này không. Vì vậy, hãy tạm dừng video ngay bây giờ và thử xem. + +20 +00:01:29,720 --> 00:01:30,553 +1: Được rồi. + +21 +00:01:31,130 --> 00:01:31,430 +0: Được rồi. + +22 +00:01:31,430 --> 00:01:36,350 +Vì vậy, trước tiên hãy tạo một hàm mới và chúng ta sẽ gọi nó là caesar. + +23 +00:01:37,520 --> 00:01:40,970 +Lần này hàm này sẽ sử dụng ba đầu vào. + +24 +00:01:41,300 --> 00:01:45,080 +Nó không chỉ là để nhận được văn bản, sự thay đổi, mà còn + +25 +00:01:45,290 --> 00:01:47,180 +là để có được hướng đi. + +26 +00:01:47,930 --> 00:01:52,930 +Vì vậy, tôi sẽ gọi tham số đầu tiên start_text bởi vì chúng ta có thể được chuyển sang + +27 +00:01:53,240 --> 00:01:58,070 +văn bản thuần túy hoặc văn bản mật mã. Vì vậy, hãy đặt nó làm văn bản bắt đầu. + +28 +00:01:58,610 --> 00:02:00,260 +Cái tiếp theo tôi sẽ gọi tương + +29 +00:02:00,260 --> 00:02:03,620 +tự vì vậy tôi sẽ gọi nó là shift_amount. Và cuối cùng là hướng, + +30 +00:02:03,620 --> 00:02:08,389 +để phân biệt nó với hướng này, tôi sẽ làm cho nó dài + +31 +00:02:08,720 --> 00:02:10,280 +hơn một chút. + +32 +00:02:10,430 --> 00:02:12,950 +Vì vậy, tôi sẽ gọi nó là cipher_direction. + +33 +00:02:14,360 --> 00:02:16,640 +Và bây giờ sau dấu hai chấm, chúng ta + +34 +00:02:16,700 --> 00:02:21,700 +đã hoàn tất việc xác định hàm của mình và chúng ta có thể bắt đầu tìm cách kết + +35 +00:02:21,800 --> 00:02:25,580 +hợp hai hàm này với nhau. Chúng tôi biết trong cả hai cách + +36 +00:02:25,580 --> 00:02:29,270 +này, chúng tôi cần một số cách lưu trữ một đoạn văn bản + +37 +00:02:29,570 --> 00:02:31,070 +bắt đầu trống rỗng + +38 +00:02:31,340 --> 00:02:35,720 +và sau đó nó trở thành toàn bộ văn bản được mã hóa hoặc giải mã. + +39 +00:02:36,260 --> 00:02:41,260 +Hãy tạo một biến mới có tên end_text để tương phản với start_text. + +40 +00:02:42,680 --> 00:02:45,110 +Và chúng tôi bắt đầu như một chuỗi rỗng. + +41 +00:02:45,890 --> 00:02:48,500 +Bây giờ, điều tiếp theo chúng ta phải làm là giống hệt nhau. + +42 +00:02:48,500 --> 00:02:51,950 +Chúng tôi phải lặp lại văn bản này mà chúng tôi đã được chuyển qua. + +43 +00:02:52,310 --> 00:02:57,310 +Vì vậy, hãy tạo một vòng lặp for; đối với mỗi chữ cái trong start_text, chúng ta sẽ làm điều gì + +44 +00:02:57,530 --> 00:03:00,640 +đó với mỗi chữ cái đó. Cụ thể, chúng ta + +45 +00:03:00,640 --> 00:03:04,090 +sẽ nắm bắt vị trí của chữ cái trong bảng chữ cái. + +46 +00:03:05,230 --> 00:03:09,820 +Vì vậy, dòng mã này thực sự giống hệt nhau giữa hai chức năng; vị trí bằng bảng + +47 +00:03:09,820 --> 00:03:14,820 +chữ cái bằng cách sử dụng hàm chỉ mục để nắm giữ chỉ mục của chữ cái mà chúng + +48 +00:03:16,870 --> 00:03:18,430 +ta hiện đang lặp lại. + +49 +00:03:19,330 --> 00:03:23,920 +Phần tiếp theo hơi phức tạp một chút vì một mặt khi chúng tôi mã hóa văn bản, + +50 +00:03:24,250 --> 00:03:28,480 +chúng tôi đang chuyển vị trí đó lên trên bằng cách thêm số lượng dịch chuyển. + +51 +00:03:29,020 --> 00:03:31,420 +Nhưng mặt khác, khi chúng tôi giải mã, + +52 +00:03:31,690 --> 00:03:34,510 +chúng tôi đang trừ lượng dịch chuyển từ vị trí. + +53 +00:03:35,440 --> 00:03:39,700 +Vì vậy, một cách để làm điều này, tất nhiên, bằng cách sử dụng câu lệnh if. Vì vậy, bạn có thể kiểm tra + +54 +00:03:39,700 --> 00:03:44,700 +xem cipher_direction có bằng với mã hóa hay không. Vậy thì trong trường hợp + +55 +00:03:47,440 --> 00:03:52,440 +này, vị trí mới sẽ bằng vị trí cộng với shift_amount. + +56 +00:03:54,220 --> 00:03:56,170 +Và sau đó bạn có thể làm câu lệnh khác. + +57 +00:03:56,710 --> 00:04:00,250 +Nhưng thực sự có một cách thậm chí còn dễ dàng hơn để làm điều này. + +58 +00:04:00,670 --> 00:04:05,620 +Chúng tôi chỉ có thể kiểm tra xem hướng mật mã đã được giải mã hay chưa. + +59 +00:04:06,370 --> 00:04:11,370 +Và trong trường hợp này, chúng tôi lấy số tiền ca và chúng tôi nhân nó với trừ một. + +60 +00:04:14,530 --> 00:04:17,800 +Vì vậy, hãy nhớ dòng mã này + +61 +00:04:18,089 --> 00:04:21,870 +giống hệt như 2: this, nhưng nó ngắn gọn hơn. + +62 +00:04:22,560 --> 00:04:24,690 +0: Và bây giờ bên ngoài câu lệnh if, + +63 +00:04:24,840 --> 00:04:29,840 +chúng ta có thể xác định vị trí mới của mình và đặt nó bằng vị trí trước đó cộng + +64 +00:04:32,280 --> 00:04:33,810 +với số lượng dịch chuyển. + +65 +00:04:34,710 --> 00:04:39,710 +Và lý do tại sao điều này hoạt động là vì giả sử rằng chúng tôi có số lượng dịch + +66 +00:04:40,530 --> 00:04:45,530 +chuyển là năm và chúng tôi muốn mã hóa văn bản của mình, vị trí mới rõ ràng sẽ là + +67 +00:04:46,920 --> 00:04:50,460 +vị trí trước đó cộng với năm. Mặt khác, nếu chúng + +68 +00:04:50,460 --> 00:04:52,710 +ta đang giải mã, thì câu + +69 +00:04:52,710 --> 00:04:57,710 +lệnh if này sẽ có hiệu lực và năm của chúng ta nhân với + +70 +00:05:00,720 --> 00:05:05,370 +trừ một sẽ trở thành trừ năm. Vì vậy, bây giờ khi chúng ta + +71 +00:05:05,370 --> 00:05:06,510 +thêm -5 vào + +72 +00:05:06,630 --> 00:05:10,920 +vị trí trước đó, vì vậy giả sử vị trí trước đó là + +73 +00:05:11,250 --> 00:05:16,170 +12 cộng với -5, sau đó kiểm tra nhanh bằng máy tính sẽ cho bạn 7. + +74 +00:05:16,830 --> 00:05:19,860 +Nó hoàn toàn giống với phép trừ. + +75 +00:05:20,850 --> 00:05:22,920 +Vì vậy, bây giờ chúng ta đã vượt + +76 +00:05:23,640 --> 00:05:28,640 +qua rào cản đó, tất cả những gì chúng ta phải làm là khai thác văn bản của mình + +77 +00:05:30,210 --> 00:05:33,300 +và thêm vào văn bản đó bằng cách giữ chữ cái ở + +78 +00:05:34,800 --> 00:05:38,940 +vị trí mới trong bảng chữ cái. Và cuối cùng, khi tất cả những điều + +79 +00:05:38,970 --> 00:05:41,700 +đó đã hoàn thành, tất nhiên chúng ta cần in kết quả. + +80 +00:05:42,480 --> 00:05:47,480 +Lưu ý rằng trước đây chúng ta đã nói văn bản được mã hóa là gì và văn bản được + +81 +00:05:48,780 --> 00:05:52,740 +giải mã là như thế nào, hãy sao chép chuỗi này và dán vào đây. + +82 +00:05:53,190 --> 00:05:57,800 +Làm thế nào chúng ta có thể thay đổi phần này thành động, vì vậy tùy thuộc + +83 +00:05:57,950 --> 00:05:59,960 +vào hướng mật mã, và sau đó phần + +84 +00:06:00,530 --> 00:06:04,790 +này rất dễ dàng vì chúng ta chỉ có thể thay thế nó bằng văn + +85 +00:06:04,790 --> 00:06:05,623 +bản end_. + +86 +00:06:06,110 --> 00:06:10,370 +Vì vậy, một cách là, hãy nhớ rằng khi người dùng đang gõ theo hướng, + +87 +00:06:10,670 --> 00:06:15,670 +họ đang nhập mã hóa hoặc giải mã. Vì vậy, chúng tôi có thể xóa mọi thứ + +88 +00:06:15,770 --> 00:06:20,770 +khác ngoài 'd' đó và sau đó tự động chèn hướng mật mã mà chúng tôi nhận được. + +89 +00:06:25,130 --> 00:06:27,620 +Và bây giờ nếu chúng ta tạo ra một chuỗi, + +90 +00:06:27,920 --> 00:06:32,920 +nó sẽ có thể chèn văn bản được mã hóa vào bất kể văn bản kết thúc là gì, hoặc văn + +91 +00:06:35,870 --> 00:06:36,590 +bản được + +92 +00:06:36,590 --> 00:06:41,590 +giải mã là bất kể nó có thể là gì. Bây giờ chúng ta có thể tiếp + +93 +00:06:42,320 --> 00:06:43,153 +tục + +94 +00:06:43,640 --> 00:06:48,640 +và xóa cả hai hàm này và cả câu lệnh if này và chúng ta + +95 +00:06:50,570 --> 00:06:53,930 +có thể giải quyết việc cần làm số hai và + +96 +00:06:54,410 --> 00:06:59,180 +chúng ta có thể chỉ cần gọi hàm Caesar chuyển qua start_text dưới dạng + +97 +00:06:59,510 --> 00:07:03,440 +văn bản mà người dùng nhập vào, shift_amount là shift mà + +98 +00:07:03,770 --> 00:07:08,770 +họ đã nhập, và cuối cùng, hướng cypher như hướng mà họ đã nhập. + +99 +00:07:09,740 --> 00:07:12,350 +Bây giờ, chúng tôi đã cắt giảm mã của mình rất + +100 +00:07:12,530 --> 00:07:17,180 +nhiều và chúng tôi đã loại bỏ tất cả các đoạn mã lặp đi lặp lại và chúng tôi đã sử + +101 +00:07:17,180 --> 00:07:22,180 +dụng những gì chúng tôi đã học về các hàm với đầu vào để đơn giản hóa đáng kể mã của chúng tôi. + +102 +00:07:23,360 --> 00:07:26,780 +Chúng tôi nhận được cùng một chức năng để thực hiện các hành động + +103 +00:07:27,080 --> 00:07:30,110 +lặp lại, nhưng tùy thuộc vào các đầu vào khác nhau, nó + +104 +00:07:30,650 --> 00:07:33,230 +thực hiện một cái gì đó hoàn toàn khác. + +105 +00:07:34,040 --> 00:07:38,390 +Vì vậy, bây giờ chúng ta hãy chạy mã của chúng ta và hãy đảm bảo rằng mọi thứ đều hoạt động. + +106 +00:07:38,930 --> 00:07:39,800 +Mã hóa. + +107 +00:07:43,420 --> 00:07:44,253 +3: Được rồi. + +108 +00:07:45,820 --> 00:07:47,110 +0: Và giải mã. + +109 +00:07:48,910 --> 00:07:53,910 +Vì vậy, có một chút vấn đề ở đó vì khi chúng tôi lấy lại kết quả đã giải mã của + +110 +00:07:54,280 --> 00:07:58,930 +mình, nó sẽ nói holvo thay vì xin chào. Vậy điều gì đang xảy ra ở đây? + +111 +00:07:59,860 --> 00:08:04,030 +Chà, trong đoạn mã mà tôi đã viết cho hàm Caesar, tôi đã + +112 +00:08:04,390 --> 00:08:09,130 +vô tình đưa ra một lỗi. Và là những lập trình viên, không ai trong + +113 +00:08:09,190 --> 00:08:13,600 +chúng ta không mắc phải lỗi này. Chúng tôi tạo ra lỗi, nhưng sau đó chúng tôi sửa chúng. + +114 +00:08:14,350 --> 00:08:17,110 +Vậy tại sao bạn không sử dụng điều này như một cơ hội gỡ lỗi tốt? + +115 +00:08:17,680 --> 00:08:19,210 +Nếu bạn đang gõ + +116 +00:08:19,510 --> 00:08:24,340 +cùng với tôi, tôi muốn bạn xem mã hoặc nhìn vào màn hình và xem liệu bạn + +117 +00:08:24,340 --> 00:08:29,080 +có thể tìm ra nguyên nhân gây ra kết quả giải mã sai lệch này không. + +118 +00:08:29,560 --> 00:08:32,409 +Tại sao chúng ta nhận được holvo trở lại thay vì xin chào? + +119 +00:08:33,250 --> 00:08:37,900 +Vấn đề nằm ở đâu trong logic của chúng ta trong mã của chúng ta? + +120 +00:08:38,409 --> 00:08:43,090 +Xem liệu bạn có thể giải quyết được vấn đề này không và sửa mã để chúng tôi lấy lại + +121 +00:08:43,090 --> 00:08:46,960 +kết quả đã giải mã của hello. Tạm dừng video và tiếp tục. + +122 +00:08:50,560 --> 00:08:51,310 +3: Tất cả đều đúng. + +123 +00:08:51,310 --> 00:08:52,570 +0: Vì vậy, + +124 +00:08:52,900 --> 00:08:57,120 +lỗi này, nếu chúng ta nghĩ về logic, là do câu lệnh if + +125 +00:08:57,180 --> 00:09:02,180 +của chúng ta trong đó chúng ta kiểm tra cipher_direction và thay đổi shift_amount bằng + +126 +00:09:02,430 --> 00:09:04,320 +cách nhân nó với trừ + +127 +00:09:04,920 --> 00:09:08,130 +một, dòng mã này nằm bên trong vòng lặp for. + +128 +00:09:08,790 --> 00:09:13,470 +Và chúng tôi biết về vòng lặp for rằng nó sẽ tiếp tục lặp đi lặp lại. + +129 +00:09:14,070 --> 00:09:18,420 +Vì vậy, đối với mỗi ký tự trong start_text trong đó có năm, + +130 +00:09:19,080 --> 00:09:23,940 +mỗi lần, mã này sẽ được thực thi và hướng mật mã luôn được giải mã, + +131 +00:09:23,940 --> 00:09:28,620 +vì vậy chúng tôi tiếp tục nhân số lượng dịch chuyển đó với trừ một. + +132 +00:09:29,250 --> 00:09:31,890 +Vì vậy, cái đầu tiên trở thành giải + +133 +00:09:31,950 --> 00:09:36,000 +mã, cái tiếp theo trở thành mã hóa, giải mã, mã hóa, giải mã. + +134 +00:09:36,270 --> 00:09:39,960 +Và đó là lý do tại sao chúng tôi nhận được một số phần trong + +135 +00:09:39,990 --> 00:09:43,440 +lời chào của chúng tôi, nhưng 'o' và 'v' là những phần không đúng. + +136 +00:09:44,190 --> 00:09:48,240 +Vì vậy, để khắc phục điều này, tất cả những gì chúng ta phải + +137 +00:09:48,270 --> 00:09:53,010 +làm là đưa câu lệnh if ra khỏi vòng lặp for, đặt nó trước vòng lặp + +138 +00:09:53,250 --> 00:09:54,780 +for ngay tại đây. + +139 +00:09:55,380 --> 00:10:00,120 +Và bây giờ nếu chúng tôi chạy lại điều này và chúng tôi cố gắng giải mã cùng một thông báo, + +140 +00:10:00,150 --> 00:10:04,230 +đó là mjqqt và chúng tôi sử dụng cùng một số shift, nhưng bây giờ chúng tôi + +141 +00:10:04,770 --> 00:10:09,150 +nhận lại kết quả được giải mã chính xác. Rực rỡ. + +142 +00:10:09,300 --> 00:10:11,910 +Vì vậy, bạn đã quản lý để có được điều đó đúng? Đừng lo lắng nếu + +143 +00:10:11,910 --> 00:10:15,750 +bạn sử dụng một cách hơi khác để mã hóa logic này. + +144 +00:10:16,110 --> 00:10:17,340 +Nó thực sự không + +145 +00:10:17,340 --> 00:10:21,990 +quan trọng miễn là bạn đã xoay sở để làm cho nó hoạt động cuối cùng và + +146 +00:10:21,990 --> 00:10:25,890 +kết hợp hai chức năng thành một. Khi bạn đã hài lòng với bước ba, hãy + +147 +00:10:26,220 --> 00:10:29,400 +chuyển sang bài học tiếp theo và chúng ta sẽ giải quyết phần cuối + +148 +00:10:29,400 --> 00:10:31,500 +cùng của phần bốn của mật mã Caesar, nơi chúng + +149 +00:10:31,690 --> 00:10:35,460 +ta hoàn thành dự án của mình. Đối với tất cả những điều đó, và hơn thế nữa, tôi sẽ + +150 +00:10:35,550 --> 00:10:36,600 +gặp bạn trong bài học tiếp theo. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar-Cipher-3-End.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar-Cipher-3-End.url new file mode 100644 index 0000000000000000000000000000000000000000..c0616e0e3ca5b4ceb9c43864390cd792a7ff5d16 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar-Cipher-3-End.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-3-end \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar-Cipher-3-Start.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar-Cipher-3-Start.url new file mode 100644 index 0000000000000000000000000000000000000000..a29130f1b49241ee8e2f1f6aac93c69b6cb3d3c8 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/008 Caesar-Cipher-3-Start.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-3-start \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar Cipher Part 4 - User Experience Improvements & Final Touches.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar Cipher Part 4 - User Experience Improvements & Final Touches.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..044e40a52061e0d4ed78506be902ac8934de4ba4 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar Cipher Part 4 - User Experience Improvements & Final Touches.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:400604b8388792b8ea830e02f8d904520d9d04d664e8fad04db9b799e448ba6a +size 212957864 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar Cipher Part 4 - User Experience Improvements & Final Touches_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar Cipher Part 4 - User Experience Improvements & Final Touches_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e0bd7e7e08aa5591b71ffd799fdc8bd8802a552f --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar Cipher Part 4 - User Experience Improvements & Final Touches_vi.srt @@ -0,0 +1,604 @@ +1 +00:00:00,300 --> 00:00:06,689 +Được rồi, chúng ta sắp vượt qua vạch đích. Chúng ta đang ở phần cuối cùng của mật mã Caesar và chúng ta + +2 +00:00:06,720 --> 00:00:10,630 +sẽ hoàn thành nó trong bài học này. Trước tiên, hãy tiếp + +3 +00:00:10,950 --> 00:00:16,440 +tục và phân nhánh bản sao của phần bốn của mã bắt đầu Caesar. + +4 +00:00:16,840 --> 00:00:20,670 +Và lưu ý, trước tiên, chúng tôi có một tệp bổ sung ở đây được gọi là nghệ thuật. + +5 +00:00:21,090 --> 00:00:26,370 +Và điều này, nếu bạn mở rộng toàn bộ, bạn sẽ thấy nghệ thuật ASCII của logo của chúng tôi. + +6 +00:00:27,880 --> 00:00:33,880 +Bây giờ, những gì chúng tôi muốn có thể làm trong bài học này chỉ là khắc phục một số điểm yếu, cải thiện trải nghiệm người + +7 +00:00:33,880 --> 00:00:40,260 +dùng và sửa một số lỗi mà bạn có thể biết hoặc không biết. Việc cần làm số 1 yêu cầu + +8 +00:00:40,270 --> 00:00:47,710 +chúng tôi nhập và in logo từ nghệ thuật. py và điều này sẽ hiển thị khi chúng ta lần đầu tiên tải chương + +9 +00:00:47,710 --> 00:00:49,690 +trình của mình lên như thế này. + +10 +00:00:51,210 --> 00:00:57,720 +Tiếp theo, chúng ta sẽ giải quyết vấn đề này. Một trong những điều chúng tôi chưa thực sự nghĩ đến là + +11 +00:00:57,720 --> 00:01:04,830 +nếu người dùng nhập một số chuyển thực sự, thực sự lớn như 100, thì chúng tôi thực sự sẽ sử dụng hết các chữ cái + +12 +00:01:04,830 --> 00:01:06,750 +trong bảng chữ cái của mình. + +13 +00:01:07,140 --> 00:01:10,320 +Và vì vậy chúng tôi sẽ sử dụng những gì bạn đã + +14 +00:01:10,500 --> 00:01:16,810 +học trước đây và có thể cần một chút suy nghĩ về vấn đề này để sửa lỗi cụ thể này ngay tại đây. + +15 +00:01:17,670 --> 00:01:24,870 +Và khi bạn đã hoàn thành việc đó, chúng ta sẽ chuyển sang phần này và chúng ta nghĩ về những việc phải làm nếu người + +16 +00:01:24,870 --> 00:01:28,340 +dùng muốn nhập một số, một ký hiệu hoặc một dấu cách. + +17 +00:01:28,680 --> 00:01:32,880 +Vì vậy, chúng tôi muốn giữ lại các ký hiệu, khoảng trắng hoặc số mà họ + +18 +00:01:33,240 --> 00:01:39,440 +đã nhập vào và chúng tôi sẽ chỉ sử dụng mật mã của mình cho phần còn lại của thư, vì vậy chỉ các + +19 +00:01:39,480 --> 00:01:44,040 +chữ cái theo thứ tự bảng chữ cái. Và mọi thứ khác, chúng tôi sẽ giữ nguyên. + +20 +00:01:44,160 --> 00:01:51,450 +Vì vậy, ví dụ: nếu chúng tôi có văn bản gặp tôi lúc 3 giờ, thì end_text sẽ giữ nguyên các khoảng trống ở vị trí của + +21 +00:01:51,450 --> 00:01:54,480 +chúng, giữ nguyên các số ở vị trí của chúng. + +22 +00:01:54,630 --> 00:01:59,670 +Và nếu có bất kỳ ký hiệu nào, chúng tôi cũng sẽ lưu giữ biểu tượng đó trong end_text cuối cùng của chúng tôi. + +23 +00:02:00,030 --> 00:02:02,840 +Và chỉ những chữ cái sẽ bị xáo trộn. + +24 +00:02:03,990 --> 00:02:10,680 +Và cuối cùng, việc cần làm # 4, chúng ta sẽ tìm cách hỏi người dùng xem họ có muốn khởi động lại chương + +25 +00:02:10,680 --> 00:02:12,360 +trình mật mã hay không. + +26 +00:02:12,900 --> 00:02:19,530 +Vì vậy, hãy chú ý cách trong phiên bản cuối cùng, khi chúng tôi chạy nó một lần, chúng tôi thực sự có thể nhập yes + +27 +00:02:19,740 --> 00:02:20,550 +để tiếp tục. + +28 +00:02:21,030 --> 00:02:27,270 +Bằng cách này, chúng tôi có thể tiếp tục mã hóa và giải mã nhiều như chúng tôi muốn cho đến khi chúng tôi thực sự hoàn thành khi + +29 +00:02:27,270 --> 00:02:28,050 +chúng tôi có + +30 +00:02:28,290 --> 00:02:29,400 +thể nhập không và nó + +31 +00:02:29,430 --> 00:02:31,320 +tạm biệt và đó là phần cuối của mã. + +32 +00:02:32,040 --> 00:02:37,740 +Những gì chúng tôi muốn có thể làm là thay vì phải chạy đi chạy lại + +33 +00:02:37,740 --> 00:02:42,690 +mã của mình, chúng tôi sẽ tìm ra cách để mã của chúng tôi + +34 +00:02:43,140 --> 00:02:51,990 +được chạy lại nếu người dùng gõ có cho câu hỏi này. Và nếu họ gõ không, thì và chỉ khi đó chúng ta mới thực sự kết thúc + +35 +00:02:51,990 --> 00:02:52,740 +chương trình. + +36 +00:02:53,610 --> 00:02:58,440 +Có thể mất một chút suy nghĩ để tìm ra cách giải quyết tất cả những việc cần làm này. + +37 +00:02:58,890 --> 00:03:04,380 +Nhưng khi bạn đã sẵn sàng, nếu bạn đã sẵn sàng cho thử thách, hãy tạm dừng video ngay bây giờ và tiếp tục. + +38 +00:03:07,050 --> 00:03:12,390 +Được rồi, hãy giải quyết từng cái một. Cái đầu tiên bạn đã làm trước đây. + +39 +00:03:12,480 --> 00:03:15,930 +Tất cả những gì nó cần là nhập tệp nghệ thuật. + +40 +00:03:16,410 --> 00:03:25,380 +Và nếu chúng ta muốn có thể sử dụng biến logo bên trong tệp nghệ thuật, cái này, thì chúng ta + +41 +00:03:25,380 --> 00:03:30,900 +cũng có thể chỉ cần viết từ biểu tượng nhập nghệ thuật. + +42 +00:03:32,310 --> 00:03:35,720 +Vì vậy, bây giờ chúng ta có thể in logo này ngay tại đây. + +43 +00:03:37,880 --> 00:03:46,040 +Vậy là việc cần làm số 1 đã hoàn thành, bây giờ chúng ta hãy làm việc tiếp theo. Điều này yêu cầu chúng tôi tìm ra một số loại giải + +44 +00:03:46,040 --> 00:03:53,150 +pháp thông minh để khi người dùng nhập một sự thay đổi lớn hơn số chữ cái trong bảng chữ cái + +45 +00:03:53,480 --> 00:03:54,530 +ở đây, chúng + +46 +00:03:55,500 --> 00:04:01,620 +tôi có một số cách để đưa nó trở lại trong phạm vi từ 0 đến 25 . + +47 +00:04:02,590 --> 00:04:09,940 +Và tôi muốn bạn xem điều gì sẽ xảy ra khi tôi nhập một tin nhắn và tôi đặt một sự thay đổi thực sự lớn. Bạn có thể thấy chúng tôi nhận được lỗi + +48 +00:04:09,940 --> 00:04:17,519 +chỉ mục nằm ngoài phạm vi vì không có chữ cái nào ở vị trí 77 trong bảng chữ cái. + +49 +00:04:17,920 --> 00:04:23,110 +Vì vậy, đó là lý do tại sao dòng 14 ở đây thực sự bị hỏng. + +50 +00:04:24,730 --> 00:04:31,000 +Nếu bạn gặp khó khăn với điều này, tôi đã cho bạn một gợi ý mà tôi muốn bạn suy nghĩ về cách bạn có thể + +51 +00:04:31,000 --> 00:04:31,840 +sử dụng mô-đun. + +52 +00:04:32,410 --> 00:04:42,130 +Vì vậy, nếu chúng ta lấy 45 và chúng ta sử dụng toán tử môđun để chia 45 cho 26, là tổng số chữ cái trong bảng + +53 +00:04:42,130 --> 00:04:46,000 +chữ cái, thì chúng ta sẽ nhận được phần dư. + +54 +00:04:46,690 --> 00:04:53,110 +Bây giờ, nếu bạn tưởng tượng chúng ta đang chia 45 cho 26, thì 26 chia thành 45 một lần, vì vậy + +55 +00:04:53,350 --> 00:04:57,910 +chúng ta sẽ nhận được một, nhưng chúng ta sẽ có phần dư là 19. + +56 +00:04:58,510 --> 00:05:00,990 +Vì vậy, đây là những gì chúng tôi nhận được từ mô-đun. + +57 +00:05:01,030 --> 00:05:05,080 +Chúng tôi sẽ nhận được kết quả là 19, chỉ là phần còn lại. + +58 +00:05:05,680 --> 00:05:13,030 +Và một cách hiệu quả, những gì mã này làm là nó sẽ chia một số cho 26 nhiều lần nếu cần cho đến khi chúng ta + +59 +00:05:13,330 --> 00:05:19,690 +đi đến điểm cuối cùng, nơi nó không thể chia hết được nữa và chúng ta kết thúc với một số dư. + +60 +00:05:20,020 --> 00:05:27,470 +Và phần còn lại đó cho phép chúng ta chuyển số dịch chuyển được nhập vào một thứ gì đó phù hợp với số chữ + +61 +00:05:27,470 --> 00:05:30,850 +cái trong bảng chữ cái mà chúng ta có ở đây. + +62 +00:05:31,060 --> 00:05:37,630 +Vì vậy, sau đó mã của chúng tôi mà chúng tôi sẽ có ở đây là sửa đổi sự thay đổi bằng cách lấy sự thay + +63 +00:05:37,630 --> 00:05:45,700 +đổi mà người dùng đã nhập ở đây và sau đó sử dụng mô-đun để chia nó cho 26 nhiều lần nếu cần cho đến khi chúng tôi nhận được phần còn lại. + +64 +00:05:45,940 --> 00:05:53,050 +Vì vậy, bây giờ nếu chúng tôi kiểm tra điều này, bạn có thể thấy rằng bất kể số ca của tôi là bao lâu, hãy thử + +65 +00:05:53,050 --> 00:05:59,880 +87, chúng tôi sẽ luôn nhận được kết quả vì nó đang chuyển số đó xuống để vừa với bảng chữ cái của chúng tôi. + +66 +00:06:00,280 --> 00:06:03,110 +Và khi bạn đã hoàn tất, hãy chuyển sang việc cần làm # 3. + +67 +00:06:03,820 --> 00:06:11,800 +Vì vậy, ở đây chúng tôi muốn có thể cho phép bất kỳ số, ký hiệu hoặc khoảng trắng nào, về cơ bản là bất kỳ + +68 +00:06:11,800 --> 00:06:16,410 +thứ gì không có trong bảng chữ cái đi qua và kết thúc trong end_text. + +69 +00:06:16,900 --> 00:06:23,500 +Nhưng nếu nó là một trong những chữ cái bên trong bảng chữ cái danh sách này, thì và chỉ khi đó chúng ta mới thực sự + +70 +00:06:23,500 --> 00:06:25,750 +muốn thực hiện chuyển đổi và mã hóa. + +71 +00:06:26,620 --> 00:06:33,210 +Để đạt được điều này, có lẽ chúng ta nên sử dụng câu lệnh if để nói nếu char ... + +72 +00:06:33,970 --> 00:06:40,060 +Vì vậy, hãy chú ý cách tôi đã thay đổi vòng lặp for thay vì viết cho chữ cái trong start_text, loại giả sử rằng + +73 +00:06:40,060 --> 00:06:46,270 +mọi thứ trong start_text là một chữ cái, thành char là viết tắt của ký tự thay vì một ký tự có thể là một + +74 +00:06:46,600 --> 00:06:51,460 +số, có thể là một ký hiệu , có thể là một chữ cái, có thể là khoảng trắng. + +75 +00:06:52,060 --> 00:07:00,100 +Và sau khi chúng tôi nắm được ký tự hoặc ký tự, chúng tôi sẽ kiểm tra xem ký tự có nằm trong + +76 +00:07:00,100 --> 00:07:01,960 +bảng chữ cái hay không. + +77 +00:07:03,220 --> 00:07:11,200 +Vì vậy, nếu nó thực sự là một trong những ký tự này chứ không phải một ký tự ngẫu nhiên nào khác, thì và chỉ + +78 +00:07:11,200 --> 00:07:15,430 +khi đó chúng ta mới thực sự muốn mã này được thực thi. + +79 +00:07:16,860 --> 00:07:24,840 +Vì vậy, hãy để tôi chỉ cần đảm bảo tất cả các thụt lề là chính xác. Và nếu nó không nằm trong bảng chữ cái, vậy thì, + +80 +00:07:25,260 --> 00:07:33,120 +trong trường hợp này, chúng tôi thực sự muốn làm cho end_text thêm ký tự thực, vì vậy mà không cần + +81 +00:07:33,150 --> 00:07:35,370 +bất kỳ sửa đổi nào. + +82 +00:07:36,570 --> 00:07:43,860 +Bây giờ, nếu chúng ta kiểm tra mã này bằng cách chạy nó, vì vậy hãy tiếp tục và mã hóa. Và tôi sẽ mã + +83 +00:07:43,860 --> 00:07:51,120 +hóa một cái gì đó như Hello123% ^ 321. + +84 +00:07:51,450 --> 00:08:01,260 +Và bây giờ khi tôi nhấn enter và tôi thay đổi nó, thì bạn có thể thấy rằng kết quả được mã hóa có tất cả các chữ + +85 +00:08:01,260 --> 00:08:07,020 +cái, tất cả những thứ nằm trong danh sách đó, bảng chữ cái được mã hóa. + +86 +00:08:07,530 --> 00:08:14,010 +Nhưng mọi thứ khác, các con số và ký hiệu đều được giữ nguyên, bởi vì thường xuyên hơn không, người dùng của bạn có + +87 +00:08:14,010 --> 00:08:19,440 +thể muốn viết một tin nhắn như gặp tôi lúc năm giờ hoặc thứ gì đó, dấu chấm than gì + +88 +00:08:19,440 --> 00:08:19,850 +đó. + +89 +00:08:20,130 --> 00:08:23,910 +Và đây chỉ là một cách rất đơn giản để làm cho nó hoạt động. + +90 +00:08:24,600 --> 00:08:27,870 +Tất nhiên, bây giờ, có rất nhiều cách khác mà bạn có thể giải quyết vấn đề này. + +91 +00:08:28,320 --> 00:08:34,710 +Vì vậy, trên thực tế, bạn có thể đã thêm một loạt các ký hiệu và số, khoảng trắng và các ký tự + +92 +00:08:35,070 --> 00:08:36,510 +khác vào danh sách + +93 +00:08:36,659 --> 00:08:43,440 +này Và thay vì gọi nó là bảng chữ cái, nó có thể là danh sách ký tự và sau đó bạn có thể mã + +94 +00:08:43,440 --> 00:08:44,910 +hóa tất cả những thứ đó. + +95 +00:08:45,360 --> 00:08:51,600 +Nhưng đó thực sự không phải là những gì việc cần làm yêu cầu. Nó muốn chúng ta thông qua các con số, ký hiệu, + +96 +00:08:51,900 --> 00:08:54,540 +khoảng trắng và chỉ mã hóa các chữ cái. + +97 +00:08:56,350 --> 00:09:02,770 +Vì vậy, bây giờ tất cả những gì chúng tôi còn lại là việc cần làm cuối cùng, và đây + +98 +00:09:02,770 --> 00:09:11,800 +có lẽ sẽ là công việc khó khăn nhất trong số rất nhiều. Những gì chúng tôi muốn làm ở đây là chúng tôi muốn có thể hỏi người dùng xem họ có muốn tiếp + +99 +00:09:11,800 --> 00:09:20,320 +tục hay không, vậy liệu họ có muốn mã hóa hay giải mã một tin nhắn khác hay không. Và những gì xảy ra trong phiên bản cuối cùng, phiên bản + +100 +00:09:20,320 --> 00:09:25,870 +hoàn chỉnh của ứng dụng, là nếu chúng tôi mã hóa một thông báo và nhận + +101 +00:09:27,000 --> 00:09:34,020 +được kết quả, nó không chỉ kết thúc, nó không thoát ra vì nếu không, bạn sẽ thấy thông báo + +102 +00:09:34,020 --> 00:09:35,870 +đó ở đây. lại. + +103 +00:09:36,330 --> 00:09:41,810 +Thay vào đó, nó tiếp tục và nó hỏi chúng tôi, bạn có muốn đi lần nữa không? Vì vậy, chúng tôi có thể viết + +104 +00:09:41,820 --> 00:09:42,320 +có. + +105 +00:09:42,750 --> 00:09:46,050 +Và nó cho phép chúng tôi mã hóa hoặc giải mã một tin nhắn một lần nữa. + +106 +00:09:47,190 --> 00:09:53,910 +Về cơ bản chúng ta có thể tiếp tục lặp đi lặp lại chương trình này cho đến khi chúng ta muốn thoát. + +107 +00:09:54,570 --> 00:10:01,890 +Và đó là thời điểm khi chúng tôi không còn có thể nhập bất cứ thứ gì vào chương trình của mình nữa và mã của chúng tôi kết thúc và + +108 +00:10:01,890 --> 00:10:04,820 +chúng tôi sẽ phải chạy lại toàn bộ để sử dụng lại. + +109 +00:10:06,370 --> 00:10:14,350 +Vì vậy, tại thời điểm này, phần mã thực sự cần được lặp lại nếu người dùng muốn khởi động lại nó + +110 +00:10:14,350 --> 00:10:16,850 +thực sự chỉ là phần này. + +111 +00:10:17,290 --> 00:10:21,070 +Vì vậy, điều đầu tiên tôi sẽ làm là tôi thực sự sẽ thu nhỏ nó xuống một chút. + +112 +00:10:21,370 --> 00:10:28,390 +Và bây giờ tất cả những gì chúng ta còn lại là 1, 2, 3, 4, 5 dòng mã cần lặp lại nếu chúng + +113 +00:10:28,390 --> 00:10:31,670 +ta muốn người dùng sử dụng lại mật mã Caesar. + +114 +00:10:32,350 --> 00:10:37,260 +Điều gì sẽ xảy ra nếu chúng ta tiếp tục và thụt lề cái này và đặt nó bên trong một vòng lặp while? + +115 +00:10:37,780 --> 00:10:40,990 +Chúng ta sẽ kiểm tra điều gì để đảm bảo rằng vòng lặp của chúng ta vẫn tiếp tục? + +116 +00:10:41,500 --> 00:10:48,440 +Chà, chúng ta có thể tạo một cờ có tên should_continue và chúng ta bắt đầu điều này là đúng. + +117 +00:10:49,060 --> 00:10:56,320 +Và sau đó trong khi điều này vẫn đúng, chúng tôi tiếp tục lặp lại điều này để người dùng có thể nhập + +118 +00:10:56,530 --> 00:11:02,180 +một hướng mới, văn bản mới, dịch chuyển mới và gọi lại mật mã Caesar trên đó. + +119 +00:11:02,980 --> 00:11:04,970 +Khi nào thì chúng ta nên dừng nó lại? + +120 +00:11:04,990 --> 00:11:12,340 +Chà, nếu khi kết thúc quá trình giải mã hoặc mã hóa tin nhắn của họ, chúng tôi hỏi họ một câu hỏi, chẳng hạn như nhập + +121 +00:11:12,340 --> 00:11:13,060 +có nếu + +122 +00:11:13,060 --> 00:11:15,580 +bạn muốn tiếp tục hoặc nhập không nếu bạn + +123 +00:11:15,580 --> 00:11:19,810 +không muốn, chúng tôi có thể đặt câu hỏi đó bên trong một đầu vào. + +124 +00:11:20,900 --> 00:11:28,580 +Như vậy. Và chúng ta có thể lưu câu trả lời của họ bên trong một biến. Hãy chỉ gọi kết quả đó. Vì vậy, bây giờ chúng ta + +125 +00:11:28,580 --> 00:11:30,040 +có thể sử dụng câu + +126 +00:11:30,050 --> 00:11:33,500 +lệnh if để kiểm tra xem kết quả có bằng không, + +127 +00:11:33,890 --> 00:11:39,830 +vì vậy khi họ thực sự muốn dừng và họ muốn thoát khỏi vòng lặp while, tốt, tại thời điểm + +128 +00:11:39,830 --> 00:11:40,430 +này, + +129 +00:11:40,430 --> 00:11:42,730 +chúng ta có thể chuyển should_continue thành false. + +130 +00:11:43,220 --> 00:11:48,740 +Và một khi đã xong, thì điều này có nghĩa là vòng lặp while này, khi nó kiểm tra, điều này + +131 +00:11:48,740 --> 00:11:51,710 +sẽ là sai và nó sẽ không tiếp tục nữa. + +132 +00:11:52,280 --> 00:11:56,900 +Chỉ như một lần chạm cuối cùng, chúng tôi thậm chí có thể nói lời tạm biệt với người dùng + +133 +00:11:58,330 --> 00:12:00,550 +để họ biết rằng chương trình đã kết thúc. + +134 +00:12:01,270 --> 00:12:05,980 +Bây giờ chúng ta hãy tiếp tục và chạy mã của chúng tôi và xem nó có hoạt động không. + +135 +00:12:07,840 --> 00:12:15,250 +Được rồi, trước tiên hãy mã hóa thứ gì đó. Và bây giờ tôi có thể nhập có để tiếp tục và bạn có thể thấy nó + +136 +00:12:15,250 --> 00:12:17,470 +cho phép tôi nhập mã hóa hoặc giải mã. + +137 +00:12:17,770 --> 00:12:19,540 +Vì vậy, hãy mã hóa một cái gì đó khác. + +138 +00:12:22,740 --> 00:12:28,050 +Bây giờ, cuối cùng, nếu tôi quyết định rằng tôi đã có đủ, tôi đã hoàn thành việc mã hóa và giải mã, tôi sẽ + +139 +00:12:28,050 --> 00:12:28,550 +nhập không. + +140 +00:12:28,560 --> 00:12:34,620 +Nó nói với tôi lời tạm biệt và bây giờ tôi có thể thấy lời nhắc của mình, điều đó có nghĩa là nó thực sự đã thoát + +141 +00:12:34,620 --> 00:12:37,830 +ra khỏi chương trình và tôi sẽ cần chạy lại để khởi động lại. + +142 +00:12:38,520 --> 00:12:39,720 +Bạn đã quản lý để làm cho đúng? + +143 +00:12:40,560 --> 00:12:47,220 +Nếu bạn muốn xem mã đã hoàn thành, thì bạn có thể truy cập caesar-cipher-4-end và bạn sẽ tìm thấy + +144 +00:12:47,220 --> 00:12:49,640 +mã giống như tôi có ở đây. + +145 +00:12:50,130 --> 00:12:56,020 +Và tất nhiên, hãy thoải mái sử dụng mã, sửa đổi nó và biến chương trình này của riêng bạn. + +146 +00:12:56,040 --> 00:13:01,890 +Vì vậy, nếu bạn muốn thêm một số tính năng bổ sung, nếu bạn muốn đảm bảo rằng tất cả các số và ký hiệu đều đang được mã + +147 +00:13:01,890 --> 00:13:06,870 +hóa và bất kỳ loại chuông và còi nào cũng như bất kỳ thứ gì khác mà bạn có thể nghĩ đến, đây là lúc + +148 +00:13:07,200 --> 00:13:08,820 +để làm điều đó ngay bây giờ. + +149 +00:13:09,360 --> 00:13:15,360 +Nhưng khi bạn đã hoàn tất, hãy nhớ nghỉ ngơi một chút, vì ngày mai là một phiên đóng gói khác, + +150 +00:13:15,360 --> 00:13:18,540 +nơi chúng ta sẽ nói nhiều hơn về từ điển Python. + +151 +00:13:18,900 --> 00:13:23,180 +Đối với tất cả những điều đó và hơn thế nữa, tôi chúc bạn ngủ ngon và tôi sẽ gặp lại bạn vào ngày mai. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar-Cipher-4-End.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar-Cipher-4-End.url new file mode 100644 index 0000000000000000000000000000000000000000..ce928f533744f90c2440ba19e4d653944a728b11 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar-Cipher-4-End.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-4-end \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar-Cipher-4-Start.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar-Cipher-4-Start.url new file mode 100644 index 0000000000000000000000000000000000000000..d59bedf5f5a1f02ff4949f4ebc8467e8c617dc52 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Caesar-Cipher-4-Start.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/caesar-cipher-4-start \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Course-Fixes-Report-an-Issue.url b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/010 How You Can Stay Motivated.mp4 b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/010 How You Can Stay Motivated.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..596fcf4045d608b006957511aad204ff19d5237a --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/010 How You Can Stay Motivated.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4573622ec2456c2f083e69d046583bbc879300e99e3b0f47a38cff8f8aba479 +size 26740909 diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/010 How You Can Stay Motivated_vi.srt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/010 How You Can Stay Motivated_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..237c11b665e87636667a994eebcb95919d2c7a8f --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/010 How You Can Stay Motivated_vi.srt @@ -0,0 +1,72 @@ +1 +00:00:01,230 --> 00:00:05,460 +Chào! Hoàn thành tốt Ngày 8. Bây giờ, ở đâu + +2 +00:00:05,490 --> 00:00:10,110 +đó dọc theo hành trình này, bạn sẽ cảm thấy ngập tràn động lực của mình. + +3 +00:00:10,200 --> 00:00:13,200 +Nó có thể xảy ra vào khoảng bây giờ, nó có thể xảy ra sau. + +4 +00:00:13,680 --> 00:00:18,300 +Nhưng điều bạn phải suy nghĩ là điều gì thực sự thúc đẩy bạn. + +5 +00:00:18,300 --> 00:00:20,040 +Tại sao anh làm điều này? + +6 +00:00:20,520 --> 00:00:23,940 +Học kỹ năng này sẽ làm gì cho bạn? + +7 +00:00:24,000 --> 00:00:25,860 +Nó sẽ làm gì cho gia đình bạn? + +8 +00:00:26,520 --> 00:00:29,760 +Có thể là bạn muốn kiếm một công việc được trả lương cao hơn. + +9 +00:00:29,910 --> 00:00:33,210 +Có thể là bạn chỉ ghét công việc hiện tại của mình và bạn muốn làm + +10 +00:00:33,210 --> 00:00:35,670 +điều gì đó mà bạn thực sự yêu thích, chẳng hạn + +11 +00:00:36,120 --> 00:00:40,950 +như lập trình, hoặc có thể bạn muốn bắt đầu kinh doanh của riêng mình và bạn cần các kỹ năng để có + +12 +00:00:40,950 --> 00:00:43,290 +thể tạo ra sản phẩm mà bạn sắp làm bán. + +13 +00:00:43,950 --> 00:00:48,000 +Vì vậy, hãy suy nghĩ về điều gì đã thúc đẩy bạn, tại sao bạn lại làm + +14 +00:00:48,030 --> 00:00:49,650 +điều này, hãy viết nó ra + +15 +00:00:49,890 --> 00:00:54,210 +một tờ giấy, dán nó lên tường để bạn có thể nhìn thấy nó mỗi ngày khi thức + +16 +00:00:54,210 --> 00:00:59,210 +dậy và có thể bình luận ở khung bên dưới nó để người khác có thể cổ vũ bạn và bạn có + +17 +00:00:59,400 --> 00:01:02,160 +thể có động lực và cũng có thể thúc đẩy người khác. + +18 +00:01:02,730 --> 00:01:05,910 +Vì vậy, hãy suy nghĩ về điều đó và tôi sẽ gặp lại bạn vào ngày mai. + diff --git a/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/external-links.txt b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..5f3230dc909f4280121b2da984bdce4cc68b698d --- /dev/null +++ b/part1/08 - Day 8 - Beginner - Function Parameters & Caesar Cipher/external-links.txt @@ -0,0 +1,51 @@ + +001 Day-8-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/caesar-cipher-completed?v=1 + +002 Fork-the-Day-8-Starting-Repl +https://repl.it/@appbrewery/day-8-start + +003 Day-8-Ending-Code +https://repl.it/@appbrewery/day-8-end + +004 Exercise-20 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/e242258e-5006-40f1-9228-8e3a8c7482cc + +004 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +005 Exercise-21 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/4e31e198-3cbb-4dae-aad9-c0d99be60fa2 + +005 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +006 Caesar-Cipher-1-Start +https://repl.it/@appbrewery/caesar-cipher-1-start + +006 Python-List-index-Method +https://www.w3schools.com/python/ref_list_index.asp + +006 Caesar-Cipher-1-End +https://repl.it/@appbrewery/caesar-cipher-1-end + +007 Caesar-Cipher-2-Start +https://repl.it/@appbrewery/caesar-cipher-2-start + +007 Caesar-Cipher-2-End +https://repl.it/@appbrewery/caesar-cipher-2-end + +008 Caesar-Cipher-3-Start +https://repl.it/@appbrewery/caesar-cipher-3-start + +008 Caesar-Cipher-3-End +https://repl.it/@appbrewery/caesar-cipher-3-end + +009 Caesar-Cipher-4-Start +https://repl.it/@appbrewery/caesar-cipher-4-start + +009 Caesar-Cipher-4-End +https://repl.it/@appbrewery/caesar-cipher-4-end + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day 9 Goals what we will make by the end of the day.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day 9 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..982449815ef097b8759bb1f7b3551cb489ca4a15 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day 9 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:861861de241a90549a23e0c7bc4810ffa40e5b1e1a2dde014bf33899d1ec7644 +size 5366763 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day 9 Goals what we will make by the end of the day_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day 9 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8a9f3ac69f916c56e151063f39a9656ef31668bb --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day 9 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,144 @@ +1 +00:00:00,570 --> 00:00:04,950 +Chào mừng trở lại. Đó là Ngày thứ 9 của 100 Ngày viết mã. + +2 +00:00:05,700 --> 00:00:09,690 +Và hôm nay chúng ta sẽ tìm hiểu thêm về từ điển Python + +3 +00:00:09,780 --> 00:00:12,900 +và cách lồng nhau. Và đến cuối ngày hôm + +4 +00:00:13,140 --> 00:00:16,290 +nay, bạn sẽ xây dựng một chương trình đấu giá thầm lặng. + +5 +00:00:17,130 --> 00:00:20,460 +Tất cả chúng ta đều biết rằng có những cuộc đấu giá mà mọi người đều + +6 +00:00:20,460 --> 00:00:24,380 +trả giá và bạn có thể thấy giá thầu của mọi người khác và người đấu giá sẽ giúp + +7 +00:00:24,380 --> 00:00:27,770 +bạn đặt giá thầu ngày càng cao. Bây giờ cũng có một loại + +8 +00:00:27,800 --> 00:00:32,800 +đấu giá được gọi là đấu giá im lặng trong đó mọi người trả giá im lặng và không + +9 +00:00:32,990 --> 00:00:37,990 +ai biết giá thầu của người khác cho đến khi kết thúc cuộc đấu giá nơi giá thầu cao + +10 +00:00:38,510 --> 00:00:40,970 +nhất được tiết lộ. Đó là những gì chúng tôi sẽ xây dựng. + +11 +00:00:41,420 --> 00:00:43,610 +Và nếu bạn muốn xem chương trình cuối + +12 +00:00:43,640 --> 00:00:46,880 +cùng, thì bạn có thể chuyển đến phiên đấu giá mù đã hoàn thành. nhà máy bia. repl. chạy. + +13 +00:00:47,180 --> 00:00:48,830 +Và ở đây, + +14 +00:00:49,250 --> 00:00:53,480 +bạn sẽ không chỉ thấy chiếc lò dò tuyệt vời này được xây dựng từ ASCII, mà còn cả chương trình đấu giá bí mật. Vì vậy, đây là cách nó hoạt động: giả sử rằng tôi sẽ là người đầu + +15 +00:00:53,810 --> 00:00:57,380 +tiên đăng nhập vào chương trình. + +16 +00:00:57,740 --> 00:01:01,940 +Tôi sẽ cung cấp tên của tôi và giá thầu của tôi. Giả sử tôi sẽ đấu giá $ 53 cho + +17 +00:01:02,300 --> 00:01:05,360 +mặt hàng này. + +18 +00:01:05,360 --> 00:01:08,840 +Và sau khi tôi hoàn thành giá thầu của mình, nó hỏi + +19 +00:01:09,440 --> 00:01:12,350 +tôi liệu có bất kỳ nhà thầu nào khác không. + +20 +00:01:12,350 --> 00:01:13,790 +Vì vậy, nếu tôi nhập câu trả + +21 +00:01:13,880 --> 00:01:18,880 +lời có thì màn hình sẽ rõ ràng và tôi có thể giao máy tính xách tay cho người tiếp theo sẽ thực hiện giá thầu của họ. Vì vậy, giả sử có James sẽ đấu giá, ừm, thậm + +22 +00:01:20,060 --> 00:01:24,770 +chí còn ít hơn tôi. + +23 +00:01:24,770 --> 00:01:28,280 +Và sau đó anh ta sẽ nhường chỗ cho người trả giá cuối cùng, người sẽ trả giá 121 đô la. + +24 +00:01:28,940 --> 00:01:33,940 +Vì vậy, bây giờ ở giai đoạn này, nếu mọi người đã hoàn thành, thì chúng ta + +25 +00:01:35,840 --> 00:01:39,920 +nhập không, và bây giờ sẽ kiểm đếm tất cả các giá thầu và + +26 +00:01:40,550 --> 00:01:45,550 +tìm ra ai đặt giá thầu cao nhất và cho chúng ta người chiến thắng, in ra + +27 +00:01:45,980 --> 00:01:49,340 +'Người chiến thắng là Jenny với giá thầu là $ 121. 'Có một số nơi mà bạn có thể sử dụng điều này nếu bạn đang bán đấu giá một + +28 +00:01:49,340 --> 00:01:54,020 +số tác phẩm nghệ thuật hoặc nếu bạn đang cố gắng trả + +29 +00:01:54,290 --> 00:01:58,160 +giá cao hơn anh chị em của mình về những người được đi trên tấm bạt lò xo, hoặc nếu bạn + +30 +00:01:58,160 --> 00:02:01,370 +đang cố gắng bắt đầu một cuộc đấu giá với bạn bè hoặc đồng nghiệp của bạn. + +31 +00:02:01,880 --> 00:02:05,060 +Cuộc đấu giá thầm lặng có rất nhiều, rất nhiều công dụng. Được rồi, trong các bài học hôm nay, chúng ta sẽ tập + +32 +00:02:05,660 --> 00:02:10,039 +trung chủ yếu vào từ điển Python. Nhưng ngoài ra, chúng ta cũng sẽ xem xét + +33 +00:02:10,039 --> 00:02:14,540 +cách chúng ta có thể lồng danh sách nói vào + +34 +00:02:14,540 --> 00:02:19,370 +bên trong danh sách hoặc từ điển bên trong từ điển và cũng có thể trộn danh sách và từ điển. + +35 +00:02:19,370 --> 00:02:23,720 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và bắt đầu + +36 +00:02:24,440 --> 00:02:25,273 +ngày mới. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day-9-Goal-Click-Run-to-see-the-final-project.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day-9-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..931be141d4dacf85cafdd0aa92bed144122ab2f7 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/001 Day-9-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/blind-auction-completed?v=1 \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 Fork-the-Day-9-Starting-Repl.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 Fork-the-Day-9-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..599dc11df5756fa351c07bed59d2810a9c6bb3c2 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 Fork-the-Day-9-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-9-start \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 The Python Dictionary Deep Dive.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 The Python Dictionary Deep Dive.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ce481c63161bcfbbd47abfc7163ea7669019fefc --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 The Python Dictionary Deep Dive.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ea1dd5a3b432023f333769a7908d7ead1d4de858857c3ba2d850e5437703eb0 +size 78167894 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 The Python Dictionary Deep Dive_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 The Python Dictionary Deep Dive_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6919e0a8bcbe3b6bccbed3d425bbf8c254a826af --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/002 The Python Dictionary Deep Dive_vi.srt @@ -0,0 +1,860 @@ +1 +00:00:00,700 --> 00:00:01,020 +Được rồi. + +2 +00:00:01,020 --> 00:00:06,020 +Vì vậy, điều đầu tiên tôi muốn nói đến là từ điển bằng Python. Bây giờ, từ điển trong + +3 +00:00:06,300 --> 00:00:11,300 +Python hoạt động tương tự như từ điển trong cuộc sống + +4 +00:00:11,520 --> 00:00:15,350 +thực, phải không? Vì vậy, nếu bạn đang tra cứu + +5 +00:00:15,380 --> 00:00:20,380 +một từ trong từ điển nói mã từ đó, thì bạn có thể tìm thấy định nghĩa như một cái gì + +6 +00:00:20,690 --> 00:00:25,690 +đó dọc theo dòng hướng dẫn chương trình cho máy tính. Và từ điển thực sự hữu ích vì + +7 +00:00:25,940 --> 00:00:30,940 +chúng cho phép chúng ta nhóm lại với nhau và gắn thẻ các phần thông tin + +8 +00:00:31,280 --> 00:00:32,113 +liên quan. + +9 +00:00:32,780 --> 00:00:37,040 +Cách tôi thích nghĩ về từ điển là ở dạng bảng. + +10 +00:00:37,610 --> 00:00:40,700 +Mỗi cuốn từ điển đều có hai phần. + +11 +00:00:41,210 --> 00:00:43,430 +Ở phía bên trái là chìa khóa, + +12 +00:00:44,120 --> 00:00:47,090 +tương đương với từ trong từ điển, và sau đó + +13 +00:00:47,840 --> 00:00:52,840 +nó cũng có một giá trị liên quan. Đó sẽ là định nghĩa thực + +14 +00:00:53,120 --> 00:00:55,100 +tế của từ này. + +15 +00:00:55,970 --> 00:01:00,970 +Bây giờ, hãy giả sử rằng chúng tôi đã lấy bảng định nghĩa đơn giản về các từ lập trình mà chúng tôi đã xem + +16 +00:01:01,250 --> 00:01:03,380 +cho đến nay và chúng tôi tiếp tục và chúng tôi + +17 +00:01:03,920 --> 00:01:06,620 +cố gắng chuyển nó ngay thành một từ điển, chúng tôi sẽ làm điều + +18 +00:01:06,920 --> 00:01:08,960 +đó như thế nào? Trước hết, hãy + +19 +00:01:08,960 --> 00:01:12,710 +để tôi thả hai hàng cuối cùng và bắt đầu với hàng đầu tiên. + +20 +00:01:13,280 --> 00:01:18,280 +Điều đầu tiên chúng tôi muốn làm là chúng tôi muốn họ tạo một từ điển. Và để làm điều đó trong Python, + +21 +00:01:19,310 --> 00:01:22,010 +đây là cú pháp trông như thế nào. + +22 +00:01:22,520 --> 00:01:26,210 +Chúng tôi có một tập hợp các dấu ngoặc nhọn và mọi thứ bên trong + +23 +00:01:26,210 --> 00:01:29,240 +dấu ngoặc nhọn là nội dung trong từ điển của chúng tôi. + +24 +00:01:29,870 --> 00:01:34,870 +Đầu tiên khóa đi kèm với dấu hai chấm và sau đó là giá trị. Trong bảng của chúng tôi, chúng tôi có lỗi từ + +25 +00:01:36,920 --> 00:01:41,000 +này, đây là từ khóa đầu tiên, vì vậy chúng tôi có thể thay thế nó + +26 +00:01:41,390 --> 00:01:46,100 +ở đây trong từ điển của chúng tôi. Và giá trị được liên kết + +27 +00:01:46,130 --> 00:01:49,550 +với khóa này là định nghĩa cho một lỗi. + +28 +00:01:49,550 --> 00:01:53,480 +Vì vậy, một lỗi trong chương trình ngăn chương trình chạy như mong đợi, + +29 +00:01:53,990 --> 00:01:58,460 +sẽ trở thành giá trị và có thể được thay thế ở đây sau dấu hai chấm. + +30 +00:01:58,970 --> 00:02:03,140 +Vì vậy, bây giờ, chúng tôi đã tạo một từ điển thực sự bằng cách sử dụng mã Python. + +31 +00:02:04,040 --> 00:02:08,090 +Điều gì sẽ xảy ra nếu bạn muốn có nhiều hơn một mục trong từ điển của mình? Chà, bạn sẽ phân tách từng + +32 +00:02:08,090 --> 00:02:12,410 +cặp giá trị khóa bằng dấu phẩy, sau đó bạn có thể + +33 +00:02:12,980 --> 00:02:17,980 +tiếp tục thêm các cặp khóa và giá trị cho đến khi đến cuối từ + +34 +00:02:19,280 --> 00:02:21,830 +điển của mình. Được rồi, chúng ta + +35 +00:02:21,830 --> 00:02:24,380 +hãy xem xét các từ điển đang hoạt động. + +36 +00:02:24,890 --> 00:02:29,890 +Nếu bạn chuyển sang tệp mã bắt đầu ngày thứ chín và tiếp tục phân tách bản sao của chính bạn + +37 +00:02:30,710 --> 00:02:35,150 +để làm việc cùng với tôi, thì bạn có thể thấy rằng trong đây tôi đã thêm từ điển + +38 +00:02:35,180 --> 00:02:39,320 +mà chúng tôi đã xác định trước đó và tôi đã lưu trữ nó bên trong một + +39 +00:02:39,740 --> 00:02:44,270 +biến được gọi là từ điển lập trình. Hiện tại, tôi chỉ có hai mục + +40 +00:02:44,300 --> 00:02:47,060 +trong từ điển này, định nghĩa cho lỗi + +41 +00:02:47,510 --> 00:02:51,830 +và định nghĩa cho hàm. Bây giờ, điều đầu tiên tôi + +42 +00:02:51,830 --> 00:02:55,730 +muốn nhấn mạnh là khi bạn tạo một từ điển có nhiều + +43 +00:02:55,730 --> 00:02:58,610 +hơn một phần tử, chẳng hạn như trong trường + +44 +00:02:59,110 --> 00:03:03,310 +hợp này, thì bạn muốn định dạng nó đúng cách để nó dễ + +45 +00:03:03,310 --> 00:03:04,143 +đọc hơn. + +46 +00:03:04,510 --> 00:03:09,250 +Vì vậy, những gì bạn sẽ thấy các lập trình viên Python làm theo quy ước là + +47 +00:03:09,280 --> 00:03:12,010 +họ sẽ bắt đầu từ điển với dấu ngoặc + +48 +00:03:12,580 --> 00:03:17,580 +nhọn mở ở trên cùng và sau đó mọi mục nhập tiếp theo được thụt vào một thụt lề. + +49 +00:03:18,550 --> 00:03:22,270 +Và sau đó ở cuối mục nhập đó, có một dấu + +50 +00:03:22,660 --> 00:03:27,250 +phẩy và sau đó chúng ta nhấn enter để mục tiếp theo chuyển + +51 +00:03:27,700 --> 00:03:28,960 +sang dòng tiếp theo + +52 +00:03:28,990 --> 00:03:33,990 +và cuối cùng, dấu ngoặc nhọn cuối cùng phải ở đầu dòng với đầu từ + +53 +00:03:34,720 --> 00:03:35,553 +điển. + +54 +00:03:36,280 --> 00:03:41,020 +Và một điều khác cũng khá hay đó là tắt tất cả các mục nhập trong từ + +55 +00:03:41,020 --> 00:03:43,570 +điển hoặc danh sách của bạn bằng dấu phẩy. + +56 +00:03:44,080 --> 00:03:47,500 +Điều này có nghĩa là nếu bạn cần thêm nhiều mục hơn vào từ + +57 +00:03:47,770 --> 00:03:51,610 +điển, bạn có thể chỉ cần nhấn enter và tiếp tục nhập nội dung tiếp theo. + +58 +00:03:52,210 --> 00:03:54,160 +Và nếu chúng tôi muốn thêm + +59 +00:03:54,160 --> 00:03:59,160 +một mục nhập khác, thì đơn giản là thêm khóa, dấu hai chấm rồi đến giá trị + +60 +00:04:00,340 --> 00:04:02,530 +và tắt nó lại bằng dấu phẩy. + +61 +00:04:03,250 --> 00:04:08,250 +Vì vậy, bây giờ từ điển của chúng tôi đại diện chính xác dữ liệu giống như chúng tôi đã thấy + +62 +00:04:09,760 --> 00:04:14,760 +trong bảng của chúng tôi ở đây với một loạt các cặp giá trị khóa và tổng cộng ba mục nhập. + +63 +00:04:16,570 --> 00:04:16,839 +Bây + +64 +00:04:16,839 --> 00:04:21,839 +giờ, điều tiếp theo tôi muốn làm là nếu tôi muốn truy xuất một mục từ từ điển, bởi vì chúng tôi + +65 +00:04:21,970 --> 00:04:25,150 +biết rằng nếu chúng tôi có một danh sách, điều chúng tôi sẽ làm + +66 +00:04:25,210 --> 00:04:28,330 +là chúng tôi sẽ sử dụng một tập hợp các dấu ngoặc vuông + +67 +00:04:28,660 --> 00:04:32,260 +và sau đó chúng tôi sẽ cung cấp chỉ mục của mục mà chúng tôi muốn. + +68 +00:04:32,620 --> 00:04:37,620 +Vì vậy, mục ở chỉ số không hoặc một hoặc hai, vân vân và vân vân. Bây giờ đối với từ điển, + +69 +00:04:38,290 --> 00:04:41,590 +nó tương tự về mặt cú pháp nhưng điểm + +70 +00:04:41,890 --> 00:04:46,890 +khác biệt duy nhất là từ điển có các thành phần được xác + +71 +00:04:47,230 --> 00:04:51,700 +định bằng khóa của chúng. Ví dụ: nếu chúng ta muốn phần thông + +72 +00:04:52,030 --> 00:04:57,030 +tin này, thì tất cả những gì chúng ta phải làm là nhấn vào từ điển, sau đó thêm một + +73 +00:04:57,700 --> 00:05:02,410 +tập hợp các dấu ngoặc vuông và bên trong dấu ngoặc vuông, chúng ta sẽ cung cấp khóa. + +74 +00:05:02,890 --> 00:05:07,390 +Vì vậy, ở đây khóa là một chuỗi và đó là lỗi chuỗi. + +75 +00:05:07,840 --> 00:05:09,910 +Vì vậy, chúng ta hãy tiếp tục và đặt lỗi ở đây. + +76 +00:05:10,960 --> 00:05:14,440 +Và bây giờ nếu tôi tiếp tục và in nó, thì bạn + +77 +00:05:14,500 --> 00:05:17,500 +có thể thấy rằng nó sẽ cung cấp cho tôi + +78 +00:05:17,530 --> 00:05:21,160 +giá trị, đó là 'Lỗi trong chương trình khiến chương trình không + +79 +00:05:21,160 --> 00:05:24,190 +chạy như mong đợi. 'Bây giờ, điều thực sự + +80 +00:05:24,190 --> 00:05:29,190 +quan trọng là bạn phải đảm bảo rằng khi bạn tìm nạp một thứ gì đó từ từ + +81 +00:05:29,470 --> 00:05:33,820 +điển bằng chìa khóa đó là bạn thực sự đánh vần chính xác từ khóa đó. + +82 +00:05:34,570 --> 00:05:35,260 +Một lỗi thực + +83 +00:05:35,260 --> 00:05:39,340 +sự phổ biến là khi bạn đang cố gắng lấy một thứ gì đó từ từ điển và bạn + +84 +00:05:39,340 --> 00:05:43,480 +vừa mắc một lỗi đánh máy rất đơn giản. Vì vậy, thay vì 'u', + +85 +00:05:43,480 --> 00:05:45,760 +tôi đang nhập 'o' ở đây và + +86 +00:05:45,760 --> 00:05:50,760 +bạn sẽ thấy chúng tôi gặp lỗi. Và lỗi cho chúng ta biết rằng đó là lỗi + +87 +00:05:51,400 --> 00:05:56,400 +khóa liên quan đến khóa cụ thể này và nó làm nổi bật dòng 7 này, nơi chúng tôi đang cố gắng + +88 +00:05:56,620 --> 00:05:59,210 +lấy một thứ gì đó ra khỏi từ điển bằng khóa này. + +89 +00:05:59,660 --> 00:06:03,680 +Về cơ bản, nó cho bạn biết rằng chìa khóa này không thực sự tồn tại và + +90 +00:06:03,680 --> 00:06:08,030 +nó không thể được tìm thấy. Vì vậy, nó không biết những gì nó là mà bạn muốn. Hãy nhớ lại + +91 +00:06:08,030 --> 00:06:13,030 +cách chúng ta có danh sách và khi chúng ta cố gắng truy xuất thứ + +92 +00:06:13,490 --> 00:06:17,870 +gì đó không có trong danh sách. Vì vậy, ví dụ, danh sách cụ thể này + +93 +00:06:17,870 --> 00:06:21,560 +ở chỉ mục 4 không thực sự tồn tại bởi vì đây là 0 một, hai, ba + +94 +00:06:21,980 --> 00:06:25,310 +và bốn thực sự không phải là một phần dữ liệu bên trong danh sách này. + +95 +00:06:25,910 --> 00:06:30,590 +Tương tự như vậy với từ điển, nếu chúng ta cố gắng nhập một khóa không tồn tại, thì + +96 +00:06:30,650 --> 00:06:32,420 +chúng ta sẽ gặp lỗi khóa này. + +97 +00:06:33,740 --> 00:06:38,740 +Bây giờ một cạm bẫy phổ biến khác mà sinh viên rơi vào là họ không thực sự sử + +98 +00:06:40,370 --> 00:06:43,880 +dụng kiểu dữ liệu chính xác. Vì vậy, ví dụ: nếu + +99 +00:06:44,030 --> 00:06:49,030 +chúng tôi định nghĩa từ điển này mà không đặt một chuỗi xung quanh mỗi khóa này, + +100 +00:06:51,110 --> 00:06:55,640 +thì nó sẽ bị lỗi và thậm chí nó sẽ không cho phép chúng tôi chạy. + +101 +00:06:55,760 --> 00:06:59,540 +Nó sẽ cho chúng ta biết lỗi có tên không xác định vì nó nghĩ + +102 +00:06:59,540 --> 00:07:01,460 +rằng đây là một biến mà bạn + +103 +00:07:01,640 --> 00:07:06,440 +đã khai báo ở đâu đó, nhưng không phải vậy. Trên thực tế, những gì bạn muốn là những chuỗi này cho các phím. + +104 +00:07:06,680 --> 00:07:09,650 +Và vì vậy, khi bạn có một khóa là một chuỗi, khi + +105 +00:07:10,040 --> 00:07:12,620 +bạn đang cố gắng truy xuất dữ liệu từ + +106 +00:07:12,650 --> 00:07:17,650 +khóa đó, bạn cũng phải đảm bảo rằng bạn cung cấp khóa trong kiểu dữ liệu thực của nó. + +107 +00:07:18,250 --> 00:07:22,390 +Vì vậy, ví dụ, nếu đây chỉ là một con số, hãy nói một, hai, ba, sau đó, + +108 +00:07:22,780 --> 00:07:26,320 +tất nhiên, tất cả những gì bạn phải viết ở đây chỉ là một, + +109 +00:07:26,830 --> 00:07:30,760 +hai, ba và nó sẽ biết rằng phần dữ liệu này là của bạn. truy nã. + +110 +00:07:32,530 --> 00:07:37,180 +Vì vậy, đó là cách bạn truy xuất các mục từ từ điển bằng cách thêm một dấu ngoặc + +111 +00:07:37,240 --> 00:07:39,340 +vuông và sau đó đưa khóa cho nó. + +112 +00:07:39,940 --> 00:07:44,290 +Và nó sẽ tìm kiếm chìa khóa bên trong từ điển và trả lại giá + +113 +00:07:44,290 --> 00:07:46,060 +trị cho bạn. Bây giờ, điều + +114 +00:07:46,060 --> 00:07:50,260 +gì sẽ xảy ra nếu bạn muốn thêm một phần dữ liệu chẳng hạn như vòng lặp mà chúng ta + +115 +00:07:50,260 --> 00:07:53,110 +đã có trước đó, nhưng bạn muốn làm điều đó theo chương trình. + +116 +00:07:53,260 --> 00:07:55,300 +Vì vậy, thay vì làm điều đó khi + +117 +00:07:55,300 --> 00:07:58,510 +bạn đang xác định từ điển lúc đầu, điều gì sẽ xảy ra + +118 +00:07:58,690 --> 00:08:02,860 +nếu ở một số giai đoạn sau trong chương trình của bạn, bạn cần thêm một mục mới? + +119 +00:08:03,580 --> 00:08:06,070 +Vâng, để làm điều này, nó cũng thực sự đơn giản. + +120 +00:08:06,670 --> 00:08:09,880 +Tất cả những gì bạn phải làm là nhấn vào từ điển, + +121 +00:08:10,060 --> 00:08:14,380 +được gọi là từ điển lập trình trong trường hợp của chúng tôi và một lần nữa, + +122 +00:08:14,410 --> 00:08:17,110 +sử dụng dấu ngoặc vuông, chúng tôi xác định khóa. + +123 +00:08:17,710 --> 00:08:20,500 +Chìa khóa tôi sẽ thêm là vòng lặp của chúng tôi. + +124 +00:08:21,070 --> 00:08:25,180 +Và sau đó sau một dấu bằng, tôi có thể gán giá trị. + +125 +00:08:26,020 --> 00:08:29,680 +Vì vậy, trong trường hợp của tôi, giá trị sẽ là định nghĩa cho một vòng lặp. + +126 +00:08:30,370 --> 00:08:35,370 +Và bây giờ khi dòng mã này được thực thi và chúng ta tiếp tục và chỉ in từ điển lập trình + +127 +00:08:37,570 --> 00:08:40,179 +sau khi điều này xảy ra, sau đó chúng ta + +128 +00:08:40,539 --> 00:08:43,900 +sẽ thấy rằng nó thực sự khác với những gì chúng ta có trước đây. + +129 +00:08:44,110 --> 00:08:49,110 +Vì vậy, hãy nhấn run và bạn có thể thấy rằng trước đây chúng tôi có một từ điển lập + +130 +00:08:49,120 --> 00:08:51,580 +trình chỉ có hai mục, lỗi và chức năng. + +131 +00:08:52,090 --> 00:08:56,910 +Và sau dòng 10 này, nơi chúng tôi in lại từ điển lập trình của mình, bạn có thể + +132 +00:08:57,240 --> 00:09:00,540 +thấy nó hiện có ba mục, lỗi, chức năng và vòng lặp. + +133 +00:09:01,740 --> 00:09:04,380 +Bây giờ rất thường xuyên khi bạn đang viết mã, có thể thực + +134 +00:09:04,500 --> 00:09:09,500 +sự hữu ích khi bắt đầu với một từ điển trống. Giống như bạn đã thấy trước đây, bạn tạo + +135 +00:09:09,720 --> 00:09:10,290 +một + +136 +00:09:10,290 --> 00:09:15,000 +danh sách trống bằng cách chỉ cần có một tập hợp các dấu ngoặc vuông không có + +137 +00:09:15,000 --> 00:09:15,833 +gì bên trong. + +138 +00:09:16,020 --> 00:09:21,020 +Bạn cũng có thể tạo một từ điển trống bằng cách tạo một tập hợp các dấu ngoặc nhọn mà + +139 +00:09:22,950 --> 00:09:25,950 +không có gì bên trong. Và sau đó ở giai đoạn sau, + +140 +00:09:25,980 --> 00:09:30,630 +bạn có thể thêm vào từ điển của mình bằng cách sử dụng phương pháp này mà bạn đã thấy ở đây. + +141 +00:09:32,010 --> 00:09:33,150 +Mặt khác, bây giờ bạn + +142 +00:09:33,180 --> 00:09:37,710 +có thể thực sự muốn xóa toàn bộ từ điển. Ở đây, tôi đang tạo một từ + +143 +00:09:37,740 --> 00:09:42,300 +điển trống mới bằng cách tạo cặp dấu ngoặc nhọn này mà không có gì + +144 +00:09:42,300 --> 00:09:43,230 +bên trong. + +145 +00:09:43,800 --> 00:09:48,800 +Nhưng tôi cũng có thể xóa từ điển hiện có bằng cách đơn giản làm điều tương tự. + +146 +00:09:49,530 --> 00:09:53,940 +Chúng tôi biết rằng từ điển này, Progra_dictionary, có ba mục trong đó. + +147 +00:09:54,360 --> 00:09:55,980 +Nhưng ở dòng 17, + +148 +00:09:56,010 --> 00:09:59,490 +tôi sẽ nói từ điển lập trình bằng từ điển trống. + +149 +00:10:00,030 --> 00:10:03,270 +Và bây giờ nếu tôi di chuyển câu lệnh in này xuống đây, + +150 +00:10:03,660 --> 00:10:06,120 +thì bạn có thể thấy rằng khi nó in ra, + +151 +00:10:06,330 --> 00:10:08,610 +nó thực sự sẽ hoàn toàn trống rỗng. + +152 +00:10:10,200 --> 00:10:15,030 +Điều đó có thể thực sự hữu ích nếu bạn muốn xóa tiến trình của người dùng hoặc + +153 +00:10:15,300 --> 00:10:18,150 +ví dụ, nếu một trò chơi khởi động lại, thì + +154 +00:10:18,210 --> 00:10:21,990 +tất cả điểm số và thống kê có thể sẽ phải bị xóa sạch. + +155 +00:10:22,230 --> 00:10:24,090 +Vì vậy, đây là một cách mà bạn có thể làm điều đó. + +156 +00:10:25,020 --> 00:10:29,100 +Giờ đây, phương pháp khai thác vào từ điển này, sử dụng phím + +157 +00:10:29,730 --> 00:10:33,660 +để tìm nạp mục có liên quan từ nó và sau đó + +158 +00:10:34,260 --> 00:10:37,920 +làm điều gì đó với nó không chỉ là thêm. + +159 +00:10:38,370 --> 00:10:42,330 +Bạn cũng có thể sử dụng điều này để chỉnh sửa một mục trong từ điển. + +160 +00:10:44,280 --> 00:10:47,880 +Ví dụ: hãy để tôi tiếp tục và nhận xét hai dòng mã + +161 +00:10:48,180 --> 00:10:53,180 +này để chúng tôi không xóa từ điển lập trình của mình và thay vào đó tôi sẽ + +162 +00:10:53,730 --> 00:10:58,730 +truy cập vào từ điển lập trình và tôi sẽ tìm nạp mục có khóa lỗi và tôi + +163 +00:11:00,090 --> 00:11:02,430 +sẽ xác định lại giá trị của nó. + +164 +00:11:02,640 --> 00:11:06,690 +Vì vậy, hiện tại nó sẽ là một lỗi trong một chương trình khiến chương trình + +165 +00:11:06,690 --> 00:11:08,280 +không chạy như mong đợi. + +166 +00:11:08,820 --> 00:11:12,810 +Và tôi có thể chứng minh điều đó nếu tôi chỉ bọc điều này xung quanh một câu lệnh in. + +167 +00:11:14,580 --> 00:11:18,450 +Nếu thay vào đó, tôi muốn giá trị này là một giá trị khác, thì tôi + +168 +00:11:18,540 --> 00:11:23,010 +có thể chỉ cần sử dụng cú pháp giống như tôi đã làm để thêm các mục mới + +169 +00:11:23,340 --> 00:11:24,360 +nhưng trong trường hợp + +170 +00:11:24,420 --> 00:11:28,440 +này, tôi thực sự đang chỉnh sửa mục nhập này vì nó sẽ xem qua từ + +171 +00:11:28,440 --> 00:11:29,273 +điển, tìm + +172 +00:11:29,370 --> 00:11:34,370 +một giá trị bằng phím này và sau đó gán nó cho bất cứ thứ gì tôi đặt ở phía + +173 +00:11:34,500 --> 00:11:37,500 +bên tay phải của dấu bằng. Mặt khác, nếu nó không + +174 +00:11:37,500 --> 00:11:39,540 +tìm thấy gì với khóa đó, thì nó + +175 +00:11:39,870 --> 00:11:43,200 +sẽ tạo một mục nhập mới với giá trị một lần nữa ở + +176 +00:11:43,230 --> 00:11:44,970 +phía bên phải của dấu bằng. + +177 +00:11:45,900 --> 00:11:50,250 +Bây giờ, hãy nói rằng một lỗi thay vào đó là 'Một con bướm đêm trong máy tính của bạn. 'Bây giờ, nếu tôi đi + +178 +00:11:51,930 --> 00:11:56,890 +và in từ điển lập trình của mình một lần nữa, thì bạn có + +179 +00:11:57,160 --> 00:12:02,160 +thể thấy rằng định nghĩa cho lỗi của chúng tôi hiện đã được thay đổi. + +180 +00:12:04,150 --> 00:12:07,540 +Điều cuối cùng liên quan đến từ điển mà tôi nghĩ là thực sự, thực + +181 +00:12:07,540 --> 00:12:12,540 +sự hữu ích là cách bạn lặp lại từ điển. Và sử dụng kiến thức của bạn từ các danh + +182 +00:12:14,350 --> 00:12:18,520 +sách, bạn có thể nghĩ rằng để lặp qua từ điển, bạn sẽ, giả sử chúng + +183 +00:12:18,670 --> 00:12:22,840 +ta đang sử dụng vòng lặp for. Và chúng tôi nói với, + +184 +00:12:22,900 --> 00:12:25,840 +ừm, điều trong từ điển lập trình, chúng + +185 +00:12:26,290 --> 00:12:30,130 +ta hãy tiếp tục và in điều này mỗi lần. + +186 +00:12:30,790 --> 00:12:34,270 +Đây là một khoảnh khắc tuyệt vời để chơi máy tính và suy nghĩ, + +187 +00:12:34,300 --> 00:12:36,640 +bạn mong đợi điều gì sẽ được in ra? + +188 +00:12:36,820 --> 00:12:38,950 +Vì vậy, chúng ta hãy bình luận tất cả các câu + +189 +00:12:38,950 --> 00:12:42,880 +lệnh in khác để chúng ta không bị nhầm lẫn. Và khi tôi bấm chạy, bạn nghĩ + +190 +00:12:43,480 --> 00:12:45,190 +cái gì sẽ được in ra? + +191 +00:12:47,730 --> 00:12:47,880 +1: Đúng không? + +192 +00:12:47,880 --> 00:12:50,400 +Được rồi. Đó có phải là những gì bạn mong đợi? Bởi vì nó chắc + +193 +00:12:50,400 --> 00:12:53,130 +chắn không phải là những gì tôi mong đợi khi lần đầu tiên học Python. + +194 +00:12:53,700 --> 00:12:58,680 +Tôi nghĩ rằng nó sẽ cung cấp cho tôi từng mục trong từ điển với khóa này và giá + +195 +00:12:58,680 --> 00:12:59,513 +trị của nó. + +196 +00:12:59,940 --> 00:13:04,350 +Nhưng thay vào đó, mã này thực sự chỉ cung cấp cho bạn các chìa khóa. + +197 +00:13:05,700 --> 00:13:10,380 +Tất nhiên, bây giờ, khi bạn đã có quyền truy cập vào khóa, thay vì điều + +198 +00:13:10,560 --> 00:13:13,770 +này, tôi thực sự nên nói về khóa trong Progra_dictionary. + +199 +00:13:14,310 --> 00:13:18,570 +Nếu tôi muốn in khóa, thì tất nhiên tôi chỉ có thể viết khóa in. + +200 +00:13:18,960 --> 00:13:20,940 +Nhưng nếu tôi muốn nắm bắt + +201 +00:13:21,120 --> 00:13:24,720 +giá trị, tôi cũng có thể dễ dàng truy cập vào từ điển + +202 +00:13:24,960 --> 00:13:28,230 +của mình, sử dụng dấu ngoặc vuông và chuyển vào khóa đó. + +203 +00:13:28,740 --> 00:13:32,520 +Vì vậy, bây giờ khi tôi nhấn run, bạn có thể thấy nó cấp + +204 +00:13:32,550 --> 00:13:35,520 +cho tôi khóa đầu tiên từ dòng này và thứ + +205 +00:13:35,640 --> 00:13:38,040 +hai là giá trị dựa trên dòng này. + +206 +00:13:38,670 --> 00:13:42,840 +Tôi đang sử dụng mã truy xuất đó để nhận giá trị. + +207 +00:13:44,130 --> 00:13:44,550 +Tất + +208 +00:13:44,550 --> 00:13:49,050 +nhiên, hãy nhớ rằng bạn có thể truy cập vào tất cả mã mà tôi đang viết ở đây + +209 +00:13:49,050 --> 00:13:51,270 +bằng cách xem mã kết thúc của ngày mà + +210 +00:13:51,480 --> 00:13:53,910 +bạn sẽ tìm thấy trên danh sách tài nguyên khóa học. + +211 +00:13:54,240 --> 00:13:58,380 +Và nếu bạn muốn, hãy xem lại nhanh mọi thứ mà chúng ta đã trải + +212 +00:13:58,380 --> 00:13:59,190 +qua cho + +213 +00:13:59,190 --> 00:14:04,190 +đến nay, bởi vì rất nhiều kiến thức này sẽ được kiểm tra trong bài học tiếp theo, nơi + +214 +00:14:04,230 --> 00:14:08,820 +chúng ta thực hiện một bài tập mã hóa sẽ thực sự củng cố mọi thứ bạn + +215 +00:14:08,820 --> 00:14:13,410 +đã học trong bài học này cho đến nay. Vì vậy, cho tất cả những điều đó, và hơn thế nữa, tôi sẽ xem trong bài học tiếp theo. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 Exercise-22.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 Exercise-22.url new file mode 100644 index 0000000000000000000000000000000000000000..1bdcd7e169ee1e3ceeecb6a389f7d0f86e283ea1 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 Exercise-22.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/56feec3f-61a3-47e9-95d9-7f9871a9a09a \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 How-to-join-Auditorium.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 [Interactive Coding Exercise] Grading Program.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 [Interactive Coding Exercise] Grading Program.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ab3a696cb1c0834714c146e1a902e4e9609a4507 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 [Interactive Coding Exercise] Grading Program.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4dccf2e401cb570e088eb7cab8bb75608946adac3f9cbb7da1471e100b8f0af +size 12399201 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 [Interactive Coding Exercise] Grading Program_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 [Interactive Coding Exercise] Grading Program_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f31563d6c3804f296d8c9b2e88d313d48273e5fc --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/003 [Interactive Coding Exercise] Grading Program_vi.srt @@ -0,0 +1,288 @@ +1 +00:00:00,600 --> 00:00:03,060 +Trong bài tập này, bạn sẽ tạo + +2 +00:00:03,060 --> 00:00:07,980 +một chương trình chấm điểm bài kiểm tra của học sinh. + +3 +00:00:07,980 --> 00:00:12,180 +Bạn sẽ thấy từ dòng 1 đến dòng 7, chúng ta có một từ điển và nó + +4 +00:00:12,180 --> 00:00:14,310 +được gọi là điểm_học sinh. + +5 +00:00:14,310 --> 00:00:15,390 +Bên trong từ điển, + +6 +00:00:15,390 --> 00:00:18,120 +các khóa là tên của các học sinh và + +7 +00:00:18,120 --> 00:00:21,450 +giá trị là điểm kiểm tra của họ. + +8 +00:00:21,450 --> 00:00:24,810 +Những gì bạn sắp làm là sử dụng vòng lặp + +9 +00:00:24,810 --> 00:00:27,600 +for để lặp qua từ điển, bạn sẽ viết + +10 +00:00:27,600 --> 00:00:31,320 +một chương trình có thể diễn giải điểm của từng + +11 +00:00:31,320 --> 00:00:36,320 +học sinh và tạo một từ điển mới có tên là school_grades và + +12 +00:00:36,390 --> 00:00:40,650 +trong từ điển này, bạn có tên học sinh khớp với cấp + +13 +00:00:40,650 --> 00:00:43,110 +độ tương ứng của họ. + +14 +00:00:43,110 --> 00:00:46,050 +Nếu nhìn vào khung Mô tả, bạn + +15 +00:00:46,050 --> 00:00:50,580 +sẽ thấy điểm và điểm tương ứng của chúng. + +16 +00:00:50,580 --> 00:00:54,330 +Vì vậy, ví dụ: điểm từ 91 đến 100 được + +17 +00:00:54,330 --> 00:00:58,680 +hiểu là Xuất sắc, 81 đến 90 là Vượt quá mong + +18 +00:00:58,680 --> 00:01:00,420 +đợi, v.v. + +19 +00:01:00,420 --> 00:01:04,470 +Hãy xem Kết quả mong đợi và xem liệu bạn có thể tìm ra + +20 +00:01:04,470 --> 00:01:08,310 +cách sử dụng vòng lặp trên từ điển để làm cho chương + +21 +00:01:08,310 --> 00:01:12,720 +trình của bạn hoạt động như mong đợi hay không. + +22 +00:01:12,720 --> 00:01:13,570 +Hãy thử ngay bây giờ. + +23 +00:01:21,450 --> 00:01:24,900 +Điều đầu tiên tôi sẽ làm là tạo một từ điển có tên + +24 +00:01:24,900 --> 00:01:26,610 +là sinh viên_grades và + +25 +00:01:26,610 --> 00:01:30,060 +chỉ cần đặt nó như một từ điển trống { }. + +26 +00:01:30,060 --> 00:01:33,243 +Đây là những gì chúng ta sẽ điền vào bằng chương trình của mình. + +27 +00:01:34,290 --> 00:01:37,860 +Tiếp theo, tôi sẽ tạo một vòng lặp for lặp + +28 +00:01:37,860 --> 00:01:42,240 +qua từ điển của sinh viên để tôi có thể nắm giữ từng khóa + +29 +00:01:42,240 --> 00:01:45,333 +trong từ điển đó từng khóa một. + +30 +00:01:46,320 --> 00:01:49,110 +Để truy cập vào số điểm sinh viên đó, tôi phải + +31 +00:01:49,110 --> 00:01:52,590 +sử dụng khóa trên từ điển sinh viên_scores. + +32 +00:01:52,590 --> 00:01:57,270 +Vì vậy, dòng mã chính xác trông giống như dòng 14 trong đó + +33 +00:01:57,270 --> 00:01:59,640 +điểm số, biến mà tôi quan tâm + +34 +00:01:59,640 --> 00:02:01,410 +lưu trữ bằng sinh viên_scores, + +35 +00:02:01,410 --> 00:02:05,190 +chuyển từng tên sinh viên làm khóa và bây giờ điểm + +36 +00:02:05,190 --> 00:02:09,330 +sẽ bằng bao nhiêu là lần đầu tiên tôi vòng lặp chạy, + +37 +00:02:09,330 --> 00:02:11,880 +nó sẽ bằng 81. + +38 +00:02:11,880 --> 00:02:13,290 +Lần sau sẽ là 78. + +39 +00:02:13,290 --> 00:02:16,023 +Lần sau sẽ là 99, vân vân và vân vân. + +40 +00:02:17,430 --> 00:02:19,950 +Bây giờ đến phần dễ dàng hơn khi tôi + +41 +00:02:19,950 --> 00:02:23,730 +có các câu lệnh if, elif, else và tôi chỉ cần sử dụng + +42 +00:02:23,730 --> 00:02:28,320 +các tiêu chí trong khung Mô tả để xác định cách diễn giải từng + +43 +00:02:28,320 --> 00:02:29,820 +điểm. + +44 +00:02:29,820 --> 00:02:32,340 +Vì vậy, nếu điểm lớn hơn 90 thì tôi có thể + +45 +00:02:32,340 --> 00:02:34,920 +lấy học sinh_điểm, vốn là từ điển trống + +46 +00:02:34,920 --> 00:02:37,680 +của chúng tôi, tạm thời để trống, sau đó sử + +47 +00:02:37,680 --> 00:02:41,340 +dụng dấu ngoặc vuông [ ] để chỉ định học sinh, đây là nội dung + +48 +00:02:41,340 --> 00:02:43,980 +chúng tôi đang lặp lại vào lúc này . + +49 +00:02:43,980 --> 00:02:46,500 +Đó sẽ là tên của học sinh + +50 +00:02:46,500 --> 00:02:50,790 +và đặt nó bằng một giá trị, đó sẽ là điểm. + +51 +00:02:50,790 --> 00:02:53,940 +Và tôi có thể làm được điều đó nếu điểm lớn + +52 +00:02:53,940 --> 00:02:56,280 +hơn 80 và nếu điểm lớn hơn 70. + +53 +00:02:56,280 --> 00:02:59,940 +Và hãy nhớ, bởi vì cách hoạt động của các câu lệnh if, elif, else, chúng + +54 +00:02:59,940 --> 00:03:01,980 +hoạt động giống như một thác nước. + +55 +00:03:01,980 --> 00:03:03,570 +Vì vậy, nếu cái đầu tiên sai thì nó + +56 +00:03:03,570 --> 00:03:05,070 +sẽ chuyển sang cái thứ hai. + +57 +00:03:05,070 --> 00:03:08,220 +Vì vậy, mặc dù chúng ta chỉ kiểm tra ở dòng + +58 +00:03:08,220 --> 00:03:10,620 +17, nhưng điểm Elif đó vẫn lớn + +59 +00:03:10,620 --> 00:03:14,070 +hơn 80 vì điểm đầu tiên đã vào Elif, điều đó có + +60 +00:03:14,070 --> 00:03:18,210 +nghĩa là điều kiện đầu tiên ở dòng 15 đã là Sai. + +61 +00:03:18,210 --> 00:03:22,500 +Vì vậy, về cơ bản điều đó có nghĩa là số điểm mà chúng + +62 +00:03:22,500 --> 00:03:27,500 +tôi đưa ra vượt quá mong đợi ở ngày 18 là từ 80 đến 90. + +63 +00:03:28,440 --> 00:03:30,390 +Bây giờ, cách từ điển hoạt động với + +64 +00:03:30,390 --> 00:03:32,550 +khóa và giá trị cũng như cách bạn truy + +65 +00:03:32,550 --> 00:03:35,490 +cập một giá trị thông qua khóa có thể hơi bí ẩn nhưng + +66 +00:03:35,490 --> 00:03:37,140 +nếu bạn sử dụng các câu lệnh in + +67 +00:03:37,140 --> 00:03:41,880 +và đánh giá niềm tin cũng như thực tế của mình rồi so sánh chúng thì bạn sẽ có thể đạt + +68 +00:03:41,880 --> 00:03:43,110 +đến điểm mà bạn có thể + +69 +00:03:43,110 --> 00:03:45,810 +giải được câu đố và tìm ra cách làm cho chương trình + +70 +00:03:45,810 --> 00:03:48,540 +thực hiện những gì bạn muốn. + +71 +00:03:48,540 --> 00:03:50,400 +Vì vậy, nếu bạn cần thực hiện bất kỳ sửa chữa nào ngay bây giờ, + +72 +00:03:50,400 --> 00:03:51,450 +hãy tiếp tục và thực hiện điều đó. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Day-9-Ending-Code.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Day-9-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..e26df501a2ce4afe343257b80bf245035a51fb28 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Day-9-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-9-end \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Nesting Lists and Dictionaries.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Nesting Lists and Dictionaries.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8b3411d5567d2164fcf2ba86cb2609415a5e9d19 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Nesting Lists and Dictionaries.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2e95ff1e897de3102411fe148dc8c91d030d8e828182b997bdcc4476915a19d +size 44710617 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Nesting Lists and Dictionaries_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Nesting Lists and Dictionaries_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..17e68b09a93061b536b4e40b39d7471b65b9679f --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/004 Nesting Lists and Dictionaries_vi.srt @@ -0,0 +1,556 @@ +1 +00:00:00,420 --> 00:00:03,270 +Bây giờ chúng ta đã thấy danh sách cũng như từ điển, + +2 +00:00:03,630 --> 00:00:08,630 +tôi muốn nói về một khái niệm mà bạn thường thấy trong cả hai loại tập hợp này và đó là + +3 +00:00:09,300 --> 00:00:12,660 +thứ được gọi là lồng nhau. Bây giờ, nếu chúng ta tưởng + +4 +00:00:12,690 --> 00:00:15,930 +tượng một danh sách hoặc một từ điển giống như một + +5 +00:00:15,960 --> 00:00:20,430 +thư mục mà ở đó rất nhiều thứ có thể được lưu trữ bên trong + +6 +00:00:20,850 --> 00:00:25,850 +nó, thì việc lồng danh sách và từ điển chỉ là việc đặt cái này vào bên + +7 +00:00:26,040 --> 00:00:28,200 +trong cái kia. Ví dụ, + +8 +00:00:28,380 --> 00:00:31,320 +đây là một từ điển rất đơn giản, nó + +9 +00:00:31,320 --> 00:00:33,480 +chỉ có một cặp khóa-giá trị. + +10 +00:00:34,170 --> 00:00:39,170 +Bây giờ chúng ta biết rằng chúng ta có thể thêm nhiều cặp khóa-giá trị vào cùng một từ điển chỉ bằng + +11 +00:00:40,110 --> 00:00:45,030 +cách thêm một loạt dấu phẩy để phân tách chúng. Bây giờ, điều gì sẽ xảy ra + +12 +00:00:45,180 --> 00:00:50,100 +nếu thay vì có một giá trị đơn giản như một chuỗi hoặc một số, tôi + +13 +00:00:50,790 --> 00:00:54,270 +cũng có thể đặt một danh sách dưới dạng một giá trị. + +14 +00:00:55,200 --> 00:00:56,033 +Tương tự, tôi + +15 +00:00:56,040 --> 00:01:01,040 +cũng có thể sử dụng từ điển như một giá trị. Trong trường hợp này, chúng tôi có một + +16 +00:01:01,170 --> 00:01:05,910 +danh sách làm giá trị cho khóa, danh sách đầu tiên này và chúng tôi có + +17 +00:01:06,390 --> 00:01:11,390 +một từ điển làm giá trị cho khóa2. Lưu ý rằng đây là một danh + +18 +00:01:13,410 --> 00:01:17,550 +sách và một từ điển được lồng bên trong một từ điển khác. + +19 +00:01:18,030 --> 00:01:20,490 +Cấu trúc phức tạp hơn một chút, nhưng nó + +20 +00:01:21,090 --> 00:01:26,070 +mang lại cho chúng ta sự linh hoạt hơn khi chúng ta cố gắng lưu trữ các phần + +21 +00:01:26,070 --> 00:01:29,580 +dữ liệu phức tạp hơn. Quay lại mã của chúng ta, hãy + +22 +00:01:30,000 --> 00:01:34,050 +tiếp tục và tạo một số từ điển mẫu để xem điều này thực sự trông như thế + +23 +00:01:34,050 --> 00:01:36,600 +nào trong cuộc sống thực. Ví dụ: đây + +24 +00:01:36,600 --> 00:01:41,600 +có thể là một từ điển chứa quốc gia làm khóa và thành phố, đó + +25 +00:01:43,350 --> 00:01:47,370 +là thủ đô, là giá trị. Đối với Pháp, đó + +26 +00:01:47,400 --> 00:01:49,980 +là Paris, đối với Đức là Berlin. + +27 +00:01:50,340 --> 00:01:54,360 +Đây là một từ điển rất đơn giản mà bạn đã thấy. Bây giờ, nếu tôi muốn + +28 +00:01:54,360 --> 00:01:59,360 +lồng một danh sách vào từ điển, thì tôi sẽ có thể biểu diễn + +29 +00:02:00,180 --> 00:02:04,650 +dữ liệu phức tạp hơn nữa. Ví dụ, nếu tôi có một nhật + +30 +00:02:04,650 --> 00:02:09,650 +ký du lịch, nơi tôi sẽ thu thập một cuốn từ điển về tất cả các thành phố tôi + +31 +00:02:11,220 --> 00:02:15,990 +đã đến cho mỗi quốc gia tôi đã đi. Vì vậy, ví dụ: nếu tôi đã + +32 +00:02:16,560 --> 00:02:21,560 +đi du lịch đến Pháp và tôi muốn nói rằng tôi đã đến nhiều thành + +33 +00:02:21,600 --> 00:02:24,570 +phố, tôi không thể chỉ nói Paris, rồi đến + +34 +00:02:24,630 --> 00:02:29,630 +Lille, Dijon, điều đó không thực sự hiệu quả vì mỗi phím chỉ có + +35 +00:02:33,090 --> 00:02:37,530 +thể có một giá trị. Cách duy nhất mà chúng ta có thể làm cho + +36 +00:02:37,560 --> 00:02:41,430 +ba phần dữ liệu này trở thành một giá trị là chuyển nó thành một danh sách, giống như vậy. + +37 +00:02:42,120 --> 00:02:45,300 +Vì vậy, bây giờ trong từ điển nhật ký du lịch + +38 +00:02:45,750 --> 00:02:47,850 +của chúng tôi được biểu thị bằng + +39 +00:02:48,180 --> 00:02:53,180 +dấu ngoặc nhọn, chúng tôi có một cặp giá trị khóa và điều đó xảy ra khi giá + +40 +00:02:53,250 --> 00:02:55,920 +trị trong trường hợp này là một danh sách. + +41 +00:02:56,850 --> 00:03:01,570 +Và tất nhiên bạn có thể tiếp tục và thêm bao nhiêu mục nhập tùy + +42 +00:03:01,930 --> 00:03:06,930 +thích mà vẫn bảo toàn loại cấu trúc này của khóa là một chuỗi và giá trị + +43 +00:03:07,630 --> 00:03:10,180 +là một danh sách. Nhân tiện, ý + +44 +00:03:10,210 --> 00:03:14,050 +tưởng lồng ghép này không còn hạn chế trong các từ điển nữa. + +45 +00:03:14,050 --> 00:03:17,260 +Bạn cũng có thể chỉ cần lồng một danh sách vào một danh sách. + +46 +00:03:17,800 --> 00:03:20,200 +Vì vậy, bạn có thể có một danh sách là + +47 +00:03:20,260 --> 00:03:25,260 +A và sau đó là B, và sau đó mục thứ ba chỉ là một danh sách khác có C và D. + +48 +00:03:26,140 --> 00:03:28,450 +Đây là mã Python hoàn toàn hợp lệ nhưng + +49 +00:03:28,990 --> 00:03:33,990 +nó không hoàn toàn hữu ích như lồng một danh sách trong từ điển hoặc một từ điển trong từ + +50 +00:03:34,420 --> 00:03:39,310 +điển, bởi vì cách dữ liệu đó được cấu trúc. Bây giờ, điều gì sẽ xảy + +51 +00:03:39,310 --> 00:03:43,420 +ra nếu bạn muốn lồng một từ điển vào một từ điển? + +52 +00:03:44,570 --> 00:03:48,130 +Giả sử rằng chúng tôi muốn mở rộng nhật ký hành trình của mình. + +53 +00:03:48,790 --> 00:03:53,790 +Và thay vì chỉ lưu trữ các thành phố mà tôi đã ghé thăm ở mỗi quốc gia, + +54 +00:03:54,280 --> 00:03:59,280 +điều gì sẽ xảy ra nếu tôi muốn theo dõi số lần tôi đã đến thăm quốc + +55 +00:03:59,920 --> 00:04:00,753 +gia đó? + +56 +00:04:00,880 --> 00:04:05,710 +Hoặc nếu tôi muốn thực sự gắn nhãn phần dữ liệu này là gì? + +57 +00:04:05,800 --> 00:04:07,660 +Bởi vì tại thời điểm này, nó giống + +58 +00:04:07,660 --> 00:04:10,540 +như đây là một loạt các thành phố gắn liền với đất nước, + +59 +00:04:10,840 --> 00:04:13,150 +nhưng nó không thực sự mô tả danh sách này. + +60 +00:04:13,900 --> 00:04:16,450 +Và tôi muốn đưa cái này cho bạn như + +61 +00:04:16,630 --> 00:04:20,800 +một thử thách, hãy thử thay đổi mục nhập Pháp để nó chứa một từ điển khác. + +62 +00:04:21,310 --> 00:04:25,330 +Đối với từ điển lồng nhau, hãy sử dụng các thành phố chính_visited và đối + +63 +00:04:25,600 --> 00:04:29,320 +với giá trị, bạn có thể giữ danh sách Paris, Lille và Dijon. + +64 +00:04:29,830 --> 00:04:32,110 +Tạm dừng video ngay bây giờ và xem liệu bạn có thể làm cho video đó hoạt động hay không. + +65 +00:04:32,130 --> 00:04:32,963 +1: Vâng. + +66 +00:04:36,150 --> 00:04:39,270 +Được rồi, đây là giải pháp. Bằng cách lồng một từ điển, + +67 +00:04:39,300 --> 00:04:43,860 +chúng ta có thể gắn nhãn danh sách Paris, Lille và Dijon là các thành phố đã ghé thăm. + +68 +00:04:44,400 --> 00:04:46,860 +Tất cả những gì tôi cần làm là tạo chuỗi, + +69 +00:04:46,890 --> 00:04:51,180 +"city_visited" và thêm dấu hai chấm sau nó. Nhưng còn một bước nữa. + +70 +00:04:51,390 --> 00:04:55,950 +Chúng ta phải thêm một cặp dấu ngoặc nhọn để France được liên kết với một giá trị duy + +71 +00:04:55,950 --> 00:04:58,560 +nhất, đó là từ điển lồng nhau của chúng ta. + +72 +00:04:59,430 --> 00:05:03,480 +Giờ đây, chúng tôi đã có từ điển nhật ký hành trình, tất + +73 +00:05:03,510 --> 00:05:08,510 +cả các quốc gia tôi đã đến và mỗi quốc gia có một giá trị là + +74 +00:05:09,870 --> 00:05:14,100 +từ điển tự nó và nó có thể lưu trữ nhiều phần dữ + +75 +00:05:14,400 --> 00:05:17,220 +liệu bao gồm các thành phố tôi đã + +76 +00:05:17,550 --> 00:05:21,060 +ghé thăm ở quốc gia đó cũng như những thứ như + +77 +00:05:22,470 --> 00:05:27,470 +tổng số lượt truy cập, trong trường hợp này sẽ có một chuỗi là khóa và + +78 +00:05:27,570 --> 00:05:31,110 +một số là giá trị. Bây giờ hãy bắt đầu tạo + +79 +00:05:31,110 --> 00:05:35,970 +nhật ký du lịch của riêng bạn hoặc sửa đổi phần thứ hai của nhật ký hành + +80 +00:05:35,970 --> 00:05:40,970 +trình để bạn cũng có một từ điển được lồng trong từ điển và bạn có thể đại + +81 +00:05:41,730 --> 00:05:44,730 +diện cho một cái gì đó như thế này, số + +82 +00:05:44,730 --> 00:05:49,730 +thành phố bạn đã ghé thăm trong danh sách và một phần dữ liệu bổ sung khác, nếu + +83 +00:05:49,950 --> 00:05:50,783 +bạn muốn. + +84 +00:05:51,330 --> 00:05:52,163 +1: Đúng, 0: + +85 +00:05:56,100 --> 00:05:59,630 +Và hy vọng sẽ làm được điều gì đó tương tự như thế này. + +86 +00:06:00,380 --> 00:06:05,380 +Và vì vậy bây giờ cấu trúc dữ liệu của chúng ta giống như vậy mà chúng ta có một danh sách + +87 +00:06:07,280 --> 00:06:12,110 +được lồng vào bên trong một từ điển, danh sách này tự nó được lồng trong một từ điển khác. + +88 +00:06:13,190 --> 00:06:16,850 +Bây giờ chúng ta đã thấy danh sách lồng nhau bên trong từ điển, + +89 +00:06:16,850 --> 00:06:17,683 +từ điển bên + +90 +00:06:17,690 --> 00:06:22,520 +trong từ điển, điều cuối cùng tôi muốn cho bạn thấy là lồng một từ điển bên trong danh sách. + +91 +00:06:22,970 --> 00:06:27,740 +Vì vậy, về cơ bản chúng ta có thể có nhiều từ điển trong một danh sách. + +92 +00:06:28,430 --> 00:06:33,430 +Vì vậy, hãy nhớ rằng các danh sách được sắp xếp theo thứ tự và chúng được truy cập + +93 +00:06:33,440 --> 00:06:38,060 +bởi các vị trí bên trong danh sách. Vì vậy, từ điển này sẽ là mục + +94 +00:06:38,450 --> 00:06:41,240 +ở chỉ mục 0, mục này ở chỉ mục một, v.v. + +95 +00:06:42,110 --> 00:06:43,580 +Trong khi bên trong + +96 +00:06:43,610 --> 00:06:48,380 +từ điển, các mục được truy cập bằng các khóa của họ như Pháp hoặc Đức. + +97 +00:06:49,280 --> 00:06:54,140 +Bây giờ tôi muốn thực hiện kiểu cuối cùng là lồng từ điển vào + +98 +00:06:56,030 --> 00:06:57,080 +danh sách. + +99 +00:06:57,620 --> 00:07:02,030 +Và tôi sẽ làm việc với cùng một nhật ký hành trình mà chúng tôi + +100 +00:07:02,600 --> 00:07:07,160 +đã làm trước đây, nhưng tôi muốn thay đổi nó để thay vì có một + +101 +00:07:07,160 --> 00:07:10,160 +từ điển khổng lồ với các cặp khóa-giá trị, + +102 +00:07:10,490 --> 00:07:15,200 +tôi muốn thay đổi nó để mỗi các mục từ tự nó là một từ điển. + +103 +00:07:15,650 --> 00:07:19,610 +Thay vì đặt Pháp là chìa khóa của từ điển này ở đây, tôi muốn + +104 +00:07:20,060 --> 00:07:25,060 +biến nó thành cặp khóa-giá trị của riêng nó. Vào bên trong từ điển này, tôi sẽ + +105 +00:07:25,340 --> 00:07:27,440 +tạo một khóa mới được + +106 +00:07:27,440 --> 00:07:32,440 +gọi là quốc gia và sau đó đặt Pháp làm giá trị cho khóa đó. + +107 +00:07:34,250 --> 00:07:39,110 +Vì vậy, bây giờ tôi có toàn bộ từ điển có ba phần dữ liệu. + +108 +00:07:39,380 --> 00:07:41,810 +Quốc gia đã ghé thăm, các thành phố đã ghé + +109 +00:07:42,110 --> 00:07:46,190 +thăm và tổng số lượt truy cập. Hãy làm điều tương tự cho Đức. + +110 +00:07:48,140 --> 00:07:53,140 +Vì vậy, bây giờ bạn có thể thấy chúng tôi có hai từ điển và thay vì giữ hai từ điển này + +111 +00:07:53,810 --> 00:07:55,760 +bên trong một từ điển, tôi sẽ + +112 +00:07:56,150 --> 00:08:01,130 +thay đổi nó để bây giờ nó là một danh sách. Tôi sẽ chuyển những dấu ngoặc nhọn này + +113 +00:08:01,130 --> 00:08:03,380 +thành dấu ngoặc vuông và bằng cách + +114 +00:08:03,860 --> 00:08:08,860 +này, chúng ta có thể thêm bao nhiêu từ điển này vào bên trong danh sách và + +115 +00:08:09,260 --> 00:08:10,970 +lặp lại chúng nếu cần. + +116 +00:08:11,690 --> 00:08:15,710 +Khi chúng tôi tạo từ điển chỉ có một hoặc hai cặp khóa-giá trị, chúng + +117 +00:08:15,950 --> 00:08:18,380 +tôi chỉ giữ tất cả trên một dòng. + +118 +00:08:18,830 --> 00:08:22,190 +Nhưng khi bạn đã có ngày càng nhiều cặp khóa-giá trị trong + +119 +00:08:22,580 --> 00:08:27,580 +từ điển, bạn nên tiếp tục và tách từng mục trong số các mục nhập ra, 1: + +120 +00:08:28,900 --> 00:08:29,733 +Phải không? + +121 +00:08:32,200 --> 00:08:33,700 +0: Giống như những gì tôi đang làm ở đây. + +122 +00:08:34,809 --> 00:08:39,809 +Bây giờ, dễ dàng hơn một chút để thấy rằng chúng ta có một danh + +123 +00:08:40,510 --> 00:08:44,440 +sách chứa hai mục và mỗi mục là một từ điển. + +124 +00:08:45,010 --> 00:08:50,010 +Mỗi từ điển có ba cặp khóa-giá trị và tất cả chúng đều chứa các + +125 +00:08:50,590 --> 00:08:54,640 +loại dữ liệu khác nhau. Giá trị đầu tiên có giá trị là một + +126 +00:08:55,020 --> 00:08:58,380 +chuỗi, giá trị thứ hai chứa danh sách và giá trị thứ ba chứa một số. + +127 +00:08:58,910 --> 00:09:03,890 +Các kiểu dữ liệu bên trong từ điển có thể được trộn lẫn hoàn toàn nếu bạn muốn. + +128 +00:09:04,280 --> 00:09:09,280 +Nhưng điều không thể thay đổi là bạn vẫn cần một khóa và một giá trị được phân tách bằng dấu hai chấm. + +129 +00:09:11,990 --> 00:09:15,920 +Bây giờ nhược điểm duy nhất của điều này là bạn muốn đảm bảo rằng bạn thực sự + +130 +00:09:15,920 --> 00:09:19,520 +biết rằng sau này khi bạn cố gắng rút ra số lượt truy cập, đó thực sự + +131 +00:09:19,790 --> 00:09:24,020 +là một con số mà bạn đang làm việc với chứ không phải là một chuỗi hoặc khi bạn ' + +132 +00:09:24,020 --> 00:09:26,060 +đang cố gắng nắm bắt các thành phố + +133 +00:09:26,330 --> 00:09:29,600 +đã ghé thăm, đó là một danh sách hơn là một từ điển, chẳng hạn. + +134 +00:09:30,920 --> 00:09:34,610 +Vì vậy, bây giờ chúng ta đã có nhiều kiểu lồng khác nhau, đã + +135 +00:09:35,000 --> 00:09:38,720 +đến lúc bạn thực sự hiểu điều này và nắm bắt được khái niệm này + +136 +00:09:38,720 --> 00:09:43,720 +bằng cách tự mình hoàn thành một thử thách. Trong bài học tiếp theo, tôi có một thử + +137 +00:09:43,790 --> 00:09:48,710 +thách viết mã cho bạn dựa trên nhật ký hành trình này và bạn sẽ cần sử dụng những gì + +138 +00:09:48,710 --> 00:09:51,760 +bạn đã học cho đến nay để có thể hoàn thành nó. + +139 +00:09:52,130 --> 00:09:55,130 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 Exercise-23.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 Exercise-23.url new file mode 100644 index 0000000000000000000000000000000000000000..a4e4e9ed88af1f2c7122adc7486dad6528c21040 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 Exercise-23.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/58076521-a623-49e9-8d55-7a0c76c60464 \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 How-to-join-Auditorium.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 [Interactive Coding Exercise] Dictionary in List.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 [Interactive Coding Exercise] Dictionary in List.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..115a0848ff746aded78a0a2d6adc6f2d8f59fdc5 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 [Interactive Coding Exercise] Dictionary in List.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e92f93f76ee9c455794ca5d8fe0d1f32feaf53f649aa4f747c38b67688e50f8 +size 13807426 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 [Interactive Coding Exercise] Dictionary in List_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 [Interactive Coding Exercise] Dictionary in List_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..da9826246f5958efc540c86d7e24fb467753c1bf --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/005 [Interactive Coding Exercise] Dictionary in List_vi.srt @@ -0,0 +1,288 @@ +1 +00:00:00,180 --> 00:00:01,650 +Trong bài tập này, + +2 +00:00:01,650 --> 00:00:04,050 +bạn sẽ tạo một hàm để thêm các + +3 +00:00:04,050 --> 00:00:09,050 +quốc gia mà bạn đã ghé thăm vào Nhật ký du lịch. + +4 +00:00:09,330 --> 00:00:10,960 +Hãy xem mã bắt đầu, có một + +5 +00:00:12,080 --> 00:00:14,820 +danh sách các từ điển được gọi là travel_log + +6 +00:00:14,820 --> 00:00:17,760 +và nó chứa các khóa và giá trị như quốc gia đã + +7 +00:00:17,760 --> 00:00:20,850 +đến thăm, số lượt truy cập đã thực hiện và các + +8 +00:00:20,850 --> 00:00:24,480 +thành phố đã được ghé thăm ở quốc gia đó. + +9 +00:00:24,480 --> 00:00:26,280 +Bây giờ, mục tiêu của bạn + +10 +00:00:26,280 --> 00:00:29,394 +là không cần sửa đổi trực tiếp nhật ký + +11 +00:00:29,394 --> 00:00:33,810 +du lịch này, bạn nên tạo một hàm có tên add_new_country, + +12 +00:00:33,810 --> 00:00:35,400 +hàm này nhận ba đầu vào + +13 +00:00:35,400 --> 00:00:38,229 +là tên quốc gia, số lượt ghé thăm và + +14 +00:00:38,229 --> 00:00:43,024 +các thành phố đã ghé thăm trong danh sách. + +15 +00:00:43,024 --> 00:00:45,240 +Hãy xem trong hộp Mô tả, + +16 +00:00:45,240 --> 00:00:46,920 +xem Đầu vào ví dụ và + +17 +00:00:46,920 --> 00:00:50,269 +Đầu ra dự kiến sẽ trông như thế nào + +18 +00:00:50,269 --> 00:00:53,055 +và thử tạo hàm của bạn. + +19 +00:00:53,055 --> 00:00:56,880 +Hãy nhớ rằng, bạn không cần phải sửa đổi trực tiếp nhật + +20 +00:00:56,880 --> 00:00:59,250 +ký travel_ và thay vào đó, bạn nên + +21 +00:00:59,250 --> 00:01:02,940 +viết hàm đạt được mục đích này vì nếu không, khi bạn + +22 +00:01:02,940 --> 00:01:05,099 +nhấn Gửi, mã của bạn sẽ không vượt + +23 +00:01:05,099 --> 00:01:07,770 +qua được bài kiểm tra. + +24 +00:01:07,770 --> 00:01:10,470 +Hãy xem kỹ hướng dẫn và thực hiện. + +25 +00:01:17,790 --> 00:01:20,130 +Được rồi, hy vọng bạn đã hoàn thành được + +26 +00:01:20,130 --> 00:01:23,220 +việc này và bạn muốn cùng tôi kiểm tra giải pháp. + +27 +00:01:23,220 --> 00:01:27,001 +Nếu bạn không thể hoàn thành nó và muốn nhận được gợi ý hoặc xem + +28 +00:01:27,001 --> 00:01:29,490 +tôi đã làm như thế nào thì hãy làm theo và chúng + +29 +00:01:29,490 --> 00:01:32,220 +ta có thể cùng nhau xem xét giải pháp. + +30 +00:01:32,220 --> 00:01:35,010 +Bây giờ, bước đầu tiên là tạo hàm + +31 +00:01:35,010 --> 00:01:37,863 +có tên add_new_country. + +32 +00:01:38,850 --> 00:01:41,220 +Tiếp theo, chúng tôi cung + +33 +00:01:41,220 --> 00:01:46,050 +cấp ba đầu vào cho hàm này đã được xác định ở dòng + +34 +00:01:46,050 --> 00:01:48,390 +24, đó là tên quốc gia, thời + +35 +00:01:48,390 --> 00:01:50,884 +gian đã đến thăm và các thành + +36 +00:01:50,884 --> 00:01:53,940 +phố đã đến thăm. + +37 +00:01:53,940 --> 00:01:57,660 +Bây giờ hãy lưu ý rằng tôi đã đặt tên các đầu vào + +38 +00:01:57,660 --> 00:02:01,950 +trong hàm ở dòng 17 khác với tên ở dòng 24 để bạn có thể + +39 +00:02:01,950 --> 00:02:04,050 +nhận ra sự khác biệt khi tôi + +40 +00:02:04,050 --> 00:02:06,302 +sử dụng nó trong hàm. + +41 +00:02:06,302 --> 00:02:07,530 +Trong thực tế, bạn có + +42 +00:02:07,530 --> 00:02:10,380 +thể gọi đầu vào của mình là bất cứ thứ gì bạn thích, + +43 +00:02:10,380 --> 00:02:12,093 +miễn là nó hoạt động là được. + +44 +00:02:13,200 --> 00:02:15,555 +Bây giờ, điều tiếp theo chúng ta + +45 +00:02:15,555 --> 00:02:19,592 +cần làm là tạo một từ điển mới mà tôi gọi là new_country + +46 +00:02:19,592 --> 00:02:24,592 +và điều đầu tiên chúng ta làm là cung cấp một cặp khóa và giá trị rồi đưa + +47 +00:02:25,680 --> 00:02:27,827 +nó vào từ điển mới này. + +48 +00:02:27,827 --> 00:02:32,490 +Chúng ta có thể viết new_country[ ], bên trong dấu ngoặc vuông + +49 +00:02:32,490 --> 00:02:35,790 +là khóa, đó là quốc gia, sau đó chúng ta có thể + +50 +00:02:35,790 --> 00:02:39,030 +đặt nó bằng giá trị, là giá trị đầu vào đầu tiên + +51 +00:02:39,030 --> 00:02:42,694 +trên dòng 17, tên của quốc gia đã đến thăm. + +52 +00:02:42,694 --> 00:02:46,290 +Tiếp theo, chúng tôi thực hiện tương tự với hai thông tin + +53 +00:02:46,290 --> 00:02:50,280 +đầu vào còn lại về số lượt ghé thăm và các thành phố đã ghé thăm. + +54 +00:02:50,280 --> 00:02:53,700 +Vì vậy, chúng tôi chỉ truyền dữ liệu qua hàm. + +55 +00:02:53,700 --> 00:02:54,533 +Dữ liệu đi vào + +56 +00:02:54,533 --> 00:02:59,100 +hàm và chúng ta có thể lấy nó theo tên thông qua tên của dữ liệu + +57 +00:02:59,100 --> 00:03:00,360 +đầu vào ở dòng 17, + +58 +00:03:00,360 --> 00:03:03,840 +rồi chèn từng dữ liệu đó vào từ điển mới mà chúng + +59 +00:03:03,840 --> 00:03:07,254 +ta đã tạo, được gọi là new_country. + +60 +00:03:07,254 --> 00:03:09,690 +Cuối cùng, tất cả những gì chúng ta phải làm + +61 +00:03:09,690 --> 00:03:14,690 +để thêm nó vào danh sách của mình là sử dụng phương thứcappend(), vì vậy chúng ta lấy danh + +62 +00:03:14,730 --> 00:03:18,870 +sách travel_log của mình và viết . nối thêm, sau đó bên trong dấu ngoặc + +63 +00:03:18,870 --> 00:03:23,280 +đơn, chúng ta có thể thêm những gì chúng ta muốn nối thêm hoặc những + +64 +00:03:23,280 --> 00:03:26,910 +gì chúng ta muốn thêm vào cuối danh sách đó. + +65 +00:03:26,910 --> 00:03:29,700 +Và tất nhiên đó là mục mới của chúng tôi về từ điển + +66 +00:03:29,700 --> 00:03:31,500 +mới mà chúng tôi đã tạo có tên + +67 +00:03:31,500 --> 00:03:35,070 +là new_country, và đó là tất cả những gì có trong đó. + +68 +00:03:35,070 --> 00:03:37,540 +Chúng tôi đã cố gắng nắm bắt các dữ liệu đầu + +69 +00:03:38,834 --> 00:03:41,580 +vào, đưa nó vào một từ điển mới theo các cặp khóa + +70 +00:03:41,580 --> 00:03:46,110 +và giá trị, sau đó chèn nó vào danh sách travel_log của chúng tôi. + +71 +00:03:46,110 --> 00:03:48,120 +Nếu bạn cần thực hiện bất kỳ điều chỉnh nào đối với mã của mình, hãy tiếp + +72 +00:03:48,120 --> 00:03:49,370 +tục và thực hiện điều đó ngay bây giờ. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/006 Python Dictionaries Quiz.html b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/006 Python Dictionaries Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..297d7f819fa0744cd96832c3b190d8c27db1c465 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/006 Python Dictionaries Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Hint-Flowchart-of-Secret-Auction.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Hint-Flowchart-of-Secret-Auction.url new file mode 100644 index 0000000000000000000000000000000000000000..a4490966ea5c8374ad22acff6094ea99d82f7a0c --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Hint-Flowchart-of-Secret-Auction.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.diagrams.net/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Blind%20Auction%20Flow%20Chart#R3VnbcpswEP0aPzYDCLB5tHNrZ9pMpu6kzaMMilEDiBHyLV%2FfFYirHMdp7JD4JUGrXV3Ont2V5AE6j9fXHKfhDxaQaGAZwXqALgaWZRqmAf%2BkZFNIHM8qBHNOA6VUC6b0iZSWSrqgAclaioKxSNC0LfRZkhBftGSYc7Zqqz2wqD1riudEE0x9HOnS3zQQoZK6jl13fCV0HpZTm65X9MS41FZbyUIcsFVDhC4H6JwzJoqveH1OIoleCUxhd%2FVMb7UyThKxj8Hs4R5fx%2BMlu%2F52dxPepdM7H31BxShLHC3UjtVixaaEgASAiGoyLkI2ZwmOLmvphLNFEhA5jQGtWuc7YykITRD%2BJUJslHvxQjAQhSKOVG8xp5zo2b0pUcYW3Cc7NlSSBPM5ETv0rMoDwF3CYiL4Buw4ibCgy%2FY6sCLRvNKrYYYPhfQrUDc11Ke%2Fxj9%2FadDXwEqUViEVZJrifP8riLdtIC4JF2S9G0Z928rAHimuqmi1VXNVU99TorBBemQcCSfn1Nhp7clOu092Wjo7Q0hclhEBcDKJchbn6VWcpZsPx1mvZ84OT42z9p6cdfvkrK2hPs4e84LP4e8NjokcIUkXon%2FCOk6LsKajM9a0t1DWPhZlvVOjrLsnZUd9UtbdSdkJ2FrGLaew0Y%2FG2OpI2xtjTf0E9ckp%2B1YqKtNbRmHmynOO1fYcGnU8UoSIsuo4pVrG%2F%2FtppHM8COqEjJOgojqsQB4usLwsUl9QcESOAKwUIjmU6o9kUxnlQ54NLBfHkvDJLEsrh%2FQZKmh41gmWLQcSc%2BjoweIcLVhGfcQGWVPxR5nL7%2FuG%2FGLd6LjYlI0EdpubAISqed%2Fsq83yVml3wCg00Z6VwxweIl7HnONNQyGVcZg9H872yGxxy%2B5e%2BTv6yHN26cNHsYKDxnwFdi90Mxt0Uzw6CcI1noz6eLDQ34mKwwp9KLIzz9N5%2FpfJ5kCu141gR5MZNNy5%2FFpkhMtsvgplpl%2FhnKp51p%2FJEtBN3SGLZ4usp7RdVcqX0na3oh4Oc%2F2AeE8yDSbYtGjjgSM6T%2BDbh82DJ9BEQkN9HI1VR0yDoIg6ktEnPMuHksRW%2BQfGdSYD50KOBYGWFTF3IKiRZ7dzkmFrQG87S1pHw9nrtTxWOeo1BbKVrerk9Q75arhnvnrrC9b2gmZ1HnvQcL%2Fz7GsLbbdwOvbuQttd12v1zeE7FGZTf5o6jwjm1fk68zkhiZ6I3%2FkMjZzOK%2FSWVLztSe9ot80y9TSAu6L5LaTALYQ1kEyUdQyuMlVX%2ByqT2wTEj4pKCSpx%2B4azokkii2fPHnCGL3vA9LYUQ%2FdoLrA0F9ywT18LXdTB2dBxRoephdCsf2osMkr9iy26%2FAc%3D \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Press-Run-to-see-the-final-project.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Press-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..931be141d4dacf85cafdd0aa92bed144122ab2f7 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Press-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/blind-auction-completed?v=1 \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Secret-Auction-Starting-Code.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Secret-Auction-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..bff0e31e3fa45674f8c67da232913ccbd180ed05 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 Secret-Auction-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/blind-auction-start \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 The Secret Auction Program Instructions and Flow Chart.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 The Secret Auction Program Instructions and Flow Chart.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b1559c2974b97bfa1e78de04318cbaf9ebf73a2d --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 The Secret Auction Program Instructions and Flow Chart.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cde09ad933fc0319058ed052b2b99b551d1c6dde69d1830d0bb37692a336c2ad +size 20100660 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 The Secret Auction Program Instructions and Flow Chart_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 The Secret Auction Program Instructions and Flow Chart_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8851b563e5c25b67d7e80c794a5650e8e2464f92 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/007 The Secret Auction Program Instructions and Flow Chart_vi.srt @@ -0,0 +1,276 @@ +1 +00:00:00,660 --> 00:00:03,600 +Được rồi. Vì vậy, bây giờ bạn đã + +2 +00:00:03,750 --> 00:00:08,750 +học tất cả về từ điển, chúng tôi sẽ đưa tất cả kiến thức đó để kiểm tra và sử dụng bằng cách xây + +3 +00:00:09,390 --> 00:00:13,860 +dựng một chương trình đấu giá mù. Vì vậy, đây là chương trình. Khi bạn lần đầu tiên chạy + +4 +00:00:13,890 --> 00:00:18,890 +nó, nó sẽ chỉ cho bạn thấy hình ảnh logo và có thể là một dòng cho bạn biết bạn đang + +5 +00:00:19,500 --> 00:00:22,320 +tham gia chương trình nào. Và sau đó nó sẽ hỏi bạn tên của bạn. + +6 +00:00:22,320 --> 00:00:26,100 +Vì vậy, giả sử chúng ta có ba nhà thầu, phải không? Vì vậy, đầu tiên + +7 +00:00:26,220 --> 00:00:31,170 +đi, tôi đi đến máy tính. Tôi nhập tên của mình, tôi nhập giá thầu của mình và tôi nhấn enter. + +8 +00:00:31,740 --> 00:00:34,650 +Nó hỏi tôi xem có người thầu nào khác không, tôi nhìn quanh phòng, + +9 +00:00:34,680 --> 00:00:37,620 +tôi thấy hai đồng nghiệp khác. Vì vậy, tôi gõ có. + +10 +00:00:38,160 --> 00:00:40,080 +Và bây giờ nó sẽ xóa toàn bộ màn hình. + +11 +00:00:40,080 --> 00:00:43,470 +Vì vậy, những người khác không thể thấy giá thầu của tôi là bao nhiêu. + +12 +00:00:43,860 --> 00:00:47,940 +Vì vậy, bây giờ tôi rời khỏi máy tính và đồng nghiệp của tôi đến. + +13 +00:00:48,270 --> 00:00:52,170 +Họ gõ tên và giá thầu của họ. + +14 +00:00:53,460 --> 00:00:54,270 +Và một lần + +15 +00:00:54,270 --> 00:00:57,660 +nữa, họ nhìn quanh phòng và họ thấy người này người kia muốn đấu giá. + +16 +00:00:57,720 --> 00:01:01,830 +Vì vậy, họ nhấn có, một lần nữa, nó xóa giá thầu của họ. Và cuối cùng, người cuối + +17 +00:01:01,830 --> 00:01:06,480 +cùng đưa ra giá thầu của họ. Tại thời điểm này, mọi người đều có giá thầu + +18 +00:01:06,510 --> 00:01:08,100 +nên cô ấy sẽ loại không. + +19 +00:01:08,640 --> 00:01:12,480 +Và đó là lúc chương trình của chúng tôi sẽ tìm ra + +20 +00:01:12,600 --> 00:01:17,600 +ai đã đặt giá thầu cao nhất và in ra ai là người chiến thắng và giá + +21 +00:01:18,300 --> 00:01:22,140 +thầu của họ là bao nhiêu. Bằng cách này, thay vì cạnh tranh với nhau + +22 +00:01:22,380 --> 00:01:25,320 +về giá thầu, chúng tôi thực sự chỉ đưa ra mức giá cao nhất mà + +23 +00:01:25,680 --> 00:01:29,190 +chúng tôi sẵn sàng trả và đây được coi là một cách khá hiệu quả để đặt giá thầu. + +24 +00:01:29,580 --> 00:01:34,230 +Và bạn thấy điều đó nói lên rất nhiều trong ngành xây dựng và chính + +25 +00:01:34,230 --> 00:01:35,063 +phủ, v.v. + +26 +00:01:35,610 --> 00:01:40,610 +Điều quan trọng trong chương trình này là bạn sẽ bắt đầu bằng cách sử dụng đèn chiếu sáng + +27 +00:01:40,740 --> 00:01:42,510 +bắt đầu phiên đấu giá mù. + +28 +00:01:43,380 --> 00:01:47,850 +Và điều đầu tiên bạn sẽ nhận thấy là tôi đã nhập chức năng này + +29 +00:01:47,850 --> 00:01:50,400 +được gọi là clear từ mô-đun replit. + +30 +00:01:50,520 --> 00:01:55,020 +Và về cơ bản bạn có thể gọi hàm này, rõ ràng, bất cứ khi nào bạn muốn xóa + +31 +00:01:55,020 --> 00:01:59,910 +đầu ra giống như bạn đã thấy ở đây. Bất cứ khi nào chúng tôi nhập có sau khi được hỏi liệu + +32 +00:01:59,910 --> 00:02:01,110 +có bất kỳ nhà thầu nào + +33 +00:02:01,130 --> 00:02:03,290 +khác không, điều đó chỉ gọi là rõ ràng và sau + +34 +00:02:03,500 --> 00:02:08,000 +đó nó sẽ loại bỏ mọi thứ có trong bảng điều khiển. Ngoài ra, chúng tôi cũng đã + +35 +00:02:08,000 --> 00:02:11,810 +có nghệ thuật bắt đầu của logo cái mỏm mà bạn + +36 +00:02:12,110 --> 00:02:14,210 +sẽ đưa vào chương trình. + +37 +00:02:14,600 --> 00:02:19,600 +Và điều quan trọng nhất là tôi muốn bạn tạo một từ điển để tên của + +38 +00:02:20,750 --> 00:02:25,750 +mỗi người sẽ là chìa khóa và giá thầu của họ sẽ là giá trị. + +39 +00:02:28,520 --> 00:02:33,520 +Và từ điển này sẽ chứa nhiều cặp khóa-giá trị này và vào cuối chương trình + +40 +00:02:34,070 --> 00:02:38,510 +khi mọi người hoàn thành việc đặt giá thầu, sau đó chúng ta sẽ + +41 +00:02:38,810 --> 00:02:42,830 +lặp lại từ điển đó và tìm ra ai đã đặt giá + +42 +00:02:42,830 --> 00:02:45,200 +thầu cao nhất. Nếu bạn muốn, đây là + +43 +00:02:45,260 --> 00:02:50,260 +thời điểm tốt để phân tích dự án đã hoàn thành này và xem liệu bạn có thể tạo lưu đồ của riêng mình + +44 +00:02:50,750 --> 00:02:55,040 +bằng cách sử dụng thứ gì đó như vẽ không. io mà tôi đã chỉ cho bạn + +45 +00:02:55,040 --> 00:02:59,800 +trước đây, hoặc chỉ cần lấy một mảnh giấy và một cây bút và vẽ ra lưu đồ. + +46 +00:03:00,460 --> 00:03:02,200 +Bây giờ, nếu bạn muốn có một gợi + +47 +00:03:02,290 --> 00:03:06,790 +ý, thì bạn có thể truy cập các tài nguyên của khóa học và bạn sẽ được đưa đến sơ đồ + +48 +00:03:06,790 --> 00:03:10,660 +luồng mà tôi đã tạo cho chương trình này. Vì vậy, cảnh báo về spoiler, tôi sắp + +49 +00:03:10,690 --> 00:03:13,920 +cho bạn xem biểu đồ đó. Vì vậy, nếu bạn không muốn xem + +50 +00:03:13,940 --> 00:03:17,170 +và bạn muốn tạo của riêng mình vì đây là một chương trình tương đối đơn + +51 +00:03:17,380 --> 00:03:20,530 +giản, thì hãy tạm dừng video ngay bây giờ và tự mình hoàn thành thử thách. + +52 +00:03:21,190 --> 00:03:24,190 +Bây giờ đối với những người khác, những người vẫn ở đây, tôi muốn + +53 +00:03:24,190 --> 00:03:28,030 +cho các bạn thấy, đây là biểu đồ mà tôi đã tạo để đại diện cho chương trình này. + +54 +00:03:28,690 --> 00:03:33,580 +Vì vậy, chúng tôi bắt đầu từ đầu. Đầu tiên chúng tôi hiển thị logo từ tệp đó, nghệ thuật. py, và sau đó chúng tôi + +55 +00:03:34,000 --> 00:03:36,940 +yêu cầu nhập tên, chúng tôi yêu cầu giá của chúng. + +56 +00:03:37,450 --> 00:03:41,470 +Bây giờ chúng ta sẽ thêm tên và giá thầu vào từ điển với tên là + +57 +00:03:41,470 --> 00:03:45,430 +khóa và giá thầu là giá trị. Bây giờ, khi chúng tôi đã hoàn thành việc đó, sau đó + +58 +00:03:45,520 --> 00:03:49,600 +chúng tôi phải yêu cầu người dùng cung cấp một thông tin đầu vào khác và xem liệu có bất kỳ người dùng nào + +59 +00:03:49,600 --> 00:03:52,360 +khác muốn đặt giá thầu hay không. Vì vậy, nếu họ trả lời + +60 +00:03:52,600 --> 00:03:55,780 +có, thì chúng ta sẽ xóa màn hình và quay lại đây, hỏi một cái + +61 +00:03:55,960 --> 00:04:00,790 +tên khác, một mức giá khác, vân vân và vân vân. Nhưng nếu họ nói, không, mọi người đã xong + +62 +00:04:00,790 --> 00:04:02,080 +việc đặt giá thầu, + +63 +00:04:02,410 --> 00:04:05,140 +thì chúng tôi sẽ gọi một số loại chức năng + +64 +00:04:05,380 --> 00:04:10,000 +mà chúng tôi có, sẽ lặp lại từ điển của chúng tôi được tạo ở đây và tìm + +65 +00:04:10,000 --> 00:04:15,000 +người có giá trị giá thầu cao nhất và sau đó tuyên bố họ là người chiến thắng và + +66 +00:04:15,250 --> 00:04:18,670 +in ra giá thầu của họ. Vì vậy, nó là một chương trình tương đối đơn giản, + +67 +00:04:18,760 --> 00:04:21,010 +ít nhất là so với những thứ khác mà bạn đã xây dựng cho đến nay. + +68 +00:04:21,370 --> 00:04:24,760 +Vì vậy, đây là lúc để tạm dừng video và tiếp tục. + +69 +00:04:26,050 --> 00:04:29,110 +Hẹn gặp lại các bạn trong bài học tiếp theo, nơi chúng ta sẽ cùng nhau tìm hiểu giải pháp. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Course-Fixes-Report-an-Issue.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution and Complete Code for the Secret Auction Program.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution and Complete Code for the Secret Auction Program.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..048dcffaded29cd580bfd92cd41c90586fc485a6 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution and Complete Code for the Secret Auction Program.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d2fe0a6100ee244df6df64caab349a76c54f30105fb5158427e9246e8d4f859 +size 212320472 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution and Complete Code for the Secret Auction Program_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution and Complete Code for the Secret Auction Program_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..63a22c7dafcd368c7f9c3d4cc6f3da752904a05e --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution and Complete Code for the Secret Auction Program_vi.srt @@ -0,0 +1,864 @@ +1 +00:00:00,120 --> 00:00:02,850 +Được rồi, vậy bạn đã làm thế nào với dự án hôm nay? + +2 +00:00:03,210 --> 00:00:07,190 +Hy vọng rằng nó diễn ra thực sự tốt và bạn chỉ ở đây để xem tôi đã làm như thế nào. + +3 +00:00:07,860 --> 00:00:13,860 +Như tôi đã đề cập trước đây, nó thực sự hữu ích khi bạn đang cố gắng tạo một dự án lớn + +4 +00:00:13,860 --> 00:00:18,540 +để chia nó thành các phần nhỏ hơn để bạn có thể giải quyết từng phần một. + +5 +00:00:18,960 --> 00:00:22,270 +Và một cách tuyệt vời để làm điều đó là tạo lưu đồ của riêng bạn. + +6 +00:00:22,770 --> 00:00:28,260 +Vì vậy, như tôi đã chỉ cho bạn ở phần cuối của bài học trước, đây là sơ đồ mà tôi + +7 +00:00:28,260 --> 00:00:34,560 +đã tạo cho chương trình cụ thể này và tôi sẽ làm theo từng bước để tạo chương trình đấu giá mù cuối cùng + +8 +00:00:34,560 --> 00:00:35,100 +này. + +9 +00:00:35,880 --> 00:00:41,820 +Điều đầu tiên chúng tôi sẽ làm là chúng tôi sẽ hiển thị biểu trưng từ tệp nghệ thuật này. py, và lưu ý cách biểu trưng này + +10 +00:00:41,820 --> 00:00:45,480 +được lưu trữ bên trong một biến được gọi là biểu trưng. + +11 +00:00:46,080 --> 00:00:51,990 +Điều đầu tiên chúng tôi phải làm là phân tách bản sao của dự án bắt đầu của chính chúng tôi, và + +12 +00:00:51,990 --> 00:00:58,410 +sau đó chúng tôi sẽ xem xét bên trong tác phẩm. mô-đun py và sau đó chúng tôi sẽ nhập logo đó. + +13 +00:00:58,980 --> 00:01:04,030 +Vì vậy, bây giờ tôi có thể tiếp tục và in logo của mình. + +14 +00:01:04,830 --> 00:01:10,790 +Vậy là xong bước đầu tiên. Tiếp theo, chúng ta sẽ hỏi một cái tên. + +15 +00:01:10,800 --> 00:01:13,030 +Vì vậy, nó sẽ ở dạng đầu vào. + +16 +00:01:13,470 --> 00:01:19,020 +Vì vậy, hãy tiếp tục và tạo một biến có tên là tên và chúng ta sẽ đặt nó làm đầu vào. + +17 +00:01:19,920 --> 00:01:23,760 +Và đầu vào sẽ nói, tên của bạn là gì? + +18 +00:01:25,310 --> 00:01:28,950 +Vì vậy, họ sẽ nhập tên của họ và điều đó sẽ được lưu trữ bên trong biến này. + +19 +00:01:29,690 --> 00:01:35,780 +Bây giờ, điều tiếp theo chúng ta sẽ làm là hỏi họ về giá đấu thầu của họ. Chúng tôi sẽ nói rằng bên trong một biến được gọi + +20 +00:01:35,780 --> 00:01:41,540 +là giá và chúng tôi sẽ tạo một đầu vào khác để hỏi họ giá thầu của bạn là bao nhiêu? + +21 +00:01:42,080 --> 00:01:48,050 +Và cuối cùng, tôi sẽ thêm một ký hiệu đô la để khi họ nhập giá thầu, họ + +22 +00:01:48,140 --> 00:01:49,520 +sẽ thấy dòng này. + +23 +00:01:49,860 --> 00:01:55,100 +Và khi họ bắt đầu nhập, con trỏ phải ở đây để họ có thể nhìn thấy biểu tượng đô la trước giá + +24 +00:01:55,100 --> 00:01:55,730 +của chúng. + +25 +00:01:57,050 --> 00:02:03,300 +Vì vậy, bây giờ chúng ta xuống đây và chúng ta phải thêm tên và giá đấu thầu của chúng ta vào một từ điển. + +26 +00:02:03,800 --> 00:02:10,550 +Hãy tiếp tục và tạo nó ở đây và chúng ta sẽ gọi nó là giá thầu và nó sẽ bắt đầu như một từ điển trống rỗng. + +27 +00:02:11,150 --> 00:02:15,680 +Và sau đó, khi chúng tôi đã có tên và giá, chúng tôi nói rằng tên + +28 +00:02:15,680 --> 00:02:22,850 +sẽ là chìa khóa và giá sẽ là giá trị tương ứng. Để thêm một mục mới vào từ điển giá thầu của chúng tôi, chúng + +29 +00:02:22,970 --> 00:02:28,580 +tôi chỉ định từ điển, chúng tôi thêm một tập hợp các dấu ngoặc vuông, và sau đó chúng tôi thêm khóa. + +30 +00:02:29,060 --> 00:02:33,230 +Điều quan trọng sẽ là tên và giá trị sẽ là giá cả. + +31 +00:02:33,410 --> 00:02:34,940 +Vì vậy, chúng tôi sẽ viết nó như thế này. + +32 +00:02:36,800 --> 00:02:42,410 +Bây giờ, chúng ta đi xuống phần phức tạp hơn một chút. Chúng tôi sẽ hỏi xem có bất kỳ người + +33 +00:02:42,410 --> 00:02:47,840 +dùng nào khác muốn đặt giá thầu không. Và nếu câu trả lời là có, thì chúng ta sẽ xóa màn hình + +34 +00:02:47,840 --> 00:02:51,260 +và chúng ta sẽ quay lại nơi chúng ta yêu cầu tên tiếp theo và giá thầu tiếp theo. + +35 +00:02:52,190 --> 00:02:53,990 +Làm thế nào để chúng ta đạt được điều này? + +36 +00:02:56,090 --> 00:03:01,720 +Chà, chúng ta có thể đưa điều này vào một vòng lặp trong khi. Hãy tiếp tục và thụt lề này. + +37 +00:03:02,090 --> 00:03:09,260 +Vì vậy, tôi chỉ cần nhập lệnh và sau đó là dấu ngoặc vuông bên phải. Hoặc trên Windows, nó sẽ là điều khiển và bên phải của + +38 +00:03:09,260 --> 00:03:10,270 +dấu ngoặc vuông. + +39 +00:03:10,670 --> 00:03:13,070 +Và sau đó chúng ta có thể quấn nó thành một vòng lặp while. + +40 +00:03:13,610 --> 00:03:18,950 +Nếu chúng ta có một số loại biến có thể theo dõi xem liệu việc đặt giá thầu có kết thúc hay không. + +41 +00:03:19,370 --> 00:03:22,190 +Vì vậy, chúng ta hãy gọi nó là đấu thầu_ đã hoàn thành. + +42 +00:03:23,300 --> 00:03:25,460 +Và tất nhiên, nó bắt đầu là Sai. + +43 +00:03:26,120 --> 00:03:34,850 +Bây giờ, trong khi đấu thầu chưa kết thúc, vì vậy, trong khi chưa đấu thầu_ hoàn thành, vì vậy về cơ bản mặc dù điều này vẫn là + +44 +00:03:34,850 --> 00:03:39,190 +sai, nhưng chúng ta sẽ tiếp tục chạy điều này cho đến mãi mãi. + +45 +00:03:39,770 --> 00:03:42,290 +Nhưng tất nhiên, chúng ta cần một cách để ngăn chặn điều này. + +46 +00:03:42,290 --> 00:03:49,880 +Vì vậy, chúng tôi sẽ tạo một đầu vào mới, nơi chúng tôi hỏi người dùng, "có bất kỳ nhà thầu nào khác không? "Nhập" có + +47 +00:03:51,540 --> 00:03:54,030 +"hoặc" + +48 +00:03:55,360 --> 00:04:02,680 +không ". Bằng cách này, chúng ta có thể nhận được một đầu vào sẽ là từ + +49 +00:04:02,680 --> 00:04:07,400 +có hoặc từ không, và chúng ta có thể lưu dữ liệu này bên trong một biến có tên là should_continue. + +50 +00:04:08,320 --> 00:04:17,740 +Vì vậy, theo cách này, chúng ta có thể kiểm tra biến này và chúng ta có thể thấy, nếu should_continue bằng "không", thì, trong trường + +51 +00:04:18,100 --> 00:04:24,400 +hợp đó, đó là lúc chúng ta sẽ lật công tắc và thay đổi biến bid_ished này + +52 +00:04:24,670 --> 00:04:25,600 +thành true. + +53 +00:04:26,190 --> 00:04:32,350 +Vì vậy, điều này có nghĩa là khi chúng ta đi đến cuối khối này trong vòng lặp while, sau + +54 +00:04:32,560 --> 00:04:37,010 +đó khi nó kiểm tra bid_ished này, nó sẽ không tiếp tục lặp nữa. + +55 +00:04:37,780 --> 00:04:44,620 +Mặt khác, nếu should_continue là có hoặc thực tế là bất kỳ giá trị nào khác, thì chúng ta có thể tiếp tục và + +56 +00:04:44,620 --> 00:04:48,910 +chúng ta không thực sự phải thay đổi biến này vì nó đã sai. + +57 +00:04:50,500 --> 00:05:00,850 +Bây giờ chúng ta có vòng lặp mã của mình, có nghĩa là trừ khi người dùng nhập 'không' ở cuối và đặt giá thầu kết + +58 +00:05:00,850 --> 00:05:03,700 +thúc, đây là đường dẫn này. + +59 +00:05:04,030 --> 00:05:11,170 +Nếu không thì chúng ta sẽ tiếp tục xem qua tất cả các dòng mã này, về cơ bản là tất cả những điều này + +60 +00:05:11,170 --> 00:05:16,040 +cho đến khi chúng ta đi đến điểm mà công tắc này thực sự bị lật. + +61 +00:05:16,780 --> 00:05:23,200 +Vì vậy, nếu bạn nhận thấy rằng nếu người dùng thực sự trả lời có, thì chúng tôi muốn xóa màn hình trước khi lặp + +62 +00:05:23,200 --> 00:05:24,040 +lại vòng lặp. + +63 +00:05:24,550 --> 00:05:26,640 +Điều đó có nghĩa là chúng ta + +64 +00:05:26,650 --> 00:05:30,190 +có thể kiểm tra để xem tốt, elif nên tiếp tục bằng. + +65 +00:05:30,490 --> 00:05:31,140 +vâng, tốt, trong + +66 +00:05:31,570 --> 00:05:36,850 +trường hợp này, chúng ta sẽ gọi hàm clear () mà tôi đã chỉ cho bạn trong phần gợi ý ngay từ + +67 +00:05:36,850 --> 00:05:37,370 +đầu. + +68 +00:05:37,810 --> 00:05:44,260 +Vì vậy, chức năng này đến từ mô-đun chiếu sáng và nó cho phép chúng tôi xóa đầu ra trong bảng điều + +69 +00:05:44,260 --> 00:05:51,490 +khiển để tên và giá thầu trước đó được xóa trên màn hình và nó để lại một khởi đầu mới cho người dùng tiếp + +70 +00:05:51,490 --> 00:05:52,030 +theo. + +71 +00:05:53,650 --> 00:06:01,090 +Điều cuối cùng chúng ta phải làm là giải quyết vấn đề này một cách thực sự đúng không? Vì vậy, khi họ trả lời không, họ sẽ bị loại khỏi + +72 +00:06:01,090 --> 00:06:08,650 +vòng lặp while, nhưng chúng tôi vẫn phải tìm người trả giá cao nhất từ từ điển của mình và tuyên bố họ là + +73 +00:06:08,650 --> 00:06:09,860 +người chiến thắng. + +74 +00:06:10,570 --> 00:06:11,770 +Chung ta se lam như thê nao? + +75 +00:06:14,080 --> 00:06:21,340 +Vâng, hãy đặt điều này trong một chức năng riêng biệt. Vì vậy, chúng tôi có thể tạo một hàm mới có tên find_highest_bidder. + +76 +00:06:23,750 --> 00:06:32,870 +Và điều này sẽ lấy bid_record làm đầu vào, vì vậy đây sẽ là từ điển đại diện cho tất + +77 +00:06:32,870 --> 00:06:40,400 +cả các giá thầu, tên và giá trị. Tôi nghĩ sẽ dễ dàng hơn nếu chúng ta có thể hình dung hồ sơ bid_ này có + +78 +00:06:40,400 --> 00:06:41,680 +thể trông như thế nào. + +79 +00:06:42,080 --> 00:06:51,060 +Vì vậy, chúng tôi biết đó là một từ điển của các cặp khóa-giá trị trong đó mỗi khóa là một tên và mỗi giá trị là một số. + +80 +00:06:51,530 --> 00:06:55,580 +Vì vậy, giả sử chúng tôi chỉ có hai nhà thầu, Angela và James. + +81 +00:06:56,030 --> 00:06:58,370 +Angela đặt giá $ 123. + +82 +00:06:58,370 --> 00:07:00,990 +James đặt giá thầu $ 321. + +83 +00:07:01,130 --> 00:07:03,700 +Vì vậy, chúng ta có thể thấy rõ ràng ai sẽ là người chiến thắng ở đây. + +84 +00:07:04,250 --> 00:07:07,100 +Nhưng làm thế nào để chúng ta có được mã của mình để tìm ra điều đó? + +85 +00:07:08,120 --> 00:07:14,680 +Chúng ta cần bằng cách nào đó lặp lại từ điển này, phải không? được gọi là bid_record. + +86 +00:07:15,920 --> 00:07:25,040 +Chúng tôi biết rằng chúng tôi có thể sử dụng vòng lặp for để thực hiện điều này, vì vậy chúng tôi có thể nói cho từng nhà + +87 +00:07:25,940 --> 00:07:33,410 +thầu trong bid_record và đây là một điểm tốt cần nhớ rằng khi bạn sử dụng vòng lặp for trên từ điển, thay + +88 +00:07:33,410 --> 00:07:39,560 +vì lặp lại từng mục trong từ điển, giống như từng cặp khóa-giá trị này, nó thực sự + +89 +00:07:39,560 --> 00:07:40,940 +lặp qua từng khóa. + +90 +00:07:41,360 --> 00:07:47,090 +Và chúng ta đã đề cập đến vấn đề này trong bài học đầu tiên của ngày hôm nay, nơi chúng ta đã nói về cách + +91 +00:07:47,090 --> 00:07:53,150 +hoạt động của vòng lặp for khi chúng ta lặp qua từ điển. Bây giờ, chúng ta sẽ nắm bắt từng nhà thầu bên + +92 +00:07:53,180 --> 00:07:54,530 +trong từ điển này. + +93 +00:07:55,130 --> 00:07:56,540 +Vậy chúng ta phải làm gì với nó? + +94 +00:07:57,260 --> 00:08:00,410 +Chúng tôi muốn sử dụng khóa để nhận giá trị. + +95 +00:08:00,560 --> 00:08:05,630 +Hãy lấy bid_record và chuyển vào khóa, và điều này sẽ cung cấp + +96 +00:08:06,890 --> 00:08:09,330 +cho chúng tôi giá trị. + +97 +00:08:09,710 --> 00:08:16,770 +Vì vậy, bây giờ chúng tôi thực sự có thể lưu điều này bên trong một biến mà tôi sẽ gọi là bid_amount. + +98 +00:08:17,810 --> 00:08:23,090 +Vì vậy, lần đầu tiên vòng lặp for này chạy, giá thầu sẽ bằng 123 và lần tiếp + +99 +00:08:23,690 --> 00:08:31,040 +theo vòng lặp for chạy, số tiền giá thầu sẽ bằng 321. Nếu chúng ta có một số cách bên ngoài + +100 +00:08:31,040 --> 00:08:33,320 +vòng lặp for theo dõi giá + +101 +00:08:33,330 --> 00:08:42,110 +thầu cao nhất, thì chúng ta có thể sử dụng con số này để kiểm tra số tiền đặt giá thầu hiện + +102 +00:08:42,110 --> 00:08:42,950 +tại. + +103 +00:08:43,610 --> 00:08:45,560 +Chúng ta có thể sử dụng câu + +104 +00:08:45,560 --> 00:08:53,600 +lệnh if để kiểm tra tốt, nếu số tiền đặt giá thầu lớn hơn giá thầu cao nhất, tốt, trong trường hợp đó, giá thầu cao nhất sẽ trở + +105 +00:08:53,600 --> 00:08:55,220 +thành số tiền giá thầu. + +106 +00:08:57,290 --> 00:09:04,700 +Vì vậy, điều này có nghĩa là chúng ta bắt đầu với một con số không. Lần đầu tiên chạy vòng lặp for, người đặt giá + +107 +00:09:04,700 --> 00:09:06,280 +thầu sẽ bằng + +108 +00:09:06,470 --> 00:09:12,410 +Angela, số tiền giá thầu sẽ bằng Angela khi khóa được chuyển vào từ điển + +109 +00:09:12,410 --> 00:09:18,960 +này, sẽ cho chúng ta giá trị 123. Nếu 123 lớn hơn 0, thì giá + +110 +00:09:19,100 --> 00:09:26,960 +thầu cao nhất này bây giờ sẽ trở thành 123. Lần tiếp theo vòng lặp for chạy, người đặt giá + +111 +00:09:26,960 --> 00:09:32,060 +thầu bây giờ là James và số tiền giá thầu bây giờ là 321. + +112 +00:09:32,570 --> 00:09:37,330 +Bây giờ chúng tôi đang kiểm tra xem 321 có lớn hơn giá thầu cao nhất hay không. + +113 +00:09:37,520 --> 00:09:40,990 +Hãy nhớ điều này, trong vòng cuối cùng, đã được đặt thành 123. + +114 +00:09:41,330 --> 00:09:42,680 +Vì vậy, điều này sẽ trở thành sự thật. + +115 +00:09:42,920 --> 00:09:48,410 +Và điều này có nghĩa là giá thầu của James, 321, bây giờ sẽ là giá thầu cao nhất. + +116 +00:09:49,590 --> 00:09:56,850 +Ngoài việc theo dõi giá thầu cao nhất, chúng tôi có thể theo dõi người chiến thắng. Nếu điều này thực sự đúng, nếu người đặt giá thầu + +117 +00:09:56,850 --> 00:10:04,110 +hiện tại có giá thầu cao nhất, thì đồng thời với việc đặt giá thầu cao nhất, chúng ta cũng nên đặt + +118 +00:10:04,110 --> 00:10:07,650 +người chiến thắng thành khóa, vì vậy người đặt giá + +119 +00:10:07,860 --> 00:10:09,210 +thầu hiện tại. + +120 +00:10:11,750 --> 00:10:18,500 +Và khi chúng tôi đã xem qua vòng lặp for này và chúng tôi đã lặp lại tất cả các bản ghi trong hồ sơ đấu thầu, + +121 +00:10:18,770 --> 00:10:21,380 +thì cuối cùng chúng tôi thực sự có thể in "Người + +122 +00:10:22,670 --> 00:10:25,100 +chiến thắng là ... "người chiến + +123 +00:10:26,140 --> 00:10:34,750 +thắng được lưu trữ trong biến này. Và chúng tôi sẽ nói rằng họ đã thắng với giá thầu là ... và hãy thêm một ký hiệu đô la + +124 +00:10:34,750 --> 00:10:38,830 +và sau đó chúng ta sẽ vượt qua giá thầu cao nhất. + +125 +00:10:40,270 --> 00:10:46,990 +Bây giờ, chúng ta có thể biến điều này thành một chuỗi và nó sẽ sử dụng cả hai biến này, sẽ phân tích giá + +126 +00:10:46,990 --> 00:10:51,580 +thầu cao nhất và tên của người chiến thắng để in ra ai là người chiến thắng. + +127 +00:10:52,060 --> 00:10:58,210 +Vì vậy, ở đây, khi should_continue không đi xuống đường dẫn này, bây giờ chúng ta có + +128 +00:10:58,540 --> 00:11:04,330 +thể in và tuyên bố người chiến thắng. Ngoài việc nói rằng đặt giá thầu xong là + +129 +00:11:04,600 --> 00:11:11,200 +đúng, chúng tôi cũng sẽ gọi hàm đó, find_highest_bidder, và chuyển tất cả các giá thầu mà chúng tôi + +130 +00:11:11,200 --> 00:11:13,240 +đã theo dõi ở đây. + +131 +00:11:14,480 --> 00:11:19,940 +Bây giờ, ngay trước khi chúng ta chạy mã của mình, hãy xem qua từng dòng và đảm bảo rằng mọi thứ đều + +132 +00:11:19,940 --> 00:11:20,270 +ổn. + +133 +00:11:20,780 --> 00:11:23,160 +Đầu tiên ở đây, nơi nó nói, 'tên bạn là gì? 'có thể chúng ta + +134 +00:11:23,190 --> 00:11:25,940 +có thể thêm dấu hai chấm và sau đó là dấu cách + +135 +00:11:26,240 --> 00:11:28,180 +để người dùng bắt đầu nhập ở đây. + +136 +00:11:28,790 --> 00:11:30,240 +Sau đó, nó hỏi, 'giá thầu của bạn là bao nhiêu? 'Chúng tôi + +137 +00:11:30,320 --> 00:11:35,390 +cũng có thể thêm dấu hai chấm và người dùng sẽ bắt đầu nhập sau ký hiệu đô la. + +138 +00:11:36,080 --> 00:11:41,720 +Bây giờ, tôi đã có thể thấy một vấn đề thực sự sẽ xảy ra do dòng 23 này. + +139 +00:11:42,050 --> 00:11:47,210 +Tôi tự hỏi liệu bạn có thể phát hiện ra vấn đề ở đây không, đặc biệt nếu bạn nghĩ về những gì chúng tôi sẽ làm + +140 +00:11:47,210 --> 00:11:48,560 +với mức giá này sau này. + +141 +00:11:49,730 --> 00:11:56,300 +Nhưng tôi sẽ thêm một dòng mới nữa ở đây và sau đó tôi sẽ chạy mã và chúng ta sẽ xem điều gì thực sự + +142 +00:11:56,300 --> 00:11:56,860 +xảy ra. + +143 +00:11:58,030 --> 00:11:59,950 +Vì vậy, bây giờ chúng ta hãy tiếp tục và chạy mã. + +144 +00:12:02,930 --> 00:12:10,220 +Và bạn có thể thấy cái búa của chúng tôi được in và sau đó nó yêu cầu chúng tôi tên của chúng tôi, vì vậy tôi + +145 +00:12:10,220 --> 00:12:16,440 +chỉ cần đặt tên của mình và sau đó là 123. Và sau đó là một người đấu giá khác sẽ là James, 321. + +146 +00:12:16,460 --> 00:12:19,570 +Và bây giờ nếu tôi nói không, sẽ không còn nhà thầu nào nữa, hãy xem điều + +147 +00:12:19,940 --> 00:12:21,650 +gì sẽ xảy ra khi tôi nhấn enter. + +148 +00:12:22,370 --> 00:12:23,600 +Tôi gặp lỗi kiểu + +149 +00:12:23,720 --> 00:12:30,790 +và nó cho chúng ta biết rằng dấu lớn hơn không được hỗ trợ giữa các trường hợp của một chuỗi và một int và + +150 +00:12:31,040 --> 00:12:33,500 +điều này đã xảy ra ở dòng 16. + +151 +00:12:35,130 --> 00:12:42,870 +Nếu chúng ta nhìn vào dòng 16, về cơ bản, chúng ta đang so sánh số tiền giá thầu, là giá trị xuất ra từ hồ + +152 +00:12:42,870 --> 00:12:46,490 +sơ đấu thầu, là giá trị đang được chuyển vào đây và + +153 +00:12:46,950 --> 00:12:53,760 +đó, tất nhiên, là một từ điển nơi các phím là tên của những người trả giá và giá trị là giá + +154 +00:12:53,790 --> 00:12:54,390 +cả. + +155 +00:12:54,780 --> 00:12:56,310 +Vậy điều gì đang thực sự xảy ra ở đây? + +156 +00:12:56,610 --> 00:13:02,820 +À, đó là bởi vì khi tôi nhập giá này vào, tôi đã giữ nó như một đầu vào bình thường. + +157 +00:13:03,060 --> 00:13:06,780 +Thay vào đó, nó phải được chuyển thành một số nguyên. + +158 +00:13:07,200 --> 00:13:14,370 +Vì vậy, theo cách đó, chúng ta có thể làm việc với nó như một số để khi chúng ta so sánh nó với, chẳng hạn như số 0 hoặc bất + +159 +00:13:14,370 --> 00:13:18,190 +kỳ số nào khác sau này, nó thực sự có thể thực hiện phép so sánh. + +160 +00:13:18,570 --> 00:13:26,100 +Nó không thực sự có ý nghĩa đối với máy tính khi bạn so sánh một chuỗi với một số. Điều đó thực sự không hoạt + +161 +00:13:26,100 --> 00:13:26,940 +động. + +162 +00:13:26,970 --> 00:13:30,990 +Và điều này đã được đề cập khi chúng ta nói về các kiểu dữ liệu trong Python. + +163 +00:13:31,680 --> 00:13:33,810 +Bây giờ, nếu chúng tôi nhấn + +164 +00:13:35,350 --> 00:13:42,700 +run một lần nữa và chúng tôi làm điều tương tự, và khi tôi nói không, bạn có thể thấy rằng nó cho tôi biết người + +165 +00:13:42,700 --> 00:13:45,160 +chiến thắng là James với giá thầu là 321. + +166 +00:13:46,060 --> 00:13:53,500 +Về cơ bản, phần khó nhất của thử thách này là tìm ra cách lặp qua từ điển và nắm được + +167 +00:13:53,500 --> 00:14:00,640 +từng nhà thầu và từng giá trị của họ và so sánh chúng trong lịch sử với các giá trị + +168 +00:14:00,640 --> 00:14:03,070 +trước đó trong từ điển này. + +169 +00:14:03,790 --> 00:14:11,020 +Nếu chức năng này gây nhầm lẫn cho bạn, thì tôi thực sự khuyên bạn nên chuyển đến Thonny, dán mã vào + +170 +00:14:11,020 --> 00:14:14,720 +và khám phá nó bằng cách thực hiện từng bước. + +171 +00:14:15,250 --> 00:14:20,680 +Ngoài ra, nếu bạn không thể cài đặt Thonny hoặc bạn không có quyền truy cập vào máy tính thông thường của mình, thì bạn cũng có thể truy + +172 +00:14:20,680 --> 00:14:23,800 +cập một trang web có tên là pythontutor. com. + +173 +00:14:24,670 --> 00:14:31,420 +Và điều này cũng cho phép bạn hình dung mã của mình, mặc dù theo cách đơn giản hơn một chút. Nếu tôi tiếp tục và dán hàm + +174 +00:14:31,420 --> 00:14:38,740 +find_highest_bidder của mình, chuyển vào hồ sơ giá thầu, hãy tiếp tục và tạo một từ + +175 +00:14:38,740 --> 00:14:41,100 +điển giá thầu mới. + +176 +00:14:42,160 --> 00:14:47,770 +Vì vậy, bây giờ chúng ta có một từ điển giá thầu với hai cặp khóa-giá + +177 +00:14:48,160 --> 00:14:56,410 +trị giống như chúng ta đã nhập trước đó và sau đó tôi sẽ gọi hàm này, find_highest_bidder, và chuyển các giá thầu này vào. + +178 +00:14:57,370 --> 00:15:03,170 +Bây giờ, nếu chúng ta tiếp tục và nhấp vào việc thực thi trực quan hóa, bạn có thể thấy nó sẽ diễn ra từng dòng một và chúng ta + +179 +00:15:03,170 --> 00:15:06,460 +có thể nhấp vào tiếp theo để xem nó vượt qua điều này như thế nào. + +180 +00:15:06,910 --> 00:15:12,980 +Đầu tiên, nó bỏ qua chức năng này, tạo từ điển tiếp theo này. + +181 +00:15:13,750 --> 00:15:17,710 +Vì vậy, bây giờ nó có một chức năng được lưu trữ ở một nơi nào đó, chính là chức năng này, + +182 +00:15:17,950 --> 00:15:21,010 +nó có một từ điển gọi là giá thầu được lưu trữ ở một nơi khác. + +183 +00:15:21,520 --> 00:15:26,950 +Và bây giờ chúng ta thực sự đi đến dòng, sẽ thực thi hàm đó + +184 +00:15:26,950 --> 00:15:31,330 +và nó sẽ chuyển từ điển giá thầu này sang hàm này. + +185 +00:15:31,990 --> 00:15:40,390 +Và nếu bạn lướt qua từng dòng một, bạn có thể thấy nó tạo ra các biến mới này và điền + +186 +00:15:40,420 --> 00:15:42,720 +chúng vào. Lần đầu tiên chúng + +187 +00:15:42,730 --> 00:15:50,400 +tôi chạy nó, người đặt giá thầu cao nhất là 0, người chiến thắng là một chuỗi trống và người đặt giá thầu trong vòng lặp for hiện là Angela. + +188 +00:15:50,410 --> 00:15:54,010 +Đó là chìa khóa đầu tiên trong từ điển khi nó trỏ đến đây. + +189 +00:15:54,610 --> 00:15:55,660 +Bây giờ, nếu chúng + +190 +00:15:55,660 --> 00:16:01,660 +ta tiếp tục nhấp vào tiếp theo, nó sẽ tính ra số tiền giá thầu là giá trị tương ứng với khóa đó và sau + +191 +00:16:01,660 --> 00:16:08,920 +đó sẽ tính ra giá thầu cao nhất bằng cách so sánh xem liệu số tiền giá thầu hiện tại có lớn hơn giá thầu cao nhất hiện tại hay + +192 +00:16:08,920 --> 00:16:09,220 +không. + +193 +00:16:09,610 --> 00:16:11,900 +Vì vậy, 123 lớn hơn 0 nên + +194 +00:16:12,190 --> 00:16:18,820 +khi tôi nhấp vào tiếp theo, bạn sẽ thấy giá thầu cao nhất được thay thế bằng số tiền giá thầu và người + +195 +00:16:18,820 --> 00:16:23,830 +chiến thắng bây giờ sẽ được đặt là Angela. Lần tiếp theo vòng lặp chạy, người đặt giá thầu bây + +196 +00:16:23,830 --> 00:16:30,040 +giờ là James, và nếu tôi tiếp tục xem qua điều này, bạn có thể thấy rằng James thực sự kết thúc với giá thầu cao + +197 +00:16:30,040 --> 00:16:31,960 +nhất và trở thành người chiến thắng. + +198 +00:16:32,500 --> 00:16:37,990 +Vì vậy, bây giờ vòng lặp for đã được thực hiện vì nó được lặp lại qua tất cả các mục trong từ điển và bây giờ nó sẽ in ra kết + +199 +00:16:37,990 --> 00:16:43,190 +quả, đó là 'Người chiến thắng là James với giá thầu là $ 321. 'Đây là một cách khác thực + +200 +00:16:43,750 --> 00:16:48,040 +sự, thực sự hữu ích để hình dung mã của bạn. + +201 +00:16:48,550 --> 00:16:52,990 +Và điều tuyệt vời khác là ngay cả khi bạn đang hình dung vẫn còn điều gì đó + +202 +00:16:52,990 --> 00:16:58,350 +bạn chưa hiểu, bạn thực sự có thể nhấp vào nút này để nhận trợ giúp trực tiếp từ người dùng trên Internet. + +203 +00:16:58,840 --> 00:17:05,109 +Và nếu bạn muốn thực hành gỡ lỗi của riêng mình, giống như chúng ta đã làm trong bài học hôm nay, bạn cũng có thể nhấp + +204 +00:17:05,109 --> 00:17:09,160 +để trợ giúp một số người dùng đang tìm kiếm trợ giúp về mã của họ. + +205 +00:17:09,310 --> 00:17:14,410 +Và bạn có thể thực hành đọc mã, hiểu mã và giúp người khác sửa lỗi cũng như các vấn đề + +206 +00:17:14,410 --> 00:17:15,119 +của họ. + +207 +00:17:16,540 --> 00:17:22,329 +Cuối cùng, nếu bạn muốn xem mã đã hoàn thành cho dự án hôm nay, thì như mọi khi, + +208 +00:17:22,329 --> 00:17:27,339 +bạn có thể xem lại tor repl. it / @ appbrewery / mù-cuộc đấu giá-đã hoàn thành. + +209 +00:17:27,910 --> 00:17:34,090 +Và điều quan trọng cần nhớ rằng đây chỉ là một cách để hoàn thành dự án này. + +210 +00:17:34,120 --> 00:17:40,660 +Có rất nhiều và rất nhiều cách khác. Nhưng miễn là bạn kiểm tra chương trình của mình một cách kỹ lưỡng và nó + +211 +00:17:40,660 --> 00:17:44,670 +hoạt động theo cách tương tự, thì việc bạn đã thực hiện nó như thế nào không quan trọng quá. + +212 +00:17:45,520 --> 00:17:51,940 +Nhưng điều quan trọng là bạn đã tiếp thu được kiến thức trong các bài học hôm nay + +213 +00:17:51,940 --> 00:18:00,550 +và quan trọng nhất là khái niệm này về từ điển, bổ sung vào từ điển và cũng có thể lặp lại các từ điển. + +214 +00:18:01,330 --> 00:18:07,030 +Vì vậy, hãy xem qua mã đã hoàn thành và cũng có thể chơi với Python Tutor, đây là một nguồn thực + +215 +00:18:07,030 --> 00:18:09,460 +sự tuyệt vời cho việc học của bạn. + +216 +00:18:09,940 --> 00:18:13,240 +Và tôi sẽ gặp bạn vào ngày mai để biết thêm các bài học về Python. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution-Secret-Auction-Completed-Code.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution-Secret-Auction-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..60472c1bf14b7462f967521762c067a356ee81ac --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Solution-Secret-Auction-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/blind-auction-completed \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Step-Through-Execution-with-Python-Tutor.url b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Step-Through-Execution-with-Python-Tutor.url new file mode 100644 index 0000000000000000000000000000000000000000..a46cc7dbf5f3da11ae187a445db3f777387e203d --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/008 Step-Through-Execution-with-Python-Tutor.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://www.pythontutor.com/ \ No newline at end of file diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/009 Motivation and the Accountability Trick.mp4 b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/009 Motivation and the Accountability Trick.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2c5bac4a9b21bd0d99692c100fc4568576ff80f0 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/009 Motivation and the Accountability Trick.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ae4beedf8d826c065f7183a2ddee36b29546c09b66a262f14f35f7b1dc39f77 +size 25105110 diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/009 Motivation and the Accountability Trick_vi.srt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/009 Motivation and the Accountability Trick_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0abd1f724d2d88af4081e7d3470975767e93eabb --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/009 Motivation and the Accountability Trick_vi.srt @@ -0,0 +1,68 @@ +1 +00:00:01,170 --> 00:00:05,939 +Này, chúc mừng bạn đã hoàn thành ngày thứ 9. Bây giờ, hôm nay tôi muốn chia sẻ + +2 +00:00:05,939 --> 00:00:10,380 +với bạn một thủ thuật thực sự hữu ích để duy trì động lực + +3 +00:00:10,380 --> 00:00:11,400 +của bạn. + +4 +00:00:12,060 --> 00:00:17,060 +Và ý tưởng là đảm bảo rằng bạn không chỉ có trách nhiệm với chính + +5 +00:00:17,850 --> 00:00:22,350 +mình mà còn với người khác. Vì vậy, hãy tìm một thành viên trong gia đình + +6 +00:00:22,350 --> 00:00:24,000 +của bạn, tìm một người bạn, + +7 +00:00:24,330 --> 00:00:28,950 +tìm một người bạn và chỉ cần nói với họ rằng bạn đã cam kết thực hiện 100 ngày mã này. + +8 +00:00:29,520 --> 00:00:33,810 +Và sau đó họ sẽ kiểm tra bạn hàng tuần và hỏi bạn, bạn đã làm được gì? + +9 +00:00:33,840 --> 00:00:34,740 +Bạn đã học được gì? + +10 +00:00:35,040 --> 00:00:39,090 +Và sau đó, bạn có thể gửi cho họ những dự án bạn đã xây dựng như Hangman hoặc Treasure Island + +11 +00:00:39,090 --> 00:00:43,230 +để họ có thể chia sẻ về quá trình học tập của bạn và những gì bạn đã và đang xây dựng. + +12 +00:00:43,890 --> 00:00:48,600 +Bây giờ, điều này thực sự quan trọng là bạn không thể chỉ nói với chính mình, ah, bạn biết đấy, có + +13 +00:00:48,660 --> 00:00:51,120 +lẽ tôi sẽ cho mình một ngày nghỉ hôm nay. + +14 +00:00:51,360 --> 00:00:55,440 +Bây giờ bạn đã có ai đó sẽ quy trách nhiệm cho bạn để đảm bảo rằng bạn + +15 +00:00:55,440 --> 00:00:55,940 +tiếp tục + +16 +00:00:55,940 --> 00:00:59,630 +xuất hiện và bạn tiếp tục kiên trì. Vì vậy, hãy thử đi và tôi sẽ + +17 +00:01:00,170 --> 00:01:01,580 +gặp lại bạn vào ngày mai. + diff --git a/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/external-links.txt b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..69077b33037e9190b27dd611611f5be5cb327874 --- /dev/null +++ b/part1/09 - Day 9 - Beginner - Dictionaries, Nesting and the Secret Auction/external-links.txt @@ -0,0 +1,39 @@ + +001 Day-9-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/blind-auction-completed?v=1 + +002 Fork-the-Day-9-Starting-Repl +https://repl.it/@appbrewery/day-9-start + +003 Exercise-22 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/56feec3f-61a3-47e9-95d9-7f9871a9a09a + +003 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +004 Day-9-Ending-Code +https://repl.it/@appbrewery/day-9-end + +005 Exercise-23 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/58076521-a623-49e9-8d55-7a0c76c60464 + +005 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Secret-Auction-Starting-Code +https://repl.it/@appbrewery/blind-auction-start + +007 Hint-Flowchart-of-Secret-Auction +https://app.diagrams.net/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Blind%20Auction%20Flow%20Chart#R3VnbcpswEP0aPzYDCLB5tHNrZ9pMpu6kzaMMilEDiBHyLV%2FfFYirHMdp7JD4JUGrXV3Ont2V5AE6j9fXHKfhDxaQaGAZwXqALgaWZRqmAf%2BkZFNIHM8qBHNOA6VUC6b0iZSWSrqgAclaioKxSNC0LfRZkhBftGSYc7Zqqz2wqD1riudEE0x9HOnS3zQQoZK6jl13fCV0HpZTm65X9MS41FZbyUIcsFVDhC4H6JwzJoqveH1OIoleCUxhd%2FVMb7UyThKxj8Hs4R5fx%2BMlu%2F52dxPepdM7H31BxShLHC3UjtVixaaEgASAiGoyLkI2ZwmOLmvphLNFEhA5jQGtWuc7YykITRD%2BJUJslHvxQjAQhSKOVG8xp5zo2b0pUcYW3Cc7NlSSBPM5ETv0rMoDwF3CYiL4Buw4ibCgy%2FY6sCLRvNKrYYYPhfQrUDc11Ke%2Fxj9%2FadDXwEqUViEVZJrifP8riLdtIC4JF2S9G0Z928rAHimuqmi1VXNVU99TorBBemQcCSfn1Nhp7clOu092Wjo7Q0hclhEBcDKJchbn6VWcpZsPx1mvZ84OT42z9p6cdfvkrK2hPs4e84LP4e8NjokcIUkXon%2FCOk6LsKajM9a0t1DWPhZlvVOjrLsnZUd9UtbdSdkJ2FrGLaew0Y%2FG2OpI2xtjTf0E9ckp%2B1YqKtNbRmHmynOO1fYcGnU8UoSIsuo4pVrG%2F%2FtppHM8COqEjJOgojqsQB4usLwsUl9QcESOAKwUIjmU6o9kUxnlQ54NLBfHkvDJLEsrh%2FQZKmh41gmWLQcSc%2BjoweIcLVhGfcQGWVPxR5nL7%2FuG%2FGLd6LjYlI0EdpubAISqed%2Fsq83yVml3wCg00Z6VwxweIl7HnONNQyGVcZg9H872yGxxy%2B5e%2BTv6yHN26cNHsYKDxnwFdi90Mxt0Uzw6CcI1noz6eLDQ34mKwwp9KLIzz9N5%2FpfJ5kCu141gR5MZNNy5%2FFpkhMtsvgplpl%2FhnKp51p%2FJEtBN3SGLZ4usp7RdVcqX0na3oh4Oc%2F2AeE8yDSbYtGjjgSM6T%2BDbh82DJ9BEQkN9HI1VR0yDoIg6ktEnPMuHksRW%2BQfGdSYD50KOBYGWFTF3IKiRZ7dzkmFrQG87S1pHw9nrtTxWOeo1BbKVrerk9Q75arhnvnrrC9b2gmZ1HnvQcL%2Fz7GsLbbdwOvbuQttd12v1zeE7FGZTf5o6jwjm1fk68zkhiZ6I3%2FkMjZzOK%2FSWVLztSe9ot80y9TSAu6L5LaTALYQ1kEyUdQyuMlVX%2ByqT2wTEj4pKCSpx%2B4azokkii2fPHnCGL3vA9LYUQ%2FdoLrA0F9ywT18LXdTB2dBxRoephdCsf2osMkr9iy26%2FAc%3D + +007 Press-Run-to-see-the-final-project +https://replit.com/@appbrewery/blind-auction-completed?v=1 + +008 Step-Through-Execution-with-Python-Tutor +http://www.pythontutor.com/ + +008 Solution-Secret-Auction-Completed-Code +https://repl.it/@appbrewery/blind-auction-completed + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day 10 Goals what we will make by the end of the day.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day 10 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d00e47be1bcfb9792a6ff63a9226fb543808630c --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day 10 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70e954ad191bcbc5802149ab99c6d77039b8c7ce65110ffd010448f5d3c86fa2 +size 4839978 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day 10 Goals what we will make by the end of the day_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day 10 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1f50d1331c18e8cd7133da10e6159cdfdbc74c54 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day 10 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,92 @@ +1 +00:00:00,750 --> 00:00:05,010 +Này đó! Chào mừng bạn đến với Ngày thứ 10 của 100 + +2 +00:00:05,430 --> 00:00:08,560 +Ngày viết mã và hôm nay chúng ta sẽ tìm hiểu về các hàm với + +3 +00:00:08,630 --> 00:00:10,850 +kết quả đầu ra. Trước đây chúng + +4 +00:00:10,880 --> 00:00:15,770 +ta đã thấy hai loại chức năng khác; một chức năng đơn giản và cũng + +5 +00:00:15,800 --> 00:00:19,850 +hoạt động với đầu vào. Nhưng trong các bài học hôm nay, + +6 +00:00:19,880 --> 00:00:22,400 +chúng ta sẽ sử dụng các kỹ năng mà chúng ta + +7 +00:00:22,730 --> 00:00:26,180 +đã học được và chúng ta sẽ mở rộng kiến thức về các hàm để + +8 +00:00:26,210 --> 00:00:30,920 +xây dựng một ứng dụng máy tính. Tôi nghĩ tại một số thời điểm trong mỗi chương trình + +9 +00:00:30,950 --> 00:00:33,230 +có cuộc sống, họ sẽ xây dựng một ứng dụng máy tính. + +10 +00:00:33,440 --> 00:00:37,070 +Vì vậy, nếu điều đó chưa xảy ra với bạn, thì hôm nay là ngày may mắn của bạn, + +11 +00:00:37,130 --> 00:00:39,740 +bởi vì đó chính xác là những gì chúng ta sẽ làm. + +12 +00:00:40,310 --> 00:00:43,580 +Vì vậy, nó là một máy tính cơ sở văn bản đơn giản và chúng + +13 +00:00:43,820 --> 00:00:48,820 +ta có thể bắt đầu bằng cách viết một số và sau đó chọn một trong các phép toán: + +14 +00:00:48,860 --> 00:00:53,420 +cộng, trừ, nhân hoặc chia. Vì vậy, tôi sẽ chia số này cho hai, và sau đó nó hiển + +15 +00:00:53,870 --> 00:00:58,370 +thị cho chúng ta phép tính đầy đủ, 5/2 = 2. 5. + +16 +00:00:58,820 --> 00:01:02,810 +Và bây giờ chúng ta có thể tiếp tục tính toán với câu trả lời từ bước trước, hoặc chúng + +17 +00:01:02,990 --> 00:01:07,190 +ta có thể gõ 'n' để bắt đầu một phép tính mới. Hãy để tôi gõ một chữ 'y' + +18 +00:01:07,310 --> 00:01:12,200 +và có thể tôi sẽ làm được 2. 5 + 6 và bây giờ tôi nhận + +19 +00:01:13,010 --> 00:01:16,970 +được 8. 5. Đến cuối các bài học ngày + +20 +00:01:17,000 --> 00:01:20,180 +hôm nay, bạn sẽ hiểu cách các hàm thực sự hoạt động, + +21 +00:01:20,300 --> 00:01:25,300 +cách bạn có thể sử dụng chúng để giảm mã thừa và cách bạn có thể cung cấp đầu vào cho + +22 +00:01:26,210 --> 00:01:31,210 +các hàm cũng như cung cấp đầu ra. Khi bạn đã sẵn sàng, hãy chuyển sang bài + +23 +00:01:31,820 --> 00:01:33,680 +học tiếp theo và bắt đầu. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day-10-Goal-Click-Run-to-see-the-final-project.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day-10-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..c4fcda11d398ff7912e030c34437b3370866a6e2 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/001 Day-10-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/calculator-final?v=1 \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Fork-the-Day-10-Starting-Repl.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Fork-the-Day-10-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..b8465b7953158ade4bc36b0c1b0a21be142dc043 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Fork-the-Day-10-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-10-start \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Functions with Outputs.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Functions with Outputs.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d679a3760af723d568725a72da2ea7815d8b344d --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Functions with Outputs.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c953f0da9a1cc716a07c5a3f0dc37003283abf3189cd6c1e472105a2e6ffabb +size 86598303 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Functions with Outputs_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Functions with Outputs_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3490349e13c4a3671357694baf707f294b02b94e --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 Functions with Outputs_vi.srt @@ -0,0 +1,752 @@ +1 +00:00:00,330 --> 00:00:01,163 +Để bắt + +2 +00:00:01,170 --> 00:00:05,460 +đầu, điều đầu tiên tôi muốn nói về các chức năng. + +3 +00:00:05,880 --> 00:00:09,120 +Vì vậy, chúng ta đã thấy một số điều mà chúng ta có thể làm với các hàm. + +4 +00:00:09,630 --> 00:00:13,860 +Điều đầu tiên tôi đã chỉ cho bạn là cách tạo một hàm chuẩn bog + +5 +00:00:13,860 --> 00:00:18,060 +rất đơn giản bằng cách sử dụng def, tên, dấu ngoặc đơn trống và sau + +6 +00:00:18,240 --> 00:00:21,690 +đó là dấu hai chấm. Và sau đó bên trong + +7 +00:00:21,780 --> 00:00:26,780 +phần thân của hàm, bạn có thể thực hiện nhiều việc sẽ được thực hiện mỗi + +8 +00:00:27,420 --> 00:00:30,630 +khi bạn kích hoạt hoặc gọi hàm như thế này. + +9 +00:00:31,260 --> 00:00:35,310 +Và loại chức năng đầu tiên về cơ bản chỉ giúp bạn giảm số lượng mã phải viết + +10 +00:00:35,310 --> 00:00:36,420 +khi bạn có các + +11 +00:00:36,720 --> 00:00:40,980 +lệnh mà bạn muốn thực hiện lặp đi lặp lại. Bây giờ, loại hàm tiếp theo mà + +12 +00:00:40,980 --> 00:00:45,420 +chúng ta đã thấy thực sự có một cái gì đó bên trong dấu ngoặc + +13 +00:00:45,930 --> 00:00:50,930 +đơn và một cái gì đó là một đầu vào có thể được chuyển qua khi chúng + +14 +00:00:51,480 --> 00:00:53,820 +ta gọi hàm. Vì vậy, trong trường + +15 +00:00:53,820 --> 00:00:58,820 +hợp này, 123 là đối số được truyền vào tham số này được gọi là một cái gì đó và + +16 +00:00:59,670 --> 00:01:02,520 +sau đó nó được sử dụng trong phần thân của hàm. + +17 +00:01:03,030 --> 00:01:05,160 +Loại chức năng thứ hai, các chức + +18 +00:01:05,160 --> 00:01:10,160 +năng cho phép đầu vào, cung cấp cho chúng ta khả năng sửa đổi mã trong hàm và khiến + +19 +00:01:10,920 --> 00:01:13,740 +nó thực hiện một điều gì đó khác nhau mỗi lần + +20 +00:01:13,920 --> 00:01:16,350 +tùy thuộc vào dữ liệu đầu vào được chuyển vào. + +21 +00:01:17,070 --> 00:01:20,820 +Bây giờ chúng ta đang tiến hành loại cuối cùng của các + +22 +00:01:21,270 --> 00:01:22,770 +hàm hương vị và + +23 +00:01:22,830 --> 00:01:26,280 +đây là những hàm cho phép bạn có kết quả đầu + +24 +00:01:26,430 --> 00:01:28,170 +ra sau khi hoàn thành hàm. + +25 +00:01:28,920 --> 00:01:32,460 +Chúng tôi bắt đầu với một chức năng đơn giản, và trong trường hợp này, bạn sẽ + +26 +00:01:32,460 --> 00:01:36,720 +nhận thấy rằng mặc dù tôi có thể, tôi thực sự không cung cấp cho nó bất kỳ đầu vào nào. + +27 +00:01:36,750 --> 00:01:39,840 +Các đầu vào và đầu ra hoàn toàn tách biệt với nhau. + +28 +00:01:40,350 --> 00:01:44,940 +Vì vậy, đây là một chức năng bình thường mà bạn đã thấy nhiều lần bây giờ. Và trong phần nội dung của hàm, + +29 +00:01:44,940 --> 00:01:49,740 +tôi sẽ thực hiện một số phần tính toán. Giả sử tôi sẽ tính toán ba nhân + +30 +00:01:49,740 --> 00:01:52,200 +hai lần và sau đó lưu nó vào một + +31 +00:01:52,560 --> 00:01:56,790 +biến được gọi là kết quả. Bây giờ, khi đã xong, + +32 +00:01:57,060 --> 00:02:00,980 +tôi có thể sử dụng từ khóa đầu ra, là return. + +33 +00:02:01,460 --> 00:02:04,940 +Và sau từ khóa đó, tôi có thể đặt bất cứ thứ gì tôi muốn + +34 +00:02:04,940 --> 00:02:09,340 +để trở thành đầu ra của hàm này. Vì vậy, trong trường hợp này, + +35 +00:02:09,500 --> 00:02:11,570 +đầu ra là kết quả. + +36 +00:02:11,990 --> 00:02:16,990 +Và điều đó có nghĩa là khi tôi gọi hàm này sau này và nó + +37 +00:02:18,350 --> 00:02:22,400 +chạy, sau đó nó sẽ tiếp tục và xuất ra kết + +38 +00:02:22,880 --> 00:02:27,710 +quả này và nó thay thế dòng mã này nơi hàm này được gọi. + +39 +00:02:28,220 --> 00:02:33,220 +Bây giờ kết quả đó được lưu giữ trong mã nơi hàm được gọi và tôi có + +40 +00:02:33,770 --> 00:02:38,180 +thể lưu nó vào một biến khác. Tất nhiên, kết quả bằng 3 + +41 +00:02:38,180 --> 00:02:42,770 +* 2 và điều đó có nghĩa là đầu ra này bây giờ bằng 6. + +42 +00:02:43,280 --> 00:02:47,960 +Vì vậy, đây là những gì mã có thể trông như thế nào. Ở đâu đó tôi sẽ định nghĩa hàm của mình có + +43 +00:02:48,140 --> 00:02:53,120 +một đầu ra, mà bạn có thể biết bằng từ khóa return. Bây giờ, tại một số điểm khác trong + +44 +00:02:53,180 --> 00:02:57,230 +mã của tôi, tôi quyết định gọi hàm đó và khi hàm + +45 +00:02:57,710 --> 00:03:02,710 +đó thực thi, trả về hoặc bất cứ thứ gì được xuất ra sẽ thay thế + +46 +00:03:03,760 --> 00:03:06,460 +lệnh gọi hàm. Và cuối cùng, nó + +47 +00:03:06,550 --> 00:03:11,200 +có nghĩa là đầu ra biến đổi này sẽ lưu trữ bất kỳ đầu ra nào. + +48 +00:03:11,530 --> 00:03:14,710 +Vì vậy, trong trường hợp này, đầu ra sẽ bằng 6. + +49 +00:03:15,790 --> 00:03:19,840 +Cách mà tôi thích nghĩ về các chức năng với đầu ra gần giống như một + +50 +00:03:19,840 --> 00:03:20,890 +cái máy, phải không? + +51 +00:03:21,400 --> 00:03:26,400 +Nếu bạn có một chiếc máy mà trong đó có một số chai rỗng và sau một số quá + +52 +00:03:27,130 --> 00:03:31,360 +trình xử lý hoặc một số đầu vào, sẽ tạo ra một chai đầy sữa. + +53 +00:03:31,750 --> 00:03:36,490 +Vì vậy, trong trường hợp này, chức năng này có một đầu vào là chai thủy tinh rỗng. + +54 +00:03:36,790 --> 00:03:41,380 +Nó có một đầu ra, một chai thủy tinh chứa đầy sữa và ở giữa, có + +55 +00:03:41,410 --> 00:03:46,410 +một số quy trình hoặc một số mã đang được thực thi để tạo ra sự thay đổi này. + +56 +00:03:47,560 --> 00:03:50,980 +Điều này liên kết với nhau tất cả những điều mà chúng ta đã học về các hàm. + +57 +00:03:51,430 --> 00:03:55,180 +Vì vậy, bây giờ hãy đến với Ngày thứ 10 bắt đầu chiếu lại và tiếp tục và phân + +58 +00:03:55,690 --> 00:03:59,320 +tách bản sao của chính bạn về nó. Bây giờ, khi bạn đã có + +59 +00:03:59,320 --> 00:04:01,030 +bản sao của riêng mình, + +60 +00:04:01,540 --> 00:04:05,890 +chúng ta sẽ tạo một số hàm với kết quả đầu ra của riêng mình. + +61 +00:04:06,640 --> 00:04:09,940 +Hãy bắt đầu bằng cách tạo một hàm mới mà tôi + +62 +00:04:10,330 --> 00:04:12,820 +sẽ gọi là format_name và lý do + +63 +00:04:13,390 --> 00:04:18,390 +là vì hàm này sẽ lấy tên và họ, và nó sẽ thay đổi các đầu vào + +64 +00:04:19,810 --> 00:04:23,740 +đó, ngay cả khi nó là chữ thường hoặc nếu nó đã được viết + +65 +00:04:24,160 --> 00:04:27,040 +hoa tất cả, nó sẽ thay đổi nó thành chữ + +66 +00:04:27,070 --> 00:04:31,270 +hoa tiêu đề, một cái gì đó như thế này trong đó chữ cái + +67 +00:04:31,570 --> 00:04:36,570 +đầu tiên được viết hoa trong mỗi từ. Để bắt đầu, tôi muốn bạn tạo + +68 +00:04:37,030 --> 00:04:41,770 +hàm này và sau đó tiếp tục và thêm hai đầu vào cho nó. + +69 +00:04:42,250 --> 00:04:47,200 +Người ta có thể f_name, vì vậy tên và một mã khác l_name, + +70 +00:04:47,740 --> 00:04:50,710 +đó là họ. Tạm dừng video và tiếp tục. + +71 +00:04:53,110 --> 00:04:53,410 +Được rồi. + +72 +00:04:53,410 --> 00:04:58,410 +Vì vậy, tất cả những gì chúng ta phải làm để thêm đầu vào cho hàm của chúng ta chỉ là + +73 +00:04:58,660 --> 00:05:01,840 +đặt tên của các tham số này bên trong dấu ngoặc đơn. + +74 +00:05:02,410 --> 00:05:07,410 +Vì vậy, bây giờ hàm của chúng ta có thể lấy các tham số này làm đầu vào bất cứ + +75 +00:05:07,780 --> 00:05:09,460 +khi nào hàm này được gọi. + +76 +00:05:10,630 --> 00:05:15,630 +Bước tiếp theo là chúng ta sẽ chuyển đổi các chuỗi này được chuyển vào, vì vậy nó có thể là + +77 +00:05:16,030 --> 00:05:19,240 +một cái gì đó như thế này, tất cả đều là chữ thường. + +78 +00:05:19,270 --> 00:05:23,410 +Nó có thể được viết hoa tất cả, hoặc nó có thể là ngẫu nhiên, phải không? + +79 +00:05:23,410 --> 00:05:26,290 +Giống như một số được viết hoa, một số thì không. + +80 +00:05:26,650 --> 00:05:29,260 +Nhưng chúng tôi sẽ làm cho tất cả đồng nhất, vì vậy tất + +81 +00:05:29,260 --> 00:05:33,910 +cả những thứ này sẽ kết thúc như thế này. Và để làm điều này, chúng ta + +82 +00:05:34,270 --> 00:05:39,270 +có thể tìm kiếm trên Google và bạn có thể gặp một câu hỏi tương tự trong + +83 +00:05:39,910 --> 00:05:44,740 +Stack Overflow: Làm cách nào để chuyển đổi một chuỗi thành tiêu đề trong Python? + +84 +00:05:45,220 --> 00:05:49,810 +Họ có một ví dụ và nó đang cố gắng thực hiện chính xác những gì chúng tôi đang cố gắng làm. + +85 +00:05:50,590 --> 00:05:52,660 +Nếu chúng ta xem qua các câu trả + +86 +00:05:52,930 --> 00:05:57,250 +lời, bạn có thể thấy rằng ai đó đang trỏ đến hàm tiêu đề này một cách hữu ích. + +87 +00:05:57,680 --> 00:06:02,390 +Vì vậy, bạn lấy một chuỗi và sau đó bạn viết. tiêu đề và sau đó, chuỗi được + +88 +00:06:02,390 --> 00:06:07,390 +chuyển đổi và mọi từ bây giờ bắt đầu bằng một chữ cái viết hoa. + +89 +00:06:09,650 --> 00:06:12,950 +Và nếu bạn muốn biết thêm về cách hoạt động của trường tiêu + +90 +00:06:13,250 --> 00:06:17,420 +đề này, thì bạn có thể nhấp vào liên kết đó trong tiêu đề và sau + +91 +00:06:17,420 --> 00:06:21,200 +đó đọc qua tài liệu Python. Khi bạn đã đọc qua điều đó, + +92 +00:06:21,410 --> 00:06:26,410 +hãy tiếp tục và sửa đổi Tên và Tên này để chúng kết thúc bằng cả hai + +93 +00:06:28,520 --> 00:06:31,340 +chữ hoa tiêu đề. Tạm dừng video và tiếp tục. + +94 +00:06:33,700 --> 00:06:34,490 +1: Đúng không? + +95 +00:06:34,490 --> 00:06:34,810 +Được rồi. + +96 +00:06:34,810 --> 00:06:39,810 +Vì vậy, chúng tôi muốn tiếp tục và lấy Fname này, sau đó viết một dấu chấm và sau + +97 +00:06:40,160 --> 00:06:43,660 +đó viết tiêu đề để chuyển nó thành tiêu đề trường hợp. + +98 +00:06:44,410 --> 00:06:48,640 +Khi chúng ta đã hoàn thành việc đó, thì chúng ta sẽ làm tương tự với l_name. + +99 +00:06:50,260 --> 00:06:53,530 +Và nếu chúng ta tiếp tục và thực sự in chúng ra, + +100 +00:06:54,880 --> 00:06:57,460 +và tất nhiên, để hàm thực sự thực thi, + +101 +00:06:57,760 --> 00:07:02,080 +chúng ta sẽ phải gọi hàm. Vì vậy, tôi sẽ đặt hai đầu + +102 +00:07:02,080 --> 00:07:07,000 +vào ở đây, một đầu vào sẽ là, ừm, chỉ là angela, tất cả đều là chữ thường và + +103 +00:07:07,510 --> 00:07:11,620 +sau đó đầu vào thứ hai sẽ là ANGELA tất cả trong một trường hợp. + +104 +00:07:12,190 --> 00:07:14,140 +Và bây giờ khi tôi chạy mã này, + +105 +00:07:14,530 --> 00:07:18,640 +bạn sẽ thấy rằng kết quả là cả hai đều được chuyển đổi thành chữ hoa tiêu đề. + +106 +00:07:19,270 --> 00:07:19,960 +Về + +107 +00:07:19,960 --> 00:07:24,960 +bản chất, phần này của mã trở thành bất kỳ giá trị nào trước đó + +108 +00:07:25,240 --> 00:07:30,240 +của f_name được chuyển đổi thành tiêu đề. Bạn có thể đã phát hiện ra rằng chức năng tiêu đề + +109 +00:07:31,930 --> 00:07:33,400 +này thực sự có một đầu ra. + +110 +00:07:33,730 --> 00:07:38,410 +Nó trả về một phiên bản của chuỗi trong đó mỗi từ được đặt tiêu đề. + +111 +00:07:39,070 --> 00:07:41,770 +Thay vì chỉ in cái này, chúng ta + +112 +00:07:42,100 --> 00:07:44,980 +cũng có thể chụp nó bên trong một biến. + +113 +00:07:45,460 --> 00:07:50,460 +Hãy tạo một biến mới có tên + +114 +00:07:55,330 --> 00:07:57,490 +formatted_f_name và formatted_l_name. + +115 +00:07:58,690 --> 00:08:03,690 +Bây giờ những gì đang xảy ra ở đây là chúng tôi đang chuyển đổi đầu vào + +116 +00:08:05,680 --> 00:08:08,140 +f_name này, biến nó thành trường tiêu đề. + +117 +00:08:08,560 --> 00:08:11,530 +Và sau đó khi hàm này thực thi, nó + +118 +00:08:11,860 --> 00:08:16,860 +có một đầu ra và đầu ra đó sẽ thay thế phần này của mã và + +119 +00:08:17,590 --> 00:08:20,830 +sau đó nó được lưu trữ bên trong biến này. + +120 +00:08:21,490 --> 00:08:26,020 +Bây giờ chúng ta có thể tiếp tục và in phiên bản cuối cùng + +121 +00:08:26,380 --> 00:08:31,380 +của hàm sẽ sử dụng một chuỗi để lấy Fname đã được định dạng và sau đó + +122 +00:08:32,049 --> 00:08:37,049 +thêm một khoảng trắng và sau đó in ra Lname được định dạng, như thế này. + +123 +00:08:39,280 --> 00:08:43,090 +Bây giờ, nếu tôi bắt đầu với tên của mình nhưng tất cả đều bằng cách + +124 +00:08:43,120 --> 00:08:46,000 +viết hoa kỳ lạ và sau đó là họ của tôi viết + +125 +00:08:46,330 --> 00:08:48,730 +hoa toàn bộ, chúng ta hãy tiếp tục + +126 +00:08:49,030 --> 00:08:51,580 +và nhấn run và xem điều gì sẽ xảy ra. + +127 +00:08:52,240 --> 00:08:55,180 +Bạn có thể thấy rằng tên của tôi được chuyển đổi thành tiêu + +128 +00:08:55,230 --> 00:08:57,600 +đề cho trường hợp, họ của tôi được chuyển đổi + +129 +00:08:57,990 --> 00:09:01,320 +thành tiêu đề và sau đó kết quả đó được lưu trữ trong Tên + +130 +00:09:01,590 --> 00:09:05,130 +được định dạng và kết quả này được lưu trữ trong Tên này, sau đó + +131 +00:09:05,460 --> 00:09:10,200 +chúng được in và định dạng, như vậy . Bây giờ thay vì + +132 +00:09:10,230 --> 00:09:13,110 +in kết quả này ra, chúng tôi + +133 +00:09:13,140 --> 00:09:18,140 +cũng có thể trả lại nó. Tương tự như cách mà hàm tiêu đề + +134 +00:09:19,650 --> 00:09:23,370 +này trả về kết quả đầu ra, thay thế phần này của mã, + +135 +00:09:23,670 --> 00:09:27,330 +chúng ta cũng có thể làm tương tự với hàm format_name của mình. + +136 +00:09:27,720 --> 00:09:32,520 +Vì vậy, hãy xóa chức năng in và tiếp tục và sử dụng trả về + +137 +00:09:32,550 --> 00:09:33,383 +thay thế. + +138 +00:09:34,440 --> 00:09:38,100 +Bây giờ chuỗi được định dạng này trở thành đầu ra và như + +139 +00:09:38,520 --> 00:09:40,380 +chúng ta đã đề cập trước + +140 +00:09:40,500 --> 00:09:45,500 +đây, điều xảy ra với các hàm có đầu ra là đầu ra này thay thế phần + +141 +00:09:46,620 --> 00:09:50,190 +mã nơi hàm được gọi. Bây giờ, nếu đây + +142 +00:09:50,250 --> 00:09:53,280 +là chuỗi mà chúng ta muốn in, thì + +143 +00:09:53,580 --> 00:09:58,050 +tất cả những gì chúng ta phải làm là lưu kết quả đầu + +144 +00:09:58,110 --> 00:10:03,060 +ra thay thế phần này của mã bên trong một biến như thế này. + +145 +00:10:03,660 --> 00:10:08,660 +Và sau đó tất cả những gì chúng ta phải làm là tiếp tục và in chuỗi được định dạng đó. + +146 +00:10:10,170 --> 00:10:15,000 +Như bạn thấy, khi tôi chạy mã, điều tương tự cũng xảy ra. Bây giờ bạn có thể, và bạn + +147 +00:10:15,090 --> 00:10:17,280 +có thể có, chỉ cần + +148 +00:10:17,310 --> 00:10:22,310 +thực hiện lệnh gọi hàm này và đặt nó ngay bên trong câu lệnh in. + +149 +00:10:22,830 --> 00:10:24,930 +Điều đó hoạt động chính xác theo cùng một cách. + +150 +00:10:25,260 --> 00:10:27,870 +Và chúng ta có thể hình dung điều này bằng cách sử dụng Thonny. + +151 +00:10:28,350 --> 00:10:33,350 +Nếu tôi tiếp tục và dán mọi thứ chúng tôi có bên trong trình chỉnh sửa và tiếp + +152 +00:10:34,110 --> 00:10:35,070 +tục chạy gỡ + +153 +00:10:37,410 --> 00:10:41,760 +lỗi, thì chúng tôi có thể bước vào và xem các bước xảy ra là gì. + +154 +00:10:42,270 --> 00:10:43,290 +Vì vậy, điều + +155 +00:10:43,410 --> 00:10:48,410 +đầu tiên khi dòng 6 này được thực thi là nó cố gắng gọi hàm này, format_name. + +156 +00:10:50,190 --> 00:10:52,740 +Vì vậy, nó đi qua hai đầu vào này. + +157 +00:10:54,000 --> 00:10:59,000 +Và bây giờ chúng ta đang ở trong chức năng mà chúng ta có quyền truy cập vào hai đầu + +158 +00:10:59,310 --> 00:11:00,660 +vào này, Fname và Lname. + +159 +00:11:01,410 --> 00:11:04,320 +Bây giờ, formated_f_name trở thành phiên bản dựa + +160 +00:11:04,320 --> 00:11:08,790 +trên tiêu đề của tên và điều tương tự cũng xảy ra với họ. + +161 +00:11:09,090 --> 00:11:12,930 +Vì vậy, bây giờ chúng ta có formatted_f_name và formatted_l_name và đó là + +162 +00:11:13,320 --> 00:11:16,800 +những gì sẽ được trả về dưới dạng đầu ra. + +163 +00:11:18,240 --> 00:11:22,230 +Bây giờ, sau khi hoàn thành, đầu ra đó sẽ thay thế bất cứ thứ gì + +164 +00:11:22,260 --> 00:11:24,840 +ở giữa câu lệnh in, đó là nơi chúng tôi + +165 +00:11:25,140 --> 00:11:27,720 +gọi hàm tên định dạng này và đây là những + +166 +00:11:28,110 --> 00:11:32,670 +gì được in vào bảng điều khiển. Như tôi đã đề cập trước đây, chúng tôi + +167 +00:11:32,670 --> 00:11:37,530 +thực sự đã sử dụng các hàm mà chúng tôi không tạo ra có tất cả các chức + +168 +00:11:37,530 --> 00:11:40,290 +năng này, phải không? Ví dụ, hàm + +169 +00:11:40,320 --> 00:11:44,190 +Len nhận một đầu vào và có một đầu ra. + +170 +00:11:44,760 --> 00:11:47,370 +Đầu vào sẽ là một chuỗi, tên của tôi một + +171 +00:11:47,730 --> 00:11:51,300 +lần nữa, dường như tôi thực sự bị ám ảnh bởi tên của chính mình. + +172 +00:11:52,380 --> 00:11:57,160 +Vì vậy, bây giờ dòng mã này sẽ chạy hàm len được tích hợp sẵn này, tính toán số lượng + +173 +00:11:57,640 --> 00:12:01,570 +ký tự bên trong đầu vào này mà chúng tôi đã cung cấp cho nó. + +174 +00:12:02,080 --> 00:12:04,900 +Và sau đó nó sẽ trả về kết quả dưới dạng đầu + +175 +00:12:05,260 --> 00:12:08,320 +ra, mà bây giờ chúng ta có thể nắm bắt bên trong một biến. + +176 +00:12:09,040 --> 00:12:12,490 +Đây là các đầu vào, đây là chức năng và + +177 +00:12:12,910 --> 00:12:15,190 +khi điều này được hoàn thành, kết + +178 +00:12:15,490 --> 00:12:20,490 +quả trả về hoặc bất cứ thứ gì sau câu lệnh return sẽ thay thế phần + +179 +00:12:21,940 --> 00:12:23,140 +này của mã. + +180 +00:12:23,650 --> 00:12:28,240 +Sau đó, kết quả hoặc đầu ra đó sẽ được lưu trữ bên trong biến này. + +181 +00:12:29,560 --> 00:12:34,150 +Vì vậy, từ khóa return này thực sự là điều quan trọng nhất + +182 +00:12:34,150 --> 00:12:36,100 +để tạo một hàm có + +183 +00:12:36,130 --> 00:12:41,130 +đầu ra, bởi vì mọi thứ xuất hiện sau nó sẽ thay thế nơi + +184 +00:12:41,170 --> 00:12:43,780 +hàm được gọi. Trong bài học tiếp theo, + +185 +00:12:43,810 --> 00:12:48,730 +chúng ta sẽ xem xét chi tiết hơn về từ khóa return. Cụ thể, hãy xem điều gì sẽ xảy ra khi chúng + +186 +00:12:48,760 --> 00:12:49,840 +ta có nhiều hơn + +187 +00:12:49,870 --> 00:12:54,490 +một câu lệnh trả về trong cùng một hàm. Được rồi. + +188 +00:12:54,700 --> 00:12:56,710 +Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/002 How-to-Convert-Strings-to-Title-Case.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 How-to-Convert-Strings-to-Title-Case.url new file mode 100644 index 0000000000000000000000000000000000000000..d6c268ca481dc8608a391d5cb0f5271fbc61a607 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/002 How-to-Convert-Strings-to-Title-Case.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://stackoverflow.com/questions/8347048/how-to-convert-string-to-title-case-in-python \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Completed-Example-Code-for-Day-10.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Completed-Example-Code-for-Day-10.url new file mode 100644 index 0000000000000000000000000000000000000000..ed63233ee4f4de7d6d338ec34886e68dc8e3b6a4 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Completed-Example-Code-for-Day-10.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-10-end#main.py \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Multiple return values.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Multiple return values.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..722c85cf6e488f7aa5af2a8a0e890c2e976ff09a --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Multiple return values.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7332959962aa3077ca8f3498262dd476a9be9b707bf0cfbe58d211c4647e6ee8 +size 13479606 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Multiple return values_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Multiple return values_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5291db5fe80810b9ad1b76d4de0ef9c67cae8fdf --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/003 Multiple return values_vi.srt @@ -0,0 +1,196 @@ +1 +00:00:00,480 --> 00:00:04,530 +Trong bài học trước, chúng ta đã xem xét các hàm trả về một số loại giá trị. + +2 +00:00:05,010 --> 00:00:09,570 +Chúng tôi đã tạo một hàm có tên là format_name trả về một chuỗi. Trong bài học này, hãy xem điều + +3 +00:00:09,570 --> 00:00:10,080 +gì + +4 +00:00:10,080 --> 00:00:14,160 +sẽ xảy ra khi một hàm có nhiều hơn một câu lệnh trả về. + +5 +00:00:14,520 --> 00:00:18,600 +Khi máy tính gặp một dòng có từ trả về trên đó, thì nó + +6 +00:00:19,140 --> 00:00:22,560 +sẽ biết rằng dòng này là kết thúc của hàm. + +7 +00:00:23,100 --> 00:00:28,100 +Nếu tôi thêm một dòng mã sau từ khóa trả về, hãy lưu ý điều gì sẽ xảy + +8 +00:00:29,970 --> 00:00:33,630 +ra khi tôi chạy mã này. Nó không bao giờ được thực thi. + +9 +00:00:33,930 --> 00:00:38,930 +Và điều này xảy ra bởi vì kết quả trả về cho máy tính biết rằng đây là sự kết thúc + +10 +00:00:39,480 --> 00:00:42,420 +của chức năng và bây giờ bạn nên thoát khỏi chức năng. + +11 +00:00:43,020 --> 00:00:47,130 +Bạn thực sự có thể có nhiều từ khóa trả về trong cùng một hàm + +12 +00:00:47,640 --> 00:00:51,300 +và thậm chí bạn có thể có một từ khóa trả về trống. + +13 +00:00:51,360 --> 00:00:55,170 +Vì vậy, chỉ có từ khóa trả lại mà không có bất cứ điều gì sau đó. + +14 +00:00:55,590 --> 00:00:56,790 +Vì vậy, ví + +15 +00:00:56,820 --> 00:01:01,820 +dụ, chúng ta có thể kiểm tra xem fname bằng một chuỗi rỗng hay lname + +16 +00:01:04,470 --> 00:01:07,620 +bằng một chuỗi rỗng. Vì vậy, trường hợp này, có nghĩa + +17 +00:01:07,620 --> 00:01:12,540 +là khi chúng tôi gọi nó là tên định dạng, có thể chúng tôi đã không cung cấp bất kỳ đầu vào nào cho nó. + +18 +00:01:13,050 --> 00:01:17,430 +Ví dụ, giả sử rằng thay vì chỉ gọi hàm như nó vốn có, chúng + +19 +00:01:17,670 --> 00:01:20,400 +tôi thực sự đã sử dụng hàm đầu vào. + +20 +00:01:20,580 --> 00:01:25,580 +Vậy họ của bạn là gì và họ của bạn là gì? + +21 +00:01:28,350 --> 00:01:28,890 +Bây giờ + +22 +00:01:28,890 --> 00:01:33,890 +điều gì sẽ xảy ra là nó sẽ yêu cầu chúng ta nhập một đầu vào và nó sẽ lấy + +23 +00:01:36,990 --> 00:01:41,990 +hai đầu vào này, sau đó gọi hàm đó và trả về phiên bản đã định dạng sẽ được in. + +24 +00:01:43,470 --> 00:01:47,820 +Vì vậy, bây giờ trong trường hợp này, có thể chúng ta đã không + +25 +00:01:47,880 --> 00:01:52,880 +đặt tên cho nó hoặc không đặt cho nó họ và có lẽ nó không nên + +26 +00:01:53,730 --> 00:01:57,660 +đi qua những dòng mã này. Nhưng hiện tại, nó vẫn đang chạy chức + +27 +00:01:57,960 --> 00:02:01,650 +năng này cố gắng lấy chữ hoa tiêu đề từ chuỗi trống và sau đó in nó. + +28 +00:02:02,310 --> 00:02:06,360 +Và tôi có thể chứng minh điều này cho bạn bằng cách thêm một từ bổ sung vào đây. + +29 +00:02:06,870 --> 00:02:09,479 +Vì vậy, một lần nữa, trống tên, trống, họ, + +30 +00:02:09,900 --> 00:02:13,590 +và sau đó là kết quả in và tất nhiên là không có gì. + +31 +00:02:14,220 --> 00:02:19,220 +Làm thế nào chúng ta có thể làm cho nó bỏ qua phần còn lại của mã nếu người dùng nhập + +32 +00:02:19,830 --> 00:02:21,990 +tên hoặc họ trống? Chà, chúng ta có + +33 +00:02:21,990 --> 00:02:25,410 +thể sử dụng những gì tôi đã đề cập trước đây, một sự trở lại sớm. + +34 +00:02:25,860 --> 00:02:29,400 +Vì vậy, chúng tôi chỉ có thể viết return mà không cần bất kỳ + +35 +00:02:29,730 --> 00:02:32,730 +thứ gì sau đó và điều này sẽ thoát khỏi hàm. + +36 +00:02:33,120 --> 00:02:35,850 +Vì vậy, về cơ bản nó sẽ kết thúc sớm chức năng. + +37 +00:02:36,690 --> 00:02:41,010 +Bây giờ lần này, nếu tôi để trống họ và tên, bạn sẽ + +38 +00:02:41,250 --> 00:02:46,250 +thấy nó không in được vì không có đầu ra nào từ cái này để in. + +39 +00:02:47,700 --> 00:02:48,600 +Tất nhiên, bây + +40 +00:02:48,630 --> 00:02:53,340 +giờ, có lẽ sẽ an toàn hơn nếu thực sự trả lại thứ gì đó cho nhà phát triển biết + +41 +00:02:53,340 --> 00:02:57,240 +điều gì đang thực sự xảy ra để chúng tôi có thể đưa ra một thông + +42 +00:02:57,300 --> 00:03:00,580 +điệp có ý nghĩa, chẳng hạn như trả lại, đại loại như thế này. + +43 +00:03:01,090 --> 00:03:06,090 +Vì vậy, bằng cách này, chúng ta có thể nắm bắt các trường hợp khi có điều gì đó không ổn và + +44 +00:03:06,400 --> 00:03:11,200 +sau đó thoát khỏi chức năng của chúng tôi thay vì lãng phí thời gian để nó tiếp tục làm việc + +45 +00:03:11,200 --> 00:03:12,820 +mà chúng ta không muốn nó làm. + +46 +00:03:14,140 --> 00:03:17,050 +Chúng tôi đã đề cập đến một số điều trong bài + +47 +00:03:17,530 --> 00:03:22,530 +học ngày hôm nay và tôi muốn bạn kết hợp điều này với kiến thức hiện có của + +48 +00:03:22,990 --> 00:03:24,850 +bạn để giải quyết thách thức + +49 +00:03:25,300 --> 00:03:30,300 +trong bài học tiếp theo để nắm rõ khái niệm hàm này với đầu vào và đầu ra. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/004 Exercise-24.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 Exercise-24.url new file mode 100644 index 0000000000000000000000000000000000000000..f155af8a732848dd2887936a22b8800d9b213c4e --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 Exercise-24.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/79040aa6-f9d2-4493-9f92-52c26748ec3e \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/004 How-to-join-Auditorium.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/004 [Interactive Coding Exercise] Days in Month.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 [Interactive Coding Exercise] Days in Month.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9c76ac2c73ca5f51758ebc1218077baded039600 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 [Interactive Coding Exercise] Days in Month.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04a485c7e17efa5471e3e566239ea81e790c1fe90710f191c637c572c697c10c +size 19738266 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/004 [Interactive Coding Exercise] Days in Month_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 [Interactive Coding Exercise] Days in Month_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..81116ad01187ed5e2b21c851fec0b2ad8a9ac373 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/004 [Interactive Coding Exercise] Days in Month_vi.srt @@ -0,0 +1,500 @@ +1 +00:00:00,360 --> 00:00:02,730 +Trong bài tập này, bạn sẽ xây dựng một + +2 +00:00:02,730 --> 00:00:05,850 +chương trình có thể cho chúng ta biết có bao nhiêu + +3 +00:00:05,850 --> 00:00:09,030 +ngày trong một tháng bất kỳ và một năm bất kỳ. + +4 +00:00:09,030 --> 00:00:10,170 +Trong ngăn Nhập liệu, + +5 +00:00:10,170 --> 00:00:13,023 +bạn sẽ thấy dòng đầu tiên chúng ta có thể nhập bất kỳ năm + +6 +00:00:13,023 --> 00:00:16,620 +nào và trên dòng thứ hai chúng ta có thể nhập bất kỳ tháng nào. + +7 +00:00:16,620 --> 00:00:18,570 +Và chương trình của bạn sẽ làm + +8 +00:00:18,570 --> 00:00:21,330 +gì, đó là nó sẽ mất những năm và tháng đó để + +9 +00:00:21,330 --> 00:00:24,690 +tính xem có bao nhiêu ngày trong tháng đó. + +10 +00:00:24,690 --> 00:00:26,370 +Vậy tại sao chúng ta lại quan tâm đến năm? + +11 +00:00:26,370 --> 00:00:29,100 +Chà, trong những năm nhuận, vào tháng + +12 +00:00:29,100 --> 00:00:32,907 +2, thực tế có 29 ngày thay vì 28 ngày như thường lệ. + +13 +00:00:32,907 --> 00:00:36,690 +Vì vậy, đây là cơ hội tuyệt vời để chúng ta thực hành những gì đã + +14 +00:00:36,690 --> 00:00:38,880 +học về hàm với kết quả đầu ra, đồng thời + +15 +00:00:38,880 --> 00:00:41,910 +xem một số mã mà chúng ta đã quen thuộc, đó là mã mà chúng + +16 +00:00:41,910 --> 00:00:43,290 +ta sử dụng để tìm hiểu xem + +17 +00:00:43,290 --> 00:00:46,530 +một năm có phải là năm nhuận hay không. + +18 +00:00:46,530 --> 00:00:47,760 +Nếu bạn nhìn vào mã + +19 +00:00:47,760 --> 00:00:50,130 +bắt đầu, bạn sẽ thấy rằng có một hàm + +20 +00:00:50,130 --> 00:00:52,740 +tên là is_leap, hàm này nhận đầu vào là + +21 +00:00:52,740 --> 00:00:54,300 +"năm" và chúng ta có mã + +22 +00:00:54,300 --> 00:00:57,720 +đến từ mã giải pháp của bài tập năm nhuận. + +23 +00:00:57,720 --> 00:00:59,010 +Bây giờ, nếu bạn đã + +24 +00:00:59,010 --> 00:01:01,230 +làm khác đi, hãy thoải mái sửa đổi + +25 +00:01:01,230 --> 00:01:04,560 +chức năng này, nó chỉ ở đó để giúp bạn bắt đầu. + +26 +00:01:04,560 --> 00:01:05,393 +Điều bạn muốn làm + +27 +00:01:05,393 --> 00:01:07,920 +là thay vì in năm nhuận hoặc không phải năm nhuận, + +28 +00:01:07,920 --> 00:01:10,830 +bạn muốn làm cho hàm này có kết quả trả về. + +29 +00:01:10,830 --> 00:01:13,170 +Vì vậy, nó sẽ xuất ra "Đúng" nếu đó + +30 +00:01:13,170 --> 00:01:17,040 +là năm nhuận hoặc "Sai" nếu đó không phải là năm nhuận. + +31 +00:01:17,040 --> 00:01:19,410 +Và sau đó, bên trong hàm Days_in_month, + +32 +00:01:19,410 --> 00:01:22,830 +bạn sẽ sử dụng is_leap này, trước hết để + +33 +00:01:22,830 --> 00:01:25,950 +kiểm tra đầu vào và đầu vào sẽ là một năm + +34 +00:01:25,950 --> 00:01:27,900 +và một tháng và bạn sẽ tạo + +35 +00:01:27,900 --> 00:01:31,230 +đầu ra cho hàm này cung cấp cho chúng ta + +36 +00:01:31,230 --> 00:01:36,810 +văn bản thuần túy, số ngày trong tháng. + +37 +00:01:36,810 --> 00:01:41,250 +Hãy xem dòng 21, ở đó bạn có số ngày_trong_tháng và sau + +38 +00:01:41,250 --> 00:01:43,710 +đó cần có hai dữ liệu đầu vào, đầu + +39 +00:01:43,710 --> 00:01:46,590 +tiên là năm, thứ hai là tháng. + +40 +00:01:46,590 --> 00:01:49,140 +Và bạn sẽ phải đảm bảo rằng thứ tự đó + +41 +00:01:49,140 --> 00:01:53,130 +được tôn trọng khi bạn sửa đổi hàm Days_in_month. + +42 +00:01:53,130 --> 00:01:57,030 +Và về cơ bản, chúng ta đã sắp xếp tất cả các ngày trong tháng + +43 +00:01:57,030 --> 00:02:00,360 +thành một danh sách có tên là tháng_ngày và bạn sẽ + +44 +00:02:00,360 --> 00:02:03,420 +tính xem đây có phải là năm nhuận không? + +45 +00:02:03,420 --> 00:02:06,810 +Nếu không, thì chúng ta sẽ sử dụng các ngày tiêu chuẩn thông thường + +46 +00:02:06,810 --> 00:02:09,600 +cho tháng Hai và những ngày còn lại trong năm, nhưng nếu + +47 +00:02:09,600 --> 00:02:10,979 +đó là năm nhuận và họ muốn kiểm + +48 +00:02:10,979 --> 00:02:13,170 +tra xem đó có phải là tháng Hai hay không thì + +49 +00:02:13,170 --> 00:02:16,110 +chúng ta sẽ cung cấp cho họ 29 thay vì 28 như thường lệ. + +50 +00:02:16,110 --> 00:02:17,263 +Đó là lý thuyết của nó. + +51 +00:02:17,263 --> 00:02:20,910 +Bây giờ là lúc bạn phải đấu tranh và tự mình tìm ra tất cả. + +52 +00:02:20,910 --> 00:02:21,903 +Vì vậy, hãy thử đi. + +53 +00:02:28,512 --> 00:02:33,480 +Việc sửa đổi hàm is_leap của chúng tôi khá dễ dàng, nếu ban đầu nó cho biết + +54 +00:02:33,480 --> 00:02:36,030 +bản in là năm nhuận thì chúng tôi chỉ + +55 +00:02:36,030 --> 00:02:39,690 +trả về "Đúng", nếu không chúng tôi trả về "Sai". + +56 +00:02:39,690 --> 00:02:42,780 +Và điều này rất hữu ích vì khi đó chúng ta có thể sử dụng + +57 +00:02:42,780 --> 00:02:46,410 +hàm này bên trong hàm khác của mình, Days_in_month. + +58 +00:02:46,410 --> 00:02:48,210 +Và bạn biết rằng chúng ta có thể gọi + +59 +00:02:48,210 --> 00:02:50,100 +một hàm từ bên trong một hàm khác. + +60 +00:02:50,100 --> 00:02:51,150 +Nó đang thiết lập + +61 +00:02:51,150 --> 00:02:54,540 +để giúp chúng ta viết hàm day_in_month. + +62 +00:02:54,540 --> 00:02:56,310 +Bây giờ phần đầu tiên chúng + +63 +00:02:56,310 --> 00:03:01,310 +ta cần sửa đổi cho hàm Days_in_month này là các tham số đầu vào. + +64 +00:03:01,590 --> 00:03:05,400 +Lưu ý rằng ở dòng 22, nơi chúng ta có ngày và tháng gọi + +65 +00:03:05,400 --> 00:03:08,790 +hàm đó, chúng ta cung cấp năm đầu tiên, sau đó là + +66 +00:03:08,790 --> 00:03:09,623 +tháng. + +67 +00:03:09,623 --> 00:03:13,110 +Vì vậy, chúng ta nên tôn trọng điều đó khi viết hàm + +68 +00:03:13,110 --> 00:03:16,800 +của mình để nó thực sự khớp với dữ liệu đầu vào. + +69 +00:03:16,800 --> 00:03:20,070 +Cách chúng ta xác định một hàm có đầu vào là "def", + +70 +00:03:20,070 --> 00:03:21,690 +tên của hàm và bên trong + +71 +00:03:21,690 --> 00:03:25,833 +dấu ngoặc đơn là tên của các tham số đầu vào. + +72 +00:03:27,330 --> 00:03:32,250 +Tiếp theo, chúng ta sẽ kiểm tra xem tháng đến thông qua + +73 +00:03:32,250 --> 00:03:36,000 +đầu vào của hàm này có bằng 2 hay không và + +74 +00:03:36,000 --> 00:03:40,710 +nếu chúng ta chuyển năm được đưa vào hàm thì sẽ tình + +75 +00:03:40,710 --> 00:03:43,350 +cờ đi qua hàm is_leap đó và trả + +76 +00:03:43,350 --> 00:03:45,600 +về giá trị Đúng . + +77 +00:03:45,600 --> 00:03:47,910 +Vì vậy, nếu cả hai điều kiện này đều + +78 +00:03:47,910 --> 00:03:51,660 +đúng thì điều đó có nghĩa là người dùng đang kiểm tra năm + +79 +00:03:51,660 --> 00:03:54,600 +nhuận và họ muốn biết số ngày trong tháng 2, + +80 +00:03:54,600 --> 00:03:57,840 +trong trường hợp đó chúng tôi trả về 29 ngày. + +81 +00:03:57,840 --> 00:04:02,460 +Bạn phải tưởng tượng rằng trên dòng 15 sau và, điều + +82 +00:04:02,460 --> 00:04:06,600 +xảy ra là dữ liệu đầu vào ở dòng 13, năm, sau + +83 +00:04:06,600 --> 00:04:09,210 +đó chúng ta lấy năm đó và chuyển + +84 +00:04:09,210 --> 00:04:13,980 +nó vào hàm is_leap trên dòng 15, nó sẽ trải qua tất + +85 +00:04:13,980 --> 00:04:15,990 +cả trong hàm is_leap + +86 +00:04:15,990 --> 00:04:19,290 +và sau đó tại một thời điểm nào đó nó + +87 +00:04:19,290 --> 00:04:23,100 +sẽ trả về một giá trị có thể là Đúng hoặc Sai + +88 +00:04:23,100 --> 00:04:25,110 +và Đúng hoặc Sai sẽ thay + +89 +00:04:25,110 --> 00:04:30,110 +thế phần năm is_leap ở dòng 15. + +90 +00:04:30,330 --> 00:04:31,650 +Và cuối cùng chúng ta + +91 +00:04:31,650 --> 00:04:33,450 +có một câu lệnh if để kiểm tra + +92 +00:04:33,450 --> 00:04:37,770 +xem cả hai vế có đúng giữa "và" hay không, phần đầu tiên của điều + +93 +00:04:37,770 --> 00:04:39,870 +kiện cũng đúng và sau "và", nó cũng + +94 +00:04:39,870 --> 00:04:43,833 +đúng trong trường hợp đó chúng ta sẽ trả về 29. + +95 +00:04:45,450 --> 00:04:46,980 +Bây giờ, bước tiếp theo là, + +96 +00:04:46,980 --> 00:04:50,610 +nếu người dùng không kiểm tra ngày tháng 2 của năm nhuận thì + +97 +00:04:50,610 --> 00:04:54,120 +chúng ta có thể chỉ cần sử dụng danh sách đó, nơi chúng ta có + +98 +00:04:54,120 --> 00:04:58,710 +số ngày trong một tháng, tháng_ngày và chúng ta chuyển vào chỉ mục. + +99 +00:04:58,710 --> 00:05:01,440 +Vì vậy, hãy chú ý cách sắp xếp tháng_ngày + +100 +00:05:01,440 --> 00:05:04,260 +từ tháng 1 cho đến tháng 12, từ 1 đến 12, nhưng + +101 +00:05:04,260 --> 00:05:06,630 +tất nhiên, vì chúng ta đang làm việc + +102 +00:05:06,630 --> 00:05:09,178 +với một danh sách trong Python nên nó + +103 +00:05:09,178 --> 00:05:11,610 +bắt đầu bằng chỉ mục 0. + +104 +00:05:11,610 --> 00:05:15,180 +Vậy 31 ở vị trí 0. + +105 +00:05:15,180 --> 00:05:16,500 +Tháng được đưa vào làm + +106 +00:05:16,500 --> 00:05:20,010 +dữ liệu đầu vào sẽ bắt đầu từ ngày 1 cho đến ngày 12. + +107 +00:05:20,010 --> 00:05:23,130 +Vì vậy, chúng ta cần trừ 1 tháng đầu + +108 +00:05:23,130 --> 00:05:26,970 +vào để có cùng tần số với chỉ mục cho danh + +109 +00:05:26,970 --> 00:05:28,530 +sách Python. + +110 +00:05:28,530 --> 00:05:30,750 +Và sau đó chúng ta có thể chỉ cần sử + +111 +00:05:30,750 --> 00:05:34,050 +dụng nó làm chỉ mục bên trong dấu ngoặc vuông để truy + +112 +00:05:34,050 --> 00:05:37,413 +cập số ngày trong tháng đó và trả về làm đầu ra. + +113 +00:05:38,610 --> 00:05:41,670 +Có nhiều cách mà chương trình này có thể thất bại + +114 +00:05:41,670 --> 00:05:44,580 +và một trong những cách đó là nếu người dùng nhập + +115 +00:05:44,580 --> 00:05:47,250 +một tháng vượt quá 12, nếu họ đặt vào tháng + +116 +00:05:47,250 --> 00:05:50,790 +43, điều này rõ ràng là không tồn tại và chúng tôi chỉ có + +117 +00:05:50,790 --> 00:05:54,510 +12 giá trị trong tháng của mình danh sách ngày. + +118 +00:05:54,510 --> 00:05:56,940 +Vì vậy, bạn cũng có thể thêm séc và số dư cho + +119 +00:05:56,940 --> 00:06:00,510 +những thứ này cũng như nhiều trường hợp đặc biệt khác. + +120 +00:06:00,510 --> 00:06:01,492 +Nhưng để đơn giản, + +121 +00:06:01,492 --> 00:06:04,140 +chúng ta vừa giải quyết được nhiệm vụ chính trong + +122 +00:06:04,140 --> 00:06:06,510 +chương trình của mình và hy vọng bạn đã hoàn + +123 +00:06:06,510 --> 00:06:09,180 +thành được khá nhiều việc ở đó. + +124 +00:06:09,180 --> 00:06:11,640 +Nếu không, vui lòng quay lại mã của bạn, chỉnh + +125 +00:06:11,640 --> 00:06:14,733 +sửa nó và đảm bảo rằng nó hoạt động theo cách bạn muốn. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/005 Docstrings.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/005 Docstrings.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0c5921affa2d88b875fa3c5112ef42cc516602fd --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/005 Docstrings.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3afd6e359e0b62b8546f07368da71114b3928de8c7a5467774a13543f5929b6 +size 14808510 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/005 Docstrings_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/005 Docstrings_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8ff07f5affeb7bcf7deaf2b8a6a423ab41dff6ab --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/005 Docstrings_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,090 --> 00:00:00,780 +Xin chào + +2 +00:00:00,780 --> 00:00:05,780 +các bạn, tôi muốn nhanh chóng dành vài phút để nói về một khái niệm trong Python được + +3 +00:00:05,939 --> 00:00:06,780 +gọi là Docstrings. + +4 +00:00:07,410 --> 00:00:12,410 +Docstrings về cơ bản là một cách để chúng ta tạo ra các tài liệu nhỏ khi chúng ta đang viết + +5 +00:00:12,780 --> 00:00:16,680 +mã trong các chức năng của mình hoặc trong các khối mã khác của chúng ta. + +6 +00:00:17,490 --> 00:00:20,970 +Bây giờ, trước đây, chúng ta đã thấy rằng khi chúng ta sử + +7 +00:00:20,970 --> 00:00:25,740 +dụng các hàm khác như những hàm đã sẵn sàng tìm thấy bằng Python, chẳng hạn như hàm độ + +8 +00:00:26,070 --> 00:00:29,310 +dài, bạn có thể thấy rằng ngay khi tôi mở dấu + +9 +00:00:29,640 --> 00:00:34,170 +ngoặc đơn, tôi có thể thấy phần nhỏ này tài liệu cho tôi biết chức năng này thực + +10 +00:00:34,170 --> 00:00:38,370 +sự sẽ làm gì, cụ thể là trả về số lượng mục trong một vùng chứa. + +11 +00:00:39,000 --> 00:00:43,500 +Vậy làm thế nào chúng ta có thể tạo cùng một loại tài liệu cho các + +12 +00:00:43,500 --> 00:00:46,590 +hàm mà chúng ta viết? Chúng tôi sẽ làm điều đó bằng cách sử dụng docstrings. + +13 +00:00:46,980 --> 00:00:51,570 +Docstring phải là dòng đầu tiên sau khai báo. + +14 +00:00:51,900 --> 00:00:55,590 +Vì vậy, ở đây chúng tôi đã xác định tên của hàm, + +15 +00:00:55,800 --> 00:01:00,420 +các đầu vào và sau dấu hai chấm, dòng đầu tiên được thụt lề sẽ là docstring. + +16 +00:01:00,810 --> 00:01:01,590 +Nhưng không phải vậy đâu. + +17 +00:01:01,590 --> 00:01:06,590 +Bạn cũng phải sử dụng ba trong số các dấu ngoặc kép này và chính giữa ba dấu + +18 +00:01:08,460 --> 00:01:11,550 +ngoặc kép này, bạn có thể viết tài liệu của mình. + +19 +00:01:12,510 --> 00:01:14,820 +Chúng ta có thể viết một cái gì đó như, tốt, hàm + +20 +00:01:14,820 --> 00:01:16,260 +format_ name này sẽ làm gì? + +21 +00:01:16,290 --> 00:01:21,290 +Chúng ta muốn bản thân trong tương lai của mình hoặc một người dùng khác đang sử dụng chức năng này biết điều gì + +22 +00:01:21,300 --> 00:01:22,530 +về nó? + +23 +00:01:22,530 --> 00:01:27,530 +Nó sẽ lấy họ và tên và định + +24 +00:01:29,360 --> 00:01:30,193 +dạng, nó. + +25 +00:01:33,110 --> 00:01:34,730 +Lưu ý rằng với docstrings, bạn + +26 +00:01:34,820 --> 00:01:39,440 +thực sự có thể viết các chuỗi có nhiều dòng. Thông thường, nếu tôi tạo một + +27 +00:01:39,440 --> 00:01:42,620 +chuỗi bình thường, giả sử, tôi không biết, + +28 +00:01:42,710 --> 00:01:44,530 +a = "A String". + +29 +00:01:46,370 --> 00:01:47,720 +Nếu tôi nhấn phím enter, + +30 +00:01:47,780 --> 00:01:51,770 +tôi sẽ nhận được cảnh báo vì nó sẽ diễn giải đây là phần cuối + +31 +00:01:51,770 --> 00:01:52,603 +của dòng này. + +32 +00:01:53,090 --> 00:01:57,920 +Và nó sẽ không thấy dấu ngoặc kép đóng này là một phần của chuỗi này. + +33 +00:01:58,670 --> 00:02:03,080 +Nhưng khi chúng ta sử dụng một chuỗi tài liệu, chúng ta có thể viết bao nhiêu + +34 +00:02:03,380 --> 00:02:07,220 +dòng tùy thích và nó sẽ được hiểu tất cả như một thứ hoàn toàn + +35 +00:02:07,490 --> 00:02:11,210 +giống nhau, như thể nó được lắp vào cùng một dòng như thế này. + +36 +00:02:12,470 --> 00:02:17,330 +Bây giờ chúng tôi đã thêm chuỗi tài liệu của mình, đã đến lúc xem nó trông như thế nào. Bây giờ, nếu tôi gọi hàm này + +37 +00:02:17,330 --> 00:02:21,590 +là format_name và tôi mở dấu ngoặc đơn, bạn có thể thấy rằng + +38 +00:02:21,890 --> 00:02:26,890 +văn bản chúng ta đã viết ở đây hiện đã được điền vào tài liệu. + +39 +00:02:27,650 --> 00:02:31,430 +Nó lấy họ và tên và định dạng nó để trả về phiên bản chữ + +40 +00:02:31,430 --> 00:02:32,690 +hoa tiêu đề của tên. + +41 +00:02:33,650 --> 00:02:37,850 +Vì vậy, đây là một cách để bạn có thể bắt đầu ghi lại các chức năng của mình + +42 +00:02:37,850 --> 00:02:40,460 +và cung cấp cho mỗi chức năng một chút giải thích. + +43 +00:02:41,120 --> 00:02:46,120 +Bây giờ bạn cũng có thể sử dụng nó như một bình luận nhiều dòng. + +44 +00:02:46,460 --> 00:02:49,700 +Vì vậy, hãy chú ý làm thế nào khi chúng ta viết một bình luận và chúng ta chuyển sang dòng + +45 +00:02:49,760 --> 00:02:50,900 +tiếp theo, nó lại trở thành mã. + +46 +00:02:51,470 --> 00:02:54,860 +Bây giờ trên thực tế, bạn có thể sử dụng một cái gì đó như + +47 +00:02:55,190 --> 00:02:58,850 +thế này, nơi bạn chỉ cần bình luận bao nhiêu dòng tùy thích và điều này + +48 +00:02:59,140 --> 00:03:02,050 +sẽ được hiểu là một bình luận miễn là nó không được + +49 +00:03:02,350 --> 00:03:05,500 +gán cho bất cứ điều gì. Vì vậy, ví dụ, nếu + +50 +00:03:05,500 --> 00:03:06,820 +tôi tạo một biến + +51 +00:03:07,150 --> 00:03:11,290 +thì đây bây giờ là một đoạn mã. Bởi vì có một chút khó hiểu, hướng + +52 +00:03:11,320 --> 00:03:15,700 +dẫn Python chính thức thực sự là để tránh các nhận xét nhiều dòng như thế này. + +53 +00:03:15,910 --> 00:03:20,910 +Điều thực sự dễ dàng hơn nhiều là chỉ cần viết nhận xét nhiều dòng của bạn, sau đó đánh + +54 +00:03:21,760 --> 00:03:26,380 +dấu tất cả và sau đó nhấn lệnh + dấu gạch chéo hoặc điều khiển + dấu gạch + +55 +00:03:26,380 --> 00:03:27,370 +chéo trên Windows. + +56 +00:03:28,030 --> 00:03:32,350 +Đó là một cách tốt hơn nhiều để phân biệt nhận xét với các đoạn mã + +57 +00:03:32,350 --> 00:03:33,183 +thực tế. + +58 +00:03:33,730 --> 00:03:38,710 +Hãy thử thêm docstrings vào các hàm khác mà bạn đã tạo và thấy nó hiển thị + +59 +00:03:38,710 --> 00:03:41,110 +khi bạn gọi các hàm của mình. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/006 Functions Quiz.html b/part1/10 - Day 10 - Beginner - Functions with Outputs/006 Functions Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..6ddcc793626f4cde07db23d91c569d240fd54d7b --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/006 Functions Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Calculator Part 1 Combining Dictionaries and Functions.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Calculator Part 1 Combining Dictionaries and Functions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1d6c852f0fba7c8fba86a35c75eadda56b589693 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Calculator Part 1 Combining Dictionaries and Functions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ebfd0dee3cfa263223e6ac956b2078186d6cfc79d2785a05572c88dd91ad96a +size 38919694 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Calculator Part 1 Combining Dictionaries and Functions_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Calculator Part 1 Combining Dictionaries and Functions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..840d5fdc00eaf17fb0246e3319da48f9e58c892d --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Calculator Part 1 Combining Dictionaries and Functions_vi.srt @@ -0,0 +1,512 @@ +1 +00:00:00,150 --> 00:00:03,630 +Vì vậy, bây giờ chúng tôi đã sẵn sàng giải quyết dự án cuối cùng của + +2 +00:00:03,900 --> 00:00:06,900 +mình trong ngày và đó là xây dựng một chương trình máy tính. + +3 +00:00:07,950 --> 00:00:12,150 +Nếu bạn đi đến máy tính-cuối cùng. nhà máy bia. repl. chạy, bạn sẽ thấy + +4 +00:00:12,450 --> 00:00:14,610 +dự án cuối cùng hoạt động như thế nào. + +5 +00:00:15,240 --> 00:00:20,240 +Chúng ta phải nhập một số và sau đó chọn một phép toán, sau đó chọn số tiếp theo + +6 +00:00:21,360 --> 00:00:25,500 +và nó sẽ tính toán kết quả. Bây giờ, tại thời điểm này, + +7 +00:00:25,800 --> 00:00:26,550 +chúng + +8 +00:00:26,550 --> 00:00:30,900 +ta có thể tiếp tục tính toán với kết quả từ bước trước. + +9 +00:00:30,960 --> 00:00:34,860 +Vì vậy, hãy nhân nó với hai, cách khác, tôi có thể gõ + +10 +00:00:34,890 --> 00:00:39,240 +N và điều đó sẽ xóa màn hình và cho phép tôi bắt đầu một + +11 +00:00:39,240 --> 00:00:40,170 +phép tính mới, giống + +12 +00:00:42,990 --> 00:00:44,760 +như vậy. Bây giờ, bởi vì + +13 +00:00:44,790 --> 00:00:48,570 +rất nhiều khái niệm được đề cập trong dự án này thực sự khá + +14 +00:00:48,570 --> 00:00:49,440 +khó khăn, + +15 +00:00:49,830 --> 00:00:53,850 +tôi muốn cùng nhau vượt qua dự án này và trong khi chúng tôi đang xây + +16 +00:00:53,910 --> 00:00:58,910 +dựng nó, cũng có rất nhiều thách thức nhỏ trên con đường mà tôi muốn bạn để giải quyết. + +17 +00:00:59,700 --> 00:01:04,379 +Khi bạn đã sẵn sàng, hãy chuyển đến tệp bắt đầu của máy tính và phân tách bản + +18 +00:01:04,379 --> 00:01:06,210 +sao của riêng bạn để bắt đầu. + +19 +00:01:06,380 --> 00:01:07,213 +1: Đúng không? + +20 +00:01:09,170 --> 00:01:13,520 +0: Máy tính này sẽ có một số chức năng khác nhau mà nó có thể thực hiện. + +21 +00:01:13,670 --> 00:01:17,270 +Vì vậy, ví dụ, nó sẽ bắt đầu với một + +22 +00:01:17,720 --> 00:01:20,960 +hàm thêm, lấy hai đầu vào và n1 và + +23 +00:01:21,440 --> 00:01:26,030 +n2, và sau đó nó chỉ đơn giản là trả về n1 + n2. + +24 +00:01:26,900 --> 00:01:29,930 +Điều này khá đơn giản. Đây là tất cả những + +25 +00:01:29,930 --> 00:01:33,920 +gì có trong chức năng thêm, lấy một số và thêm vào số kia. + +26 +00:01:34,550 --> 00:01:39,550 +Và tôi muốn bạn tiếp tục tạo các hàm ở định dạng tương tự cho + +27 +00:01:41,360 --> 00:01:45,620 +các phép toán khác này. Vì vậy, + +28 +00:01:45,770 --> 00:01:50,720 +trừ, nhân và chia. Tạm dừng video và hoàn thành thử thách này. + +29 +00:01:51,860 --> 00:01:52,693 +1: Đúng không? + +30 +00:01:54,800 --> 00:01:58,430 +0: Được rồi. Vì vậy, trừ cũng đơn giản như cộng. + +31 +00:01:58,490 --> 00:02:02,420 +Vì vậy, chúng tôi sẽ chỉ gọi nó là trừ. Chúng tôi chuyển lại + +32 +00:02:02,480 --> 00:02:04,550 +hai số, n1 và n2, + +33 +00:02:05,090 --> 00:02:09,530 +và chúng tôi sẽ trả về kết quả là n1 - n2. + +34 +00:02:11,330 --> 00:02:16,310 +Và vì thời gian, tôi sẽ sao chép và dán những thứ này cho hai phần + +35 +00:02:16,610 --> 00:02:20,540 +cuối cùng và tôi sẽ đổi tên chúng thành nhân và chia. + +36 +00:02:20,900 --> 00:02:23,330 +Và sau đó khi các số được nhân lên, + +37 +00:02:23,360 --> 00:02:27,860 +chúng ta sử dụng dấu hoa thị và số bị chia chúng ta sử dụng dấu gạch chéo. + +38 +00:02:28,430 --> 00:02:33,380 +Vì vậy, bây giờ chúng ta có bốn chức năng; cộng, trừ, nhân và chia. + +39 +00:02:34,040 --> 00:02:39,040 +Và những gì chúng tôi muốn làm là chúng tôi muốn bằng cách nào đó lưu trữ các hàm + +40 +00:02:39,770 --> 00:02:43,130 +này bên trong một từ điển. Đây là một thách thức khác dành cho bạn. + +41 +00:02:43,520 --> 00:02:47,870 +Bạn có thể tạo một từ điển trong đó các phím là mỗi + +42 +00:02:47,960 --> 00:02:52,960 +ký hiệu mà chúng ta đã sử dụng để cộng hoặc trừ hoặc nhân, và + +43 +00:02:53,990 --> 00:02:57,200 +các giá trị chỉ là tên của các hàm. + +44 +00:02:57,440 --> 00:03:00,100 +Vì vậy, hãy tạm dừng video và thử ngay bây giờ. + +45 +00:03:02,230 --> 00:03:06,760 +Được rồi, hãy tiếp tục và tạo từ điển này. Tất nhiên, bây giờ chúng ta bắt đầu + +46 +00:03:06,790 --> 00:03:10,390 +với một tập hợp các dấu ngoặc nhọn và như tôi đã + +47 +00:03:10,690 --> 00:03:15,690 +đề cập, mỗi phím sẽ là các ký hiệu cho các phép toán và các giá trị + +48 +00:03:16,150 --> 00:03:20,140 +sẽ là tên của các hàm. Vì vậy, chúng ta có + +49 +00:03:20,980 --> 00:03:24,820 +cộng, và sau đó chúng ta có trừ, + +50 +00:03:24,910 --> 00:03:28,720 +nhân và chia. Vì vậy, bây giờ chúng ta có từ + +51 +00:03:28,750 --> 00:03:33,010 +điển này, hãy tiếp tục và lưu nó bên trong một biến có tên là các phép toán. + +52 +00:03:33,700 --> 00:03:38,700 +Bây giờ từ điển này sẽ hoạt động như một phương tiện mà chúng ta + +53 +00:03:40,480 --> 00:03:43,870 +sẽ gọi các hàm này. Tại một số điểm ở + +54 +00:03:44,200 --> 00:03:49,200 +dưới đây, chúng ta muốn có thể khai thác các hoạt động và sau đó chuyển vào khóa + +55 +00:03:49,510 --> 00:03:51,670 +mà chúng ta muốn, vì vậy, ví + +56 +00:03:52,270 --> 00:03:56,620 +dụ như nhân lên, rồi lưu trữ nó dưới dạng hàm mà chúng ta muốn. + +57 +00:03:57,340 --> 00:04:02,110 +Điều đó có nghĩa là sau đó chúng ta có thể gọi hàm này và sau đó chuyển vào một số và một số + +58 +00:04:02,110 --> 00:04:02,950 +thứ hai và + +59 +00:04:03,430 --> 00:04:07,480 +hàm này hiện sẽ hoạt động như một hàm nhân. Bây giờ, nếu chúng ta thay + +60 +00:04:07,480 --> 00:04:08,950 +đổi nó thành + +61 +00:04:09,220 --> 00:04:13,090 +dấu cộng, thì hàm này sẽ hoạt động như một hàm thêm. + +62 +00:04:14,350 --> 00:04:17,800 +Vì vậy, bây giờ điều tiếp theo chúng ta sẽ làm là chúng ta sẽ + +63 +00:04:17,800 --> 00:04:18,820 +tạo một biến có + +64 +00:04:19,690 --> 00:04:23,290 +tên là num1, nơi chúng ta yêu cầu người dùng nhập một đầu vào để cho + +65 +00:04:23,350 --> 00:04:24,880 +biết số đầu tiên là gì. + +66 +00:04:25,780 --> 00:04:30,160 +Và tất nhiên có số phải được chuyển đổi thành một số nguyên. + +67 +00:04:31,180 --> 00:04:35,230 +Bây giờ, điều tiếp theo cần làm là yêu cầu họ cho con số thứ + +68 +00:04:35,260 --> 00:04:38,770 +hai, vì vậy điều này sẽ khá giống với dòng mã này, + +69 +00:04:39,340 --> 00:04:42,640 +khác với từ thứ hai. Bây giờ, điều tiếp theo là + +70 +00:04:42,640 --> 00:04:47,200 +chúng tôi muốn hỏi họ muốn thực hiện thao tác nào trong số những thao tác này. + +71 +00:04:47,800 --> 00:04:48,670 +Đầu tiên, chúng + +72 +00:04:48,760 --> 00:04:53,760 +tôi muốn có thể lặp lại từ điển này và in ra từng khóa trong số các + +73 +00:04:54,670 --> 00:04:55,503 +khóa này. + +74 +00:04:55,840 --> 00:05:00,070 +Và sau đó chúng tôi sẽ yêu cầu người dùng gõ một trong số chúng để chúng tôi + +75 +00:05:00,070 --> 00:05:03,130 +có thể tìm ra thao tác họ thực sự muốn thực hiện. + +76 +00:05:03,790 --> 00:05:06,130 +Hãy tiếp tục và cố gắng sử + +77 +00:05:06,340 --> 00:05:11,320 +dụng vòng lặp for để lặp qua từ điển các phép toán này và in + +78 +00:05:11,590 --> 00:05:16,120 +ra từng ký hiệu này. Được rồi, bây giờ chúng ta sẽ sử dụng + +79 +00:05:16,180 --> 00:05:17,860 +vòng lặp for và chúng ta + +80 +00:05:17,920 --> 00:05:20,890 +biết rằng khi chúng ta sử dụng vòng lặp bốn với từ + +81 +00:05:21,130 --> 00:05:26,130 +điển, nó sẽ lặp qua tất cả các khóa chứ không phải các giá trị hoặc các mục thực tế. + +82 +00:05:27,010 --> 00:05:32,010 +Chúng ta có thể nói với mỗi ký hiệu trong các thao tác từ điển, hãy tiếp + +83 +00:05:35,080 --> 00:05:39,970 +tục và in ra ký hiệu đó. Và hiện tại nếu tôi chạy đoạn mã này, bạn + +84 +00:05:39,970 --> 00:05:43,600 +sẽ thấy rằng nó sẽ yêu cầu chúng tôi cung cấp số đầu tiên, số + +85 +00:05:43,930 --> 00:05:44,950 +thứ hai, sau đó + +86 +00:05:45,250 --> 00:05:48,550 +nó sẽ lặp lại danh sách đó và sau đó in ra tất cả + +87 +00:05:48,550 --> 00:05:49,390 +các thao tác. + +88 +00:05:49,810 --> 00:05:54,810 +Vì vậy, bây giờ chúng tôi đã sẵn sàng để tiếp tục và yêu cầu họ cho một biểu tượng hoạt động. Chọn và thao tác từ + +89 +00:05:56,200 --> 00:05:58,010 +dòng trên. + +90 +00:05:58,100 --> 00:06:03,100 +Vì vậy, họ sẽ thấy tất cả các phím này và sau đó họ + +91 +00:06:03,530 --> 00:06:08,150 +chọn một thao tác như vậy. Và biểu tượng đó bây giờ sẽ được lưu trong biến này. + +92 +00:06:08,840 --> 00:06:13,840 +Vì vậy, bây giờ chúng ta có thể tiếp tục và lấy biểu tượng hoạt động đó để chọn ra giá + +93 +00:06:16,040 --> 00:06:19,340 +trị được liên kết với nó. Ví dụ, nếu trong trường + +94 +00:06:19,400 --> 00:06:21,890 +hợp này người dùng chọn biểu tượng dấu + +95 +00:06:22,340 --> 00:06:24,950 +cộng, thì chúng tôi sẽ chọn chức năng thêm. + +96 +00:06:25,580 --> 00:06:27,800 +Và sau đó, giống như tôi đã chỉ cho bạn + +97 +00:06:27,860 --> 00:06:31,850 +trước đây, chúng tôi muốn sử dụng chức năng thêm đó để cộng hai số này lại với nhau. + +98 +00:06:32,360 --> 00:06:32,960 +Nhưng + +99 +00:06:32,960 --> 00:06:36,890 +tất nhiên, nếu họ chọn một biểu tượng khác thì chúng tôi + +100 +00:06:36,950 --> 00:06:41,950 +muốn có thể thực hiện thao tác khác. Xem liệu bạn có thể làm cho máy + +101 +00:06:43,850 --> 00:06:47,750 +tính này hoạt động hay không để chúng tôi có thể in ra + +102 +00:06:48,320 --> 00:06:53,180 +num1, sau đó là ký hiệu phép toán, sau đó là num2, cuối cùng là dấu + +103 +00:06:53,570 --> 00:06:58,570 +bằng và sau đó là câu trả lời. Xem liệu bạn có thể làm cho dòng mã này hoạt động hay + +104 +00:07:00,740 --> 00:07:04,700 +không và đảm bảo rằng nó hoạt động bất cứ khi nào bạn chọn bất kỳ thao tác nào trong số này + +105 +00:07:05,150 --> 00:07:08,150 +và nó sẽ tính toán nó bằng cách sử dụng những con số mà bạn nhập vào. + +106 +00:07:08,570 --> 00:07:09,470 +Tạm dừng video ngay bây giờ. + +107 +00:07:12,530 --> 00:07:12,940 +Được rồi. + +108 +00:07:12,940 --> 00:07:17,940 +Điều đầu tiên chúng ta cần làm là nắm giữ hàm tính toán và điều này sẽ được + +109 +00:07:19,210 --> 00:07:22,390 +thực hiện bằng cách sử dụng biểu tượng hoạt động. + +110 +00:07:22,780 --> 00:07:26,590 +Vì vậy, chúng tôi sẽ khai thác từ điển hoạt động của chúng tôi ở đây, và + +111 +00:07:27,070 --> 00:07:29,710 +sau đó chúng tôi sẽ sử dụng dấu ngoặc vuông để chuyển + +112 +00:07:30,040 --> 00:07:31,360 +vào biểu tượng hoạt động. + +113 +00:07:31,810 --> 00:07:36,810 +Bây giờ chúng ta có thể sử dụng hàm tính toán này như thể nó là bất kỳ hàm nào trong số các hàm này. + +114 +00:07:38,740 --> 00:07:41,650 +Và đó là tất nhiên, dựa trên sự lựa chọn của người dùng ở đây. + +115 +00:07:42,280 --> 00:07:47,280 +Vì vậy, bây giờ chúng ta có thể nói hàm tính toán và chúng ta có thể truyền num1 + +116 +00:07:47,830 --> 00:07:50,860 +làm đầu vào đầu tiên, num2 làm đầu vào thứ hai. + +117 +00:07:51,370 --> 00:07:55,060 +Và tất nhiên hàm của chúng ta đều có giá trị trả về. + +118 +00:07:55,480 --> 00:08:00,430 +Và vì vậy phần này sẽ được thay thế khi mã chạy với + +119 +00:08:00,430 --> 00:08:04,870 +câu trả lời thực tế. Vì vậy, bây giờ chúng ta có thể lưu nó bên trong + +120 +00:08:05,290 --> 00:08:09,520 +một biến có tên là answer, sau đó biến đó sẽ được gửi đến đây và bây giờ chúng ta có thể kiểm tra nó. + +121 +00:08:10,420 --> 00:08:13,360 +Vì vậy, chúng ta hãy thử thêm ba cộng năm. + +122 +00:08:13,870 --> 00:08:17,710 +Vì vậy, tôi sẽ sử dụng biểu tượng thêm và chúng tôi kết thúc + +123 +00:08:17,710 --> 00:08:21,010 +với ba cộng năm bằng tám. Bây giờ những gì về một cái gì đó phức tạp hơn một chút? + +124 +00:08:21,190 --> 00:08:25,930 +Uhm, 45, 78 và chúng tôi sẽ chọn nhân. + +125 +00:08:26,830 --> 00:08:30,790 +Bây giờ, tôi nghĩ trên thực tế, việc đặt num2 sau khi người dùng nhập + +126 +00:08:31,150 --> 00:08:35,710 +biểu tượng thao tác thực sự có ý nghĩa hơn để bạn thực sự có được trải + +127 +00:08:35,710 --> 00:08:40,240 +nghiệm người dùng tốt hơn như thế này. Bạn có thể chọn số đầu + +128 +00:08:40,450 --> 00:08:43,570 +tiên, chọn thao tác, sau đó chọn số thứ hai. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Starting-Code-for-the-Calculator-on-Repl.it.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Starting-Code-for-the-Calculator-on-Repl.it.url new file mode 100644 index 0000000000000000000000000000000000000000..b5d651b35059dea5dcf99f66dc2a6b4fef0765bc --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/007 Starting-Code-for-the-Calculator-on-Repl.it.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/calculator-start#main.py \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Debugging-Solution.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Debugging-Solution.url new file mode 100644 index 0000000000000000000000000000000000000000..1bab294d07f13612a2d2643f9ffd55d9cc53516c --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Debugging-Solution.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/calculator-debug-solution \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Print vs. Return.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Print vs. Return.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0a497411456532b27977f365476263a5f8c13f01 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Print vs. Return.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff4dcece6622a0399eaecdf4b93c3015837fba1034e3fdea9586a3ce6889306a +size 31302748 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Print vs. Return_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Print vs. Return_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..248efaf32ae8dcb21160e1e294dad584c6d469c9 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/008 Print vs. Return_vi.srt @@ -0,0 +1,200 @@ +1 +00:00:00,390 --> 00:00:06,780 +Chúng tôi đã quản lý để máy tính của mình hoạt động. Nhưng trong bài học này, tôi muốn nói về một thứ khác. + +2 +00:00:07,200 --> 00:00:15,540 +Tôi muốn nói về sự khác biệt giữa việc in thứ gì đó vào bảng điều khiển ở đây so với việc trả lại thứ gì đó dưới + +3 +00:00:15,540 --> 00:00:22,020 +dạng kết quả đầu ra từ một hàm, bởi vì nhiều sinh viên rất bối rối trong giai đoạn này và + +4 +00:00:22,020 --> 00:00:27,440 +họ nghĩ, tốt, tại sao mình không in cái này kết quả thay vì trả lại nó? + +5 +00:00:27,750 --> 00:00:31,500 +Sự khác biệt thực tế là gì và tại sao tôi sử dụng lợi nhuận? + +6 +00:00:32,220 --> 00:00:34,440 +Đó là điều tôi muốn đề cập trong bài học này. + +7 +00:00:35,850 --> 00:00:43,050 +Hiện tại, chúng tôi có bốn chức năng này và khi chúng tôi gọi nó, chúng tôi chuyển một số đầu vào và sau đó khi + +8 +00:00:43,050 --> 00:00:48,100 +chúng tôi nắm được đầu ra, chúng tôi tiếp tục và in nó ra bảng điều khiển. + +9 +00:00:48,780 --> 00:00:54,660 +Bây giờ, trong trạng thái hiện tại của máy tính, thật khó để thấy sự khác biệt giữa bản in và + +10 +00:00:54,660 --> 00:00:55,280 +kết quả. + +11 +00:00:55,860 --> 00:00:57,090 +Nhưng đây là một câu hỏi. + +12 +00:00:57,510 --> 00:01:04,110 +Điều gì sẽ xảy ra nếu chúng ta muốn lấy đầu ra từ việc gọi hàm này và thay vì chỉ lưu trữ nó + +13 +00:01:04,110 --> 00:01:11,560 +bên trong một biến và sau đó in nó ra, điều gì sẽ xảy ra nếu chúng ta muốn chuyển nó làm đầu vào cho một hàm khác? + +14 +00:01:12,150 --> 00:01:18,960 +Hãy nói rằng tại thời điểm này, chúng tôi đã quyết định, bạn biết không, chúng tôi sẽ yêu cầu họ chọn một hoạt động khác. + +15 +00:01:19,500 --> 00:01:22,620 +Và sau đó hãy yêu cầu họ chọn một số khác. + +16 +00:01:23,980 --> 00:01:30,820 +Và cuối cùng, hãy tiếp tục và lấy lại hàm tính toán dựa trên biểu tượng hoạt động + +17 +00:01:30,820 --> 00:01:34,930 +mới mà họ đã chọn. Và sau đó chúng ta sẽ tính + +18 +00:01:35,320 --> 00:01:42,460 +toán câu trả lời mới nhưng lần này, thay vì chuyển qua hàm tính toán, chúng ta sẽ chuyển qua câu trả lời mà chúng + +19 +00:01:42,460 --> 00:01:44,320 +ta nhận được từ bước này. + +20 +00:01:44,740 --> 00:01:47,910 +Vì vậy, num1 bây giờ là câu trả + +21 +00:01:48,490 --> 00:01:53,500 +lời trước đó và số thứ hai sẽ là đầu vào sẽ là num3. + +22 +00:01:54,130 --> 00:02:01,780 +Tại thời điểm này, khi chúng ta đang gọi hàm tính toán này, chúng ta đang chuyển qua các kết quả hoặc đầu ra của hàm tính + +23 +00:02:01,810 --> 00:02:06,000 +toán này và điều đó sẽ xuất hiện ngay tại đây, và sau đó + +24 +00:02:06,370 --> 00:02:10,060 +số thứ ba được chuyển vào như là đầu vào thứ hai. + +25 +00:02:10,509 --> 00:02:16,230 +Điều cơ bản đã xảy ra ở đây là tôi đã lấy đầu ra từ hàm này, vì vậy trên thực + +26 +00:02:16,240 --> 00:02:21,160 +tế, tôi có thể thay thế câu trả lời này bằng đầu ra này và tôi đã + +27 +00:02:21,610 --> 00:02:28,120 +lấy đó làm đầu vào đầu tiên cho hàm tính toán và sau đó num3 làm đầu vào thứ hai và sau đó + +28 +00:02:28,120 --> 00:02:28,600 +sử + +29 +00:02:28,930 --> 00:02:32,350 +dụng tất cả những điều này để có được câu trả lời. + +30 +00:02:33,970 --> 00:02:35,830 +Hãy gọi đây là first_answer + +31 +00:02:36,710 --> 00:02:41,330 +và hãy gọi đây là second_answer chỉ để phân biệt hai câu trả lời. + +32 +00:02:42,390 --> 00:02:48,030 +Và bây giờ tôi sẽ viết một câu lệnh in hơi khác. Trong trường hợp này, phép tính được + +33 +00:02:48,210 --> 00:02:55,530 +thực hiện bằng cách sử dụng first_answer, sau đó là biểu tượng hoạt động và sau đó là num3 đã + +34 +00:02:55,530 --> 00:02:59,490 +được chèn vào thời điểm này để thu được second_answer. + +35 +00:03:00,000 --> 00:03:01,680 +Vì vậy, bây giờ nếu chúng tôi cung cấp cho điều này một chạy. + +36 +00:03:06,180 --> 00:03:14,400 +Hãy làm 3 + 2. Bây giờ, trong bước đầu tiên của phép tính, chúng ta nhận được kết quả là 5. + +37 +00:03:14,820 --> 00:03:19,770 +Vì vậy, bây giờ nếu tôi muốn chọn một phép toán khác, hãy nhân 5 với 3. + +38 +00:03:20,190 --> 00:03:23,190 +Sau đó, tôi sẽ lấy 5 này, là câu trả lời trước, + +39 +00:03:23,470 --> 00:03:28,710 +tôi sẽ nói nhân, và sau đó tôi sẽ cung cấp số tiếp theo, mà chúng tôi sẽ gọi là 3. + +40 +00:03:29,190 --> 00:03:36,000 +Và bây giờ nó lấy câu trả lời trước đó từ bước cuối cùng và đặt nó làm số + +41 +00:03:36,000 --> 00:03:41,760 +đầu tiên trong phép tính, nhân nó với 3 để có câu trả lời cuối cùng. + +42 +00:03:43,080 --> 00:03:50,520 +Trong trường hợp này, những gì tôi có thể làm vì tôi có kết quả đầu ra từ hàm tính toán của mình + +43 +00:03:50,520 --> 00:03:57,360 +ở đây vì mỗi hàm này đều trả về câu trả lời của chúng, tôi có thể lấy kết quả + +44 +00:03:57,360 --> 00:04:06,480 +từ phép tính đó và cắm lại ngay vào một phép tính khác hàm sử dụng kết quả của lệnh gọi hàm đó làm đầu vào cho một + +45 +00:04:06,480 --> 00:04:07,970 +lệnh gọi hàm khác. + +46 +00:04:08,550 --> 00:04:15,270 +Và tôi chỉ có thể làm điều này vì tôi đang sử dụng câu lệnh return và vì tôi có kết quả đầu ra từ các hàm + +47 +00:04:15,270 --> 00:04:15,990 +của mình. + +48 +00:04:16,320 --> 00:04:19,500 +Điều này sẽ không thể thực hiện được nếu tôi đang sử dụng câu lệnh in. + +49 +00:04:28,680 --> 00:04:34,800 +Trong bài học tiếp theo, chúng ta sẽ tổ chức lại mã của chúng ta và giới thiệu một vòng lặp while để chúng ta có thể tiếp + +50 +00:04:34,800 --> 00:04:37,260 +tục thực hiện nhiều phép tính như chúng ta muốn. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/009 While Loops, Flags and Recursion.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/009 While Loops, Flags and Recursion.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5256c7230c3dbbf7645798cd4b09717ee28179af --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/009 While Loops, Flags and Recursion.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e77079ce2f4bacd8b2e150ac7ac886d9aed58b7c44269f00bd66436a8db9f89e +size 110804707 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/009 While Loops, Flags and Recursion_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/009 While Loops, Flags and Recursion_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..08d81c05763c58dd0855a7a0613714b9a1f3bf46 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/009 While Loops, Flags and Recursion_vi.srt @@ -0,0 +1,468 @@ +1 +00:00:00,960 --> 00:00:04,800 +Trong bài học trước, chúng ta có thể sử dụng lại kết quả của phép + +2 +00:00:04,800 --> 00:00:05,633 +tính đầu tiên. + +3 +00:00:06,060 --> 00:00:10,470 +Câu trả lời cho phép tính đầu tiên trở thành đầu vào của chúng tôi cho phép tính tiếp theo, cho phép chúng + +4 +00:00:10,830 --> 00:00:14,370 +tôi xâu chuỗi các phép tính lại với nhau. Tuy nhiên, điều này tạo ra + +5 +00:00:14,400 --> 00:00:16,920 +khá nhiều sự lặp lại trong mã của chúng tôi + +6 +00:00:17,100 --> 00:00:20,520 +và nó giới hạn người dùng của chúng tôi chỉ với hai phép tính. + +7 +00:00:21,690 --> 00:00:25,950 +Hãy cho phép người dùng xâu chuỗi bao nhiêu phép tính mà họ muốn. + +8 +00:00:26,760 --> 00:00:29,100 +Và tôi muốn ném nó cho bạn như một thách thức, + +9 +00:00:29,100 --> 00:00:33,000 +vậy bạn có thể sử dụng vòng lặp while và hàm đầu vào để đạt được điều này không? + +10 +00:00:33,360 --> 00:00:34,040 +Hỏi người + +11 +00:00:34,040 --> 00:00:39,040 +dùng câu hỏi này, gõ 'y' để tiếp tục tính toán với kết quả trước đó hoặc gõ + +12 +00:00:39,630 --> 00:00:40,463 +'n' để thoát. + +13 +00:00:41,700 --> 00:00:45,570 +Nếu người dùng nhập y thì máy tính của bạn sẽ cho phép họ tiếp tục xâu chuỗi + +14 +00:00:45,570 --> 00:00:48,120 +các phép tính với nhau với câu trả lời trước đó. + +15 +00:00:48,780 --> 00:00:52,020 +Nếu họ gõ bất kỳ thứ gì khác, chương trình sẽ thoát ra ngay bây giờ. + +16 +00:00:52,440 --> 00:00:55,500 +Tôi sẽ cho bạn vài giây để tạm dừng video trước khi cho bạn xem kết quả. + +17 +00:00:57,960 --> 00:01:02,520 +Được rồi. Vì vậy, cách dễ nhất để giải quyết vấn đề này là sử dụng vòng lặp while. + +18 +00:01:02,940 --> 00:01:07,620 +Vì vậy, giả sử rằng sau khi chúng tôi yêu cầu số đầu tiên và chúng tôi đã hiển + +19 +00:01:07,620 --> 00:01:10,440 +thị cho họ tất cả các ký hiệu khác nhau mà + +20 +00:01:10,860 --> 00:01:14,130 +họ có thể chọn từ đó, hãy đặt một cờ có tên should_continue. + +21 +00:01:15,990 --> 00:01:18,510 +Và chúng tôi sẽ đặt điều đó thành sự thật. + +22 +00:01:19,500 --> 00:01:24,120 +Sau đó, chúng ta có thể tạo một vòng lặp while và trong khi nó sẽ tiếp tục như đúng, thì + +23 +00:01:24,540 --> 00:01:26,490 +chúng ta sẽ thực hiện những điều này. + +24 +00:01:27,120 --> 00:01:31,500 +Bây giờ chúng tôi muốn thay đổi một số văn bản này để nó có thể tái sử dụng nhiều hơn một chút. + +25 +00:01:31,950 --> 00:01:34,410 +Giả sử chọn một phép + +26 +00:01:35,460 --> 00:01:40,460 +toán và số tiếp theo thay vì số thứ hai là gì. + +27 +00:01:41,220 --> 00:01:45,750 +Vì vậy, bây giờ chúng ta có một số đầu tiên, chúng ta có một phép toán, + +28 +00:01:45,780 --> 00:01:50,610 +chúng ta có một số thứ hai và sau đó chúng ta chọn hàm từ từ điển các phép + +29 +00:01:50,610 --> 00:01:53,400 +toán đó và chúng ta nhận được câu trả lời. + +30 +00:01:53,670 --> 00:01:58,670 +Vì vậy, tôi sẽ thay đổi điều này trở lại thành câu trả lời và chúng tôi đang chuyển + +31 +00:01:59,550 --> 00:02:03,960 +num1 và num2 vào hàm tính toán. Bây giờ, một khi dòng này + +32 +00:02:03,960 --> 00:02:06,120 +đã được in, mọi thứ + +33 +00:02:06,840 --> 00:02:10,199 +xảy ra sau đó là lặp lại khá nhiều. + +34 +00:02:11,160 --> 00:02:16,160 +Và thay vào đó, chúng tôi sẽ yêu cầu người dùng nhập y-- nhập y để tiếp tục tính + +35 +00:02:19,380 --> 00:02:21,840 +toán với câu trả lời từ bước trước. + +36 +00:02:22,440 --> 00:02:27,440 +Hãy làm cho nó thành một chuỗi và hãy kiểm tra xem nó thực sự bằng gì. + +37 +00:02:28,380 --> 00:02:33,180 +Vì vậy, hãy nhớ rằng hàm đầu vào cũng là một hàm có đầu ra, là một chút + +38 +00:02:33,720 --> 00:02:35,040 +sau đó là zen, + +39 +00:02:35,250 --> 00:02:39,240 +nhưng đầu ra của hàm này là bất cứ thứ gì người dùng nhập vào. + +40 +00:02:39,360 --> 00:02:44,360 +Vì vậy, nếu họ nhập y thì phần này sẽ trở thành y. Đó là nơi chúng tôi sẽ + +41 +00:02:44,880 --> 00:02:45,750 +kiểm tra. + +42 +00:02:45,840 --> 00:02:50,840 +Vì vậy, chúng tôi sẽ kiểm tra xem kết quả của đầu vào từ người dùng có bằng y hay không, sau + +43 +00:02:51,360 --> 00:02:55,650 +đó trong trường hợp đó có nghĩa là chúng tôi nên tiếp tục và nó sẽ lặp lại. + +44 +00:02:56,100 --> 00:02:57,930 +Nhưng khi nó lặp lại, + +45 +00:02:57,990 --> 00:03:02,990 +chúng tôi muốn đảm bảo rằng num1 bằng với câu trả lời từ bước trước. + +46 +00:03:04,930 --> 00:03:07,540 +Vì vậy, chúng ta có thể nói nếu + +47 +00:03:07,690 --> 00:03:11,740 +điều này là đúng, thì num1 sẽ được đặt bằng với câu trả lời. + +48 +00:03:12,460 --> 00:03:15,640 +Nhưng mặt khác, nếu họ nhập bất cứ điều gì khác, vì + +49 +00:03:15,940 --> 00:03:20,940 +vậy chúng tôi có thể nói có thể gõ y để tiếp tục tính toán với đáp án hoặc gõ + +50 +00:03:22,780 --> 00:03:23,613 +n để thoát. + +51 +00:03:24,760 --> 00:03:29,760 +Vì vậy, bây giờ nếu họ nhập y thì câu trả lời sẽ được đặt là num1 + +52 +00:03:30,940 --> 00:03:32,800 +ở đầu vòng lặp while + +53 +00:03:33,100 --> 00:03:36,550 +này để num1 này trở thành câu trả lời từ bước trước. + +54 +00:03:37,090 --> 00:03:40,510 +Nhưng nếu họ gõ n thì chúng ta muốn vòng lặp while này kết thúc. + +55 +00:03:40,780 --> 00:03:44,110 +Vì vậy, chúng tôi sẽ thay đổi cờ should_continue thành false. + +56 +00:03:44,830 --> 00:03:46,840 +Vì vậy, bây giờ chúng ta hãy chạy thử. + +57 +00:03:50,670 --> 00:03:51,000 +1: Đúng không? + +58 +00:03:51,000 --> 00:03:52,890 +Giả sử số đầu tiên là năm. + +59 +00:03:53,310 --> 00:03:57,570 +Sau đó, chúng ta sẽ thêm ba đến năm và sau đó chúng ta sẽ + +60 +00:03:57,570 --> 00:04:00,990 +nhập y để tiếp tục. Vì vậy, bây giờ chúng ta + +61 +00:04:01,020 --> 00:04:03,180 +phải chọn một phép toán khác, vì vậy hãy + +62 +00:04:03,240 --> 00:04:08,240 +nhân, ừm, tám với hai và chúng ta nhận được kết quả từ bước tiếp theo và chúng ta thực sự + +63 +00:04:09,600 --> 00:04:12,360 +có thể tiếp tục cho đến khi về cơ bản, phải không? + +64 +00:04:12,360 --> 00:04:16,980 +Vì vậy, chúng ta có thể lấy 16 và chúng ta có thể chia nó cho bốn. + +65 +00:04:17,610 --> 00:04:19,529 +Nhưng ngược lại, nếu chúng ta gõ 'n', thì + +66 +00:04:19,800 --> 00:04:23,250 +chương trình của chúng ta sẽ kết thúc và chúng ta sẽ thấy lời nhắc một lần nữa. + +67 +00:04:24,990 --> 00:04:26,790 +Và đó là giải pháp + +68 +00:04:26,850 --> 00:04:30,540 +cho thách thức, nhưng hơi buồn khi chỉ thoát ra, phải không? + +69 +00:04:30,540 --> 00:04:33,270 +Bởi vì với máy tính thường xuyên hơn + +70 +00:04:33,270 --> 00:04:37,950 +không, những gì bạn muốn làm là bắt đầu một phép tính mới để xác + +71 +00:04:37,980 --> 00:04:41,310 +định số đầu tiên và số thứ hai một lần nữa. + +72 +00:04:42,540 --> 00:04:45,120 +Nếu người dùng không muốn thoát nhưng nếu họ + +73 +00:04:45,570 --> 00:04:48,690 +muốn bắt đầu một phép tính mới, thì làm cách + +74 +00:04:49,230 --> 00:04:54,230 +nào để chúng ta có thể khiến họ quay trở lại từ đầu đến đây để họ + +75 +00:04:54,720 --> 00:04:59,610 +cung cấp num1 làm đầu vào mới? Điều này hơi phức tạp và + +76 +00:04:59,760 --> 00:05:03,750 +trong lập trình, khái niệm này được gọi là đệ quy. + +77 +00:05:04,260 --> 00:05:08,700 +Về cơ bản, ý tưởng rằng bạn có thể có một hàm gọi chính nó. + +78 +00:05:09,300 --> 00:05:14,300 +Vì vậy, hãy xác định một hàm mới được gọi là máy tính và hàm này không có + +79 +00:05:14,820 --> 00:05:17,100 +đầu vào và không có đầu ra. + +80 +00:05:17,640 --> 00:05:22,410 +Nhưng tất cả mã này mà chúng ta có ở đây cho đến nay đều nằm + +81 +00:05:22,410 --> 00:05:25,230 +trong hàm máy tính. Để bắt đầu khi + +82 +00:05:25,350 --> 00:05:30,350 +chúng ta bắt đầu, chúng ta phải gọi hàm máy tính để nó tìm thấy vị trí mà + +83 +00:05:30,450 --> 00:05:35,190 +hàm này được xác định và thực sự thực hiện tất cả các hướng dẫn này. + +84 +00:05:35,790 --> 00:05:36,180 +Bây + +85 +00:05:36,180 --> 00:05:40,560 +giờ, điều tiếp theo chúng ta phải làm là một chút thú vị vì khi + +86 +00:05:40,560 --> 00:05:41,850 +người dùng nhập không + +87 +00:05:42,690 --> 00:05:47,280 +và nói rằng họ không muốn tiếp tục tính toán với câu trả lời trước đó + +88 +00:05:47,640 --> 00:05:50,760 +mà thay vào đó họ muốn bắt đầu một phép + +89 +00:05:51,120 --> 00:05:54,270 +tính mới, những gì chúng ta muốn thay vì chỉ thoát + +90 +00:05:54,630 --> 00:05:59,630 +khỏi vòng lặp while, chúng ta muốn gọi hàm máy tính vì những gì điều này sẽ làm + +91 +00:06:00,560 --> 00:06:05,030 +là về cơ bản nó sẽ đưa chúng ta quay trở lại từ đầu nơi + +92 +00:06:05,030 --> 00:06:07,430 +chúng ta nhập lại một đầu vào mới. + +93 +00:06:08,510 --> 00:06:11,990 +Và hãy nhớ rằng khi bạn kết thúc một chức năng, mọi + +94 +00:06:12,350 --> 00:06:17,300 +thứ sẽ được đặt lại từ đầu. Vì vậy, should_continue lại trở thành true và vòng + +95 +00:06:17,570 --> 00:06:19,820 +lặp while này sẽ tiếp tục hoạt động. + +96 +00:06:20,600 --> 00:06:22,970 +Vì vậy, chúng ta hãy thử chạy phiên bản mới này. + +97 +00:06:23,720 --> 00:06:28,720 +Chúng tôi đã thực hiện một phép tính và bây giờ chúng tôi muốn bắt đầu một phép + +98 +00:06:29,030 --> 00:06:33,710 +tính mới, vì vậy tôi sẽ nhập n. Và bây giờ tôi phải xác định lại số đầu tiên một lần nữa. + +99 +00:06:37,100 --> 00:06:42,100 +Về cơ bản, phép đệ quy này xảy ra bởi vì chúng ta đang gọi hàm + +100 +00:06:42,890 --> 00:06:45,110 +máy tính này trong hàm máy tính. + +101 +00:06:45,710 --> 00:06:49,490 +Về cơ bản, mã chạy và chạy và chạy cho đến khi + +102 +00:06:50,060 --> 00:06:55,010 +nó đến đây và nếu các điều kiện này được đáp ứng và hàm máy tính này + +103 +00:06:55,250 --> 00:07:00,230 +được gọi, thì nó sẽ đi và tìm hàm máy tính để gọi nó một lần nữa. + +104 +00:07:01,310 --> 00:07:05,960 +Nhưng bây giờ bạn phải khá cẩn thận với các vòng lặp while và với các hàm + +105 +00:07:05,960 --> 00:07:06,793 +đệ quy + +106 +00:07:06,920 --> 00:07:11,920 +này vì giả sử rằng thay vì có tất cả mã này và một số mã kiểm tra để + +107 +00:07:12,500 --> 00:07:14,750 +xác định khi nào tôi nên gọi máy + +108 +00:07:15,230 --> 00:07:18,830 +tính, nếu tôi thực sự chỉ gọi máy tính trong máy tính, thì + +109 +00:07:19,130 --> 00:07:21,590 +điều này sẽ là một vòng lặp vô hạn. + +110 +00:07:21,620 --> 00:07:23,900 +Nó sẽ tiếp tục quay đi quay lại. + +111 +00:07:24,290 --> 00:07:27,410 +Hàm máy tính gọi hàm máy tính, hàm này sẽ + +112 +00:07:27,440 --> 00:07:31,400 +quay lại và gọi và nó quay đi vòng lại cho đến mãi mãi. + +113 +00:07:32,090 --> 00:07:32,480 +Một + +114 +00:07:32,480 --> 00:07:36,620 +lần nữa, hãy cẩn thận và đảm bảo rằng có một số loại điều kiện cần + +115 +00:07:36,620 --> 00:07:41,620 +được đáp ứng để hàm này tự gọi nó. Trong bài học tiếp theo, chúng tôi sẽ thêm các bước + +116 +00:07:41,810 --> 00:07:45,830 +hoàn thiện cho chương trình của mình và cũng sửa một lỗi mà bạn có thể đã + +117 +00:07:45,830 --> 00:07:47,450 +phát hiện vào thời điểm này. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Calculator Finishing Touches and Bug Fixes.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Calculator Finishing Touches and Bug Fixes.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bc61549e6578275191d239e9f5f5f7ea2bc376d7 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Calculator Finishing Touches and Bug Fixes.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a61bb379662303d29657515ee7720d3a22f089be79c38c635772d82a0ed8bc5 +size 21455633 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Calculator Finishing Touches and Bug Fixes_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Calculator Finishing Touches and Bug Fixes_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d8840212e40a22882c4ae188ef8dc6ff7164d9ec --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Calculator Finishing Touches and Bug Fixes_vi.srt @@ -0,0 +1,232 @@ +1 +00:00:00,660 --> 00:00:05,370 +Bây giờ chúng tôi đã hoàn thành khá nhiều logic và chức năng của máy + +2 +00:00:05,370 --> 00:00:08,850 +tính này, đã đến lúc thêm chuông và còi, bao gồm + +3 +00:00:09,120 --> 00:00:13,200 +thêm biểu tượng máy tính và cũng kiểm tra bất kỳ lỗi nào. + +4 +00:00:14,280 --> 00:00:16,590 +Thêm logo máy tính khá đơn giản. + +5 +00:00:17,280 --> 00:00:19,200 +Bạn đã làm điều này rất nhiều lần trước đây. + +6 +00:00:19,860 --> 00:00:22,740 +Tất cả những gì chúng ta phải làm là nhập nó từ + +7 +00:00:23,070 --> 00:00:27,480 +mô-đun nghệ thuật, và sau đó chúng ta sẽ in nó ở đầu chức năng máy tính của chúng ta. + +8 +00:00:28,470 --> 00:00:29,310 +Vì vậy, theo + +9 +00:00:29,370 --> 00:00:33,630 +cách này khi chúng tôi đi đến phần cuối và người dùng muốn bắt đầu một phép tính mới, chúng + +10 +00:00:33,930 --> 00:00:38,910 +tôi cũng sẽ hiển thị lại cho họ một biểu trưng. Bây giờ, điều tiếp theo cần chú ý, + +11 +00:00:39,060 --> 00:00:42,630 +đây là một chút lỗi mà bạn có thể đã thấy hoặc không. + +12 +00:00:43,290 --> 00:00:48,090 +Nhưng điều gì sẽ xảy ra nếu chúng ta cố gắng nhập một số có dấu thập phân? + +13 +00:00:48,630 --> 00:00:52,470 +Giả sử chúng ta muốn tính toán 4. 5 nhân với 2. + +14 +00:00:54,180 --> 00:00:55,860 +Chương trình của chúng tôi đã bị lỗi ngay + +15 +00:00:55,950 --> 00:01:00,000 +sau khi tôi bước vào 4. 5 và nhấn enter. Như một thách thức, bạn có thể + +16 +00:01:00,030 --> 00:01:03,930 +chẩn đoán điều gì đã xảy ra và sửa lỗi này không? Tôi sẽ cho bạn vài giây để tạm dừng + +17 +00:01:03,930 --> 00:01:05,530 +video trước khi đưa ra giải + +18 +00:01:06,050 --> 00:01:06,883 +pháp cho bạn. + +19 +00:01:08,750 --> 00:01:10,070 +Được rồi. Đây là giải pháp. + +20 +00:01:10,220 --> 00:01:15,110 +Lỗi quay trở lại bài học của chúng tôi về kiểu dữ liệu. Chú ý cách nó tạo ra lỗi + +21 +00:01:15,230 --> 00:01:17,030 +cho chúng ta và + +22 +00:01:17,060 --> 00:01:22,040 +nó đang trỏ đến dòng số 26 này. Dòng số 26 nhận đầu vào này là một + +23 +00:01:22,100 --> 00:01:26,570 +chuỗi và chuyển nó thành một số nguyên. Nhưng tất nhiên, một số có + +24 +00:01:26,780 --> 00:01:30,380 +chữ số thập phân không được chuyển đổi thành số nguyên. + +25 +00:01:30,770 --> 00:01:35,480 +Thay vào đó, chúng ta thực sự nên giữ nó dưới dạng số dấu phẩy động. Bằng cách này, chúng tôi có + +26 +00:01:35,480 --> 00:01:38,330 +thể thực hiện các phép tính chính xác hơn. + +27 +00:01:38,600 --> 00:01:40,670 +Vì vậy, thay vì chỉ 4 lần 5, chúng + +28 +00:01:40,670 --> 00:01:44,360 +ta có thể làm 4. 5 lần 5. 5, chẳng hạn. + +29 +00:01:44,930 --> 00:01:48,410 +Vì vậy, thay vì sử dụng int ở đây, tôi sẽ thay đổi điều đó thành float + +30 +00:01:48,920 --> 00:01:53,510 +và tôi sẽ làm tương tự ở đây cho num2. Bây giờ, khi chúng ta nhấn run, tôi thực + +31 +00:01:53,690 --> 00:01:58,160 +sự có thể thực hiện các phép tính bằng cách sử dụng các số có chữ số thập phân, + +32 +00:01:58,520 --> 00:02:01,340 +nhưng tôi cũng có thể sử dụng các số là số nguyên. + +33 +00:02:01,670 --> 00:02:06,020 +Vì vậy, hãy nhân 2. 5 x 2, câu trả lời là 5 + +34 +00:02:06,080 --> 00:02:10,789 +và bạn có thể thấy rằng tất cả các số đang được báo cáo ở mức độ chính xác + +35 +00:02:10,789 --> 00:02:14,030 +cao hơn, nghĩa là chúng ta có các số sau dấu thập phân. + +36 +00:02:14,420 --> 00:02:18,260 +Và đây là tất cả bởi vì chúng tôi đã chuyển đổi int đó thành một float. + +37 +00:02:19,850 --> 00:02:23,240 +Giờ đây, có rất nhiều tính năng khác mà bạn có thể thêm vào máy tính của mình. + +38 +00:02:23,540 --> 00:02:28,310 +Bạn có thể thêm khả năng căn bậc hai, bạn có thể thêm khả năng lũy + +39 +00:02:28,670 --> 00:02:32,990 +thừa, nhưng điều quan trọng ở đây thực sự là để bạn thấy các + +40 +00:02:32,990 --> 00:02:35,810 +hàm cung cấp đầu ra thực sự hữu ích + +41 +00:02:35,840 --> 00:02:40,840 +như thế nào khi bạn đến với một chương trình phức tạp hơn, nơi bạn có thể + +42 +00:02:42,650 --> 00:02:47,360 +lấy đầu ra từ một hàm gọi và chuyển nó vào lệnh gọi hàm tiếp + +43 +00:02:47,360 --> 00:02:49,100 +theo làm đầu vào. + +44 +00:02:49,940 --> 00:02:53,660 +Vì vậy, đầu ra này có thể được sử dụng lại trong các phần khác nhau của mã. + +45 +00:02:54,170 --> 00:02:59,170 +Và điều này không chỉ cho phép chúng tôi giảm bớt sự lặp lại và cũng làm cho chúng tôi có thể tái + +46 +00:03:00,400 --> 00:03:01,420 +sử dụng nhiều hơn + +47 +00:03:01,720 --> 00:03:06,720 +và mô-đun hơn, mà còn mang lại cho chúng tôi sự linh hoạt khi thực hiện nhiều hành động hơn sau khi một + +48 +00:03:08,590 --> 00:03:10,990 +chức năng đã hoàn thành. Bây giờ, chúng + +49 +00:03:10,990 --> 00:03:15,370 +ta sẽ sử dụng rất nhiều khái niệm mà chúng ta đã học ở đây + +50 +00:03:15,520 --> 00:03:19,780 +hôm nay trong dự án capstone ngày mai. Tôi đã giải thích rất nhiều điều, + +51 +00:03:19,780 --> 00:03:22,240 +bao gồm những thứ như đệ quy nơi chúng + +52 +00:03:22,240 --> 00:03:26,980 +ta đang gọi một hàm theo định nghĩa riêng của nó hoặc những thứ như thiết lập + +53 +00:03:26,980 --> 00:03:29,860 +cờ bằng cách sử dụng vòng lặp tường để tiếp + +54 +00:03:29,860 --> 00:03:33,070 +tục thực hiện một số đoạn mã thực sự, thực sự tiện + +55 +00:03:33,070 --> 00:03:34,360 +dụng vào ngày mai. + +56 +00:03:34,780 --> 00:03:38,050 +Vì vậy, hãy đảm bảo rằng nếu có bất kỳ điều gì + +57 +00:03:38,380 --> 00:03:43,380 +bạn không hiểu ở đây, hãy xem lại nó và bạn cảm thấy thoải mái với những gì mã + +58 +00:03:43,480 --> 00:03:47,410 +đang thực hiện trước khi tiếp tục. Đó là tất cả cho ngày hôm nay và tôi sẽ gặp bạn vào ngày mai. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Course-Fixes-Report-an-Issue.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Solution-Calculator-Completed-Code.url b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Solution-Calculator-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..a02effc455a0c6758be9bb33fcb324c0efb476de --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/010 Solution-Calculator-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/calculator-final \ No newline at end of file diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/011 How to Get a Good Night's Sleep.mp4 b/part1/10 - Day 10 - Beginner - Functions with Outputs/011 How to Get a Good Night's Sleep.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..dd80ab2736905bb1168b713d955b428d14e25f03 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/011 How to Get a Good Night's Sleep.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4913be5b0cdf0d4cee55c80290589bb5f08e89ade4ae8e62707f83d8de3da1c +size 37210786 diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/011 How to Get a Good Night's Sleep_vi.srt b/part1/10 - Day 10 - Beginner - Functions with Outputs/011 How to Get a Good Night's Sleep_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7dfd2a46a6a992463fb352140a505302191818c3 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/011 How to Get a Good Night's Sleep_vi.srt @@ -0,0 +1,96 @@ +1 +00:00:00,900 --> 00:00:04,410 +Chào! Làm tốt! Bạn đã hoàn thành ngày + +2 +00:00:04,470 --> 00:00:07,530 +thứ 10, đó là rất nhiều tiến bộ. Bây giờ, ngày mai + +3 +00:00:07,590 --> 00:00:12,590 +là một ngày trọng đại vì sắp có dự án capstone, dự án đầu + +4 +00:00:12,840 --> 00:00:15,690 +tiên của bạn. Và trước đó, bạn thực + +5 +00:00:15,750 --> 00:00:19,770 +sự cần ngủ một giấc thật ngon để não bộ được sảng khoái và sẵn + +6 +00:00:19,770 --> 00:00:20,700 +sàng hành động. + +7 +00:00:21,300 --> 00:00:25,980 +Vì vậy, đây là một số mẹo của tôi để có một giấc ngủ ngon. Thứ nhất, không đặt báo + +8 +00:00:26,100 --> 00:00:29,310 +thức, đặt cả báo thức khi ngủ. + +9 +00:00:29,790 --> 00:00:33,870 +Có chuông báo cho bạn biết khi nào thì bắt đầu giảm tốc. + +10 +00:00:33,930 --> 00:00:37,260 +Vì tất cả chúng ta đều biết việc tiếp tục xem video YouTube sau video + +11 +00:00:37,260 --> 00:00:40,140 +YouTube dễ dàng như thế nào. Tôi tự làm điều đó. + +12 +00:00:40,470 --> 00:00:45,470 +Bây giờ, một ý tưởng thực sự tốt khác là tránh nhìn vào nhiều màn hình khoảng một giờ + +13 +00:00:45,720 --> 00:00:47,940 +hoặc hai giờ trước khi bạn đi ngủ. + +14 +00:00:48,330 --> 00:00:51,900 +Lượng ánh sáng xanh từ màn hình, ngay cả khi bạn + +15 +00:00:52,170 --> 00:00:57,170 +đã bật ca đêm, có thể khiến não của bạn thực sự khó bắt đầu hoạt + +16 +00:00:57,240 --> 00:01:01,050 +động và muốn đi ngủ. Vì vậy, một trong những điều tôi làm là tôi + +17 +00:01:02,070 --> 00:01:04,769 +thực sự có cái này, tôi thậm chí không biết cái này thường được + +18 +00:01:04,950 --> 00:01:09,090 +sử dụng để làm gì, nhưng nó cung cấp một bộ lọc loại bỏ tất cả ánh sáng xanh và tôi chỉ + +19 +00:01:09,150 --> 00:01:12,750 +đi lại như thế này vào ban đêm. Ừm, vì vậy bạn có thể thử + +20 +00:01:13,320 --> 00:01:17,340 +cách này hoặc về cơ bản bạn có thể chỉ đọc một cuốn sách thay vì + +21 +00:01:17,340 --> 00:01:20,250 +trông ngớ ngẩn như tôi. Và điều quan trọng-- nhưng + +22 +00:01:20,370 --> 00:01:24,870 +hãy đảm bảo rằng bạn ngủ đủ giấc, có giấc ngủ chất lượng và bạn đã chuẩn bị tinh + +23 +00:01:24,870 --> 00:01:27,360 +thần và sẵn sàng giải quyết vào ngày hôm sau. + +24 +00:01:27,870 --> 00:01:32,520 +Vì vậy, em ngủ ngon nhé, chúc em ngủ ngon và hẹn gặp lại vào ngày mai. + diff --git a/part1/10 - Day 10 - Beginner - Functions with Outputs/external-links.txt b/part1/10 - Day 10 - Beginner - Functions with Outputs/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..b8899139a9a07720576b2fc9b6d78e19bb154986 --- /dev/null +++ b/part1/10 - Day 10 - Beginner - Functions with Outputs/external-links.txt @@ -0,0 +1,30 @@ + +001 Day-10-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/calculator-final?v=1 + +002 Fork-the-Day-10-Starting-Repl +https://repl.it/@appbrewery/day-10-start + +002 How-to-Convert-Strings-to-Title-Case +https://stackoverflow.com/questions/8347048/how-to-convert-string-to-title-case-in-python + +003 Completed-Example-Code-for-Day-10 +https://repl.it/@appbrewery/day-10-end#main.py + +004 Exercise-24 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/79040aa6-f9d2-4493-9f92-52c26748ec3e + +004 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Starting-Code-for-the-Calculator-on-Repl.it +https://repl.it/@appbrewery/calculator-start#main.py + +008 Debugging-Solution +https://repl.it/@appbrewery/calculator-debug-solution + +010 Solution-Calculator-Completed-Code +https://repl.it/@appbrewery/calculator-final + +010 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day 11 Goals what we will make by the end of the day.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day 11 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e3ef6ecf650a328a00391bfbe8b075242779dcf7 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day 11 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc4f19d1335b2d881c891abf4b248af84869e392daae27ad776f51b595bee742 +size 15861275 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day 11 Goals what we will make by the end of the day_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day 11 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..20277434fac3069c33cebe4f4bcf8613a3da1d40 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day 11 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,148 @@ +1 +00:00:00,570 --> 00:00:04,110 +Này, Angela đây. Chúc mừng bạn đã + +2 +00:00:04,190 --> 00:00:08,870 +vượt qua 10 ngày đầu tiên. Hôm nay, tôi có một thứ rất đặc biệt dành cho bạn, + +3 +00:00:09,380 --> 00:00:13,100 +dự án capstone đầu tiên của chúng tôi. Hôm nay chúng tôi sẽ thách + +4 +00:00:13,140 --> 00:00:17,750 +thức bạn áp dụng mọi thứ bạn đã học được cho đến nay vào một dự + +5 +00:00:17,780 --> 00:00:18,613 +án lớn. + +6 +00:00:18,770 --> 00:00:22,670 +Bạn sẽ cần phải đào sâu và áp dụng tất cả các kỹ năng Python của mình + +7 +00:00:22,670 --> 00:00:25,130 +cho dự án capstone này. Nhưng đến cuối ngày, bạn + +8 +00:00:25,160 --> 00:00:28,040 +sẽ xây dựng được một trò chơi blackjack tuyệt vời để thưởng thức. + +9 +00:00:28,850 --> 00:00:31,610 +Đây có lẽ sẽ là một trong những thứ khó nhất + +10 +00:00:31,880 --> 00:00:36,140 +mà bạn sẽ xây dựng, nhưng đồng thời, kết quả cuối cùng cũng sẽ là niềm vui nhất. + +11 +00:00:37,010 --> 00:00:40,130 +Dự án cuối cùng mà bạn sẽ xây dựng là blackjack. + +12 +00:00:40,640 --> 00:00:42,530 +Và nếu bạn + +13 +00:00:42,530 --> 00:00:47,530 +đã sử dụng 247blackjack. com hoặc tìm kiếm bất kỳ trò chơi xì dách trực + +14 +00:00:48,380 --> 00:00:53,380 +tuyến miễn phí nào khác, bạn có thể đánh bài và có thể bấm chia bài để nhà cái chia bài cho bạn. + +15 +00:00:54,140 --> 00:00:56,150 +Trò chơi thực sự đơn giản. Về cơ + +16 +00:00:56,150 --> 00:01:01,150 +bản, bạn đang cố gắng đạt được càng gần 21 càng tốt và tất cả + +17 +00:01:02,060 --> 00:01:05,720 +các thẻ có Jack, Queen hoặc King được tính là 10. + +18 +00:01:05,930 --> 00:01:10,130 +Vì vậy, bạn đang cộng hai thẻ này lên 5 + 10 bằng 15. + +19 +00:01:10,520 --> 00:01:14,090 +Và bạn đang cố gắng tìm hiểu xem liệu bạn có thể mạo hiểm nhận được một thẻ khác hay không. + +20 +00:01:14,570 --> 00:01:18,620 +Vì vậy, tôi sẽ nhấp vào hit, và tôi sẽ nhận được một thẻ + +21 +00:01:18,830 --> 00:01:23,120 +khác nhưng điều đó khiến tôi hơn 21 và vì vậy người chia bài thắng. + +22 +00:01:24,260 --> 00:01:26,480 +Vì vậy, đây là trò chơi mà chúng tôi đang cố gắng tạo ra. + +23 +00:01:27,050 --> 00:01:29,870 +Đây là phiên bản Blackjack của bạn sẽ trông như thế nào. + +24 +00:01:30,200 --> 00:01:32,480 +Giờ đây, giao diện người dùng đã đơn giản hơn một chút, + +25 +00:01:32,780 --> 00:01:34,640 +nhưng cũng rất thú vị khi chơi với nó. + +26 +00:01:34,820 --> 00:01:37,820 +Vì vậy, hai thẻ đầu tiên của chúng tôi là một 9 và + +27 +00:01:38,480 --> 00:01:41,720 +một 10, và nó cũng cho chúng ta thấy một trong những thẻ máy tính. + +28 +00:01:42,560 --> 00:01:45,440 +Bây giờ tôi đã ở trên 19,10 + 9. + +29 +00:01:45,980 --> 00:01:48,020 +Tôi sắp bước qua tuổi 21. + +30 +00:01:48,350 --> 00:01:51,650 +Vì vậy, tôi sẽ gõ 'n' và kết thúc trò chơi ngay tại đó. + +31 +00:01:52,160 --> 00:01:53,510 +Tôi kết thúc vào 19, + +32 +00:01:53,540 --> 00:01:57,560 +máy tính kết thúc vào 18 và vì 19 lớn hơn 18, điều đó có nghĩa + +33 +00:01:57,710 --> 00:01:58,730 +là tôi thắng. + +34 +00:01:59,600 --> 00:02:04,600 +Hãy chơi trò chơi cuối cùng bằng cách đi đến trận chung kết black-jack-final. nhà máy bia. repl. chạy. + +35 +00:02:05,330 --> 00:02:06,710 +Nhưng khi bạn đã sẵn sàng, hãy + +36 +00:02:06,770 --> 00:02:10,669 +chuyển sang bài học tiếp theo để chúng ta thực sự có thể tự mình xây dựng trò chơi này. + +37 +00:02:10,970 --> 00:02:14,360 +Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. Chúc vui vẻ. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day-11-Goal-Click-Run-to-see-the-final-project.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day-11-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..0bb2f44fcb8cc79a711d43faf4df8d0bdcbfb577 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Day-11-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/blackjack-final?v=1 \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Try-out-an-online-Blackjack-game.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Try-out-an-online-Blackjack-game.url new file mode 100644 index 0000000000000000000000000000000000000000..4a9369fabc7c6de7cbe09b527c3612bc6b59cafe --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/001 Try-out-an-online-Blackjack-game.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://games.washingtonpost.com/games/blackjack/ \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Blackjack Program Requirements and Game Rules.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Blackjack Program Requirements and Game Rules.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..41f1ad7af9e4830fbd477e69608240610f8a3985 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Blackjack Program Requirements and Game Rules.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dcb4dc436dd9884fd6ce91eb34f11b1c013d61ece3a59451af59ff1e7b5e8d6 +size 94726087 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Blackjack Program Requirements and Game Rules_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Blackjack Program Requirements and Game Rules_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..93f8d23817387106b0812acf3eb6dbcbaa0b6311 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Blackjack Program Requirements and Game Rules_vi.srt @@ -0,0 +1,532 @@ +1 +00:00:00,240 --> 00:00:00,630 +Được rồi. + +2 +00:00:00,630 --> 00:00:04,230 +Hãy nói về cơ chế và các yêu cầu chương trình cho trò + +3 +00:00:04,230 --> 00:00:08,100 +chơi Blackjack mà bạn sẽ tạo. Đối với những bạn chưa quen thuộc với trò + +4 +00:00:08,100 --> 00:00:10,170 +chơi Xì dách hay còn gọi là 21, tôi sẽ + +5 +00:00:10,560 --> 00:00:13,290 +dành một vài phút để tìm hiểu các quy tắc với các bạn. + +6 +00:00:14,040 --> 00:00:16,980 +Blackjack là một trò chơi được chơi bằng cách sử dụng các lá bài. + +7 +00:00:17,550 --> 00:00:22,550 +Và mục tiêu của trò chơi là cộng các thẻ của bạn thành số lớn + +8 +00:00:23,730 --> 00:00:27,840 +nhất mà không vượt quá 21. Nếu các quân bài trên tay + +9 +00:00:27,960 --> 00:00:32,430 +của bạn có hai hơn 21, thì nó được gọi là bán kết và có + +10 +00:00:32,700 --> 00:00:34,890 +nghĩa là bạn sẽ thua ngay lập tức. + +11 +00:00:35,610 --> 00:00:40,560 +Và không quan trọng bạn đã qua 21 tuổi bao nhiêu, miễn là bạn trên + +12 +00:00:40,620 --> 00:00:44,610 +21 tuổi, thì bạn sẽ thua. Bây giờ nguyên nhân được tính + +13 +00:00:44,840 --> 00:00:49,790 +là tất cả các thẻ từ 2 đến 10 được tính là mệnh giá của chúng. + +14 +00:00:50,090 --> 00:00:53,060 +Vì vậy, một sáu là một sáu và một chín là một chín, vân vân. + +15 +00:00:53,810 --> 00:00:58,810 +Nhưng Jack, Queen và King mỗi người được tính là 10 và thẻ đặc biệt khác + +16 +00:01:00,350 --> 00:01:01,183 +là Át. + +17 +00:01:01,370 --> 00:01:05,720 +Bây giờ quân Át có thể được tính là một trong tổng số của bạn hoặc nó + +18 +00:01:05,990 --> 00:01:09,770 +có thể được tính là 11. Và tùy thuộc vào việc, nếu + +19 +00:01:09,770 --> 00:01:13,190 +bạn đã trên 21 tuổi hoặc nếu bạn dưới 21 tuổi, bạn + +20 +00:01:13,220 --> 00:01:17,330 +có thể quyết định giá trị nào bạn muốn lá Ace của mình đại diện. + +21 +00:01:18,320 --> 00:01:22,370 +Hãy chơi một trò chơi mẫu. Giả sử rằng người chia bài ở đây + +22 +00:01:23,000 --> 00:01:28,000 +có số 10 để bắt đầu và bạn có một quân hậu cũng được tính là số 10 để bắt đầu. + +23 +00:01:29,660 --> 00:01:30,200 +Vì vậy, + +24 +00:01:30,200 --> 00:01:34,730 +đây là những chiếc xe đầu tiên được chia và cả hai thẻ này đều được tiết lộ. + +25 +00:01:35,390 --> 00:01:40,100 +Và sau đó nhà cái chia một thẻ khác cho mỗi bạn. Bây giờ ván bài thứ hai của nhà cái đã + +26 +00:01:40,130 --> 00:01:44,690 +được che giấu nên bạn không thể biết tổng số của họ là bao nhiêu, nhưng bạn có thể + +27 +00:01:45,350 --> 00:01:47,120 +thấy lá bài của chính mình. + +28 +00:01:47,720 --> 00:01:50,720 +Vì vậy, tại thời điểm chúng tôi không biết nhà cái có + +29 +00:01:50,720 --> 00:01:53,090 +gì, nó có thể là 10 cộng với bất + +30 +00:01:53,630 --> 00:01:57,800 +cứ điều gì, nhưng chúng tôi biết rằng điểm của chúng tôi là 13, 10 + 3. + +31 +00:01:59,540 --> 00:02:02,900 +Tại thời điểm này, bạn có thể yêu cầu đại lý cho một thẻ khác. + +32 +00:02:03,380 --> 00:02:08,380 +Vì vậy, bây giờ bạn có ba thẻ và may mắn là nó cộng lại 20 mà không vượt quá 21. + +33 +00:02:11,150 --> 00:02:15,530 +Nhưng cũng có khả năng bạn nhận được một quân bài đã + +34 +00:02:15,530 --> 00:02:20,180 +đẩy tổng số của bạn lên hơn 21 mà lúc này bạn sẽ thua. + +35 +00:02:20,420 --> 00:02:23,180 +Và nhà cái có gì trong tay không quan trọng, + +36 +00:02:23,480 --> 00:02:26,000 +bạn đã thua vì bạn đã vượt quá 21. + +37 +00:02:27,050 --> 00:02:31,190 +Bây giờ, hãy nói rằng chúng tôi đã gặp may và tổng số của chúng tôi cộng lại là 20. + +38 +00:02:31,910 --> 00:02:35,180 +Bây giờ tại thời điểm này, chúng tôi nói rằng chúng tôi không muốn bất kỳ thẻ nào nữa và người + +39 +00:02:35,540 --> 00:02:39,830 +chia bài để lộ bàn tay của họ. Nếu. giống như trong trường hợp + +40 +00:02:39,980 --> 00:02:42,830 +này, họ kết thúc với 20 và chúng tôi có 20, sau đó + +41 +00:02:43,310 --> 00:02:45,170 +chúng tôi kết thúc với kết quả hòa. + +42 +00:02:45,590 --> 00:02:48,590 +Vì vậy, bất cứ khi nào điểm của bạn bằng với điểm của nhà cái, + +43 +00:02:48,890 --> 00:02:53,150 +thì bạn sẽ hòa chứ không phải thắng hoặc thua. Bây giờ, nếu ngược lại, người chia + +44 +00:02:53,180 --> 00:02:56,360 +bài kết thúc với một con Át, mà chúng tôi biết + +45 +00:02:56,420 --> 00:03:01,420 +có thể được tính là 11 và họ thực sự đã ghi điểm cao hơn chúng tôi. + +46 +00:03:02,110 --> 00:03:06,550 +Họ có 21 và chúng tôi có 20, tốt, trong trường hợp này, chúng tôi sẽ thua. + +47 +00:03:07,510 --> 00:03:12,510 +Bây giờ các quy tắc cũng quy định rằng nếu người chia bài kết thúc với một + +48 +00:03:13,720 --> 00:03:16,540 +cửa nhỏ hơn 17, vì vậy 16 hoặc dưới, thì + +49 +00:03:16,900 --> 00:03:19,270 +họ phải lấy một lá bài khác. + +50 +00:03:19,840 --> 00:03:22,180 +Đó là những quy tắc cơ bản của trò chơi + +51 +00:03:22,600 --> 00:03:27,100 +xì dách, nhưng tôi khuyên bạn nên trước khi bắt đầu hãy truy cập vào liên kết có trong tệp + +52 +00:03:27,100 --> 00:03:31,390 +bắt đầu trò chơi Xì dách và có một vài trò chơi Xì dách để bạn có thể + +53 +00:03:31,690 --> 00:03:36,370 +tự mình xem nó thực sự hoạt động như thế nào và như thế nào. bạn thắng và bạn thua + +54 +00:03:36,370 --> 00:03:37,270 +như thế nào. + +55 +00:03:38,140 --> 00:03:43,140 +Và sau đó chuyển đến phiên bản cuối cùng của dự án đã hoàn thành và chơi phiên + +56 +00:03:45,160 --> 00:03:49,060 +bản Blackjack đơn giản của chúng tôi. Bằng cách này, bạn sẽ thấy kết quả + +57 +00:03:49,090 --> 00:03:52,540 +cuối cùng mà bạn đang cố tạo ra là gì và sẽ dễ dàng + +58 +00:03:52,900 --> 00:03:56,620 +hơn khi bạn tự tạo mã. Bây giờ, như tôi đã đề cập, + +59 +00:03:56,650 --> 00:03:57,550 +chúng tôi sẽ + +60 +00:03:57,610 --> 00:04:01,780 +thử và giữ cho phiên bản Blackjack của chúng tôi đơn giản hơn một chút, và chúng + +61 +00:04:02,560 --> 00:04:04,420 +tôi sẽ giả định một vài điều. + +62 +00:04:04,990 --> 00:04:09,430 +Điều đầu tiên là thẻ mà chúng tôi đang bắt đầu đến + +63 +00:04:09,430 --> 00:04:13,090 +từ danh sách này. Bạn sẽ nhận thấy rằng tôi có từ 2 đến 10, + +64 +00:04:13,120 --> 00:04:14,890 +tất cả đều được trình bày trong danh sách. + +65 +00:04:15,430 --> 00:04:19,660 +Và sau đó tôi có Jack, Queen và King cũng được đại diện như hàng chục. + +66 +00:04:20,110 --> 00:04:25,110 +Vì vậy, điều này có nghĩa là số 10 có xác suất xuất hiện cao gấp bốn lần so + +67 +00:04:25,870 --> 00:04:27,040 +với các thẻ khác. + +68 +00:04:27,670 --> 00:04:31,660 +Bây giờ quân Át sẽ bắt đầu được biểu thị là 11 và + +69 +00:04:31,990 --> 00:04:36,070 +nó sẽ được tính là 11 cho đến khi người dùng trên 21 tuổi. + +70 +00:04:37,060 --> 00:04:41,050 +Cuối cùng, chúng ta sẽ giả định rằng chúng ta có một bộ bài vô hạn. + +71 +00:04:41,470 --> 00:04:44,320 +Vì vậy, nó có nghĩa là khi một lá bài được rút ra từ bộ + +72 +00:04:44,380 --> 00:04:48,130 +bài, nó không bị loại bỏ khỏi bộ bài. Trong khi trong một sòng bạc thực, + +73 +00:04:48,280 --> 00:04:52,780 +họ có thể có sáu hoặc tám bộ bài. Khi một lá bài được rút ra, + +74 +00:04:53,050 --> 00:04:57,310 +thì sẽ có ít khả năng xảy ra lại cùng một lá bài hơn. + +75 +00:04:57,790 --> 00:05:00,220 +Và đây là cách những người đánh bài chuyên + +76 +00:05:00,280 --> 00:05:02,260 +nghiệp, những người mà sòng bạc ghét + +77 +00:05:02,680 --> 00:05:06,640 +nhất, thực sự cố gắng tối ưu hóa và cải thiện cơ hội của họ. + +78 +00:05:07,240 --> 00:05:10,000 +Nhưng để giữ cho mọi thứ đơn giản trong trò chơi của + +79 +00:05:10,270 --> 00:05:14,770 +chúng tôi, chúng tôi sẽ không giải quyết những thứ liên quan đến xác suất hoặc loại bỏ các thẻ + +80 +00:05:14,770 --> 00:05:15,460 +khỏi bộ bài. + +81 +00:05:15,460 --> 00:05:19,930 +Chúng tôi sẽ giả định rằng mỗi thẻ trong số này trong danh sách đều có + +82 +00:05:19,930 --> 00:05:23,770 +cơ hội xuất hiện như nhau. Nếu bạn chuyển sang dự án bắt + +83 +00:05:23,790 --> 00:05:25,000 +đầu App Brewery + +84 +00:05:25,360 --> 00:05:28,870 +Blackjack, bạn sẽ thấy từng quy tắc này được viết chi tiết hơn. + +85 +00:05:29,260 --> 00:05:32,890 +Hãy xem nó để bạn biết những gì các quy tắc nhà của chúng tôi quy định. + +86 +00:05:34,030 --> 00:05:37,090 +Bây giờ, nếu bạn cuộn đến phần trên cùng của dự án Blackjack, + +87 +00:05:37,360 --> 00:05:41,590 +tôi đã đưa cho bạn bốn bản nhạc. Vì vậy, giống như khi bạn bắt + +88 +00:05:41,620 --> 00:05:46,330 +đầu một trò chơi điện tử, bạn có quyền lựa chọn bình thường, khó, cực khó + +89 +00:05:46,720 --> 00:05:51,520 +hoặc chuyên gia, dự án này cũng vậy. Bạn có thể giới hạn bản thân chỉ + +90 +00:05:51,520 --> 00:05:55,060 +sử dụng một gợi ý nếu bạn ở cấp độ chuyên gia về Python. + +91 +00:05:55,630 --> 00:05:57,860 +Bạn chỉ có thể sử dụng gợi + +92 +00:05:57,890 --> 00:06:02,890 +ý 1 và 2 nếu bạn muốn một thử thách khó hơn và có thể có một chút khó + +93 +00:06:04,010 --> 00:06:08,510 +khăn ở cuối, cũng có khó và bình thường. Vì vậy, tôi sẽ để sự lựa chọn cho bạn. + +94 +00:06:09,050 --> 00:06:12,500 +Và nếu bạn cuộn xuống, bạn sẽ tìm thấy tất cả các gợi ý được liệt kê ở đây. + +95 +00:06:13,070 --> 00:06:16,130 +Bây giờ tôi khuyên tất cả mọi người, bất kể kinh nghiệm của + +96 +00:06:16,550 --> 00:06:21,260 +bạn là gì, tất cả mọi người nên thử trò chơi Blackjack và cũng xem xét dự án cuối cùng + +97 +00:06:21,260 --> 00:06:23,000 +sẽ hoạt động như thế nào. + +98 +00:06:23,510 --> 00:06:28,510 +Nhưng sau đó tôi có những thứ khác, chẳng hạn như danh sách mà tôi đã chia nhỏ + +99 +00:06:29,090 --> 00:06:32,840 +các yêu cầu của chương trình. Bạn biết đấy, chúng tôi luôn nói như thế nào, khi + +100 +00:06:33,080 --> 00:06:35,750 +bạn gặp một vấn đề lớn, hãy luôn cố gắng chia nó thành những phần nhỏ hơn. + +101 +00:06:36,290 --> 00:06:41,290 +Tất nhiên, bây giờ bạn có thể tự mình tạo danh sách này bằng cách khám phá trò chơi, khám + +102 +00:06:41,540 --> 00:06:43,070 +phá dự án cuối cùng + +103 +00:06:43,370 --> 00:06:47,210 +và sau đó viết danh sách những việc cần được mã hóa của riêng bạn. + +104 +00:06:47,570 --> 00:06:48,770 +Hoặc cách khác, bạn có + +105 +00:06:48,800 --> 00:06:53,800 +thể xem một cái mà tôi đã tạo bên trong gợi ý 2. Trong gợi ý 3, tôi đã tạo một lưu + +106 +00:06:54,650 --> 00:06:56,720 +đồ cho bạn, trong đó có + +107 +00:06:57,200 --> 00:07:01,580 +danh sách việc cần làm và chia nhỏ nó thành một lưu đồ nơi bạn + +108 +00:07:01,580 --> 00:07:06,020 +có thể xem xét logic chi tiết hơn. Tất nhiên, bây giờ, như mọi khi, bạn + +109 +00:07:06,020 --> 00:07:08,390 +nên tạo lưu đồ của riêng mình bằng cách + +110 +00:07:08,750 --> 00:07:12,650 +sử dụng một công cụ như draw. io hoặc sử dụng một mảnh giấy và bút. + +111 +00:07:13,190 --> 00:07:14,270 +Nhưng nếu bạn cần trợ + +112 +00:07:14,330 --> 00:07:18,170 +giúp, nó ở đó cho bạn và bạn có thể tải xuống bản PDF và đọc qua nó. + +113 +00:07:19,010 --> 00:07:20,480 +Bây giờ phần còn + +114 +00:07:20,510 --> 00:07:24,590 +lại của các gợi ý sẽ đi qua cách giải quyết dự án + +115 +00:07:24,590 --> 00:07:29,510 +này trong các phần nhỏ hơn nữa. Tùy thuộc vào trình độ Python của bạn hiện tại, + +116 +00:07:29,780 --> 00:07:31,880 +hãy chọn mức độ khó của riêng bạn. + +117 +00:07:32,270 --> 00:07:37,270 +Nhưng tôi chỉ muốn nói trước khi bạn bắt đầu rằng dự án này rất khó và tôi + +118 +00:07:37,910 --> 00:07:42,560 +muốn cho bạn một chút thử thách và thúc đẩy bản thân để bạn trở nên mạnh + +119 +00:07:42,560 --> 00:07:43,393 +mẽ hơn. + +120 +00:07:43,970 --> 00:07:48,970 +Nhưng chắc chắn đó sẽ là những khoảnh khắc mà bạn sẽ nghi ngờ và bạn sẽ tự hỏi, tôi + +121 +00:07:49,010 --> 00:07:53,000 +đang làm gì thế này? Tôi không hiểu gì cả. Và trong thời điểm này, tôi + +122 +00:07:53,000 --> 00:07:56,510 +muốn bạn nhìn lại mình trong gương và nói với bản thân rằng bạn đã có được điều này. + +123 +00:07:56,540 --> 00:08:00,770 +Bạn có thể làm được. Và hãy nhớ rằng tôi đang ở đây để hỗ trợ bạn. + +124 +00:08:01,100 --> 00:08:02,300 +Tôi tin rằng bạn có thể làm điều đó. + +125 +00:08:02,300 --> 00:08:06,260 +Bạn đã có mọi thứ mà bạn đã học được cho đến nay sẽ cho phép bạn làm điều đó. + +126 +00:08:06,470 --> 00:08:09,140 +Không có gì mới trong thử thách này. + +127 +00:08:09,470 --> 00:08:11,750 +Bạn chỉ cần đặt tất cả các mảnh lại với nhau. + +128 +00:08:12,020 --> 00:08:16,370 +Bạn phải vượt qua những phần khó khăn và có thể ngủ quên về một vấn đề và suy nghĩ về nó + +129 +00:08:16,370 --> 00:08:21,050 +và sau đó quay lại với nó. Nhưng tôi tin bạn sẽ làm được. Khi bạn đã + +130 +00:08:21,050 --> 00:08:23,030 +sẵn sàng, hãy tạm dừng video, + +131 +00:08:23,660 --> 00:08:27,050 +chuyển sang dự án bắt đầu và bắt đầu. + +132 +00:08:28,310 --> 00:08:29,780 +Và khi bạn đã hài lòng, + +133 +00:08:29,840 --> 00:08:33,289 +hãy chuyển sang bài học tiếp theo và tôi sẽ hướng dẫn bạn cách giải quyết. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Fork-the-Day-11-Starting-Repl.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Fork-the-Day-11-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..928532396a6982d7364df98ab590f4bec7a86c64 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/002 Fork-the-Day-11-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/blackjack-start \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/003 Hint 4 & 5 Solution Walkthrough.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/003 Hint 4 & 5 Solution Walkthrough.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..27d941802bbb89457f97751be7ea1f1d73e4d1aa --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/003 Hint 4 & 5 Solution Walkthrough.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b28dd06a27b556fea5763e062fba9d5e42fa3891d28c4ccf05926542127a87b +size 56257227 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/003 Hint 4 & 5 Solution Walkthrough_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/003 Hint 4 & 5 Solution Walkthrough_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..35f472bf961ff804835c8d4640cbdee3381efab1 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/003 Hint 4 & 5 Solution Walkthrough_vi.srt @@ -0,0 +1,400 @@ +1 +00:00:00,280 --> 00:00:02,009 +Đúng. Vậy điều đó đã diễn ra như thế nào? + +2 +00:00:02,580 --> 00:00:06,150 +Tôi hy vọng nó diễn ra thực sự tốt và bạn đã có thể tự mình hoàn thành tất cả. + +3 +00:00:06,660 --> 00:00:11,310 +Nếu bạn gặp khó khăn, tôi thực sự khuyên bạn chỉ nên ăn một chiếc bánh mì sandwich, uống một tách trà, + +4 +00:00:11,580 --> 00:00:13,500 +nghỉ ngơi và sau đó quay lại với nó. + +5 +00:00:13,740 --> 00:00:17,460 +Bạn sẽ ngạc nhiên về những gì bộ não của bạn có thể làm khi nó chỉ được nghỉ ngơi một chút. + +6 +00:00:18,120 --> 00:00:21,840 +Nhưng tôi muốn bạn đảm bảo rằng bạn đã thực sự đi đúng hướng trước + +7 +00:00:21,840 --> 00:00:23,700 +khi đến đây và xem giải pháp. + +8 +00:00:24,120 --> 00:00:27,990 +Vì tôi sẽ hướng dẫn bạn từng bước giải pháp trong trường hợp có một số + +9 +00:00:28,200 --> 00:00:32,159 +điểm nhỏ hoặc điều gì đó mà bạn không hiểu hoặc điều gì đó mà bạn + +10 +00:00:32,159 --> 00:00:33,960 +muốn kiểm tra. Nhưng tôi thực sự, thực sự + +11 +00:00:33,960 --> 00:00:38,250 +hy vọng rằng bạn đã tự mình giải quyết được hầu hết vấn đề này. Được rồi. + +12 +00:00:38,250 --> 00:00:42,660 +Vì vậy, không cần phải quảng cáo thêm, chúng ta hãy bắt đầu viết mã cho dự án Blackjack của chúng tôi. + +13 +00:00:43,740 --> 00:00:47,130 +Hy vọng rằng bạn đã sử dụng gợi ý 1, 2 + +14 +00:00:47,550 --> 00:00:52,320 +hoặc 3 và tôi sẽ bắt đầu với gợi ý 4 và xây dựng dự án + +15 +00:00:52,350 --> 00:00:56,760 +Blackjack của chúng tôi từng bước. Bây giờ, ý tưởng của các gợi + +16 +00:00:56,760 --> 00:01:01,760 +ý 1, 2 và 3 là giúp bạn tạo ra những việc cần làm nhỏ này của riêng + +17 +00:01:03,300 --> 00:01:08,220 +bạn để bạn có thể thực hành chia nhỏ vấn đề thành một danh sách, sau đó + +18 +00:01:08,220 --> 00:01:13,170 +chia nó thành một sơ đồ rồi chia nhỏ. nó thành những việc cần làm nhỏ hơn. + +19 +00:01:13,860 --> 00:01:15,750 +Vì vậy, hãy bắt đầu với + +20 +00:01:16,350 --> 00:01:21,350 +cái đầu tiên, chúng ta phải tạo một hàm deal_card sử dụng danh sách bên dưới để + +21 +00:01:22,470 --> 00:01:27,180 +trả về một thẻ ngẫu nhiên và 11 sẽ là Át trong bộ bài này. + +22 +00:01:27,990 --> 00:01:32,850 +Vì vậy, hãy bắt đầu bằng cách tạo một bản sao của repl này và chúng ta sẽ + +23 +00:01:32,850 --> 00:01:34,740 +bắt đầu tạo hàm deal_card của mình. + +24 +00:01:35,610 --> 00:01:39,810 +Bây giờ hàm này sẽ chứa những thẻ này, vì vậy tôi sẽ + +25 +00:01:39,840 --> 00:01:43,770 +tiếp tục và dán nó vào, đảm bảo rằng nó được thụt + +26 +00:01:43,830 --> 00:01:48,830 +vào để nó nằm bên trong hàm. Và bây giờ tôi sẽ sử dụng những thẻ này để chọn ngẫu + +27 +00:01:49,650 --> 00:01:52,650 +nhiên một thẻ trong danh sách này. Vì vậy, để làm + +28 +00:01:52,680 --> 00:01:57,210 +điều đó, tất nhiên chúng ta có thể nhập mô-đun ngẫu nhiên của mình. + +29 +00:01:57,840 --> 00:02:02,840 +Và sau đó tôi sẽ sử dụng ngẫu nhiên. lựa chọn để chọn một thẻ ngẫu nhiên từ + +30 +00:02:03,900 --> 00:02:07,740 +danh sách các thẻ của tôi. Và sau đó điều này tất nhiên có một đầu ra, điều + +31 +00:02:07,770 --> 00:02:09,030 +này ngẫu nhiên. vì + +32 +00:02:09,330 --> 00:02:14,330 +vậy tôi sẽ lưu đầu ra đó, cụ thể là thẻ ngẫu nhiên, bên trong một biến được + +33 +00:02:15,480 --> 00:02:16,313 +gọi là thẻ. + +34 +00:02:16,770 --> 00:02:21,540 +Và cuối cùng chúng ta sẽ trả lại thẻ đã chọn này làm đầu ra. + +35 +00:02:22,200 --> 00:02:23,910 +Vậy là xong bước 4. + +36 +00:02:25,590 --> 00:02:27,480 +Bây giờ chúng ta hãy chuyển sang bước 5. + +37 +00:02:28,110 --> 00:02:33,030 +Vì vậy, chúng ta sẽ xử lý mỗi người dùng và máy tính hai thẻ bằng cách sử + +38 +00:02:33,030 --> 00:02:35,310 +dụng chức năng thẻ giao dịch, và + +39 +00:02:35,340 --> 00:02:38,760 +gợi ý rất hữu ích cho chúng ta biết rằng chúng ta + +40 +00:02:39,030 --> 00:02:42,810 +có thể bắt đầu với một user_card trống và một danh sách computer_card trống. + +41 +00:02:43,020 --> 00:02:46,110 +Vì vậy, về cơ bản chúng ta chỉ cần thêm hai thẻ vào + +42 +00:02:46,110 --> 00:02:48,660 +mỗi danh sách này. Để làm điều này, tôi + +43 +00:02:48,660 --> 00:02:53,660 +sẽ sử dụng vòng lặp for và tôi sẽ sử dụng toán tử phạm vi để chạy vòng lặp + +44 +00:02:55,560 --> 00:02:56,790 +for này hai lần. + +45 +00:02:57,150 --> 00:03:01,480 +Vì vậy, bạn đã thấy cú pháp này trước đây khi chúng ta nói về vòng lặp for và tôi + +46 +00:03:01,510 --> 00:03:05,620 +có một dấu gạch dưới ở đây vì chúng tôi thực sự không cần biến cụ thể này. + +47 +00:03:05,920 --> 00:03:08,650 +Tất cả những gì chúng ta cần là vòng lặp này chạy hai + +48 +00:03:08,770 --> 00:03:13,390 +lần và đoạn mã này sẽ đạt được điều đó. Mỗi khi vòng lặp này chạy, chúng + +49 +00:03:13,420 --> 00:03:16,840 +tôi sẽ nhận được một thẻ mới bằng cách gọi deal_card. + +50 +00:03:17,530 --> 00:03:20,440 +Bây giờ hãy nhớ rằng deal_card có một đầu ra, nó sẽ + +51 +00:03:20,740 --> 00:03:23,800 +xuất ra một thẻ ngẫu nhiên. Vì vậy, nếu bạn muốn, + +52 +00:03:23,800 --> 00:03:27,160 +thực sự khá hữu ích khi thêm một số tài liệu về điều này. + +53 +00:03:27,400 --> 00:03:32,400 +Vì vậy, chúng ta có thể nói trả về một thẻ ngẫu nhiên từ bộ bài. + +54 +00:03:34,720 --> 00:03:37,510 +Và bây giờ khi tôi viết deal_card, bạn có + +55 +00:03:37,570 --> 00:03:41,560 +thể thấy rằng tài liệu cho tôi biết rằng hàm này sẽ trả về + +56 +00:03:41,560 --> 00:03:46,330 +một thẻ ngẫu nhiên từ bộ bài. Vì vậy, thẻ ngẫu nhiên đó sẽ thay thế lệnh gọi hàm + +57 +00:03:46,420 --> 00:03:50,320 +này để chúng ta có thể nắm bắt dữ liệu đó bằng cách lưu trữ nó bên trong một biến. + +58 +00:03:50,740 --> 00:03:55,740 +Vì vậy, chúng tôi sẽ gọi new_card đó và đặt nó bằng đầu ra từ + +59 +00:03:57,670 --> 00:03:59,680 +hàm deal_card. Bây giờ, + +60 +00:03:59,770 --> 00:04:04,690 +điều tiếp theo chúng ta sẽ làm là thêm new_card này vào thẻ + +61 +00:04:04,690 --> 00:04:05,860 +của người dùng. + +62 +00:04:06,100 --> 00:04:11,100 +Vì vậy, hiện tại, đó là một danh sách trống và tất cả những gì chúng ta phải làm là nói user_cards. append và sau đó đối tượng mà chúng ta muốn + +63 +00:04:11,890 --> 00:04:13,060 +thêm + +64 +00:04:13,510 --> 00:04:17,890 +vào danh sách đó sẽ là new_ card. + +65 +00:04:17,890 --> 00:04:18,723 +Bây giờ một số bạn có thể bị cám dỗ để thay vào đó sử dụng dấu cộng bằng. + +66 +00:04:19,240 --> 00:04:24,240 +Bạn có thể muốn viết một cái gì đó như thế này; user_cards + = new_card. + +67 +00:04:25,360 --> 00:04:30,280 +Và tôi muốn cho bạn thấy những gì thực sự xảy ra khi bạn làm điều này. + +68 +00:04:30,970 --> 00:04:34,030 +vì đây là một lỗi thực sự phổ biến. + +69 +00:04:34,030 --> 00:04:35,770 +Chúng tôi lấy lại dấu vết và chúng tôi gặp lỗi loại. + +70 +00:04:36,370 --> 00:04:39,160 +Nó cho chúng ta biết rằng đối tượng int + +71 +00:04:39,370 --> 00:04:44,370 +không thể lặp lại và nó đánh dấu dòng 49 này là lý do gây ra lỗi. Vậy điều gì đang xảy ra ở đây? + +72 +00:04:46,390 --> 00:04:50,500 +Chà, dấu + = này thực sự là viết tắt để viết hàm mở + +73 +00:04:51,130 --> 00:04:51,400 +rộng. + +74 +00:04:51,400 --> 00:04:56,400 +Bây giờ bạn có thể thấy rằng hàm mở rộng là một cái gì đó mở rộng + +75 +00:04:58,180 --> 00:05:02,410 +danh sách bằng cách thêm các phần tử từ có thể lặp lại. Vì vậy, điều này có nghĩa là gì? Chà, có nghĩa là bất cứ thứ gì bạn đặt bên + +76 +00:05:02,770 --> 00:05:07,360 +trong dấu ngoặc + +77 +00:05:07,360 --> 00:05:11,410 +đơn này, bản thân nó phải là một danh sách. Ví dụ: nếu new_card này là một danh sách các thẻ, vì vậy + +78 +00:05:11,770 --> 00:05:15,340 +có thể chỉ là thẻ + +79 +00:05:15,850 --> 00:05:20,680 +được chia đầu tiên và một thẻ khác hoặc thậm chí chỉ riêng nó bên trong + +80 +00:05:20,830 --> 00:05:24,970 +một tập hợp các dấu ngoặc vuông biến nó thành một danh sách, thì + +81 +00:05:25,300 --> 00:05:29,500 +nếu chúng ta chạy mã này ngay bây giờ chúng tôi không còn bất + +82 +00:05:29,590 --> 00:05:34,240 +kỳ lỗi nào nữa và nếu tôi chuyển đổi điều này trở lại những gì bạn + +83 +00:05:35,680 --> 00:05:40,420 +đã thấy trước đó, đang sử dụng dấu cộng bằng, chúng tôi cũng không có lỗi. + +84 +00:05:40,450 --> 00:05:44,260 +Nhưng khi bạn chỉ muốn thêm một mục duy nhất, + +85 +00:05:44,920 --> 00:05:49,780 +không phải danh sách, vào danh sách hiện có thì bạn phải sử dụng append. Vì vậy, hy vọng bạn không gặp phải vấn đề này, nhưng nếu + +86 +00:05:50,020 --> 00:05:53,770 +bạn đã làm, đây là + +87 +00:05:54,100 --> 00:05:54,940 +lý do. Bây giờ chúng + +88 +00:05:55,000 --> 00:05:59,750 +tôi đã tạo hai dòng này, bạn có thể thấy rằng + +89 +00:05:59,810 --> 00:06:04,340 +nó hơi thừa vì chúng tôi đang tạo biến thẻ mới này chỉ để giữ đầu ra từ hàm này. + +90 +00:06:04,340 --> 00:06:08,120 +Và sau đó chúng tôi ngay lập tức đưa nó vào danh sách này bằng cách sử dụng append. + +91 +00:06:08,600 --> 00:06:12,710 +Vì vậy, thay vào đó, chúng ta thực sự có thể + +92 +00:06:13,220 --> 00:06:18,220 +loại bỏ người trung gian và đặt deal_card trực tiếp bên trong phần phụ. + +93 +00:06:18,980 --> 00:06:21,440 +Và điều này thực hiện chính xác những điều tương tự trong một dòng mã. + +94 +00:06:22,010 --> 00:06:25,460 +Khi chúng tôi đã làm điều này cho user_cards, chúng tôi có thể muốn làm + +95 +00:06:26,360 --> 00:06:28,430 +điều tương tự cho các thẻ máy tính. + +96 +00:06:28,460 --> 00:06:31,610 +Vì vậy, nó computer_cards. chắp thêm, và sau đó chúng tôi gọi lại deal_card, + +97 +00:06:32,000 --> 00:06:36,620 +ghi nhớ các dấu ngoặc đơn. + +98 +00:06:36,680 --> 00:06:37,970 +Vì vậy, chúng tôi + +99 +00:06:38,210 --> 00:06:43,210 +có tổng cộng ba dấu ngoặc ở cuối và theo cách này, chúng tôi xử lý một thẻ + +100 +00:06:43,520 --> 00:06:47,360 +mới và thẻ mới đó sẽ được thêm vào cuối danh sách này. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Hint 6-8 Solution Walkthrough.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Hint 6-8 Solution Walkthrough.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c9aca4f7e22e693d2236269498eb8dbe34bfddf0 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Hint 6-8 Solution Walkthrough.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73c54ffe67cda214a82362f2acd6e7264a50f3b9626bc35ee72598a106981904 +size 58231552 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Hint 6-8 Solution Walkthrough_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Hint 6-8 Solution Walkthrough_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cfb34cdf25ce0088e4d78a6b0b58e17e2a5e82a2 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Hint 6-8 Solution Walkthrough_vi.srt @@ -0,0 +1,288 @@ +1 +00:00:00,120 --> 00:00:03,090 +Được rồi. Vì vậy, bây giờ chúng ta hãy giải quyết gợi ý số 6. + +2 +00:00:03,660 --> 00:00:06,870 +Chúng ta sẽ tạo một hàm có tên là Calcul_score sẽ lấy + +3 +00:00:06,900 --> 00:00:09,570 +một danh sách các thẻ làm đầu vào và + +4 +00:00:09,990 --> 00:00:13,110 +sau đó nó trả về điểm số sau khi tính toán. + +5 +00:00:13,890 --> 00:00:16,050 +Và nó cho chúng ta biết rằng nếu chúng ta gặp khó + +6 +00:00:16,110 --> 00:00:18,420 +khăn, chúng ta có thể tra cứu hàm sum để giúp chúng ta. + +7 +00:00:19,080 --> 00:00:22,440 +Vì vậy, chúng ta hãy tạo một hàm được gọi + +8 +00:00:23,190 --> 00:00:27,720 +là Calcul_score và tính toán này sẽ lấy một số thẻ làm đầu vào, + +9 +00:00:28,350 --> 00:00:29,790 +sau đó bên trong + +10 +00:00:29,820 --> 00:00:34,670 +phần nội dung, nó sẽ tính tổng tất cả các thẻ trong danh sách này. + +11 +00:00:35,360 --> 00:00:38,780 +Vì vậy, nếu chúng ta xem xét hàm sum trong Python, + +12 +00:00:39,260 --> 00:00:43,100 +cách hoạt động của nó là bạn có thể đặt một hàm có + +13 +00:00:43,220 --> 00:00:47,930 +thể lặp lại, như một danh sách bên trong dấu ngoặc đơn làm đầu vào và + +14 +00:00:48,440 --> 00:00:52,310 +sau đó nó sẽ cộng tất cả các mục trong danh sách và + +15 +00:00:52,640 --> 00:00:56,570 +nó sẽ trả về tổng số. Quay lại mã của chúng tôi, chúng tôi + +16 +00:00:56,870 --> 00:01:00,950 +có thể chỉ cần viết tổng, và sau đó bên trong các dấu ngoặc đơn này, chúng + +17 +00:01:00,980 --> 00:01:05,980 +tôi có thể chuyển qua các thẻ và chúng tôi có thể trả về giá trị này dưới dạng đầu ra. + +18 +00:01:07,760 --> 00:01:08,450 +Về + +19 +00:01:08,450 --> 00:01:13,310 +cơ bản nếu chúng ta có các thẻ bằng một danh + +20 +00:01:13,340 --> 00:01:14,173 +sách với + +21 +00:01:14,180 --> 00:01:19,180 +1, 5, 3, 4, thì hàm tổng sẽ bằng 1 + 5 + +22 +00:01:19,580 --> 00:01:23,060 ++ 3 + 4, sẽ bằng 13. + +23 +00:01:23,360 --> 00:01:26,450 +Và sau đó nó sẽ trở thành đầu ra của hàm này. + +24 +00:01:27,530 --> 00:01:29,660 +Vì vậy, bây giờ chúng ta hãy chuyển sang gợi ý 7. + +25 +00:01:30,710 --> 00:01:32,660 +Xì dách chỉ xảy ra khi chúng ta + +26 +00:01:32,740 --> 00:01:37,740 +có một ván bài chỉ có hai quân bài và những quân bài đó phải là quân Át và một quân + +27 +00:01:39,470 --> 00:01:42,470 +bài có giá trị 10. Trong bộ bài của chúng tôi, + +28 +00:01:42,500 --> 00:01:47,500 +chúng tôi biết rằng một lá Át được đại diện bởi 11 và chúng tôi có một số 10 thẻ giá trị. + +29 +00:01:50,570 --> 00:01:54,410 +Vì vậy, có một số cách để chúng ta có thể kiểm tra trò Blackjack này. + +30 +00:01:54,980 --> 00:01:59,980 +Một trong những cách là kiểm tra xem số 11 có trong bộ bài của chúng tôi hay không, sau đó chúng + +31 +00:02:02,180 --> 00:02:07,180 +tôi có thể kết hợp số đó với một và để kiểm tra xem số 10 có trong bộ bài của + +32 +00:02:07,850 --> 00:02:09,800 +chúng tôi hay không. Và cuối cùng, chúng + +33 +00:02:09,830 --> 00:02:13,730 +tôi có thể kiểm tra để đảm bảo rằng chúng tôi có kích thước bàn tay là hai. + +34 +00:02:14,240 --> 00:02:19,070 +Vì vậy, chúng ta có thể kiểm tra xem độ dài của các quân bài của chúng ta có + +35 +00:02:19,790 --> 00:02:24,790 +bằng hai hay không và điều này sẽ đại diện cho logic này: một tay chỉ có hai quân bài, một + +36 +00:02:25,220 --> 00:02:29,900 +quân Át được biểu thị bằng 11 và 10. Mặt khác, chúng tôi thực sự cũng + +37 +00:02:29,930 --> 00:02:34,930 +có thể đơn giản hóa điều này bởi vì một ván bài chỉ có hai + +38 +00:02:35,630 --> 00:02:38,600 +thẻ phải chứa 11 và 10, thay vì + +39 +00:02:38,600 --> 00:02:42,380 +kiểm tra cả 11 và 10, chúng ta có thể kiểm + +40 +00:02:42,410 --> 00:02:44,390 +tra xem tổng nếu + +41 +00:02:44,420 --> 00:02:49,420 +chúng ta cộng các thẻ và nếu con số này bằng 21, thì nó sẽ + +42 +00:02:50,750 --> 00:02:55,010 +giống hệt như vậy, phải không? 10 + 11 là 21 và chúng tôi vẫn + +43 +00:02:55,490 --> 00:02:59,740 +chỉ có một bộ bài hai người. Trong trường hợp này, điều chúng ta + +44 +00:02:59,770 --> 00:03:04,600 +muốn xảy ra là chúng ta muốn trả về số 0 thay vì điểm số thực tế. + +45 +00:03:05,110 --> 00:03:10,110 +Vì vậy, theo cách này, chúng tôi có thể chỉ ra rằng người dùng hoặc + +46 +00:03:10,720 --> 00:03:15,010 +máy tính đã đạt điểm Blackjack. Đó là gợi ý số 7 được + +47 +00:03:15,190 --> 00:03:20,110 +sắp xếp, hãy chuyển sang gợi ý số 8. Nó cho chúng ta biết rằng bên trong Calcul_score, + +48 +00:03:20,320 --> 00:03:23,770 +chúng ta cũng nên kiểm tra xem 11 có phải là Át không. + +49 +00:03:24,400 --> 00:03:26,620 +Nếu số điểm đã hơn 21, thì chúng + +50 +00:03:27,010 --> 00:03:32,010 +ta nên loại bỏ số 11 khỏi các quân bài và chúng ta có thể thay thế nó bằng một quân + +51 +00:03:32,920 --> 00:03:36,940 +khác, bởi vì hãy nhớ rằng một lá Át có thể được tính là 11 hoặc 1. + +52 +00:03:37,420 --> 00:03:41,140 +Vì vậy, ban đầu, khi điểm của người dùng rất nhỏ, thì chúng + +53 +00:03:41,380 --> 00:03:43,840 +tôi có thể muốn tính nó là 11. + +54 +00:03:44,260 --> 00:03:46,690 +Nhưng khi người dùng vượt quá 21 tuổi, thì + +55 +00:03:46,960 --> 00:03:50,470 +chúng tôi có thể muốn thay đổi nó và tính nó là 1 để + +56 +00:03:50,500 --> 00:03:55,000 +họ không vượt qua và không bị thua. Đầu tiên chúng ta hãy viết câu + +57 +00:03:55,000 --> 00:03:55,870 +lệnh if. + +58 +00:03:56,140 --> 00:04:01,140 +Vì vậy, nếu có 11 bên trong bộ bài của chúng ta và tổng của + +59 +00:04:03,670 --> 00:04:08,650 +các quân bài, do đó, tổng điểm, đã hơn 21, thì chúng ta muốn + +60 +00:04:09,220 --> 00:04:11,140 +làm gì đó với nó. + +61 +00:04:11,680 --> 00:04:15,550 +Và gợi ý cho chúng ta biết hãy tra cứu các hàm append và remove. + +62 +00:04:16,089 --> 00:04:19,180 +Vì vậy, chúng ta đã thấy hàm append nhiều lần và + +63 +00:04:19,360 --> 00:04:23,500 +chúng ta biết rằng nó chỉ thêm một phần tử duy nhất vào cuối danh sách. + +64 +00:04:24,520 --> 00:04:28,180 +Bây giờ cái mà chúng tôi không sử dụng nhiều là hàm remove + +65 +00:04:28,750 --> 00:04:33,750 +và cái này chúng tôi sẽ tìm kiếm trường hợp đầu tiên của phần tử đã cho và + +66 +00:04:34,870 --> 00:04:38,260 +loại bỏ nó khỏi danh sách. Đây là loại những gì chúng ta cần làm. + +67 +00:04:38,590 --> 00:04:43,360 +Chúng ta cần tiếp tục và xóa số 11 khỏi danh sách các thẻ. Vì vậy, chúng ta có + +68 +00:04:43,360 --> 00:04:47,080 +thể viết thiệp. loại bỏ, và bên trong dấu ngoặc, chúng + +69 +00:04:47,380 --> 00:04:52,030 +tôi sử dụng thẻ 11 và sau đó chúng tôi làm. nối, để cuối cùng chúng + +70 +00:04:52,360 --> 00:04:55,960 +ta thêm số 1 thay vì số 11. + +71 +00:04:56,740 --> 00:05:00,310 +Bằng cách này, chúng tôi loại bỏ số 11 và thay thế bằng số 1. + +72 +00:05:01,210 --> 00:05:05,140 +Và hy vọng thẻ của chúng tôi hiện sẽ đưa người dùng xuống dưới 21. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Python-list-methods.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Python-list-methods.url new file mode 100644 index 0000000000000000000000000000000000000000..a25db77a60460f983ba9fc5542a4ff3f976122c4 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Python-list-methods.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://developers.google.com/edu/python/lists#list-methods \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Python-sum-Function.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Python-sum-Function.url new file mode 100644 index 0000000000000000000000000000000000000000..ebf7f8a11e12e5c9379c3b36b395709052db3402 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/004 Python-sum-Function.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/functions.html#sum \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/005 Hint 9 Solution Walkthrough Refactoring and calling calculate_score().mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/005 Hint 9 Solution Walkthrough Refactoring and calling calculate_score().mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cb7454cafb0a021b457970df2b20ac7907fc0faa --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/005 Hint 9 Solution Walkthrough Refactoring and calling calculate_score().mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cb174e545f657f279f8bfee75dbb6df07baf41195bf0766ef6d1c942e1c7fb2 +size 54513444 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/005 Hint 9 Solution Walkthrough Refactoring and calling calculate_score()_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/005 Hint 9 Solution Walkthrough Refactoring and calling calculate_score()_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..229be41ec3759a6161558ea79b11daac2f85684a --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/005 Hint 9 Solution Walkthrough Refactoring and calling calculate_score()_vi.srt @@ -0,0 +1,308 @@ +1 +00:00:00,810 --> 00:00:04,620 +Bây giờ chúng ta hãy chuyển sang một gợi ý 9. Vì vậy, chúng tôi muốn gọi + +2 +00:00:04,620 --> 00:00:07,350 +tính toán điểm số tại một số điểm trong mã + +3 +00:00:07,920 --> 00:00:10,830 +của chúng tôi và nếu máy tính hoặc người dùng có + +4 +00:00:11,250 --> 00:00:15,390 +Xì dách hoặc nếu điểm của người dùng trên 21, thì trò chơi sẽ kết thúc. + +5 +00:00:15,900 --> 00:00:19,440 +Đây có thể là thời điểm tốt để bắt đầu thu dọn mã của + +6 +00:00:19,860 --> 00:00:22,320 +chúng ta một chút, bởi vì chúng ta đã có + +7 +00:00:23,310 --> 00:00:25,140 +hàm ở đây, hàm tính điểm. + +8 +00:00:25,710 --> 00:00:29,790 +Và hãy nhớ rằng bạn chỉ có thể gọi một hàm sau khi nó được khai báo. + +9 +00:00:30,150 --> 00:00:34,500 +Vì vậy, ví dụ, nếu tôi muốn gọi hàm này ở đây, thì tôi thực + +10 +00:00:34,860 --> 00:00:36,090 +sự không thể. + +11 +00:00:36,090 --> 00:00:40,710 +Tôi không thể nói Calcul_score vì nó chưa được khai báo. + +12 +00:00:41,310 --> 00:00:42,210 +Vì vậy, thay + +13 +00:00:42,240 --> 00:00:46,980 +vào đó, những gì tôi sẽ làm là tôi sẽ sử dụng chức năng này và tôi sẽ chuyển nó đến + +14 +00:00:47,220 --> 00:00:51,720 +nơi chúng ta chia bài và tôi sẽ thu gọn một số chức năng này để tôi có thể + +15 +00:00:51,720 --> 00:00:55,080 +xem gợi ý của mình và mã của tôi dễ dàng hơn một chút. + +16 +00:00:56,040 --> 00:01:00,360 +Vì vậy, bây giờ tôi đã chuyển hàm của mình lên trên dòng mà tôi muốn gọi nó, nó + +17 +00:01:00,690 --> 00:01:02,430 +bây giờ trở thành mã hợp lệ. + +18 +00:01:02,970 --> 00:01:07,530 +Và đây là nơi tôi muốn gọi nó vì chỉ sau khi tôi chia bài + +19 +00:01:07,530 --> 00:01:12,390 +cho người dùng và máy tính, tôi mới có thể thực sự tính điểm của họ. + +20 +00:01:12,900 --> 00:01:16,740 +Đầu tiên, tôi muốn tính điểm bằng cách sử dụng thẻ của người dùng. + +21 +00:01:17,160 --> 00:01:22,160 +Vì vậy, danh sách các thẻ từ người dùng này được chuyển vào hàm này và sử + +22 +00:01:22,800 --> 00:01:26,280 +dụng tất cả logic để xuất ra một số loại điểm. + +23 +00:01:27,180 --> 00:01:29,820 +Và sau đó tôi sẽ lưu trữ điểm số đó trong một biến + +24 +00:01:29,820 --> 00:01:31,290 +mà tôi sẽ gọi là user_score. + +25 +00:01:32,190 --> 00:01:35,160 +Và tôi cũng sẽ làm điều tương tự cho + +26 +00:01:35,190 --> 00:01:40,170 +máy tính, vì vậy computer_score bằng Calcul_score. Và hãy nhớ rằng luôn hữu ích nếu bạn + +27 +00:01:40,440 --> 00:01:45,440 +thêm một chút chuỗi tài liệu để nói cho chính chúng ta và các lập trình viên khác + +28 +00:01:45,870 --> 00:01:49,650 +biết chức năng này hoạt động. Hãy nhanh chóng tóm tắt nó. + +29 +00:01:49,650 --> 00:01:54,650 +Vì vậy, chức năng này sẽ lấy một danh sách các thẻ và trả về điểm + +30 +00:01:57,120 --> 00:01:58,980 +được tính từ các thẻ. + +31 +00:02:00,780 --> 00:02:02,790 +Vì vậy, bây giờ khi tôi mở dấu ngoặc + +32 +00:02:03,150 --> 00:02:07,200 +đơn đó, tôi biết rằng có lẽ tôi phải vượt qua danh sách các thẻ của mình để lấy + +33 +00:02:07,200 --> 00:02:08,032 +lại điểm số. + +34 +00:02:08,130 --> 00:02:12,480 +Vì vậy, hãy đặt computer_cards làm đầu vào, và bây giờ + +35 +00:02:12,900 --> 00:02:15,690 +chúng ta đã có user_score và computer_score. + +36 +00:02:16,110 --> 00:02:18,000 +Vì vậy, điểm số này có thể + +37 +00:02:18,030 --> 00:02:22,890 +bằng 0 nếu họ nhận được Xì dách hoặc nó có thể chỉ đơn giản là giá trị của các quân + +38 +00:02:22,890 --> 00:02:24,930 +bài mà họ nắm giữ cộng lại với nhau. + +39 +00:02:26,070 --> 00:02:28,620 +Bây giờ chúng tôi đã gọi là Calcul_score, + +40 +00:02:29,040 --> 00:02:34,040 +chúng tôi cũng muốn đảm bảo rằng nếu máy tính hoặc người dùng có Xì dách hoặc + +41 +00:02:34,710 --> 00:02:39,450 +nếu điểm của người dùng trên 21, thì chúng tôi phải kết thúc trò chơi. + +42 +00:02:40,740 --> 00:02:45,510 +Hãy viết câu lệnh if của chúng tôi. Nếu user_score bằng 0 hoặc + +43 +00:02:46,080 --> 00:02:50,130 +computer_score bằng 0 hoặc user_score lớn hơn 21, + +44 +00:02:50,760 --> 00:02:55,740 +thì trong trường hợp này, chúng ta sẽ thông báo + +45 +00:02:55,770 --> 00:02:58,140 +trò chơi kết thúc. + +46 +00:02:58,560 --> 00:03:03,130 +Vì vậy, chúng tôi có thể tạo một biến mới có tên is_game_over và tất + +47 +00:03:04,450 --> 00:03:08,890 +nhiên chúng tôi bắt đầu với false. Nhưng sau đó khi điều này + +48 +00:03:08,950 --> 00:03:12,160 +xảy ra, chúng tôi sẽ thay đổi biến đó thành true. + +49 +00:03:13,180 --> 00:03:16,960 +Biến is_game_over của chúng ta chỉ là một boolean đơn giản. + +50 +00:03:17,620 --> 00:03:21,100 +Nó bắt đầu là false và khi các điều kiện nhất định được đáp ứng, + +51 +00:03:21,310 --> 00:03:25,660 +sau đó chúng tôi thay đổi nó thành true. Hiện tại, chương trình của chúng tôi vẫn chưa kết thúc. + +52 +00:03:25,750 --> 00:03:29,880 +Vì vậy, không thực sự rõ ràng là chúng ta sẽ sử dụng biến + +53 +00:03:29,890 --> 00:03:33,220 +is_game_over này như thế nào. Nhưng chúng tôi đang chuẩn bị cho các bước tiếp theo. + +54 +00:03:33,670 --> 00:03:36,190 +Bây giờ chúng tôi đang theo dõi xem trò chơi có nên kết thúc hay + +55 +00:03:36,400 --> 00:03:39,520 +không, chúng tôi có thể xem xét giá trị này để xác định những gì cần làm tiếp theo. + +56 +00:03:39,880 --> 00:03:44,740 +Vậy là đã hoàn thành gợi ý 9. Hãy kiểm tra mã của chúng tôi và xem mọi thứ hoạt động như thế + +57 +00:03:44,740 --> 00:03:45,573 +nào cho đến nay. + +58 +00:03:45,820 --> 00:03:49,840 +Tôi sẽ thêm một số báo cáo in ở đây để tôi có thể xem thẻ của người dùng + +59 +00:03:49,840 --> 00:03:54,670 +là gì và điểm của người dùng là bao nhiêu. Sử dụng một chuỗi, tôi sẽ hiển + +60 +00:03:54,730 --> 00:03:59,470 +thị các thẻ của bạn, thẻ của người dùng và điểm số hiện tại. + +61 +00:04:00,880 --> 00:04:04,810 +Và tôi cũng sẽ in thẻ máy tính đầu tiên. + +62 +00:04:05,320 --> 00:04:08,350 +Hãy nhớ khi tôi lần đầu tiên giải thích các quy + +63 +00:04:08,710 --> 00:04:12,220 +tắc của Blackjack, người chia bài sẽ tiết lộ lá bài đầu tiên của + +64 +00:04:12,640 --> 00:04:17,050 +họ để bạn có một chút manh mối về loại ván bài mà họ có thể có. + +65 +00:04:18,160 --> 00:04:21,310 +Vì vậy, ở đây, chúng tôi sẽ chèn các thẻ của máy + +66 +00:04:21,760 --> 00:04:26,470 +tính và chúng tôi sẽ chỉ chọn ra mục đầu tiên, sao cho mục ở chỉ số 0 và chúng + +67 +00:04:26,590 --> 00:04:30,610 +tôi làm điều đó bằng cách sử dụng dấu ngoặc vuông sau tên của danh sách. + +68 +00:04:31,960 --> 00:04:36,220 +Bây giờ chúng ta hãy chạy chương trình của chúng ta và xem nó có thực sự hoạt động hay không. + +69 +00:04:36,820 --> 00:04:40,780 +Điều đầu tiên được in là danh sách các thẻ của chúng tôi. + +70 +00:04:40,840 --> 00:04:41,920 +Vì vậy, trong tay + +71 +00:04:41,950 --> 00:04:46,180 +của chúng tôi, chúng tôi có 2 và chúng tôi có 6 và 2 + 6 cộng lại + +72 +00:04:46,210 --> 00:04:48,040 +với nhau tất nhiên tạo thành điểm 8. + +73 +00:04:48,670 --> 00:04:52,630 +Và sau đó nó tiết lộ cho chúng ta thẻ đầu tiên của máy tính, đó là thẻ 10. + +74 +00:04:53,320 --> 00:04:57,730 +Bây giờ chúng ta có thể yên tâm một cách hợp lý rằng mã của chúng ta đang hoạt động. + +75 +00:04:58,330 --> 00:05:02,170 +Và bạn nên thường xuyên kiểm tra mã của mình để không phải đợi đến cuối + +76 +00:05:02,170 --> 00:05:04,120 +khi chúng có rất nhiều vấn đề và + +77 +00:05:04,360 --> 00:05:06,790 +bạn không biết phần nào của mã chịu trách nhiệm. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/006 Hint 10-12 Solution Walkthrough.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/006 Hint 10-12 Solution Walkthrough.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7d8d1d61634fd6c6a726ca87b0bf77a5763c2141 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/006 Hint 10-12 Solution Walkthrough.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f2aa9319421d9c5f078b8b9bfc9f40bd00b7e790d42b1acc9dc1daad07bdf2b +size 99924841 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/006 Hint 10-12 Solution Walkthrough_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/006 Hint 10-12 Solution Walkthrough_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5d43f6f64b27fb2a06e52b5343255a91508fdb2b --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/006 Hint 10-12 Solution Walkthrough_vi.srt @@ -0,0 +1,324 @@ +1 +00:00:00,390 --> 00:00:02,940 +Bây giờ chúng ta hãy chuyển sang gợi ý số 10. + +2 +00:00:03,660 --> 00:00:06,750 +Nó nói rằng nếu trò chơi chưa kết thúc, hãy hỏi người dùng xem họ có + +3 +00:00:06,750 --> 00:00:09,630 +muốn rút một lá bài khác không. Nếu có thì hãy sử dụng + +4 +00:00:09,660 --> 00:00:13,470 +chức năng thẻ deal để thêm một thẻ khác vào danh sách thẻ của người dùng. + +5 +00:00:13,830 --> 00:00:15,840 +Nếu không, thì trò chơi đã + +6 +00:00:15,900 --> 00:00:19,680 +kết thúc một lần nữa. Ở đây, trong câu lệnh if, + +7 +00:00:19,740 --> 00:00:24,540 +chúng ta có thể thêm một cái khác vì nếu trò chơi chưa kết thúc, vì họ chưa + +8 +00:00:24,570 --> 00:00:27,840 +vượt quá 21 tuổi hoặc không ai có Blackjack, thì chúng tôi + +9 +00:00:28,140 --> 00:00:31,920 +sẽ hỏi người dùng xem họ có muốn lấy một cái khác không Thẻ. + +10 +00:00:32,340 --> 00:00:34,410 +Tôi sẽ sử dụng một đầu vào + +11 +00:00:35,370 --> 00:00:38,700 +và tôi sẽ yêu cầu người dùng nhập 'y' để nhận một thẻ + +12 +00:00:39,120 --> 00:00:41,340 +khác, nếu không, hãy nhập 'n' để vượt qua. + +13 +00:00:42,000 --> 00:00:45,360 +Và tôi sẽ lưu đầu vào này bên trong một + +14 +00:00:45,410 --> 00:00:47,900 +biến, mà tôi sẽ gọi là user_should_deal. + +15 +00:00:49,340 --> 00:00:54,340 +Bây giờ chúng ta có thể kiểm tra xem biến này có bằng 'y' hay không. Trong trường hợp đó, chúng tôi sẽ thêm + +16 +00:00:57,410 --> 00:00:59,810 +một thẻ khác vào danh sách thẻ + +17 +00:00:59,810 --> 00:01:03,980 +của người dùng bằng cách thực hiện tương tự như chúng tôi đã + +18 +00:01:04,069 --> 00:01:07,550 +làm ở phần đầu khi chúng tôi chia hai thẻ cho + +19 +00:01:07,580 --> 00:01:12,380 +mỗi người chơi bằng cách nói user_cards. thêm vào và bên trong dấu ngoặc + +20 +00:01:12,400 --> 00:01:16,790 +đơn, thứ mà chúng ta muốn nối thêm là đầu ra từ deal_card. + +21 +00:01:18,080 --> 00:01:22,730 +Vì vậy, chỉ cần kiểm tra nhanh để đảm bảo bạn đã có tất cả các dấu ngoặc ở đó và sau + +22 +00:01:22,760 --> 00:01:26,990 +đó chúng tôi sẵn sàng giải quyết vấn đề khác. Nếu họ không nhập 'y', thì điều đó có + +23 +00:01:27,140 --> 00:01:30,920 +nghĩa là họ không muốn một thẻ khác. Vậy thì, trong trường hợp này, + +24 +00:01:30,950 --> 00:01:32,630 +trò chơi lại kết thúc. + +25 +00:01:32,780 --> 00:01:35,960 +Vì vậy, chúng ta có thể nói is_game_over bằng true. + +26 +00:01:38,210 --> 00:01:39,740 +Hãy kiểm tra điều này là tốt. + +27 +00:01:40,340 --> 00:01:44,600 +Chúng tôi được 7 và 11 với số điểm hiện tại là 18. + +28 +00:01:45,140 --> 00:01:48,500 +Nếu chúng ta gõ 'y', hy vọng chúng ta sẽ nhận được một thẻ khác. + +29 +00:01:49,520 --> 00:01:52,460 +Và chúng tôi đã nhìn thấy lời nhắc đó và chúng tôi đã thấy điều gì đó xảy + +30 +00:01:52,820 --> 00:01:57,530 +ra, nhưng chương trình của chúng tôi sau đó đã nhanh chóng kết thúc. Chúng ta hãy xem bước tiếp theo. + +31 +00:01:57,650 --> 00:02:00,110 +Làm thế nào chúng ta có thể làm cho trò chơi của chúng ta lặp lại chính nó? + +32 +00:02:00,830 --> 00:02:04,580 +Vì vậy, gợi ý số 11 cho chúng ta biết rằng điểm số sẽ cần được kiểm tra lại + +33 +00:02:04,580 --> 00:02:05,990 +với mỗi lá bài mới được + +34 +00:02:06,470 --> 00:02:10,940 +rút ra và các kiểm tra trong gợi ý số 9 cần được lặp lại cho đến khi trò chơi kết thúc. + +35 +00:02:11,510 --> 00:02:15,890 +Hãy lưu ý cách chúng tôi có cờ này, is_game_over, được đặt thành true bất cứ + +36 +00:02:16,160 --> 00:02:19,880 +khi nào trò chơi kết thúc. Nó bắt đầu là sai và + +37 +00:02:20,240 --> 00:02:23,900 +điều này có nghĩa là chúng ta thực sự có thể tạo một + +38 +00:02:24,260 --> 00:02:27,260 +vòng lặp while về cơ bản tiếp tục tính toán + +39 +00:02:27,350 --> 00:02:30,590 +user_score và computer_score, thực hiện tất cả các kiểm tra này + +40 +00:02:30,800 --> 00:02:32,390 +trong gợi ý 9, sau + +41 +00:02:32,780 --> 00:02:36,050 +đó lặp lại chính nó cho đến khi trò chơi kết thúc. + +42 +00:02:36,860 --> 00:02:40,370 +Hãy tiếp tục và làm điều đó. Sau tất cả thiết lập ban + +43 +00:02:40,520 --> 00:02:45,320 +đầu, chúng ta sẽ tạo một vòng lặp while và vòng lặp while sẽ hoạt động cho đến + +44 +00:02:45,500 --> 00:02:48,560 +khi trò chơi kết thúc. Vì vậy, chúng ta + +45 +00:02:48,560 --> 00:02:50,900 +có thể nói trong khi không is_game_over, sau + +46 +00:02:51,770 --> 00:02:55,460 +đó tiếp tục và thực hiện tất cả các hướng dẫn này. + +47 +00:02:55,760 --> 00:02:59,060 +Vì vậy, hãy tính user_score, tính toán computer_score, kiểm + +48 +00:02:59,380 --> 00:03:03,670 +tra xem không ai trên 21 tuổi và không ai nhận Blackjack. + +49 +00:03:04,090 --> 00:03:08,190 +Và nếu người dùng muốn nhiều thẻ hơn mức họ cần, nếu họ không + +50 +00:03:08,190 --> 00:03:12,040 +có thì trò chơi kết thúc. Vì vậy, hãy chạy cái này và thử lại. + +51 +00:03:14,160 --> 00:03:18,270 +Các thẻ của chúng tôi là 10 và 10 có thể có nghĩa là chúng tôi + +52 +00:03:18,270 --> 00:03:22,320 +không nên lấy thẻ khác vì chúng tôi đã gần 21, nhưng tôi vẫn sẽ táo + +53 +00:03:22,320 --> 00:03:26,730 +bạo và nhấn 'y' bất cứ lúc nào. Và nó cho chúng ta biết rằng dây của chúng ta bây + +54 +00:03:26,760 --> 00:03:28,260 +giờ là 10, 10 cộng với hai. + +55 +00:03:28,590 --> 00:03:32,490 +Vì vậy, chúng tôi có thêm một thẻ và điều đó nâng số điểm của chúng tôi lên 22. + +56 +00:03:33,030 --> 00:03:34,620 +Điều đó đã hoạt động hoàn hảo. + +57 +00:03:35,310 --> 00:03:38,820 +Vì vậy, bây giờ chúng ta hãy quay trở lại và giải quyết phần tiếp theo. Gợi ý số 12 cho + +58 +00:03:38,820 --> 00:03:42,960 +biết một khi người dùng hoàn tất, đã đến lúc để máy tính chơi. + +59 +00:03:43,410 --> 00:03:48,270 +Máy tính nên tiếp tục vẽ các thẻ miễn là nó có điểm nhỏ hơn 17. + +60 +00:03:49,200 --> 00:03:53,940 +Vì vậy, vòng lặp while có nhiệm vụ xử lý khi người dùng muốn tiếp + +61 +00:03:53,940 --> 00:03:56,880 +tục vẽ các thẻ. Nhưng một khi đã xong, + +62 +00:03:56,970 --> 00:03:59,280 +chúng ta có thể giải quyết gợi ý số 12, + +63 +00:03:59,700 --> 00:04:04,110 +đó là cách máy tính thực sự hoạt động? Chiến lược của nó là gì? + +64 +00:04:04,680 --> 00:04:08,010 +Chúng ta biết rằng máy tính phải tiếp tục vẽ các thẻ + +65 +00:04:08,520 --> 00:04:13,020 +miễn là nó có điểm nhỏ hơn 17. Tuy nhiên, tất nhiên, 0 đại + +66 +00:04:13,260 --> 00:04:17,370 +diện cho Xì dách cũng nhỏ hơn 17, nhưng chúng tôi không + +67 +00:04:17,670 --> 00:04:21,420 +muốn nó rút một lá bài nếu nó có Xì dách. + +68 +00:04:22,230 --> 00:04:27,230 +Chúng ta có thể biểu diễn logic này bằng cách sử dụng một vòng lặp + +69 +00:04:29,460 --> 00:04:34,460 +while; trong khi computer_score không bằng 0 và computer_score nhỏ hơn 17, thì trong trường + +70 +00:04:37,380 --> 00:04:40,410 +hợp này chúng ta muốn tiếp tục rút thẻ. + +71 +00:04:41,100 --> 00:04:43,350 +Chúng tôi sẽ lấy các thẻ máy tính và + +72 +00:04:43,830 --> 00:04:48,830 +chúng tôi sẽ sử dụng phần phụ để thêm một thẻ bằng cách chia một thẻ khác vào + +73 +00:04:49,560 --> 00:04:50,393 +máy tính. + +74 +00:04:51,120 --> 00:04:56,120 +Và sau đó, chúng tôi sẽ tính toán lại điểm số máy tính để nó cập nhật và + +75 +00:04:56,760 --> 00:05:00,570 +vòng lặp while này được đánh giá trên điểm số mới nhất. + +76 +00:05:01,260 --> 00:05:06,150 +Vì vậy, computer_score sẽ tính toán bằng nhau bằng cách sử dụng các thẻ của + +77 +00:05:06,150 --> 00:05:06,983 +máy tính. + +78 +00:05:07,740 --> 00:05:12,740 +Và điều đó có nghĩa là điểm_của máy_ tính được cập nhật bằng với giá trị + +79 +00:05:13,680 --> 00:05:18,600 +trả về từ điểm_tính_tính. Vậy là đã hoàn thành gợi ý 12. Trong bước tiếp theo, chúng ta sẽ + +80 +00:05:18,660 --> 00:05:22,020 +bắt đầu so sánh ván bài của người chơi với ván bài của người chia bài. + +81 +00:05:22,350 --> 00:05:23,430 +Hẹn gặp lại các bạn trong bài học tiếp theo. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Blackjack-Completed-Code.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Blackjack-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..3963c98414c08fb3182b3db9beb349270b9ee2a6 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Blackjack-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/blackjack-final \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Course-Fixes-Report-an-Issue.url b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Hint 13 Solution Walkthrough.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Hint 13 Solution Walkthrough.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3602ad4a7127631be443582a31c38d389db6871a --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Hint 13 Solution Walkthrough.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45b4c78b7dee5db6d64ca97088bae7fb0ba5a89acf530bd36d1705eed17646f5 +size 126111453 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Hint 13 Solution Walkthrough_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Hint 13 Solution Walkthrough_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..dac3d7d4e103134eb0742076a05b868fef7ddeac --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/007 Hint 13 Solution Walkthrough_vi.srt @@ -0,0 +1,496 @@ +1 +00:00:00,690 --> 00:00:03,420 +Tại thời điểm này, chúng tôi đã tạo hai vòng lặp while. + +2 +00:00:03,540 --> 00:00:08,070 +Vòng lặp while đầu tiên dành cho người dùng để họ có thể tiếp tục lấy bài + +3 +00:00:08,370 --> 00:00:12,660 +và vòng lặp while thứ hai dành cho máy tính để người chia bài có thể + +4 +00:00:12,660 --> 00:00:16,410 +làm theo chiến lược của họ. Bây giờ đã đến lúc giải quyết gợi ý + +5 +00:00:16,470 --> 00:00:18,870 +13 trong đó chúng ta tạo một hàm có tên là so sánh. + +6 +00:00:20,220 --> 00:00:23,520 +Chúng tôi vượt qua user_score và computer_score cuối cùng, sau đó chúng + +7 +00:00:24,180 --> 00:00:28,380 +tôi so sánh điểm số để xem ai đã thắng, ai đã thua hoặc liệu + +8 +00:00:28,560 --> 00:00:30,330 +họ có hòa hay không. + +9 +00:00:31,740 --> 00:00:34,080 +Vì vậy, hãy nhớ rằng để gọi một hàm, + +10 +00:00:34,470 --> 00:00:37,710 +nó phải được khai báo trước dòng mà chúng ta muốn sử dụng nó. + +11 +00:00:38,160 --> 00:00:41,640 +Vì vậy, hãy quay lại và sau gợi ý số sáu nơi chúng + +12 +00:00:41,640 --> 00:00:43,560 +ta có hàm cuối cùng, hãy thêm + +13 +00:00:43,890 --> 00:00:47,880 +gợi ý này ở đây và tạo hàm so sánh của chúng ta ở đây. + +14 +00:00:48,600 --> 00:00:53,600 +Hàm so sánh này sẽ lấy user_score và cả điểm computer_ và + +15 +00:00:54,060 --> 00:00:57,420 +nó sẽ so sánh hai điểm số này. + +16 +00:00:58,080 --> 00:01:02,040 +Nếu user_score bằng computer_score, thì chúng tôi đã nói điều + +17 +00:01:02,790 --> 00:01:06,390 +này có nghĩa là đó là một trận hòa. + +18 +00:01:07,170 --> 00:01:11,430 +Vì vậy, chúng tôi sẽ trả lại một số loại thông báo đại diện cho điều này. + +19 +00:01:12,090 --> 00:01:17,090 +Nhưng elif hoặc nếu máy tính có Xì dách, vì vậy điểm số của + +20 +00:01:19,140 --> 00:01:23,610 +máy tính bằng 0, tốt trong trường hợp này chúng ta + +21 +00:01:23,640 --> 00:01:28,640 +nên trả về rằng người dùng đã thua và đối thủ có Xì dách. + +22 +00:01:29,460 --> 00:01:32,940 +Và sau đó chúng tôi xem qua danh sách này và chúng tôi thêm vào tất cả các điều kiện khác. + +23 +00:01:33,090 --> 00:01:34,260 +Vì vậy, tôi sẽ tăng tốc nó lên một chút. + +24 +00:01:37,440 --> 00:01:39,090 +Bây giờ đối với điều kiện cuối + +25 +00:01:39,780 --> 00:01:43,110 +cùng, nó nói rằng người chơi có điểm số cao nhất sẽ giành chiến thắng. + +26 +00:01:43,680 --> 00:01:48,680 +Vì vậy, chúng ta có thể viết một elif so sánh user_score với điểm máy tính + +27 +00:01:50,910 --> 00:01:55,890 +và về cơ bản chúng ta đang nói nếu user_score lớn hơn điểm máy tính thì + +28 +00:01:56,160 --> 00:01:58,800 +điều đó có nghĩa là người dùng thắng. + +29 +00:02:00,420 --> 00:02:05,250 +Nhưng nếu điều đó không đúng và bởi vì chúng tôi đã bao gồm mọi thứ khác, bây + +30 +00:02:05,640 --> 00:02:09,090 +giờ chúng tôi có lợi nhuận cuối cùng, đó là bạn mất. + +31 +00:02:11,700 --> 00:02:12,030 +Bây + +32 +00:02:12,030 --> 00:02:17,030 +giờ, hãy nhớ rằng các câu lệnh if, elif, else được đánh giá từ trên xuống dưới. + +33 +00:02:18,570 --> 00:02:22,800 +Mặc dù nếu điểm máy tính là số 0 thì đó là trò Xì dách rõ ràng + +34 +00:02:23,160 --> 00:02:26,490 +là ít hơn nhiều so với bất kỳ điểm số nào mà + +35 +00:02:27,060 --> 00:02:32,060 +người dùng có thể có, bởi vì nó sẽ quay trở lại vào thời điểm này và nó sẽ thoát + +36 +00:02:32,700 --> 00:02:37,020 +khỏi chức năng, nó sẽ không bao giờ đạt được so sánh này nếu điều này đã đúng. + +37 +00:02:37,620 --> 00:02:40,770 +Nếu bạn bối rối về cách thức hoạt động của elif và + +38 +00:02:41,130 --> 00:02:44,580 +các hoạt động khác, đặc biệt là thứ tự mà bạn thêm các điều kiện, + +39 +00:02:44,910 --> 00:02:48,630 +hãy xem lại bài học mà chúng ta đã nói về điều này chi tiết hơn. + +40 +00:02:49,050 --> 00:02:51,660 +Đây có thể là thời điểm tốt để sửa đổi khái niệm đó. + +41 +00:02:52,380 --> 00:02:55,440 +Nhưng bây giờ chúng tôi đã hoàn thành chức năng so + +42 +00:02:55,560 --> 00:02:58,830 +sánh của mình, chúng tôi sẽ sử dụng nó ở cuối mã + +43 +00:02:59,290 --> 00:03:02,440 +của chúng tôi ở đây vì đây là thời gian mà + +44 +00:03:02,500 --> 00:03:04,210 +người dùng đã vẽ xong + +45 +00:03:04,690 --> 00:03:07,660 +các thẻ, thẻ vẽ xong của máy tính và bây + +46 +00:03:09,370 --> 00:03:14,370 +giờ chúng ta có thể gọi đó là so sánh hàm và chuyển vào user_score và cả computer_score. + +47 +00:03:16,060 --> 00:03:20,080 +Vì vậy, điều này hy vọng sẽ cho chúng ta kết quả cuối cùng + +48 +00:03:20,290 --> 00:03:24,550 +dưới dạng một đoạn văn bản. Hãy chạy mã như nó vốn có và xem điều gì sẽ xảy ra. + +49 +00:03:25,120 --> 00:03:29,020 +Chúng tôi bắt đầu với số 3 và số 6 và số 9. + +50 +00:03:29,740 --> 00:03:34,000 +Bây giờ chúng tôi biết máy tính ít nhất có điểm 10, vì vậy hãy thêm một thẻ khác. + +51 +00:03:34,690 --> 00:03:38,050 +Vì vậy, bây giờ chúng tôi có điểm 11 với 3, 6 và 2, + +52 +00:03:38,380 --> 00:03:43,330 +vì vậy chúng tôi vẫn có thể tiếp tục. Và may mắn thay, chúng tôi đã quản lý để có được tổng số 21. + +53 +00:03:43,870 --> 00:03:48,310 +Tôi nghĩ bây giờ chúng ta đã bất khả chiến bại rất nhiều. Vì vậy, nếu tôi tiếp tục và đánh vô + +54 +00:03:48,310 --> 00:03:52,360 +cớ tôi không muốn lấy thêm bất kỳ thẻ nào nữa, thì hãy xem kết quả là gì. + +55 +00:03:52,930 --> 00:03:56,230 +Vì vậy, nó cho chúng tôi biết chúng tôi chiến thắng và một khuôn mặt cười lớn. + +56 +00:03:56,620 --> 00:03:59,590 +Vì vậy, chúng tôi có thể cung cấp cho người dùng thêm một + +57 +00:03:59,650 --> 00:04:04,630 +chút thông tin, chẳng hạn như tiết lộ bộ bài cuối cùng; những gì máy tính có và những gì chúng tôi nhận được. + +58 +00:04:05,350 --> 00:04:09,070 +Tôi sẽ tiếp tục và tạo một số câu lệnh in khác bên trên câu lệnh này. + +59 +00:04:09,910 --> 00:04:14,910 +Có lẽ tôi sẽ nói với người dùng rằng ván bài cuối cùng của bạn là + +60 +00:04:17,320 --> 00:04:20,290 +đây, và điểm số cuối cùng là ... + +61 +00:04:21,519 --> 00:04:24,700 +Và sau đó chúng ta hãy tiết lộ cho họ + +62 +00:04:27,190 --> 00:04:31,930 +điểm computer_score, và cuối cùng chúng ta có thể in ra user_score và computer_score để cho + +63 +00:04:31,930 --> 00:04:35,110 +họ biết ai thắng, ai thua, hoặc hòa hay không. + +64 +00:04:37,510 --> 00:04:41,380 +Trong bộ bài này, chúng ta có 14 lá, vì vậy hãy thêm một lá bài khác vào nó. + +65 +00:04:41,740 --> 00:04:45,040 +Thật không may, chúng tôi đã vượt qua vì chúng tôi có 10 người khác. + +66 +00:04:45,340 --> 00:04:48,970 +Vậy ván bài cuối cùng của chúng ta là 10, 4, + +67 +00:04:49,480 --> 00:04:54,220 +10 và điểm cuối cùng là 24. Ván bài cuối cùng của máy tính là 21, thật may + +68 +00:04:54,250 --> 00:04:55,083 +mắn cho họ. + +69 +00:04:55,150 --> 00:05:00,150 +Vì vậy, chúng tôi đã vượt qua và chúng tôi đã thua. Nếu chúng tôi muốn chơi một trò chơi khác vì chúng tôi là + +70 +00:05:01,300 --> 00:05:02,470 +những người nghiện Blackjack, thì + +71 +00:05:02,740 --> 00:05:06,160 +chúng tôi muốn cung cấp cho người dùng một số phương thức để làm điều này đúng không? + +72 +00:05:06,730 --> 00:05:09,430 +Và đó là những gì gợi ý cuối cùng giải quyết. + +73 +00:05:09,640 --> 00:05:12,790 +Vì vậy, chúng tôi sẽ hỏi người dùng xem họ có muốn khởi động lại trò chơi hay không. + +74 +00:05:13,120 --> 00:05:14,230 +Nếu câu trả lời + +75 +00:05:14,290 --> 00:05:18,580 +là có, thì chúng tôi sẽ xóa bảng điều khiển và bắt đầu một trò chơi Blackjack mới và cũng + +76 +00:05:18,760 --> 00:05:21,850 +hiển thị biểu trưng từ nghệ thuật. py trong khi chúng tôi đang ở đó. + +77 +00:05:23,290 --> 00:05:27,580 +Hãy tiếp tục và thêm thông tin đầu vào và chúng ta có thể hỏi họ, bạn có + +78 +00:05:27,670 --> 00:05:31,570 +muốn chơi trò chơi Xì dách không? Nhập có hoặc không. + +79 +00:05:32,800 --> 00:05:37,800 +Vì vậy, hãy nhớ rằng toàn bộ hàm này sẽ được đánh giá và kết quả + +80 +00:05:38,620 --> 00:05:41,920 +hoặc đầu ra sẽ thay thế phần này của mã. + +81 +00:05:42,520 --> 00:05:46,000 +Vì vậy, chúng ta có thể nói rằng trong khi đầu vào bằng y + +82 +00:05:46,660 --> 00:05:49,000 +thì chúng ta sẽ tiếp tục chơi trò chơi. + +83 +00:05:49,630 --> 00:05:54,630 +Trò chơi là tất cả các mã giữa gợi ý 5 và phần cuối, nơi chúng tôi so sánh. + +84 +00:05:57,140 --> 00:06:00,830 +Vì vậy, nếu chúng ta thực sự đặt nó vào bên trong + +85 +00:06:00,830 --> 00:06:05,830 +một hàm bằng cách thụt lề nó và sau đó tạo một hàm ở đây được + +86 +00:06:07,430 --> 00:06:10,280 +gọi là play_game, thì chúng ta thực sự + +87 +00:06:10,340 --> 00:06:13,940 +có thể gọi hàm này, play_game, mỗi khi người dùng nhập 'y'. + +88 +00:06:16,790 --> 00:06:20,810 +Bây giờ chúng tôi không muốn làm lộn xộn màn hình của mình với tất cả các trò chơi trước đó. + +89 +00:06:21,050 --> 00:06:23,480 +Vì vậy, trước khi gọi play_game, chúng tôi + +90 +00:06:23,540 --> 00:06:27,440 +cũng muốn xóa bảng điều khiển. Và để làm điều đó, + +91 +00:06:27,470 --> 00:06:32,470 +rõ ràng chúng ta phải nhập chức năng rõ ràng từ mô-đun replit. + +92 +00:06:33,110 --> 00:06:34,340 +Vì vậy, từ replit + +93 +00:06:34,340 --> 00:06:39,340 +import clear, và bây giờ chúng ta có thể gọi chức năng clear này để xóa bảng điều khiển + +94 +00:06:42,320 --> 00:06:43,880 +ở đây sau mỗi trận đấu. + +95 +00:06:44,450 --> 00:06:49,450 +Và sau đó chúng ta có thể gọi play_game để mã trong hàm này được lặp lại. + +96 +00:06:52,190 --> 00:06:55,220 +Và chúng tôi cũng đã nói rằng ngay từ đầu khi chúng tôi chơi trò chơi, chúng + +97 +00:06:55,340 --> 00:06:59,330 +tôi sẽ cho người dùng thấy logo từ nghệ thuật. py + +98 +00:06:59,930 --> 00:07:02,870 +Vì vậy, hãy quay lại và nhập luôn. + +99 +00:07:02,870 --> 00:07:05,960 +Vì vậy, từ logo nhập nghệ thuật, và + +100 +00:07:07,580 --> 00:07:12,140 +sau đó ở đầu mỗi trò chơi, chúng tôi sẽ in logo của mình. + +101 +00:07:13,190 --> 00:07:16,490 +Đó là tất cả những gì cần có đối với dự + +102 +00:07:16,880 --> 00:07:21,440 +án này và bây giờ hãy chạy nó lần cuối và xem toàn bộ hoạt động. + +103 +00:07:22,520 --> 00:07:25,040 +Bạn có muốn chơi trò chơi Xì dách không? Đúng. + +104 +00:07:26,060 --> 00:07:28,730 +Và nó tiết lộ logo Blackjack tuyệt đẹp của chúng tôi. + +105 +00:07:29,150 --> 00:07:32,390 +Nó cho chúng ta biết những thẻ mà chúng ta có, vì vậy điểm hiện tại là 11. + +106 +00:07:32,420 --> 00:07:36,590 +Tôi sẽ lấy một thẻ khác. Tôi đang ở tuổi 21, điều đó thật hoàn hảo. + +107 +00:07:36,620 --> 00:07:41,150 +Vì vậy, tôi sẽ vượt qua bây giờ. Và nó cho tôi biết rằng ván bài cuối cùng của tôi + +108 +00:07:41,390 --> 00:07:46,390 +là 21, ván bài cuối cùng của máy tính là 17 và tôi thắng. Và bây giờ tôi có thể chơi một trò chơi khác + +109 +00:07:47,330 --> 00:07:48,950 +chỉ bằng cách gõ lại 'y'. + +110 +00:07:49,880 --> 00:07:54,200 +Và tôi có thể tiếp tục chơi trò chơi Xì dách của mình. + +111 +00:07:54,950 --> 00:07:57,620 +Vì vậy, tôi hy vọng bạn đã vui vẻ khi xây dựng trò chơi này với tôi. + +112 +00:07:57,980 --> 00:08:02,390 +Tôi biết đây là một dự án thực sự khó khăn và tôi biết rằng một số bạn có thể sẽ gặp một số vấn đề, nhưng + +113 +00:08:02,390 --> 00:08:03,710 +tôi thực sự hy vọng rằng các + +114 +00:08:03,710 --> 00:08:07,850 +bạn kiên trì và cuối cùng thì các bạn đã vượt qua được. Và thông qua quá trình này, bạn + +115 +00:08:07,850 --> 00:08:09,020 +đã áp dụng + +116 +00:08:09,050 --> 00:08:12,740 +được rất nhiều điều mà chúng tôi đã học được trong 10 + +117 +00:08:12,740 --> 00:08:13,573 +ngày qua. + +118 +00:08:13,760 --> 00:08:17,900 +Đây là thời điểm tốt để xem lại các khái niệm bạn đã học và suy nghĩ về + +119 +00:08:17,900 --> 00:08:22,460 +những gì bạn có thể cần sửa đổi hoặc xem lại để bạn thực sự, thực sự vững vàng về + +120 +00:08:22,460 --> 00:08:24,740 +tất cả các khái niệm và bạn cảm thấy thoải + +121 +00:08:25,070 --> 00:08:29,450 +mái để tiếp tục phần tiếp theo 10 ngày. Bây giờ, nếu bạn muốn xem + +122 +00:08:29,480 --> 00:08:32,809 +mã cuối cùng mà tôi có ở đây, thì + +123 +00:08:33,080 --> 00:08:37,400 +chỉ cần chuyển sang repl. it / @ appbrewery / blackjack-final và bạn + +124 +00:08:37,820 --> 00:08:41,419 +sẽ thấy tất cả mã mà tôi đã xem qua với bạn ngay bây giờ. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/008 A Solid Foundation goes a Long Way.mp4 b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/008 A Solid Foundation goes a Long Way.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8cd53d81af46cb7c7c90541492ededda11b00890 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/008 A Solid Foundation goes a Long Way.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b52273456a66d12a84399b08badeb23b08d24baaa6a127f1b4357e304ec16dcf +size 39489183 diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/008 A Solid Foundation goes a Long Way_vi.srt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/008 A Solid Foundation goes a Long Way_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1b9a68dce5fceac3754bb13eb561653e4a977614 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/008 A Solid Foundation goes a Long Way_vi.srt @@ -0,0 +1,108 @@ +1 +00:00:01,110 --> 00:00:05,820 +Chào! Rất tốt cho việc hoàn thành dự án capstone đầu tiên của bạn. + +2 +00:00:06,240 --> 00:00:08,520 +Bây giờ tôi biết đó là một dự + +3 +00:00:08,610 --> 00:00:13,470 +án khó khăn, nhưng nó có nghĩa là kéo bạn vừa đủ để bạn vẫn gặp khó khăn, nhưng bạn + +4 +00:00:13,740 --> 00:00:17,670 +biết đấy, bạn vẫn có tất cả các thành phần cần thiết để giải quyết nó. + +5 +00:00:18,480 --> 00:00:19,710 +Bây giờ, trong dự + +6 +00:00:19,710 --> 00:00:23,550 +án này, chúng tôi đã thấy rất nhiều thứ mà chúng tôi đã học trong những ngày + +7 +00:00:23,550 --> 00:00:27,930 +trước được đưa vào sử dụng, như vòng lặp while, vòng lặp for, hàm, biến, tất cả mọi thứ + +8 +00:00:28,350 --> 00:00:31,470 +đều được đóng gói lại với nhau. Bây giờ đây là những + +9 +00:00:31,470 --> 00:00:34,950 +nguyên tắc cơ bản mà bạn đang học trong mỗi ngày và + +10 +00:00:34,950 --> 00:00:39,300 +mỗi bài học, mặc dù chúng có vẻ rất nhỏ, nhưng khi kết hợp lại với + +11 +00:00:39,540 --> 00:00:40,980 +nhau, bạn có thể + +12 +00:00:41,010 --> 00:00:45,600 +tạo ra các dự án thực sự thú vị và thực sự phức tạp như Blackjack + +13 +00:00:45,600 --> 00:00:47,460 +pro - như Dự án xì dách. + +14 +00:00:48,000 --> 00:00:50,880 +Vì vậy, dù khó khăn và dù bạn phải cố gắng + +15 +00:00:51,060 --> 00:00:53,220 +vươn lên, miễn là bạn đã có + +16 +00:00:53,640 --> 00:00:56,190 +những nền tảng vững chắc, thì bạn vẫn có thể + +17 +00:00:56,250 --> 00:01:00,570 +tiếp tục và bạn sẽ có thể xây dựng nên những điều tốt đẹp hơn nữa. + +18 +00:01:00,990 --> 00:01:02,160 +Vì vậy, cùng nhau, + +19 +00:01:02,280 --> 00:01:06,330 +chúng ta sẽ đảm bảo rằng bạn có một nền tảng thực sự vững chắc trước + +20 +00:01:06,330 --> 00:01:09,990 +khi tiếp tục, trước khi chúng ta bắt đầu xây dựng các dự án + +21 +00:01:09,990 --> 00:01:12,390 +thú vị hơn như trang web và khai thác + +22 +00:01:12,390 --> 00:01:17,010 +dữ liệu, thu thập dữ liệu và trực quan hóa dữ liệu và tất cả những điều đó. + +23 +00:01:17,370 --> 00:01:21,510 +Vì vậy, hãy đảm bảo rằng bạn xem lại tất cả các khái niệm mà bạn đã học cho đến nay. + +24 +00:01:21,570 --> 00:01:25,620 +Và nếu có bất cứ điều gì không đúng một trăm phần trăm, thì chỉ + +25 +00:01:25,740 --> 00:01:30,120 +cần xem lại nội dung, thực hành nó một vài lần và sau đó tiếp tục + +26 +00:01:30,240 --> 00:01:33,900 +và bạn sẽ tốt hơn rất nhiều cho nền tảng vững chắc đó. + +27 +00:01:34,410 --> 00:01:37,530 +Vì vậy, hãy nghỉ ngơi thật tốt và hẹn gặp lại vào ngày mai. + diff --git a/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/external-links.txt b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..075c647b8a623f881f3a52fa6101492931143dc1 --- /dev/null +++ b/part1/11 - Day 11 - Beginner - The Blackjack Capstone Project/external-links.txt @@ -0,0 +1,21 @@ + +001 Try-out-an-online-Blackjack-game +https://games.washingtonpost.com/games/blackjack/ + +001 Day-11-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/blackjack-final?v=1 + +002 Fork-the-Day-11-Starting-Repl +https://repl.it/@appbrewery/blackjack-start + +004 Python-sum-Function +https://docs.python.org/3/library/functions.html#sum + +004 Python-list-methods +https://developers.google.com/edu/python/lists#list-methods + +007 Blackjack-Completed-Code +https://repl.it/@appbrewery/blackjack-final + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Fork-the-Day-12-Starting-Repl.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Fork-the-Day-12-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..982437af6b0e5e2890e9ed198fab53f69a92ad40 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Fork-the-Day-12-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-12-start#main.py \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Namespaces Local vs. Global Scope.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Namespaces Local vs. Global Scope.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cd27aa79a2fb28acfed5a814bab61d06a15e6640 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Namespaces Local vs. Global Scope.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a7c869f842c300154b1d087ff66629c8e9c2be76acd315b5bf0ca4b04279a2d +size 25025974 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Namespaces Local vs. Global Scope_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Namespaces Local vs. Global Scope_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7f338ed034866b2d82454c028b9eda0c6e8922b7 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/001 Namespaces Local vs. Global Scope_vi.srt @@ -0,0 +1,444 @@ +1 +00:00:06,680 --> 00:00:11,630 +Điều đầu tiên tôi muốn nói đến là một khái niệm được biết đến trong lập trình là Phạm vi. + +2 +00:00:12,200 --> 00:00:16,190 +Và phạm vi này là thứ mà chúng tôi thực sự đã gặp trong lập trình của mình, nhưng + +3 +00:00:16,190 --> 00:00:20,090 +tôi muốn để nó cho đến khi chúng tôi nhìn thấy các hàm, chúng tôi đã xem các + +4 +00:00:20,330 --> 00:00:24,230 +vòng lặp if và while, các loại và khối mã khác nhau, trước khi chúng ta bắt + +5 +00:00:24,470 --> 00:00:29,090 +đầu nói về khái niệm thực sự quan trọng này. Bây giờ, nếu bạn muốn hình dung + +6 +00:00:29,120 --> 00:00:30,950 +khái niệm này, hãy + +7 +00:00:31,400 --> 00:00:36,400 +tưởng tượng bạn có một ngôi nhà với hàng rào xung quanh và bạn trồng một + +8 +00:00:37,100 --> 00:00:42,020 +cây táo bên trong khu vườn của mình. Hãy nghĩ xem ai có thể truy cập những quả táo đó. + +9 +00:00:42,230 --> 00:00:45,980 +Chỉ bạn và gia đình của bạn phải không? Nhưng nếu thay vào đó, + +10 +00:00:46,100 --> 00:00:50,540 +bạn có một cây táo trong khu phố bên vỉa hè chẳng hạn. + +11 +00:00:51,020 --> 00:00:55,640 +Chà, đây là loại miễn phí cho tất cả mọi người. Bất kỳ ai cũng có thể truy cập vào những quả táo đó. + +12 +00:00:56,300 --> 00:00:59,690 +Đây là điểm khởi đầu cho cách hiểu phạm vi. + +13 +00:01:00,500 --> 00:01:04,940 +Đi đến App Brewery Day 12 bắt đầu Repl. nó và tiếp tục và phân nhánh bản sao của chính + +14 +00:01:04,940 --> 00:01:05,773 +bạn về nó. + +15 +00:01:06,140 --> 00:01:11,140 +Hãy xem mã có trong tệp bắt đầu trong tệp chính. py và cố gắng hiểu nó đang + +16 +00:01:12,110 --> 00:01:14,540 +làm gì. Đầu tiên, tôi tạo + +17 +00:01:14,540 --> 00:01:17,840 +một biến có tên là kẻ thù và tôi đặt nó bằng 1. + +18 +00:01:18,470 --> 00:01:21,500 +Sau đó, tôi tạo một hàm có tên là gain_enemies và tôi + +19 +00:01:21,800 --> 00:01:25,610 +cố gắng đặt biến đó thành 2. Cuối cùng, tôi gọi hàm + +20 +00:01:25,640 --> 00:01:29,630 +của mình để kích hoạt tất cả các dòng mã bên trong và + +21 +00:01:30,200 --> 00:01:35,000 +bây giờ tôi muốn bạn dự đoán câu lệnh in này sẽ in gì trong bảng + +22 +00:01:35,000 --> 00:01:38,120 +điều khiển và câu lệnh in này sẽ in gì? + +23 +00:01:38,960 --> 00:01:41,630 +Và nó có thể không phải như những gì bạn mong đợi. + +24 +00:01:42,380 --> 00:01:47,270 +Vì vậy, tôi hy vọng rằng ở đây tôi có một biến bằng một. + +25 +00:01:47,750 --> 00:01:49,340 +Khi hàm này được + +26 +00:01:49,670 --> 00:01:53,090 +gọi, giá trị biến thiên này bây giờ phải bằng hai. + +27 +00:01:53,510 --> 00:01:56,750 +Vì vậy, khi nó được in xuống đây từ bên ngoài + +28 +00:01:57,050 --> 00:02:01,940 +hàm của tôi, giá trị này phải bằng hai và giá trị này cũng phải bằng hai. + +29 +00:02:02,540 --> 00:02:04,100 +Nhưng thay vào đó hãy nhìn vào những gì xảy ra. + +30 +00:02:05,540 --> 00:02:08,870 +Tôi nhận được kẻ thù từ bên trong hàm bằng + +31 +00:02:09,410 --> 00:02:12,590 +2, nhưng từ bên ngoài hàm, nó bằng 1. + +32 +00:02:12,980 --> 00:02:16,460 +Vậy điều gì đang xảy ra ở đây? Để thực sự hiểu điều này, + +33 +00:02:16,490 --> 00:02:20,390 +chúng ta phải hiểu khái niệm phạm vi. Và phạm vi là một điều + +34 +00:02:20,390 --> 00:02:22,880 +thực sự, thực sự quan trọng trong lập trình. + +35 +00:02:22,910 --> 00:02:27,080 +Bạn thấy nó trong mọi ngôn ngữ lập trình và mặc dù nó có một chút + +36 +00:02:27,080 --> 00:02:28,790 +khác biệt giữa các ngôn ngữ lập + +37 +00:02:29,330 --> 00:02:33,950 +trình, nhưng tất cả đều quay trở lại khái niệm cây táo nằm trong hàng rào hoặc bên + +38 +00:02:33,980 --> 00:02:34,940 +ngoài hàng rào. + +39 +00:02:35,360 --> 00:02:39,380 +Vì vậy, chúng ta hãy xem xét một số ví dụ khác trước khi chúng ta quay lại giải quyết + +40 +00:02:39,380 --> 00:02:40,213 +vấn đề này. + +41 +00:02:41,330 --> 00:02:45,080 +Điều đầu tiên cần nghĩ đến là một khái niệm được gọi là phạm vi cục bộ. + +42 +00:02:45,590 --> 00:02:49,970 +Phạm vi cục bộ tồn tại trong các chức năng. Vì vậy, ví dụ: nếu tôi + +43 +00:02:50,150 --> 00:02:54,650 +đang tạo một trò chơi và tôi có một hàm tên là drink_potion, bằng + +44 +00:02:54,680 --> 00:02:57,740 +cách nào đó sẽ tăng sức mạnh cho người + +45 +00:02:58,220 --> 00:03:03,220 +chơi của tôi, thì, có thể nó sẽ có một biến được tạo bên trong hàm. + +46 +00:03:03,830 --> 00:03:06,820 +Vì vậy, nó có thể là một cái gì đó giống như + +47 +00:03:08,080 --> 00:03:11,380 +potion_strength và tôi có thể đặt nó bắt đầu từ giá trị của hai. + +48 +00:03:12,280 --> 00:03:13,330 +Bây giờ, trong + +49 +00:03:13,360 --> 00:03:18,360 +trường hợp này, nếu tôi phải đi và in cường độ lọ biến đổi này từ bên trong hàm, hãy + +50 +00:03:19,060 --> 00:03:20,650 +lưu ý rằng tôi được thụt lề + +51 +00:03:21,190 --> 00:03:24,910 +ở đây và tất nhiên tôi cần gọi hàm này để điều đó xảy ra. + +52 +00:03:26,380 --> 00:03:30,640 +Lưu ý những gì sẽ xảy ra khi tôi chạy mã. Nó bằng hai. + +53 +00:03:31,150 --> 00:03:32,680 +Đó là những gì chúng tôi mong đợi, phải không? + +54 +00:03:33,340 --> 00:03:38,340 +Nhưng hãy lưu ý điều gì sẽ xảy ra nếu tôi cố gắng in potion_strength + +55 +00:03:40,060 --> 00:03:44,740 +từ bên ngoài hàm ở đây. Điều này trước hết mang lại cho tôi một lỗi ngay + +56 +00:03:45,010 --> 00:03:49,390 +khi tôi đang viết nó trong trình chỉnh sửa. Và khi tôi cố gắng chạy nó, + +57 +00:03:49,420 --> 00:03:54,420 +nó cho tôi một lỗi bên trong bảng điều khiển. Và lỗi là lỗi tên và nó cho tôi biết rằng + +58 +00:03:54,760 --> 00:03:59,760 +độ mạnh của lọ thuốc tên không được xác định. Rõ ràng tôi đã xác định nó + +59 +00:04:00,490 --> 00:04:05,020 +ở đây, nhưng tại sao tôi không thể truy cập nó bên ngoài chức năng? + +60 +00:04:05,320 --> 00:04:08,320 +Chà, điều này quay trở lại khái niệm phạm vi cục bộ. + +61 +00:04:08,830 --> 00:04:13,830 +Khi bạn tạo một biến mới hoặc thực sự là một hàm mới bên trong một hàm khác, nó + +62 +00:04:16,690 --> 00:04:18,700 +chỉ có thể truy cập được, bạn + +63 +00:04:18,700 --> 00:04:23,700 +chỉ có thể sử dụng nó khi ở bên trong hàm đó vì nó có phạm vi cục bộ. + +64 +00:04:25,540 --> 00:04:29,920 +Nó chỉ có giá trị trong các bức tường của chức năng drink_ + +65 +00:04:29,950 --> 00:04:30,940 +potion này. + +66 +00:04:33,040 --> 00:04:37,420 +Điều gì sẽ xảy ra nếu chúng ta muốn nó có thể truy cập được bên ngoài chức năng? Chà, bây giờ chúng ta cần + +67 +00:04:37,420 --> 00:04:40,810 +nghĩ về một thứ gọi là phạm vi toàn cầu. + +68 +00:04:41,440 --> 00:04:46,440 +Sự khác biệt duy nhất giữa phạm vi toàn cục và phạm vi cục bộ là nơi bạn xác + +69 +00:04:46,750 --> 00:04:49,720 +định hoặc nơi bạn tạo các biến hoặc hàm của mình. + +70 +00:04:50,380 --> 00:04:52,450 +Vì vậy, giả sử chúng ta có một biến khác. + +71 +00:04:52,450 --> 00:04:57,190 +Giả sử rằng tôi đã tạo một biến có tên player_health và + +72 +00:04:57,220 --> 00:05:02,140 +nó bắt đầu bằng 10. Bây giờ, hãy nói rằng sau này, + +73 +00:05:02,170 --> 00:05:07,120 +tôi có cùng chức năng drink_ potion, và potion này có sức mạnh là 2. + +74 +00:05:07,720 --> 00:05:11,560 +Vì vậy, bây giờ bên trong hàm drink_potion của tôi, nếu + +75 +00:05:11,980 --> 00:05:15,550 +tôi muốn in player_health của mình mặc dù nó + +76 +00:05:15,970 --> 00:05:20,500 +không được xác định trong hàm, điều này là hoàn toàn có thể. + +77 +00:05:20,740 --> 00:05:22,840 +Và nếu tôi gọi hàm của + +78 +00:05:22,870 --> 00:05:27,520 +mình là drink_potion và sau đó chạy mã như hiện tại, bạn sẽ + +79 +00:05:27,730 --> 00:05:29,590 +thấy 10 được in. + +80 +00:05:30,010 --> 00:05:35,010 +Vì vậy, điều này có phạm vi toàn cầu. Nó có sẵn ở mọi nơi trong tệp của chúng tôi vì + +81 +00:05:36,250 --> 00:05:40,720 +nó được xác định ở cấp cao nhất của tệp. Bây giờ, khi tôi nói cấp cao nhất, + +82 +00:05:40,720 --> 00:05:43,660 +tôi không có ý nói về mặt vật lý ở đầu tệp. + +83 +00:05:44,020 --> 00:05:49,020 +Ý tôi là nó không nằm trong một hàm khác, như cường độ thuốc ở đây + +84 +00:05:49,930 --> 00:05:53,650 +vì nó được định nghĩa thụt vào bên trong một hàm. + +85 +00:05:53,980 --> 00:05:55,960 +Vì vậy, đây là một biến cục + +86 +00:05:55,990 --> 00:06:00,990 +bộ trong khi đây là một biến toàn cục. Và các biến toàn cục có sẵn + +87 +00:06:01,880 --> 00:06:05,210 +trong các hàm, bất kể nó được lồng sâu đến mức nào + +88 +00:06:05,570 --> 00:06:08,120 +và nó cũng có sẵn bên ngoài các hàm. + +89 +00:06:09,860 --> 00:06:14,780 +Khái niệm về phạm vi toàn cục và cục bộ này không chỉ áp dụng cho các biến. + +90 +00:06:15,140 --> 00:06:20,140 +Như tôi đã ám chỉ trước đây, nó cũng áp dụng cho các hàm và về cơ bản bất kỳ + +91 +00:06:20,330 --> 00:06:24,290 +thứ gì khác mà bạn đặt tên. Đây là một khái niệm được gọi là Không gian tên. + +92 +00:06:24,890 --> 00:06:28,730 +Vì vậy, chúng tôi đã xác định biến player_health này, chúng tôi định nghĩa + +93 +00:06:28,730 --> 00:06:29,563 +hàm drink_potion này. + +94 +00:06:29,930 --> 00:06:34,930 +Bất cứ thứ gì bạn đặt tên đều có một vùng tên và vùng tên đó hợp lệ trong một số + +95 +00:06:37,160 --> 00:06:38,120 +phạm vi nhất định. + +96 +00:06:39,260 --> 00:06:42,980 +Khái niệm phạm vi này về cơ bản áp dụng cho bất kỳ thứ gì bạn đặt tên. + +97 +00:06:43,940 --> 00:06:48,530 +Nếu tôi đặt hàm này drink_potion bên trong một hàm khác, hãy gọi nó + +98 +00:06:48,560 --> 00:06:50,720 +là trò chơi. Chà, hiện + +99 +00:06:50,780 --> 00:06:55,780 +tại drink_potion này có phạm vi cục bộ trong trò chơi chức năng. + +100 +00:06:56,660 --> 00:07:01,660 +Vì vậy, đây là lý do tại sao dòng này hiện đang bị lỗi vì nó thực sự không thể + +101 +00:07:03,620 --> 00:07:07,700 +nhìn thấy bên trong chức năng này. Vì vậy, bây giờ để gọi tên + +102 +00:07:08,030 --> 00:07:11,780 +drink_potion này, tôi phải ở trong bốn bức tường của chức năng trò chơi. + +103 +00:07:12,830 --> 00:07:17,000 +Vì vậy, bất cứ khi nào bạn đặt tên cho bất cứ thứ gì, một hàm hay + +104 +00:07:17,270 --> 00:07:20,210 +một biến, bạn phải biết bạn đã tạo nó ở đâu. + +105 +00:07:20,780 --> 00:07:25,280 +Bây giờ dễ dàng nhận thấy bạn đã tạo các hàm ở đâu, chúng ta có từ + +106 +00:07:25,310 --> 00:07:28,010 +khóa def đúng không? Nhưng khi bạn tạo một + +107 +00:07:28,040 --> 00:07:32,570 +biến, đó là lần đầu tiên bạn đặt tên cho nó và bạn đặt nó bằng một thứ gì đó. + +108 +00:07:33,200 --> 00:07:37,880 +Và nơi bạn viết dòng mã đó xác định phạm vi + +109 +00:07:37,880 --> 00:07:42,140 +của biến cụ thể đó. Ở đây nó nằm bên ngoài mọi chức năng khác, + +110 +00:07:42,470 --> 00:07:46,700 +trong khi ở đây nó nằm bên trong một chức năng thực sự được lồng sâu vào hai cấp độ. + +111 +00:07:47,090 --> 00:07:50,510 +Vì vậy, nó có một phạm vi cục bộ cho chức năng này. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Does Python Have Block Scope.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Does Python Have Block Scope.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8e899aa913eb465662ed7d1b5cfb0ac769471eb7 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Does Python Have Block Scope.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9659c404238b26f317d91814ac2c72db3ae8572e20cf7fa8b3761a80728156a8 +size 7847251 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Does Python Have Block Scope_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Does Python Have Block Scope_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0fbded93b2645d152fdb174e0c0697560d73055d --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Does Python Have Block Scope_vi.srt @@ -0,0 +1,156 @@ +1 +00:00:06,390 --> 00:00:09,060 +Bây giờ, không giống như một số + +2 +00:00:09,090 --> 00:00:13,410 +ngôn ngữ lập trình khác, nếu bạn đến từ C ++ hoặc Java, thì + +3 +00:00:14,160 --> 00:00:17,220 +không có cái gọi là phạm vi khối trong Python. + +4 +00:00:17,670 --> 00:00:21,690 +Điều này có nghĩa là nếu bạn tạo câu lệnh if, hãy nói + +5 +00:00:22,290 --> 00:00:25,140 +if 3> 2 và nếu bạn tạo một + +6 +00:00:25,890 --> 00:00:30,890 +biến mới bên trong khối if hoặc vòng lặp while hoặc vòng lặp for, về cơ + +7 +00:00:31,680 --> 00:00:35,460 +bản là bất kỳ loại khối mã nào thụt lề, điều này + +8 +00:00:35,880 --> 00:00:38,130 +không bị coi là vi phạm. + +9 +00:00:38,640 --> 00:00:43,110 +Nó vẫn có phạm vi giống như chức năng bao quanh của nó, hoặc nếu không có + +10 +00:00:43,410 --> 00:00:46,560 +chức năng bao quanh thì nó có phạm vi toàn cầu. + +11 +00:00:47,100 --> 00:00:51,120 +Vì vậy, hãy để tôi cho bạn thấy một ví dụ đầy đủ. Giả sử chúng ta đã có một danh sách kẻ thù, vì + +12 +00:00:51,150 --> 00:00:56,010 +vậy kẻ thù có thể là bộ xương, thây ma hoặc người ngoài hành tinh. Vì vậy, bây giờ, nếu tôi + +13 +00:00:56,010 --> 00:00:58,980 +xác định một cấp độ trò chơi, phải không? + +14 +00:00:59,010 --> 00:01:01,710 +Giống như cấp độ mà người dùng hiện đang chơi, giả sử + +15 +00:01:01,740 --> 00:01:03,240 +họ đang ở cấp độ 3. + +16 +00:01:03,930 --> 00:01:08,930 +Và tôi tạo một câu lệnh if và kiểm tra xem game_level có nhỏ hơn cấp 5 hay + +17 +00:01:09,570 --> 00:01:12,990 +không, trong trường hợp đó, tôi muốn tạo một kẻ thù mới, nhưng + +18 +00:01:13,470 --> 00:01:16,560 +tôi không muốn kẻ thù quá khó để đánh bại. + +19 +00:01:17,100 --> 00:01:21,450 +Vì vậy, tôi sẽ chọn từ danh sách kẻ thù và tôi sẽ chọn + +20 +00:01:21,450 --> 00:01:23,520 +kẻ đầu tiên. Lưu ý + +21 +00:01:23,550 --> 00:01:28,470 +rằng, mặc dù kẻ thù mới này là một biến được tạo bên trong khối if + +22 +00:01:28,530 --> 00:01:31,800 +này, nhưng nếu tôi đi ra ngoài khối if để tôi + +23 +00:01:31,860 --> 00:01:36,840 +không bị thụt vào nữa và tôi cố gắng in kẻ thù mới này, thì đây là + +24 +00:01:38,010 --> 00:01:41,070 +mã hoàn toàn hợp lệ. Và nếu tôi chạy mã, + +25 +00:01:41,130 --> 00:01:43,230 +bạn sẽ thấy khung xương đang được in. + +26 +00:01:44,070 --> 00:01:49,070 +Nhưng hãy lưu ý ngay khi tôi nhúng cái này vào trong một hàm, vì vậy + +27 +00:01:50,220 --> 00:01:52,320 +hãy xác định một hàm mới. + +28 +00:01:53,670 --> 00:01:58,670 +Và hiện tại lỗi dòng này đã hết vì trong hàm có phạm vi cục bộ. + +29 +00:01:59,580 --> 00:02:03,840 +Vì vậy, bây giờ kẻ thù mới này có sẵn ở bất kỳ đâu trong hàm + +30 +00:02:04,110 --> 00:02:09,110 +này, bởi vì các khối như if, while, for, tất cả các khối mã này với dấu hai chấm và + +31 +00:02:09,960 --> 00:02:13,440 +thụt đầu dòng, chúng không được tính là tạo phạm vi cục bộ. + +32 +00:02:13,860 --> 00:02:16,470 +Vì vậy, để in kẻ thù mới này, tôi + +33 +00:02:16,830 --> 00:02:20,490 +thực sự phải ở trong ranh giới của chức năng này, có nghĩa + +34 +00:02:20,580 --> 00:02:22,710 +là mã của tôi phải ở đây. + +35 +00:02:24,120 --> 00:02:29,070 +Điều quan trọng nhất cần nhớ từ điều này là nếu bạn tạo một + +36 +00:02:29,430 --> 00:02:34,320 +biến trong một hàm, thì biến đó chỉ khả dụng trong hàm đó. + +37 +00:02:35,160 --> 00:02:40,160 +Nhưng nếu bạn tạo một biến trong khối if hoặc vòng lặp while hoặc vòng lặp for hoặc bất + +38 +00:02:42,060 --> 00:02:44,730 +kỳ thứ gì có thụt lề và dấu hai + +39 +00:02:45,150 --> 00:02:49,050 +chấm, thì điều đó không được tính là tạo phạm vi cục bộ riêng biệt. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Fork-the-Day-12-Starting-Repl.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Fork-the-Day-12-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..da33bc0bd37b6569acd99c03275edc5d329adafe --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/002 Fork-the-Day-12-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-12-start \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/003 How to Modify a Global Variable.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/003 How to Modify a Global Variable.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5a9261727d17978a65147d51353a7826464e78d9 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/003 How to Modify a Global Variable.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7265a51a05d24419e08043864d1b4d37bf2b5b2a4cd45ca3a2b5df85b3d411a +size 14616456 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/003 How to Modify a Global Variable_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/003 How to Modify a Global Variable_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1c052c52fc006f8d55b20e1aa1f69fecbd62d7c0 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/003 How to Modify a Global Variable_vi.srt @@ -0,0 +1,256 @@ +1 +00:00:06,410 --> 00:00:09,200 +Trở lại với ví dụ ban đầu của chúng tôi. + +2 +00:00:09,860 --> 00:00:14,780 +Tôi muốn nói thêm về phạm vi toàn cầu và khái niệm sửa đổi thứ + +3 +00:00:14,930 --> 00:00:19,610 +gì đó trong phạm vi toàn cầu. Ở đây chúng ta có kẻ thù, đó + +4 +00:00:20,030 --> 00:00:22,310 +là một biến có phạm vi + +5 +00:00:23,030 --> 00:00:27,620 +toàn cục, và ở đây chúng ta có một hàm tạo phạm vi cục bộ. + +6 +00:00:28,370 --> 00:00:33,370 +Bây giờ chúng tôi nghĩ rằng chúng tôi đang khai thác vào biến này và đặt nó thành hai. + +7 +00:00:34,370 --> 00:00:37,880 +Nhưng trên thực tế, chúng tôi đang thực sự tạo ra một biến hoàn + +8 +00:00:37,910 --> 00:00:40,400 +toàn mới hoàn toàn tách biệt với biến này. + +9 +00:00:41,420 --> 00:00:44,270 +Và đây là lý do tại sao khi chúng tôi in nó + +10 +00:00:44,510 --> 00:00:49,100 +ở đây, nó cho thấy nó bằng 2. Nhưng khi chúng tôi in nó ở + +11 +00:00:49,130 --> 00:00:53,750 +đây, nó cho thấy nó thực sự bằng 1. Nếu bạn muốn làm cho điều này rõ ràng + +12 +00:00:53,780 --> 00:00:58,780 +hơn một chút, tôi có thể gọi đây là một bộ xương và tôi có thể đặt đây là một thây ma. + +13 +00:01:00,590 --> 00:01:04,879 +Và khi tôi nhấn run, bạn có thể thấy lại, cái này in ra + +14 +00:01:05,030 --> 00:01:06,680 +zombie, cái này in ra + +15 +00:01:06,980 --> 00:01:11,750 +bộ xương, bởi vì hai biến này thực sự là những thứ hoàn toàn khác nhau. + +16 +00:01:12,290 --> 00:01:15,860 +Và chúng tôi không thay đổi điều này ngay tại đây, + +17 +00:01:16,040 --> 00:01:19,640 +chúng tôi chỉ đang tạo một biến mới có phạm vi cục bộ. + +18 +00:01:21,020 --> 00:01:26,020 +Bây giờ thường là một ý tưởng tồi nếu gọi các biến cục bộ và các biến + +19 +00:01:26,690 --> 00:01:31,040 +toàn cục của bạn cùng một tên. Nhưng trong trường hợp này, những gì + +20 +00:01:31,070 --> 00:01:36,070 +chúng tôi thực sự muốn làm là chúng tôi muốn sửa đổi biến này, chúng tôi muốn làm điều + +21 +00:01:36,320 --> 00:01:40,790 +gì đó giống như có thể + = 1. Và lưu ý rằng ngay sau khi tôi + +22 +00:01:40,790 --> 00:01:42,860 +viết + = 1, trình soạn + +23 +00:01:43,160 --> 00:01:48,160 +thảo của tôi bắt đầu phát điên và nói với tôi rằng kẻ thù biến cục bộ này + +24 +00:01:49,370 --> 00:01:53,810 +được xác định trong một phạm vi bao quanh được tham chiếu trước khi chuyển nhượng. + +25 +00:01:53,810 --> 00:01:54,643 +Điều đó nghĩa là gì? + +26 +00:01:54,680 --> 00:01:59,540 +Có nghĩa là trình soạn thảo nghĩ rằng bạn đang cố gắng khai thác một biến cục bộ mà bạn đã + +27 +00:01:59,540 --> 00:02:01,700 +xác định ở đâu đó xung quanh đây. + +28 +00:02:02,930 --> 00:02:07,400 +Và sau đó bạn đã cố gắng sửa đổi nó bằng cách thêm một vào giá trị trước đó, + +29 +00:02:07,670 --> 00:02:11,960 +nhưng bạn thực sự chưa xác định nó. Tuy nhiên, điều chúng tôi muốn + +30 +00:02:11,960 --> 00:02:16,850 +làm là chúng tôi muốn khai thác biến này và thay đổi nó ở đây. + +31 +00:02:18,320 --> 00:02:19,550 +Để làm được + +32 +00:02:19,610 --> 00:02:24,610 +điều này, chúng ta thực sự phải nói rõ ràng rằng chúng ta có một biến toàn + +33 +00:02:25,430 --> 00:02:30,260 +cục được gọi là kẻ thù được định nghĩa ở đâu đó bên ngoài hàm này. + +34 +00:02:30,740 --> 00:02:34,880 +Và đó là kẻ thù mà chúng tôi muốn sử dụng bên trong chức năng này. + +35 +00:02:35,480 --> 00:02:40,480 +Vì vậy, về cơ bản nó đưa kẻ thù toàn cầu đó vào chức năng và cho phép + +36 +00:02:40,700 --> 00:02:43,580 +bạn sửa đổi nó. Nếu không có dòng mã + +37 +00:02:43,700 --> 00:02:48,700 +này, chúng tôi không thể sửa đổi thứ gì đó mang tính toàn cầu trong phạm vi cục bộ. + +38 +00:02:50,930 --> 00:02:55,930 +Bây giờ có một lý do tại sao rất khó để sửa đổi một cái gì đó có phạm + +39 +00:02:56,180 --> 00:02:57,013 +vi toàn cầu. + +40 +00:02:57,080 --> 00:03:02,080 +Bạn có thể không thực sự muốn làm điều này thường xuyên, bởi vì nó khó + +41 +00:03:03,430 --> 00:03:08,430 +hiểu và dễ tạo ra lỗi và lỗi. Bởi vì biến này có phạm vi toàn cầu có + +42 +00:03:09,220 --> 00:03:12,640 +thể đã được tạo ở bất kỳ đâu trong mã của bạn, phải không? + +43 +00:03:12,970 --> 00:03:17,970 +Và bạn sẽ sửa đổi nó hoàn toàn độc lập với thời điểm bạn tạo nó. + +44 +00:03:18,400 --> 00:03:22,480 +Vì vậy, có thể đã mất nhiều ngày từ khi bạn viết mã này đến khi + +45 +00:03:22,480 --> 00:03:26,560 +bạn viết mã này và nó chỉ làm cho mọi thứ trở nên sai lầm hơn, + +46 +00:03:26,590 --> 00:03:27,820 +dễ thất bại hơn. + +47 +00:03:28,270 --> 00:03:33,270 +Đây là lý do tại sao mọi người thường nói với bạn khi họ dạy bạn Python để + +48 +00:03:33,460 --> 00:03:37,750 +tránh sửa đổi phạm vi toàn cầu. Bạn có thể đọc nó, + +49 +00:03:37,780 --> 00:03:42,160 +đó không phải là một vấn đề. Bạn có thể sử dụng nó trong mã của mình, giống như chúng tôi đang ở đây. + +50 +00:03:43,540 --> 00:03:48,540 +Nhưng đừng cố gắng sửa đổi nó trong một hàm có phạm vi cục bộ. + +51 +00:03:49,360 --> 00:03:50,680 +Nhưng thay vào đó bạn có thể làm gì? + +52 +00:03:50,710 --> 00:03:55,330 +Điều gì sẽ xảy ra nếu bạn muốn có chức năng này giống như chức năng thay đổi số + +53 +00:03:55,330 --> 00:03:56,350 +lượng kẻ thù? + +54 +00:03:56,860 --> 00:04:01,480 +Làm thế nào bạn có thể đạt được điều này mà không cần sửa đổi phạm vi toàn cục trong hàm? + +55 +00:04:02,260 --> 00:04:06,940 +Thay vào đó, bạn có thể sử dụng những gì chúng ta đã học về + +56 +00:04:07,060 --> 00:04:11,440 +câu lệnh trả về, phải không? Điều gì sẽ xảy ra nếu thay vì sửa + +57 +00:04:12,010 --> 00:04:15,310 +đổi kẻ thù, bạn thực sự chỉ trả lại nó dưới dạng đầu ra. + +58 +00:04:15,700 --> 00:04:19,329 +Vì vậy, trả lại giá trị hiện tại của kẻ thù + 1. + +59 +00:04:20,140 --> 00:04:22,150 +Bây giờ khi bạn gọi hàm này, bạn + +60 +00:04:22,420 --> 00:04:27,280 +sẽ nắm được kết quả đầu ra và bạn có thể lưu nó vào những kẻ thù biến toàn cục. + +61 +00:04:27,790 --> 00:04:32,140 +Vì vậy, điều này bây giờ có nghĩa là chức năng này có thể được lấy đi và đặt ở bất kỳ đâu + +62 +00:04:32,140 --> 00:04:35,410 +trong mã của bạn và bạn thực sự không cần biết nó hoạt động như thế nào. + +63 +00:04:35,830 --> 00:04:39,010 +Miễn là bạn biết rằng đây là cách bạn gia tăng kẻ thù, thì tất + +64 +00:04:39,580 --> 00:04:42,160 +cả những gì bạn phải làm là chỉ cần gọi nó. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Day-12-Ending-Code.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Day-12-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..3136d13fb8bc1eff8f8b43345ef567ed802ab3c6 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Day-12-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-12-end \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Python Constants and Global Scope.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Python Constants and Global Scope.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a7bc2340928e69d2808b783b8919dca7f04b7cc8 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Python Constants and Global Scope.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cf77a575b33568f26b465577b30161b5f97247d46530ae875b0261840e0c90e +size 6075067 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Python Constants and Global Scope_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Python Constants and Global Scope_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b51f3dced4eaff8ada38404a30fbacfbf6b4f935 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/004 Python Constants and Global Scope_vi.srt @@ -0,0 +1,108 @@ +1 +00:00:07,020 --> 00:00:11,040 +Hãy nhớ rằng, bạn nên cẩn thận với các biến có phạm vi toàn cầu, nhưng + +2 +00:00:11,550 --> 00:00:15,150 +đừng tin những người nói với bạn rằng bạn không bao giờ nên sử + +3 +00:00:15,150 --> 00:00:18,000 +dụng phạm vi toàn cầu. Phạm vi toàn cầu có thể cực kỳ + +4 +00:00:18,180 --> 00:00:22,170 +hữu ích, đặc biệt khi bạn đang xác định các hằng số. Hằng số toàn cục là các biến do + +5 +00:00:22,260 --> 00:00:24,480 +bạn xác định và bạn sẽ không bao giờ + +6 +00:00:24,870 --> 00:00:28,620 +có ý định thay đổi nó nữa. Nó chỉ là một cái gì đó, chẳng hạn + +7 +00:00:28,650 --> 00:00:30,480 +như giá trị của số pi, phải không? + +8 +00:00:31,380 --> 00:00:34,950 +Bạn muốn tra cứu nó một lần và bạn muốn đưa nó vào mã của mình và bạn + +9 +00:00:34,950 --> 00:00:36,570 +không bao giờ muốn tra cứu lại nữa. + +10 +00:00:37,230 --> 00:00:41,940 +Và bất cứ khi nào bạn muốn sử dụng nó, chẳng hạn như bên trong một hàm, thì tất cả những + +11 +00:00:41,940 --> 00:00:45,540 +gì bạn muốn làm là chỉ cần nhấn vào giá trị đó của số pi. + +12 +00:00:46,860 --> 00:00:50,610 +Vì vậy, thông thường, để phân biệt các hằng này mà bạn + +13 +00:00:50,640 --> 00:00:54,780 +sẽ không bao giờ thay đổi với các biến mà bạn có khả + +14 +00:00:54,780 --> 00:00:56,460 +năng thay đổi, quy + +15 +00:00:56,730 --> 00:01:01,170 +ước đặt tên trong Python là biến nó thành tất cả các chữ hoa. + +16 +00:01:01,740 --> 00:01:02,370 +Ví + +17 +00:01:02,370 --> 00:01:07,370 +dụ: nếu bạn có PI hoặc bạn có URL cần sử dụng hoặc bạn có một + +18 +00:01:07,860 --> 00:01:10,020 +số loại xử lý Twitter, thì tất + +19 +00:01:10,800 --> 00:01:15,240 +cả những thứ này sẽ được viết hoa, phân tách bằng dấu gạch dưới. + +20 +00:01:15,990 --> 00:01:20,990 +Điều này có nghĩa là sau này trong hàm của bạn và bạn muốn sử dụng một trong + +21 +00:01:21,060 --> 00:01:25,260 +những hằng số toàn cục này, ngay khi bạn nhập nó, bạn có thể thấy + +22 +00:01:25,380 --> 00:01:27,690 +nó là chữ hoa và bạn biết + +23 +00:01:27,690 --> 00:01:31,560 +tự nhắc mình không sửa đổi điều này bên trong mã của mình. + +24 +00:01:33,090 --> 00:01:35,340 +Bây giờ chúng ta đã nói một chút về phạm + +25 +00:01:35,670 --> 00:01:40,230 +vi, đã đến lúc đưa kiến thức của bạn vào hành động. Hãy chuyển sang bài học tiếp theo và tôi + +26 +00:01:40,590 --> 00:01:43,530 +có một bài kiểm tra sẽ kiểm tra sự hiểu biết của bạn. + +27 +00:01:43,860 --> 00:01:46,110 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/005 Scope Quiz.html b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/005 Scope Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..2974a78c150a7f4a8dd9b5d27a261dc779e57c09 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/005 Scope Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Day-12-Goal-Click-Run-to-see-the-final-project.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Day-12-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..08573204bd75509ebfe8f304aa7478c7a958be82 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Day-12-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/guess-the-number-final?v=1 \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Get-your-own-ASCII-Text-from-Patorjk.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Get-your-own-ASCII-Text-from-Patorjk.url new file mode 100644 index 0000000000000000000000000000000000000000..21a1424dd9972d8ef7d254c1b11bc4a7e3b4a2fa --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Get-your-own-ASCII-Text-from-Patorjk.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20 \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Introducing the Final Project The Number Guessing Game.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Introducing the Final Project The Number Guessing Game.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f1d7284b81a20bad3732d2645543df9ea381c357 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Introducing the Final Project The Number Guessing Game.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c123cc3ea58de2d6ddd006ca6d90b0363ed605764b2144f57d6bcd49612a5e5 +size 16965155 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Introducing the Final Project The Number Guessing Game_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Introducing the Final Project The Number Guessing Game_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..60bb9aa3d0e006e67193e94f866fe3705f86e338 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Introducing the Final Project The Number Guessing Game_vi.srt @@ -0,0 +1,308 @@ +1 +00:00:00,840 --> 00:00:05,610 +Bây giờ bạn đã hoàn thành một số vấn đề về phạm vi, đã đến lúc giải quyết + +2 +00:00:05,640 --> 00:00:06,810 +dự án cuối cùng. + +3 +00:00:07,260 --> 00:00:12,260 +Dự án cuối cùng này hơi đặc biệt một chút vì bây giờ tôi nghĩ bạn + +4 +00:00:12,450 --> 00:00:17,430 +đã có đủ kinh nghiệm và đủ kỹ năng để thực sự tạo ra dự + +5 +00:00:17,550 --> 00:00:22,140 +án này hoàn toàn từ đầu. Vì vậy, bạn đang bay một mình bây giờ. + +6 +00:00:22,890 --> 00:00:26,490 +Bây giờ, điều đầu tiên tôi muốn bạn làm là đi đến phần + +7 +00:00:26,490 --> 00:00:29,130 +đoán-số-cuối cùng. nhà máy bia. repl. chạy + +8 +00:00:29,700 --> 00:00:33,630 +và tôi muốn bạn chơi trò chơi này khá nhiều lần, chỉ để bạn + +9 +00:00:33,990 --> 00:00:38,040 +hiểu rõ về cách nó hoạt động. Bây giờ, điều đầu tiên + +10 +00:00:38,100 --> 00:00:40,500 +nó cho chúng ta biết là Chào mừng. + +11 +00:00:41,070 --> 00:00:44,790 +Và sau đó nó cho chúng ta biết nó đang nghĩ đến một số từ 1 đến 100, và sau + +12 +00:00:45,090 --> 00:00:48,480 +đó chúng ta phải chọn một khó khăn. Vì vậy, tôi sẽ lựa chọn khó khăn. + +13 +00:00:49,350 --> 00:00:52,380 +Bây giờ nó cho tôi biết rằng tôi có năm lần + +14 +00:00:52,950 --> 00:00:55,020 +thử đoán số và tôi sẽ đoán. + +15 +00:00:55,770 --> 00:01:00,000 +Bây giờ nó nói với tôi rằng 50 là quá cao, nó không phải là con số + +16 +00:01:00,270 --> 00:01:04,800 +mà nó đã nghĩ, và tôi phải đoán lại. Và hãy để ý xem tôi đã bắt đầu như thế nào với + +17 +00:01:04,860 --> 00:01:08,970 +năm lần thử, bây giờ tôi chỉ còn bốn lần. Vì vậy, chúng ta hãy thử 25. + +18 +00:01:09,420 --> 00:01:12,510 +Vì vậy, 25 là quá thấp, nhưng 50 là quá cao. + +19 +00:01:12,900 --> 00:01:15,360 +Vì vậy, điều đó có nghĩa là con số nằm ở đâu đó giữa chúng. + +20 +00:01:15,660 --> 00:01:19,950 +Hãy thử 30. Một lần nữa, quá thấp. Hãy thử + +21 +00:01:19,950 --> 00:01:22,980 +4o. Quá cao. Có lẽ là 45. + +22 +00:01:23,250 --> 00:01:25,260 +Nhưng tôi chỉ còn một nỗ lực nữa vì + +23 +00:01:25,260 --> 00:01:28,380 +tôi đã vượt qua mức khó. Và đúng như dự đoán, + +24 +00:01:28,440 --> 00:01:32,340 +tôi đã không tìm được đúng con số và giờ tôi đã hết đoán. + +25 +00:01:32,490 --> 00:01:34,980 +Vì vậy, tôi đã thua. Nếu chúng tôi chạy lại, + +26 +00:01:35,010 --> 00:01:37,770 +chúng tôi có thể thử chơi trò chơi này ở mức độ dễ dàng. + +27 +00:01:39,150 --> 00:01:43,050 +Ở mức độ dễ, chúng tôi nhận được 10 lần thử thay vì 5 lần. + +28 +00:01:43,680 --> 00:01:46,080 +Điều đó mang lại cho chúng tôi một chút cơ hội. + +29 +00:01:46,590 --> 00:01:51,540 +Vì vậy, chúng ta hãy thử 50. 50 là quá cao. 25 là quá cao. 10, 10 + +30 +00:01:52,050 --> 00:01:56,910 +là quá thấp. Vì vậy, nó là từ 10 đến 25. Vì vậy, chúng ta hãy thử 15. + +31 +00:01:57,510 --> 00:01:59,910 +Bây giờ, nếu 15 là quá cao, nhưng 10 là quá + +32 +00:02:00,300 --> 00:02:02,670 +thấp, thì chúng ta đã gần đến câu trả lời. + +33 +00:02:03,330 --> 00:02:08,039 +Bây giờ là từ 12 đến 15, hãy thử 13, 14. + +34 +00:02:08,490 --> 00:02:12,360 +Chúng ta bắt đầu. Câu trả lời thực tế mà nó có trong đầu là 14. + +35 +00:02:13,020 --> 00:02:17,820 +Và tôi còn bốn lần cố gắng để có được câu trả lời cuối cùng và + +36 +00:02:17,820 --> 00:02:22,170 +cuối cùng thì tôi đã trả được. Chơi qua trò chơi này ít + +37 +00:02:22,170 --> 00:02:24,300 +nhất ba, bốn lần + +38 +00:02:24,840 --> 00:02:29,490 +ở các cấp độ khác nhau và nhớ rằng cấp độ dễ có + +39 +00:02:29,850 --> 00:02:32,460 +10 lượt, cấp độ khó, người chơi + +40 +00:02:32,610 --> 00:02:37,610 +nhận được 5 lượt khi đoán số. Và hãy xem mã hoạt động như thế nào và nó hoạt động như thế nào. + +41 +00:02:38,880 --> 00:02:43,380 +Và sau đó tôi muốn bạn phá vỡ vấn đề này. Viết danh sách việc cần làm, + +42 +00:02:43,410 --> 00:02:47,970 +tạo danh sách công việc của riêng bạn mà bạn cần giải quyết và + +43 +00:02:47,970 --> 00:02:52,620 +bắt đầu với việc đơn giản nhất. Và khi bạn đã giải quyết xong vấn đề đó, hãy bắt đầu đưa một số nhận xét vào mã của bạn. + +44 +00:02:52,650 --> 00:02:55,380 +Viết ra chức năng mà chương trình của bạn + +45 +00:02:55,890 --> 00:03:00,890 +cần, sau đó viết mã và sau đó kiểm tra mã của bạn và tiếp tục cho đến khi + +46 +00:03:01,330 --> 00:03:05,470 +bạn đã kiểm tra nó và đảm bảo rằng nó hoạt động trong mọi tình huống. + +47 +00:03:06,430 --> 00:03:09,730 +Vì vậy, dự án cuối cùng này không có mã bắt đầu. + +48 +00:03:10,270 --> 00:03:13,900 +Tôi sẽ không cung cấp cho bạn bất kỳ nhận xét hoặc việc cần làm nào để bắt đầu. + +49 +00:03:14,560 --> 00:03:18,340 +Tôi muốn bạn thử và giải quyết toàn bộ dự án này một mình. + +50 +00:03:18,910 --> 00:03:23,710 +Và điều duy nhất tôi sẽ cung cấp cho bạn là liên kết này để bạn có + +51 +00:03:23,710 --> 00:03:27,310 +thể thử dự án cuối cùng. Và tôi biết rằng có rất nhiều cách mà bạn + +52 +00:03:27,430 --> 00:03:31,960 +có thể gian lận, nhưng đừng làm vậy. Có niềm tin vào chính mình. Nếu bạn giải quyết vấn đề này trong một + +53 +00:03:31,990 --> 00:03:34,180 +giờ, tôi khá chắc chắn rằng cuối cùng bạn sẽ đạt được điều đó. + +54 +00:03:34,570 --> 00:03:38,350 +Bạn có quyền thống trị tự do về kiểu dáng hoặc từ ngữ, bất cứ + +55 +00:03:38,620 --> 00:03:40,360 +điều gì bạn muốn nó nói. + +56 +00:03:40,450 --> 00:03:43,750 +Nhưng nó có chức năng tương tự. Bây giờ điều này cũng có + +57 +00:03:43,750 --> 00:03:46,960 +nghĩa là nếu bạn muốn có một số nghệ thuật ASCII của riêng mình, + +58 +00:03:47,260 --> 00:03:49,060 +thì bạn có thể truy cập trang web + +59 +00:03:49,120 --> 00:03:53,830 +này mà tôi sẽ liên kết đến trong tài nguyên khóa học và chỉ cần nhập tên trò chơi của bạn. + +60 +00:03:53,830 --> 00:03:55,330 +Vì vậy, có + +61 +00:03:56,220 --> 00:03:58,410 +thể nó sẽ là Đoán Số. + +62 +00:04:00,720 --> 00:04:03,870 +Và bạn có thể thay đổi phông chữ mà bạn muốn cho nó. + +63 +00:04:04,020 --> 00:04:07,950 +Có thể là một thứ gì đó hơi đẳng cấp hoặc có thể là yêu tinh, hoặc + +64 +00:04:08,760 --> 00:04:11,190 +có thể huấn luyện, bất cứ điều gì bạn muốn. + +65 +00:04:11,430 --> 00:04:13,230 +Và sau đó khi bạn hài lòng với phông + +66 +00:04:13,260 --> 00:04:16,440 +chữ, bạn có thể chọn và sao chép mọi thứ có trên đó, rồi bên + +67 +00:04:16,769 --> 00:04:18,060 +trong dự án của bạn, + +68 +00:04:18,060 --> 00:04:23,060 +bạn có thể tạo một tệp mới có tên là nghệ thuật. py và sau đó tạo một biến mới và đặt nó + +69 +00:04:23,670 --> 00:04:28,350 +bằng với thiết kế mà bạn đã nghĩ đến. Bây giờ, để nó trông đúng, + +70 +00:04:28,380 --> 00:04:32,820 +bạn thực sự phải tạo nó dưới dạng chuỗi tài liệu, vì vậy ba + +71 +00:04:32,850 --> 00:04:37,850 +dấu ngoặc kép để bắt đầu và sau đó ba dấu ngoặc kép để kết thúc. + +72 +00:04:39,900 --> 00:04:43,680 +Và sau đó, chỉ cần đảm bảo rằng bạn có đủ không gian theo chiều ngang để hiển + +73 +00:04:43,680 --> 00:04:46,260 +thị toàn bộ nội dung trong một lần thay vì nó bị + +74 +00:04:46,260 --> 00:04:49,530 +cắt bớt khi bạn có một chút không gian và bạn sẽ có thể xem thiết + +75 +00:04:49,530 --> 00:04:50,363 +kế thực tế. + +76 +00:04:51,120 --> 00:04:56,120 +Hãy tạm dừng video ngay bây giờ và tự tạo trò chơi đoán số này làm dự + +77 +00:04:56,670 --> 00:04:57,870 +án cuối cùng. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Starting-Repl-for-the-Number-Guessing-Game.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Starting-Repl-for-the-Number-Guessing-Game.url new file mode 100644 index 0000000000000000000000000000000000000000..ffb8b184561ebd2b96a2defd57cc3ffb13cf75a0 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/006 Starting-Repl-for-the-Number-Guessing-Game.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/guess-the-number-start#main.py \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Course-Fixes-Report-an-Issue.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution & Walkthrough to the Number Guessing Game.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution & Walkthrough to the Number Guessing Game.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8ced111387736f23adc20a070c29422d3c6fe8ac --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution & Walkthrough to the Number Guessing Game.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b7858e3cb0f75d2b77df4299f2bc7f26196b4b841f6f88056ad5ff9621ed0f8 +size 216175645 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution & Walkthrough to the Number Guessing Game_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution & Walkthrough to the Number Guessing Game_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4f5c78ef244bd4682f142871349c18f74fd4ead6 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution & Walkthrough to the Number Guessing Game_vi.srt @@ -0,0 +1,1408 @@ +1 +00:00:00,090 --> 00:00:01,020 +Sao mà bạn vào được? + +2 +00:00:01,680 --> 00:00:05,070 +Hy vọng rằng bạn đã quản lý để hoàn thành dự án và bạn chỉ ở đây + +3 +00:00:05,070 --> 00:00:07,470 +để kiểm tra giải pháp. Bây giờ, nếu bạn + +4 +00:00:07,530 --> 00:00:10,110 +chưa cho nó một cách thích hợp và ý tôi + +5 +00:00:10,110 --> 00:00:14,400 +là, ít nhất một giờ để giải quyết vấn đề này, sau đó quay trở lại, tiếp tục. + +6 +00:00:14,640 --> 00:00:17,460 +Chỉ khi bạn đấu tranh thì bạn mới thực sự trở nên tốt hơn. + +7 +00:00:17,790 --> 00:00:19,800 +Bạn có thể xem tôi gõ mã cả ngày và điều đó sẽ + +8 +00:00:19,800 --> 00:00:21,630 +không giúp bạn trở thành một lập trình viên giỏi hơn. + +9 +00:00:21,930 --> 00:00:25,560 +Vì vậy, tôi biết bạn sẽ rất cố gắng và tôi muốn bạn + +10 +00:00:25,560 --> 00:00:30,150 +cố gắng thực sự, rất chăm chỉ và đảm bảo rằng bạn có thể tự mình + +11 +00:00:30,150 --> 00:00:34,230 +hoàn thành từng dự án này. Tôi đã đề cập rằng trò chơi này không + +12 +00:00:34,230 --> 00:00:38,610 +có repl bắt đầu, vì vậy chúng tôi sẽ bắt đầu với trò chơi của riêng mình và bạn có + +13 +00:00:38,610 --> 00:00:42,930 +thể gọi nó là bất cứ thứ gì bạn muốn, nhưng tôi sẽ gọi nó là trò chơi đoán số. + +14 +00:00:43,860 --> 00:00:46,290 +Bây giờ, khi bạn đang tạo một dự án mới từ đầu + +15 +00:00:46,320 --> 00:00:47,580 +như chúng ta đang làm + +16 +00:00:48,030 --> 00:00:51,420 +ngay bây giờ, có thể hơi đáng sợ khi nhìn chằm chằm vào một màn hình trống. + +17 +00:00:51,900 --> 00:00:56,820 +Điều đầu tiên cần làm là chỉ cần chia dự án thành các + +18 +00:00:56,820 --> 00:00:59,910 +thành phần riêng lẻ. Vì vậy, trong khi bạn đang chơi trò + +19 +00:01:00,030 --> 00:01:03,930 +chơi này, bạn có thể thấy rằng có những phần khác nhau của nó mà chúng ta cần phải hoàn thành phải không? + +20 +00:01:04,379 --> 00:01:08,280 +Phần đầu tiên là in tất cả các phần bắt đầu của trò chơi, phần + +21 +00:01:08,640 --> 00:01:12,390 +tiếp theo là cố gắng tìm ra cách đặt mức độ khó này, yêu cầu + +22 +00:01:13,140 --> 00:01:15,960 +người dùng nhập một từ dễ hoặc khó, sau đó thay + +23 +00:01:16,320 --> 00:01:21,320 +đổi số lần thử dựa trên đó . Chúng ta đã có thể bắt đầu nghĩ + +24 +00:01:21,870 --> 00:01:26,870 +về việc có thể chúng ta cần tạo một hàm để đặt độ khó, và sau đó + +25 +00:01:28,380 --> 00:01:31,290 +chúng ta cần để người dùng phỏng đoán, phải không? + +26 +00:01:31,320 --> 00:01:35,280 +Vì vậy, họ sẽ đoán một số. Vì vậy, giả sử tôi sẽ nhập + +27 +00:01:35,820 --> 00:01:39,660 +50, và sau đó bằng cách nào đó chúng ta phải kiểm tra dự đoán + +28 +00:01:39,660 --> 00:01:44,340 +đó với số được chọn ban đầu và sau đó kiểm tra xem nó quá thấp hay quá cao. + +29 +00:01:45,030 --> 00:01:48,390 +Vì vậy, bây giờ chúng tôi có một số phần bổ sung của chương trình của chúng tôi, phải không? + +30 +00:01:48,390 --> 00:01:53,390 +Chúng ta cần một số cách chọn một số ngẫu nhiên từ 1 đến 100. + +31 +00:01:57,120 --> 00:02:00,000 +Vì vậy, đó là điều đầu tiên có thể xảy ra trong mã của chúng tôi. + +32 +00:02:00,300 --> 00:02:02,970 +Chúng ta cần có một chức năng + +33 +00:02:03,240 --> 00:02:06,270 +để đặt độ khó, chúng ta có thể cần một + +34 +00:02:06,300 --> 00:02:10,470 +số loại chức năng để, ừm, để người dùng đoán một con số. + +35 +00:02:12,450 --> 00:02:17,450 +Và chúng tôi cũng muốn kiểm tra con số mà họ đã đoán so với con số mà chúng + +36 +00:02:18,660 --> 00:02:21,750 +tôi ban đầu để xem nó quá cao hay quá thấp. + +37 +00:02:21,900 --> 00:02:26,040 +Vì vậy, có lẽ là một chức năng để kiểm + +38 +00:02:26,100 --> 00:02:30,750 +tra suy đoán của người dùng so với câu trả lời thực tế. + +39 +00:02:31,560 --> 00:02:35,130 +Bây giờ hãy để ý xem mỗi lần tôi đoán, số lần + +40 +00:02:35,190 --> 00:02:37,050 +thử của tôi lại giảm đi. + +41 +00:02:37,410 --> 00:02:42,410 +Vì vậy, chúng ta cũng cần theo dõi đó phải không? Theo dõi số lượt và giảm từng lượt + +42 +00:02:45,750 --> 00:02:47,460 +nếu họ làm sai. + +43 +00:02:48,870 --> 00:02:53,760 +Bây giờ nó lặp lại một lần nữa đến giai đoạn này, nơi chúng tôi đang đưa ra một phỏng đoán khác. + +44 +00:02:53,790 --> 00:02:56,640 +Vì vậy, nếu 50 là quá cao, thì có lẽ chúng ta sẽ đoán là 25. + +45 +00:02:57,240 --> 00:03:01,450 +Chúng ta phải có một số cách để lặp lại phần này của mã, phải không? + +46 +00:03:02,920 --> 00:03:07,510 +Chúng tôi sẽ lặp lại nó miễn là họ vẫn còn nỗ lực và họ đã sai. + +47 +00:03:08,350 --> 00:03:10,660 +Bây giờ, tuy nhiên, nếu họ làm đúng, vì vậy tôi nghĩ + +48 +00:03:11,020 --> 00:03:14,800 +rằng tôi có cơ hội tốt để làm đúng. Vì vậy, nếu 25 vẫn còn quá + +49 +00:03:14,800 --> 00:03:18,760 +cao, hãy thử 12. Và chúng ta bắt đầu. Khi tôi nhận được câu trả lời đúng, nó + +50 +00:03:18,760 --> 00:03:20,980 +cho tôi biết, bạn đã hiểu. Câu trả lời là 12. + +51 +00:03:21,520 --> 00:03:25,840 +Vì vậy, bây giờ chúng ta đã có một số phần cơ bản của mã của chúng ta trong phần nhận xét + +52 +00:03:26,230 --> 00:03:29,590 +và chúng ta có thể bắt đầu suy nghĩ về cách viết nó ra, phải không? + +53 +00:03:30,220 --> 00:03:32,350 +Hãy bắt đầu bằng cách giải quyết vấn đề + +54 +00:03:32,350 --> 00:03:35,410 +dễ nhất, đó là chọn một số ngẫu nhiên từ một đến một trăm. + +55 +00:03:35,950 --> 00:03:40,950 +Tất cả những gì bạn phải làm cho điều này chỉ là nhập mô-đun ngẫu + +56 +00:03:41,290 --> 00:03:46,150 +nhiên hoặc thậm chí tốt hơn từ mô-đun ngẫu nhiên, nhập hàm randint. + +57 +00:03:47,410 --> 00:03:48,910 +Bây giờ bên trong mã của + +58 +00:03:48,940 --> 00:03:53,940 +chúng tôi, chúng tôi có thể chỉ cần sử dụng randint. Chúng ta có thể nói câu trả lời bằng một + +59 +00:03:55,780 --> 00:04:00,430 +randint nằm trong khoảng từ 1 đến 100. Và tất nhiên hãy nhớ rằng + +60 +00:04:00,430 --> 00:04:02,890 +int rand bao gồm a và b, vì + +61 +00:04:02,890 --> 00:04:05,950 +vậy cả 1 và 100 đều có thể hiển thị. + +62 +00:04:07,090 --> 00:04:10,810 +Ngoài ra, chúng tôi có thể phải cung cấp cho người dùng một số thông báo này. + +63 +00:04:10,810 --> 00:04:13,060 +Vì vậy, tôi sẽ sao chép một số tin nhắn này. + +64 +00:04:13,540 --> 00:04:17,769 +Vì vậy, tôi sẽ in 'Chào mừng bạn đến với trò chơi đoán. 'Và tôi cũng sẽ in + +65 +00:04:18,339 --> 00:04:20,440 +rằng tôi đang + +66 +00:04:20,440 --> 00:04:25,390 +nghĩ đến một số từ 1 đến 100, như thế. + +67 +00:04:25,990 --> 00:04:29,080 +Vì vậy, bây giờ chúng tôi đã có câu trả lời mà họ cần phải đoán + +68 +00:04:29,260 --> 00:04:31,810 +và chúng tôi có một chút nội dung bắt đầu cho họ. + +69 +00:04:32,350 --> 00:04:36,670 +Điều đơn giản nhất tiếp theo là tìm ra cách để người + +70 +00:04:36,700 --> 00:04:40,120 +dùng đoán một số. Vì vậy, chúng tôi biết rằng chúng tôi + +71 +00:04:40,150 --> 00:04:45,040 +sẽ cần một thông tin đầu vào để yêu cầu họ phỏng đoán, vì vậy chúng tôi có thể sao chép phần này. + +72 +00:04:45,190 --> 00:04:48,130 +Và chúng ta có thể sử dụng nó làm lời nhắc, và + +73 +00:04:48,670 --> 00:04:52,810 +sau đó chúng ta sẽ phải lưu dự đoán của họ và chuyển nó thành một số nguyên. + +74 +00:04:53,470 --> 00:04:58,060 +Vì vậy, họ sẽ nhập một số ở đây, phải không? Và chúng tôi sẽ gọi đây là phỏng đoán. + +75 +00:04:58,960 --> 00:05:03,960 +Bây giờ người dùng có thể đoán một số và bây giờ chúng ta phải tìm ra một + +76 +00:05:05,020 --> 00:05:09,970 +số cách để kiểm tra suy đoán của người dùng so với câu trả lời thực tế. + +77 +00:05:10,750 --> 00:05:13,450 +Đây có lẽ là thời điểm tốt để tạo một hàm. + +78 +00:05:13,630 --> 00:05:18,310 +Vậy tại sao chúng ta không đi lên trên cùng và tạo chức năng của chúng ta ở đây. + +79 +00:05:18,910 --> 00:05:20,770 +Chúng tôi sẽ gọi đây là + +80 +00:05:21,700 --> 00:05:26,410 +check_answer và chúng tôi sẽ đưa ra dự đoán của người dùng và câu trả lời thực tế + +81 +00:05:26,410 --> 00:05:30,340 +để đạt được chức năng kiểm tra này. Vì vậy, trong trường hợp này, + +82 +00:05:30,340 --> 00:05:35,340 +chúng ta sẽ kiểm tra xem liệu dự đoán có lớn hơn câu trả lời hay không, trong + +83 +00:05:36,010 --> 00:05:40,300 +trường hợp này, nó quá cao, phải không? Vì vậy, chúng tôi sẽ chỉ in quá cao. + +84 +00:05:41,470 --> 00:05:44,920 +Bây giờ, điều gì sẽ xảy ra nếu số đoán thực sự ít hơn + +85 +00:05:45,220 --> 00:05:49,360 +câu trả lời, vẫn không bằng câu trả lời, nhưng trong trường hợp này thì nó quá thấp. + +86 +00:05:50,290 --> 00:05:53,530 +Vì vậy, bây giờ điều kiện cuối cùng là họ thực sự làm đúng. + +87 +00:05:53,530 --> 00:05:57,040 +Vì vậy, bạn có thể viết elif đoán tương đương với câu trả lời, nhưng bạn + +88 +00:05:57,350 --> 00:06:00,650 +cũng có thể chỉ sử dụng cái khác vì không có khả năng nào khác. + +89 +00:06:01,340 --> 00:06:04,970 +Câu lệnh khác này nắm bắt đúng thời điểm khi họ thực sự làm đúng. + +90 +00:06:05,900 --> 00:06:08,690 +Vì vậy, trong trường hợp này, chúng tôi sẽ in những gì chúng tôi có ở đây, và sau đó chúng + +91 +00:06:08,930 --> 00:06:10,790 +tôi sẽ in ra câu trả lời. Tất nhiên, chúng + +92 +00:06:10,790 --> 00:06:14,690 +tôi sẽ thay thế điều đó bằng bất kỳ câu trả lời thực tế nào + +93 +00:06:14,690 --> 00:06:18,860 +và biến điều này thành một chuỗi. Vậy là xong bước đó. + +94 +00:06:19,310 --> 00:06:22,610 +Và chúng ta hãy nghĩ về những điều khác dễ dàng mà chúng ta có thể loại bỏ danh sách. + +95 +00:06:23,120 --> 00:06:27,080 +Hãy nghĩ về chức năng để thiết lập độ khó. Vì vậy, ở đây, ngoài + +96 +00:06:27,110 --> 00:06:29,420 +hàm check_answer của chúng tôi, tôi + +97 +00:06:29,720 --> 00:06:34,720 +sẽ tạo một hàm khác này, một số cách để thiết lập độ khó. + +98 +00:06:35,270 --> 00:06:37,580 +Vì vậy, chúng ta hãy gọi đây là set_difficulty, và + +99 +00:06:38,480 --> 00:06:41,000 +nó có thể sẽ không sử dụng bất kỳ đầu vào nào. + +100 +00:06:41,030 --> 00:06:45,800 +Nó chỉ thực hiện một số loại hành động. Vì vậy, khi chúng tôi lần đầu tiên bắt + +101 +00:06:45,950 --> 00:06:48,980 +đầu trò chơi, nó đã yêu cầu chúng tôi chọn một độ khó. + +102 +00:06:48,980 --> 00:06:53,980 +Vì vậy, tôi sẽ sao chép văn bản này và tôi sẽ đưa nó vào + +103 +00:06:55,310 --> 00:06:58,280 +đầu vào, chọn độ khó dễ hay khó. + +104 +00:06:58,970 --> 00:07:03,380 +Và sau đó chúng tôi sẽ lưu điều này có thể thành một biến, mà tôi sẽ gọi là cấp + +105 +00:07:03,410 --> 00:07:08,090 +độ, vì vậy mức độ khó khăn mà họ muốn. Bây giờ, nếu mức độ + +106 +00:07:08,120 --> 00:07:13,120 +mà họ chọn tương đương với mức độ dễ, tốt, trong trường + +107 +00:07:13,820 --> 00:07:14,660 +hợp + +108 +00:07:14,690 --> 00:07:19,690 +này, chúng tôi muốn đặt số lần thử họ phải là 10. + +109 +00:07:20,180 --> 00:07:23,210 +Vì vậy, họ có 10 lần thử. Nhưng ngược lại, nếu + +110 +00:07:23,900 --> 00:07:27,800 +họ đã chọn khó, thì họ chỉ có 5 lần thử. + +111 +00:07:28,280 --> 00:07:33,280 +Vì vậy, đây có lẽ là thời điểm thực sự tốt để tạo một hằng số toàn cầu. + +112 +00:07:34,370 --> 00:07:37,250 +Vì vậy, chúng ta đã thấy điều này trong bài học trước + +113 +00:07:37,730 --> 00:07:42,110 +về phạm vi, nhưng đây là một điều thực sự tốt vì nó có nghĩa là nếu chúng + +114 +00:07:42,110 --> 00:07:46,760 +ta tạo hằng số chung này ở trên cùng, thì nếu chúng ta muốn chuyển đổi cách trò chơi + +115 +00:07:46,910 --> 00:07:51,860 +của mình hoạt động, chúng ta có thể thực sự dễ dàng truy cập những hằng số này chỉ bằng + +116 +00:07:51,860 --> 00:07:54,920 +cách cuộn qua đầu trang. Hãy gọi số đầu tiên, + +117 +00:07:54,980 --> 00:07:59,690 +ừm, EASY_LEVEL_TURNS, do đó, số thuật ngữ bạn có thể hiểu dễ dàng, sẽ + +118 +00:07:59,990 --> 00:08:01,130 +là 10. + +119 +00:08:01,580 --> 00:08:06,410 +Và sau đó chúng ta sẽ có HARD_LEVEL_TURNS và con số này + +120 +00:08:06,860 --> 00:08:08,420 +sẽ bằng 5. + +121 +00:08:09,110 --> 00:08:13,370 +Bây giờ tôi đã có hai hằng số này là toàn cục và tôi có thể sử dụng + +122 +00:08:13,430 --> 00:08:17,330 +nó bên trong bất kỳ hàm nào của mình hoặc về cơ bản ở bất kỳ + +123 +00:08:17,330 --> 00:08:19,910 +đâu trên trang này. Nếu cấp + +124 +00:08:20,060 --> 00:08:25,060 +độ dễ, tôi sẽ đặt số lượt bằng EASY_LEVEL_TURNS. + +125 +00:08:26,750 --> 00:08:29,960 +Vì vậy, đây sẽ là một con số phải không? Ngược lại, nếu họ + +126 +00:08:29,990 --> 00:08:31,910 +chọn khó thay thì lượt + +127 +00:08:32,360 --> 00:08:36,830 +đi có lẽ phải là HARD_LEVEL_TURNS. Bây giờ, đặt nó + +128 +00:08:36,860 --> 00:08:41,390 +ở đây không có ích gì. Tôi thực sự cần nó trong trò chơi của mình. + +129 +00:08:42,320 --> 00:08:44,300 +Vì vậy, bây giờ quay trở lại trò + +130 +00:08:44,330 --> 00:08:47,690 +chơi của tôi, tôi cần cho người dùng biết số lần thử, bao nhiêu + +131 +00:08:47,690 --> 00:08:50,840 +lượt họ thực sự nhận được. Để bắt đầu, tôi + +132 +00:08:50,870 --> 00:08:55,710 +sẽ sử dụng một câu lệnh in chỉ in số lần thử + +133 +00:08:55,710 --> 00:08:58,560 +chúng còn lại. Và nó không phải lúc nào cũng là 5. + +134 +00:08:58,560 --> 00:09:01,800 +Đôi khi nó là 5, đôi khi nó sẽ là 10. + +135 +00:09:02,220 --> 00:09:07,020 +Vì vậy, những gì tôi cần là một số cách theo dõi số lượt + +136 +00:09:07,020 --> 00:09:11,400 +này, phải không? Nhưng làm sao chúng ta biết được họ nhận được bao nhiêu lượt? Vâng, nó phụ thuộc vào + +137 +00:09:11,400 --> 00:09:16,260 +những gì họ đã chọn ở đây, phải không? Nếu họ đã chọn khó, thì + +138 +00:09:16,320 --> 00:09:20,700 +số lượt phải bằng HARD_LEVEL_TURNS. Nếu họ chọn dễ, nó + +139 +00:09:20,700 --> 00:09:22,410 +phải bằng EASY_LEVEL_TURNS. + +140 +00:09:22,980 --> 00:09:25,860 +Vì vậy, thay vì sử dụng nó như một số loại + +141 +00:09:26,130 --> 00:09:30,840 +biến toàn cục mà tôi phải thay đổi bên trong ở đây, điều này sẽ yêu cầu tôi + +142 +00:09:31,050 --> 00:09:32,790 +nói toàn cục, sau đó + +143 +00:09:32,790 --> 00:09:37,080 +quay lại để tôi có thể truy cập biến cụ thể này và thay đổi nó trong + +144 +00:09:37,080 --> 00:09:39,120 +các bước này, nó sẽ rất nhiều , + +145 +00:09:39,150 --> 00:09:44,150 +tốt hơn nhiều nếu tôi chỉ trả về các giá trị này dưới dạng đầu ra từ hàm này. + +146 +00:09:45,930 --> 00:09:47,760 +Nếu điều này được đặt + +147 +00:09:47,850 --> 00:09:51,600 +là trả về, thì tôi có thể chỉ cần gọi hàm này là set_difficulty, + +148 +00:09:52,050 --> 00:09:56,350 +hàm này sẽ kích hoạt đầu vào này. Và sau đó khi người dùng đã + +149 +00:09:56,520 --> 00:10:00,540 +thiết lập nó, thì đầu ra sẽ là số lượt thực tế mà họ có. + +150 +00:10:00,900 --> 00:10:05,340 +Và bây giờ tôi có thể sử dụng nó bên trong câu lệnh in này để cho họ biết + +151 +00:10:05,340 --> 00:10:07,710 +họ có bao nhiêu lượt. Hiện nay. + +152 +00:10:07,800 --> 00:10:10,350 +Thực ra tôi đã viết khá nhiều mã, và có lẽ + +153 +00:10:10,410 --> 00:10:15,410 +đây là thời điểm thích hợp để chạy mã. Trong khi tôi đang kiểm tra mã của + +154 +00:10:15,600 --> 00:10:18,960 +mình, có lẽ bạn nên thực sự xem câu trả lời là gì. + +155 +00:10:19,290 --> 00:10:23,730 +Vì vậy, chúng tôi có thể thêm một chút mã thử nghiệm để in ra câu trả lời thực tế + +156 +00:10:23,730 --> 00:10:26,250 +đã được chọn là gì. Và nếu chúng tôi chạy + +157 +00:10:26,250 --> 00:10:30,120 +mã ngay bây giờ, bạn có thể thấy chúng tôi đã có phần bắt đầu khá nhiều. + +158 +00:10:30,510 --> 00:10:31,920 +Chào mừng bạn đến với trò chơi đoán số. + +159 +00:10:31,920 --> 00:10:33,990 +Tôi nghĩ rằng có một số từ 1 đến 100, và sau + +160 +00:10:34,290 --> 00:10:37,650 +đó chúng tôi có gợi ý nhỏ ở đây. Câu trả lời thực tế là 63. + +161 +00:10:38,190 --> 00:10:39,930 +Vì vậy, chúng ta phải đoán. + +162 +00:10:40,110 --> 00:10:44,730 +Và tôi thực sự nhận thấy rằng đầu vào đó cần một khoảng trống ở đây để tôi + +163 +00:10:44,730 --> 00:10:48,960 +không viết ngay bên cạnh dấu hai chấm. Vì vậy, giả sử tôi đoán 50. + +164 +00:10:49,920 --> 00:10:52,620 +Bây giờ nó yêu cầu chúng tôi chọn một khó khăn. + +165 +00:10:52,950 --> 00:10:54,990 +Vì vậy, tôi đã có một chút vấn đề ở đây. + +166 +00:10:55,020 --> 00:10:58,230 +Tôi thực sự nên có phần này trước phần khác. + +167 +00:10:58,770 --> 00:11:02,520 +Vì vậy, tôi nên chọn độ khó và sau đó đưa ra suy đoán. + +168 +00:11:02,880 --> 00:11:07,740 +Vì vậy, bây giờ chúng ta hãy dừng lại và chạy và xem liệu chúng ta có sửa được lỗi đó hay không. Và bạn có thể thấy đúng, thực + +169 +00:11:07,740 --> 00:11:11,070 +sự nó yêu cầu chúng tôi một khó khăn đầu tiên. + +170 +00:11:11,430 --> 00:11:12,840 +Vì vậy, tôi sẽ chọn + +171 +00:11:13,140 --> 00:11:17,100 +dễ và nó cho tôi biết rằng tôi còn 10 lần thử và sau đó hãy đoán. + +172 +00:11:17,580 --> 00:11:22,260 +Và nếu tôi chọn khó thay vào đó, thì nó cho tôi biết tôi đã có 5 lần thử. + +173 +00:11:22,680 --> 00:11:24,990 +Bây giờ, nếu bạn đang chơi thử trò chơi này và + +174 +00:11:24,990 --> 00:11:28,260 +bạn nhận ra rằng thực sự 5 là không đủ, thì tất cả những gì + +175 +00:11:28,260 --> 00:11:29,580 +bạn phải làm là cuộn + +176 +00:11:29,970 --> 00:11:33,630 +đến đầu trò chơi, thay đổi một biến toàn cục này ở đây và tất cả các + +177 +00:11:34,080 --> 00:11:37,800 +thay đổi của bạn, bạn biết đấy , sẽ được phản ánh trong đoạn mã dưới đây. + +178 +00:11:39,270 --> 00:11:43,530 +Bây giờ chúng ta hãy quay trở lại trò chơi của chúng ta. Giả sử tôi đoán và mã của chúng + +179 +00:11:43,560 --> 00:11:46,470 +ta kết thúc, phải không? Mặc dù tôi đã có check_answer, + +180 +00:11:46,620 --> 00:11:48,750 +nhưng nó không thực sự được gọi ở bất cứ đâu. + +181 +00:11:48,930 --> 00:11:52,170 +Vì vậy, nó cho phép tiếp tục và gọi hàm đó, check_answer và sau + +182 +00:11:52,710 --> 00:11:56,110 +đó chúng tôi có thể chuyển dự đoán của người dùng mà họ đã thực hiện + +183 +00:11:56,470 --> 00:12:00,370 +ở bước này và chúng tôi cũng có thể chuyển câu trả lời chính xác đến từ đây. + +184 +00:12:01,000 --> 00:12:02,830 +Vì vậy, hãy chạy lại mã của chúng tôi. + +185 +00:12:06,550 --> 00:12:09,940 +Vì vậy, tôi sẽ chọn chế độ dễ dàng và tôi sẽ đoán. + +186 +00:12:10,570 --> 00:12:14,380 +Bây giờ 50 là quá cao vì tôi thực sự có thể thấy câu trả + +187 +00:12:14,380 --> 00:12:19,030 +lời, nó có nghĩa là 32. Vì vậy, nó hoạt động. Nhưng tôi không thể đoán lại. + +188 +00:12:19,030 --> 00:12:22,690 +Nó không cho phép tôi. Nó thực sự đã kết thúc chương trình. + +189 +00:12:23,290 --> 00:12:26,950 +Vì vậy, chúng ta có thể phải giải quyết việc cần làm cụ thể này nếu chúng + +190 +00:12:26,980 --> 00:12:29,320 +ta thực sự muốn có được chức năng phù hợp. + +191 +00:12:29,710 --> 00:12:34,710 +Làm cách nào để chúng ta có thể lặp lại chức năng đoán nếu chúng sai? Vì vậy, như bạn có thể đoán có thể + +192 +00:12:35,980 --> 00:12:40,980 +sẽ yêu cầu một số loại vòng lặp while. Mặc dù họ đã hiểu sai, + +193 +00:12:41,440 --> 00:12:45,910 +nhưng có lẽ chúng ta nên đi và để họ + +194 +00:12:45,940 --> 00:12:49,690 +phỏng đoán lại. Những phần này chắc chắn sẽ cần được lặp lại. + +195 +00:12:50,380 --> 00:12:52,000 +Vì vậy, hãy tạo một vòng lặp while. + +196 +00:12:52,540 --> 00:12:56,860 +Chúng ta sẽ kiểm tra điều gì trong vòng lặp while của mình để đảm bảo rằng nó vẫn tiếp tục? + +197 +00:12:57,430 --> 00:12:57,970 +Chà, + +198 +00:12:57,970 --> 00:13:02,800 +điều mà chúng tôi đang cố gắng hướng tới là khiến người dùng đoán được câu trả + +199 +00:13:02,800 --> 00:13:03,633 +lời thực sự. + +200 +00:13:03,820 --> 00:13:08,820 +Nếu chúng ta đặt điều kiện while là trong khi đoán không bằng câu trả lời, thì điều đó + +201 +00:13:09,550 --> 00:13:13,990 +đảm bảo rằng những dòng mã này sẽ tiếp tục cho đến khi người dùng thực + +202 +00:13:13,990 --> 00:13:18,310 +sự nhận được câu trả lời đúng. Tuy nhiên, bây giờ khi chúng tôi + +203 +00:13:18,340 --> 00:13:21,940 +làm điều này, chúng tôi gặp lỗi, đoán tên không xác định. + +204 +00:13:22,030 --> 00:13:24,550 +Bởi vì phỏng đoán vẫn chưa được công bố. + +205 +00:13:25,030 --> 00:13:30,030 +Vậy tại sao chúng ta không khai báo nó bên ngoài vòng lặp while và chỉ cần tạo + +206 +00:13:31,330 --> 00:13:35,980 +nó dưới dạng một biến? Vì vậy, chúng tôi sẽ đặt giá trị đó bằng 0. Hiện tại, đây là một + +207 +00:13:36,040 --> 00:13:40,660 +biến toàn cục. Đây là một biến toàn cục. Đây là một biến toàn cục. + +208 +00:13:40,900 --> 00:13:45,900 +Vì vậy, có lẽ là một ý kiến hay khi đặt chức năng trò chơi của chúng tôi + +209 +00:13:47,140 --> 00:13:51,700 +vào bên trong chức năng riêng của nó. Vì vậy, chúng tôi có thể tạo một chức năng mới ở + +210 +00:13:52,360 --> 00:13:57,360 +đây, mà tôi sẽ gọi là trò chơi, và bây giờ chúng tôi sẽ cần gọi và kích hoạt trò chơi này trong phạm vi toàn cầu + +211 +00:13:58,480 --> 00:14:00,700 +nếu chúng tôi thực sự muốn điều này được thực hiện. + +212 +00:14:02,410 --> 00:14:04,360 +Bây giờ chúng ta đã hoàn thành tất cả + +213 +00:14:04,420 --> 00:14:07,030 +công việc khó khăn này, hãy chạy mã của chúng ta và thử nó. + +214 +00:14:09,640 --> 00:14:10,960 +Hãy đi cho dễ dàng. + +215 +00:14:11,590 --> 00:14:16,590 +Và tôi sẽ bắt đầu bằng cách đoán 50 như mọi khi. 50 là quá thấp và tôi có thể thấy câu + +216 +00:14:17,290 --> 00:14:20,590 +trả lời thực sự là 90. Vì vậy, tôi sẽ đi cho số tiếp theo. + +217 +00:14:20,590 --> 00:14:23,740 +Hãy thử một con số hơi quá cao. 95, quá cao. + +218 +00:14:24,340 --> 00:14:28,690 +Bây giờ, nếu tôi thực sự hiểu đúng thì sao? Điều gì sẽ xảy ra nếu tôi thực sự đoán được 90? Vâng, nó cho tôi biết + +219 +00:14:28,690 --> 00:14:31,240 +bạn đã hiểu. Câu trả lời là 90. + +220 +00:14:32,140 --> 00:14:36,910 +Vì vậy, điều duy nhất mà chúng tôi không thực sự làm là theo dõi số lượt để chúng tôi nói với + +221 +00:14:36,910 --> 00:14:39,940 +họ rằng bạn có 10 lần thử, bạn có 9 lần thử, bạn + +222 +00:14:39,940 --> 00:14:42,430 +không có lần thử nào. Và nếu họ nhận được số + +223 +00:14:42,430 --> 00:14:45,310 +0, thì họ sẽ thua phải không? Ở đây chúng + +224 +00:14:45,340 --> 00:14:49,630 +ta có câu lệnh in này chỉ chạy một lần vì nó không + +225 +00:14:49,630 --> 00:14:52,640 +nằm trong vòng lặp while. Vì vậy, hãy giải + +226 +00:14:52,790 --> 00:14:56,120 +quyết việc cần làm cuối cùng của chúng ta để theo + +227 +00:14:56,180 --> 00:15:01,100 +dõi số lượt và giảm một lượt nếu sai. Bây giờ, chúng ta biết rằng người dùng đã sai ở đâu? + +228 +00:15:01,580 --> 00:15:06,470 +Cũng bên trong chức năng trả lời kiểm tra. Nếu quá cao hoặc quá thấp, thì chúng ta phải + +229 +00:15:06,560 --> 00:15:10,700 +trừ đi số lượt mà họ có. Nhưng nếu họ hiểu, thì + +230 +00:15:10,790 --> 00:15:13,370 +chúng ta không. Một cách để + +231 +00:15:13,370 --> 00:15:18,140 +giải quyết vấn đề này là lại tạo một biến toàn cục có tên là + +232 +00:15:18,650 --> 00:15:21,200 +turn, đặt nó bắt đầu bằng 0 và + +233 +00:15:22,040 --> 00:15:24,290 +sau đó bên trong hàm này, + +234 +00:15:24,500 --> 00:15:29,500 +chúng ta chỉ cần nói lần lượt - = 1 và cũng chuyển - = + +235 +00:15:31,160 --> 00:15:36,160 +1 khi nó quá thấp hoặc quá cao. Bây giờ vì đây là một biến toàn cục, một + +236 +00:15:36,830 --> 00:15:41,830 +lần nữa chúng ta cần phải nói các lượt toàn cục để sử dụng nó bên trong hàm của chúng ta. + +237 +00:15:43,580 --> 00:15:44,570 +Nhưng như tôi + +238 +00:15:44,630 --> 00:15:49,250 +đã đề cập, đây không phải là một ý tưởng hay vì nó có nghĩa là bạn đang sửa + +239 +00:15:49,250 --> 00:15:51,590 +đổi hàm toàn cục trong phạm vi cục bộ. + +240 +00:15:52,010 --> 00:15:56,960 +Làm thế nào chúng ta có thể đạt được cùng một chức năng mà không cần phải sử dụng một + +241 +00:15:56,960 --> 00:15:58,820 +biến toàn cục? Chà, thay vào + +242 +00:15:58,850 --> 00:16:03,850 +đó, chúng ta có thể chỉ cần vượt qua số lượt mà chúng ta hiện có và sau đó + +243 +00:16:04,820 --> 00:16:06,980 +bên trong hàm của chúng ta, chúng ta + +244 +00:16:08,060 --> 00:16:13,060 +có thể trả về số lượt trừ đi một. Và chúng ta có thể làm điều tương tự ở đây. + +245 +00:16:18,130 --> 00:16:22,120 +Vì vậy, bây giờ khi chúng ta gọi hàm check_answer này, chúng + +246 +00:16:22,450 --> 00:16:25,840 +ta có thể chuyển số lượt hiện tại mà nhớ + +247 +00:16:26,050 --> 00:16:29,530 +rằng nó đã được đặt bởi hàm set_difficulty và chúng + +248 +00:16:30,100 --> 00:16:32,650 +ta có thể chuyển nó vào đây. + +249 +00:16:34,360 --> 00:16:38,740 +Bởi vì không rõ ràng rằng hàm này thực sự có một đầu ra, + +250 +00:16:39,430 --> 00:16:43,270 +nên có lẽ bạn nên thêm một chuỗi doc vào hàm này. + +251 +00:16:44,080 --> 00:16:46,330 +Hãy nhớ ba dấu ngoặc kép, + +252 +00:16:46,570 --> 00:16:49,600 +và sau đó ở giữa chúng ta sẽ nói câu + +253 +00:16:49,660 --> 00:16:54,310 +trả lời kiểm tra so với đoán. Trả về + +254 +00:16:55,930 --> 00:16:59,050 +số lượt còn lại. + +255 +00:17:01,060 --> 00:17:04,060 +Bây giờ khi chúng tôi thực sự gọi check_answer, bạn có thể + +256 +00:17:04,510 --> 00:17:09,510 +thấy rằng đây là những gì thực sự xảy ra và chúng tôi có lợi nhuận mà chúng tôi + +257 +00:17:09,910 --> 00:17:10,900 +có thể biết. + +258 +00:17:12,670 --> 00:17:15,250 +Nếu đây là số lượt còn lại, thì chúng + +259 +00:17:15,520 --> 00:17:20,520 +ta có thể lưu số lượt đó vào các lượt biến này để chúng ta cập nhật biến cục bộ + +260 +00:17:21,250 --> 00:17:23,920 +này mỗi khi chúng ta kiểm tra câu trả lời. + +261 +00:17:25,540 --> 00:17:27,790 +Bây giờ phần này là một chút + +262 +00:17:27,880 --> 00:17:30,940 +khó khăn, vì vậy bạn có thể thực sự muốn đưa + +263 +00:17:30,940 --> 00:17:32,560 +điều này qua Python Tutor + +264 +00:17:32,560 --> 00:17:37,420 +và thực hiện từng bước để xem điều gì đang thực sự diễn ra và cách biến + +265 +00:17:37,420 --> 00:17:40,480 +biến này được cập nhật bởi đầu ra từ hàm này. + +266 +00:17:40,960 --> 00:17:44,620 +Nếu bạn hoàn toàn hài lòng với những gì đang diễn ra, thì hãy cứ tiếp tục. + +267 +00:17:46,390 --> 00:17:48,460 +Vì vậy, bây giờ chúng ta hãy kiểm tra mã của chúng tôi. + +268 +00:17:50,040 --> 00:17:55,040 +50 là quá cao và 20 là quá thấp, và 38 là vừa phải. Bây giờ điều gì sẽ xảy ra + +269 +00:17:56,820 --> 00:18:00,510 +nếu tôi thực sự chạy số lượt của mình xuống 0? + +270 +00:18:00,840 --> 00:18:04,350 +Vì vậy, chúng ta hãy cố gắng vì điều này sẽ chỉ cho chúng ta năm lần thử. + +271 +00:18:04,830 --> 00:18:08,730 +Vì vậy, giả sử tôi đoán 50 và sau đó là 70, + +272 +00:18:09,270 --> 00:18:13,920 +và tôi sẽ đưa vào một số số ngẫu nhiên để tôi kết thúc không + +273 +00:18:13,920 --> 00:18:18,630 +có dự đoán nào còn lại. Bạn có thể thấy nó thực sự không ngăn cản tôi phải không? + +274 +00:18:19,080 --> 00:18:23,160 +Và cũng vì lý do nào đó mà chúng tôi gặp lỗi trong đó số lần + +275 +00:18:23,160 --> 00:18:27,630 +thử còn lại không thực sự được in. Vì vậy, chúng ta hãy giải quyết vấn đề đó. + +276 +00:18:27,960 --> 00:18:31,800 +Chà, nếu chúng ta muốn nó xảy ra mọi lúc và lặp lại, nó sẽ + +277 +00:18:32,100 --> 00:18:36,450 +cần phải đi vào vòng lặp while. Thay vì in số lượt của chúng + +278 +00:18:36,450 --> 00:18:40,980 +ta ở đây, tại sao chúng ta không in nó ở đây bên trong vòng lặp while? + +279 +00:18:42,000 --> 00:18:46,680 +Vì vậy, hãy đảm bảo thụt lề là chính xác và bây giờ chúng ta hãy thử lại. + +280 +00:18:50,330 --> 00:18:53,270 +Vì vậy, tôi còn 5 lần thử. Hãy đoán. + +281 +00:18:53,660 --> 00:18:58,660 +Tôi còn 4 lần thử. Và để ý xem nó đang đếm ngược + +282 +00:18:59,120 --> 00:19:02,900 +như thế nào; 3, 2, 1. Đây hẳn là vị khách cuối cùng của tôi, nhưng hãy để ý + +283 +00:19:02,960 --> 00:19:06,680 +xem nó thực sự tiếp tục diễn ra như thế nào. Nó không dừng trò chơi. + +284 +00:19:07,010 --> 00:19:10,220 +Tôi có thể tiếp tục và bây giờ nó sẽ trở thành tiêu cực. + +285 +00:19:10,880 --> 00:19:14,870 +Làm thế nào chúng ta có thể khắc phục điều này? Chúng tôi cần một số cách + +286 +00:19:14,900 --> 00:19:19,640 +theo dõi khi số lượt này giảm xuống 0. Khi điều đó xảy ra, chúng tôi phải + +287 +00:19:19,730 --> 00:19:22,790 +dừng trò chơi và nói với họ rằng họ đã thua. + +288 +00:19:23,450 --> 00:19:26,120 +Tại sao chúng ta không tạo một câu lệnh + +289 +00:19:26,120 --> 00:19:31,120 +if, kiểm tra xem số tấn có bằng 0 không và in ra một cái gì đó. + +290 +00:19:32,450 --> 00:19:36,830 +Hãy kiểm tra phiên bản cuối cùng thực tế. Hãy xem điều gì xảy ra trong trường hợp này. + +291 +00:19:37,250 --> 00:19:39,050 +Khi tôi hết lượt đi, tôi + +292 +00:19:40,400 --> 00:19:44,420 +đoán, nó thấp hơn hai lần và nó cho tôi biết bạn đã hết lượt đoán. + +293 +00:19:44,450 --> 00:19:47,780 +Bạn đã thua. Chúng tôi cũng có thể in nó ở đây. + +294 +00:19:49,940 --> 00:19:52,310 +Nhưng hãy chú ý xem chúng ta chạy mã như + +295 +00:19:52,460 --> 00:19:56,990 +thế nào, vì vậy chúng ta hãy tiếp tục đoán cùng một số cho đến khi tôi chạy nó xuống 1. + +296 +00:19:57,380 --> 00:20:01,640 +Vì vậy, bây giờ tôi đoán, nó cho tôi biết bạn đã hết đoán. Bạn đã thua. + +297 +00:20:01,910 --> 00:20:05,150 +Nhưng nó vẫn cho phép tôi tiếp tục mặc dù tôi đã thua cuộc. + +298 +00:20:05,810 --> 00:20:09,350 +Làm thế nào chúng tôi có thể làm cho trò chơi của chúng tôi kết thúc? Chà, thật may mắn + +299 +00:20:09,380 --> 00:20:13,130 +là chúng tôi đã có trò chơi của mình bên trong một + +300 +00:20:13,280 --> 00:20:15,470 +hàm đang được gọi ngay từ đầu. + +301 +00:20:16,100 --> 00:20:20,450 +Bây giờ hãy nhớ rằng với các hàm bạn có từ khóa return. + +302 +00:20:20,960 --> 00:20:25,960 +Bạn có thể trả về với một đầu ra hoặc bạn có thể chỉ cần viết trả về + +303 +00:20:27,440 --> 00:20:32,360 +cho nó để thoát và kết thúc hàm. Vì vậy, bây giờ với từ khóa trả lại đó, + +304 +00:20:32,780 --> 00:20:35,600 +một khi tôi chạy hết lượt, hãy xem điều gì sẽ xảy ra. + +305 +00:20:38,690 --> 00:20:41,960 +Nó dừng lại và nó không cho phép tôi đoán thêm nữa. + +306 +00:20:43,820 --> 00:20:45,320 +Hoàn hảo. Chúng tôi + +307 +00:20:45,320 --> 00:20:50,320 +đã quản lý để làm điều đó đúng. Điều mà chúng tôi vẫn còn thiếu là lời nhắc này để + +308 +00:20:51,340 --> 00:20:53,440 +người dùng đoán lại. Bây giờ đây là loại tùy chọn. + +309 +00:20:53,440 --> 00:20:56,350 +Nó phụ thuộc vào cảm nhận của riêng bạn đối với trải nghiệm người dùng. + +310 +00:20:56,770 --> 00:21:00,430 +Tôi nghĩ rằng thật hợp lý khi nói, 'Nó quá thấp. Đoán lại. 'bởi vì nó giống như + +311 +00:21:00,430 --> 00:21:03,130 +bảo họ làm điều gì đó. Mặc dù có một phỏng + +312 +00:21:03,160 --> 00:21:07,330 +đoán, nhưng cũng sẽ thúc đẩy họ phỏng đoán. Vì vậy, bạn có thể có, bạn không cần phải làm. + +313 +00:21:07,570 --> 00:21:08,950 +Nếu bạn muốn có + +314 +00:21:09,370 --> 00:21:14,050 +điều đó, thì bạn có thể thực sự phải kiểm tra xem họ vẫn còn lượt. + +315 +00:21:14,560 --> 00:21:19,560 +Và nếu họ làm vậy, thì chắc chắn rằng dự đoán không bằng với + +316 +00:21:21,070 --> 00:21:26,070 +câu trả lời, vì vậy họ đã không đúng trong lượt này và sau + +317 +00:21:26,180 --> 00:21:30,520 +đó in 'Đoán lại' đó. Vì vậy, bây giờ mỗi khi họ sai, + +318 +00:21:30,580 --> 00:21:32,770 +nhưng họ vẫn còn suy đoán, nó sẽ + +319 +00:21:33,100 --> 00:21:37,960 +nói 'Quá thấp. Đoán lại. 'hoặc' Quá cao. Đoán lại. 'Nhưng nếu + +320 +00:21:38,800 --> 00:21:40,570 +họ thực sự hiểu đúng, thì + +321 +00:21:40,600 --> 00:21:44,440 +câu trả lời phải là 83, sau đó nó nói' Bạn hiểu rồi. + +322 +00:21:44,440 --> 00:21:47,800 +Câu trả lời là 83 'mà không yêu cầu họ đoán lại. + +323 +00:21:48,760 --> 00:21:51,880 +Bây giờ chúng tôi đã hoàn thành khá nhiều mã này. + +324 +00:21:52,270 --> 00:21:54,760 +Tất nhiên bạn có thể đã thêm nghệ thuật bổ sung. + +325 +00:21:54,760 --> 00:21:59,760 +Vì vậy, bạn có thể đã tạo ra một nghệ thuật. py và sau đó sử dụng + +326 +00:21:59,950 --> 00:22:03,580 +văn bản trong trình tạo ASCII để tạo tác phẩm ASCII. + +327 +00:22:03,630 --> 00:22:04,463 +2: Vâng. + +328 +00:22:06,480 --> 00:22:08,840 +Và sau đó trở lại đây, chúng tôi có thể đã nhập nó. + +329 +00:22:12,240 --> 00:22:14,790 +Và chúng tôi có thể đặt điều đó ngay từ đầu trò chơi. + +330 +00:22:15,510 --> 00:22:19,770 +Nhưng phần còn lại của tùy chỉnh về cơ bản là của riêng bạn, phải không? + +331 +00:22:19,770 --> 00:22:24,770 +Bạn có thể tự do làm bất cứ điều gì bạn muốn và thay đổi từ ngữ, thay + +332 +00:22:25,020 --> 00:22:26,010 +đổi văn bản. + +333 +00:22:26,280 --> 00:22:30,600 +Phần thực sự quan trọng là bạn có thể chơi trò chơi này, hiểu cách + +334 +00:22:30,990 --> 00:22:35,990 +nó hoạt động và sau đó chia vấn đề thành các phần nhỏ hơn mà bạn có thể + +335 +00:22:36,300 --> 00:22:38,100 +giải quyết từng người một. + +336 +00:22:38,760 --> 00:22:43,740 +Và nếu bạn gặp khó khăn khi thực sự tự mình hoàn thành chương trình này, thì bạn nên + +337 +00:22:44,220 --> 00:22:47,370 +để ý khi chúng ta xem qua nó khi tôi + +338 +00:22:47,610 --> 00:22:50,820 +chia nhỏ vấn đề lớn đó thành những phần nhỏ hơn thì + +339 +00:22:51,120 --> 00:22:55,140 +việc giải quyết từng việc nhỏ trở nên dễ dàng hơn bao nhiêu, phải không? + +340 +00:22:55,440 --> 00:23:00,240 +Để người dùng đoán một số hoặc chọn một số ngẫu nhiên từ 1 đến 100, bạn chắc chắn + +341 +00:23:00,480 --> 00:23:02,580 +có thể thực hiện một phần việc này. + +342 +00:23:03,120 --> 00:23:06,450 +Và khi bạn xây dựng trò chơi, đến cuối cùng, bạn nhận ra, ah, cái này + +343 +00:23:06,480 --> 00:23:08,430 +bị thiếu hoặc cái kia có thể hay. + +344 +00:23:08,760 --> 00:23:11,490 +Sau đó, bạn có thể bắt đầu thêm ngày càng nhiều bit vào nó. + +345 +00:23:12,330 --> 00:23:15,510 +Vì vậy, nếu bạn muốn xem lại mã cuối cùng mà bạn nhìn thấy ở đây, tất + +346 +00:23:15,810 --> 00:23:20,490 +nhiên, bạn có thể đi đến Bản tóm tắt đoán-số-cuối cùng. nó tại liên kết cụ + +347 +00:23:20,520 --> 00:23:23,010 +thể này trong tài nguyên khóa học. + +348 +00:23:23,460 --> 00:23:27,150 +Nhưng hy vọng, bạn đã thực sự tạo ra được phiên bản của riêng mình và nó thậm + +349 +00:23:27,180 --> 00:23:31,320 +chí còn tốt hơn những gì tôi đã làm. Và nếu bạn đặc biệt tự hào về nó, + +350 +00:23:31,470 --> 00:23:35,340 +hãy nhớ chia sẻ nó để những người còn lại trong chúng ta có thể xem và + +351 +00:23:35,340 --> 00:23:36,173 +chơi với nó. + +352 +00:23:36,570 --> 00:23:40,350 +Vì vậy, tôi hy vọng bạn thích dự án hôm nay và tôi sẽ gặp lại bạn vào ngày mai. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution-Guess-the-Number-Completed-Code.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution-Guess-the-Number-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..6e002eace0bc9bd2b6bf82a04ae25fc039854964 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Solution-Guess-the-Number-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/guess-the-number-final#main.py \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Using-Python-Tutor-to-Step-Through-your-Code.url b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Using-Python-Tutor-to-Step-Through-your-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..dabd11d8106e1351e1e6960775ac837ee0f70182 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/007 Using-Python-Tutor-to-Step-Through-your-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://www.pythontutor.com/visualize.html#mode=edit \ No newline at end of file diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/008 Don't be too hard on yourself.mp4 b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/008 Don't be too hard on yourself.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f0efc4a35b348fc2459a8896c9057f8861270a95 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/008 Don't be too hard on yourself.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5664db1af6e354e9342eb4eabc745551903e41ddba288d0d8c829a997f86d650 +size 26955036 diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/008 Don't be too hard on yourself_vi.srt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/008 Don't be too hard on yourself_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..62ff1130e4ae576c1528d55cf27223c2d4ac8917 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/008 Don't be too hard on yourself_vi.srt @@ -0,0 +1,44 @@ +1 +00:00:00,970 --> 00:00:04,090 +Hoàn thành tốt ngày 12. + +2 +00:00:04,450 --> 00:00:11,620 +Bây giờ, một trong những điều mà tôi thực sự, thực sự muốn nói với mọi người là đừng quá khắt khe với bản thân, bởi vì tôi + +3 +00:00:12,010 --> 00:00:17,530 +biết rằng tôi cũng làm điều đó, bạn biết đấy. Đôi khi giọng nói bên trong của bạn nói, “Ồ, tôi không thể tin rằng bạn đã bỏ lỡ + +4 +00:00:17,530 --> 00:00:18,310 +một ngày. "Hoặc như", + +5 +00:00:18,310 --> 00:00:21,910 +tại sao bạn không thể nhận được câu trả lời trong lần đầu tiên? “Nó không có nghĩa là + +6 +00:00:22,330 --> 00:00:23,770 +bạn đã thất bại. + +7 +00:00:23,920 --> 00:00:26,520 +Chỉ cần bạn tiếp tục cố gắng, bạn đang thành công. + +8 +00:00:27,130 --> 00:00:30,330 +Vì vậy, đừng lo lắng nếu bạn đã bỏ lỡ một ngày ở đây hoặc ở đó, đừng + +9 +00:00:30,340 --> 00:00:38,110 +lo lắng nếu bạn phải làm một ngày trong hai ngày hoặc nếu bạn không tìm được giải pháp ngay lập tức. Miễn là bạn tiếp tục thực hiện nó, + +10 +00:00:38,110 --> 00:00:41,740 +cuối cùng bạn sẽ thành công. + +11 +00:00:41,980 --> 00:00:44,170 +Và hãy nhớ rằng, tôi tin tưởng vào bạn. + diff --git a/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/external-links.txt b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..513c34850ac8035b95ac9ff1da0baf9ab5702f90 --- /dev/null +++ b/part1/12 - Day 12 - Beginner - Scope & Number Guessing Game/external-links.txt @@ -0,0 +1,27 @@ + +001 Fork-the-Day-12-Starting-Repl +https://repl.it/@appbrewery/day-12-start#main.py + +002 Fork-the-Day-12-Starting-Repl +https://repl.it/@appbrewery/day-12-start + +004 Day-12-Ending-Code +https://repl.it/@appbrewery/day-12-end + +006 Get-your-own-ASCII-Text-from-Patorjk +http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20 + +006 Starting-Repl-for-the-Number-Guessing-Game +https://repl.it/@appbrewery/guess-the-number-start#main.py + +006 Day-12-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/guess-the-number-final?v=1 + +007 Using-Python-Tutor-to-Step-Through-your-Code +http://www.pythontutor.com/visualize.html#mode=edit + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +007 Solution-Guess-the-Number-Completed-Code +https://repl.it/@appbrewery/guess-the-number-final#main.py diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Describe the Problem.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Describe the Problem.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fa90b809bddf2edf2f046d45d64d78f2f93a2d7c --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Describe the Problem.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa86983f87ebf578a4e3481125e4849619505e25098d5059d671e3d8a9efdb07 +size 24452042 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Describe the Problem_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Describe the Problem_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e65120b1524f1be8a579b39db67e2851a7ce0e34 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Describe the Problem_vi.srt @@ -0,0 +1,292 @@ +1 +00:00:00,030 --> 00:00:04,650 +Này các cậu! Chào mừng bạn trở lại với 100 ngày viết mã. Hôm nay chúng + +2 +00:00:04,680 --> 00:00:06,720 +ta sẽ xem xét gỡ lỗi, + +3 +00:00:07,020 --> 00:00:10,380 +quá trình loại bỏ lỗi khỏi mã của bạn. + +4 +00:00:10,920 --> 00:00:12,600 +Nếu bạn làm được đến thời + +5 +00:00:12,690 --> 00:00:15,480 +điểm này, có lẽ bạn đã viết khá nhiều mã rồi, + +6 +00:00:16,200 --> 00:00:20,280 +và tôi dám cá rằng bạn có thể đã mắc một số lỗi, một số lỗi chính + +7 +00:00:20,310 --> 00:00:24,060 +tả, một số lỗi và một số lỗi. Vì vậy, trong bài học này, tôi + +8 +00:00:24,090 --> 00:00:29,090 +muốn nói về một số kỹ thuật và mẹo về cách tìm lỗi và cách loại bỏ chúng + +9 +00:00:30,000 --> 00:00:32,790 +khỏi mã của bạn. Bây giờ, lỗi đầu + +10 +00:00:32,790 --> 00:00:37,710 +tiên được ghi nhận đã thực sự được tìm thấy bởi người phụ nữ này, Grace Hopper. + +11 +00:00:38,220 --> 00:00:43,220 +Cô ấy có lẽ là một trong những lập trình viên đầu tiên và là một trong những người tiên phong trong công việc mà + +12 +00:00:43,380 --> 00:00:46,830 +chúng tôi đang đảm nhận ngay bây giờ. Bây giờ trong ghi chú của + +13 +00:00:47,250 --> 00:00:51,060 +cô ấy, bạn sẽ tìm thấy một con bướm đêm đã được dán + +14 +00:00:51,720 --> 00:00:56,370 +vào sổ tay, và nó được tìm thấy trong một rơ le ngăn mã của cô + +15 +00:00:56,370 --> 00:00:59,400 +ấy chạy bình thường. Và đây là trường + +16 +00:00:59,400 --> 00:01:03,540 +hợp thực tế đầu tiên về lỗi được tìm thấy trong máy tính. + +17 +00:01:04,230 --> 00:01:07,140 +Mặc dù ngày nay chúng ta không còn xử lý + +18 +00:01:07,530 --> 00:01:12,530 +sâu bướm nữa, nhưng cuối cùng chúng ta vẫn sẽ tìm ra những thứ trong mã của mình + +19 +00:01:13,110 --> 00:01:15,810 +để ngăn mã làm những điều chúng ta muốn. + +20 +00:01:16,380 --> 00:01:20,700 +Điều quan trọng cần nhớ là đừng cảm thấy thất vọng khi bạn đã tạo ra + +21 +00:01:21,000 --> 00:01:25,680 +một lỗi vì mọi người đều có lỗi. Và khi tôi nói có lỗi, ý + +22 +00:01:25,710 --> 00:01:30,630 +tôi là chúng ta tạo ra chúng, phải không? Vì vậy, khi bạn đã vượt qua điều + +23 +00:01:30,690 --> 00:01:35,370 +này, tiếp theo, tôi muốn nói về một số mẹo và kỹ thuật mà bạn nên làm theo + +24 +00:01:35,370 --> 00:01:39,240 +về cách nhanh chóng có thể xác định và loại bỏ những lỗi này. + +25 +00:01:39,750 --> 00:01:42,720 +Vì vậy, bước đầu tiên là mô tả vấn đề. + +26 +00:01:43,170 --> 00:01:47,760 +Nếu vấn đề lộn xộn và nó không được hiểu rõ trong đầu bạn, thì hầu + +27 +00:01:48,090 --> 00:01:50,160 +như không thể gỡ lỗi nó. + +28 +00:01:50,460 --> 00:01:55,460 +Vì vậy, gỡ rối vấn đề và cố gắng hiểu những gì đang xảy ra. Để bắt đầu, hãy tiếp + +29 +00:01:56,040 --> 00:02:00,360 +tục và fork repl bắt đầu cho mã ngày hôm nay. + +30 +00:02:00,990 --> 00:02:04,860 +Bây giờ, điều đầu tiên cần chú ý ở đây là tôi đã viết một + +31 +00:02:04,860 --> 00:02:06,000 +loạt mã trong repl + +32 +00:02:06,300 --> 00:02:10,259 +bắt đầu và chúng tôi sẽ bỏ ghi chú từng khối một và cuối cùng giải + +33 +00:02:10,259 --> 00:02:12,480 +quyết tất cả các vấn đề gỡ lỗi. + +34 +00:02:13,650 --> 00:02:18,240 +Vì vậy, điều đầu tiên bạn sẽ làm là bỏ ghi chú khối mã đầu tiên. + +35 +00:02:19,110 --> 00:02:20,700 +Bây giờ trong khối mã này, + +36 +00:02:20,730 --> 00:02:24,660 +chúng ta sẽ thực hành mô tả vấn đề để giúp chúng ta giải quyết + +37 +00:02:24,660 --> 00:02:27,480 +vấn đề gỡ lỗi này. Bây giờ nếu bạn nhìn + +38 +00:02:27,690 --> 00:02:30,510 +vào hàm này, bạn có thể thấy rằng tại một số điểm + +39 +00:02:30,540 --> 00:02:33,300 +trong hàm, chúng ta phải in dòng này ra bảng điều khiển. + +40 +00:02:34,050 --> 00:02:38,190 +Nhưng nếu chúng ta tiếp tục và nhấn run, bạn có thể thấy rằng không có gì được in. + +41 +00:02:38,910 --> 00:02:40,530 +Vậy điều gì đang xảy ra ở đây? + +42 +00:02:41,220 --> 00:02:46,220 +Tôi muốn bạn xem qua chức năng này và mô tả vấn đề thực tế. + +43 +00:02:46,740 --> 00:02:51,150 +Vòng lặp for đang làm gì? Khi nào thì hàm dùng để in "You got it"? + +44 +00:02:51,600 --> 00:02:56,340 +Bạn đang đưa ra giả định nào về giá trị của i? Vì vậy, hãy tạm dừng video, + +45 +00:02:56,730 --> 00:02:59,830 +đọc chức năng và bắt đầu mô tả vấn đề. + +46 +00:03:02,200 --> 00:03:02,680 +Được rồi. + +47 +00:03:02,680 --> 00:03:07,680 +Vì vậy, những gì chúng ta có ở đây là chúng ta có một hàm lặp qua tất cả + +48 +00:03:08,080 --> 00:03:10,240 +các số từ 1 đến 20, và + +49 +00:03:10,780 --> 00:03:15,220 +sau đó khi con số đó đạt đến 20, nó sẽ in ra "Bạn hiểu rồi". + +50 +00:03:15,820 --> 00:03:19,660 +Nhưng vấn đề là khi tôi đến 20, nó không in + +51 +00:03:19,780 --> 00:03:22,390 +dòng này vào bảng điều khiển. + +52 +00:03:23,290 --> 00:03:27,610 +Vì vậy, bây giờ chúng tôi đã mô tả vấn đề và chúng tôi hiểu những gì đang xảy ra, hãy + +53 +00:03:28,000 --> 00:03:32,620 +xem liệu chúng tôi có thể giải quyết nó không. Nếu chúng ta nghĩ về vấn đề này, + +54 +00:03:32,680 --> 00:03:35,770 +khi tôi đến 20 tuổi, nó sẽ không in ra dòng này. + +55 +00:03:36,130 --> 00:03:37,600 +Có một giả định trong đó, phải không? + +56 +00:03:37,960 --> 00:03:41,860 +Giả định rằng tôi chắc chắn sẽ đạt 20. + +57 +00:03:42,640 --> 00:03:46,240 +Nhưng nếu bạn nghĩ lại cách hoạt động của hàm + +58 +00:03:46,840 --> 00:03:51,190 +phạm vi, điểm dừng hoặc giới hạn trên thực sự bị bỏ qua. + +59 +00:03:51,580 --> 00:03:53,740 +Vì vậy, khi bạn viết phạm vi + +60 +00:03:54,100 --> 00:03:57,610 +(4), nó thực sự tạo ra một số từ 0 đến 3. + +61 +00:03:58,570 --> 00:04:01,690 +Và trong trường hợp của chúng tôi, khi chúng + +62 +00:04:02,140 --> 00:04:06,280 +tôi viết (1, 20), nó thực sự đi từ 1 đến 19 + +63 +00:04:06,400 --> 00:04:08,410 +nhưng không bao gồm 20. + +64 +00:04:09,130 --> 00:04:14,050 +Vấn đề ở đây là tôi thực sự không bao giờ đạt đến 20 tuổi. + +65 +00:04:14,380 --> 00:04:19,089 +Vì vậy giả thiết này là hoàn toàn sai. Tạm dừng video và xem liệu + +66 +00:04:19,180 --> 00:04:23,680 +bạn có thể sửa mã để dòng này thực sự được in hay không. + +67 +00:04:25,270 --> 00:04:29,830 +Được rồi. Vì vậy, tất cả những gì chúng ta cần làm là thay đổi giá + +68 +00:04:30,220 --> 00:04:34,090 +trị này thành 21 thay vì 20 và bây giờ khi chúng ta nhấn run, bạn có thể thấy nó thực sự hoạt + +69 +00:04:34,120 --> 00:04:38,450 +động và chúng tôi đã tìm cách gỡ lỗi vấn đề này. Luôn luôn khi bạn gặp một vấn đề trong + +70 +00:04:38,480 --> 00:04:39,313 +mã của mình, hãy + +71 +00:04:39,340 --> 00:04:43,600 +cố gắng mô tả nó để bạn thực sự hiểu vấn đề là gì, sau đó kiểm + +72 +00:04:44,110 --> 00:04:49,110 +tra các giả định của bạn và xem giả định nào trong số những giả định đó thực sự là + +73 +00:04:49,750 --> 00:04:50,290 +sai. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Fork-the-Day-13-Starting-Repl.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Fork-the-Day-13-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..de7d780c5d22a30d7dcf8a9e23b8f27909fd3c7a --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/001 Fork-the-Day-13-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-13-start \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/002 Reproduce the Bug.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/002 Reproduce the Bug.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e424a99088fd3ce8eef5bd69df7b1314bec64650 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/002 Reproduce the Bug.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:608a602325ad1de70fdbe0ed05cfeb36a73bbba5b18e3c3495dc0c40e71ce9bb +size 18587011 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/002 Reproduce the Bug_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/002 Reproduce the Bug_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0495ae557b0544fffa3f7621b779b2ce6a9a5eb0 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/002 Reproduce the Bug_vi.srt @@ -0,0 +1,204 @@ +1 +00:00:00,750 --> 00:00:05,750 +Bây giờ bước tiếp theo là suy nghĩ về việc tái tạo lại lỗi mà bạn đã gặp phải, bởi + +2 +00:00:06,840 --> 00:00:10,950 +vì khi bạn gặp nó một lần nhưng bạn không gặp phải nó lần sau, nó sẽ + +3 +00:00:11,310 --> 00:00:15,930 +trở thành một lỗi thực sự khó sửa. Hãy tiếp tục và bỏ + +4 +00:00:15,930 --> 00:00:18,570 +ghi chú khối mã tiếp theo. + +5 +00:00:19,590 --> 00:00:23,130 +Và chúng ta sẽ bình luận phần trước vì chúng ta đã + +6 +00:00:23,130 --> 00:00:27,240 +hoàn thành phần này. Vì vậy, đây là phần duy nhất nên hoạt động trong chính của bạn. py + +7 +00:00:28,260 --> 00:00:31,020 +Trong phần này, chúng tôi sẽ thử và tái tạo lỗi. + +8 +00:00:31,170 --> 00:00:32,340 +Vì vậy, khi chúng + +9 +00:00:32,369 --> 00:00:36,840 +tôi chạy mã, đôi khi nó sẽ hoạt động và nó sẽ in ra một trong những hình + +10 +00:00:36,840 --> 00:00:40,260 +ảnh xúc xắc từ danh sách này, nhưng đôi khi bạn sẽ gặp lỗi. + +11 +00:00:41,310 --> 00:00:45,840 +Những loại lỗi này thực sự rất khó vì bạn có thể chỉ kiểm tra mã của mình một hoặc + +12 +00:00:45,840 --> 00:00:49,080 +hai lần và mọi thứ đều ổn. Nó hoạt động. + +13 +00:00:49,380 --> 00:00:51,750 +Nhưng sau đó đôi khi bạn gặp lỗi. + +14 +00:00:52,350 --> 00:00:55,470 +Và điều quan trọng là tái tạo lỗi đó. + +15 +00:00:55,500 --> 00:00:58,170 +Khi nào thì lỗi đó thực sự xảy ra? + +16 +00:00:59,040 --> 00:01:02,850 +Và dựa trên kiến thức đó, chúng tôi có thể sửa mã của mình. + +17 +00:01:03,570 --> 00:01:08,570 +Cố gắng tự tạo lại lỗi và cố gắng để ý khi nào nó xảy ra và xem liệu + +18 +00:01:10,320 --> 00:01:14,400 +bạn có thể thay đổi mã để nó luôn tạo ra lỗi này hay không. + +19 +00:01:14,690 --> 00:01:19,690 +1: [không nghe được], Chúng tôi có một danh sách các + +20 +00:01:20,390 --> 00:01:25,160 +hình ảnh xúc xắc, chỉ là biểu tượng cảm xúc. + +21 +00:01:25,610 --> 00:01:30,610 +Và chúng tôi cũng có số ngẫu nhiên này, số xúc xắc từ 1 đến 6. + +22 +00:01:31,730 --> 00:01:34,310 +Bây giờ, khi chúng tôi cố gắng loại bỏ danh + +23 +00:01:34,850 --> 00:01:37,400 +sách của mình, đôi khi chúng tôi gặp lỗi. + +24 +00:01:38,180 --> 00:01:42,530 +Bây giờ chúng ta phải để ý khi lỗi xảy ra và để tái tạo lỗi, chúng ta + +25 +00:01:42,560 --> 00:01:46,490 +phải tìm ra con số nào trong số này thực sự gây ra sự cố. + +26 +00:01:46,910 --> 00:01:51,470 +Vì vậy, chúng tôi biết rằng đây là một số ngẫu nhiên từ 1 đến 6 và nếu chúng + +27 +00:01:51,920 --> 00:01:55,220 +tôi kiểm tra tài liệu, nó cho chúng tôi biết rằng randint hoạt + +28 +00:01:55,220 --> 00:01:57,680 +động hơi khác một chút so với phạm vi. + +29 +00:01:58,070 --> 00:02:02,570 +Nó sẽ trả về một số nguyên ngẫu nhiên trong phạm vi a và b, bao + +30 +00:02:02,930 --> 00:02:06,050 +gồm cả hai điểm cuối. Vì vậy, trong trường hợp của + +31 +00:02:06,080 --> 00:02:11,080 +chúng tôi, cả 1 và 6 đều có thể được tạo và nó có thể là bất kỳ số nào. + +32 +00:02:11,210 --> 00:02:15,950 +Vì vậy, nếu đó là bằng 1, tốt, nó có tạo ra lỗi không? + +33 +00:02:16,010 --> 00:02:18,890 +Không, nó chỉ chọn ra mục cụ thể này. + +34 +00:02:19,370 --> 00:02:22,250 +Nhưng nếu nó là 2 hoặc 3 hoặc 4 thì sao? + +35 +00:02:22,520 --> 00:02:25,790 +Hoặc nếu chúng tôi thử nghiệm 6 thì sao? Vâng, bây giờ mỗi + +36 +00:02:25,790 --> 00:02:30,230 +khi chúng tôi nhấn run, bạn có thể thấy chúng tôi gặp lỗi. + +37 +00:02:30,980 --> 00:02:34,490 +Và bây giờ chúng tôi đã có lỗi hiển thị nhất quán, việc + +38 +00:02:34,610 --> 00:02:39,610 +gỡ lỗi sẽ dễ dàng hơn rất nhiều vì chúng tôi biết rằng danh sách lỗi chỉ mục nằm + +39 +00:02:40,160 --> 00:02:43,400 +ngoài phạm vi xảy ra khi số xúc xắc này là 6. + +40 +00:02:43,850 --> 00:02:48,080 +Vì vậy, khi chúng ta quay lại mã trước đó, chúng ta không + +41 +00:02:48,110 --> 00:02:53,110 +thể sử dụng 6 trong danh sách này vì danh sách bắt đầu đếm từ 0. + +42 +00:02:54,440 --> 00:02:59,150 +Vì vậy, để có được con xúc xắc này 1, chúng ta cần dice_num là 0. + +43 +00:02:59,590 --> 00:03:02,410 +Và đây là 1, 2, 3, 4, 5 và 6 ở + +44 +00:03:02,770 --> 00:03:07,420 +đâu đó ngoài đây và nó không tồn tại. Bây giờ, hãy tiếp tục và sửa mã + +45 +00:03:07,450 --> 00:03:12,190 +này để tất cả các hình ảnh xúc xắc được thể hiện và chúng ta không bao + +46 +00:03:12,190 --> 00:03:16,240 +giờ gặp lại lỗi này nữa. Được rồi. + +47 +00:03:16,240 --> 00:03:19,420 +Vì vậy, đó là đơn giản như chuyển xuống những con số này. + +48 +00:03:19,870 --> 00:03:22,870 +Vì vậy, thay vì tạo một số ngẫu nhiên từ 1 đến 6, chúng tôi + +49 +00:03:23,110 --> 00:03:28,000 +thực sự muốn một số ngẫu nhiên từ 0 đến 5. Và bây giờ, bất kể chúng tôi chạy mã + +50 +00:03:28,030 --> 00:03:30,190 +bao nhiêu lần, chúng tôi sẽ không bao + +51 +00:03:30,460 --> 00:03:32,530 +giờ để lỗi đó xuất hiện nữa. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/003 Play Computer and Evaluate Each Line.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/003 Play Computer and Evaluate Each Line.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..80186afa1a4cffdd7afd6907ab85eff1dd4b6df2 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/003 Play Computer and Evaluate Each Line.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85adcf796f6f4273c08c22c9052423cccdd73dca1bed33f607aaf79dfc52abea +size 16497036 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/003 Play Computer and Evaluate Each Line_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/003 Play Computer and Evaluate Each Line_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5718419692aea85ea5beeb00c4192d6ad2346eda --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/003 Play Computer and Evaluate Each Line_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,870 --> 00:00:04,200 +Tôi thường hỏi bạn trong các câu đố, đặc + +2 +00:00:04,200 --> 00:00:06,090 +biệt là chơi máy tính. + +3 +00:00:06,720 --> 00:00:11,310 +Và lý do là vì kỹ năng giả vờ như một chiếc máy tính đọc qua mã + +4 +00:00:11,310 --> 00:00:15,630 +của bạn và tưởng tượng những gì bạn sẽ làm mỗi lần thực sự rất + +5 +00:00:15,630 --> 00:00:18,510 +hữu ích, đặc biệt là khi bạn đang gỡ lỗi. + +6 +00:00:19,290 --> 00:00:23,370 +Vì vậy, chúng ta hãy bình luận khối trước và thử khối tiếp theo. + +7 +00:00:24,270 --> 00:00:25,620 +Hãy xem mã này. + +8 +00:00:26,180 --> 00:00:28,040 +Nó nhận một đầu vào + +9 +00:00:28,250 --> 00:00:32,689 +dưới dạng một số nguyên và nó hỏi người dùng về năm sinh của họ. + +10 +00:00:33,380 --> 00:00:38,380 +Và sau đó, nó sử dụng câu lệnh if để kiểm tra xem họ có sinh từ 1980 đến + +11 +00:00:39,110 --> 00:00:43,220 +1994 hay không, trong trường hợp đó họ được xếp vào nhóm thiên niên kỷ. + +12 +00:00:44,270 --> 00:00:49,220 +Nhưng nếu có những người sinh sau năm 1994, thì họ được phân loại là Gen Z. + +13 +00:00:50,000 --> 00:00:52,130 +Vì vậy, tùy thuộc vào quốc gia bạn + +14 +00:00:52,310 --> 00:00:55,670 +đến, có các phân loại khác nhau cho thế hệ cụ thể của bạn. + +15 +00:00:56,210 --> 00:00:59,450 +Đây chỉ là những từ điển hình mà bạn nghe thấy trên internet. + +16 +00:00:59,780 --> 00:01:02,540 +Bạn thuộc thế hệ thiên niên kỷ, bạn là thế hệ Z, bạn là một người phát triển vượt + +17 +00:01:02,840 --> 00:01:07,100 +bậc và điều này xuất phát từ rất nhiều lịch sử của Hoa Kỳ. Nhưng dù sao, tôi muốn bạn + +18 +00:01:07,160 --> 00:01:12,160 +chạy mã và tôi muốn bạn xem điều gì sẽ xảy ra khi tôi + +19 +00:01:12,590 --> 00:01:15,950 +đặt vào năm 1994. Hoàn toàn không có gì, vì + +20 +00:01:16,220 --> 00:01:21,110 +vậy chúng tôi có lỗi của chúng tôi ngay tại đó. Chạy qua từng dòng mã và + +21 +00:01:21,110 --> 00:01:25,610 +đánh giá từng câu lệnh. Ví dụ, nếu năm bằng + +22 +00:01:25,910 --> 00:01:29,630 +1990, dòng 77 sẽ đánh giá là true hay false? + +23 +00:01:30,170 --> 00:01:32,630 +Điều gì sẽ xảy ra nếu năm bằng 1994? + +24 +00:01:33,020 --> 00:01:38,000 +Nhìn vào từng dòng mã và tuân theo logic và kiểm tra xem nó sẽ đánh giá + +25 +00:01:38,000 --> 00:01:38,833 +những gì. + +26 +00:01:38,870 --> 00:01:43,100 +Vì vậy, tôi muốn bạn chơi máy tính và tìm ra vấn đề là gì, sau + +27 +00:01:43,520 --> 00:01:47,210 +đó tiếp tục và sửa lỗi. Tạm dừng video ngay bây giờ. + +28 +00:01:50,480 --> 00:01:51,313 +Được rồi. Vì + +29 +00:01:51,410 --> 00:01:55,070 +vậy, hãy giả sử rằng chúng ta lấy năm 1994 làm đầu vào. + +30 +00:01:55,490 --> 00:01:57,320 +Vì vậy, bây giờ tôi + +31 +00:01:57,380 --> 00:02:01,040 +là máy tính và tôi biết rằng năm nay là bằng 1994. + +32 +00:02:01,730 --> 00:02:04,520 +Bây giờ với năm nay là bằng + +33 +00:02:04,730 --> 00:02:09,139 +1994, tôi đi vào điều này nếu tuyên bố này là + +34 +00:02:09,440 --> 00:02:13,340 +1994, lớn hơn 1980? Vâng, đúng vậy. + +35 +00:02:13,430 --> 00:02:15,980 +Vì vậy, điều này thực sự trở thành sự thật. + +36 +00:02:17,000 --> 00:02:22,000 +Bây giờ tôi phải kiểm tra điều kiện thứ hai và nó cũng phải đúng với điều kiện + +37 +00:02:22,040 --> 00:02:25,880 +này nếu khối được kích hoạt. Vậy 1994 có ít hơn + +38 +00:02:26,270 --> 00:02:28,790 +1994 không? Không, không phải đâu. + +39 +00:02:28,820 --> 00:02:32,210 +Nó thực sự nhỏ hơn năm 1994, + +40 +00:02:32,570 --> 00:02:36,620 +hoặc bằng năm 1994. Vì vậy, trong trường hợp + +41 +00:02:36,680 --> 00:02:39,050 +này, điều kiện này trở thành sai. + +42 +00:02:39,530 --> 00:02:44,530 +Và chúng ta biết rằng nếu chúng ta cố gắng kết hợp một đúng và một sai thì nó thực sự + +43 +00:02:44,930 --> 00:02:46,070 +chỉ trở thành sai. + +44 +00:02:46,490 --> 00:02:47,930 +Vì vậy, điều này được bỏ qua. + +45 +00:02:48,830 --> 00:02:51,980 +Bây giờ, tiếp theo, chúng ta xem xét tuyên bố tiếp theo, phải không? + +46 +00:02:52,430 --> 00:02:56,840 +Nếu 1994 lớn hơn 1994, thì điều đó cũng + +47 +00:02:57,380 --> 00:03:00,610 +không đúng. Nó lớn hơn hoặc bằng, + +48 +00:03:00,940 --> 00:03:02,800 +hoặc nó chỉ có thể bằng. + +49 +00:03:02,950 --> 00:03:06,280 +Vì vậy, điều kiện này cũng là sai. + +50 +00:03:06,700 --> 00:03:10,810 +Vì vậy, điều đó có nghĩa là nó cũng sẽ bỏ qua dòng tiếp theo này và không còn dòng + +51 +00:03:10,810 --> 00:03:14,680 +mã nào nữa, đó là lý do tại sao máy tính không in bất cứ thứ gì. + +52 +00:03:15,190 --> 00:03:19,420 +Vì vậy, hãy khôi phục mã của chúng tôi về trước khi chúng tôi bắt + +53 +00:03:19,960 --> 00:03:24,960 +đầu chơi máy tính và chúng tôi có thể xác định rằng sự cố này xảy ra vì không + +54 +00:03:26,500 --> 00:03:29,470 +có thùng nào thực sự bắt được phiên bản 1994. + +55 +00:03:30,160 --> 00:03:35,160 +Chúng tôi có thể chỉ cần sửa mã này bằng cách thay đổi một trong các điều kiện + +56 +00:03:35,590 --> 00:03:38,950 +này thành lớn hơn hoặc bằng tại đây hoặc tại đây. + +57 +00:03:39,640 --> 00:03:44,530 +Và điều đó có nghĩa là năm 1994 không bị bỏ qua trong điều kiện của chúng tôi. + +58 +00:03:44,890 --> 00:03:48,880 +Và khi chúng tôi nhấn run, nó sẽ thực sự cho chúng tôi biết rằng thực tế chúng tôi + +59 +00:03:49,210 --> 00:03:49,900 +là Gen Z. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/004 Fixing Errors and Watching for Red Underlines.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/004 Fixing Errors and Watching for Red Underlines.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..06c53186852878d1d0a6e418c6095b2718359350 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/004 Fixing Errors and Watching for Red Underlines.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82071186161130acd3c235189c7b4f5f433cc4907e3f4b32d38c3d2e8071647f +size 29632942 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/004 Fixing Errors and Watching for Red Underlines_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/004 Fixing Errors and Watching for Red Underlines_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2bf7e83035d0863570e79174aff8452098a4acc2 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/004 Fixing Errors and Watching for Red Underlines_vi.srt @@ -0,0 +1,196 @@ +1 +00:00:01,230 --> 00:00:02,820 +Bây giờ bước tiếp theo + +2 +00:00:02,880 --> 00:00:07,230 +và mẹo tiếp theo là khá rõ ràng. Khi trình chỉnh sửa báo lỗi cho bạn + +3 +00:00:07,230 --> 00:00:11,670 +hoặc khi bảng điều khiển đưa ra lỗi cho bạn, hãy sửa lỗi trước khi bạn tiếp tục. + +4 +00:00:12,180 --> 00:00:16,379 +Bây giờ, điều này dễ dàng hơn một chút khi bạn đang xử lý các lỗi trong trình chỉnh sửa, + +5 +00:00:16,440 --> 00:00:19,530 +vì nó thực sự sẽ làm nổi bật cho bạn dòng bị hỏng. + +6 +00:00:20,070 --> 00:00:23,520 +Vì vậy, ở đây chúng tôi có một câu lệnh in và khi chúng tôi di chuột qua nó, nó + +7 +00:00:23,790 --> 00:00:28,790 +cho chúng tôi biết rằng nó mong đợi một khối được thụt lề. Vì vậy, đó phải là một manh mối đủ + +8 +00:00:29,280 --> 00:00:32,189 +tốt để cho chúng ta biết điều gì đang thực sự sai. + +9 +00:00:32,610 --> 00:00:36,660 +Vì vậy, nếu chúng ta tiếp tục và thụt lề khối này, thì lỗi đó sẽ biến mất. + +10 +00:00:37,170 --> 00:00:40,830 +Nhưng đó không phải là lỗi duy nhất, không. Khi bạn chạy mã + +11 +00:00:40,890 --> 00:00:45,750 +này, bạn vẫn gặp lỗi khác. Vì vậy, hãy nói rằng tôi là một cô bé 12 tuổi, chúng tôi + +12 +00:00:46,980 --> 00:00:48,090 +nhận được một lỗi khác. + +13 +00:00:48,570 --> 00:00:52,470 +Và lỗi này không hiển thị khi chúng ta viết mã, mà nó + +14 +00:00:52,770 --> 00:00:57,770 +chỉ hiển thị tùy thuộc vào đầu vào mà chúng ta đã nhập cho biến age này. + +15 +00:00:59,160 --> 00:01:03,900 +Vì vậy, bây giờ chúng ta có một loại lỗi khác. Chúng tôi gặp lỗi trong bảng điều khiển. + +16 +00:01:04,470 --> 00:01:06,210 +Làm thế nào để chúng tôi giải quyết lỗi này? Chà, cách + +17 +00:01:06,210 --> 00:01:10,680 +dễ nhất là chỉ cần chọn các phần của lỗi không dành riêng cho + +18 +00:01:10,710 --> 00:01:15,710 +mã của bạn như độ tuổi này lớn hơn 18 hoặc dòng 84, nhưng là + +19 +00:01:17,100 --> 00:01:21,480 +phần khá phổ biến bất cứ khi nào ai đó gặp lỗi này. + +20 +00:01:22,200 --> 00:01:25,920 +Và bây giờ nếu chúng tôi sao chép nó và chúng tôi dán nó vào Google, thì + +21 +00:01:26,910 --> 00:01:30,390 +bạn có thể thấy có rất nhiều người khác đã gặp vấn đề này. + +22 +00:01:30,960 --> 00:01:32,850 +Và nếu chúng tôi đọc được vấn đề + +23 +00:01:32,910 --> 00:01:36,840 +là gì, nó cho chúng tôi biết rằng bạn đang nhận đầu vào từ bảng điều khiển dưới dạng + +24 +00:01:37,020 --> 00:01:40,020 +một chuỗi và bạn phải truyền đầu vào đó dưới dạng int trước khi + +25 +00:01:40,380 --> 00:01:45,380 +cố gắng thực hiện các phép toán số này như so sánh. Quay lại đây, đó chính xác là những + +26 +00:01:46,380 --> 00:01:50,310 +gì chúng tôi đang cố gắng thực hiện trên đường 84 ngay tại đây. + +27 +00:01:50,940 --> 00:01:55,940 +Tuổi này thoát ra khỏi hàm đầu vào này và nó trả về một chuỗi. + +28 +00:01:58,350 --> 00:02:01,020 +Và do đó, để biến nó thành một + +29 +00:02:01,230 --> 00:02:06,230 +số, tất nhiên chúng ta phải ép kiểu nó hoặc nhập chuyển nó thành một số nguyên. + +30 +00:02:07,230 --> 00:02:10,560 +Và bây giờ khi chúng tôi chạy mã của chúng tôi và chúng tôi cung cấp cho nó + +31 +00:02:10,830 --> 00:02:12,810 +tuổi của chúng tôi, nó không còn bị lỗi nữa. + +32 +00:02:13,380 --> 00:02:16,620 +Và nếu tôi nói với nó rằng trên thực tế tôi 21 tuổi, vẫn + +33 +00:02:16,860 --> 00:02:18,540 +chưa phải là tuổi thật của + +34 +00:02:19,050 --> 00:02:21,900 +tôi, thì chúng tôi thực sự nhận được bản in hoạt động. + +35 +00:02:23,130 --> 00:02:28,130 +Nhưng hãy nhớ rằng các lỗi không phải lúc nào cũng giải quyết được tất cả các lỗi của bạn, như thế này. + +36 +00:02:31,170 --> 00:02:34,650 +Trong trường hợp này, không có lỗi nào xảy ra với mã của + +37 +00:02:34,920 --> 00:02:37,860 +tôi, chỉ là nó không làm những gì tôi muốn. + +38 +00:02:38,430 --> 00:02:42,960 +Và đây là những lỗi khó chịu nhất để gỡ lỗi vì không ai giúp + +39 +00:02:42,960 --> 00:02:45,450 +bạn ở đây. Không có lỗi nào bạn có thể + +40 +00:02:45,660 --> 00:02:47,790 +Google, không có gạch dưới nào mà bạn có thể kiểm tra. + +41 +00:02:48,210 --> 00:02:52,650 +Bạn thực sự phải dựa vào kỹ năng của mình với tư cách là một lập trình viên để khắc phục điều này. + +42 +00:02:53,310 --> 00:02:58,310 +Tất nhiên, bây giờ chúng ta biết rằng đây cần phải là một chuỗi để chèn + +43 +00:03:00,130 --> 00:03:03,430 +biến đó vào vị trí này trong dấu ngoặc nhọn. + +44 +00:03:04,120 --> 00:03:08,110 +Nhưng nếu bạn không làm vậy, thì việc gỡ lỗi này sẽ khó hơn rất nhiều. + +45 +00:03:09,430 --> 00:03:13,840 +Trải nghiệm thực sự hữu ích với việc gỡ lỗi và bạn càng giải quyết được nhiều lỗi + +46 +00:03:13,840 --> 00:03:18,100 +thì bạn càng giải quyết được tốt hơn. Vì vậy, hãy truy cập internet, cố + +47 +00:03:18,130 --> 00:03:22,660 +gắng giúp đỡ mọi người trong Stack Overflow. Hãy tiếp tục kênh bất hòa cho khóa + +48 +00:03:22,720 --> 00:03:27,220 +học, cố gắng giải quyết lỗi của người khác và bạn sẽ thấy mình ngày + +49 +00:03:27,550 --> 00:03:29,020 +một mạnh mẽ hơn. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/005 Squash bugs with a print() Statement.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/005 Squash bugs with a print() Statement.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..249679fbb3dad19e4cb2bd756ce91d1753596921 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/005 Squash bugs with a print() Statement.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcbb770c5e191c46ba9b144cabe29fd1910cdcb364a8b88d27c2ed46453e1244 +size 22553923 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/005 Squash bugs with a print() Statement_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/005 Squash bugs with a print() Statement_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6e259489434c99d31b39fd77b3d2c6f6539f4cc0 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/005 Squash bugs with a print() Statement_vi.srt @@ -0,0 +1,272 @@ +1 +00:00:00,150 --> 00:00:04,320 +Bây giờ, mẹo tiếp theo là điều mà bạn có thể đang hét lên. + +2 +00:00:05,010 --> 00:00:10,010 +Tại sao chúng ta không sử dụng bản in? Và thực sự là bạn đã chính xác. + +3 +00:00:10,200 --> 00:00:14,220 +In về cơ bản là người bạn tốt nhất của bạn. Bây giờ với tư cách là nhà phát triển, tôi + +4 +00:00:14,250 --> 00:00:15,870 +biết chúng ta không có nhiều bạn, nhưng + +5 +00:00:16,230 --> 00:00:20,220 +ít nhất chúng ta có thể tin tưởng vào bản in để trở thành người bạn đáng tin cậy của mình. + +6 +00:00:21,120 --> 00:00:25,650 +Bạn có đau lòng không? Sử dụng bản in. Hiện tại, print có thể không + +7 +00:00:25,650 --> 00:00:28,650 +giúp bạn giải quyết các vấn đề về mối quan hệ hoặc các vấn + +8 +00:00:28,920 --> 00:00:32,100 +đề gia đình, nhưng nó có thể giúp bạn gỡ lỗi mã của mình, + +9 +00:00:32,430 --> 00:00:34,590 +đó là một việc khá tốt để nó làm. + +10 +00:00:35,280 --> 00:00:40,280 +Vì vậy, chúng ta hãy tiếp tục và nhận xét khối trước đó + +11 +00:00:40,920 --> 00:00:45,690 +và bỏ ghi chú khối này. Và bây giờ tôi chắc rằng bạn đang rất muốn sử dụng bản in để giải quyết + +12 +00:00:45,690 --> 00:00:49,560 +các vấn đề gỡ lỗi này. Tại sao Angela? Tại sao bạn chưa sử dụng nó trước đây? Chà, tôi đã + +13 +00:00:49,560 --> 00:00:51,990 +để dành nó cho khoảnh khắc hoàn hảo này. + +14 +00:00:52,710 --> 00:00:57,710 +Hãy xem mã và xem liệu bạn có thể sử dụng print như một người bạn của mình để giúp + +15 +00:00:58,410 --> 00:01:02,070 +bạn giải quyết vấn đề hay không. Tạm dừng video ngay bây giờ và tiếp tục. + +16 +00:01:04,430 --> 00:01:05,630 +Vì vậy, ở đây, chúng tôi có + +17 +00:01:05,780 --> 00:01:10,780 +một chương trình rất đơn giản để tìm ra số lượng từ trong một cuốn sách. Các trang bắt đầu bằng 0, + +18 +00:01:11,690 --> 00:01:14,960 +các từ bắt đầu bằng 0 và chúng + +19 +00:01:15,440 --> 00:01:20,440 +ta phải nhập số trang trong sách và số từ trong sách của + +20 +00:01:20,450 --> 00:01:21,260 +mình. + +21 +00:01:21,260 --> 00:01:26,260 +Và sau đó chúng tôi nhân các trang với các từ để tính tổng số từ trong cuốn sách và + +22 +00:01:26,330 --> 00:01:30,350 +sau đó chúng tôi in nó ra. Nhưng nếu chúng ta thử, bạn có + +23 +00:01:30,380 --> 00:01:32,990 +thể thấy rằng giả sử chúng ta có 45 trang để + +24 +00:01:33,020 --> 00:01:38,020 +tạo thành một tập sách nhỏ và chúng ta có 250 từ mỗi trang và chúng ta nhận được 0. + +25 +00:01:40,940 --> 00:01:44,900 +Vì vậy, kết quả được cho là cho chúng ta biết tổng số từ trong cuốn + +26 +00:01:45,320 --> 00:01:47,990 +sách kết thúc bằng 0. Vậy điều gì đang xảy ra ở đây? + +27 +00:01:48,860 --> 00:01:53,330 +Làm thế nào chúng tôi có thể gỡ lỗi này? Hãy tiếp tục và sử dụng bản in. + +28 +00:01:53,810 --> 00:01:55,820 +Giả định của chúng tôi là gì? Chà, chúng tôi + +29 +00:01:55,880 --> 00:01:59,300 +thực sự nhận được số trang và số từ chính xác để chúng tôi + +30 +00:01:59,330 --> 00:02:00,890 +có thể tính toán điều này. + +31 +00:02:01,310 --> 00:02:05,720 +Tại sao chúng ta không thêm một số báo cáo in trước câu cuối cùng? Hãy in giá trị thực + +32 +00:02:05,750 --> 00:02:10,580 +của một số biến mà chúng tôi nhận được từ người + +33 +00:02:10,580 --> 00:02:14,030 +dùng là gì. Ví dụ, tôi có thể + +34 +00:02:15,200 --> 00:02:20,200 +nói, um, các trang bằng và sau đó chèn biến số trang vào đây trong một chuỗi. + +35 +00:02:22,730 --> 00:02:27,560 +Và tôi cũng có thể in biến khác của mình trong + +36 +00:02:27,680 --> 00:02:31,400 +một chuỗi, là biến từ trên mỗi trang. + +37 +00:02:31,910 --> 00:02:36,910 +Và điều này cũng giống như chúng ta hãy chèn biến đó vào. + +38 +00:02:37,850 --> 00:02:40,190 +Và bây giờ khi tôi chạy mã của mình, + +39 +00:02:40,220 --> 00:02:44,180 +tôi đã có các câu lệnh in của mình và tôi có thể kiểm tra nó. + +40 +00:02:44,300 --> 00:02:49,300 +Vì vậy, chúng tôi vẫn có 45 trang và sau đó là 250 từ mỗi trang. + +41 +00:02:50,030 --> 00:02:54,680 +Bây giờ bạn có thể thấy rằng các biến của tôi đã được ghi lại. Vì vậy, biến này, biến số + +42 +00:02:54,680 --> 00:02:59,000 +trang này bằng 45. Vì vậy, nó đã nắm bắt dữ liệu của tôi một cách chính xác. + +43 +00:02:59,410 --> 00:03:02,080 +Nhưng từ trên mỗi trang bằng 0, đó không phải + +44 +00:03:02,320 --> 00:03:06,400 +là những gì tôi đã nhập. Tôi đã nhập 250 vì vậy + +45 +00:03:06,490 --> 00:03:08,950 +tôi mong đợi giá trị này là 250. + +46 +00:03:10,120 --> 00:03:13,030 +Vì vậy, bây giờ bằng cách sử dụng print, người bạn tốt nhất của + +47 +00:03:13,450 --> 00:03:15,190 +tôi, tôi đã thu hẹp được vấn đề. + +48 +00:03:15,250 --> 00:03:17,590 +Đó là một cái gì đó để làm với biến này. + +49 +00:03:17,740 --> 00:03:21,220 +Vì vậy, chúng ta hãy nhìn vào những gì đang xảy ra ở đây. Chà, tôi đã phát + +50 +00:03:21,550 --> 00:03:23,200 +hiện ra + +51 +00:03:23,290 --> 00:03:27,310 +vấn đề, phải không? Tạm dừng video và xem liệu bạn có + +52 +00:03:27,460 --> 00:03:31,840 +thể sửa mã này để tổng số từ cuối cùng thực sự được in khi bạn chạy mã hay không. + +53 +00:03:32,440 --> 00:03:35,650 +Tạm dừng video ngay bây giờ. Được rồi, chúng tôi + +54 +00:03:35,680 --> 00:03:40,000 +đã thu hẹp lại một dòng mã có thể bị hỏng này. + +55 +00:03:40,900 --> 00:03:45,790 +Và nếu bạn quan sát kỹ hơn, bạn sẽ thấy rằng thay vì một + +56 +00:03:45,820 --> 00:03:47,350 +dấu bằng có nghĩa + +57 +00:03:47,740 --> 00:03:51,160 +là gán, biến này phải bằng giá trị này. + +58 +00:03:51,820 --> 00:03:53,920 +Chúng tôi đã có hai dấu hiệu bằng nhau. + +59 +00:03:54,370 --> 00:03:58,660 +Điều này có nghĩa là biến này có bằng giá trị này không? + +60 +00:03:59,230 --> 00:04:03,820 +Và điều này thực sự được đánh giá và trở thành đúng hoặc sai. + +61 +00:04:04,330 --> 00:04:08,770 +Bây giờ, trong trường hợp này, nó thực sự là sai. Số từ trên mỗi trang bắt + +62 +00:04:08,770 --> 00:04:11,710 +đầu bằng 0, sau đó sẽ bằng 250. + +63 +00:04:12,520 --> 00:04:17,110 +Vì vậy, nếu dòng mã này là sai, thì bạn cứ để nguyên như vậy, nó thực + +64 +00:04:17,140 --> 00:04:18,880 +sự không ảnh hưởng gì cả. + +65 +00:04:19,360 --> 00:04:24,190 +Và tổng số từ này vẫn sử dụng số 0, đó là lý do tại sao nó in ra số 0. + +66 +00:04:24,790 --> 00:04:29,440 +Vì vậy, bây giờ chúng tôi đã xác định được vấn đề, tất cả những gì chúng tôi phải làm để khắc phục vấn đề là như vậy. + +67 +00:04:30,310 --> 00:04:31,870 +Và nếu chúng tôi chạy lại mã của + +68 +00:04:34,860 --> 00:04:37,770 +mình, bạn có thể thấy nó hoạt động chính xác như những gì nó nên làm. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Bringing out the BIG Gun Using a Debugger.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Bringing out the BIG Gun Using a Debugger.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..71494c0471b7514e3be71a0af8e6b9b1527b1b67 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Bringing out the BIG Gun Using a Debugger.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f743cf14aa67bfaccbe7fa5b4193e349eb95d1f6dd325d093f7621d6f0784a2 +size 38083158 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Bringing out the BIG Gun Using a Debugger_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Bringing out the BIG Gun Using a Debugger_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..40b3cd6e20077bf8811457c7a5441cb137668921 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Bringing out the BIG Gun Using a Debugger_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,870 --> 00:00:04,710 +Bây giờ trước khi bạn bắt đầu thực sự cam kết in và bắt + +2 +00:00:04,710 --> 00:00:07,050 +đầu làm vòng tay tình bạn cho bản + +3 +00:00:07,410 --> 00:00:10,020 +in này, có một công cụ khác mà tôi thực + +4 +00:00:10,230 --> 00:00:14,610 +sự muốn nói đến và đó là một công cụ lớn hơn, đẹp hơn, phức tạp hơn. + +5 +00:00:14,610 --> 00:00:15,840 +Vậy đo la cai gi? + +6 +00:00:15,960 --> 00:00:19,770 +Đó là một trình gỡ lỗi và chúng tôi đã thấy một chút về trình gỡ lỗi. + +7 +00:00:20,580 --> 00:00:23,070 +Vì vậy, tôi đã cho bạn thấy pythontutor. com và bạn cũng + +8 +00:00:23,430 --> 00:00:28,080 +đã thấy chúng tôi sử dụng trình gỡ lỗi trong trình soạn thảo Thonny ngay tại đây. + +9 +00:00:28,890 --> 00:00:32,610 +Bây giờ, trong ví dụ này, tôi sẽ gắn bó với phiên bản web của Python Tutor + +10 +00:00:32,850 --> 00:00:35,280 +để bạn không phải cài đặt thêm bất kỳ thứ gì. + +11 +00:00:35,640 --> 00:00:39,450 +Nhưng nếu chúng ta tiếp tục và nhận xét khối trước đó và bỏ + +12 +00:00:39,480 --> 00:00:44,310 +ghi chú khối cuối cùng, bạn có thể thấy rằng chúng ta vẫn còn một vấn đề khác cần + +13 +00:00:44,490 --> 00:00:48,360 +giải quyết và một đoạn mã khác, điều đó không làm những gì nó phải làm. + +14 +00:00:49,020 --> 00:00:49,830 +Vì + +15 +00:00:49,830 --> 00:00:54,830 +vậy, trong trường hợp này, chúng ta có một hàm được cho là thay đổi một + +16 +00:00:55,320 --> 00:00:56,153 +danh sách để + +17 +00:00:56,400 --> 00:01:00,600 +nó lấy một danh sách làm đầu vào và sau đó nó phải + +18 +00:01:00,840 --> 00:01:05,310 +nhân từng mục trong danh sách để đầu ra cuối cùng sẽ giống như 2, + +19 +00:01:05,550 --> 00:01:08,310 +4 , 6, 10, vân vân và vân vân. + +20 +00:01:08,310 --> 00:01:12,240 +Về cơ bản, lấy từng con số này và nhân chúng với 2, điều + +21 +00:01:12,420 --> 00:01:16,620 +này xảy ra trên dòng mã này. Nhưng thật không may khi chúng tôi chạy nó, chúng tôi + +22 +00:01:16,830 --> 00:01:21,300 +chỉ nhận được một danh sách với một giá trị duy nhất, 26. Vì vậy những gì đang xảy ra? + +23 +00:01:21,750 --> 00:01:23,460 +Hãy thử và gỡ lỗi nó. + +24 +00:01:23,550 --> 00:01:28,550 +Vì vậy, tôi muốn bạn sao chép những dòng mã này và sau đó dán nó vào Python + +25 +00:01:29,430 --> 00:01:32,310 +Tutor, sau đó tiếp tục và nhấp vào Visualize Execution. + +26 +00:01:32,940 --> 00:01:37,080 +Bây giờ nó nằm trong trình gỡ lỗi, chúng ta có thể làm được nhiều thứ với nó. + +27 +00:01:37,230 --> 00:01:42,030 +Chúng ta có thể xem từng dòng một qua đoạn mã. Vì vậy, ví dụ, điều đầu + +28 +00:01:42,030 --> 00:01:47,030 +tiên xảy ra là chúng ta tạo một hàm có tên là mutate và + +29 +00:01:47,430 --> 00:01:51,150 +hàm mutate này vượt qua một đầu vào gọi là a_list. + +30 +00:01:51,630 --> 00:01:54,630 +Vì vậy, bây giờ bên trong hàm này, mutate, chúng ta + +31 +00:01:54,810 --> 00:01:59,550 +có một biến được gọi là a_list và đó là danh sách này với các giá trị này. + +32 +00:02:00,240 --> 00:02:04,740 +Bây giờ, khi chúng ta tiếp tục, chúng ta có thể thấy chúng ta tạo một b_list, là một + +33 +00:02:04,920 --> 00:02:09,690 +danh sách trống và sau đó chúng ta sử dụng vòng lặp for để lặp qua từng mục trong danh sách. + +34 +00:02:10,020 --> 00:02:13,980 +Vì vậy, lần đầu tiên mục này bằng với mục đầu tiên trong danh + +35 +00:02:14,010 --> 00:02:14,843 +sách, là + +36 +00:02:15,300 --> 00:02:19,470 +1, và sau đó chúng ta nhân nó với 2 để tạo ra biến new_item + +37 +00:02:19,620 --> 00:02:20,820 +này, bây giờ bằng 2. + +38 +00:02:21,510 --> 00:02:26,510 +Và bây giờ vòng lặp quay trở lại từ đầu và chúng tôi tiếp tục làm điều + +39 +00:02:27,180 --> 00:02:31,830 +này với từng số trong danh sách. Chúng tôi nhân 2 với mỗi số. + +40 +00:02:32,520 --> 00:02:37,470 +Bây giờ, khi chúng ta đã hoàn thành vòng lặp đó, dòng tiếp theo sẽ xảy ra là dòng này. + +41 +00:02:38,100 --> 00:02:42,870 +B_list này được thêm vào với mục mới và cuối cùng, + +42 +00:02:43,140 --> 00:02:47,520 +chúng tôi in ra b_list. Bây giờ đây là nơi mà vấn đề xảy ra. + +43 +00:02:47,610 --> 00:02:52,470 +Lưu ý rằng b_list chỉ là một danh sách với một giá trị. + +44 +00:02:52,950 --> 00:02:57,300 +Và đó thực tế là những gì được in ra. Vì vậy, với trình gỡ lỗi này, chúng + +45 +00:02:57,330 --> 00:03:01,000 +tôi đã quản lý để xem dòng máy tính đang làm gì, bản + +46 +00:03:01,390 --> 00:03:03,340 +thân nó thực sự hữu ích. + +47 +00:03:03,730 --> 00:03:07,990 +Nhưng chúng tôi thực sự có thể làm cho quá trình này đơn giản hơn. Bên trong hầu hết các trình + +48 +00:03:07,990 --> 00:03:11,410 +gỡ lỗi, bạn có thể đặt một điểm ngắt thông + +49 +00:03:11,470 --> 00:03:16,470 +báo cho máy tính dừng những gì bạn đang làm tại dòng cụ thể này. + +50 +00:03:17,110 --> 00:03:19,120 +Và tại thời điểm đó, tôi + +51 +00:03:19,390 --> 00:03:24,390 +muốn kiểm tra xem tất cả các biến và tất cả các hàm đang làm gì. + +52 +00:03:25,060 --> 00:03:28,920 +Vì vậy, trong dòng của chúng tôi, vấn đề quan trọng xảy ra ngay tại đây. + +53 +00:03:29,220 --> 00:03:32,130 +Nếu tôi nhấp vào dòng này, bạn có thể thấy nó trở + +54 +00:03:32,580 --> 00:03:36,450 +nên màu đỏ và đây là nơi nó xảy ra, về cơ bản đây là điểm ngắt. + +55 +00:03:36,780 --> 00:03:41,780 +Vì vậy, bây giờ tôi có thể cuộn đến thời điểm đó để tôi có thể kiểm tra các giá trị + +56 +00:03:42,720 --> 00:03:46,230 +của tất cả các biến của mình. a_list vẫn là những gì + +57 +00:03:46,350 --> 00:03:51,350 +tôi mong đợi, nhưng b_list hoàn toàn trống. Và mục này tình cờ nằm ở mục + +58 +00:03:52,830 --> 00:03:56,790 +cuối cùng số 13 và mục mới đang làm những việc cần làm, + +59 +00:03:56,790 --> 00:03:58,350 +nhân nó với 2, + +60 +00:03:58,860 --> 00:04:03,570 +nhưng không có mục nào được thêm vào danh sách của tôi vì nếu tôi + +61 +00:04:03,840 --> 00:04:08,490 +nhấp vào tiếp theo, bạn có thể thấy b_list này chỉ bằng một giá trị. + +62 +00:04:08,760 --> 00:04:13,050 +Và nó tình cờ là giá trị cuối cùng mà new_item bằng. + +63 +00:04:14,370 --> 00:04:16,079 +Vì vậy, bằng cách sử dụng trình + +64 +00:04:16,380 --> 00:04:19,890 +gỡ lỗi này, bây giờ bạn sẽ có một ý tưởng tốt về vấn đề là gì. + +65 +00:04:20,160 --> 00:04:25,160 +Tạm dừng video và cố gắng sửa mã này để danh sách bị đột biến với tất cả sáu + +66 +00:04:26,400 --> 00:04:29,790 +giá trị của nó được in. Tạm dừng video ngay bây giờ. + +67 +00:04:31,920 --> 00:04:32,250 +Được rồi. + +68 +00:04:32,250 --> 00:04:37,250 +Vì vậy, vấn đề đơn giản là khi chúng tôi thêm mục mới vào b_list này, chúng tôi đang + +69 +00:04:38,160 --> 00:04:40,080 +thực hiện nó bên ngoài vòng lặp. + +70 +00:04:40,890 --> 00:04:44,820 +Đó là khi vòng lặp này hoàn thành và cuối cùng chúng ta thực + +71 +00:04:45,060 --> 00:04:46,500 +sự gọi dòng này. + +72 +00:04:46,950 --> 00:04:51,950 +Vì vậy, những gì chúng tôi cần làm để sửa mã này là chỉ thụt lề dòng đó. + +73 +00:04:52,290 --> 00:04:54,330 +Và bây giờ khi chúng tôi chạy mã, + +74 +00:04:55,140 --> 00:04:58,170 +bạn có thể thấy rằng đầu ra thích hợp được in và + +75 +00:04:58,770 --> 00:05:03,570 +nếu chúng tôi thay đổi mã này trong đó, trình gỡ lỗi, nếu chúng tôi đã chỉnh sửa nó ngay + +76 +00:05:04,230 --> 00:05:08,160 +tại đây, thì khi chúng tôi hình dung nó, bạn có thể thấy liệu tôi có + +77 +00:05:08,490 --> 00:05:12,120 +đặt điểm ngắt không ở đây dòng mã bên phải được thực thi sáu lần + +78 +00:05:12,570 --> 00:05:15,300 +và nếu chúng ta đi đến dòng mã đó và chúng + +79 +00:05:15,630 --> 00:05:20,630 +ta nhấn tiếp theo, bạn có thể thấy rằng b_list hiện đang nhận các giá trị mới được thêm vào mỗi + +80 +00:05:21,660 --> 00:05:25,530 +lần như chúng ta mong đợi. Và khi chúng tôi kiểm tra tất + +81 +00:05:25,620 --> 00:05:27,570 +cả các biến của chúng tôi, đặc biệt là + +82 +00:05:27,900 --> 00:05:32,250 +biến b_list này, đó chính xác là những gì chúng tôi mong đợi nó sẽ bằng mỗi bước của mã. + +83 +00:05:33,120 --> 00:05:35,640 +Vì vậy, một trình gỡ lỗi có thể thực sự hữu ích. + +84 +00:05:35,880 --> 00:05:40,230 +Nó gần giống như bạn đã đặt một câu lệnh in trên tất cả các biến trong + +85 +00:05:40,230 --> 00:05:41,010 +mã của + +86 +00:05:41,010 --> 00:05:46,010 +mình và bạn có thể tách biệt một thời điểm cụ thể để xem từng giá trị là gì. + +87 +00:05:46,980 --> 00:05:49,800 +Và khi chúng tôi ngày càng có kinh nghiệm hơn, chúng tôi sẽ + +88 +00:05:50,010 --> 00:05:52,320 +ngày càng sử dụng trình gỡ lỗi nhiều hơn. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Debug-your-code-online-with-Python-Tutor.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Debug-your-code-online-with-Python-Tutor.url new file mode 100644 index 0000000000000000000000000000000000000000..dabd11d8106e1351e1e6960775ac837ee0f70182 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/006 Debug-your-code-online-with-Python-Tutor.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://www.pythontutor.com/visualize.html#mode=edit \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Day-13-Ending-Code.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Day-13-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..1dfd54295cc2fb909fdc89483f08f4447f9f2439 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Day-13-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-13-end \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Final Debugging Tips.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Final Debugging Tips.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d614e1408c0fa2add36f9b0309baf42f7ffeee49 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Final Debugging Tips.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9baa2d73c193dd1653c291018ab7e8ab8b14f2fee58f4186a580b7e77b8530a2 +size 39154265 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Final Debugging Tips_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Final Debugging Tips_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f576aa51adccdb8851a48bba7fe647cc4b3f4e12 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Final Debugging Tips_vi.srt @@ -0,0 +1,324 @@ +1 +00:00:00,420 --> 00:00:02,969 +Bây giờ, tôi đã có một số mẹo cuối cùng + +2 +00:00:03,150 --> 00:00:07,770 +để gỡ lỗi và đây không phải là quá nhiều kỹ thuật, nhưng có những mẹo thực sự, thực + +3 +00:00:07,770 --> 00:00:11,820 +sự quan trọng từ một người đã thực hiện khá nhiều mã hóa và tạo ra + +4 +00:00:12,180 --> 00:00:14,520 +một lượng lớn lỗi trong cuộc đời của tôi. + +5 +00:00:15,150 --> 00:00:18,930 +Vì vậy, mẹo số 7 là hãy nghỉ ngơi. Nó thực sự, thực sự + +6 +00:00:18,930 --> 00:00:23,930 +quan trọng khi bạn chỉ nhìn chằm chằm vào mã và bạn tiếp tục nhìn vào + +7 +00:00:24,480 --> 00:00:27,120 +nó, nó sẽ không cho bạn biết giải pháp. + +8 +00:00:27,360 --> 00:00:30,210 +Chỉ cần uống một tách trà hoặc chợp mắt, hoặc cứ ngủ + +9 +00:00:30,240 --> 00:00:32,850 +đi và cố gắng giải quyết nó vào ngày mai. + +10 +00:00:33,240 --> 00:00:38,100 +Bạn sẽ ngạc nhiên khi mọi thứ trở nên dễ dàng hơn bao nhiêu khi bộ não của bạn có một thời gian ngừng hoạt + +11 +00:00:38,100 --> 00:00:42,330 +động và sau đó bạn quay trở lại với nó. Mọi thứ dường như rõ ràng hơn rất nhiều. + +12 +00:00:43,110 --> 00:00:47,850 +Và nếu bạn thực sự, thực sự gặp khó khăn và bạn không thể nhìn thấy nó, hãy hỏi + +13 +00:00:48,090 --> 00:00:51,540 +một người bạn, không phải bản in của bạn, mà là người bạn thực + +14 +00:00:51,570 --> 00:00:56,010 +sự của bạn, một con người thực sự. Tốt hơn là một nhà phát triển, nhưng họ không cần phải như vậy. + +15 +00:00:56,040 --> 00:00:58,320 +Đó có thể là ai đó đang tham gia khóa học với bạn. + +16 +00:00:58,560 --> 00:01:03,450 +Bạn có thể bắt đầu bất hòa và tìm những sinh viên khác để giúp bạn bởi vì + +17 +00:01:03,480 --> 00:01:06,150 +suy cho cùng, bạn chỉ đang nâng cấp kỹ năng + +18 +00:01:06,150 --> 00:01:10,890 +lập trình của chính mình thôi phải không? Điều thực sự tốt khi nhờ một người bạn xem qua mã của + +19 +00:01:11,100 --> 00:01:14,010 +bạn là họ sẽ không đưa ra những giả định giống như bạn đã đưa ra. + +20 +00:01:14,310 --> 00:01:17,310 +Vì vậy, họ có một số con mắt mới để họ có thể nhìn + +21 +00:01:17,550 --> 00:01:20,910 +vào mã và có thể vô cùng rõ ràng những gì đang thực sự xảy ra. + +22 +00:01:21,270 --> 00:01:23,010 +Và nó thực sự không đáng xấu hổ chút nào. + +23 +00:01:23,280 --> 00:01:25,320 +Nếu ai đó quản lý để giúp bạn với mã của bạn, + +24 +00:01:25,830 --> 00:01:30,780 +bạn có thể đề nghị giúp họ vào lần tiếp theo khi họ gặp khó khăn. Và đối với người đang giúp bạn, họ cũng chỉ + +25 +00:01:30,780 --> 00:01:31,650 +đang luyện tập + +26 +00:01:31,980 --> 00:01:36,390 +cơ bắp lập trình của họ, phải không? Bây giờ, mẹo tiếp theo + +27 +00:01:36,390 --> 00:01:40,170 +là chạy thường xuyên. Không, bạn không cần phải tập + +28 +00:01:40,200 --> 00:01:43,260 +thể dục để trở thành một lập trình viên giỏi. + +29 +00:01:43,860 --> 00:01:46,740 +Nhưng ý tôi là hãy chạy mã của bạn thường xuyên. + +30 +00:01:47,100 --> 00:01:51,000 +Đừng đợi cho đến khi bạn viết xong vô số đoạn mã để chạy và sau đó mới + +31 +00:01:51,000 --> 00:01:54,090 +phát hiện ra rằng bạn có vô số lỗi và vô số lỗi. + +32 +00:01:54,420 --> 00:01:57,330 +Nhưng hãy chạy nó sau mỗi lần thực thi nhỏ. + +33 +00:01:57,750 --> 00:02:02,750 +Khi bạn cảm thấy như mình đã thay đổi chương trình một chút, hãy chạy nó. Xác nhận rằng nó thực sự đang làm những gì bạn + +34 +00:02:02,820 --> 00:02:04,770 +muốn, bởi vì nếu bạn cứ để nó + +35 +00:02:05,400 --> 00:02:07,290 +đến cùng, thì bạn sẽ gặp một + +36 +00:02:07,380 --> 00:02:11,760 +đống lỗi và bạn không biết bắt đầu từ đâu. Bây giờ, nếu bạn rơi vào tình + +37 +00:02:11,790 --> 00:02:16,680 +huống đó và bạn có thể thấy nhiều lỗi cùng lúc, hãy cố gắng giải + +38 +00:02:16,680 --> 00:02:19,410 +quyết từng lỗi một thay vì cố gắng + +39 +00:02:19,440 --> 00:02:23,280 +xử lý từng lỗi một. Nó thực sự sẽ giúp ích rất nhiều. + +40 +00:02:24,210 --> 00:02:28,710 +Và mẹo cuối cùng tất nhiên là Stack Overflow. Tôi đã lưu điều này lần cuối cùng vì bạn + +41 +00:02:28,710 --> 00:02:33,030 +thực sự không muốn đưa mọi lỗi nhỏ của mình vào Stack Overflow, đó không phải là những + +42 +00:02:33,030 --> 00:02:36,300 +gì nó được thiết kế cho. Thay vào đó, nó + +43 +00:02:36,330 --> 00:02:41,250 +thực sự được thiết kế như một cách để hỏi các nhà phát triển khác khi + +44 +00:02:41,610 --> 00:02:46,610 +bạn nghĩ rằng bạn đã gặp một lỗi hoặc một vấn đề phải là duy nhất. + +45 +00:02:47,370 --> 00:02:51,240 +Bây giờ, nếu bạn nghĩ rằng vấn đề của bạn không phải là duy nhất và những người khác lẽ + +46 +00:02:51,330 --> 00:02:54,240 +ra phải gặp phải vấn đề này, thì chỉ cần tìm kiếm Stack Overflow. + +47 +00:02:54,840 --> 00:02:58,410 +Nếu bạn thực sự nghĩ rằng không ai trên thế giới gặp phải vấn đề này + +48 +00:02:58,410 --> 00:03:02,890 +mà bạn đang gặp phải ngay bây giờ, thì đó là thời điểm để hỏi nhà tiên tri, ý tôi + +49 +00:03:02,890 --> 00:03:03,723 +là Stack Overflow. + +50 +00:03:04,360 --> 00:03:08,290 +Tôi đã làm việc ở rất nhiều công ty nơi mà mọi người đều đến làm việc khi Stack Overflow ngừng + +51 +00:03:08,290 --> 00:03:11,980 +hoạt động, bởi vì chẳng có ích lợi gì. Là các lập trình viên, chúng tôi sử + +52 +00:03:12,010 --> 00:03:17,010 +dụng nó và chúng tôi tìm kiếm nó rất nhiều và nó trở thành một công cụ thực sự quan trọng trong vành + +53 +00:03:17,410 --> 00:03:18,243 +đai công cụ. + +54 +00:03:18,400 --> 00:03:23,230 +Nhưng bạn chỉ muốn đặt một câu hỏi khi bạn đã khá chắc chắn rằng bạn đã sử dụng + +55 +00:03:23,320 --> 00:03:28,090 +hết các cách gỡ lỗi khác và bạn đã tìm kiếm tất cả Stack Overflow và cuối cùng bạn + +56 +00:03:28,090 --> 00:03:32,080 +nhận được một thứ gì đó rất lạ và rất lạ mà bạn muốn người + +57 +00:03:32,080 --> 00:03:35,680 +khác giúp đỡ bạn tìm ra. Vì vậy, đừng lo lắng về việc tạo ra lỗi. + +58 +00:03:35,710 --> 00:03:39,190 +Và hy vọng rằng tại thời điểm này, bạn đang tạo ra những con bọ thân + +59 +00:03:39,190 --> 00:03:40,990 +thiện, như Caterpillar nhỏ này ngay bây giờ. + +60 +00:03:41,380 --> 00:03:44,260 +Và khi bạn mở rộng quy mô và thậm chí + +61 +00:03:44,530 --> 00:03:49,210 +trở nên tiên tiến hơn, bạn sẽ tạo ra những lỗi lớn hơn và đáng sợ hơn. + +62 +00:03:49,750 --> 00:03:53,110 +Vì vậy, tại một số thời điểm trong tương lai, khi bạn tạo ra những lỗi như thế + +63 +00:03:53,470 --> 00:03:56,260 +này, thì bạn thực sự biết rằng mình đã trở thành một chuyên gia. + +64 +00:03:56,620 --> 00:04:00,610 +Bạn sẽ ước quay lại ngày hôm nay khi có thể giải quyết những lỗi + +65 +00:04:00,630 --> 00:04:02,880 +như thế này. Vì vậy, đừng lo + +66 +00:04:02,880 --> 00:04:06,450 +lắng về việc tạo ra chúng. Nó không có nghĩa là bạn là một lập trình viên tồi. Trên thực tế, đó là + +67 +00:04:06,450 --> 00:04:11,400 +một phần quan trọng trong hành trình của mỗi lập trình viên. Cũng giống như một lưu ý cá nhân, + +68 +00:04:11,400 --> 00:04:15,570 +đã có lúc tôi thực sự nghĩ rằng tôi không phải là một lập trình viên + +69 +00:04:15,570 --> 00:04:18,899 +viết mã, rằng tôi chỉ là một lập trình viên sửa lỗi. + +70 +00:04:18,899 --> 00:04:21,810 +Có vẻ như mọi dòng mã tôi viết đều là một lỗi. + +71 +00:04:22,530 --> 00:04:25,800 +Vì vậy, đây là 10 mẹo hàng đầu của tôi để gỡ lỗi. + +72 +00:04:26,100 --> 00:04:30,870 +Và tôi hy vọng rằng bất cứ lúc nào khi mã của bạn không hoạt động như những gì bạn mong + +73 +00:04:30,870 --> 00:04:35,610 +đợi, hãy quay lại bài học này, hãy xem lại 10 bước này, thực hiện từng bước một và tôi cá + +74 +00:04:36,060 --> 00:04:40,860 +là 99% thời gian, một khi bạn đã làm thông qua tất cả các giai đoạn này, bạn sẽ giải quyết + +75 +00:04:41,130 --> 00:04:45,000 +được lỗi của mình và bạn sẽ làm cho mã của mình tốt hơn rất nhiều. + +76 +00:04:45,330 --> 00:04:50,330 +Và hãy nhớ rằng mọi lỗi bạn gặp trong mã của mình và bạn sửa đều giống như nâng một quả tạ + +77 +00:04:50,580 --> 00:04:53,190 +trong phòng tập thể dục. Nó chỉ là một đại diện. + +78 +00:04:53,490 --> 00:04:57,930 +Và bạn càng thực hiện nhiều đại diện thì bạn sẽ lập trình tốt hơn. Trong bài học tiếp theo, tôi + +79 +00:04:57,930 --> 00:05:01,800 +có một số thách thức mã hóa để bạn gỡ lỗi. + +80 +00:05:02,340 --> 00:05:05,280 +Bạn đã sẵn sàng để uốn nắn các cơ lập trình của mình chưa? + +81 +00:05:05,640 --> 00:05:08,850 +Tôi cũng mong là như vậy. Chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Search-Stack-Overflow-for-Errors.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Search-Stack-Overflow-for-Errors.url new file mode 100644 index 0000000000000000000000000000000000000000..412f02dc3884299c3f593231134c84d4830b405f --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/007 Search-Stack-Overflow-for-Errors.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://stackoverflow.com/questions/tagged/python \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 Exercise-25.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 Exercise-25.url new file mode 100644 index 0000000000000000000000000000000000000000..f6ded893a22a9e5211e7c9f9e30d2291a92c8f86 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 Exercise-25.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/5eb438d8-0eda-4dbc-a7f7-4ad4c8f01aed \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 How-to-join-Auditorium.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 [Interactive Coding Exercise] Debugging Odd or Even.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 [Interactive Coding Exercise] Debugging Odd or Even.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d074b2133a707dc9c155097549707c5a85cfac9a --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 [Interactive Coding Exercise] Debugging Odd or Even.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e184fffba7828cd5c85600f6dd51e65bac7461142c90c981f8e439b8c3391c0c +size 6360356 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 [Interactive Coding Exercise] Debugging Odd or Even_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 [Interactive Coding Exercise] Debugging Odd or Even_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0ca031b74639bf1581b750accb4e9b40d792951f --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/008 [Interactive Coding Exercise] Debugging Odd or Even_vi.srt @@ -0,0 +1,168 @@ +1 +00:00:00,330 --> 00:00:02,940 +Đây là một bài tập gỡ lỗi. + +2 +00:00:02,940 --> 00:00:06,270 +Vì vậy, đây là mã mà bạn đã viết cách đây nhiều + +3 +00:00:06,270 --> 00:00:08,670 +năm khi bạn tạo một chương trình + +4 +00:00:08,670 --> 00:00:12,990 +kiểm tra xem đầu vào là số lẻ hay số chẵn. + +5 +00:00:12,990 --> 00:00:15,241 +Tuy nhiên, bây giờ tôi đã đặt một số lỗi vào đó. + +6 +00:00:15,241 --> 00:00:17,420 +Vì vậy, tôi đã lén lút, làm sai mã một + +7 +00:00:17,420 --> 00:00:21,450 +chút và điều này xảy ra rất nhiều với những lập trình viên chúng + +8 +00:00:21,450 --> 00:00:24,510 +tôi, đôi khi chúng tôi vô tình làm điều đó. + +9 +00:00:24,510 --> 00:00:27,008 +Đôi khi ai đó làm xáo trộn mã của chúng tôi hoặc đôi + +10 +00:00:27,008 --> 00:00:29,910 +khi chúng tôi vừa viết một cái gì đó hoàn toàn vô nghĩa và + +11 +00:00:29,910 --> 00:00:32,490 +nó không làm được những gì chúng tôi muốn. + +12 +00:00:32,490 --> 00:00:35,160 +Đây là một kỹ năng thực sự quan trọng. + +13 +00:00:35,160 --> 00:00:39,000 +Điều này cùng với việc giỏi Google có lẽ là một trong những + +14 +00:00:39,000 --> 00:00:43,410 +kỹ năng quan trọng nhất đối với một nhà phát triển chuyên nghiệp. + +15 +00:00:43,410 --> 00:00:44,640 +Đừng cảm thấy tồi + +16 +00:00:44,640 --> 00:00:47,910 +tệ chỉ vì bạn biết mã sai và bạn phải sửa nó. + +17 +00:00:47,910 --> 00:00:50,077 +Đây là điều mà tôi mong đợi tất cả các + +18 +00:00:50,077 --> 00:00:51,960 +nhà phát triển sẽ làm tốt. + +19 +00:00:51,960 --> 00:00:53,190 +Hãy nhìn vào mã. + +20 +00:00:53,190 --> 00:00:54,810 +Bạn biết nó phải làm gì. + +21 +00:00:54,810 --> 00:00:56,850 +Nó phải nhận bất kỳ thông tin + +22 +00:00:56,850 --> 00:01:00,750 +đầu vào nào và cho bạn biết đó là số chẵn hay số lẻ. + +23 +00:01:00,750 --> 00:01:03,060 +Xác định và sửa các lỗi trong đó, sau đó + +24 +00:01:03,060 --> 00:01:06,273 +thoải mái nhấn Gửi để xem mã của bạn có vượt qua tất cả + +25 +00:01:06,273 --> 00:01:08,130 +các bước kiểm tra hay không. + +26 +00:01:08,130 --> 00:01:11,280 +Tôi đặc biệt khuyến khích bạn không nên xem xét giải + +27 +00:01:11,280 --> 00:01:14,790 +pháp trước đó của mình để tìm số lẻ hay số chẵn mà hãy tìm + +28 +00:01:14,790 --> 00:01:17,283 +ra nó từ những nguyên tắc đầu tiên. + +29 +00:01:18,180 --> 00:01:19,013 +Hãy đi ngay bây giờ. + +30 +00:01:21,480 --> 00:01:23,460 +Cách giải quyết khá nhanh chóng và đơn giản + +31 +00:01:23,460 --> 00:01:25,920 +nhưng việc tìm ra nó không hề nhanh chóng và đơn giản. + +32 +00:01:25,920 --> 00:01:27,630 +Hy vọng rằng bạn đã + +33 +00:01:27,630 --> 00:01:31,710 +tìm ra lỗi ở đây là do chúng ta gặp phải nếu + +34 +00:01:31,710 --> 00:01:35,940 +số % 2 == 0, một số bằng (=) trong Python là một + +35 +00:01:35,940 --> 00:01:39,030 +phép gán, nghĩa là hãy đặt vế phải + +36 +00:01:39,030 --> 00:01:41,610 +của dấu bằng vào vùng chứa + +37 +00:01:41,610 --> 00:01:45,930 +ở bên trái, trong khi đó, hai dấu bằng (==) đang + +38 +00:01:45,930 --> 00:01:49,650 +kiểm tra sự bằng nhau. + +39 +00:01:49,650 --> 00:01:52,034 +Vậy giá trị của vế trái có bằng + +40 +00:01:52,034 --> 00:01:53,940 +vế phải không? + +41 +00:01:53,940 --> 00:01:56,460 +Và đó chính là điều chúng ta cần làm khi + +42 +00:01:56,460 --> 00:01:59,493 +muốn kiểm tra một số là số lẻ hay số chẵn. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 Exercise-26.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 Exercise-26.url new file mode 100644 index 0000000000000000000000000000000000000000..793fea62ca069a53022a573212b7d54d2596aa81 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 Exercise-26.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/366dcb83-8959-42e7-95a6-ab73011cae9d \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 How-to-join-Auditorium.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 [Interactive Coding Exercise] Debugging Leap Year.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 [Interactive Coding Exercise] Debugging Leap Year.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d57bf1c0df90c881ac4db29f23dad0e2175036ca --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 [Interactive Coding Exercise] Debugging Leap Year.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0c01702a0f13afc0b461d96743519d081bfcb4cb10899f3b4103d7c0a8bb54c +size 4011468 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 [Interactive Coding Exercise] Debugging Leap Year_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 [Interactive Coding Exercise] Debugging Leap Year_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9e018be22c6f97bef311e705c0bb42fe48b6465c --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/009 [Interactive Coding Exercise] Debugging Leap Year_vi.srt @@ -0,0 +1,108 @@ +1 +00:00:00,210 --> 00:00:01,410 +Trong bài tập + +2 +00:00:01,410 --> 00:00:05,160 +này, bạn sẽ gỡ lỗi chương trình Năm nhuận. + +3 +00:00:05,160 --> 00:00:07,530 +Không cần nhìn vào mã gốc hoặc + +4 +00:00:07,530 --> 00:00:10,500 +mã giải pháp cho vấn đề năm nhuận, + +5 +00:00:10,500 --> 00:00:12,630 +tôi muốn bạn đi từ các nguyên + +6 +00:00:12,630 --> 00:00:14,520 +tắc đầu tiên, kiểm tra + +7 +00:00:14,520 --> 00:00:16,800 +và kiểm tra mã, xem nó sai ở + +8 +00:00:16,800 --> 00:00:19,710 +đâu rồi cố gắng sửa lỗi. + +9 +00:00:19,710 --> 00:00:21,150 +Và nếu mọi thứ suôn sẻ, nếu + +10 +00:00:21,150 --> 00:00:24,360 +bạn nhấn Gửi, nó sẽ vượt qua tất cả các bài kiểm tra. + +11 +00:00:24,360 --> 00:00:26,670 +Bạn cũng có thể thực hiện phát triển dựa trên + +12 +00:00:26,670 --> 00:00:28,380 +thử nghiệm, trong đó bạn chạy thử + +13 +00:00:28,380 --> 00:00:30,330 +nghiệm và sau đó xem thử nghiệm nào không + +14 +00:00:30,330 --> 00:00:33,630 +vượt qua cũng như tìm ra lỗi với mã của bạn theo cách đó. + +15 +00:00:33,630 --> 00:00:34,713 +Vì vậy, hãy đi ngay bây giờ. + +16 +00:00:36,750 --> 00:00:41,160 +Bây giờ một lần nữa, một giải pháp đơn giản nhưng khó tìm. + +17 +00:00:41,160 --> 00:00:42,660 +Nếu bạn chạy mã hoặc + +18 +00:00:42,660 --> 00:00:45,000 +nếu bạn cố gửi mã, bạn sẽ thấy + +19 +00:00:45,000 --> 00:00:49,110 +ở đầu ra một TypeError và đây sẽ là gợi ý để bạn + +20 +00:00:49,110 --> 00:00:50,580 +bắt đầu nghĩ về các + +21 +00:00:50,580 --> 00:00:53,190 +loại dữ liệu. + +22 +00:00:53,190 --> 00:00:57,420 +Kiểu dữ liệu ở đâu không như chương trình mong đợi? + +23 +00:00:57,420 --> 00:01:00,030 +Và tất nhiên là ở đầu vào(). + +24 +00:01:00,030 --> 00:01:02,730 +Đầu vào() xuất hiện dưới dạng một chuỗi và + +25 +00:01:02,730 --> 00:01:05,099 +chúng ta phải chuyển đổi nó thành một + +26 +00:01:05,099 --> 00:01:08,280 +số nguyên để có thể chạy toán tử modulo trên nó. + +27 +00:01:08,280 --> 00:01:10,443 +Đó là nơi bạn cần phải sửa nó. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 Exercise-27.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 Exercise-27.url new file mode 100644 index 0000000000000000000000000000000000000000..a488e4b88d7af5db24667b9542fe430ad4833bac --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 Exercise-27.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/dca63335-7adb-40f8-93a3-cdd05036fdab \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 How-to-join-Auditorium.url b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 [Interactive Coding Exercise] Debugging FizzBuzz.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 [Interactive Coding Exercise] Debugging FizzBuzz.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..afb2974530d8cbcf93e47224cf9b86aaa4e7286b --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 [Interactive Coding Exercise] Debugging FizzBuzz.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5864795cbf67dedc8d994e88f9fe5c5a6a53b94ffeace19d2d50fcd42d835d2 +size 14911832 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 [Interactive Coding Exercise] Debugging FizzBuzz_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 [Interactive Coding Exercise] Debugging FizzBuzz_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e399e527c4d7f85fda87d16da31121f8d25bbc03 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/010 [Interactive Coding Exercise] Debugging FizzBuzz_vi.srt @@ -0,0 +1,372 @@ +1 +00:00:00,480 --> 00:00:02,910 +Được rồi, đây là bài tập gỡ lỗi cuối cùng + +2 +00:00:02,910 --> 00:00:07,910 +của ngày hôm nay và nó là để gỡ lỗi chương trình FizzBuzz của chúng ta. + +3 +00:00:08,640 --> 00:00:10,290 +Đọc mã cẩn thận, xem liệu bạn có + +4 +00:00:10,290 --> 00:00:13,650 +thể phát hiện ra bất kỳ vấn đề nào trong lần đầu tiên không. + +5 +00:00:13,650 --> 00:00:17,220 +Nếu không thể, hãy chạy mã và xem bạn gặp phải lỗi nào hoặc + +6 +00:00:17,220 --> 00:00:20,340 +gửi mã và xem thử nghiệm nào không vượt qua để cung + +7 +00:00:20,340 --> 00:00:21,390 +cấp cho bạn gợi ý + +8 +00:00:21,390 --> 00:00:24,600 +về việc chương trình có thể sai ở đâu. + +9 +00:00:24,600 --> 00:00:27,060 +Bây giờ, nếu bạn không thể nhớ chương trình + +10 +00:00:27,060 --> 00:00:28,470 +FizzBuzz hoạt động như + +11 +00:00:28,470 --> 00:00:30,930 +thế nào, hãy xem bên trong hộp Mô tả, nơi chúng + +12 +00:00:30,930 --> 00:00:33,660 +tôi có mô tả chi tiết để nhắc bạn về cách hoạt động + +13 +00:00:33,660 --> 00:00:35,460 +của chương trình. + +14 +00:00:35,460 --> 00:00:38,310 +Hãy nhớ rằng trong vấn đề sửa lỗi này, + +15 +00:00:38,310 --> 00:00:41,310 +tôi thực sự đã đưa vào khá nhiều lỗi. + +16 +00:00:41,310 --> 00:00:44,550 +Bạn có thể gọi nó là một lễ hội lỗi, vì vậy hãy tận + +17 +00:00:44,550 --> 00:00:48,480 +hưởng niềm vui khi tìm ra lỗi và xem liệu bạn có thể tìm ra + +18 +00:00:48,480 --> 00:00:51,003 +tất cả các lỗi và sửa mã hay không. + +19 +00:00:54,000 --> 00:00:55,380 +Được rồi, tôi hơi xấu tính + +20 +00:00:55,380 --> 00:00:57,600 +một chút và có thể tôi đã đưa khá nhiều + +21 +00:00:57,600 --> 00:00:58,830 +lỗi vào đó để bạn tìm, + +22 +00:00:58,830 --> 00:01:02,130 +nhưng thực hành sửa lỗi cũng rất tốt và đây là lần thực hành + +23 +00:01:02,130 --> 00:01:04,620 +sửa lỗi cuối cùng trong ngày. + +24 +00:01:04,620 --> 00:01:07,950 +Vì vậy, hãy nhìn vào dòng 4. + +25 +00:01:07,950 --> 00:01:10,920 +Mã ban đầu, chúng ta có: nếu + +26 +00:01:10,920 --> 00:01:13,980 +số % 3 == 0 hoặc số % 5 == 0, và + +27 +00:01:13,980 --> 00:01:16,920 +điều này sẽ làm là nó sẽ kiểm + +28 +00:01:16,920 --> 00:01:18,300 +tra xem số đó + +29 +00:01:18,300 --> 00:01:20,280 +chia hết cho 3 hay + +30 +00:01:20,280 --> 00:01:23,610 +chia hết cho 5. + +31 +00:01:23,610 --> 00:01:24,780 +Nó sẽ không kiểm + +32 +00:01:24,780 --> 00:01:27,750 +tra khi cả hai điều kiện này đều đúng. + +33 +00:01:27,750 --> 00:01:29,370 +Và để làm được điều đó, chúng + +34 +00:01:29,370 --> 00:01:31,050 +ta phải sửa dòng mã này và thay + +35 +00:01:31,050 --> 00:01:33,480 +đổi "hoặc" thành "và", bằng cách đó chúng + +36 +00:01:33,480 --> 00:01:36,440 +ta biết khi nào chúng ta cần in "FizzBuzz". + +37 +00:01:37,440 --> 00:01:39,750 +Hai lỗi tiếp theo có liên quan khá nhiều. + +38 +00:01:39,750 --> 00:01:41,310 +Tôi phải cho cả hai vào, + +39 +00:01:41,310 --> 00:01:43,860 +nếu không trông sẽ hơi đáng nghi. + +40 +00:01:43,860 --> 00:01:47,790 +Và vấn đề ở đây là chúng ta có hai câu lệnh + +41 +00:01:47,790 --> 00:01:52,790 +if: if number % 3 == 0 và if number % 5 == 0. + +42 +00:01:53,700 --> 00:01:57,150 +Bây giờ, vấn đề với điều này không chỉ là nó kém hiệu + +43 +00:01:57,150 --> 00:02:01,260 +quả, mà còn có nghĩa là ngay cả khi dòng đầu tiên, dòng 6, là + +44 +00:02:01,260 --> 00:02:05,100 +Đúng, nó sẽ tiếp tục kiểm tra từng câu lệnh if. + +45 +00:02:05,100 --> 00:02:07,260 +Trong khi đó, nếu chúng ta có một câu lệnh elif, + +46 +00:02:07,260 --> 00:02:11,730 +thì tại bất kỳ thời điểm nào, nó có thể kết thúc vòng lặp if, elif, else khi nó tìm thấy một + +47 +00:02:11,730 --> 00:02:13,530 +trong số chúng là đúng, vì vậy đó là + +48 +00:02:13,530 --> 00:02:15,450 +một tùy chọn thoát sớm và nó hiệu quả hơn + +49 +00:02:15,450 --> 00:02:17,580 +trong hầu hết các trường hợp. + +50 +00:02:17,580 --> 00:02:19,890 +Bây giờ, có một nhược điểm quan + +51 +00:02:19,890 --> 00:02:23,520 +trọng khác khi chỉ sử dụng các câu lệnh if trong + +52 +00:02:23,520 --> 00:02:28,520 +mã này theo nghĩa là nếu nó có nghĩa là FizzBuzz, thì nó phải + +53 +00:02:28,620 --> 00:02:30,030 +in FizzBuzz, nó không + +54 +00:02:30,030 --> 00:02:31,950 +nên in Fizz vì nó chia hết + +55 +00:02:31,950 --> 00:02:35,970 +cho 3 và Buzz và FizzBuzz. + +56 +00:02:35,970 --> 00:02:38,310 +Điều đó sẽ làm xáo trộn cấu trúc câu trả + +57 +00:02:38,310 --> 00:02:40,680 +lời của chúng ta một cách đáng kể. + +58 +00:02:40,680 --> 00:02:44,430 +Vì vậy, trong trường hợp này, nó chỉ nên in Fizz + +59 +00:02:44,430 --> 00:02:48,540 +khi điều kiện đầu tiên ở dòng 6 là Sai, sau đó nó rơi + +60 +00:02:48,540 --> 00:02:51,930 +vào điều kiện tiếp theo để kiểm tra, à, nếu + +61 +00:02:51,930 --> 00:02:54,720 +nó không chia hết cho 3 và 5 thì liệu + +62 +00:02:54,720 --> 00:02:57,540 +nó có chia hết cho 3 không? + +63 +00:02:57,540 --> 00:02:59,370 +Và sau đó, nếu điều đó cũng sai thì + +64 +00:02:59,370 --> 00:03:00,450 +chúng ta tiến hành + +65 +00:03:00,450 --> 00:03:03,390 +kiểm tra xem liệu nó có chia hết cho 5 không, trong + +66 +00:03:03,390 --> 00:03:05,430 +trường hợp đó nó sẽ in ra Buzz. + +67 +00:03:05,430 --> 00:03:08,220 +Dòng của một câu lệnh có điều kiện là điều + +68 +00:03:08,220 --> 00:03:11,070 +rất quan trọng mà bạn phải suy nghĩ kỹ và + +69 +00:03:11,070 --> 00:03:14,940 +đây là một ví dụ điển hình về việc sử dụng elif thay vì if + +70 +00:03:14,940 --> 00:03:16,803 +là điều quan trọng. + +71 +00:03:18,300 --> 00:03:21,210 +Bây giờ lỗi cuối cùng chỉ là một lỗi nghịch ngợm của tôi. + +72 +00:03:21,210 --> 00:03:23,370 +Thay vì in ra một số, nếu chúng ta đặt + +73 +00:03:23,370 --> 00:03:26,040 +một số dấu ngoặc vuông xung quanh số đó, chúng + +74 +00:03:26,040 --> 00:03:29,730 +ta sẽ in ra một danh sách chứa số của chúng ta, đây không phải + +75 +00:03:29,730 --> 00:03:31,950 +là số chúng ta đang kiểm tra, đó không + +76 +00:03:31,950 --> 00:03:34,230 +phải là điều chúng ta muốn. + +77 +00:03:34,230 --> 00:03:36,030 +Để khắc phục điều này khá đơn giản, + +78 +00:03:36,030 --> 00:03:38,010 +bạn chỉ cần bỏ dấu ngoặc vuông [ ]. + +79 +00:03:38,010 --> 00:03:40,020 +Bây giờ, phần lớn điều này liên quan đến việc + +80 +00:03:40,020 --> 00:03:42,810 +nhạy cảm với giao diện của mã và bạn càng đọc nhiều mã thì bạn + +81 +00:03:42,810 --> 00:03:44,610 +càng gỡ lỗi tốt hơn, chắc chắn đó không + +82 +00:03:44,610 --> 00:03:47,460 +phải là một trong những kỹ năng bẩm sinh của chúng ta. + +83 +00:03:47,460 --> 00:03:51,870 +Và nếu các bộ phim Hollywood miêu tả tin tặc đang gõ phím, thì đó không phải + +84 +00:03:51,870 --> 00:03:53,040 +là sự thật, hầu hết thời + +85 +00:03:53,040 --> 00:03:54,750 +gian chúng ta gỡ lỗi, chúng ta + +86 +00:03:54,750 --> 00:03:56,760 +nhìn sâu vào không gian và cố gắng tìm + +87 +00:03:56,760 --> 00:03:58,830 +hiểu xem điều gì chúng ta đã viết đã gây + +88 +00:03:58,830 --> 00:04:00,450 +ra sự thất bại thảm hại này của + +89 +00:04:00,450 --> 00:04:02,970 +hệ thống. mã của chúng tôi. + +90 +00:04:02,970 --> 00:04:04,500 +Vì vậy, đừng nản lòng, đây + +91 +00:04:04,500 --> 00:04:07,710 +là một kỹ năng quan trọng cần trau dồi và xây dựng, + +92 +00:04:07,710 --> 00:04:10,440 +và đây chỉ là một bước hướng tới điều đó. + +93 +00:04:10,440 --> 00:04:11,673 +Thất bại là bạn của bạn. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/011 Building Confidence.mp4 b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/011 Building Confidence.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1a9b08b583e05e139e01fab105f4385d2fb65cdf --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/011 Building Confidence.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ab1a7789a0d8eacc3afc1f2e866775a59fbe70da370b0a1f87642df1511ab29 +size 36886939 diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/011 Building Confidence_vi.srt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/011 Building Confidence_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4f309404cecdad95e8bd2f45e522a4e32c001ce2 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/011 Building Confidence_vi.srt @@ -0,0 +1,56 @@ +1 +00:00:01,120 --> 00:00:10,000 +Hoàn thành tốt ngày 13. Bây giờ bạn có thể vẫn đang nghĩ, "Này Angela, tôi đã hoàn thành 13 ngày và + +2 +00:00:10,000 --> 00:00:13,760 +tôi vẫn chưa cảm thấy tự tin về việc viết mã bằng Python. + +3 +00:00:14,170 --> 00:00:15,240 +Những gì đang xảy ra ở đây? + +4 +00:00:15,250 --> 00:00:17,400 +Tôi không có ý định trở thành một lập trình viên? "Những gì tôi + +5 +00:00:18,730 --> 00:00:23,620 +phải nói với bạn là, bạn biết đấy, sự tự tin là có được. + +6 +00:00:24,130 --> 00:00:27,850 +Giống như, bạn chỉ có thể đi xa khi giả vờ tự tin. + +7 +00:00:28,240 --> 00:00:34,120 +Nhưng một khi bạn đã vượt qua một số trở ngại, khi bạn đã giải quyết được những vấn đề mà bạn chưa từng giải quyết trước + +8 +00:00:34,120 --> 00:00:36,700 +đây, thì bạn bắt đầu xây dựng những kỹ năng đó. + +9 +00:00:36,940 --> 00:00:41,560 +Và sau đó, lần sau khi bạn gặp một điều gì đó khó khăn, bạn sẽ nghĩ lại và bạn sẽ nghĩ rằng, điều + +10 +00:00:41,560 --> 00:00:44,320 +này không khó như những điều khác mà tôi đã làm trước đây. + +11 +00:00:45,040 --> 00:00:52,090 +Vì vậy, khi bạn tiếp tục vượt qua các rào cản, khi bạn tiếp tục giải quyết những điều khó khăn, khi bạn tiếp tục đấu tranh + +12 +00:00:52,090 --> 00:00:56,310 +và vượt qua nó, bạn sẽ xây dựng sự tự tin trong lập trình của mình. + +13 +00:00:56,800 --> 00:00:59,430 +Vì vậy, một lần nữa, chỉ cần tiếp tục. + +14 +00:00:59,710 --> 00:01:00,430 +Bạn hiểu rồi đấy. + diff --git a/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/external-links.txt b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..f4b51faee978ea87235b4dc943fbd70ddad4fdb3 --- /dev/null +++ b/part2/13 - Day 13 - Beginner - Debugging How to Find and Fix Errors in your Code/external-links.txt @@ -0,0 +1,30 @@ + +001 Fork-the-Day-13-Starting-Repl +https://repl.it/@appbrewery/day-13-start + +006 Debug-your-code-online-with-Python-Tutor +http://www.pythontutor.com/visualize.html#mode=edit + +007 Day-13-Ending-Code +https://repl.it/@appbrewery/day-13-end + +007 Search-Stack-Overflow-for-Errors +https://stackoverflow.com/questions/tagged/python + +008 Exercise-25 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/5eb438d8-0eda-4dbc-a7f7-4ad4c8f01aed + +008 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +009 Exercise-26 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/366dcb83-8959-42e7-95a6-ab73011cae9d + +009 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +010 Exercise-27 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/dca63335-7adb-40f8-93a3-cdd05036fdab + +010 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Day-14-Goal-Click-Run-to-see-the-final-project.url b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Day-14-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..f2796aa2d732a189d63d9ee6c25041dcfda1ef87 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Day-14-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/higher-lower-final?v=1 \ No newline at end of file diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Fork-the-Day-14-Starting-Repl.url b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Fork-the-Day-14-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..c36ef7266ffe020fb88b1c008de8e4f8bcfe2e3c --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Fork-the-Day-14-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/higher-lower-start \ No newline at end of file diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Introduction & Program Requirements for the Higher Lower Game.mp4 b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Introduction & Program Requirements for the Higher Lower Game.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c715e68703ff5e805936d863281da947c92f3e19 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Introduction & Program Requirements for the Higher Lower Game.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3089212e7b5dcd6f56236b4c79d271505637a62cddaffa813f6d4f605c7cdbf +size 27349726 diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Introduction & Program Requirements for the Higher Lower Game_vi.srt b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Introduction & Program Requirements for the Higher Lower Game_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e4d1f62796975ba987b620c289e6725669df8ae --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Introduction & Program Requirements for the Higher Lower Game_vi.srt @@ -0,0 +1,464 @@ +1 +00:00:00,030 --> 00:00:04,800 +Xin chào các bạn, chào mừng đến với Ngày 14 của 100 Ngày viết mã. Hôm nay bạn sẽ dành để xây + +2 +00:00:04,800 --> 00:00:09,450 +dựng một trò chơi thú vị có tên là Cao hơn hoặc thấp hơn. + +3 +00:00:10,020 --> 00:00:12,660 +Và nếu bạn muốn thử, chỉ cần chuyển sang + +4 +00:00:12,660 --> 00:00:15,540 +trò chơi thấp hơn. com và nhấp vào cổ điển. + +5 +00:00:16,110 --> 00:00:20,910 +Vì vậy, phiên bản cổ điển của cao hơn thấp hơn là bạn so sánh một cụm từ + +6 +00:00:20,940 --> 00:00:22,230 +tìm kiếm, Khách sạn + +7 +00:00:22,230 --> 00:00:26,010 +Grand Budapest là một bộ phim, với một cụm từ tìm kiếm khác + +8 +00:00:26,040 --> 00:00:27,690 +AFL, đó là American Football League. + +9 +00:00:28,260 --> 00:00:33,210 +Và bạn phải nói xem khách sạn thứ hai có lượt tìm kiếm cao hơn hay thấp + +10 +00:00:33,480 --> 00:00:37,050 +hơn khách sạn Grand Budapest. Vì vậy, tôi nghĩ rằng điều này có thể có cao hơn. + +11 +00:00:37,740 --> 00:00:42,480 +Và quả thực là tôi đã đúng. Và bây giờ nó cung cấp cho bạn một thuật ngữ mới để so sánh. + +12 +00:00:42,990 --> 00:00:47,100 +Vì vậy, Six Nations Rugby so với AFL ai thấp hơn. + +13 +00:00:47,430 --> 00:00:50,250 +Tôi nghĩ rằng điều này có lẽ đã thấp hơn và tôi đúng. + +14 +00:00:50,610 --> 00:00:53,490 +Và bạn tiếp tục cho đến khi bạn làm sai. + +15 +00:00:53,670 --> 00:00:57,750 +Và đó là một trò chơi gây nghiện một cách kỳ lạ vì một lý do nào đó. Được chứ. + +16 +00:00:57,750 --> 00:01:02,460 +Vì vậy, bây giờ tôi đã nhận sai và nó cho tôi biết tôi đã nhận được bao nhiêu điểm đúng như điểm số + +17 +00:01:02,820 --> 00:01:07,230 +của mình và tôi có thể chơi lại nếu muốn. Hãy chơi một vòng với trò chơi đó vì + +18 +00:01:07,260 --> 00:01:10,740 +phiên bản cuối cùng mà chúng tôi có trông đơn giản hơn rất + +19 +00:01:10,890 --> 00:01:13,050 +nhiều, nhưng vẫn thú vị khi chơi. + +20 +00:01:13,680 --> 00:01:17,520 +Thay vì so sánh các lượt tìm kiếm trung bình hàng tháng trên Google, chúng tôi + +21 +00:01:17,730 --> 00:01:21,300 +đang so sánh xem ai có nhiều người theo dõi hơn trên Instagram. + +22 +00:01:21,750 --> 00:01:26,130 +Vì vậy, chúng tôi đang cập nhật trò chơi này. Trong trường hợp này, người ta so sánh + +23 +00:01:26,190 --> 00:01:30,210 +Neymar, một cầu thủ bóng đá đến từ Brazil với Chloe Kardashian, một nhân vật truyền + +24 +00:01:30,240 --> 00:01:34,530 +hình thực tế và một nữ doanh nhân đến từ Mỹ, người có nhiều người theo dõi hơn. + +25 +00:01:34,770 --> 00:01:39,300 +Vì vậy, tôi nghĩ đó là 'B', tôi có thể sai và tôi đã sai. + +26 +00:01:42,740 --> 00:01:43,880 +Vì vậy, ở + +27 +00:01:44,150 --> 00:01:49,070 +đây chúng tôi so sánh Rihanna một nhạc sĩ và một nữ doanh nhân từ Barbados với Shakira + +28 +00:01:49,100 --> 00:01:50,480 +một nhạc sĩ từ Columbia. + +29 +00:01:50,810 --> 00:01:54,800 +Vì vậy, tôi sẽ đoán có lẽ là Rihanna và tôi hiểu đúng, + +30 +00:01:54,800 --> 00:01:59,800 +vì vậy tôi ghi được một điểm. Và trò chơi này tiếp tục lặp đi lặp + +31 +00:02:01,970 --> 00:02:05,600 +lại cho đến khi bạn làm sai, giống như trò bạn đã thấy trước đó. + +32 +00:02:06,980 --> 00:02:10,220 +Và chúng ta bắt đầu. Vì vậy, tôi nhận được ba là điểm + +33 +00:02:10,639 --> 00:02:12,830 +số cuối cùng của mình, và đó là kết thúc của trò chơi. + +34 +00:02:13,340 --> 00:02:18,260 +Mục đích của trò chơi là cố gắng sống sót càng lâu càng tốt và ghi + +35 +00:02:18,290 --> 00:02:23,290 +điểm càng cao càng tốt bằng cách suy nghĩ xem ai có thể nổi tiếng hơn người kia. + +36 +00:02:23,930 --> 00:02:25,670 +Bây giờ đến phần thú vị ở đây. + +37 +00:02:25,910 --> 00:02:29,690 +Bạn sẽ tự mình viết mã trò chơi này hoàn toàn. + +38 +00:02:30,320 --> 00:02:35,320 +Bạn sẽ áp dụng mọi thứ bạn đã học cho đến nay để hiểu cách trò chơi này hoạt + +39 +00:02:35,510 --> 00:02:37,970 +động bằng cách chơi nó khá nhiều lần, + +40 +00:02:38,240 --> 00:02:42,770 +truy cập URL này và xem xét tất cả các sắc thái cụ thể; Điều gì sẽ + +41 +00:02:42,770 --> 00:02:45,920 +xảy ra nếu bạn làm sai, điều gì sẽ xảy ra nếu + +42 +00:02:46,490 --> 00:02:49,520 +bạn làm đúng và bạn sẽ tự viết mã tất cả, + +43 +00:02:49,970 --> 00:02:54,320 +và có thể bạn sẽ cần kỹ năng gỡ lỗi để khắc phục một số vấn + +44 +00:02:54,350 --> 00:02:55,730 +đề khi tiếp tục. + +45 +00:02:56,360 --> 00:03:01,270 +Vì vậy, cách tiếp cận mà tôi muốn bạn thực hiện là trước tiên hãy nghĩ về vấn đề và + +46 +00:03:01,330 --> 00:03:05,080 +sau đó chia nhỏ một vấn đề lớn thành những vấn đề nhỏ hơn. + +47 +00:03:05,560 --> 00:03:09,940 +Bằng cách này, bạn có thể giải quyết từng người một, và nó sẽ không quá đáng sợ. + +48 +00:03:10,480 --> 00:03:14,830 +Bây giờ, bước 2 là xem xét những vấn đề đó và lập danh + +49 +00:03:14,830 --> 00:03:17,950 +sách việc cần làm. Với các mục trong danh sách + +50 +00:03:18,310 --> 00:03:22,240 +việc cần làm, bạn sẽ chọn mục mà bạn nghĩ là dễ dàng nhất để bắt đầu. + +51 +00:03:22,930 --> 00:03:26,860 +Hãy nói rằng, uhm, có thể tạo ra một số ngẫu nhiên. + +52 +00:03:26,890 --> 00:03:30,100 +Điều đó khá đơn giản, phải không? Chà, trong danh sách việc cần làm này, đó là + +53 +00:03:30,130 --> 00:03:33,190 +việc đầu tiên chúng ta sẽ giải quyết. Vì vậy, trong trường hợp này, chúng + +54 +00:03:33,190 --> 00:03:36,040 +ta đang xây dựng một trò chơi xúc xắc rất đơn giản, phải không? + +55 +00:03:36,160 --> 00:03:38,770 +Trò chơi mà bạn sẽ xây dựng phức tạp hơn rất nhiều, nó sẽ + +56 +00:03:38,770 --> 00:03:41,560 +không chỉ có ba việc cần làm. Nhưng ý tưởng là như nhau. + +57 +00:03:41,770 --> 00:03:46,720 +Khi bạn chọn nhiệm vụ mà bạn cho là dễ nhất, tạo ra một số ngẫu nhiên, thì bạn + +58 +00:03:47,110 --> 00:03:48,880 +phải giải quyết vấn đề đó + +59 +00:03:49,030 --> 00:03:52,450 +và bạn sẽ chia nó thành các nhận xét trong mã của mình. + +60 +00:03:52,900 --> 00:03:56,740 +Vì vậy, giống như bạn đã thấy tôi làm điều đó cho dự án trước đây của chúng ta, bạn + +61 +00:03:57,010 --> 00:03:58,300 +cũng sẽ làm điều tương tự. + +62 +00:03:58,390 --> 00:04:02,320 +Bạn sẽ giải quyết vấn đề đó là tạo một số ngẫu nhiên và sau đó + +63 +00:04:02,320 --> 00:04:04,660 +chia nó thành các phần khác nhau, phải không? + +64 +00:04:04,690 --> 00:04:08,440 +Đầu tiên, bạn có thể phải nhập mô-đun ngẫu nhiên và sau đó + +65 +00:04:08,440 --> 00:04:11,260 +bạn có thể phải sử dụng một hàm như randint + +66 +00:04:11,290 --> 00:04:16,290 +để tạo một số nguyên ngẫu nhiên. Vì vậy, bây giờ bạn đã giải quyết một vấn đề lớn và + +67 +00:04:16,870 --> 00:04:20,380 +chia nó thành các vấn đề nhỏ hơn, giải quyết vấn đề nhỏ hơn dễ dàng hơn và + +68 +00:04:20,649 --> 00:04:23,110 +chia nó thành các nhận xét trong mã của bạn, sau đó bạn + +69 +00:04:23,440 --> 00:04:25,690 +đã sẵn sàng để bắt đầu viết một số mã. + +70 +00:04:26,500 --> 00:04:30,820 +Vì vậy, hãy viết mã bên dưới các bình luận, chạy mã của bạn, đảm bảo rằng + +71 +00:04:31,120 --> 00:04:35,110 +nó thực hiện những gì bạn muốn. Và nếu không, hãy sửa mã. + +72 +00:04:35,530 --> 00:04:37,930 +Và khi bạn đã hoàn thành việc đó, hãy + +73 +00:04:37,960 --> 00:04:41,140 +quay lại từ đầu, hãy viết thêm mã dưới các nhận xét, + +74 +00:04:41,170 --> 00:04:45,880 +chạy nhiều mã hơn, sửa nhiều mã hơn cho đến khi bạn vượt qua được nhiệm vụ đó. + +75 +00:04:46,330 --> 00:04:50,140 +Và sau đó là trường hợp giải quyết vấn đề tiếp theo mà bạn nghĩ rằng bạn có thể thử. + +76 +00:04:50,530 --> 00:04:54,700 +Vì vậy, đây là kỹ năng thực sự của các lập trình viên; nhận một + +77 +00:04:54,700 --> 00:04:58,090 +cái gì đó vô cùng phức tạp và khó khăn, chia nó + +78 +00:04:58,390 --> 00:04:59,710 +thành những vấn đề + +79 +00:04:59,740 --> 00:05:04,000 +nhỏ hơn, chia nhỏ nó ra xa hơn, sau đó giải quyết chúng từ dễ nhất + +80 +00:05:04,000 --> 00:05:08,170 +đến khó nhất và làm từng việc một. Cuối cùng thì cuối cùng, bạn cũng có sản phẩm cuối cùng của mình. + +81 +00:05:08,650 --> 00:05:10,330 +Đây là những gì tôi muốn bạn làm. + +82 +00:05:10,900 --> 00:05:14,620 +Vì vậy, điều đầu tiên bạn phải làm là xem qua phiên bản + +83 +00:05:14,620 --> 00:05:15,400 +cuối cùng + +84 +00:05:15,400 --> 00:05:20,400 +của trò chơi, chơi nó ít nhất 10 lần để bạn hiểu chính xác cách nó hoạt động + +85 +00:05:21,100 --> 00:05:25,960 +và sau đó lấy mã bắt đầu cho ngày, càng cao- bắt đầu thấp hơn, và tiếp + +86 +00:05:26,560 --> 00:05:29,410 +tục và phân nhánh bản sao của chính bạn. + +87 +00:05:30,280 --> 00:05:35,280 +Bây giờ bạn sẽ nhận thấy rằng có ba tệp trong mã bắt đầu. Một là nghệ thuật. py có chứa logo và biểu + +88 +00:05:35,860 --> 00:05:40,860 +tượng so với hiển thị khi nó yêu cầu bạn so sánh. + +89 +00:05:41,950 --> 00:05:42,880 +Vì vậy, hãy so sánh A, Christiano Ronaldo với B, Vin Diesel. + +90 +00:05:43,810 --> 00:05:48,040 +Và đây là những tác phẩm nghệ thuật mà bạn sẽ trưng bày. Và cuối cùng, và có lẽ là quan trọng nhất, có một tệp được gọi + +91 +00:05:48,640 --> 00:05:51,640 +là dữ liệu trò chơi. Bây giờ dữ liệu + +92 +00:05:51,910 --> 00:05:56,770 +trò chơi chỉ có một biến duy nhất. + +93 +00:05:56,800 --> 00:05:59,180 +Đó là một danh sách các mục từ điển. + +94 +00:05:59,600 --> 00:06:03,410 +Mỗi từ điển này có bốn khóa + +95 +00:06:03,890 --> 00:06:08,720 +và các khóa giống nhau cho tất cả các mục nhập. Họ có tên, tên tài khoản, số lượng người theo dõi, vậy tài khoản đó có + +96 +00:06:08,720 --> 00:06:12,920 +bao nhiêu người theo dõi trên + +97 +00:06:13,190 --> 00:06:14,300 +hàng triệu người. + +98 +00:06:14,300 --> 00:06:18,530 +Ví dụ, Christiano Ronaldo có 215 triệu người theo + +99 +00:06:18,710 --> 00:06:23,690 +dõi, ít nhất là vào thời điểm tôi tổng hợp dữ liệu. Và sau đó nó có một mô tả, anh ấy là một cầu thủ bóng đá hoặc + +100 +00:06:23,900 --> 00:06:28,490 +đây là một nền tảng truyền thông + +101 +00:06:28,580 --> 00:06:31,850 +xã hội, cô ấy là một nhạc sĩ và diễn viên. Và cuối cùng là đất nước mà họ đến từ. + +102 +00:06:32,120 --> 00:06:35,960 +Bạn sẽ sử dụng tất cả + +103 +00:06:36,230 --> 00:06:41,230 +những thông tin này để tạo ra một đường so sánh như thế này, hãy so sánh A: + +104 +00:06:41,750 --> 00:06:44,610 +Cristiano Ronaldo với một bóng đá đến từ Bồ Đào Nha. Chúng tôi có B. + +105 +00:06:44,610 --> 00:06:46,850 +Và bạn sẽ yêu cầu người dùng đoán xem ai có nhiều người theo dõi hơn. Và nếu họ + +106 +00:06:47,360 --> 00:06:52,360 +hiểu đúng, họ sẽ tiếp tục chơi, nơi + +107 +00:06:53,510 --> 00:06:58,280 +A bây giờ trở thành B trước đó, vì vậy Vin Diesel, người mà bạn từng + +108 +00:06:58,760 --> 00:07:02,960 +là B bây giờ trở thành A, và sau đó bạn có thể + +109 +00:07:03,470 --> 00:07:08,470 +so sánh với một người mới và nó tiếp tục cho đến khi họ hiểu sai. Đó là nhiệm vụ phía trước của bạn và nó sẽ không dễ dàng, nhưng tôi nghĩ + +110 +00:07:09,710 --> 00:07:13,340 +bạn có thể làm được. + +111 +00:07:13,670 --> 00:07:16,940 +Vì vậy, hãy dành cho dự án này ít nhất một giờ. Bạn sẽ cần viết mã, bạn sẽ cần khắc phục sự cố, + +112 +00:07:17,330 --> 00:07:21,530 +bạn sẽ cần gỡ lỗi, bạn + +113 +00:07:21,530 --> 00:07:23,840 +sẽ cần kiểm tra nó khá nhiều lần. Nhưng cuối cùng, bạn sẽ trở + +114 +00:07:24,080 --> 00:07:27,560 +thành một lập trình + +115 +00:07:27,620 --> 00:07:30,110 +viên mạnh mẽ hơn mà tôi hứa. Vì vậy, chúc may mắn và hãy chắc chắn rằng bạn sẽ + +116 +00:07:30,140 --> 00:07:35,140 +có rất nhiều khó khăn và tôi sẽ gặp bạn ở phía bên kia. + diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Try-out-the-Online-Higher-Lower-Game.url b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Try-out-the-Online-Higher-Lower-Game.url new file mode 100644 index 0000000000000000000000000000000000000000..db961b542f670a49c241d1ce28b7fadb0350b56a --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/001 Try-out-the-Online-Higher-Lower-Game.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://www.higherlowergame.com/ \ No newline at end of file diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Course-Fixes-Report-an-Issue.url b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Day-14-Ending-Code.url b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Day-14-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..b1028860b28a5958548bdb3974a78a2246029c76 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Day-14-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/higher-lower-final \ No newline at end of file diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Solution & Walkthrough of the Higher Lower Game.mp4 b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Solution & Walkthrough of the Higher Lower Game.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9978ff7cc594269b8984f4a75a031b3470dc6884 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Solution & Walkthrough of the Higher Lower Game.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6aeee1c5cb6212eb90d806e9c3cb6d7bc7db2012feb57ea644857cc1d29ef4ef +size 477891611 diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Solution & Walkthrough of the Higher Lower Game_vi.srt b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Solution & Walkthrough of the Higher Lower Game_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0828d12db010849b09e63eae28e6f181f9704c18 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/002 Solution & Walkthrough of the Higher Lower Game_vi.srt @@ -0,0 +1,1480 @@ +1 +00:00:00,690 --> 00:00:07,080 +Được rồi, vì vậy tôi thực sự hy vọng bạn đã thực hiện tốt thử thách này và bạn đã dành ít + +2 +00:00:07,080 --> 00:00:14,460 +nhất một giờ để vượt qua nó và vật lộn, và bạn nên lau mồ hôi trên lông mày của mình trước khi đến và xem + +3 +00:00:14,460 --> 00:00:15,440 +xét giải pháp. + +4 +00:00:16,110 --> 00:00:19,530 +Cuộc đấu tranh là rất quan trọng và tôi không thể căng thẳng nó đủ. + +5 +00:00:20,130 --> 00:00:24,230 +Nhưng trong bài học này, tôi muốn trình bày về cách giải quyết vấn đề này. + +6 +00:00:24,690 --> 00:00:27,430 +Bây giờ, nó không có nghĩa là bạn phải làm điều tương tự. + +7 +00:00:27,450 --> 00:00:28,850 +Không có một giải pháp. + +8 +00:00:28,860 --> 00:00:32,549 +Có thể có hàng ngàn giải pháp khác nhau cho một dự án như thế này. + +9 +00:00:32,700 --> 00:00:37,380 +Và miễn là chương trình của bạn chạy chính xác theo cùng một cách, thì bạn đã thành công. + +10 +00:00:37,710 --> 00:00:40,920 +Không quan trọng ở giai đoạn này bạn đã thực hiện nó như thế nào. + +11 +00:00:41,160 --> 00:00:46,380 +Miễn là bạn sắp xếp được suy nghĩ của mình, chia nhỏ vấn đề và viết mã giải + +12 +00:00:46,380 --> 00:00:49,450 +pháp và bắt nó chạy, thì bạn đã chiến thắng. + +13 +00:00:50,130 --> 00:00:57,750 +Thách thức thực sự trong dự án hôm nay là bạn phải chia nhỏ một vấn đề lớn thành những phần nhỏ hơn, có thể giải quyết + +14 +00:00:57,750 --> 00:00:58,180 +được. + +15 +00:00:58,500 --> 00:01:01,040 +Nó thậm chí không phải là quá nhiều mã quan trọng. + +16 +00:01:01,500 --> 00:01:05,750 +Đó là kỹ năng mà bạn thực sự cần phát triển để trở thành một lập trình viên thực sự giỏi. + +17 +00:01:06,420 --> 00:01:12,480 +Và cho đến nay, tôi đang phân tích vấn đề cho bạn, chỉ cho bạn các bước sẽ đưa bạn đến + +18 +00:01:12,480 --> 00:01:13,320 +giải pháp. + +19 +00:01:13,740 --> 00:01:18,120 +Nhưng bây giờ bạn thực sự đang mặc chiếc quần của các lập trình viên lớn và bạn đang làm tất cả một mình. + +20 +00:01:18,900 --> 00:01:22,820 +Vì vậy, chúng ta hãy nghĩ về vấn đề này và làm thế nào chúng ta sẽ phá vỡ nó. + +21 +00:01:23,310 --> 00:01:25,270 +Có một số vấn đề dễ dàng ở đây, phải không? + +22 +00:01:25,290 --> 00:01:26,960 +Chúng tôi cần nghệ thuật để hiển thị. + +23 +00:01:27,180 --> 00:01:30,200 +Vì vậy, chúng ta hãy thêm một nhận xét cho mỗi vấn đề mà chúng tôi xác định. + +24 +00:01:30,690 --> 00:01:35,480 +Chúng tôi có nghệ thuật ASCII hiển thị ở đây và chúng tôi có sự so sánh với hiển thị ở đây. + +25 +00:01:36,270 --> 00:01:43,260 +Bây giờ, điều tiếp theo là chúng tôi có các tài khoản được tạo ngẫu nhiên này ngay từ dữ liệu. + +26 +00:01:43,260 --> 00:01:46,110 +Vì vậy, chúng tôi đã có Camila Cabello và Emma Watson. + +27 +00:01:46,740 --> 00:01:49,240 +Làm cách nào để chúng tôi hiển thị các tài khoản ngẫu nhiên này? + +28 +00:01:49,290 --> 00:01:50,930 +Đó là một vấn đề khác, phải không? + +29 +00:01:51,450 --> 00:01:58,290 +Vì vậy, chúng tôi biết rằng chúng tôi có tất cả dữ liệu trò chơi này ở đây ở định dạng từ điển được lồng bên trong + +30 +00:01:58,290 --> 00:01:58,800 +danh sách. + +31 +00:01:59,250 --> 00:02:04,140 +Và chúng ta cần tìm ra cách để lấy ra một tài khoản ngẫu nhiên từ danh sách này. + +32 +00:02:04,540 --> 00:02:06,910 +Vì vậy, đó là một vấn đề khác mà tôi đã xác định. + +33 +00:02:07,560 --> 00:02:13,470 +Bây giờ, điều tiếp theo bạn sẽ nhận thấy là dữ liệu chứa nhiều cặp giá + +34 +00:02:13,470 --> 00:02:20,490 +trị khóa, tên tài khoản, mô tả, v.v. Nhưng khi chúng tôi hiển thị nó, tất cả đều được định dạng độc đáo; tên và + +35 +00:02:20,490 --> 00:02:26,410 +sau đó là những gì họ làm và sau đó họ đến từ đâu. Chúng tôi sẽ phải thêm rằng có lẽ là một vấn đề khác cần giải quyết. + +36 +00:02:26,430 --> 00:02:33,210 +Làm cách nào để chúng tôi định dạng dữ liệu tài khoản thành định dạng có thể in được? + +37 +00:02:33,660 --> 00:02:39,900 +Được rồi, giả sử chúng ta giải quyết được điều đó và chúng ta có A và B, bây giờ chúng ta phải hỏi người dùng đoán. + +38 +00:02:39,960 --> 00:02:41,510 +Đoán xem ai có nhiều người theo dõi hơn. + +39 +00:02:41,700 --> 00:02:43,730 +Vì vậy, đó là một vấn đề khác cần giải quyết. + +40 +00:02:44,730 --> 00:02:52,950 +Và khi họ nhập một câu trả lời, giả sử chúng tôi nghĩ rằng có thể A có nhiều người theo dõi hơn, sau đó sẽ phải + +41 +00:02:52,950 --> 00:02:56,960 +kiểm tra câu trả lời đó và xem nó đúng hay sai. + +42 +00:02:57,630 --> 00:02:59,640 +Vì vậy, đó sẽ là một vấn đề lớn. + +43 +00:02:59,640 --> 00:03:05,450 +Kiểm tra xem người dùng có đúng không, vì điều đó sẽ yêu cầu một vài thứ, phải không? + +44 +00:03:05,460 --> 00:03:11,650 +Chúng ta có thể sẽ phải chia vấn đề này thành các vấn đề nhỏ hơn nếu chúng ta muốn giải quyết nó. + +45 +00:03:12,240 --> 00:03:19,230 +Vì vậy, chẳng hạn, chúng ta có thể cần tìm ra số lượng người theo dõi của mỗi tài khoản và sau đó + +46 +00:03:19,230 --> 00:03:25,560 +chúng ta có thể cần sử dụng câu lệnh if để kiểm tra xem người dùng có đúng hay không. + +47 +00:03:26,490 --> 00:03:31,860 +Bây giờ, nếu chúng tôi làm đúng hoặc nếu chúng tôi làm sai, trò chơi sẽ luôn cung cấp cho chúng tôi một số phản hồi. + +48 +00:03:31,890 --> 00:03:35,290 +"Xin lỗi, sai rồi" hoặc "Bạn nói đúng. "Vì vậy, chúng ta hãy thêm vào danh + +49 +00:03:36,390 --> 00:03:39,690 +sách vấn đề của chúng ta. Bây giờ, ngoài việc + +50 +00:03:39,690 --> 00:03:44,430 +cho họ phản hồi xem họ làm đúng hay sai, nó còn có một + +51 +00:03:44,430 --> 00:03:46,970 +cách để theo dõi điểm số, phải không? + +52 +00:03:46,980 --> 00:03:50,220 +Mỗi khi họ trả lời đúng, điểm số sẽ tăng lên một. + +53 +00:03:50,880 --> 00:03:55,930 +Ngoài tất cả những điều đó, trò chơi sẽ tự lặp lại khi người dùng làm đúng. + +54 +00:03:56,490 --> 00:04:03,560 +Vì vậy, giả sử trong trường hợp này, tôi đoán là Dwayne Johnson, sau đó bạn thấy cách trò chơi lặp lại chính nó, phải không? + +55 +00:04:03,570 --> 00:04:10,560 +Nó quay trở lại và Dwayne Johnson phải đặt nó vào vị trí A và tạo một tài khoản mới ở vị + +56 +00:04:10,560 --> 00:04:12,570 +trí B để tôi tiếp tục. + +57 +00:04:12,960 --> 00:04:15,240 +Vì vậy, tôi nhận được một vòng khác bởi vì tôi đã làm đúng. + +58 +00:04:16,050 --> 00:04:18,420 +Vì vậy, chúng tôi cũng cần giải quyết vấn đề đó trong mã của chúng tôi. + +59 +00:04:18,899 --> 00:04:23,850 +Có một số cách để làm cho trò chơi có thể lặp lại. + +60 +00:04:25,830 --> 00:04:33,450 +Và nó không chỉ lặp lại, thực ra, bởi vì chúng ta cũng phải di chuyển chữ B trước đó lên vị trí A nếu + +61 +00:04:33,450 --> 00:04:35,640 +họ làm đúng cho vòng tiếp theo. + +62 +00:04:36,150 --> 00:04:40,920 +Vì vậy, tôi nghĩ Khloe Kardashian có thể có ít hơn. + +63 +00:04:42,320 --> 00:04:47,340 +Ồ. Vì vậy, hãy nói, tôi đoán Dwayne Johnson một lần nữa trong trường hợp này. + +64 +00:04:47,630 --> 00:04:54,110 +Bây giờ, nếu tôi hiểu đúng, Taylor Swift, người từng ở vị trí B giờ đã được chuyển sang vị trí A, sẵn sàng + +65 +00:04:54,140 --> 00:04:55,310 +cho vòng tiếp theo. + +66 +00:04:55,820 --> 00:04:58,540 +Vì vậy, đây là một vấn đề khác mà chúng tôi phải giải quyết. + +67 +00:04:59,180 --> 00:05:06,980 +Vì vậy, trò chơi không chỉ phải lặp lại, chúng ta còn phải có một số cách để làm cho + +68 +00:05:06,980 --> 00:05:13,580 +tài khoản ở vị trí B trở thành tài khoản tiếp theo ở vị trí A. + +69 +00:05:14,210 --> 00:05:21,350 +Và cuối cùng, hãy lưu ý rằng giữa các hiệp đấu, nếu tôi làm đúng hoặc nếu tôi sai, toàn bộ trò chơi thực sự + +70 +00:05:21,350 --> 00:05:27,560 +xóa tiến trình trước đó ngoài việc cho tôi biết rằng tôi đã làm đúng và điểm số hiện tại của + +71 +00:05:27,560 --> 00:05:28,010 +tôi + +72 +00:05:28,520 --> 00:05:30,470 +và nó hiển thị mọi thứ mới. + +73 +00:05:30,470 --> 00:05:33,690 +Nó không lộn xộn trên màn hình và tôi phải cuộn xuống. + +74 +00:05:34,040 --> 00:05:37,100 +Vì vậy, đó có lẽ là vấn đề cuối cùng mà chúng tôi cần giải quyết. + +75 +00:05:37,100 --> 00:05:38,480 +Vì vậy, hãy xóa màn hình. + +76 +00:05:39,810 --> 00:05:47,520 +Đó là nó, tôi nghĩ bây giờ. Tôi đã chia nhỏ vấn đề lớn này, đó là xây dựng trò chơi này, thành + +77 +00:05:47,520 --> 00:05:52,950 +một loạt các vấn đề nhỏ hơn và khi chúng tôi viết mã, chúng tôi có thể sẽ chia nhỏ chúng hơn nữa. + +78 +00:05:53,640 --> 00:05:59,760 +Đây thực sự là kỹ năng quan trọng mà tôi muốn kiểm tra bạn, có thể thực hiện một dự án lớn, biến nó thành những + +79 +00:05:59,760 --> 00:06:02,830 +vấn đề nhỏ hơn và sau đó giải quyết từng vấn đề một. + +80 +00:06:03,000 --> 00:06:07,740 +Vì vậy, nếu bạn tiến được xa đến mức này và xác định được tất cả các vấn đề cần giải quyết, + +81 +00:06:07,920 --> 00:06:10,320 +bạn đã sẵn sàng nên coi như mình đã thành công. + +82 +00:06:10,950 --> 00:06:16,050 +Bây giờ, giai đoạn tiếp theo, chúng tôi sẽ thử giải quyết từng cái một và có thể tạo ra phiên bản + +83 +00:06:16,050 --> 00:06:17,370 +cuối cùng của trò chơi. + +84 +00:06:19,110 --> 00:06:24,390 +Bắt đầu nào. Bây giờ, điều đầu tiên có lẽ là dễ nhất, vì vậy tôi sẽ + +85 +00:06:24,390 --> 00:06:29,580 +bắt đầu từ đó và thực sự tôi sẽ đi theo thứ tự mà tôi đã viết ra các vấn đề hơn là chọn chúng ra khỏi vấn + +86 +00:06:29,580 --> 00:06:30,180 +đề dễ nhất. + +87 +00:06:30,360 --> 00:06:34,230 +Tôi nghĩ điều này chỉ giúp bạn hiểu dễ dàng hơn những gì đang xảy ra khi tôi viết mã. + +88 +00:06:34,620 --> 00:06:39,780 +Nhưng trong trường hợp của bạn, bạn có thể giải quyết các vấn đề theo bất kỳ thứ tự nào bạn muốn + +89 +00:06:39,780 --> 00:06:45,930 +miễn là phiên bản cuối cùng hoạt động như bạn mong đợi. Để hiển thị tác phẩm sẽ trở thành biểu + +90 +00:06:46,120 --> 00:06:52,730 +tượng bắt đầu, tôi sẽ phải nhập tệp nghệ thuật đó. Và tôi sẽ sử dụng logo từ nghệ thuật nhập khẩu. + +91 +00:06:53,100 --> 00:06:59,460 +Bằng cách này, tôi không cần phải viết nghệ thuật. logo mỗi khi tôi muốn sử dụng nó. Bây giờ tôi có thể đơn giản chỉ cần viết + +92 +00:06:59,460 --> 00:07:00,110 +logo in. + +93 +00:07:00,780 --> 00:07:02,820 +Vì vậy, đó là người đầu tiên được giải quyết. + +94 +00:07:03,030 --> 00:07:03,920 +Điều đó khá dễ dàng. + +95 +00:07:04,290 --> 00:07:05,940 +Một số trong số chúng sẽ khó hơn thế rất nhiều. + +96 +00:07:06,720 --> 00:07:10,110 +Việc tiếp theo là tạo một tài khoản ngẫu nhiên từ dữ liệu trò chơi. + +97 +00:07:10,110 --> 00:07:16,440 +Và hãy nhớ rằng, dữ liệu trò chơi ở đây trong một tệp riêng biệt và dữ liệu được giữ bên trong một biến được gọi là + +98 +00:07:16,470 --> 00:07:16,950 +dữ liệu. + +99 +00:07:17,910 --> 00:07:26,100 +Vì vậy, chúng ta hãy đi đến đầu và chúng ta hãy làm điều tương tự. Vì vậy, từ game_data nhập dữ liệu. Và bây giờ chúng ta có thể sử dụng + +100 +00:07:26,100 --> 00:07:28,950 +dữ liệu đó để tạo một tài khoản ngẫu nhiên. + +101 +00:07:30,300 --> 00:07:36,180 +Để tạo một mục ngẫu nhiên từ danh sách đó, chúng ta phải sử dụng + +102 +00:07:36,180 --> 00:07:45,030 +mô-đun ngẫu nhiên, vì vậy tôi sẽ nhập mô-đun ngẫu nhiên. Và tôi có thể sử dụng mô-đun ngẫu nhiên đó để khai thác vào chức năng lựa chọn và + +103 +00:07:45,420 --> 00:07:48,250 +chuyển vào dữ liệu của tôi, đó là một danh sách. + +104 +00:07:48,630 --> 00:07:54,780 +Vì vậy, chức năng này sẽ lấy danh sách này và sau đó tìm một mục nhập ngẫu nhiên trong đó sẽ cung cấp cho tôi một + +105 +00:07:54,780 --> 00:07:55,800 +tài khoản ngẫu nhiên. + +106 +00:07:56,340 --> 00:08:06,540 +Hãy gọi tài khoản này có thể là tài khoản A và đặt nó bằng đầu ra từ hàm lựa chọn ngẫu nhiên này. + +107 +00:08:07,020 --> 00:08:13,770 +Bây giờ, có lẽ tôi sẽ cần nhiều hơn một tài khoản ngẫu nhiên vì tôi cần so sánh A với B. + +108 +00:08:14,550 --> 00:08:16,580 +Bằng cách gọi lại lựa chọn ngẫu nhiên + +109 +00:08:16,590 --> 00:08:20,490 +trên dữ liệu, tôi đảm bảo rằng tôi nhận được một tài khoản ngẫu nhiên khác. + +110 +00:08:21,510 --> 00:08:27,660 +Vì vậy, tại thời điểm này, chúng tôi đã có tài khoản A và tài khoản B, hy vọng là các tài khoản này khác nhau. + +111 +00:08:27,990 --> 00:08:31,710 +Nhưng nếu bạn muốn, trên thực tế, bạn có thể kiểm tra và chỉ cần đảm bảo. + +112 +00:08:31,770 --> 00:08:38,940 +Vì vậy, nếu tài khoản A bằng tài khoản B, thì trong trường hợp này, bạn đảm bảo rằng tài khoản B được tạo lại. + +113 +00:08:40,860 --> 00:08:47,160 +Thông thường, khi bạn đang viết mã, giải quyết các vấn đề, các vấn đề nhỏ hơn nảy sinh và bạn bắt đầu nghĩ về những gì + +114 +00:08:47,160 --> 00:08:51,210 +có thể xảy ra và bạn cũng bắt đầu giải quyết vấn đề đó bằng mã. + +115 +00:08:52,230 --> 00:08:57,900 +Vì vậy, tôi nghĩ bây giờ chúng ta đã giải quyết xong vấn đề thứ hai này và chúng ta đã sẵn sàng chuyển sang vấn đề tiếp theo. + +116 +00:08:58,560 --> 00:09:02,370 +Hãy định dạng dữ liệu tài khoản để chúng ta có thể in nó ra ở định dạng này. + +117 +00:09:02,550 --> 00:09:07,330 +Vì vậy, tên tài khoản, sau đó là A và sau đó là bất cứ điều gì họ làm, và cuối cùng + +118 +00:09:07,890 --> 00:09:09,930 +là từ đâu và họ đến từ đâu. + +119 +00:09:10,950 --> 00:09:16,350 +Vì vậy, chúng tôi biết rằng dữ liệu của mỗi tài khoản này về cơ bản là một từ điển. + +120 +00:09:16,830 --> 00:09:23,340 +Và chúng tôi biết rằng chúng tôi truy cập từ điển bằng cặp khóa-giá trị. Vì vậy, chúng tôi có thể, chẳng hạn, truy cập vào tên + +121 +00:09:23,340 --> 00:09:24,450 +tài khoản bằng + +122 +00:09:26,290 --> 00:09:33,580 +cách nhấn vào tài khoản ngẫu nhiên, giả sử, tài khoản A, sau đó chúng tôi sử dụng dấu ngoặc vuông đó và sau đó chúng + +123 +00:09:33,580 --> 00:09:37,940 +tôi nhập khóa vào đây, để tôi kiểm tra xem có phải tên không . + +124 +00:09:38,470 --> 00:09:40,060 +Vì vậy, hãy đặt nó ngay tại đây. + +125 +00:09:40,390 --> 00:09:47,230 +Và điều này sẽ đi vào từ điển đó và lấy ra giá trị dưới tên khóa và lưu nó vào biến + +126 +00:09:47,230 --> 00:09:47,740 +này. + +127 +00:09:48,490 --> 00:09:51,820 +Và chúng tôi có thể làm điều tương tự đối với hai phần dữ liệu còn lại mà chúng tôi cần. + +128 +00:09:52,480 --> 00:09:58,330 +Và chỉ cần đảm bảo rằng bạn không có bất kỳ lỗi chính tả nào trong các phím ở đây, vì hãy + +129 +00:09:58,330 --> 00:10:02,560 +nhớ rằng chúng cần phải khớp chính xác các phím này để không bị lỗi. + +130 +00:10:04,230 --> 00:10:11,250 +Bây giờ chúng tôi đã có tất cả các phần dữ liệu này, bây giờ chúng tôi có thể in phiên bản cuối cùng. Vì vậy, chúng tôi có thể sẽ sử dụng + +131 +00:10:11,250 --> 00:10:16,380 +một chuỗi ký tự để chèn tất cả các phần thông tin này và + +132 +00:10:16,380 --> 00:10:27,480 +có thể chúng tôi sẽ bắt đầu với account_name và sau đó là dấu phẩy. Chúng ta có thể viết a và sau đó đưa vào account_desc, cuối + +133 +00:10:27,480 --> 00:10:30,240 +cùng đặt từ và account_country. + +134 +00:10:32,870 --> 00:10:34,110 +Nó khá là nhiều. + +135 +00:10:34,670 --> 00:10:41,720 +Nhưng hãy lưu ý cách tôi đã thực hiện điều này chỉ cho tài khoản A và tôi thực sự phải làm điều + +136 +00:10:41,720 --> 00:10:48,050 +đó cho cả tài khoản A và tài khoản B. Vì vậy, thay vì lặp lại tất cả mã này, có thể sẽ dễ dàng hơn rất nhiều + +137 +00:10:48,050 --> 00:10:50,380 +nếu tôi thực sự rút nó ra thành một hàm riêng biệt. + +138 +00:10:50,780 --> 00:10:52,180 +Vì vậy, hãy tạo điều đó ở đây. + +139 +00:10:52,970 --> 00:10:54,890 +Hãy tạo một hàm thực hiện điều này. + +140 +00:10:55,640 --> 00:11:02,150 +Tôi sẽ biến nó thành một chuỗi tài liệu để giải thích hàm và tôi sẽ gọi hàm + +141 +00:11:02,150 --> 00:11:06,380 +format_data và nó sẽ nhận một đầu vào là tài khoản. + +142 +00:11:07,540 --> 00:11:16,060 +Và bây giờ bằng cách sử dụng tài khoản này, chúng tôi có thể làm cho tài khoản này có thể tái sử dụng nhiều hơn bằng cách xóa _a phần của nó. + +143 +00:11:19,930 --> 00:11:26,320 +Và tất nhiên, chúng ta cần thụt lề mọi thứ để nó thực sự nằm trong hàm này. Và thay vì in kết quả cuối + +144 +00:11:26,320 --> 00:11:30,730 +cùng, tôi sẽ trả lại nó dưới dạng đầu ra. + +145 +00:11:32,150 --> 00:11:40,550 +Vì vậy, bây giờ chúng ta có thể gọi hàm đó ở đây và chúng ta có thể chuyển lần lượt từng tài khoản. Ví dụ, chúng ta có + +146 +00:11:40,550 --> 00:11:46,640 +thể nói print "Compare A:" sẽ là first_account. + +147 +00:11:47,060 --> 00:11:52,970 +Vì vậy, chúng ta sẽ sử dụng chuỗi của mình để chèn dữ liệu mà chúng ta lấy lại từ lệnh gọi hàm của mình. + +148 +00:11:53,360 --> 00:11:56,450 +Và tôi sẽ gọi nó trong câu lệnh in. + +149 +00:11:56,720 --> 00:11:59,690 +Tất nhiên, bạn có thể lấy nó ra và tạo một biến riêng biệt, + +150 +00:11:59,960 --> 00:12:02,940 +nhưng tôi nghĩ điều này phải đủ rõ ràng để xem điều gì đang xảy ra. + +151 +00:12:03,110 --> 00:12:09,770 +Vì vậy, chúng tôi sẽ gọi format_data và chúng tôi sẽ chuyển vào tài khoản A cho dòng đầu tiên này, và sau đó + +152 +00:12:09,770 --> 00:12:11,870 +tôi sẽ làm tương tự cho B. + +153 +00:12:12,410 --> 00:12:18,150 +Vì vậy, trong trường hợp này, tôi sẽ chuyển một tài khoản B và nó sẽ định dạng dữ liệu rồi in ra. + +154 +00:12:18,710 --> 00:12:22,250 +Vì vậy, như tôi luôn nói, bạn nên chạy mã của mình thường xuyên. + +155 +00:12:22,640 --> 00:12:28,010 +Có lẽ bất cứ khi nào bạn giải quyết một vấn đề, bạn có thể nên chạy nó và xem nó có hoạt động theo cách bạn mong đợi hay + +156 +00:12:28,010 --> 00:12:28,370 +không. + +157 +00:12:28,910 --> 00:12:34,340 +Vì vậy, cái đầu tiên, logo sẽ được in. Điều thứ hai, chúng tôi đã quản lý để có được một số + +158 +00:12:34,580 --> 00:12:37,890 +tài khoản ngẫu nhiên vì mỗi khi tôi chạy nó, các tài khoản sẽ khác nhau. + +159 +00:12:38,510 --> 00:12:46,280 +Và cuối cùng, chúng tôi định dạng tài khoản thành định dạng này với tên, mô tả của họ và quốc gia của họ, tất cả đều + +160 +00:12:46,550 --> 00:12:52,730 +được viết ra từ báo cáo in bằng cách sử dụng hàm format_data đáng yêu này mà chúng tôi đã tạo. + +161 +00:12:54,020 --> 00:12:55,540 +Chúng tôi đã làm rất tốt vì + +162 +00:12:55,550 --> 00:12:58,010 +vậy hãy tiếp tục. Bây giờ, tại thời + +163 +00:12:58,010 --> 00:13:04,670 +điểm này, nó chỉ nói so sánh A, so sánh B. Nhưng thay vào đó, sẽ đẹp hơn nhiều nếu chúng ta + +164 +00:13:04,670 --> 00:13:09,320 +có thể đưa nghệ thuật đó vào, nghệ thuật so sánh ASCII ở giữa A và B. + +165 +00:13:10,610 --> 00:13:18,170 +Bây giờ bạn có thể viết lại dòng từ nhập nghệ thuật so với, nhưng thay vào đó, bạn cũng có thể chỉ cần thêm dấu phẩy ở + +166 +00:13:18,170 --> 00:13:19,620 +đây và viết so với. + +167 +00:13:19,760 --> 00:13:26,120 +Vì vậy, bây giờ nó sẽ nhập cả biểu trưng và biểu tượng đó so với nghệ thuật và chúng tôi sẽ đặt nó ngay tại đây. + +168 +00:13:26,120 --> 00:13:27,770 +Vì vậy, chúng tôi sẽ sử dụng một câu lệnh in. + +169 +00:13:28,160 --> 00:13:33,440 +Và thay vì sử dụng một chuỗi bên trong dấu ngoặc kép, chúng ta sẽ viết tên của biến được + +170 +00:13:33,710 --> 00:13:34,940 +gọi là so với. + +171 +00:13:35,450 --> 00:13:41,240 +Và nếu chúng ta xem phiên bản cuối cùng, bạn có thể thấy nó cũng nói so sánh A với B, vì vậy chúng tôi + +172 +00:13:41,240 --> 00:13:43,520 +sẽ thay đổi từ thứ hai thành chống lại. + +173 +00:13:44,480 --> 00:13:50,990 +Và bây giờ khi chúng tôi chạy mã, nó sẽ trông khá giống với điểm bắt đầu của trò chơi cuối cùng của chúng + +174 +00:13:50,990 --> 00:13:51,320 +tôi. + +175 +00:13:52,280 --> 00:14:00,080 +Hãy giải quyết vấn đề tiếp theo. Chúng ta cần hỏi người dùng đoán xem ai có nhiều người theo dõi hơn, phải không? + +176 +00:14:00,620 --> 00:14:07,400 +Vì vậy, tôi thực sự sẽ sao chép chuỗi này ngay tại đây và tôi sẽ đưa nó vào một đầu vào. + +177 +00:14:08,910 --> 00:14:15,930 +Vì vậy, ai có nhiều người theo dõi hơn, A hoặc B, và đầu vào này sẽ trở lại dưới dạng một chuỗi và tôi + +178 +00:14:15,930 --> 00:14:22,980 +sẽ lưu nó bên trong một biến mới có tên là đoán. Bây giờ vì nó yêu cầu họ cho A hoặc B, họ có thể nhập A như thế này "a" hoặc họ + +179 +00:14:22,980 --> 00:14:25,670 +có thể nhập A như thế này "A. 'Tốt nhất, chúng ta + +180 +00:14:26,220 --> 00:14:29,550 +nên làm cho nó không quan trọng những gì họ đã gõ. + +181 +00:14:29,560 --> 00:14:37,520 +Nó sẽ vẫn có giá trị miễn là họ nhập A. Vì vậy, chúng ta có thể chuyển tất cả thành định dạng chữ thường. + +182 +00:14:37,920 --> 00:14:43,200 +Vì vậy, nếu họ viết hoa như thế này, nó sẽ trở nên thấp hơn. Nếu họ gõ nó là chữ thường thì nó đã thấp + +183 +00:14:43,200 --> 00:14:45,180 +hơn và nó cũng sẽ ổn thôi. + +184 +00:14:46,080 --> 00:14:48,010 +Vì vậy, theo cách đó nó nhất quán hơn. + +185 +00:14:48,930 --> 00:14:55,800 +Vì vậy, bây giờ sản phẩm cuối cùng của chúng tôi thực sự trông giống hệt nhau, nhưng nó không thực sự có + +186 +00:14:55,800 --> 00:14:57,470 +nhiều chức năng chơi game. + +187 +00:14:57,960 --> 00:15:04,800 +Để làm được điều đó, chúng ta phải chuyển sang vấn đề tiếp theo và kiểm tra xem người dùng đã hiểu đúng chưa. Để kiểm tra xem họ có làm đúng hay không, + +188 +00:15:04,800 --> 00:15:05,640 +điều đầu + +189 +00:15:05,640 --> 00:15:10,920 +tiên chúng ta cần là biết mỗi người có bao nhiêu người theo dõi, phải không? + +190 +00:15:11,100 --> 00:15:16,350 +Mỗi tài khoản, A và B. Hãy lấy a_follower_count và + +191 +00:15:18,820 --> 00:15:25,710 +điều đó sẽ sử dụng account_a và sau đó lấy ra dữ + +192 +00:15:25,720 --> 00:15:31,090 +liệu dưới key follower_ count. Vì vậy, tôi thực sự sẽ sao chép nó để đảm + +193 +00:15:31,090 --> 00:15:38,650 +bảo rằng tôi chắc chắn không mắc lỗi đánh máy và tôi sẽ nhấn vào account_a và sau đó chuyển khóa follower_count đó nhớ là một chuỗi vì khóa của chúng + +194 +00:15:38,650 --> 00:15:39,640 +tôi là một chuỗi. + +195 +00:15:39,640 --> 00:15:42,970 +Vì vậy, khi chúng ta sử dụng nó cũng phải là một chuỗi bên trong dấu ngoặc kép. + +196 +00:15:43,570 --> 00:15:49,180 +Và tôi sẽ làm tương tự cho b_follower_count từ account_b. + +197 +00:15:49,990 --> 00:15:53,200 +Bây giờ tôi đã giải quyết bước nhỏ bên trong vấn đề. + +198 +00:15:53,500 --> 00:15:57,700 +Bước tiếp theo là sử dụng câu lệnh if để kiểm tra xem người dùng có đúng hay không. + +199 +00:15:58,450 --> 00:16:04,100 +Bây giờ, một lần nữa, tôi nghĩ rằng phần chức năng này sẽ thực sự tốt nếu nó có thể tái sử dụng. + +200 +00:16:04,540 --> 00:16:12,730 +Vì vậy, tôi thực sự sẽ rút ra khỏi dòng chảy chính này của trò chơi và xác định một chức năng riêng biệt ở + +201 +00:16:12,730 --> 00:16:13,480 +trên cùng. + +202 +00:16:14,020 --> 00:16:20,350 +Và hàm này sẽ được gọi là check_answer và + +203 +00:16:20,590 --> 00:16:22,660 +nó sẽ + +204 +00:16:24,760 --> 00:16:27,160 +đoán, a_followers và b_followers. + +205 +00:16:29,560 --> 00:16:31,840 +Và tôi sẽ thêm một số docstrings. + +206 +00:16:33,880 --> 00:16:40,240 +Vì vậy, docstrings thực sự quan trọng, đặc biệt là khi hàm của bạn trả về một thứ gì đó. Ví dụ: trong trường hợp này, nó thực sự + +207 +00:16:40,240 --> 00:16:46,210 +phải nói là lấy dữ liệu tài khoản và trả về định dạng có thể in được. + +208 +00:16:46,210 --> 00:16:50,580 +Điều đó làm cho nó rõ ràng hơn rất nhiều về chức năng này thực sự làm gì, đầu + +209 +00:16:50,980 --> 00:16:56,750 +vào của nó là gì và đầu ra của nó là gì. Trong câu trả lời kiểm tra của chúng tôi, nó sẽ + +210 +00:16:57,010 --> 00:17:02,770 +đưa ra dự đoán của người dùng và số lượng người theo dõi là A và B, sau đó trả về nếu họ + +211 +00:17:02,770 --> 00:17:03,550 +hiểu đúng. + +212 +00:17:04,210 --> 00:17:06,220 +Vì vậy, làm thế nào chúng ta có thể viết điều này? + +213 +00:17:06,430 --> 00:17:09,589 +Bởi vì logic thực sự là một chút khó khăn. + +214 +00:17:10,300 --> 00:17:17,170 +Chúng ta cần kiểm tra xem tài khoản nào có nhiều người theo dõi hơn và sau đó chúng ta cần kiểm tra xem người dùng có thực sự hiểu đúng hay + +215 +00:17:17,170 --> 00:17:17,500 +không. + +216 +00:17:17,530 --> 00:17:19,510 +Vì vậy, nó gần như là một quá trình hai bước. + +217 +00:17:20,560 --> 00:17:25,060 +Và tôi nghĩ trong những trường hợp này, việc phác thảo nó thực sự đáng giá. + +218 +00:17:25,540 --> 00:17:27,890 +Bạn có thể sử dụng một cây bút và một mảnh giấy. + +219 +00:17:27,940 --> 00:17:31,360 +Tôi chỉ đang sử dụng Skitch ngay tại đây để tôi có thể hiển thị nó cho bạn dễ dàng hơn. + +220 +00:17:32,020 --> 00:17:36,460 +Vì vậy, chúng ta chỉ cần xây dựng một loại đơn giản của hai bởi hai ma trận. + +221 +00:17:37,750 --> 00:17:46,990 +Và ở trên cùng, chúng tôi có-- giả sử người dùng đoán là A và một giải pháp thay thế là họ đoán B. + +222 +00:17:48,070 --> 00:17:54,580 +Bây giờ, đây là những suy đoán của người dùng, nhưng sau đó nó sẽ được so sánh + +223 +00:17:54,580 --> 00:18:02,380 +với thực tế thực tế hoặc câu trả lời là A có nhiều người theo dõi hơn B và giải pháp thay + +224 +00:18:02,380 --> 00:18:10,150 +thế là B có nhiều người theo dõi hơn A. Nếu người dùng đoán A và A thực sự có nhiều người theo dõi hơn B, thì họ đã đúng. + +225 +00:18:10,840 --> 00:18:16,000 +Và tương tự, nếu họ đoán B và B thực sự có nhiều người theo dõi hơn A, thì họ + +226 +00:18:16,000 --> 00:18:17,200 +cũng đã hiểu đúng. + +227 +00:18:18,100 --> 00:18:23,530 +Nhưng nếu trường hợp ngược lại, như trong họ đoán là A nhưng thực ra B lại có nhiều người theo dõi hơn thì họ + +228 +00:18:23,530 --> 00:18:24,160 +đã nhầm. + +229 +00:18:24,430 --> 00:18:28,930 +Và nếu họ đoán B và A có nhiều người theo dõi hơn, thì họ cũng sẽ sai. + +230 +00:18:29,560 --> 00:18:34,180 +Bây giờ, bằng cách sử dụng bảng này, bây giờ chúng ta có thể xây dựng câu lệnh if của chúng ta. + +231 +00:18:35,560 --> 00:18:41,650 +Có một phiên bản rất dài của nó, và có một phiên bản ngắn hơn nhiều. Vì vậy, phiên bản rất + +232 +00:18:41,650 --> 00:18:50,260 +dài sẽ kiểm tra một cái gì đó như liệu a_followers lớn hơn b_followers, vì vậy A + +233 +00:18:50,680 --> 00:18:56,860 +có nhiều người theo dõi hơn B và dự đoán bằng A. + +234 +00:18:57,610 --> 00:19:04,090 +Bây giờ bạn có thể thực hiện theo cách này và tạo bốn trong số các câu lệnh if và elif, else. + +235 +00:19:04,630 --> 00:19:07,750 +Nhưng rất dễ bị lạc trong một số logic. + +236 +00:19:08,080 --> 00:19:13,930 +Và nó cũng có nghĩa là bạn phải gõ rất nhiều từ này thay vì sử dụng khác để thay thế. + +237 +00:19:14,530 --> 00:19:23,110 +Vì vậy, tôi nghĩ rằng một cách dễ dàng hơn nhiều là trước tiên hãy kiểm tra xem A có nhiều người theo dõi hơn B hay không, và + +238 +00:19:23,500 --> 00:19:24,850 +trong trường hợp này, bạn + +239 +00:19:24,850 --> 00:19:29,520 +có thể kiểm tra tốt, nếu dự đoán bằng A, thì điều đó có nghĩa + +240 +00:19:29,530 --> 00:19:30,490 +là họ + +241 +00:19:30,490 --> 00:19:36,100 +đã đúng, vì vậy tôi nên quay lại thật. Nhưng nếu điều này không đúng, thì tôi nên trả về false. + +242 +00:19:36,830 --> 00:19:41,760 +Một thay thế và một cách dễ dàng hơn để diễn đạt + +243 +00:19:42,130 --> 00:19:51,430 +điều này là chỉ cần trả về giá trị đoán == a bởi vì khi giá trị này được đánh giá, đoán bằng + +244 +00:19:51,430 --> 00:19:57,620 +a, thì nó sẽ trả về true. Nhưng nếu đoán không phải là A, nếu là B, thì nó sẽ trả về sai. + +245 +00:19:58,360 --> 00:20:00,130 +Vì vậy, đó là một chút khó + +246 +00:20:00,130 --> 00:20:05,830 +khăn trong tâm trí, nhưng nếu bạn thực sự xem qua nó đủ lần, đặc biệt là sử dụng trình gỡ lỗi như Python Tutor để chỉ + +247 +00:20:05,830 --> 00:20:09,490 +xem nó hoạt động như thế nào, thì nó sẽ trở nên khá rõ ràng nhanh chóng. + +248 +00:20:10,780 --> 00:20:19,510 +Trong trường hợp của tôi, tất cả những gì tôi cần làm để thể hiện bảng các khả năng của mình là trước tiên + +249 +00:20:19,510 --> 00:20:27,820 +kiểm tra xem A có lớn hơn B hay không. Bây giờ khác, cụ thể là, nếu điều ngược lại là đúng, B lớn hơn A, thì + +250 +00:20:27,820 --> 00:20:29,890 +tôi sẽ quay lại nếu đoán bằng B. + +251 +00:20:30,640 --> 00:20:36,070 +Vì vậy, bây giờ về cơ bản mã cho biết nếu A có nhiều người theo dõi hơn và + +252 +00:20:36,070 --> 00:20:40,600 +họ đoán A thì trả về true. Nếu B có nhiều người theo dõi hơn và họ đoán B thì trả về true. + +253 +00:20:40,920 --> 00:20:43,870 +Và nếu điều ngược lại xảy ra, thì trả về false. + +254 +00:20:44,530 --> 00:20:49,870 +Về cơ bản, nó sẽ trả về liệu người dùng có đúng câu trả lời hay không. + +255 +00:20:51,390 --> 00:20:59,300 +Bây giờ, về cơ bản chúng ta có thể kiểm tra điều đó tại đây và chúng ta có thể tạo một biến mới có thể là is_correct và + +256 +00:21:00,910 --> 00:21:05,390 +đặt biến đó bằng với kết quả đầu ra của hàm check_answer của chúng ta. + +257 +00:21:05,980 --> 00:21:11,110 +Vì vậy, chúng tôi sẽ gọi nó và chuyển tất cả những thứ cần thiết, phỏng + +258 +00:21:11,110 --> 00:21:17,710 +đoán, những người theo dõi từ A và B. Vì vậy, hãy đoán và sau đó là số lượng a_follower và số b_follower. + +259 +00:21:19,740 --> 00:21:26,250 +Bây giờ, khi chúng tôi biết liệu họ có làm đúng hay không, chúng tôi có thể giải quyết bước tiếp theo, đó là cung cấp cho người dùng một số + +260 +00:21:26,250 --> 00:21:29,990 +phản hồi về các dự đoán của họ. Vì vậy, chúng tôi có thể kiểm tra, + +261 +00:21:30,000 --> 00:21:31,980 +tốt, nếu is_correct-- tốt, trong trường hợp này, chúng tôi + +262 +00:21:32,430 --> 00:21:37,460 +có thể nên in một cái gì đó như "Bạn nói đúng. "Nhưng nếu họ không + +263 +00:21:39,340 --> 00:21:46,270 +hiểu đúng, thì chúng tôi sẽ xin lỗi, điều đó là sai. + +264 +00:21:47,450 --> 00:21:54,370 +Bây giờ, ngoài việc đưa ra phản hồi cho họ, chúng ta có lẽ cũng nên theo dõi điểm số. Vì vậy, chúng tôi có thể bắt + +265 +00:21:54,370 --> 00:21:58,600 +đầu trò chơi của mình với tỷ số không. + +266 +00:21:59,140 --> 00:22:06,380 +Nhưng khi họ tiếp tục chơi và nếu họ làm đúng, thì điểm số sẽ được tăng lên mỗi lần. + +267 +00:22:06,940 --> 00:22:09,250 +Và ngoài việc in ra, "Bạn nói đúng", chúng ta + +268 +00:22:09,520 --> 00:22:12,870 +cũng nên cung cấp cho họ một số phản hồi về điểm số hiện tại. + +269 +00:22:15,010 --> 00:22:23,200 +Và nếu xin lỗi họ đã nhầm thì chúng ta cũng nên cho họ điểm số cuối cùng, vì lúc này trận đấu sắp kết + +270 +00:22:23,380 --> 00:22:27,640 +thúc và họ nên biết mình đã làm tốt như thế nào. + +271 +00:22:29,250 --> 00:22:33,780 +Vì vậy, bây giờ chúng ta hãy tiếp tục và chơi trò chơi của chúng tôi và xem nó có hoạt động không. + +272 +00:22:34,530 --> 00:22:38,340 +Vì vậy, hãy so sánh Cardi B với Kourtney Kardashian. + +273 +00:22:38,880 --> 00:22:46,980 +Tôi nghĩ nó có thể sẽ là B, và nó cho tôi biết bạn đã đúng và điểm số hiện tại xảy ra bên trong dấu + +274 +00:22:46,980 --> 00:22:47,880 +ngoặc nhọn. + +275 +00:22:48,390 --> 00:22:52,650 +Vì vậy, sẽ có rất nhiều gỡ lỗi mà bạn sẽ cần phải thực hiện trong khi viết + +276 +00:22:52,650 --> 00:22:53,010 +mã + +277 +00:22:53,340 --> 00:22:55,710 +này và có thể bạn sẽ mắc rất nhiều lỗi. + +278 +00:22:55,710 --> 00:22:58,260 +Nhưng tất cả mọi người đều làm chúng, kể cả tôi. + +279 +00:22:59,180 --> 00:23:05,090 +Nếu chúng tôi làm đúng, chúng tôi nhận được phản hồi, bạn đúng và điểm số hiện tại. Nếu chúng ta hiểu sai, thì chúng ta + +280 +00:23:05,300 --> 00:23:07,630 +sẽ nhận được câu trả lời Xin + +281 +00:23:07,910 --> 00:23:09,320 +lỗi, sai rồi. + +282 +00:23:09,350 --> 00:23:10,810 +Và cả điểm số cuối cùng. + +283 +00:23:12,180 --> 00:23:13,990 +Đó là tất cả hoạt động cho đến nay. + +284 +00:23:14,580 --> 00:23:20,940 +Bây giờ chúng ta phải tìm ra một số cách để làm cho trò chơi có thể lặp lại. Và, như bạn có thể nhớ, điều đó + +285 +00:23:20,940 --> 00:23:24,360 +thường yêu cầu một số loại vòng lặp while. + +286 +00:23:24,930 --> 00:23:30,210 +Nhưng điều quan trọng là phải nghĩ xem phần nào trong trò chơi của chúng ta + +287 +00:23:30,210 --> 00:23:34,170 +thực sự lặp lại, đúng không? Bởi vì khi chúng tôi chơi trò chơi, nó giống như mọi thứ đều ở dạng tĩnh. + +288 +00:23:34,560 --> 00:23:41,430 +Nhưng nếu chúng ta nghĩ về nó, điểm số được đặt thành 0 có lẽ không thể lặp lại, nhưng các tài khoản + +289 +00:23:41,430 --> 00:23:46,110 +có thể cần được tạo và chúng cần được ngẫu nhiên hóa một lần nữa. + +290 +00:23:46,590 --> 00:23:53,070 +Và sau đó chúng ta cần hỏi lại người dùng, so sánh A với B và sau đó yêu cầu họ nhập liệu và sau đó kiểm tra câu + +291 +00:23:53,070 --> 00:23:53,690 +trả lời. + +292 +00:23:53,910 --> 00:23:56,900 +Vì vậy, tất cả phần còn lại của điều này có lẽ cần được lặp lại. + +293 +00:23:57,270 --> 00:24:01,440 +Vì vậy, tôi sẽ nói mọi thứ từ đây có lẽ nên nằm trong vòng lặp while của chúng tôi. + +294 +00:24:02,010 --> 00:24:04,860 +Vậy vòng lặp while của chúng ta sẽ kiểm tra điều gì? + +295 +00:24:05,490 --> 00:24:14,420 +Chà, có lẽ chúng ta có thể tạo một cờ như game_should_continue và bắt đầu như sự thật. + +296 +00:24:15,000 --> 00:24:20,700 +Và sau đó, trong khi điều đó vẫn đúng, thì chúng tôi sẽ lặp lại tất cả mã này bên dưới. + +297 +00:24:22,540 --> 00:24:28,660 +Vì vậy, hãy thụt lề đó vào vòng lặp while. Bây giờ, tại điểm nào điều này nên trở thành sai? + +298 +00:24:29,140 --> 00:24:32,940 +Chà, họ có thể tiếp tục miễn là họ có câu trả lời + +299 +00:24:33,280 --> 00:24:36,530 +đúng, nhưng trò chơi kết thúc ngay khi họ sai. + +300 +00:24:37,060 --> 00:24:38,800 +Đây là điểm mà chúng tôi sẽ thay + +301 +00:24:38,950 --> 00:24:43,510 +đổi game_should_continue thành false để khi nó in "Xin lỗi, sai rồi. + +302 +00:24:43,510 --> 00:24:45,250 +“Trò chơi sắp kết thúc. + +303 +00:24:46,390 --> 00:24:50,770 +Bây giờ chúng ta hãy thử chạy trò chơi và xem liệu chúng ta có thể tự lặp lại vòng lặp của mình không. + +304 +00:24:51,550 --> 00:24:58,390 +Tôi sẽ chọn A, và bạn có thể thấy mình đúng, điểm hiện tại là một. Và bây giờ nó bảo tôi so + +305 +00:24:58,420 --> 00:25:04,420 +sánh A là một người ngẫu nhiên mới với B, một người ngẫu nhiên mới. + +306 +00:25:05,200 --> 00:25:12,340 +Miễn là tôi làm đúng, nó sẽ cho phép tôi tiếp tục chơi trò chơi. Nhưng ngay sau khi tôi hiểu sai, vì vậy tôi + +307 +00:25:13,090 --> 00:25:18,720 +khá chắc chắn rằng National Geographic đáng buồn là không có nhiều người theo dõi như Kim Kardashian. + +308 +00:25:19,000 --> 00:25:21,900 +Vì vậy, tôi nghĩ điều này sẽ khiến tôi thoát khỏi trò chơi. + +309 +00:25:22,420 --> 00:25:23,370 +Xin lỗi, sai rồi. + +310 +00:25:23,380 --> 00:25:28,060 +Điểm cuối cùng của bạn là ba, và như bạn có thể thấy, trò chơi của tôi bây giờ đã kết thúc. + +311 +00:25:28,900 --> 00:25:35,080 +Nhưng hãy chú ý làm thế nào trong phiên bản cuối cùng của trò chơi, số đếm ở vị trí B thực sự trở thành số + +312 +00:25:35,080 --> 00:25:37,120 +ở vị trí A trong vòng tiếp theo. + +313 +00:25:37,510 --> 00:25:40,750 +Vì vậy, loại trò chơi tiếp tục như thế này. + +314 +00:25:41,080 --> 00:25:48,520 +Và sau đó một khi tôi đoán được điều này, Kim Kardashian giờ sẽ trở thành người ở vị trí A và nó sẽ tiếp + +315 +00:25:48,520 --> 00:25:50,680 +tục miễn là tôi làm đúng. + +316 +00:25:51,310 --> 00:25:55,780 +Vì vậy, bây giờ chúng tôi cần mã chức năng này vào chương trình của chúng tôi. + +317 +00:25:56,410 --> 00:25:57,580 +Ngay từ đầu, chúng + +318 +00:25:57,580 --> 00:26:05,080 +tôi tạo một tài khoản ngẫu nhiên A và một tài khoản B ngẫu nhiên. Nhưng thay vào đó, điều chúng tôi muốn xảy ra là chúng tôi + +319 +00:26:05,080 --> 00:26:10,670 +muốn đảm bảo rằng tài khoản ở vị trí B trở thành tài khoản tiếp theo ở vị trí A. + +320 +00:26:11,050 --> 00:26:18,520 +Vì vậy, khi trò chơi này đã chạy hết và chúng tôi quay lại từ đầu một lần nữa, tài khoản A + +321 +00:26:18,910 --> 00:26:26,710 +sẽ trở thành phiên bản trước đó của tài khoản B. Nhưng điều này rõ ràng sẽ cho chúng + +322 +00:26:26,710 --> 00:26:35,380 +ta một lỗi vì không có tài khoản B trước đó. Vì vậy, những gì chúng tôi có thể làm là chúng tôi thực sự có thể loại bỏ điều này ra khỏi + +323 +00:26:35,380 --> 00:26:45,400 +vòng lặp và nói rằng tài khoản B bằng một sự lựa chọn ngẫu nhiên của dữ liệu và tài khoản A trở thành tài khoản B. Nhưng sau đó tài khoản thực tế B sẽ + +324 +00:26:45,400 --> 00:26:50,240 +là một tài khoản ngẫu nhiên mới. + +325 +00:26:50,770 --> 00:26:53,640 +Hãy chơi trò này trong đầu chúng ta như một chiếc máy tính. + +326 +00:26:54,070 --> 00:27:00,160 +Điều đầu tiên xảy ra khi trò chơi bắt đầu lần đầu tiên là chúng + +327 +00:27:00,160 --> 00:27:07,450 +tôi tạo một tài khoản B ngẫu nhiên. Bây giờ tài khoản đó trở thành tài khoản A và sau đó tài khoản B trở thành một tài khoản ngẫu nhiên mới. + +328 +00:27:08,140 --> 00:27:12,400 +Bây giờ khi trò chơi lặp lại, nó sẽ không chạm vào các phần này của mã. + +329 +00:27:12,400 --> 00:27:14,140 +Nó sẽ bắt đầu từ đây. + +330 +00:27:14,620 --> 00:27:23,410 +Vì vậy, bây giờ tài khoản A sẽ được thay thế bằng tài khoản B trước đó và tài khoản B mới này sẽ là một + +331 +00:27:23,410 --> 00:27:25,260 +tài khoản ngẫu nhiên mới. + +332 +00:27:25,660 --> 00:27:28,580 +Nhưng nếu tài khoản ngẫu nhiên mới vẫn là tài khoản cũ thì sao? + +333 +00:27:28,870 --> 00:27:32,740 +Làm cách nào để chúng tôi có thể lấy mã để tiếp tục kiểm tra cho đến khi tìm thấy một tài khoản khác? + +334 +00:27:33,010 --> 00:27:37,840 +Chà, chúng ta có thể thay thế câu lệnh if bằng một vòng lặp while, sau đó mã sẽ tiếp tục kiểm tra cho đến khi + +335 +00:27:37,840 --> 00:27:39,070 +chúng không còn bằng nhau nữa. + +336 +00:27:39,310 --> 00:27:45,130 +Và theo cách này, khi chúng tôi chạy mã của mình, bạn có thể thấy rằng miễn là tôi trả + +337 +00:27:47,800 --> 00:27:55,360 +lời đúng, thì tài khoản B trước đó trở thành tài khoản A mới và tài khoản B bây giờ trở thành tài khoản ngẫu nhiên mới. + +338 +00:27:57,620 --> 00:28:03,800 +Đó là khá nhiều chức năng được sắp xếp, phải không? Nhưng chúng tôi có một vài thứ cần thu dọn. + +339 +00:28:03,980 --> 00:28:10,850 +Một là chúng tôi cần xóa màn hình giữa các vòng chơi của mình để chúng tôi biết rằng chúng tôi + +340 +00:28:10,850 --> 00:28:14,870 +có thể nhập chức năng rõ ràng từ mô-đun chiếu sáng. + +341 +00:28:17,570 --> 00:28:24,350 +Nhưng đây là một câu hỏi, bạn gọi nó ở đâu? Bởi vì nếu bạn gọi nó ở đầu vòng + +342 +00:28:24,710 --> 00:28:31,810 +lặp, như ở đây, thì điều sẽ xảy ra là logo của bạn sẽ không bao giờ được hiển thị. + +343 +00:28:32,300 --> 00:28:37,460 +Ngoài ra, khi bạn thực sự nhận được câu trả lời chính xác, giống như chúng ta sẽ làm ở đây, kết quả + +344 +00:28:39,320 --> 00:28:47,240 +sẽ không được hiển thị vì kết quả được hiển thị ở cuối vòng lặp while này. Và sau khi hoàn tất, nó sẽ lặp lại theo + +345 +00:28:47,240 --> 00:28:52,010 +cách trở lại đây và nó sẽ xóa mọi thứ trong bảng điều khiển. + +346 +00:28:52,370 --> 00:28:55,350 +Và đó là tất cả những gì sẽ xảy ra trong một tích tắc của giây. + +347 +00:28:55,350 --> 00:28:57,060 +Vì vậy, người dùng sẽ không thực sự nhìn thấy nó. + +348 +00:28:57,620 --> 00:28:59,860 +Vì vậy, chúng ta cần phải di chuyển chức năng rõ ràng này. + +349 +00:29:00,410 --> 00:29:08,570 +Tôi nghĩ, thời điểm lý tưởng để thực sự thể hiện điều đó là ngay trước khi họ chuẩn bị thấy kết quả của hành động của + +350 +00:29:08,570 --> 00:29:09,130 +mình. + +351 +00:29:09,500 --> 00:29:11,000 +Vì vậy, một nơi nào đó ở đây. + +352 +00:29:11,570 --> 00:29:18,020 +Vì vậy, bây giờ, khi chúng tôi đã hỏi người dùng những gì chúng tôi cần hỏi và chúng tôi đã có câu trả lời của họ, chúng tôi xóa màn hình và sau + +353 +00:29:18,290 --> 00:29:20,090 +đó chúng tôi hiển thị cho họ kết quả. + +354 +00:29:20,450 --> 00:29:21,890 +Bây giờ chúng ta + +355 +00:29:21,890 --> 00:29:29,350 +sẽ thấy logo, chúng ta sẽ thấy tất cả những gì so với A và B, hãy chọn B và chúng ta đã làm đúng. + +356 +00:29:29,510 --> 00:29:31,550 +Vì vậy, chúng tôi cũng nhận được phản hồi đó. + +357 +00:29:31,820 --> 00:29:34,910 +Nó xóa màn hình và chúng tôi có một so sánh mới để thực hiện. + +358 +00:29:36,390 --> 00:29:42,240 +Bây giờ, điều duy nhất bạn sẽ nhận thấy là logo biến mất trong mỗi vòng kế tiếp. + +359 +00:29:42,840 --> 00:29:46,890 +Có thể sẽ rất vui khi được xem nó ngay cả khi chúng ta sẽ vào vòng trong. + +360 +00:29:47,340 --> 00:29:54,210 +Vì vậy, để làm điều đó, chúng tôi phải in logo ngay sau khi chúng tôi xóa màn hình ngay tại đây. + +361 +00:29:55,650 --> 00:30:02,370 +Vì vậy, bây giờ, mặc dù chúng tôi đã xóa màn hình, chúng tôi vẫn có thể nhìn thấy logo một lần nữa miễn là chúng tôi có câu + +362 +00:30:02,370 --> 00:30:03,370 +trả lời chính xác. + +363 +00:30:04,530 --> 00:30:05,920 +Thats tất cả để có nó. + +364 +00:30:06,060 --> 00:30:12,960 +Hiện chúng tôi đã hoàn thành tất cả các chức năng trong phiên bản cuối cùng của trò chơi và phải mất khá nhiều + +365 +00:30:12,960 --> 00:30:14,160 +mã khi kết thúc. + +366 +00:30:14,490 --> 00:30:20,400 +Nhưng miễn là bạn chia nhỏ nó thành những thành phần nhỏ hơn này, thì từng thành phần và từng + +367 +00:30:20,400 --> 00:30:23,400 +vấn đề sẽ dễ giải quyết hơn rất nhiều. + +368 +00:30:23,640 --> 00:30:26,820 +Tôi hy vọng bạn thích xây dựng trò chơi này và bạn vui vẻ khi chơi với nó. + +369 +00:30:27,360 --> 00:30:29,250 +Tôi hy vọng bạn thích xây dựng trò chơi này. + +370 +00:30:29,250 --> 00:30:31,110 +Và hẹn gặp lại các bạn vào bài học tiếp theo. + diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/003 Study Tip Set Reminders in Your Calendar to Review.mp4 b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/003 Study Tip Set Reminders in Your Calendar to Review.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5a5a345d03024875ea86a318d89abc7cea78e058 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/003 Study Tip Set Reminders in Your Calendar to Review.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b170e9a578a28bd94cc81990bb789dcdf93551d28eda0a0e40181d3d9d259094 +size 40901487 diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/003 Study Tip Set Reminders in Your Calendar to Review_vi.srt b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/003 Study Tip Set Reminders in Your Calendar to Review_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4a125a22dcd26e260d9d864dac1ae6bbadaea711 --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/003 Study Tip Set Reminders in Your Calendar to Review_vi.srt @@ -0,0 +1,60 @@ +1 +00:00:01,160 --> 00:00:10,070 +Hoàn thành tốt ngày 14. Bây giờ, tôi có một mẹo học tập cho bạn hôm nay và mẹo học tập đó là + +2 +00:00:10,070 --> 00:00:12,580 +tất cả về việc đưa mọi thứ vào lịch. + +3 +00:00:13,130 --> 00:00:18,380 +Vì vậy, giả sử rằng bạn hoàn thành một trong những ngày và trong một trong những bài tập, bạn gặp khó khăn và + +4 +00:00:18,380 --> 00:00:19,540 +bạn phải xem giải pháp. + +5 +00:00:19,970 --> 00:00:20,500 +Đừng lo lắng, điều + +6 +00:00:20,510 --> 00:00:21,590 +đó không có nghĩa là bạn đã thất bại. + +7 +00:00:21,620 --> 00:00:23,170 +Điều đó chỉ có nghĩa là bạn đang học. + +8 +00:00:24,020 --> 00:00:30,500 +Nhưng điều quan trọng là khi bạn nhìn vào giải pháp, bạn thực sự chắc chắn rằng bạn hiểu nó. + +9 +00:00:30,710 --> 00:00:36,860 +Vì vậy, không chỉ đọc mã, mà có thể Google một số thứ xung quanh nó, có thể xem lại một số bài giảng, đảm bảo + +10 +00:00:36,860 --> 00:00:39,980 +rằng nó có ý nghĩa và bạn hiểu những gì đang xảy ra. + +11 +00:00:40,520 --> 00:00:48,950 +Sau đó, vào lịch của bạn và lên lịch để quay lại sau một tuần và thực hiện lại bài tập hoặc thử thách viết mã đó. + +12 +00:00:49,520 --> 00:00:55,100 +Tại thời điểm đó, hy vọng rằng bạn đã thể hiện và tiếp thu tất cả kiến thức và bạn hiểu những gì + +13 +00:00:55,250 --> 00:00:59,250 +đã xảy ra lần trước để bạn có thể hoàn thành nó trong lần đầu tiên. + +14 +00:01:00,170 --> 00:01:01,460 +Vì vậy, đó là mẹo của tôi dành cho bạn. + +15 +00:01:01,790 --> 00:01:07,280 +Hãy ghi mọi thứ vào lịch để xem lại nếu bạn gặp khó khăn, và điều đó sẽ giúp bạn vượt qua nhiều rào cản hơn. + diff --git a/part2/14 - Day 14 - Beginner - Higher Lower Game Project/external-links.txt b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d0039e6dfadfeedfb0be2f9693e224f84dfe86dd --- /dev/null +++ b/part2/14 - Day 14 - Beginner - Higher Lower Game Project/external-links.txt @@ -0,0 +1,15 @@ + +001 Fork-the-Day-14-Starting-Repl +https://repl.it/@appbrewery/higher-lower-start + +001 Try-out-the-Online-Higher-Lower-Game +http://www.higherlowergame.com/ + +001 Day-14-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/higher-lower-final?v=1 + +002 Day-14-Ending-Code +https://repl.it/@appbrewery/higher-lower-final + +002 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Installing Python Locally on Your Computer.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Installing Python Locally on Your Computer.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a6b556a45efe4f70ef03c36e40e27a6d8ceb14da --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Installing Python Locally on Your Computer.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ef383dc35deeb5b2aece82eecf8633961739e18bdc47ff388410607e2e84204 +size 44968879 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Installing Python Locally on Your Computer_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Installing Python Locally on Your Computer_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4eda6134348c04790e4d21a4cc89cf645f8c19a3 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Installing Python Locally on Your Computer_vi.srt @@ -0,0 +1,232 @@ +1 +00:00:00,270 --> 00:00:03,390 +Xin chào, chào mừng bạn trở lại với 100 ngày viết mã. + +2 +00:00:03,990 --> 00:00:11,090 +Đây là Angela từ App Brewery, và hôm nay là ngày 15, nơi chúng tôi sẽ thiết lập môi trường phát triển cục bộ + +3 +00:00:11,160 --> 00:00:15,780 +cho Python và chúng tôi sẽ xây dựng một dự án Máy pha cà phê. + +4 +00:00:16,470 --> 00:00:17,850 +Vì vậy, khi chúng tôi thiết + +5 +00:00:17,850 --> 00:00:23,390 +kế khóa học, chúng tôi thực sự muốn bạn bắt đầu và chạy nhanh nhất có thể và bắt đầu viết mã ngay lập tức. + +6 +00:00:23,880 --> 00:00:30,150 +Nhưng khi dự án của chúng tôi ngày càng trở nên phức tạp hơn, thì việc bắt đầu suy nghĩ về việc thiết lập một môi trường + +7 +00:00:30,150 --> 00:00:32,250 +phát triển phù hợp là thực sự quan trọng. + +8 +00:00:32,880 --> 00:00:38,760 +Bây giờ, nếu bạn là một đầu bếp, thì bạn cần những con dao thực sự sắc bén. Và là một lập trình viên, bạn cần một môi trường phát + +9 +00:00:38,760 --> 00:00:39,440 +triển tốt. + +10 +00:00:39,660 --> 00:00:43,680 +Trong bài học hôm nay, tôi sẽ chỉ cho bạn cách thiết lập IDE yêu thích + +11 +00:00:44,220 --> 00:00:48,000 +của tôi và IDE là viết tắt của Môi trường phát triển tích hợp. + +12 +00:00:48,690 --> 00:00:53,430 +Đây là một phần mềm sẽ giúp bạn khi bạn đang tạo mã của mình và nó + +13 +00:00:53,730 --> 00:00:59,550 +sẽ thực hiện rất nhiều việc cho bạn bao gồm những thứ như tô mã, tìm lỗi trong đó, hướng dẫn + +14 +00:00:59,550 --> 00:01:06,270 +cho bạn về phong cách viết mã của bạn, giúp bạn gỡ lỗi các vấn đề, chỉ làm cho cuộc sống của bạn dễ + +15 +00:01:06,270 --> 00:01:09,630 +dàng hơn khi bạn bắt đầu viết ngày càng nhiều mã. + +16 +00:01:10,260 --> 00:01:14,120 +Đây là thời điểm bạn tốt nghiệp từ một nhà phát triển mới. + +17 +00:01:14,220 --> 00:01:20,280 +Giống như thể bạn đã đi vào núi, bạn đã lấy nước cho người thầy già này trong suốt 20 năm và cuối cùng + +18 +00:01:20,280 --> 00:01:23,310 +ông ấy sẽ chỉ cho bạn cách sử dụng một thanh kiếm. + +19 +00:01:24,030 --> 00:01:27,030 +Đây sẽ tương đương với thanh kiếm của chúng ta. + +20 +00:01:27,630 --> 00:01:32,400 +Bây giờ, về môi trường phát triển, thực sự có rất nhiều thứ để bạn lựa chọn. + +21 +00:01:32,880 --> 00:01:36,340 +Và bạn có thể đã nghe nói về một số trong số này như Jupiter + +22 +00:01:36,360 --> 00:01:36,640 +hoặc + +23 +00:01:36,660 --> 00:01:40,200 +Spider, VS Code và một số trong số chúng mà chúng tôi đã sử dụng như Thonny. + +24 +00:01:40,920 --> 00:01:44,910 +Nhưng cái mà chúng ta sẽ sử dụng là một thứ gọi là PyCharm. + +25 +00:01:45,330 --> 00:01:51,510 +Và đây là Môi trường phát triển thông minh, một IDE, chuyên dùng cho Python. + +26 +00:01:52,020 --> 00:01:58,590 +Công cụ này đã được làm sắc nét đặc biệt cho mã hóa python và đó là thứ mà các chuyên gia sử dụng. Trong các bài học tới, chúng ta sẽ + +27 +00:01:58,590 --> 00:01:59,520 +làm + +28 +00:01:59,520 --> 00:02:01,860 +quen với công cụ này. + +29 +00:02:02,040 --> 00:02:08,389 +Và dần dần, tôi muốn cho bạn thấy nó có thể giúp bạn trở thành một nhà phát triển tốt hơn và hiệu quả hơn như thế nào. + +30 +00:02:09,180 --> 00:02:14,820 +Nhưng trước khi có thể bắt đầu cài đặt PyCharm, trước tiên chúng ta phải cài đặt phiên bản Python + +31 +00:02:15,090 --> 00:02:17,220 +mới nhất trên máy tính của bạn. + +32 +00:02:18,120 --> 00:02:25,110 +Trong tài nguyên của khóa học, bạn có thể tiếp tục và tìm liên kết tải xuống cho Python. Sau đó, khi bạn ở đó, nó sẽ + +33 +00:02:25,110 --> 00:02:29,230 +tự động phát hiện hệ điều hành hiện tại của bạn. + +34 +00:02:29,790 --> 00:02:36,840 +Vì vậy, ở đây tôi đang sử dụng Windows và nó thông báo tải xuống phiên bản mới nhất cho Windows. Và sau đó nếu bạn nhấp vào nút tải xuống + +35 +00:02:36,840 --> 00:02:41,250 +lớn, nó sẽ đảm bảo rằng bạn nhận được phiên bản Python mới nhất. + +36 +00:02:41,820 --> 00:02:46,260 +Bây giờ, nó thực sự là một tệp rất nhỏ, vì vậy sẽ không mất nhiều thời gian để tải xuống. + +37 +00:02:47,070 --> 00:02:51,510 +Và sau khi hoàn tất, hãy tiếp tục và mở nó ra. tập tin exe. + +38 +00:02:52,320 --> 00:02:59,760 +Bây giờ, hãy tiếp tục và đảm bảo rằng hộp kiểm cho Thêm Python 3. 8 đến Đường dẫn được chọn và sau đó để + +39 +00:02:59,760 --> 00:03:01,890 +mọi thứ khác như + +40 +00:03:01,890 --> 00:03:08,740 +cũ và nhấp vào Cài đặt ngay bây giờ. Và đảm bảo rằng bạn có đặc quyền quản trị viên trong khi cài + +41 +00:03:09,390 --> 00:03:15,870 +đặt để bạn phải đăng nhập với tư cách quản trị viên. Và nói có với bất kỳ lời nhắc nào. + +42 +00:03:16,140 --> 00:03:22,590 +Bây giờ, quá trình cài đặt sẽ chỉ mất vài phút. Và sau khi hoàn tất, bạn có thể nhận được một gợi ý ở đây là "Vô hiệu + +43 +00:03:22,590 --> 00:03:25,260 +hóa giới hạn độ dài đường dẫn. "Thấy vậy + +44 +00:03:25,830 --> 00:03:28,710 +thì click vào xem nhé." + +45 +00:03:30,540 --> 00:03:37,610 +Và một lần nữa, hãy nói có cho phép. Và sau đó bạn đã hoàn tất và bạn có thể đóng trình hướng dẫn. Nếu bạn đang sử dụng máy Mac, quá + +46 +00:03:37,650 --> 00:03:39,840 +trình này hầu như giống hệt nhau. + +47 +00:03:40,290 --> 00:03:46,860 +Khi bạn truy cập liên kết từ các tài nguyên khóa học, bạn sẽ tự động thấy nó, hãy tải xuống phiên bản + +48 +00:03:46,860 --> 00:03:48,330 +mới nhất cho Mac. + +49 +00:03:48,870 --> 00:03:53,520 +Và khi quá trình tải xuống hoàn tất, bạn có thể đi qua trình hướng dẫn, + +50 +00:03:53,520 --> 00:03:59,280 +nhấp vào tiếp tục đồng ý với mọi thứ mà họ yêu cầu bạn đồng ý và nhấp vào cài đặt. + +51 +00:04:00,350 --> 00:04:06,200 +Và một lần nữa, bạn cần phải có tài khoản quản trị viên và nhập mật khẩu của mình + +52 +00:04:06,200 --> 00:04:13,430 +để cho phép cài đặt Python trên máy tính của bạn. Sau khi cài đặt xong, nó sẽ mở thư mục này và bạn + +53 +00:04:13,430 --> 00:04:19,100 +sẽ thấy Python 3. 8 hoặc phiên bản mới hơn như 3. 9 hoặc 3. 10. + +54 +00:04:19,519 --> 00:04:25,250 +Nhưng chỉ cần bạn nhìn thấy điều này, thì bạn đã thành công và bạn có thể xóa trình cài đặt khỏi máy tính + +55 +00:04:25,250 --> 00:04:25,890 +của mình. + +56 +00:04:26,570 --> 00:04:32,990 +Vì vậy, bây giờ bạn đã cài đặt thành công Python vào máy tính của mình và chúng tôi đã sẵn sàng để + +57 +00:04:32,990 --> 00:04:36,050 +tiến hành bước tiếp theo. Hãy chuyển sang bài học tiếp + +58 +00:04:36,050 --> 00:04:38,330 +theo và chúng ta sẽ tải xuống và cài đặt PyCharm. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Step-1-Install-Python-3-on-your-Machine.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Step-1-Install-Python-3-on-your-Machine.url new file mode 100644 index 0000000000000000000000000000000000000000..0c39d264b96b29b93eadb5036014e3fb810f9fa4 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/001 Step-1-Install-Python-3-on-your-Machine.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.python.org/downloads/ \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Download PyCharm for Windows or Mac.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Download PyCharm for Windows or Mac.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..739ef1adea762f9e85d0f1f88cb70206f494bbde --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Download PyCharm for Windows or Mac.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4863b80fcc8f86c4355c500af14a7986090b09dbfcff45899c8b8386b8de2b20 +size 8037186 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Download PyCharm for Windows or Mac_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Download PyCharm for Windows or Mac_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..459e3d97ad358eb09322883e8508ed92ce84d239 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Download PyCharm for Windows or Mac_vi.srt @@ -0,0 +1,132 @@ +1 +00:00:00,390 --> 00:00:04,440 +Vì vậy, bây giờ bạn đã cài đặt thành công Python vào máy tính của mình và + +2 +00:00:04,830 --> 00:00:06,870 +chúng tôi đã sẵn sàng để tiến + +3 +00:00:06,930 --> 00:00:11,220 +hành bước tiếp theo, đó là tải xuống PyCharm. Một lần nữa, trong các tài nguyên + +4 +00:00:11,250 --> 00:00:16,140 +của khóa học, bạn sẽ tìm thấy một liên kết đến trang chủ để tải xuống PyCharm. + +5 +00:00:16,710 --> 00:00:18,480 +Và khi bạn đến trang này, + +6 +00:00:18,510 --> 00:00:23,510 +bạn nên nhấp vào nút tải xuống và thao tác này sẽ đưa bạn đến trang tùy chọn. + +7 +00:00:23,820 --> 00:00:27,210 +Bây giờ, ở đây, nó sẽ tự động chọn hệ thống của bạn. + +8 +00:00:27,540 --> 00:00:29,760 +Vì vậy, hiện tại tôi đang sử dụng + +9 +00:00:30,060 --> 00:00:33,090 +máy tính Windows và nó đã tự động được chọn tab Windows. + +10 +00:00:33,330 --> 00:00:36,960 +Và bạn có thể nhấp vào yêu cầu hệ thống để đảm bảo + +11 +00:00:36,960 --> 00:00:41,760 +rằng máy tính của bạn tương thích. Và bạn cũng có thể xem qua hướng dẫn + +12 +00:00:41,820 --> 00:00:44,820 +cài đặt, khá đơn giản. Về cơ bản, nó tải về và chạy. + +13 +00:00:45,270 --> 00:00:47,490 +Vì vậy, có hai phiên bản của + +14 +00:00:47,580 --> 00:00:49,830 +PyCharm; phiên bản chuyên nghiệp và cộng đồng. + +15 +00:00:50,220 --> 00:00:53,760 +Bạn sẽ chọn phiên bản cộng đồng vì nó hoàn toàn miễn phí và là mã + +16 +00:00:53,760 --> 00:00:54,870 +nguồn mở để sử dụng. + +17 +00:00:55,290 --> 00:00:58,680 +Phiên bản chuyên nghiệp có bản dùng thử miễn phí và sau đó bạn + +18 +00:00:58,680 --> 00:01:02,880 +sẽ phải trả phí nhưng phiên bản cộng đồng đã có tất cả các tính năng mà + +19 +00:01:03,060 --> 00:01:07,200 +chúng tôi cần và hơn thế nữa. Sau khi bạn nhấp vào tải xuống, điều đó + +20 +00:01:07,410 --> 00:01:11,970 +sẽ mất một chút thời gian, từ 5 đến 10 phút. Vì vậy, trong khi chờ đợi quá trình đó + +21 +00:01:12,060 --> 00:01:13,920 +chạy, bạn có thể chuyển sang + +22 +00:01:14,190 --> 00:01:17,490 +bài học tiếp theo và tôi sẽ nói về một số tính năng + +23 +00:01:17,490 --> 00:01:22,230 +của PyCharm mà chúng ta có thể mong đợi. Bây giờ, nếu bạn đang sử dụng máy Mac, quá trình này khá giống nhau. + +24 +00:01:22,290 --> 00:01:25,380 +Vì vậy, hãy truy cập liên kết trong tài + +25 +00:01:25,770 --> 00:01:30,540 +nguyên khóa học, nhấp vào tải xuống và tải xuống phiên bản cộng đồng của PyCharm. + +26 +00:01:31,320 --> 00:01:34,920 +Bây giờ, nếu bạn là người dùng Linux, bạn cũng có thể chuyển sang tab Linux. + +27 +00:01:35,430 --> 00:01:36,270 +Và trong khi + +28 +00:01:36,270 --> 00:01:39,720 +ở đây, bạn có thể xem các yêu cầu hệ thống và hướng dẫn cài đặt. + +29 +00:01:40,500 --> 00:01:44,310 +Khi bạn đã sẵn sàng, hãy tiếp tục và nhấp vào nút tải xuống cho + +30 +00:01:44,310 --> 00:01:48,630 +phiên bản cộng đồng, miễn phí và mã nguồn mở, sau đó quá trình tải xuống sẽ bắt đầu. + +31 +00:01:49,170 --> 00:01:52,140 +Và một lần nữa, sẽ mất từ 5 đến 10 phút. + +32 +00:01:52,230 --> 00:01:56,310 +Vì vậy, hãy tải xuống và chuyển sang bài học tiếp theo, nơi tôi muốn cho bạn thấy + +33 +00:01:56,310 --> 00:01:58,260 +một số tính năng tuyệt vời của PyCharm. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Step-2-Download-Install-Pycharm.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Step-2-Download-Install-Pycharm.url new file mode 100644 index 0000000000000000000000000000000000000000..20ca169350c2d5988025a8f54a44e72efce24712 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/002 Step-2-Download-Install-Pycharm.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.jetbrains.com/pycharm/download/ \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 PyCharm's Charming Features (while you wait for the download to finish).mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 PyCharm's Charming Features (while you wait for the download to finish).mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4fc3c3b2f4136d2e734e185ccb44edaecf0103a5 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 PyCharm's Charming Features (while you wait for the download to finish).mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0d6eada34dc607607386087f1959b23cd7dc011802eef98fcd1b5397f98c256 +size 127068381 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 PyCharm's Charming Features (while you wait for the download to finish)_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 PyCharm's Charming Features (while you wait for the download to finish)_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5187c0eb5725a319febb8229ab5bc8a1278c9a7a --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 PyCharm's Charming Features (while you wait for the download to finish)_vi.srt @@ -0,0 +1,792 @@ +1 +00:00:00,480 --> 00:00:05,480 +Cho đến nay, chúng tôi đã sử dụng Repl. nó như là trình soạn thảo mã của chúng tôi và Repl. nó có một số tính + +2 +00:00:06,330 --> 00:00:11,330 +năng tuyệt vời như dễ dàng chia sẻ mã và phân nhánh các bản sao của cùng + +3 +00:00:12,720 --> 00:00:17,370 +một mã để bạn luôn có thể nhận được mã bắt đầu và mã cuối cùng. + +4 +00:00:18,120 --> 00:00:21,090 +Nhưng Repl. nó có những hạn chế của nó. + +5 +00:00:21,600 --> 00:00:26,600 +Và khi bạn ngày càng trở nên nâng cao hơn và bạn bắt đầu xây dựng các dự án + +6 +00:00:26,610 --> 00:00:31,380 +phức tạp hơn, bạn sẽ bắt đầu cảm thấy những ràng buộc của một trình soạn thảo văn + +7 +00:00:31,410 --> 00:00:36,390 +bản đơn giản như Repl. nó. Bây giờ PyCharm là một công cụ được sử dụng bởi các chuyên gia. + +8 +00:00:36,900 --> 00:00:41,280 +Và tôi muốn cho bạn thấy một vài tính năng để bạn có thể tận mắt thấy lý do tại + +9 +00:00:41,280 --> 00:00:44,340 +sao PyCharm lại được các nhà phát triển Python ưa chuộng đến vậy. + +10 +00:00:44,640 --> 00:00:48,450 +Và điều đầu tiên tôi thực sự thích về nó cũng là một điều rất, rất cơ + +11 +00:00:48,840 --> 00:00:53,040 +bản, đó là kiểm tra chính tả các từ tiếng Anh mà bạn sử dụng trong mã của mình. + +12 +00:00:53,610 --> 00:00:55,710 +Điều này chỉ có nghĩa là trong + +13 +00:00:55,710 --> 00:00:59,970 +khi bạn viết mã, bạn đang tạo tên cho các biến, tạo khóa, giá trị hoặc câu + +14 +00:01:00,450 --> 00:01:05,160 +lệnh in của bạn, để đảm bảo rằng tiếng Anh bạn viết, những phần không thực sự là + +15 +00:01:05,160 --> 00:01:09,060 +mã, là thực sự đã được kiểm tra chính tả và bạn sẽ không tin + +16 +00:01:09,240 --> 00:01:12,330 +điều này sẽ cứu được làn da của bạn bao nhiêu lần. + +17 +00:01:13,050 --> 00:01:15,840 +Đây là một ví dụ, một thứ + +18 +00:01:15,840 --> 00:01:19,380 +thực sự, rất nhạy cảm với chính tả là từ điển. + +19 +00:01:19,770 --> 00:01:24,770 +Tất cả chúng ta đều biết điều đó khi chúng ta đang sử dụng từ điển và giả sử chúng ta muốn + +20 +00:01:26,100 --> 00:01:31,100 +in một trong các giá trị từ từ điển của mình. Chúng tôi đang lấy danh bạ của mình và nắm + +21 +00:01:31,860 --> 00:01:36,720 +thông tin chi tiết của James, sau đó chúng tôi đang cố gắng giữ số điện thoại của anh ấy. + +22 +00:01:37,170 --> 00:01:40,230 +Bây giờ, nếu bạn nhập sai, ví dụ: nếu tôi + +23 +00:01:40,230 --> 00:01:44,910 +đã viết số điện thoại mà không có 'e', và tôi cố gắng chạy nó, thì + +24 +00:01:45,090 --> 00:01:47,100 +bạn sẽ thấy, tôi gặp lỗi. + +25 +00:01:47,610 --> 00:01:52,050 +Nhưng việc kiểm tra chính tả sẽ thông báo cho bạn về vấn đề này + +26 +00:01:52,050 --> 00:01:55,590 +trước khi bạn nhấn run. Hãy xem cách này được gạch dưới + +27 +00:01:55,890 --> 00:01:58,890 +bằng dấu ngoặc và nó cho bạn biết rằng có lỗi đánh máy + +28 +00:01:59,310 --> 00:02:02,610 +trong từ phon và bạn có thể nhấp vào thay đổi thành điện thoại. + +29 +00:02:03,360 --> 00:02:06,300 +Và đó chỉ là một gợi ý tinh tế để nói, 'Này, tôi + +30 +00:02:06,570 --> 00:02:10,800 +nghĩ có thể bạn đã nhầm. Chỉ cần DoubleCheck. 'Và thực sự, một khi chúng tôi + +31 +00:02:10,830 --> 00:02:11,970 +khắc phục điều đó, sau + +32 +00:02:12,270 --> 00:02:16,290 +đó chúng tôi sẽ loại bỏ tất cả các vấn đề của mình và mọi thứ hoạt động hoàn hảo. + +33 +00:02:17,070 --> 00:02:22,070 +Tính năng tiếp theo mà tôi thực sự thích là có nhiều không gian hơn để phát triển. + +34 +00:02:23,370 --> 00:02:25,140 +Ý tôi là gì? Chà, chúng + +35 +00:02:25,200 --> 00:02:29,940 +ta thực sự thường có xu hướng có nhiều hơn một tệp mã, phải không? + +36 +00:02:30,210 --> 00:02:30,840 +Ví dụ: giả + +37 +00:02:30,840 --> 00:02:35,840 +sử rằng chúng tôi đã chuyển các địa chỉ liên hệ của mình vào tệp dữ liệu này và thay vào đó chúng tôi + +38 +00:02:37,200 --> 00:02:38,033 +đã nhập tệp đó. + +39 +00:02:38,460 --> 00:02:42,870 +Vì vậy, nó sẽ nói từ danh bạ nhập dữ liệu. + +40 +00:02:43,590 --> 00:02:48,590 +Và bây giờ khi tôi muốn viết mã mọi thứ và tôi muốn nắm giữ một số + +41 +00:02:49,350 --> 00:02:51,840 +thứ nhất định, chẳng hạn như tôi muốn nhận + +42 +00:02:53,190 --> 00:02:57,300 +email của Jenny, thì lý tưởng nhất là tôi muốn xem điều này cạnh + +43 +00:02:57,300 --> 00:02:59,500 +nhau, phải không? Trong PyCharm, tất cả + +44 +00:02:59,710 --> 00:03:03,190 +những gì bạn phải làm để chia đôi màn hình là chỉ cần nhấp + +45 +00:03:03,190 --> 00:03:06,640 +chuột phải vào tệp, sau đó nói tách và di chuyển sang phải. + +46 +00:03:07,390 --> 00:03:10,990 +Và bây giờ đột nhiên bạn có thể nhìn thấy cả hai mặt cùng một lúc. + +47 +00:03:11,230 --> 00:03:16,120 +Điều này có nghĩa là việc tham khảo một số đoạn mã khác khi bạn đang phát triển sẽ dễ dàng + +48 +00:03:16,120 --> 00:03:16,953 +hơn rất nhiều. + +49 +00:03:17,020 --> 00:03:22,020 +Vì vậy, ở đây tôi có thể dễ dàng thấy rằng khóa của Jenny có chữ J viết hoa, vì + +50 +00:03:22,540 --> 00:03:24,430 +vậy tôi phải nhấn vào danh bạ + +51 +00:03:24,730 --> 00:03:28,600 +của mình, nhấn vào khóa Jenny và sau đó nắm giữ email của cô ấy. + +52 +00:03:29,020 --> 00:03:34,020 +Màn hình chia nhỏ này thực sự hữu ích vì mã của bạn ngày càng phức tạp và ngày + +53 +00:03:34,330 --> 00:03:35,890 +càng có nhiều tệp hơn. + +54 +00:03:37,240 --> 00:03:42,240 +Và bây giờ là một tính năng nâng cao khác của IDE so với một trình soạn thảo văn + +55 +00:03:43,300 --> 00:03:46,630 +bản đơn giản như Repl. nó là một linter tích hợp sẵn. + +56 +00:03:47,020 --> 00:03:52,020 +Vậy linter là gì? Chà, một chiếc linter trong cuộc sống thực, + +57 +00:03:52,510 --> 00:03:53,470 +là thứ + +58 +00:03:53,470 --> 00:03:58,470 +có thể nhặt một ít bụi, những mảnh xơ vải khỏi quần áo của bạn, và + +59 +00:04:00,370 --> 00:04:05,370 +trong Lập trình, nó là thứ chọn ra những đoạn mã mà bạn đã viết có + +60 +00:04:05,770 --> 00:04:10,540 +thể không phù hợp với hướng dẫn mẫu. Khi chúng tôi viết mã và chúng tôi đang cố + +61 +00:04:10,570 --> 00:04:15,430 +gắng quyết định, tôi để lại bao nhiêu khoảng trắng giữa các thứ, tôi sử dụng tab hay khoảng trắng, độ + +62 +00:04:15,790 --> 00:04:17,680 +dài dòng tối đa là bao nhiêu, tất + +63 +00:04:18,010 --> 00:04:22,720 +cả những thứ này có thể sẽ không phá vỡ chương trình của bạn, nhưng điều đó có nghĩa là chương + +64 +00:04:23,140 --> 00:04:27,550 +trình của bạn có thể trông khác với chương trình của người khác và bạn chỉ muốn biết quy + +65 +00:04:27,880 --> 00:04:31,630 +ước là gì để bạn có thể giữ cho mã của mình nhất quán với các + +66 +00:04:31,630 --> 00:04:34,480 +nhà phát triển Python khác. Đây là những gì + +67 +00:04:34,480 --> 00:04:36,760 +một hướng dẫn phong cách dành cho. + +68 +00:04:37,030 --> 00:04:41,650 +Và hướng dẫn phong cách mà hầu hết các nhà phát triển Python sẽ tuân theo có + +69 +00:04:41,650 --> 00:04:43,000 +tên là PEP 8. + +70 +00:04:43,600 --> 00:04:47,560 +Và chúng ta đã thấy điều này khi nói về tab so với khoảng trắng. + +71 +00:04:47,860 --> 00:04:48,460 +Ví + +72 +00:04:48,460 --> 00:04:53,460 +dụ, hướng dẫn là một thụt lề phải có bốn dấu cách và thực sự + +73 +00:04:55,360 --> 00:04:57,970 +nó phải là dấu cách trên các tab. + +74 +00:04:58,540 --> 00:05:02,020 +Và sau đó là những thứ khác như độ dài dòng tối + +75 +00:05:02,050 --> 00:05:04,630 +đa để các dòng mã của bạn không + +76 +00:05:04,630 --> 00:05:09,630 +trở nên thực sự, quá dài và khó đọc, hoặc những thứ như có bao nhiêu dòng trống + +77 +00:05:09,970 --> 00:05:14,970 +giữa các hàm và biến trong mã của bạn và tất cả các loại của sự vật. + +78 +00:05:15,340 --> 00:05:20,340 +Đây là một tài liệu rất dài và thực sự rất khó để đọc hết và + +79 +00:05:21,160 --> 00:05:24,040 +nhớ tất cả trong khi bạn đang viết mã. + +80 +00:05:24,550 --> 00:05:28,030 +Nhưng may mắn cho chúng tôi, nếu chúng tôi đang sử dụng PyCharm, nó + +81 +00:05:28,300 --> 00:05:33,070 +sẽ tự động áp dụng các quy tắc và hướng dẫn đó cho mã của chúng tôi và bổ + +82 +00:05:33,430 --> 00:05:36,130 +sung mã của chúng tôi. Ví dụ: nếu tôi + +83 +00:05:36,130 --> 00:05:39,250 +tạo một hàm có tên là my_earch và bên + +84 +00:05:40,030 --> 00:05:41,290 +trong đây + +85 +00:05:41,320 --> 00:05:45,280 +tôi chỉ có hai đầu vào, n1 và n2, sau đó + +86 +00:05:45,820 --> 00:05:50,560 +nó tính tổng bằng cách thêm n1 vào n2 và nó trả về + +87 +00:05:51,220 --> 00:05:55,210 +tổng dưới dạng đầu ra. Bây giờ, sau này, tôi quyết + +88 +00:05:55,420 --> 00:05:59,870 +định gọi hàm của mình, chuyển một số số, có thể nói + +89 +00:05:59,900 --> 00:06:03,470 +là 4 và 5. Bây giờ, trước tiên, hãy chú ý + +90 +00:06:03,500 --> 00:06:08,500 +xem tôi có một số đường nguệch ngoạc màu vàng nhạt ở dưới cả hai dòng này như thế nào. + +91 +00:06:09,200 --> 00:06:12,320 +Và khi tôi di chuột qua nó, vì vậy tôi không cần phải nhấp vào nó. + +92 +00:06:12,350 --> 00:06:16,400 +Tôi chỉ giữ con trỏ ở trên đầu dòng có các ô vuông, bạn + +93 +00:06:16,820 --> 00:06:17,390 +có + +94 +00:06:17,390 --> 00:06:22,390 +thể thấy nó cho tôi biết rằng hướng dẫn PEP 8 chỉ định rằng phải có hai dòng + +95 +00:06:23,210 --> 00:06:25,550 +trống sau định nghĩa lớp hoặc hàm, nhưng + +96 +00:06:25,970 --> 00:06:28,370 +thay vào đó, nó chỉ tìm thấy một dòng. + +97 +00:06:28,880 --> 00:06:32,510 +Vì vậy, về cơ bản những gì nó đang cố gắng nói là hướng + +98 +00:06:32,510 --> 00:06:37,510 +dẫn kiểu nói rằng nên có hai dòng sau và trước mỗi hàm của bạn để mọi thứ + +99 +00:06:38,450 --> 00:06:43,430 +được cách đều hơn và dễ đọc hơn. Và ở đây, khi tôi di chuột qua nó, + +100 +00:06:43,760 --> 00:06:47,150 +bạn có thể thấy nó nói rằng thiếu khoảng trắng sau dấu phẩy. + +101 +00:06:47,570 --> 00:06:50,960 +Vì vậy, hướng dẫn kiểu nói rằng mỗi khi bạn sử dụng dấu phẩy trong mã của + +102 +00:06:51,290 --> 00:06:54,920 +mình, bạn phải luôn có một khoảng trắng. Bằng cách này, nó sẽ dễ đọc + +103 +00:06:54,920 --> 00:06:59,000 +hơn một lần nữa và nó giữ cho mã của bạn nhất quán với các nhà phát triển + +104 +00:06:59,000 --> 00:07:01,460 +Python khác để khi mọi người nhìn vào mã của bạn, + +105 +00:07:01,610 --> 00:07:04,700 +họ có thể thấy rằng bạn đang tuân theo các quy ước tiêu chuẩn. + +106 +00:07:05,210 --> 00:07:09,260 +Nhưng hãy nhớ rằng điều này không ảnh hưởng đến cách mã của bạn chạy. + +107 +00:07:09,650 --> 00:07:13,610 +Ngay cả với tất cả các đề xuất này và các quy tắc hướng dẫn kiểu này không thực sự có + +108 +00:07:13,940 --> 00:07:17,420 +nghĩa là mã của tôi sẽ không hoạt động. Nếu tôi chạy nó, bạn có + +109 +00:07:17,540 --> 00:07:21,350 +thể thấy rằng nó hoạt động hoàn hảo mà không có bất kỳ lỗi nào. + +110 +00:07:21,770 --> 00:07:26,770 +Và vấn đề chỉ là giữ cho mã của bạn gọn gàng và phù hợp với các quy ước mà các + +111 +00:07:27,260 --> 00:07:30,890 +nhà phát triển Python đã đặt ra. Giờ đây, một tính năng nâng + +112 +00:07:30,920 --> 00:07:35,920 +cao khác của IDE so với trình soạn thảo văn bản là khả năng xem lịch sử + +113 +00:07:36,650 --> 00:07:38,270 +địa phương của bạn. + +114 +00:07:39,080 --> 00:07:42,980 +Điều đó có nghĩa là tôi có thể truy cập để hiển thị lịch sử và giống như khi + +115 +00:07:43,550 --> 00:07:47,030 +bạn đang ở trong một trình duyệt, bạn có thể xem lịch sử duyệt web của mình, + +116 +00:07:47,360 --> 00:07:50,450 +ở đây bạn có thể xem tất cả lịch sử mã hóa của mình. + +117 +00:07:50,810 --> 00:07:55,640 +Vì vậy, bạn có thể cuộn ngược lại trong 12 giờ qua và xem các + +118 +00:07:55,640 --> 00:08:00,230 +chỉnh sửa mà bạn đã thực hiện. Ví dụ, vào lúc 13 giờ 4 phút hôm nay, tôi + +119 +00:08:00,650 --> 00:08:05,030 +đã tạo một chức năng hoàn toàn mới này. Vì vậy, đây là tệp hiện tại + +120 +00:08:05,090 --> 00:08:08,150 +và nó trông như thế nào tại thời điểm đó. + +121 +00:08:08,810 --> 00:08:11,390 +Bây giờ di chuyển về phía trước trong tương lai, điều + +122 +00:08:11,600 --> 00:08:16,600 +tiếp theo tôi làm là tôi đã thêm một lệnh gọi hàm mới ở đây và tôi đã thêm một số khoảng + +123 +00:08:17,540 --> 00:08:18,373 +trống ở đây. + +124 +00:08:18,500 --> 00:08:23,000 +Vì vậy, nếu bạn đã gặp một số sự kiện thảm khốc và bạn nhận ra rằng bạn thực + +125 +00:08:23,000 --> 00:08:25,070 +sự đã làm rối tung lên, bạn đã xóa + +126 +00:08:25,370 --> 00:08:29,810 +mọi thứ, bạn luôn có thể cuộn lại các mốc thời gian trước đó và chỉ cần sao chép + +127 +00:08:29,810 --> 00:08:30,643 +và dán mã. + +128 +00:08:30,920 --> 00:08:35,059 +Hoặc bạn có thể hoàn nguyên về thời điểm cụ thể đó. + +129 +00:08:35,690 --> 00:08:40,340 +Bạn có thể tưởng tượng nếu bạn đang viết bài luận của mình và số lần tôi bị + +130 +00:08:40,340 --> 00:08:43,309 +mất bài luận vì máy tính của tôi bị rơi. + +131 +00:08:43,760 --> 00:08:48,500 +Hãy tưởng tượng nếu bạn có khả năng này để chỉ cần cuộn ngược thời gian và tìm một ảnh chụp + +132 +00:08:48,500 --> 00:08:52,910 +nhanh mà bạn thích và sau đó hoàn nguyên mọi thứ trở lại thời điểm đó, điều đó có + +133 +00:08:53,450 --> 00:08:55,830 +thể mạnh đến mức nào? Chà, bây giờ + +134 +00:08:55,860 --> 00:08:59,820 +bạn đã có trong tay điều đó với lịch sử địa phương ở PyCharm. + +135 +00:09:00,480 --> 00:09:05,130 +Giờ đây, một tính năng thực sự tiện dụng khác là khả năng xem + +136 +00:09:05,130 --> 00:09:08,610 +cấu trúc mã của bạn. Thay vì đi tới điều + +137 +00:09:08,640 --> 00:09:11,130 +hướng dự án, nếu tôi nhấp vào ngăn cấu + +138 +00:09:11,580 --> 00:09:16,580 +trúc này ở đây, bạn có thể thấy rằng nó chia nhỏ mã của tôi thành tất cả + +139 +00:09:16,860 --> 00:09:21,180 +các biến và tất cả các hàm. Điều đó có nghĩa là hàm của tôi có + +140 +00:09:21,210 --> 00:09:24,270 +thể được khai báo, bạn biết đấy, hàng trăm dòng ở một nơi + +141 +00:09:24,630 --> 00:09:28,080 +khác, và tôi đang cuộn xung quanh và tôi đang cố gắng tìm ra nó. + +142 +00:09:28,410 --> 00:09:32,490 +Tất cả những gì tôi phải làm là xem xét kỹ lưỡng, đây là chức năng của tôi, và + +143 +00:09:32,730 --> 00:09:33,690 +nếu tôi nhấp vào + +144 +00:09:33,930 --> 00:09:37,860 +nó, tôi sẽ đến thẳng đó và bây giờ tôi có thể chỉnh sửa nó nếu muốn. + +145 +00:09:38,130 --> 00:09:41,040 +Và nếu tôi cần biến jenny_email, thì nó cũng sẽ + +146 +00:09:41,040 --> 00:09:42,630 +đưa tôi đến thẳng đó. + +147 +00:09:42,750 --> 00:09:46,650 +Một khi bạn bắt đầu có rất nhiều biến và rất nhiều hàm, + +148 +00:09:47,010 --> 00:09:48,570 +đây là một cứu cánh. + +149 +00:09:49,320 --> 00:09:53,280 +Bây giờ có rất nhiều tính năng khác mà tôi sẽ cho bạn thấy rằng PyCharm có thể làm + +150 +00:09:53,290 --> 00:09:56,250 +được, nhưng tôi muốn làm dần dần. Hiện tại, đây + +151 +00:09:56,310 --> 00:09:58,380 +là mẹo cuối cùng về PyCharm. + +152 +00:09:58,980 --> 00:10:03,980 +Bất cứ khi nào bạn tạo một biến hoặc một tên hàm và bạn kết thúc việc sử dụng nó + +153 +00:10:04,740 --> 00:10:06,900 +ở nhiều nơi, vì vậy, ví dụ: bạn + +154 +00:10:06,900 --> 00:10:11,340 +có thể gọi my_ functions ở đây và sau đó bạn có thể gọi lại my_ function + +155 +00:10:11,340 --> 00:10:15,270 +để chuyển vào một số tham số khác nhau vào một thời điểm nào đó. + +156 +00:10:15,810 --> 00:10:17,700 +Và sau đó bạn quyết định rằng thực + +157 +00:10:18,120 --> 00:10:21,000 +sự, tôi thực sự không thích cách tôi đặt tên cho chức năng đó. + +158 +00:10:21,420 --> 00:10:26,420 +Sẽ có ý nghĩa hơn nhiều nếu nó được gọi là add vì nó + +159 +00:10:26,970 --> 00:10:31,500 +trả về tổng phải không? Nếu tôi thực hiện việc này theo cách thủ công trong + +160 +00:10:31,500 --> 00:10:32,880 +trình soạn thảo mã, tôi sẽ phải + +161 +00:10:33,150 --> 00:10:37,530 +thêm, và sau đó tất cả các dòng này sẽ bị hỏng và tôi phải tìm tất cả chúng rồi thay đổi + +162 +00:10:37,530 --> 00:10:40,050 +chúng theo cách thủ công. Và điều đó rất đau đớn. + +163 +00:10:40,590 --> 00:10:43,890 +Vì vậy, thay vào đó, những gì bạn có thể làm trong + +164 +00:10:43,980 --> 00:10:48,980 +PyCharm là bạn có thể nhấp chuột phải vào tên hàm hoặc biến của bạn, vào refactor -> rename. + +165 +00:10:50,790 --> 00:10:55,590 +Và bây giờ nó sẽ tìm thấy tất cả những nơi mà hàm này được tạo, nơi nó được + +166 +00:10:55,620 --> 00:10:59,100 +gọi và bây giờ bạn có thể thay đổi nó ở mọi nơi. + +167 +00:10:59,490 --> 00:11:01,080 +Vì vậy, hãy nhấp vào + +168 +00:11:01,560 --> 00:11:06,560 +refactor, và bây giờ nó đã tìm thấy chức năng cần được đổi tên và cũng như tất cả + +169 +00:11:07,440 --> 00:11:10,770 +những nơi mà nó được sử dụng. Vì vậy, nó được sử dụng ở + +170 +00:11:10,770 --> 00:11:13,140 +hai nơi, ở đây trên dòng 11 và đây trên dòng 14. + +171 +00:11:13,560 --> 00:11:18,560 +Vì vậy, bây giờ tôi nhấp vào do refactor và điều sẽ xảy ra là nó sẽ thay đổi tất cả những + +172 +00:11:20,250 --> 00:11:22,590 +nơi mà nó xảy ra. Và nó an + +173 +00:11:22,590 --> 00:11:26,160 +toàn hơn nhiều so với việc chỉ sử dụng tìm và thay thế. + +174 +00:11:26,520 --> 00:11:30,420 +Giả sử rằng tôi đã có một câu lệnh in ở đây cho + +175 +00:11:30,450 --> 00:11:33,090 +biết, um, my_ Chức năng là một hàm. + +176 +00:11:33,990 --> 00:11:37,110 +Và nếu tôi đã sử dụng tìm và thay thế ở nơi + +177 +00:11:37,110 --> 00:11:42,110 +tôi chỉ nói, tốt, my_ Chức năng bây giờ bằng thêm và tôi nhấp vào thay thế tất cả, bây giờ + +178 +00:11:42,420 --> 00:11:47,160 +sẽ thay đổi nó ở tất cả các nơi. Nhưng mặt khác, nếu tôi sử dụng + +179 +00:11:47,160 --> 00:11:49,020 +refactor -> rename, thì nó + +180 +00:11:49,590 --> 00:11:54,590 +sẽ đủ thông minh để biết rằng câu lệnh in này chỉ là văn bản trong + +181 +00:11:55,000 --> 00:11:55,470 +khi + +182 +00:11:55,470 --> 00:11:57,630 +những nơi mà hàm của tôi + +183 +00:11:57,630 --> 00:12:02,630 +được sử dụng và những nơi mà hàm của tôi được khai báo, đó là những + +184 +00:12:02,880 --> 00:12:05,640 +gì Tôi muốn cấu trúc lại và đổi tên. + +185 +00:12:05,820 --> 00:12:09,090 +Và nó khiến tất cả những người ngoài cuộc vô tội được yên. + +186 +00:12:10,080 --> 00:12:15,080 +Có rất nhiều điều thực sự thú vị chưa xảy ra khi chúng tôi bắt đầu làm quen + +187 +00:12:15,120 --> 00:12:18,540 +với việc sử dụng PyCharm. Nhưng như với bất kỳ + +188 +00:12:18,840 --> 00:12:22,530 +công cụ mới nào, bạn sẽ dành một chút thời gian để bắt đầu + +189 +00:12:22,530 --> 00:12:26,190 +sử dụng và làm quen với nó. Bây giờ, khi tôi + +190 +00:12:26,520 --> 00:12:31,520 +đang học cấp 1, tôi vẫn nhớ khoảnh khắc khi tôi tốt nghiệp từ viết + +191 +00:12:32,220 --> 00:12:35,640 +bằng bút chì để viết bằng bút viết tay Berol. + +192 +00:12:36,150 --> 00:12:41,150 +Và đó là một khoảnh khắc thực sự quan trọng trong cuộc đời tôi khi tôi được phép viết + +193 +00:12:41,250 --> 00:12:46,230 +với các công cụ dành cho người lớn. Vì vậy, đây là loại những gì đang xảy ra ngay tại đây. + +194 +00:12:46,560 --> 00:12:48,270 +Chúng tôi sắp chuyển đến PyCharm. + +195 +00:12:48,510 --> 00:12:52,320 +Sẽ mất một chút thời gian để làm quen và học hỏi các sợi dây của chúng ta, nhưng nó + +196 +00:12:52,620 --> 00:12:55,170 +sẽ đưa chúng ta đến gần hơn với mục tiêu của mình. + +197 +00:12:55,710 --> 00:13:00,300 +Hy vọng rằng bây giờ, PyCharm hẳn đã được tải xuống và bạn đã sẵn sàng chuyển sang + +198 +00:13:00,300 --> 00:13:03,450 +bài học tiếp theo mà chúng ta sẽ cài đặt nó. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 Python-PEP8-Style-Guide.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 Python-PEP8-Style-Guide.url new file mode 100644 index 0000000000000000000000000000000000000000..0e7dd6d77a3bbda847099720c1e35ff17f82f13b --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/003 Python-PEP8-Style-Guide.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.python.org/dev/peps/pep-0008/ \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/004 How to Install PyCharm on Windows.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/004 How to Install PyCharm on Windows.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4e70248eaced643818ec919e745c470d8582972e --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/004 How to Install PyCharm on Windows.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68fab91cda59f3e6d26e45359ca3e26f43129ebb886b2d72aaee7f7746bbb211 +size 21466241 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/004 How to Install PyCharm on Windows_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/004 How to Install PyCharm on Windows_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1c285fa7d05dac104ed7d4080293056f805f0740 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/004 How to Install PyCharm on Windows_vi.srt @@ -0,0 +1,156 @@ +1 +00:00:00,480 --> 00:00:02,430 +Bây giờ bạn đã tải xuống PyCharm, chúng tôi đã + +2 +00:00:02,490 --> 00:00:07,320 +sẵn sàng tiếp tục và cài đặt nó vào máy tính của bạn. Bây giờ là video này, tôi sẽ + +3 +00:00:07,350 --> 00:00:11,280 +đi qua tất cả các bước để cài đặt và thiết lập + +4 +00:00:11,280 --> 00:00:13,740 +PyCharm trên Windows. Nếu bạn đang sử + +5 +00:00:13,890 --> 00:00:18,210 +dụng hệ thống Mac, hãy tiếp tục và bỏ qua bài học này và bạn sẽ tìm thấy hướng + +6 +00:00:18,210 --> 00:00:20,970 +dẫn trong bài học tiếp theo. Sau khi bạn tải + +7 +00:00:21,000 --> 00:00:23,370 +xuống xong, hãy tiếp tục và nhấp vào tệp + +8 +00:00:23,490 --> 00:00:27,780 +exe nếu bạn đang chạy trên Windows. Và sau đó bạn chỉ cần + +9 +00:00:27,840 --> 00:00:32,729 +tiếp tục và làm theo trình hướng dẫn. Và nếu bạn muốn có một biểu tượng trên màn hình + +10 +00:00:32,729 --> 00:00:36,750 +của mình, hãy chọn hộp kiểm để thêm trình khởi chạy, sau đó tiếp tục và nhấp vào tiếp theo. + +11 +00:00:37,710 --> 00:00:42,710 +Bây giờ để mọi thứ làm mặc định và nhấp vào cài đặt. Quá trình cài đặt chỉ + +12 +00:00:43,530 --> 00:00:46,830 +mất vài phút. Và sau khi hoàn tất, bạn + +13 +00:00:46,860 --> 00:00:49,020 +có thể tiếp tục và nhấp vào kết thúc. + +14 +00:00:49,440 --> 00:00:54,440 +Bây giờ, bạn có thể nhấp đúp vào biểu tượng để mở chương trình và lần đầu tiên làm như + +15 +00:00:55,140 --> 00:00:59,370 +vậy, bạn sẽ cần đồng ý với chính sách bảo mật và chọn xem bạn có muốn + +16 +00:00:59,370 --> 00:01:03,960 +chia sẻ dữ liệu với họ hay không. Bây giờ bạn có thể chọn kiểu giao diện người dùng + +17 +00:01:04,019 --> 00:01:06,030 +của mình, chế độ tối hoặc chế độ sáng, + +18 +00:01:06,900 --> 00:01:09,900 +sau đó bạn có thể bỏ qua tất cả phần còn lại của thiết lập. + +19 +00:01:11,040 --> 00:01:15,750 +Bây giờ để kiểm tra nó, hãy tiếp tục và tạo một dự án mới và đặt tên + +20 +00:01:15,780 --> 00:01:20,370 +nó là bất cứ thứ gì bạn muốn. Nhưng điều thực sự quan trọng là nhấp vào menu + +21 +00:01:20,370 --> 00:01:25,370 +thả xuống Trình thông dịch dự án và bên dưới trình thông dịch cơ sở mà bạn chọn phiên bản Python + +22 +00:01:26,190 --> 00:01:28,650 +mới nhất mà bạn vừa cài đặt, trong trường hợp của + +23 +00:01:28,980 --> 00:01:33,480 +tôi là Python 38, viết tắt của 3. số 8. + +24 +00:01:34,110 --> 00:01:37,530 +Sẽ mất một vài phút trước khi dự án của bạn được thiết lập. + +25 +00:01:38,100 --> 00:01:41,190 +Và một khi nó xảy ra, bạn có thể thấy + +26 +00:01:41,190 --> 00:01:45,090 +một cửa sổ bật lên nhỏ cho biết điều gì đó về Windows Defender. + +27 +00:01:45,690 --> 00:01:46,710 +Nếu bạn thấy + +28 +00:01:46,740 --> 00:01:51,360 +điều này, hãy tiếp tục và nhấp vào sửa chữa và nhấp vào cấu hình tự động. + +29 +00:01:51,810 --> 00:01:54,690 +Nếu bạn không thấy cửa sổ bật lên này, thì đừng lo lắng về điều đó. + +30 +00:01:55,350 --> 00:02:00,350 +Bây giờ bạn có thể tiếp tục và nhấp chuột phải vào thư mục dự án của mình và chọn + +31 +00:02:02,910 --> 00:02:06,960 +tệp mới, sau đó chọn tệp mới. Bây giờ chúng ta sẽ tạo một tệp mới, tệp + +32 +00:02:07,020 --> 00:02:11,430 +này sẽ được gọi là tệp chính. py Và trong tệp này, + +33 +00:02:11,460 --> 00:02:16,200 +chúng tôi sẽ kiểm tra nó chỉ bằng cách viết hello world sẽ được + +34 +00:02:16,230 --> 00:02:19,500 +in ra bảng điều khiển. Và khi bạn đã hoàn tất, hãy + +35 +00:02:19,530 --> 00:02:24,530 +tiếp tục và nhấp vào Chạy và sau đó chọn chính. tệp py để chạy. + +36 +00:02:26,280 --> 00:02:30,480 +Và bảng điều khiển bây giờ sẽ bật lên và bạn sẽ thấy hello world được in ra. + +37 +00:02:31,290 --> 00:02:31,950 +Đó là nó. + +38 +00:02:31,950 --> 00:02:35,880 +Bạn đã sẵn sàng để bắt đầu làm việc với PyCharm và bạn sẽ có thể sử dụng nó theo cách giống như cách + +39 +00:02:35,880 --> 00:02:37,560 +bạn đã sử dụng Repl. nó. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/005 Installing PyCharm on Mac.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/005 Installing PyCharm on Mac.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3eb91f9fa5e3e128158f1add58065daf220cd16b --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/005 Installing PyCharm on Mac.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c42ced37b8f7f9da7dc13258c0f4616ac3b2e2ca4cde42fdbb1e18d8c0208151 +size 14262354 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/005 Installing PyCharm on Mac_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/005 Installing PyCharm on Mac_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c46da77720659f4e7e726de0ca4e0d4449d4596b --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/005 Installing PyCharm on Mac_vi.srt @@ -0,0 +1,172 @@ +1 +00:00:00,090 --> 00:00:00,930 +Trong video này, tôi + +2 +00:00:00,960 --> 00:00:05,100 +sẽ hướng dẫn chi tiết quá trình cài đặt PyCharm trên Mac. Bây giờ, nếu bạn đang sử dụng + +3 +00:00:05,100 --> 00:00:08,880 +máy tính Windows và đã cài đặt PyCharm, thì bạn có thể bỏ + +4 +00:00:08,940 --> 00:00:10,290 +qua video này. + +5 +00:00:10,890 --> 00:00:13,860 +Vì vậy, bây giờ bạn nên tải xuống trình cài đặt PyCharm. + +6 +00:00:14,250 --> 00:00:17,820 +Vì vậy, hãy tiếp tục và mở tệp DMG. Bây giờ, khi + +7 +00:00:17,820 --> 00:00:22,680 +bạn nhìn thấy cửa sổ này, hãy kéo biểu tượng cho PyCharm + +8 +00:00:22,680 --> 00:00:26,730 +vào thư mục ứng dụng. Và bây giờ bạn có thể chuyển sang tiêu điểm và tìm kiếm PyCharm. + +9 +00:00:27,360 --> 00:00:30,930 +Sau đó, hãy tiếp tục và nhấp vào nó để mở nó lên. Bây giờ, hãy đảm bảo rằng bạn có + +10 +00:00:30,960 --> 00:00:35,960 +đặc quyền của quản trị viên và hãy tiếp tục và nói mở. Và sau đó đồng ý với chính + +11 +00:00:36,240 --> 00:00:40,680 +sách bảo mật và quyết định xem bạn có muốn chia sẻ dữ + +12 +00:00:40,680 --> 00:00:44,310 +liệu với họ hay không. Bây giờ bạn có thể chọn PyCharm chưa + +13 +00:00:44,310 --> 00:00:46,410 +bao giờ được sử dụng và nhấp vào tiếp theo. + +14 +00:00:46,980 --> 00:00:51,480 +Sau đó, bạn có thể chọn giữa chủ đề tối hoặc chủ đề sáng và nhấp vào tiếp theo. + +15 +00:00:52,050 --> 00:00:56,160 +Và sau đó tiếp tục và nhấp vào bỏ qua còn lại và đặt mặc định. + +16 +00:00:57,630 --> 00:01:01,860 +Bây giờ chúng ta có thể tiếp tục và tạo dự án đầu tiên của mình trong PyCharm. + +17 +00:01:02,730 --> 00:01:04,620 +Đặt tên cho dự án của bạn là + +18 +00:01:05,069 --> 00:01:10,070 +bất kỳ thứ gì bạn muốn, nhưng điều thực sự quan trọng là bạn phải nhấp vào menu thả xuống này để kiểm tra xem + +19 +00:01:10,140 --> 00:01:15,140 +trình thông dịch dự án của bạn và đặc biệt là trình thông dịch cơ sở, được đặt thành phiên bản Python mới nhất mà + +20 +00:01:16,020 --> 00:01:20,820 +bạn đã cài đặt, trong trường hợp của tôi là Python 3. số 8. + +21 +00:01:22,080 --> 00:01:24,750 +Bây giờ, nếu bạn đang chạy trên Mac hoặc Linux, bạn + +22 +00:01:24,900 --> 00:01:28,200 +có thể thấy một số phiên bản Python trong danh sách thả xuống đó. + +23 +00:01:28,560 --> 00:01:32,670 +Vì vậy, hãy đảm bảo rằng bạn chọn phiên bản mới nhất mà bạn đã cài + +24 +00:01:32,670 --> 00:01:36,810 +đặt và sau đó nhấp vào tiếp theo. Khi nó đã cấu hình và tạo dự án mới của bạn, đây + +25 +00:01:37,110 --> 00:01:38,310 +là những gì bạn sẽ thấy. + +26 +00:01:38,970 --> 00:01:42,600 +Và bây giờ bạn sẽ vào thư mục dự án của mình, nhấp chuột phải vào + +27 +00:01:42,960 --> 00:01:47,130 +nó, sau đó chuyển đến tệp mới ->. Bây giờ trên máy Mac, nhấp + +28 +00:01:47,130 --> 00:01:49,800 +chuột phải cũng giống như nhấp chuột điều khiển. + +29 +00:01:49,830 --> 00:01:54,120 +Vì vậy, bạn có thể giữ phím điều khiển và sau đó nhấp vào thư mục dự án. + +30 +00:01:54,480 --> 00:01:56,610 +Và một lần nữa, chọn mới, và sau đó tập tin. + +31 +00:01:57,240 --> 00:02:01,500 +Và tệp chúng tôi sẽ tạo sẽ là tệp chính của chúng tôi. py Bây giờ, bên trong + +32 +00:02:01,530 --> 00:02:05,760 +đây, tất cả những gì chúng ta sẽ làm chỉ là in hello world. + +33 +00:02:07,410 --> 00:02:10,680 +Và chúng tôi sẽ chạy mã này và đảm bảo rằng nó hoạt động. + +34 +00:02:11,009 --> 00:02:16,010 +Vì vậy, hãy chạy và sau đó nhấp vào nút chạy này và chọn tệp Python chính + +35 +00:02:18,780 --> 00:02:23,280 +làm tệp bạn muốn chạy và sau đó xuống đây, bạn sẽ thấy tab chạy + +36 +00:02:23,340 --> 00:02:24,690 +đột nhiên bật lên + +37 +00:02:25,200 --> 00:02:29,400 +và bạn sẽ thấy hello world của mình được in trong bảng điều khiển. + +38 +00:02:30,630 --> 00:02:33,690 +Và sau đó nó sẽ nói rằng quá trình hoàn tất với mã thoát + +39 +00:02:33,930 --> 00:02:35,700 +là 0, 0 là thành công, và + +40 +00:02:36,030 --> 00:02:40,380 +điều đó có nghĩa là bạn hiện đã thiết lập xong và bạn đã sẵn sàng để bắt đầu sử + +41 +00:02:40,740 --> 00:02:43,680 +dụng PyCharm như thể nó là bất kỳ trình soạn thảo Python nào khác. + +42 +00:02:44,160 --> 00:02:47,760 +Vì vậy, bất cứ điều gì bạn đã làm trong Repl. nó bây giờ bạn có thể làm trong PyCharm. + +43 +00:02:48,120 --> 00:02:52,650 +Bạn có thể tạo tệp mới, bạn có thể ghi tệp và bạn có thể chạy các tệp đó. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Add-a-Coffee-Emoji-from-Emojipedia.org.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Add-a-Coffee-Emoji-from-Emojipedia.org.url new file mode 100644 index 0000000000000000000000000000000000000000..3ba644c9dd5ff5badc6b1122f9a40848411f90fa --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Add-a-Coffee-Emoji-from-Emojipedia.org.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://emojipedia.org/hot-beverage/ \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Coffee-Machine-Program-Requirements.pdf b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Coffee-Machine-Program-Requirements.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da332d677eb117562c0b719cda5b71c2a152aa40 Binary files /dev/null and b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Coffee-Machine-Program-Requirements.pdf differ diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Day-15-Goal-Press-Play-button-bottom-right-.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Day-15-Goal-Press-Play-button-bottom-right-.url new file mode 100644 index 0000000000000000000000000000000000000000..3647545fe0f3ee8870cec9ebc26a1d142b69a021 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Day-15-Goal-Press-Play-button-bottom-right-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/coffee-machine-final?embed=1&output=1#main.py \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Fork-the-Day-15-Starting-Repl.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Fork-the-Day-15-Starting-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..1579540deb12a947187b71c090d28ea0c18ccc1b --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Fork-the-Day-15-Starting-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/coffee-machine-start \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 How-to-bring-up-the-Emoji-Keyboard-on-Mac.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 How-to-bring-up-the-Emoji-Keyboard-on-Mac.url new file mode 100644 index 0000000000000000000000000000000000000000..97ac780e4b74fda6f8b1e829695331212435d0a2 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 How-to-bring-up-the-Emoji-Keyboard-on-Mac.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://support.apple.com/en-gb/guide/mac-help/mchlp1560/mac \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 How-to-bring-up-the-Emoji-Keyboard-on-Windows-10.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 How-to-bring-up-the-Emoji-Keyboard-on-Windows-10.url new file mode 100644 index 0000000000000000000000000000000000000000..000ff3faa41ce52694900d7655696217d9a5159b --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 How-to-bring-up-the-Emoji-Keyboard-on-Windows-10.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://support.microsoft.com/en-gb/help/4534547/windows-10-keyboard-tips-and-tricks \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Introduction & Requirements for the Coffee Machine Project.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Introduction & Requirements for the Coffee Machine Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f350bfcc3c923b3e880dce86f1259c644a5a00cc --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Introduction & Requirements for the Coffee Machine Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36ee342d121e74cbc616bf46f997179f4743ba3797b0e31bd93353701db6174f +size 84138279 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Introduction & Requirements for the Coffee Machine Project_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Introduction & Requirements for the Coffee Machine Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f152aabff0541b073b4c87b0257d314620089c61 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 Introduction & Requirements for the Coffee Machine Project_vi.srt @@ -0,0 +1,652 @@ +1 +00:00:00,360 --> 00:00:02,850 +Bây giờ bạn nên thiết lập và chạy PyCharm, và cuối + +2 +00:00:03,030 --> 00:00:05,939 +cùng chúng tôi đã sẵn sàng giải quyết dự án hôm nay, + +3 +00:00:06,240 --> 00:00:10,110 +mà chúng tôi sẽ viết trong PyCharm. Bạn vừa được thuê. + +4 +00:00:10,200 --> 00:00:14,250 +Xin chúc mừng, nhưng đầu tiên là vấn đề về cà phê. + +5 +00:00:14,790 --> 00:00:18,750 +Tất cả chúng ta đều biết rằng các lập trình viên không thể làm việc trừ khi họ uống đầy cà phê. + +6 +00:00:19,260 --> 00:00:24,180 +Vì vậy, công ty của bạn đã yêu cầu bạn tạo mã cho một máy pha cà phê. + +7 +00:00:25,050 --> 00:00:29,310 +Bây giờ bạn, rất thông minh, lên mạng và xem xét các máy pha cà phê khác. + +8 +00:00:29,580 --> 00:00:34,380 +Và bạn lưu ý rằng chỉ tốn 230 đô la để mua một chiếc máy pha cà phê, nhưng + +9 +00:00:34,860 --> 00:00:38,310 +bạn sẽ không gian lận đâu. Bạn sẽ tạo ra mọi thứ từ đầu. + +10 +00:00:38,910 --> 00:00:42,960 +Và thật may mắn là chúng ta không thực sự phải xây dựng phần cứng vì chúng ta là lập trình + +11 +00:00:42,990 --> 00:00:43,740 +viên, phải không? + +12 +00:00:43,740 --> 00:00:48,740 +Nhưng chúng tôi sẽ sử dụng máy pha cà phê đời thực này làm nguồn cảm hứng cho máy + +13 +00:00:49,170 --> 00:00:53,670 +pha cà phê ảo của chúng tôi, lưu ý đến các tính năng và khả năng. + +14 +00:00:54,330 --> 00:00:58,770 +Vậy nó nói gì? Tôi đã tìm thấy một số đồ họa tuyệt + +15 +00:00:59,130 --> 00:01:02,130 +vời trên đây cho tôi biết rằng chúng có ba hương vị + +16 +00:01:02,640 --> 00:01:07,170 +hấp dẫn mà tôi đoán là ba nút này, đó là đồng xu hoạt động mà tôi nghĩ + +17 +00:01:07,830 --> 00:01:12,720 +chúng có nghĩa là nó hoạt động bằng đồng xu, và không có nhiều thứ khác mà nó có thể + +18 +00:01:12,720 --> 00:01:13,530 +làm được. + +19 +00:01:13,530 --> 00:01:18,510 +Hãy lấy ví dụ này và chúng ta sẽ tạo ra một phiên bản kỹ thuật số của nó. + +20 +00:01:18,510 --> 00:01:20,880 +Chúng tôi sẽ tạo ra máy pha cà phê của riêng mình. + +21 +00:01:21,330 --> 00:01:25,830 +Và bước đầu tiên chúng ta cần nhân rộng khả năng làm + +22 +00:01:25,830 --> 00:01:30,210 +ba vị nóng. Vì vậy, hương vị chúng tôi sẽ làm là 1. cà phê espresso, + +23 +00:01:30,420 --> 00:01:33,750 +2. latte, và 3. cappuccino. Dưới đây + +24 +00:01:33,750 --> 00:01:36,870 +là công thức pha chế ba loại đồ uống này. + +25 +00:01:37,410 --> 00:01:40,140 +Mỗi loại yêu cầu một lượng nước khác nhau, + +26 +00:01:40,260 --> 00:01:43,470 +một lượng cà phê khác nhau và một lượng sữa khác nhau. + +27 +00:01:43,920 --> 00:01:46,770 +Và họ cũng có một nửa giá khác nhau. + +28 +00:01:47,520 --> 00:01:51,360 +Chúng tôi cũng sẽ lập mô hình tất cả dữ liệu này trong chương trình máy pha cà phê của mình. + +29 +00:01:52,430 --> 00:01:55,040 +Nhưng may mắn cho bạn trong mã bắt đầu, + +30 +00:01:55,100 --> 00:01:58,250 +tôi đã đưa tất cả dữ liệu này vào trong một từ điển. + +31 +00:01:58,550 --> 00:02:00,170 +Vì vậy, bạn không cần phải nhớ điều này, + +32 +00:02:00,470 --> 00:02:03,530 +mặc dù nó có thể hữu ích nếu bạn đang ở nhà và bạn quyết định rằng bạn thực + +33 +00:02:03,530 --> 00:02:07,520 +sự muốn một ly latte thay vì cà phê đen thông thường. Ngoài ra, máy pha cà phê + +34 +00:02:07,520 --> 00:02:10,820 +còn có một số tài nguyên mà nó phải quản lý. + +35 +00:02:11,180 --> 00:02:14,390 +Vì vậy, nó bắt đầu với 300ml nước + +36 +00:02:14,630 --> 00:02:18,050 +trong bể, 200ml sữa và 100 gram cà phê. + +37 +00:02:18,530 --> 00:02:22,970 +Tính năng thứ hai của máy pha cà phê của chúng tôi là nó hoạt động bằng đồng xu. + +38 +00:02:23,450 --> 00:02:28,450 +Vì vậy, chúng tôi sẽ sử dụng tiền xu của Mỹ và chúng có bốn + +39 +00:02:29,060 --> 00:02:31,760 +loại tiền: xu, niken, xu và quý. + +40 +00:02:32,330 --> 00:02:34,520 +Họ cũng đã từng sử dụng đồng đô la như một đồng xu nhưng một + +41 +00:02:34,910 --> 00:02:38,000 +vài năm trước, họ đã ngừng đúc tiền đó. Vì vậy, chúng tôi sẽ không đếm nó và nó + +42 +00:02:38,120 --> 00:02:40,370 +có thể có nghĩa là ít hơn một câu lệnh if đối với chúng tôi. + +43 +00:02:40,880 --> 00:02:45,680 +Để ý xem mỗi đồng tiền này có giá trị gì. Đồng xu có giá trị một xu, niken trị + +44 +00:02:46,040 --> 00:02:49,010 +giá 5 xu và đồng xu 10 xu, và một phần + +45 +00:02:49,040 --> 00:02:51,200 +tư là một phần tư đô la. + +46 +00:02:51,650 --> 00:02:56,650 +Những giá trị này được biểu diễn bằng giá trị thập phân sẽ trông giống như thế này. + +47 +00:02:57,920 --> 00:03:02,620 +Bây giờ đây là phần quan trọng. Hãy nghĩ xem các yêu cầu chương trình của + +48 +00:03:02,650 --> 00:03:05,080 +chúng ta là gì nếu chúng ta chia nhỏ nó ra. + +49 +00:03:05,230 --> 00:03:08,050 +1. Chúng tôi cần máy pha cà phê của mình để có thể in báo cáo. + +50 +00:03:08,440 --> 00:03:11,680 +Nó cần có khả năng cho chúng ta biết nó còn lại những nguồn tài + +51 +00:03:11,710 --> 00:03:14,470 +nguyên nào, còn lại bao nhiêu nước, bao nhiêu sữa, vân vân. + +52 +00:03:14,980 --> 00:03:18,430 +Nếu bạn xem phiên bản hoàn chỉnh của máy pha cà phê, liên + +53 +00:03:18,790 --> 00:03:21,190 +kết này nằm trong tài nguyên khóa học và + +54 +00:03:21,610 --> 00:03:25,780 +bạn có thể tiếp tục và dùng thử phiên bản cuối cùng của máy pha cà phê. + +55 +00:03:26,500 --> 00:03:31,500 +Vì vậy, giả sử rằng chúng tôi muốn có một báo cáo về tất cả các tài nguyên mà máy có. + +56 +00:03:31,990 --> 00:03:36,970 +Tất cả những gì chúng tôi phải làm là nhập báo cáo và chúng tôi có thể xem tất cả các tài nguyên mà chúng tôi có. + +57 +00:03:37,600 --> 00:03:40,030 +Giờ đây, ngoài việc có thể in + +58 +00:03:40,420 --> 00:03:45,400 +báo cáo, chúng tôi cũng muốn có thể kiểm tra xem các nguồn lực có đủ + +59 +00:03:45,400 --> 00:03:50,380 +khi người dùng gọi đồ uống hay không. Bây giờ giả sử rằng người dùng đã quyết định gọi một ly latte. + +60 +00:03:50,950 --> 00:03:55,950 +Nó yêu cầu tôi đưa một số đồng xu và sau đó nó đưa cho tôi tiền lẻ và nó + +61 +00:03:56,530 --> 00:03:59,650 +đưa tôi ly cà phê. Nhưng bây giờ nếu tôi kiểm + +62 +00:04:00,010 --> 00:04:03,520 +tra báo cáo, tôi có thể thấy rằng tôi chỉ còn một trăm triệu nước. + +63 +00:04:03,910 --> 00:04:08,470 +Và tôi biết từ slide trước rằng một ly cà phê sữa và một ly cà phê cappuccino + +64 +00:04:08,470 --> 00:04:12,370 +sẽ cần nhiều hơn lượng nước đó. Vì vậy, hãy xem điều gì sẽ xảy + +65 +00:04:12,400 --> 00:04:16,510 +ra nếu tôi tiếp tục và gọi một cốc cappuccino. Nó nói, xin lỗi, không + +66 +00:04:16,510 --> 00:04:17,800 +có đủ nước. + +67 +00:04:18,279 --> 00:04:23,280 +Vì vậy, chương trình của chúng tôi có thể xem xét tất cả các tài nguyên mà máy có, + +68 +00:04:24,340 --> 00:04:29,340 +kiểm tra công thức của đồ uống mà chúng tôi đang cố gắng tạo ra và cho người dùng + +69 +00:04:29,890 --> 00:04:34,270 +biết nếu thiếu nước hoặc nếu không đủ sữa, và miễn là vì một trong những + +70 +00:04:34,630 --> 00:04:37,390 +nguồn không đủ, nó không thể tạo ra đồ uống và + +71 +00:04:37,630 --> 00:04:42,580 +nó đưa ra phản hồi cho người dùng. Bây giờ, như bạn đã thấy trước đây, chương + +72 +00:04:42,610 --> 00:04:43,720 +trình của chúng tôi + +73 +00:04:44,140 --> 00:04:48,550 +cũng cần có khả năng xử lý tiền xu vì máy của chúng tôi được vận hành + +74 +00:04:48,580 --> 00:04:49,413 +bằng tiền xu. + +75 +00:04:50,170 --> 00:04:54,610 +Vì vậy, không có thanh toán không tiếp xúc ưa thích hoặc thanh toán bằng đồng hồ Apple của bạn, không có điều nào trong số đó. + +76 +00:04:54,700 --> 00:04:57,910 +Chúng tôi chỉ có tiền xu. Khi chúng tôi đặt hàng một thứ + +77 +00:04:58,690 --> 00:05:01,090 +gì đó, nó sẽ yêu cầu chúng tôi đưa tiền vào. + +78 +00:05:01,630 --> 00:05:04,810 +Và nó sẽ yêu cầu số lượng của từng loại tiền xu. + +79 +00:05:05,260 --> 00:05:09,490 +Vì vậy, giả sử rằng tôi chèn mỗi thứ một, thì trong trường hợp + +80 +00:05:09,580 --> 00:05:14,580 +này, thực sự không có đủ tiền để trang trải đồ uống của tôi và nó hoàn + +81 +00:05:14,740 --> 00:05:19,630 +lại tiền và không cho tôi một ly. Nhưng mặt khác, nếu tôi nạp đủ tiền, thì + +82 +00:05:20,410 --> 00:05:25,150 +nó sẽ có thể tính toán tất cả những đồng tiền này trị giá bao nhiêu tiền và + +83 +00:05:25,570 --> 00:05:29,530 +sau đó tính toán lượng tiền lẻ dựa trên chi phí đồ uống của tôi. + +84 +00:05:30,010 --> 00:05:34,480 +Và sau đó nó sẽ đưa cho tôi đồ uống của tôi và bảo tôi hãy thưởng thức. Vì vậy, ngoài việc có + +85 +00:05:34,510 --> 00:05:37,720 +thể xử lý bốn loại tiền, tính toán giá trị + +86 +00:05:37,750 --> 00:05:41,560 +tiền tệ thực tế dựa trên số điểm, cũng nên kiểm tra + +87 +00:05:41,860 --> 00:05:44,500 +xem giao dịch có thành công hay không. + +88 +00:05:44,530 --> 00:05:49,530 +Rằng người dùng đã không cố gắng lừa dối chúng tôi bằng cách không đưa đủ tiền + +89 +00:05:49,540 --> 00:05:53,080 +và yêu cầu đồ uống. Vì vậy, nếu họ không nạp đủ + +90 +00:05:53,350 --> 00:05:55,780 +tiền, thì chúng tôi sẽ hoàn lại tiền cho họ và + +91 +00:05:55,780 --> 00:05:58,970 +nói với họ, xin lỗi vì không đủ tiền và không cho họ uống. + +92 +00:05:59,390 --> 00:06:02,150 +Nhưng nếu giao dịch thành công, thì chúng + +93 +00:06:02,450 --> 00:06:07,040 +ta sẽ pha cà phê. Và trong quá trình pha cà phê, chúng ta + +94 +00:06:07,280 --> 00:06:09,560 +sẽ phải khấu trừ các nguồn tài nguyên. + +95 +00:06:10,070 --> 00:06:12,680 +Hãy để ý cách mỗi lần chúng ta pha đồ uống, + +96 +00:06:12,710 --> 00:06:16,670 +chẳng hạn như lần này chúng ta pha một ly latte và lần trước cho latte, chúng + +97 +00:06:16,700 --> 00:06:20,300 +ta có 300 máy xay sữa. Nhưng sau khi pha cà phê, khi + +98 +00:06:20,330 --> 00:06:24,110 +chúng tôi yêu cầu báo cáo, các bạn có thể thấy rằng nước đã + +99 +00:06:24,110 --> 00:06:25,190 +giảm, sữa đã + +100 +00:06:25,220 --> 00:06:28,840 +giảm, cà phê đã giảm và tiền đã được đưa vào kho bạc. + +101 +00:06:29,690 --> 00:06:32,150 +Chương trình này, mặc dù nó có vẻ đơn giản, + +102 +00:06:32,180 --> 00:06:35,240 +chỉ là một phiên bản kỹ thuật số đơn giản của một máy + +103 +00:06:35,720 --> 00:06:38,420 +pha cà phê, nó thực sự có khá nhiều yêu cầu. + +104 +00:06:38,960 --> 00:06:43,960 +Vì vậy, tôi khuyên bạn nên nhìn vào màn hình và thử xem từng yêu cầu hoạt động như thế + +105 +00:06:44,510 --> 00:06:49,510 +nào bằng cách xem phiên bản cuối cùng của mã. Bây giờ tôi đã tạo một + +106 +00:06:51,080 --> 00:06:56,080 +đặc tả chương trình chi tiết cho bạn dưới dạng tệp PDF mà bạn có + +107 +00:06:56,690 --> 00:06:59,510 +thể tải xuống trong tài nguyên khóa học. + +108 +00:06:59,930 --> 00:07:04,520 +Và điều này sẽ đi sâu vào chi tiết hơn về từng điểm đó. Ví dụ, lời nhắc nên + +109 +00:07:04,520 --> 00:07:08,360 +in gì trong đầu chương trình, sau đó làm thế + +110 +00:07:08,810 --> 00:07:12,020 +nào để tắt máy, cách in báo + +111 +00:07:12,410 --> 00:07:17,410 +cáo và chi tiết từng điểm đó hoạt động như thế nào. + +112 +00:07:19,010 --> 00:07:23,780 +Hãy tiếp tục và tải xuống phần này và đảm bảo rằng bạn đã đọc từng phần và + +113 +00:07:23,780 --> 00:07:27,620 +kiểm tra nó trong phiên bản làm việc cuối cùng của dự án. + +114 +00:07:28,730 --> 00:07:29,810 +Khi bạn đã sẵn sàng, + +115 +00:07:29,870 --> 00:07:34,760 +bạn có thể tiếp tục và chuyển sang phiên bản bắt đầu của mã. Và một lần nữa, tôi đang chia sẻ điều này bằng + +116 +00:07:34,760 --> 00:07:36,560 +cách sử dụng Repl. nó, nhưng + +117 +00:07:36,830 --> 00:07:39,560 +tôi muốn bạn sao chép mọi thứ có trong đây, + +118 +00:07:39,650 --> 00:07:42,290 +chỉ có một tệp chính. tệp py và tôi muốn + +119 +00:07:43,010 --> 00:07:48,010 +bạn tạo một dự án mới bằng PyCharm và gọi nó là máy pha cà phê, + +120 +00:07:48,410 --> 00:07:48,880 +1: + +121 +00:07:48,880 --> 00:07:49,713 +Đúng không? + +122 +00:07:51,940 --> 00:07:56,920 +Và sau đó tạo một tệp mới bên trong dự án của bạn có tên là main. py, và sau đó dán tất cả mã + +123 +00:07:58,750 --> 00:08:03,550 +bắt đầu vào mã chính của bạn. py + +124 +00:08:04,060 --> 00:08:08,260 +Và bây giờ bạn sẽ viết mã bên trong tệp này. Và khi bạn đã sẵn sàng, bạn sẽ + +125 +00:08:08,290 --> 00:08:13,210 +nhấp vào chạy và bạn sẽ có thể chạy chính này. py ở đây và điều này sẽ hoạt động như + +126 +00:08:13,510 --> 00:08:16,750 +bảng điều khiển của bạn. Giờ đây, một tính + +127 +00:08:16,750 --> 00:08:19,750 +năng thực sự tiện dụng của PyCharm là + +128 +00:08:19,750 --> 00:08:23,020 +thứ được gọi là theo dõi việc cần làm. + +129 +00:08:23,830 --> 00:08:28,780 +Trong khi trước đây trong Repl. nó tôi đang tạo những việc cần làm + +130 +00:08:28,780 --> 00:08:33,280 +và bạn có thể xem chúng. Nhưng nếu tôi có nhiều việc cần làm ở những nơi khác nhau, bạn + +131 +00:08:33,580 --> 00:08:35,409 +thực sự không thể xem tất cả chúng cùng một lúc. + +132 +00:08:35,409 --> 00:08:37,419 +Bạn phải cuộn qua tệp để tìm chúng. + +133 +00:08:37,960 --> 00:08:39,850 +Nhưng trong một công cụ chuyên nghiệp, + +134 +00:08:40,120 --> 00:08:45,070 +chúng tôi thực sự có một thứ gọi là theo dõi việc cần làm và một tab ở dưới đây. + +135 +00:08:45,940 --> 00:08:49,210 +Vì vậy, nếu tôi tiếp tục và thực hiện một số yêu cầu chương trình này, tôi có + +136 +00:08:49,510 --> 00:08:52,540 +thể đưa chúng vào làm việc cần làm. Để tạo việc cần + +137 +00:08:52,540 --> 00:08:57,540 +làm, bạn phải làm theo cú pháp. Đầu tiên là một dấu thăng và sau đó chúng tôi + +138 +00:08:58,320 --> 00:09:03,320 +viết TODO bằng tất cả các chữ hoa, và chú ý rằng nó vừa được thay đổi màu sắc như thế nào, + +139 +00:09:03,570 --> 00:09:06,690 +và bây giờ bạn có thể thấy trong tab việc cần làm, nó được + +140 +00:09:06,720 --> 00:09:08,640 +tìm thấy một mục việc cần làm. + +141 +00:09:09,420 --> 00:09:12,930 +Bây giờ chúng ta có thể viết việc làm số một và đây + +142 +00:09:13,530 --> 00:09:17,970 +là để in một báo cáo về tất cả các tài nguyên của máy pha cà phê. + +143 +00:09:19,080 --> 00:09:23,010 +Bây giờ, hãy nói rằng tôi đã tạo ra một việc làm ở một nơi khác, phải không? + +144 +00:09:23,040 --> 00:09:24,630 +Giống như tất cả các cách trên đây, + +145 +00:09:25,770 --> 00:09:30,770 +hãy kiểm tra xem các nguồn lực có đủ để gọi đồ uống hay không. Và hãy để ý xem chúng hoàn toàn + +146 +00:09:31,620 --> 00:09:34,620 +ở những nơi khác nhau theo một thứ tự khác nhau. + +147 +00:09:34,920 --> 00:09:38,490 +Nhưng mỗi khi tôi tạo một trong những việc cần làm bằng định + +148 +00:09:38,520 --> 00:09:39,810 +dạng này, nó sẽ + +149 +00:09:39,810 --> 00:09:43,500 +được chọn trong tab việc cần làm. Và bạn có thể tiếp tục và xem họ sống ở đâu. + +150 +00:09:43,860 --> 00:09:47,370 +Vì vậy, nó được tìm thấy hai mục bên trong chính của chúng tôi. py và bạn có thể thấy + +151 +00:09:47,850 --> 00:09:51,390 +rằng cái này làm được một cái, cái này làm được hai cái. + +152 +00:09:51,690 --> 00:09:52,770 +Và khi bạn nhấp vào + +153 +00:09:52,860 --> 00:09:55,500 +chúng, chúng sẽ đưa bạn đến đúng vị trí trong mã của bạn. + +154 +00:09:56,460 --> 00:10:01,460 +Sử dụng điều này để chia nhỏ vấn đề thành các vấn đề nhỏ hơn mà bạn có thể giải quyết từng vấn + +155 +00:10:01,530 --> 00:10:02,310 +đề một, giống + +156 +00:10:02,310 --> 00:10:06,720 +như bạn đã làm trước đây và thử xem liệu bạn có thể hoàn thành dự án này hay không. + +157 +00:10:07,500 --> 00:10:11,100 +Chỉ là lời cảnh báo: dự án này khá tham vọng. + +158 +00:10:11,400 --> 00:10:14,130 +Nhưng giờ đây bạn đã có những công cụ chuyên + +159 +00:10:14,520 --> 00:10:17,850 +nghiệp để trợ giúp và bạn đã có thêm nhiều kỹ năng hơn nữa. + +160 +00:10:18,390 --> 00:10:22,680 +Vì vậy, hãy dành ít nhất một giờ để giải quyết vấn đề này và đảm + +161 +00:10:22,680 --> 00:10:27,180 +bảo rằng bạn đáp ứng tất cả các tiêu chí đặt ra trong yêu cầu của chương + +162 +00:10:27,270 --> 00:10:32,270 +trình và chương trình của bạn cũng hoạt động giống hệt như phiên bản cuối cùng của máy pha + +163 +00:10:33,690 --> 00:10:34,500 +cà phê. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 PyCharm-Keyboard-Shortcuts.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 PyCharm-Keyboard-Shortcuts.url new file mode 100644 index 0000000000000000000000000000000000000000..4ae378ee36838313d56d75ffee22f79dcd8eea01 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/006 PyCharm-Keyboard-Shortcuts.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.jetbrains.com/help/pycharm/running-and-debugging-shortcuts.html?keymap=secondary_windows \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Course-Fixes-Report-an-Issue.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Day-15-Ending-Code.url b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Day-15-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..68326f0a997f058d7214d4ee91f8a20e9c1e465f --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Day-15-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/coffee-machine-final \ No newline at end of file diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Solution & Walkthrough for the Coffee Machine Code.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Solution & Walkthrough for the Coffee Machine Code.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..414f6a3e9bc06e619ccce5af55cc7e5bb0fa56a0 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Solution & Walkthrough for the Coffee Machine Code.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43013f82ecd364c86f9721973b76822a4b1b83e3ac775628796a28a35632e99c +size 354102327 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Solution & Walkthrough for the Coffee Machine Code_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Solution & Walkthrough for the Coffee Machine Code_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..80c015c3dc388a5039c7a30d2bcece625aca017a --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/007 Solution & Walkthrough for the Coffee Machine Code_vi.srt @@ -0,0 +1,1760 @@ +1 +00:00:00,150 --> 00:00:00,540 +Hiện + +2 +00:00:00,540 --> 00:00:05,540 +nay, có rất nhiều giải pháp khả thi để tạo ra chương trình máy pha cà phê + +3 +00:00:05,760 --> 00:00:10,760 +này đáp ứng tất cả các yêu cầu. Và cách bạn viết mã nó về cơ bản là do bạn + +4 +00:00:12,000 --> 00:00:13,080 +lựa chọn, phải không? + +5 +00:00:13,440 --> 00:00:17,970 +Cho dù bạn quyết định sử dụng vòng lặp while hay sử dụng vòng lặp for hoặc tạo + +6 +00:00:17,970 --> 00:00:21,540 +một cấu trúc dữ liệu khác thì vẫn có vô số khả năng. + +7 +00:00:21,840 --> 00:00:25,320 +Những gì tôi sẽ cho bạn thấy bây giờ chỉ là một trong những khả năng. + +8 +00:00:25,890 --> 00:00:29,790 +Và điều thực sự quan trọng là bạn không cảm thấy mình đã làm sai + +9 +00:00:29,790 --> 00:00:33,120 +chỉ vì nó khác với tôi. Miễn là nó hoạt động + +10 +00:00:33,120 --> 00:00:36,900 +theo cách mà bạn mong đợi, thì hãy coi như bạn đã thành công. + +11 +00:00:37,650 --> 00:00:41,520 +Điều đầu tiên tôi sẽ làm là tạo một dự án mới trong PyCharm và tôi sẽ + +12 +00:00:41,910 --> 00:00:46,740 +gọi dự án của mình là máy pha cà phê. Một lần nữa, hãy đảm bảo rằng + +13 +00:00:46,770 --> 00:00:51,570 +tôi đã có phiên bản Python mới nhất làm trình thông dịch mà tôi + +14 +00:00:51,570 --> 00:00:52,403 +sẽ nhấp + +15 +00:00:52,490 --> 00:00:53,323 +vào tạo. + +16 +00:00:54,860 --> 00:00:58,700 +0: Bây giờ điều đầu tiên tôi sẽ làm ở đây là nhấp chuột phải vào tệp này và tạo một tệp + +17 +00:00:58,730 --> 00:01:02,210 +mới, tệp này sẽ là tệp chính của tôi. py + +18 +00:01:02,810 --> 00:01:07,160 +Và sau đó tôi sẽ đi đến dự án bắt đầu của tôi trong Repl. nó và tôi sẽ sao chép mọi + +19 +00:01:07,160 --> 00:01:12,160 +thứ ở đây và dán nó vào chính này. py + +20 +00:01:13,370 --> 00:01:18,370 +Bây giờ bạn có thể thấy phông chữ của mã của bạn hoặc của PyCharm hơi quá lớn + +21 +00:01:19,190 --> 00:01:21,350 +hoặc quá nhỏ. Nếu đúng như + +22 +00:01:21,350 --> 00:01:26,350 +vậy, bạn chỉ có thể vào tùy chọn và thay đổi giao diện và phông chữ + +23 +00:01:27,830 --> 00:01:30,680 +sang kích thước khác. Và đây là giao diện người dùng. + +24 +00:01:31,130 --> 00:01:35,210 +Và nếu bạn muốn thay đổi phông chữ của trình soạn thảo, thì bạn có thể vào đây, vào + +25 +00:01:35,270 --> 00:01:38,120 +phông chữ và sau đó thay đổi kích thước đó tại đây. + +26 +00:01:38,600 --> 00:01:41,810 +Tôi đã cố gắng làm cho nó càng lớn càng tốt để + +27 +00:01:41,810 --> 00:01:46,100 +khi bạn xem video này trên iPad hoặc iPhone, tất cả mã vẫn có thể đọc được. + +28 +00:01:46,460 --> 00:01:48,230 +Nhưng tất nhiên, thông thường khi + +29 +00:01:48,230 --> 00:01:52,250 +viết mã, bạn có thể muốn lắp nhiều dòng hơn vào cùng một màn hình, nhưng + +30 +00:01:52,730 --> 00:01:56,300 +điều đó không tốt cho mắt bạn. Vì vậy, hãy cố gắng đạt được sự cân bằng ở đó. + +31 +00:01:57,110 --> 00:02:00,800 +Bây giờ tôi sẽ thu gọn thanh bên đó vì tôi sẽ viết mã hoàn toàn + +32 +00:02:00,800 --> 00:02:01,880 +trong một tệp này. + +33 +00:02:02,510 --> 00:02:06,080 +Bây giờ hãy lưu ý rằng phần đầu chúng ta nhận + +34 +00:02:07,070 --> 00:02:11,210 +được một menu và đây là một từ điển chứa ba mục từ. + +35 +00:02:11,690 --> 00:02:15,050 +Và mỗi mục trong số đó có tên của một loại đồ + +36 +00:02:15,140 --> 00:02:16,820 +uống, espresso, latte và cappuccino. + +37 +00:02:17,210 --> 00:02:21,140 +Và sau đó, mỗi người trong số họ có một giá trị chứa một loạt dữ + +38 +00:02:21,500 --> 00:02:24,650 +liệu, bao gồm các thành phần được yêu cầu để tạo ra + +39 +00:02:24,980 --> 00:02:29,840 +đồ uống đó và cả giá của đồ uống. Bây giờ cũng có một từ điển tài + +40 +00:02:29,870 --> 00:02:32,900 +nguyên, chứa các tài nguyên của máy pha cà phê. + +41 +00:02:33,740 --> 00:02:36,440 +Bây giờ chúng tôi đã có tất cả những điều đó, vậy chúng tôi đã sẵn sàng để bắt đầu. + +42 +00:02:37,070 --> 00:02:39,740 +Tôi sẽ giải quyết từng yêu cầu một. + +43 +00:02:40,370 --> 00:02:43,670 +Và câu đầu tiên nói rằng hãy nhắc người dùng bằng + +44 +00:02:43,700 --> 00:02:46,880 +cách hỏi, bạn muốn gì? Espresso, latte hoặc cappuccino. + +45 +00:02:46,880 --> 00:02:51,880 +Vì vậy, tôi thực sự sẽ chỉ cần sao chép dòng này và đưa + +46 +00:02:51,950 --> 00:02:55,730 +nó vào đầu vào. Điều này sẽ được lưu vào một số loại biến, mà + +47 +00:02:55,730 --> 00:02:57,140 +tôi sẽ đặt tên cho sự lựa chọn. + +48 +00:02:58,550 --> 00:03:03,010 +Bây giờ nó cho tôi biết rằng lời nhắc sẽ hiển thị mỗi khi hành động đã hoàn thành. + +49 +00:03:03,280 --> 00:03:03,820 +Ví dụ, + +50 +00:03:03,820 --> 00:03:07,660 +một khi đồ uống được pha chế và nó sẽ hiển thị lặp đi lặp lại. + +51 +00:03:07,930 --> 00:03:11,970 +Vì vậy, điều đó có nghĩa là chúng ta có thể sẽ phải nhúng đầu vào + +52 +00:03:11,970 --> 00:03:16,270 +này vào một số loại vòng lặp while. Vì vậy, tôi sẽ chỉ nói bây giờ khi có điều gì đó là sự + +53 +00:03:16,570 --> 00:03:20,110 +thật, sau đó hãy tiếp tục yêu cầu lời nhắc này. Ngay bây giờ nếu chúng + +54 +00:03:20,140 --> 00:03:25,140 +ta quyết định chạy mã này ở đâu chúng ta sẽ chạy và sau đó nhấp vào + +55 +00:03:25,540 --> 00:03:29,140 +nút này và sau đó chọn chính. py để chạy, sau đó bạn có + +56 +00:03:29,800 --> 00:03:33,790 +thể thấy rằng nó hỏi tôi bạn muốn gì? Và nếu tôi đưa một đầu vào, + +57 +00:03:33,880 --> 00:03:36,910 +về cơ bản, nó sẽ tiếp tục hỏi tôi cho đến đời + +58 +00:03:36,910 --> 00:03:40,870 +đời, bởi vì hiện tại không có cách nào biến điều đó thành sự thật. + +59 +00:03:41,740 --> 00:03:43,720 +Vì vậy, chúng ta hãy xem xét các yêu cầu tiếp theo. + +60 +00:03:43,900 --> 00:03:48,010 +Chúng ta có thể tắt máy pha cà phê bằng cách nhập vào lời nhắc. + +61 +00:03:48,610 --> 00:03:50,290 +Đối với những người bảo trì máy + +62 +00:03:50,290 --> 00:03:54,160 +pha cà phê, họ có thể sử dụng tắt làm từ bí mật để tắt máy và mã của + +63 +00:03:54,160 --> 00:03:58,450 +bạn sẽ kết thúc thực thi khi điều này xảy ra. Vì vậy, khi ai đó muốn mua + +64 +00:03:58,480 --> 00:04:03,160 +cà phê, đây là dòng mà họ nhìn thấy. Nhưng khi một người bảo trì đi cùng, thì họ + +65 +00:04:03,160 --> 00:04:05,140 +sẽ có thể vào được thứ gì đó. + +66 +00:04:05,500 --> 00:04:08,290 +Và nếu sự lựa chọn này xảy ra bằng với mã + +67 +00:04:08,590 --> 00:04:13,090 +bí mật bị tắt, thì trong trường hợp này chúng ta nên dừng vòng lặp while và thoát ra. + +68 +00:04:13,510 --> 00:04:18,510 +Vì vậy, điều đó cho chúng ta một cách để thay đổi giá trị true này thành một + +69 +00:04:18,870 --> 00:04:22,320 +số dạng biến khác, phải không? Vì vậy, chúng tôi có thể + +70 +00:04:22,650 --> 00:04:27,180 +tạo một mã biến mới is_on, bắt đầu nó như true và trong khi máy đang bật, + +71 +00:04:27,510 --> 00:04:31,530 +sau đó nó sẽ tiếp tục lặp lại và yêu cầu người dùng lựa chọn. + +72 +00:04:31,890 --> 00:04:35,280 +Nhưng nếu sự lựa chọn xảy ra bị tắt, thì chúng ta + +73 +00:04:35,280 --> 00:04:39,060 +sẽ biến is_on đó thành false. Bây giờ, nếu chúng tôi chạy lại mã + +74 +00:04:39,060 --> 00:04:40,650 +của mình, vì vậy bây + +75 +00:04:40,650 --> 00:04:44,790 +giờ bạn đã chạy nó một lần, bạn có thể dừng nó hoặc bạn có thể + +76 +00:04:45,390 --> 00:04:49,770 +chạy lại nó, và bây giờ nó sẽ dừng mã hiện tại của bạn và chạy lại mã. + +77 +00:04:50,040 --> 00:04:52,140 +Vì vậy, nếu bạn không muốn nhìn thấy đoạn hội thoại + +78 +00:04:52,170 --> 00:04:55,230 +này mỗi lần, thì chỉ cần chọn hộp này, sau đó nhấp vào dừng và chạy lại. + +79 +00:04:55,950 --> 00:05:00,950 +Vì vậy, bây giờ nếu chúng ta thực hiện một lựa chọn hoặc chúng ta nói điều gì đó về cơ bản bất + +80 +00:05:01,380 --> 00:05:02,970 +kỳ điều gì khác ngoài từ + +81 +00:05:03,240 --> 00:05:06,810 +khóa bị tắt, nó sẽ lặp đi lặp lại và tiếp tục nhắc nhở chúng ta. + +82 +00:05:07,170 --> 00:05:12,170 +Nhưng nếu tôi nói tắt, thì máy sẽ tắt và bạn có thể thấy rằng bây giờ + +83 +00:05:12,870 --> 00:05:16,920 +tôi đã thoát khỏi chương trình. Bây giờ chúng tôi đã giải quyết 1 và 2. + +84 +00:05:16,950 --> 00:05:21,930 +Hãy tiếp tục đến số 3. Khi người dùng nhập báo cáo từ khóa vào lời nhắc, + +85 +00:05:21,930 --> 00:05:24,600 +một từ bí mật khác, một báo cáo sẽ được tạo ra hiển + +86 +00:05:24,630 --> 00:05:28,410 +thị các giá trị tài nguyên hiện tại. Ví dụ, nước, sữa, cà + +87 +00:05:28,410 --> 00:05:33,150 +phê và tiền. Vì vậy, làm thế nào chúng ta có thể làm điều đó? Đầu tiên, chúng ta + +88 +00:05:33,180 --> 00:05:36,360 +không thực sự có một biến số chứa số tiền. + +89 +00:05:36,690 --> 00:05:37,950 +Vì vậy, hãy tạo ra + +90 +00:05:37,950 --> 00:05:41,940 +một thứ gì đó, hãy gọi nó là lợi nhuận và đặt nó bằng 0 để bắt đầu. + +91 +00:05:42,240 --> 00:05:44,790 +Máy của chúng tôi có một hộp tiền trống ở đầu. + +92 +00:05:45,390 --> 00:05:48,720 +Vì vậy, bây giờ chúng ta phải kiểm tra để xem, tốt, elif sự lựa chọn + +93 +00:05:48,750 --> 00:05:52,590 +có ngang bằng với báo cáo hay không. Trong trường hợp này, chúng ta phải + +94 +00:05:52,620 --> 00:05:57,620 +tạo một báo cáo và báo cáo về cơ bản sẽ in tất cả các giá trị + +95 +00:05:58,820 --> 00:06:00,500 +của các tài nguyên này. + +96 +00:06:01,010 --> 00:06:06,010 +Vì vậy, tôi chỉ đơn giản là sẽ sao chép đầu ra mong đợi và tôi sẽ dán nó vào đây. + +97 +00:06:07,550 --> 00:06:12,080 +Và sau đó chúng ta có thể thử và biến nó thành các câu lệnh in, biến nó thành một + +98 +00:06:12,170 --> 00:06:16,220 +lệnh động thay vì được mã hóa cứng. Trong trường hợp của tôi, tôi + +99 +00:06:16,220 --> 00:06:19,670 +muốn thêm chữ in vào trước tất cả các dòng này. + +100 +00:06:19,790 --> 00:06:23,990 +Và trước đây chúng tôi đã làm điều này chỉ bằng cách viết từng cái một, và sau đó có thể + +101 +00:06:23,990 --> 00:06:25,970 +chúng tôi có thể sao chép và dán nó. + +102 +00:06:26,330 --> 00:06:30,890 +Nhưng hãy để tôi chỉ cho bạn một mẹo nhanh mà bạn có thể làm trong PyCharm. Nếu bạn đang sử dụng Windows, hãy giữ + +103 +00:06:30,920 --> 00:06:35,510 +phím alt và phím shift trên bàn phím của bạn. Nếu bạn đang sử dụng máy Mac, hãy + +104 +00:06:35,540 --> 00:06:37,790 +giữ tùy chọn và phím shift. + +105 +00:06:38,300 --> 00:06:42,710 +Bây giờ hãy nhấp vào phần đầu và giữ và kéo xuống. + +106 +00:06:43,580 --> 00:06:45,470 +Vì vậy, nếu cách đó không hiệu quả, hãy + +107 +00:06:45,470 --> 00:06:49,400 +thử một vài lần, cuối cùng bạn sẽ hiểu được nó. Nhưng hãy để ý xem bây giờ tôi có bốn con trỏ + +108 +00:06:49,520 --> 00:06:52,580 +như thế nào và điều đó có nghĩa là khi tôi viết bản in, hãy kiểm tra điều này. + +109 +00:06:53,870 --> 00:06:54,703 +Thật tuyệt phải không? + +110 +00:06:55,550 --> 00:06:59,780 +Tôi đã cố gắng viết trên bốn dòng cùng một lúc vì tôi cần chức năng + +111 +00:06:59,780 --> 00:07:03,980 +lặp lại đó và đây là một cách để thực hiện chỉnh sửa nhiều dòng. + +112 +00:07:04,190 --> 00:07:07,910 +Hãy ghi nhớ phím tắt đó và sử dụng nó trong tương lai nếu bạn thấy nó hữu ích. + +113 +00:07:08,480 --> 00:07:13,430 +Vì vậy, tôi thực sự sẽ thay đổi tất cả điều này thành chuỗi vì tôi muốn thay đổi những + +114 +00:07:13,460 --> 00:07:16,160 +con số này thay vì được mã hóa cứng, tôi + +115 +00:07:16,490 --> 00:07:19,700 +muốn chèn chúng vào đây bằng cách sử dụng dấu ngoặc nhọn. + +116 +00:07:20,210 --> 00:07:23,120 +Nước được lưu trữ dưới các nguồn tài nguyên, và sau + +117 +00:07:23,510 --> 00:07:26,270 +đó nó nằm trong chìa khóa được gọi là nước. + +118 +00:07:27,830 --> 00:07:31,670 +Và bây giờ hãy chú ý cách tôi có một dấu ngoặc kép bên ngoài, vì vậy tôi không + +119 +00:07:31,910 --> 00:07:33,770 +thể có một dấu ngoặc kép bên trong. + +120 +00:07:33,770 --> 00:07:37,100 +Vì vậy, tôi sẽ thay đổi điều này thành các dấu ngoặc + +121 +00:07:38,960 --> 00:07:42,530 +kép thay thế, như vậy. Và tôi cũng sẽ làm như vậy đối với sữa và cà phê. + +122 +00:07:44,420 --> 00:07:48,590 +Vì vậy, bây giờ tôi đã thêm nước, sữa và cà phê vào báo cáo in của mình. + +123 +00:07:48,620 --> 00:07:50,990 +Tất cả những gì tôi còn lại là tiền. + +124 +00:07:51,230 --> 00:07:56,230 +Vì vậy, hãy xóa giá trị và hãy chèn lợi nhuận đó vào đây. + +125 +00:07:57,020 --> 00:08:00,170 +Bây giờ chúng ta hãy chạy lại mã của chúng ta và hãy kiểm tra nó. + +126 +00:08:00,650 --> 00:08:05,650 +Nếu tôi nhập báo cáo, bây giờ nó sẽ cung cấp cho tôi một báo cáo về tất cả các giá trị hiện + +127 +00:08:06,140 --> 00:08:10,130 +tại và số tiền bằng 0 đô la vì đó là những gì chúng tôi bắt đầu. + +128 +00:08:11,120 --> 00:08:14,540 +Bây giờ chúng tôi đã sẵn sàng để xử lý số 4. Ở đây, chúng ta phải kiểm + +129 +00:08:14,570 --> 00:08:19,370 +tra xem khi người dùng chọn đồ uống, chúng ta sẽ kiểm tra xem có đủ nguồn + +130 +00:08:19,370 --> 00:08:23,360 +lực để tạo ra đồ uống cụ thể mà họ đã chọn hay không. + +131 +00:08:23,690 --> 00:08:26,630 +Ví dụ: nếu một máy pha cà phê pha cà phê yêu cầu + +132 +00:08:26,930 --> 00:08:29,390 +200 ml nước nhưng máy chỉ còn 100ml, thì không nên + +133 +00:08:29,750 --> 00:08:32,960 +pha đồ uống vì thực sự nó không thể pha được đồ uống và nó + +134 +00:08:33,289 --> 00:08:37,390 +sẽ in ra dòng chữ 'Xin lỗi, không có đủ nước' hoặc không đủ sữa, không đủ cà phê, + +135 +00:08:37,440 --> 00:08:39,320 +bất kể nó có thể là gì. + +136 +00:08:39,770 --> 00:08:42,350 +Vì vậy, hãy giải quyết điểm kiểm tra cụ thể này. + +137 +00:08:43,909 --> 00:08:48,650 +Bây giờ tôi đã có nếu các lựa chọn bằng nhau, nếu lựa chọn bằng báo cáo. + +138 +00:08:48,980 --> 00:08:50,990 +Bây giờ, nếu không phải là một + +139 +00:08:51,020 --> 00:08:54,080 +trong hai thứ đó, thì có lẽ họ sẽ nhập tên đồ uống. + +140 +00:08:54,380 --> 00:08:56,820 +Vì vậy, hãy nắm bắt điều đó bằng cách sử dụng một câu lệnh khác. + +141 +00:08:57,480 --> 00:08:59,430 +Và sau đó, bên trong tuyên bố + +142 +00:08:59,430 --> 00:09:04,350 +khác này, tôi sẽ nắm bắt đồ uống cụ thể mà họ đã gọi bằng cách truy cập vào từ + +143 +00:09:04,350 --> 00:09:09,120 +điển menu của chúng tôi và sau đó sử dụng lựa chọn mà họ đã nhập làm chìa khóa. + +144 +00:09:09,630 --> 00:09:14,190 +Giả sử rằng đồ uống cụ thể mà họ đã chọn tương đương với thực đơn + +145 +00:09:14,610 --> 00:09:18,480 +và sau đó điều quan trọng tất nhiên sẽ là sự lựa chọn. + +146 +00:09:18,930 --> 00:09:23,930 +Vì vậy, bây giờ nếu tôi chỉ cần in đồ uống này và tôi chạy mã của mình .. + +147 +00:09:24,270 --> 00:09:29,270 +Vì vậy, phím tắt để chạy thực sự là giữ điều khiển và R và bây giờ nó có + +148 +00:09:29,730 --> 00:09:34,200 +thể đi xuống đây và bạn có thể thấy nó đang yêu cầu tôi những gì tôi + +149 +00:09:34,230 --> 00:09:38,010 +muốn, vì vậy tôi sẽ chọn latte. Và thứ sẽ được in ra là + +150 +00:09:38,040 --> 00:09:43,040 +mục latte trong từ điển công thức nấu ăn của tôi ở đây, vì vậy giá trị cụ + +151 +00:09:44,010 --> 00:09:44,843 +thể này. + +152 +00:09:46,050 --> 00:09:50,070 +Bây giờ tôi đã có giá trị này được lưu trữ bên trong một + +153 +00:09:50,340 --> 00:09:55,340 +biến gọi là đồ uống, sau đó tôi có thể khai thác các thành phần của nó và lặp + +154 +00:09:56,160 --> 00:10:00,600 +lại từng thành phần so sánh nó với các tài nguyên và xem có đủ không. + +155 +00:10:00,990 --> 00:10:04,680 +Bây giờ đây là một chút chức năng có lẽ nên + +156 +00:10:04,680 --> 00:10:07,950 +được tự động hóa. Vì vậy, thay vì chỉ in đồ uống, + +157 +00:10:07,950 --> 00:10:11,520 +tôi thực sự sẽ tạo một chức năng mới. Vì vậy, ở đây, + +158 +00:10:11,520 --> 00:10:15,930 +tôi sẽ tạo một hàm mới với def của chúng tôi và tôi + +159 +00:10:15,960 --> 00:10:17,940 +sẽ gọi nó là is_ resource_suici. + +160 +00:10:20,370 --> 00:10:25,370 +Và is_resource_eosystem sẽ lấy các thành phần đặt hàng làm đầu vào và sau + +161 +00:10:27,180 --> 00:10:29,910 +đó nó sẽ hoạt động trên đó. + +162 +00:10:29,910 --> 00:10:34,860 +Vì vậy, nếu chúng ta muốn gọi hàm đó và chuyển theo thứ tự các thành + +163 +00:10:34,860 --> 00:10:36,930 +phần, chúng ta sẽ phải gọi + +164 +00:10:37,410 --> 00:10:42,410 +là is_resource_eosystem và sau đó các thành phần khác sẽ đến từ đồ uống và sau đó + +165 +00:10:43,350 --> 00:10:46,470 +nắm giữ các giá trị trong các thành phần chính. + +166 +00:10:48,860 --> 00:10:49,580 +2: Tất cả đều đúng. + +167 +00:10:49,580 --> 00:10:54,350 +0: Vì vậy, dưới khóa cụ thể này, nó sẽ tìm nạp từ điển cụ thể này. + +168 +00:10:54,710 --> 00:10:58,880 +Và đây là từ điển sẽ được chuyển cho hàm này làm + +169 +00:10:58,880 --> 00:10:59,713 +đầu vào. + +170 +00:11:00,140 --> 00:11:04,130 +Vì vậy, bây giờ chúng ta đã có một cuốn từ điển với tất cả các + +171 +00:11:04,130 --> 00:11:06,950 +thành phần được yêu cầu và số lượng của mỗi thành + +172 +00:11:07,250 --> 00:11:09,950 +phần, bây giờ chúng ta có thể so sánh nó + +173 +00:11:09,980 --> 00:11:14,980 +với các tài nguyên của chúng tôi, một từ điển rất giống với các tài nguyên và số lượng còn + +174 +00:11:15,800 --> 00:11:16,633 +lại trong máy. + +175 +00:11:17,750 --> 00:11:22,750 +Chúng ta có thể lặp lại các thành phần của đơn hàng và đối với từng mặt hàng + +176 +00:11:23,720 --> 00:11:24,380 +trong nguyên + +177 +00:11:24,380 --> 00:11:29,380 +liệu, chúng ta sẽ kiểm tra xem liệu các thành phần của đơn hàng tại khóa cụ thể + +178 +00:11:30,080 --> 00:11:35,080 +đó, vì vậy điều này đang nắm giữ giá trị, lớn hơn hoặc bằng tài nguyên sử + +179 +00:11:37,700 --> 00:11:41,090 +dụng cùng một khóa cụ thể. Ví dụ, nếu chúng + +180 +00:11:41,090 --> 00:11:43,580 +ta đang xem xét ví dụ + +181 +00:11:43,940 --> 00:11:46,580 +đầu tiên, mục này sẽ bằng nước. + +182 +00:11:47,090 --> 00:11:51,020 +Vì vậy, nếu chúng ta lấy giá trị từ các thành phần đặt hàng với + +183 +00:11:51,050 --> 00:11:54,010 +chìa khóa là nước, chúng ta sẽ nhận được 200. + +184 +00:11:54,460 --> 00:11:59,460 +Và bây giờ chúng ta sẽ kiểm tra xem liệu 200 có lớn hơn hoặc bằng 300 mà chúng ta có + +185 +00:12:02,110 --> 00:12:05,050 +trong các tài nguyên hay không. Chà, trong trường hợp này, + +186 +00:12:05,080 --> 00:12:09,370 +có lẽ chúng ta nên nói với người dùng rằng chúng ta thực sự không thể làm được. + +187 +00:12:09,370 --> 00:12:14,370 +Vì vậy, hãy đặt một câu lệnh if ở đó và tôi sẽ sử dụng cùng một chuỗi này ở đây để + +188 +00:12:15,880 --> 00:12:16,713 +in nó ra. + +189 +00:12:18,340 --> 00:12:22,000 +Bây giờ hãy lưu ý khi tôi dán chuỗi đó vào và nó + +190 +00:12:22,000 --> 00:12:27,000 +có dấu ngoặc kép từ tệp PDF ở đây rằng nó thực sự không được nhận dạng và + +191 +00:12:27,910 --> 00:12:29,740 +tôi đang gặp lỗi ở đây. + +192 +00:12:30,220 --> 00:12:33,820 +Và điều quan trọng cần biết là có sự khác biệt giữa các dấu ngoặc + +193 +00:12:33,820 --> 00:12:35,260 +kép trang trí, như thế này, + +194 +00:12:35,320 --> 00:12:38,680 +trông khác nhau đối với câu trích dẫn đầu và câu trích dẫn cuối. + +195 +00:12:39,130 --> 00:12:43,060 +Và sau đó là các dấu ngoặc kép trong Lập trình trông giống như thế này, + +196 +00:12:43,060 --> 00:12:44,770 +vì vậy tôi sẽ chọn toàn + +197 +00:12:45,070 --> 00:12:50,070 +bộ dòng này và tôi sẽ thêm một dấu ngoặc kép và để ý xem chúng trông giống nhau như + +198 +00:12:50,260 --> 00:12:54,550 +thế nào từ phía trước và phía sau. Vì vậy, bây giờ nó sẽ được in, Xin + +199 +00:12:54,550 --> 00:12:56,050 +lỗi là không có đủ. + +200 +00:12:56,140 --> 00:12:59,560 +Và đủ những gì? Nó sẽ là mục + +201 +00:12:59,590 --> 00:13:01,990 +mà chúng tôi hiện đang lặp lại. + +202 +00:13:02,500 --> 00:13:04,210 +Vì vậy, hãy thay đổi điều đó + +203 +00:13:04,540 --> 00:13:08,080 +thành một chuỗi làm cho một đoạn mã đang hoạt động sẽ được chèn vào. + +204 +00:13:08,980 --> 00:13:09,880 +Và trong + +205 +00:13:09,910 --> 00:13:14,530 +trường hợp này, chúng ta sẽ trả về false vì không có đủ tài nguyên. + +206 +00:13:14,980 --> 00:13:16,210 +Nhưng ngược lại, nếu + +207 +00:13:16,450 --> 00:13:21,130 +chúng ta đi đến cuối vòng lặp for mà vẫn chưa trả về hoặc thoát khỏi + +208 +00:13:21,130 --> 00:13:25,420 +hàm bằng cách trả về false, thì trong trường hợp này, chúng ta có thể + +209 +00:13:25,450 --> 00:13:26,560 +trả về true. + +210 +00:13:26,980 --> 00:13:30,520 +Vì vậy, nếu logic cụ thể này hơi khó hiểu + +211 +00:13:30,520 --> 00:13:35,080 +đối với bạn, bạn có thể có một cái gì đó như thế này. + +212 +00:13:35,110 --> 00:13:39,730 +Vì vậy, bạn có is_enough = true, và bạn có thể thay đổi + +213 +00:13:41,380 --> 00:13:42,640 +is_enough thành false. + +214 +00:13:42,910 --> 00:13:46,810 +Nếu bất kỳ thành phần đặt hàng nào lớn hơn tài nguyên. + +215 +00:13:47,380 --> 00:13:51,250 +Và cuối cùng khi kết thúc, bạn có thể trả về is_enough. + +216 +00:13:51,460 --> 00:13:55,630 +Vì vậy, về cơ bản nó vẫn đúng trừ khi một trong những câu lệnh if được kích hoạt. + +217 +00:13:56,800 --> 00:14:01,540 +Nhưng vì lợi ích đơn giản, tôi thực sự sẽ giữ cho nó đơn giản như thế này. + +218 +00:14:02,140 --> 00:14:04,720 +Và bây giờ chúng tôi đã sẵn sàng để nhận kết quả đó tại đây + +219 +00:14:05,140 --> 00:14:07,270 +để chúng tôi có thể đặt câu lệnh if ở đây. + +220 +00:14:07,390 --> 00:14:10,630 +Nếu nguồn nguyên liệu đã đủ cho đồ uống, + +221 +00:14:11,080 --> 00:14:14,800 +thì chúng ta có thể tiến hành tiếp tục bước tiếp theo. + +222 +00:14:15,970 --> 00:14:18,580 +Bước tiếp theo là xử lý tiền xu. + +223 +00:14:18,730 --> 00:14:21,820 +Người dùng sẽ được hỏi về số phần tư họ + +224 +00:14:21,820 --> 00:14:24,070 +có, số dime, niken và xu, + +225 +00:14:24,460 --> 00:14:26,950 +và bạn phải nhớ giá trị của chúng. + +226 +00:14:26,980 --> 00:14:31,000 +Vì vậy, nếu bạn đến từ Hoa Kỳ, điều này sẽ không thành vấn đề. Nhưng nếu bạn giống tôi, một người + +227 +00:14:31,030 --> 00:14:33,610 +nào đó không đến từ Hoa Kỳ, ừm, tôi + +228 +00:14:33,640 --> 00:14:36,940 +thực sự cảm thấy thực sự bối rối khi đến Hoa Kỳ. + +229 +00:14:37,450 --> 00:14:41,860 +Tôi luôn nghĩ rằng đồng xu lớn hơn, đó là niken, nên đáng giá hơn đồng xu, nhưng tôi + +230 +00:14:41,860 --> 00:14:44,200 +nghĩ rằng đó chỉ là tôi đang ngớ ngẩn. + +231 +00:14:45,070 --> 00:14:49,570 +Vì vậy, chúng tôi sẽ yêu cầu người dùng chèn một số đồng xu, chúng tôi sẽ xử lý nó + +232 +00:14:49,630 --> 00:14:52,340 +và sau đó chúng tôi sẽ tính toán tổng giá trị của số + +233 +00:14:52,340 --> 00:14:54,590 +tiền họ đã chèn. Điều đó, đối với tôi, + +234 +00:14:54,590 --> 00:14:57,440 +nghe có vẻ như nó cũng phải là một chức năng riêng biệt. + +235 +00:14:58,040 --> 00:15:02,120 +Vì vậy, hãy tạo một hàm khác ở đây, mà tôi sẽ gọi là process_coins. + +236 +00:15:04,130 --> 00:15:06,410 +Và điều này sẽ không lấy bất kỳ đầu + +237 +00:15:06,470 --> 00:15:10,610 +vào nào, nhưng nó sẽ trả về tổng giá trị của các đồng tiền được đưa vào. + +238 +00:15:11,270 --> 00:15:13,310 +Bây giờ, chúng ta xử lý tiền xu như thế nào? Vâng, trước + +239 +00:15:13,310 --> 00:15:18,310 +tiên chúng ta có thể in để yêu cầu họ vui lòng đưa tiền vào. + +240 +00:15:19,340 --> 00:15:23,780 +Và sau đó, bằng cách nào đó, chúng ta sẽ tính tổng bằng cách nào đó, phải không? + +241 +00:15:23,810 --> 00:15:25,940 +Đây là biến mà chúng ta sẽ theo dõi + +242 +00:15:26,270 --> 00:15:29,150 +và chúng ta sẽ trả về dưới dạng đầu ra của hàm này. + +243 +00:15:29,930 --> 00:15:34,160 +Tổng số sẽ được tính toán dựa trên bốn loại tiền xu. + +244 +00:15:34,670 --> 00:15:38,600 +Vì vậy, câu hỏi đầu tiên chúng tôi sẽ hỏi họ là bao nhiêu phần tư? + +245 +00:15:40,700 --> 00:15:43,670 +Và tất nhiên đây sẽ là một số nguyên, vì vậy + +246 +00:15:43,670 --> 00:15:46,910 +chúng ta sẽ chuyển nó từ một chuỗi thành một số nguyên. + +247 +00:15:47,570 --> 00:15:51,860 +Và chúng tôi biết rằng mỗi quý có giá trị bằng 0. 25 của một đô la, vì vậy + +248 +00:15:51,860 --> 00:15:53,090 +chúng tôi có + +249 +00:15:53,390 --> 00:15:57,470 +thể nhân số phần tư với 0. 25 và sau đó chúng tôi sẽ + +250 +00:15:57,770 --> 00:15:59,720 +nhận được giá trị tiền tệ. + +251 +00:16:01,190 --> 00:16:06,190 +Bây giờ chúng ta sẽ cần làm điều tương tự đối với một loạt các đồng tiền khác. + +252 +00:16:06,980 --> 00:16:09,860 +Vì vậy, thay vì các phần tư, + +253 +00:16:10,130 --> 00:16:14,690 +đây sẽ là đồng xu, sau đó sẽ là niken và cuối + +254 +00:16:14,690 --> 00:16:18,920 +cùng, nó sẽ là xu. Đồng xu có giá trị 10 xu, niken + +255 +00:16:19,310 --> 00:16:21,380 +có giá trị 5 xu và đồng + +256 +00:16:22,010 --> 00:16:26,030 +xu có giá trị 1 xu. Bây giờ, thay vì chỉ đặt + +257 +00:16:26,060 --> 00:16:30,950 +tổng của từng giá trị này, mọi giá trị tiếp theo khác với giá trị + +258 +00:16:30,980 --> 00:16:32,240 +đầu tiên mà + +259 +00:16:32,240 --> 00:16:35,810 +nó nhớ tạo ra biến này và đặt giá trị của + +260 +00:16:36,230 --> 00:16:41,230 +nó, mọi giá trị khác sẽ được thêm vào giá trị hiện tại như thế này. + +261 +00:16:42,620 --> 00:16:44,840 +Vì vậy, bây giờ ở phần cuối của tất + +262 +00:16:44,870 --> 00:16:48,260 +cả những điều này, chúng ta sẽ trả về tổng số dưới dạng đầu ra. + +263 +00:16:48,740 --> 00:16:52,850 +Và bất cứ khi nào bạn có thứ gì đó trả về giống như cả hai hàm này, + +264 +00:16:53,210 --> 00:16:56,960 +có lẽ bạn nên thêm một chuỗi doc. Vì vậy, trong trường + +265 +00:16:56,960 --> 00:16:58,280 +hợp này, + +266 +00:16:58,280 --> 00:17:02,870 +điều này trả về tổng số được tính từ các đồng + +267 +00:17:02,870 --> 00:17:06,349 +tiền được đưa vào. Và trong trường hợp + +268 +00:17:06,380 --> 00:17:11,380 +này, điều gì sẽ xảy ra là nó trả về true khi có thể + +269 +00:17:15,500 --> 00:17:19,130 +đặt hàng và trả về false nếu không đủ thành phần. + +270 +00:17:20,990 --> 00:17:25,160 +Bây giờ chúng ta hãy gọi hàm này mà chúng ta đã tạo, process_coins. + +271 +00:17:25,849 --> 00:17:28,310 +Nếu có đủ nguồn lực để pha đồ uống, + +272 +00:17:28,339 --> 00:17:31,520 +thì bước tiếp theo là thực sự yêu cầu họ đưa tiền. + +273 +00:17:31,820 --> 00:17:34,820 +Vì vậy, đây là nơi chúng ta sẽ gọi quá trình coin. + +274 +00:17:35,450 --> 00:17:40,400 +Và để ý khi tôi viết cái này và di chuột qua nó, bạn có thể thấy chuỗi doc mà chúng tôi + +275 +00:17:40,400 --> 00:17:43,700 +vừa viết, trả về tổng số tiền từ các đồng tiền được chèn vào. + +276 +00:17:44,990 --> 00:17:47,180 +Điều đó có nghĩa là điều này + +277 +00:17:47,330 --> 00:17:52,110 +sẽ trở lại và chúng tôi cần nắm bắt khoản thanh toán của người dùng trong biến này. + +278 +00:17:52,110 --> 00:17:56,760 +Vì vậy, điều này trả về kết quả đầu ra thay thế lệnh gọi hàm này, và sau đó nó được lưu + +279 +00:17:57,060 --> 00:18:01,230 +bên trong biến này được gọi là thanh toán. Bây giờ, chúng ta sẽ làm gì + +280 +00:18:01,230 --> 00:18:05,340 +với khoản thanh toán này? Chà, đó là bước tiếp theo, đó + +281 +00:18:05,790 --> 00:18:08,970 +là kiểm tra xem giao dịch có thành công hay không. + +282 +00:18:09,270 --> 00:18:13,380 +Vì vậy, chúng tôi phải đảm bảo rằng người dùng đã nạp đủ tiền để + +283 +00:18:13,380 --> 00:18:18,060 +thực sự mua đồ uống mà họ muốn. Nhưng mỗi loại đồ uống tất nhiên có một mức giá khác nhau. + +284 +00:18:18,330 --> 00:18:22,920 +Vì vậy, nếu người dùng nạp đủ tiền, thì chúng tôi sẽ cung cấp cho họ một số tiền lẻ. + +285 +00:18:23,250 --> 00:18:26,910 +Nhưng nếu họ không nạp đủ tiền, thì chúng tôi sẽ nói, xin lỗi, đó + +286 +00:18:26,910 --> 00:18:29,460 +là không đủ tiền. Và tiền được hoàn lại. + +287 +00:18:30,240 --> 00:18:33,990 +Nhưng nếu họ đã nạp đủ tiền thì chi phí đồ uống sẽ + +288 +00:18:33,990 --> 00:18:38,700 +được cộng vào máy làm lợi nhuận. Vì vậy, vào lần tiếp theo khi chúng tôi + +289 +00:18:38,730 --> 00:18:42,570 +kích hoạt báo cáo, chúng tôi sẽ thấy sự gia tăng giá trị tiền tệ. + +290 +00:18:44,010 --> 00:18:44,490 +Một + +291 +00:18:44,490 --> 00:18:48,900 +lần nữa, hãy tạo một hàm mới và loại bỏ một số dòng nguệch ngoạc này + +292 +00:18:48,900 --> 00:18:51,630 +bằng cách thêm đủ khoảng cách vào giữa các hàm. + +293 +00:18:52,530 --> 00:18:56,370 +Cái này tôi sẽ gọi là is_transaction_successful, vì về cơ bản đó là + +294 +00:18:58,290 --> 00:19:00,810 +những gì chúng tôi sẽ kiểm tra. + +295 +00:19:01,380 --> 00:19:03,990 +Và nó sẽ cần hai đầu vào. + +296 +00:19:04,110 --> 00:19:08,520 +Nó sẽ lấy một đầu vào về số tiền đã nhận được, + +297 +00:19:09,180 --> 00:19:14,130 +và nó cũng sẽ có một đầu vào khác, đó là chi phí đồ uống. + +298 +00:19:15,060 --> 00:19:20,060 +Mục tiêu của hàm này là trả về true khi thanh toán + +299 +00:19:24,570 --> 00:19:25,980 +được chấp nhận + +300 +00:19:26,370 --> 00:19:29,610 +hoặc sẽ trả về false nếu thiếu tiền. + +301 +00:19:29,630 --> 00:19:30,463 +Uhm 0: Hãy + +302 +00:19:32,390 --> 00:19:36,410 +để ý xem có dòng này ở bên phải trình soạn thảo của bạn như thế nào. + +303 +00:19:36,890 --> 00:19:41,890 +Về cơ bản những gì sẽ xảy ra là nếu bạn có một dòng mã quá dài so + +304 +00:19:41,930 --> 00:19:45,320 +với khuyến nghị từ PEP 8, bạn có thể thấy rằng + +305 +00:19:45,650 --> 00:19:50,150 +PEP 8 khuyến nghị rằng một dòng không được dài hơn 120 ký tự vì nó + +306 +00:19:50,150 --> 00:19:50,983 +rất khó + +307 +00:19:51,140 --> 00:19:54,650 +đọc đối với ai đó đang cuộn. xung quanh như thế này. + +308 +00:19:54,980 --> 00:19:55,880 +Vì vậy, trong trường + +309 +00:19:55,880 --> 00:20:00,020 +hợp này, họ muốn bạn đặt nó vào một dòng mới để bạn không phải cuộn và có thể + +310 +00:20:00,020 --> 00:20:03,500 +xem tất cả trên cùng một màn hình. Nhưng trong trường hợp của chúng tôi, + +311 +00:20:03,500 --> 00:20:07,520 +đây không phải là vấn đề vì chúng tôi đã không vượt quá khuyến nghị về + +312 +00:20:07,520 --> 00:20:08,353 +độ dài dòng. + +313 +00:20:09,590 --> 00:20:13,790 +Vậy làm cách nào để kiểm tra xem giao dịch có thành công hay không? + +314 +00:20:14,420 --> 00:20:14,690 +Chà, + +315 +00:20:14,690 --> 00:20:19,690 +nếu số tiền nhận được lớn hơn hoặc bằng tiền đồ uống, thì trong trường hợp này, điều đó có nghĩa + +316 +00:20:21,770 --> 00:20:26,300 +là chúng ta nên trả lại true, phải không? Giao dịch thành công. + +317 +00:20:26,990 --> 00:20:30,530 +Và nếu không phải như vậy, nếu ngược lại thì chúng + +318 +00:20:30,860 --> 00:20:34,160 +ta sẽ in, Xin lỗi là không đủ tiền. + +319 +00:20:34,220 --> 00:20:36,380 +Và tiền được hoàn lại cho họ. + +320 +00:20:36,620 --> 00:20:37,453 +3: Đúng. + +321 +00:20:39,590 --> 00:20:44,420 +0: Vì vậy, hãy in nó ở đây. Và chúng tôi cũng sẽ trả về false. + +322 +00:20:44,960 --> 00:20:48,340 +Hãy nhớ rằng lợi nhuận phải là điều cuối cùng trong chức năng của bạn. + +323 +00:20:48,400 --> 00:20:52,420 +Nếu bạn đặt điều này bên trên câu lệnh in thì câu lệnh in sẽ không bao giờ được gọi, và đó là lý + +324 +00:20:52,420 --> 00:20:55,840 +do tại sao bạn có điểm nổi bật này. Và nếu bạn nhấp vào nó, bạn có + +325 +00:20:55,840 --> 00:20:58,810 +thể thấy rằng nó cho bạn biết mã này không thể truy cập được. + +326 +00:21:00,520 --> 00:21:04,780 +Vì vậy, có rất nhiều gợi ý và mẹo nhỏ thực sự giúp ích cho bạn khi bạn + +327 +00:21:04,780 --> 00:21:05,613 +đang phát triển. + +328 +00:21:06,340 --> 00:21:10,990 +Nhưng nếu người dùng đã nạp đủ tiền thì chi phí đồ uống sẽ được cộng vào máy + +329 +00:21:10,990 --> 00:21:15,310 +làm lợi nhuận để chúng ta có thể nhìn thấy nó trong lần kích hoạt báo + +330 +00:21:15,310 --> 00:21:16,143 +cáo lần sau. + +331 +00:21:16,420 --> 00:21:21,420 +Vì vậy, điều này có nghĩa là nếu số tiền nhận được này lớn hơn hoặc bằng chi phí + +332 +00:21:22,420 --> 00:21:27,420 +đồ uống, thì chúng ta sẽ thêm vào biến này được gọi là lợi nhuận mà chúng ta có + +333 +00:21:28,870 --> 00:21:30,340 +ở đây, bắt đầu bằng + +334 +00:21:30,580 --> 00:21:34,420 +0, nhưng chúng ta sẽ cộng chi phí đồ uống để kiếm lợi nhuận. + +335 +00:21:34,720 --> 00:21:37,600 +Vì vậy, chúng tôi sẽ nói lợi nhuận + = drink_cost. + +336 +00:21:38,110 --> 00:21:41,740 +Và bây giờ bạn sẽ thấy lỗi dưới lợi nhuận + +337 +00:21:42,070 --> 00:21:45,100 +vì điều này đang hoạt động bên trong + +338 +00:21:45,130 --> 00:21:50,130 +phạm vi cục bộ và lợi nhuận nằm bên ngoài phạm vi toàn cầu. + +339 +00:21:50,830 --> 00:21:54,550 +Vì vậy, để đạt được nó, chúng ta phải nói đến lợi nhuận toàn cầu. + +340 +00:21:56,260 --> 00:22:01,260 +Và phần cuối cùng của việc kiểm tra giao dịch là xem liệu người dùng có nạp quá nhiều tiền + +341 +00:22:01,420 --> 00:22:06,070 +hay không thì máy sẽ cung cấp tiền lẻ. Ví dụ, đây là tuy + +342 +00:22:06,340 --> 00:22:11,080 +nhiên, thay đổi nhiều đô la và thay đổi phải được làm tròn + +343 +00:22:11,080 --> 00:22:15,760 +đến hai chữ số thập phân. Một lần nữa, nó sẽ nằm bên trong câu lệnh if này. + +344 +00:22:16,420 --> 00:22:21,130 +Vì vậy, số tiền thay đổi sẽ bằng số tiền nhận được, trừ + +345 +00:22:21,430 --> 00:22:23,740 +đi chi phí đồ uống. + +346 +00:22:24,280 --> 00:22:27,430 +Và điều này tất nhiên có thể là bất kỳ số chữ số thập phân nào. + +347 +00:22:28,060 --> 00:22:30,040 +Vì vậy, chúng ta có thể + +348 +00:22:30,040 --> 00:22:34,150 +sử dụng hàm làm tròn mà bạn đã thấy cách đây rất lâu để làm + +349 +00:22:34,510 --> 00:22:38,230 +tròn số này và đầu vào thứ hai là số chữ số thập phân. + +350 +00:22:39,310 --> 00:22:43,270 +Vì vậy, nếu bạn chỉ cần di chuột qua tên hàm, thì bạn có thể thấy + +351 +00:22:43,720 --> 00:22:48,670 +các tài liệu xuất hiện và hàm này về cơ bản sẽ xoay quanh một số với độ chính xác + +352 +00:22:48,670 --> 00:22:52,840 +nhất định trong các chữ số thập phân. Vì vậy, đầu tiên là + +353 +00:22:53,140 --> 00:22:57,850 +số bạn muốn làm tròn và thứ hai là số chữ số bạn muốn + +354 +00:22:57,880 --> 00:23:02,080 +sau dấu chấm về cơ bản. Bây giờ chúng tôi đã nắm + +355 +00:23:02,110 --> 00:23:05,260 +được sự thay đổi, chúng tôi sẽ in và nói với + +356 +00:23:05,440 --> 00:23:09,730 +người dùng, về cơ bản, đây là số tiền thay đổi nhiều đô la này. + +357 +00:23:11,260 --> 00:23:14,860 +Và tất nhiên là tôi phải thêm chữ F để kích hoạt sợi dây đó. + +358 +00:23:16,570 --> 00:23:21,010 +Vì vậy, bây giờ chúng ta đã sẵn sàng để gọi là is_transaction_successful và chúng + +359 +00:23:21,550 --> 00:23:25,630 +ta sẽ vượt qua số tiền nhận được và chi phí uống. + +360 +00:23:26,050 --> 00:23:30,280 +Vì vậy, money_receive tất nhiên sẽ là khoản thanh toán từ bước trước đó + +361 +00:23:30,730 --> 00:23:35,530 +được tính toán từ tất cả các đồng tiền và drink_cost sẽ dựa trên đồ uống + +362 +00:23:35,530 --> 00:23:38,650 +và nó nằm dưới chi phí chính, mà chúng tôi + +363 +00:23:38,980 --> 00:23:43,750 +có thể xác nhận ở đây. Vì vậy, đồ uống là từ điển này, + +364 +00:23:44,080 --> 00:23:46,550 +và sau đó là các thành phần và chi phí. + +365 +00:23:48,760 --> 00:23:49,030 +4: Đúng. + +366 +00:23:49,030 --> 00:23:54,030 +0: Hãy chạy lại mã của chúng tôi và hãy kiểm tra nó với một cái gì đó. Giả sử tôi muốn một + +367 +00:23:54,070 --> 00:23:57,100 +ly cà phê. Vui lòng chèn tiền xu. + +368 +00:23:57,280 --> 00:24:02,170 +Giả sử chúng tôi đã cố gắng chèn không đủ tiền. + +369 +00:24:03,700 --> 00:24:07,150 +Nó cho chúng tôi biết, xin lỗi, đó là không đủ tiền. Tiền được hoàn lại. + +370 +00:24:07,660 --> 00:24:11,020 +Nhưng hãy thử cho nó đủ số xu lần này. + +371 +00:24:13,750 --> 00:24:14,950 +Và trong trường hợp này, nó + +372 +00:24:14,980 --> 00:24:19,980 +chấp nhận nó và nó cho chúng ta biết đây là $ 2. 42 thay đổi được làm tròn đến hai chữ số thập phân, và + +373 +00:24:21,700 --> 00:24:25,570 +chúng tôi đã sẵn sàng để uống một ly khác. Vì vậy, bây giờ nếu chúng tôi nhấn báo cáo, + +374 +00:24:25,630 --> 00:24:30,630 +bạn có thể thấy rằng chúng tôi hiện đã kiếm được một số tiền trong máy của mình và tất cả mã của chúng + +375 +00:24:30,730 --> 00:24:32,440 +tôi đang hoạt động như mong đợi. + +376 +00:24:33,550 --> 00:24:37,450 +Vì vậy, bây giờ chúng tôi đã sẵn sàng để giải quyết phần cuối cùng, đó là pha cà phê. + +377 +00:24:38,050 --> 00:24:42,580 +Nếu giao dịch thành công và có đủ tài nguyên để tạo ra đồ uống mà + +378 +00:24:42,580 --> 00:24:47,350 +người dùng đã chọn, thì các thành phần để làm đồ uống sẽ được khấu trừ khỏi tài + +379 +00:24:47,350 --> 00:24:51,010 +nguyên của máy pha cà phê. Ví dụ, trước khi tôi mua một ly + +380 +00:24:51,070 --> 00:24:52,660 +cà phê, tôi có 300ml nước. + +381 +00:24:53,050 --> 00:24:57,010 +Sau khi tôi mua latte được giảm 200 đến 100 và điều tương tự + +382 +00:24:57,340 --> 00:25:00,520 +cũng xảy ra với các giá trị thành phần khác. + +383 +00:25:00,790 --> 00:25:04,750 +Nhưng tất nhiên tiền sẽ tăng lên vì tôi đã thực hiện + +384 +00:25:04,750 --> 00:25:08,770 +thanh toán ở bước trước. Hãy đưa điều này vào câu lệnh if + +385 +00:25:08,800 --> 00:25:13,800 +vì hãy nhớ rằng hàm này trả về true khi khoản thanh toán được chấp nhận hoặc false nếu số + +386 +00:25:14,440 --> 00:25:15,820 +tiền của họ không đủ. + +387 +00:25:16,240 --> 00:25:19,510 +Vì vậy, đây là nơi chúng tôi sẽ gọi cho chức + +388 +00:25:19,540 --> 00:25:23,740 +năng tiếp theo là pha cà phê. Vì vậy, hãy + +389 +00:25:23,770 --> 00:25:27,940 +tạo make_coffee. Để pha cà phê, chúng ta cần + +390 +00:25:27,940 --> 00:25:32,940 +biết tên thức uống để có thể cho người dùng biết đây là thức uống cụ thể + +391 +00:25:33,910 --> 00:25:34,810 +của bạn. + +392 +00:25:35,230 --> 00:25:39,130 +Và nó cũng sẽ cần phải có các thành phần theo thứ tự. + +393 +00:25:40,060 --> 00:25:45,060 +Mục tiêu của chức năng này là khấu trừ các thành phần cần thiết từ + +394 +00:25:46,960 --> 00:25:49,660 +các tài nguyên. Để làm được + +395 +00:25:49,840 --> 00:25:54,840 +điều đó, chúng tôi sẽ nắm các thành phần của đơn hàng và + +396 +00:25:55,900 --> 00:26:00,730 +chúng tôi sẽ lặp lại chúng. Vì vậy, đối với mỗi mục trong + +397 +00:26:01,630 --> 00:26:05,770 +order_ingredient, chúng tôi sẽ xem xét bên trong các tài nguyên cho + +398 +00:26:06,220 --> 00:26:10,570 +mục cụ thể đó và chúng tôi sẽ trừ số tiền trong order_ingredient. + +399 +00:26:11,620 --> 00:26:14,410 +Và khi tất cả những điều đó được hoàn thành, vì vậy vòng lặp + +400 +00:26:14,440 --> 00:26:19,440 +for kết thúc, sau đó chúng ta có thể in và thậm chí chúng ta có thể thêm một biểu tượng cảm xúc vào điều này. + +401 +00:26:21,160 --> 00:26:21,993 +4: Đúng. + +402 +00:26:22,390 --> 00:26:22,930 +0: Trên máy Mac, + +403 +00:26:22,930 --> 00:26:27,850 +bạn có thể chèn biểu tượng cảm xúc bằng cách vào phần chỉnh sửa, biểu tượng cảm xúc và biểu tượng. Trên Windows, điều dễ dàng nhất để làm là + +404 +00:26:27,850 --> 00:26:32,560 +chỉ cần tìm kiếm trên Google một biểu tượng cảm xúc cà phê, sau đó sao chép + +405 +00:26:32,890 --> 00:26:35,200 +và dán nó vào mã của bạn. + +406 +00:26:35,860 --> 00:26:40,060 +Vì vậy, bây giờ chúng ta hãy gọi make_coffee ở đây và để ý + +407 +00:26:40,240 --> 00:26:42,940 +xem nếu chúng ta đang ở đây, máy + +408 +00:26:44,250 --> 00:26:47,610 +có đang bật và nó không phải là bất kỳ lựa chọn + +409 +00:26:48,270 --> 00:26:52,530 +nào khác trước đó và khi đó tài nguyên đủ và giao dịch thành công. + +410 +00:26:52,560 --> 00:26:57,560 +Đây là tất cả các bước mà chúng tôi đã thực hiện để đến giai đoạn cụ thể này trong mã + +411 +00:26:57,630 --> 00:26:58,463 +của chúng tôi. + +412 +00:26:58,680 --> 00:27:02,790 +Vì vậy, bây giờ chúng ta sẽ pha cà phê và chúng ta sẽ chuyển qua hai việc. + +413 +00:27:02,820 --> 00:27:06,900 +Vì vậy, chúng ta hãy chỉ xem lại lời nhắc. Chúng tôi cần cung cấp tên + +414 +00:27:06,960 --> 00:27:11,960 +đồ uống sẽ là lựa chọn mà người dùng đã nhập, và thứ tự các thành phần + +415 +00:27:12,060 --> 00:27:16,260 +sẽ đến từ đồ uống và nó nằm dưới các thành phần chính. + +416 +00:27:17,700 --> 00:27:21,810 +Vì vậy, bây giờ chúng tôi đã sẵn sàng để kiểm tra và chạy mã của chúng tôi một lần nữa. + +417 +00:27:22,230 --> 00:27:26,340 +Giả sử, tôi muốn một ly latte và tôi sẽ nạp thật nhiều tiền vào. + +418 +00:27:27,180 --> 00:27:31,200 +Và bây giờ tôi có cốc cà phê của mình. Nếu tôi nhấn báo cáo, + +419 +00:27:31,350 --> 00:27:36,150 +bạn sẽ có thể thấy rằng một loạt tài nguyên đã bị trừ đi + +420 +00:27:36,150 --> 00:27:40,800 +và số tiền được tăng lên. Nếu tôi cố gắng gọi một + +421 +00:27:40,830 --> 00:27:45,750 +ly latte khác, nó sẽ thất bại vì không đủ nước và không đủ sữa. + +422 +00:27:46,620 --> 00:27:51,030 +Bạn có thể thấy rằng nó sẽ không để tôi đi qua miễn là một trong + +423 +00:27:51,030 --> 00:27:52,770 +những thành phần không đủ. + +424 +00:27:54,390 --> 00:27:59,070 +Vì vậy, chúng tôi hiện đã quản lý để đáp ứng tất cả các yêu cầu của chương trình máy pha cà phê + +425 +00:27:59,100 --> 00:28:00,450 +của chúng tôi. Bây giờ, + +426 +00:28:00,450 --> 00:28:04,620 +điều này có thể phức tạp hơn rất nhiều mà bạn có thể thêm vào máy pha cà + +427 +00:28:05,010 --> 00:28:10,010 +phê của mình, nhưng về cơ bản những gì tôi muốn cho bạn thấy hôm nay là cách bạn lập trình một + +428 +00:28:11,160 --> 00:28:12,660 +thứ gì đó tồn tại trong + +429 +00:28:12,690 --> 00:28:17,690 +cuộc sống thực, chẳng hạn như một máy pha cà phê và thậm chí một cái gì đó có vẻ đơn giản + +430 +00:28:18,030 --> 00:28:20,760 +như một máy pha cà phê. Nó có thể dẫn + +431 +00:28:20,790 --> 00:28:25,080 +đến rất nhiều lỗi, rất nhiều lỗi và rất nhiều đau khổ, nhưng tốt của nó. + +432 +00:28:25,080 --> 00:28:26,370 +Càng đấu tranh, bạn + +433 +00:28:26,670 --> 00:28:31,170 +càng tiến gần đến mục tiêu của mình. Và vai trò của hàm + +434 +00:28:31,560 --> 00:28:35,100 +càng rõ ràng, bạn càng dễ dàng gỡ rối logic. + +435 +00:28:36,480 --> 00:28:39,990 +Nếu bạn muốn xem mã hoàn chỉnh mà tôi đã viết + +436 +00:28:39,990 --> 00:28:40,823 +trong bài học + +437 +00:28:40,860 --> 00:28:45,000 +này, thì chỉ cần truy cập liên kết trong các tài nguyên và bạn + +438 +00:28:45,000 --> 00:28:45,720 +sẽ + +439 +00:28:45,720 --> 00:28:50,700 +có thể xem nó trong Repl. nó. Đảm bảo rằng bạn đã quản lý để + +440 +00:28:51,060 --> 00:28:56,060 +khắc phục mọi sự cố trong mã của mình và mã chạy chính xác theo cách như mong đợi trong các yêu cầu của chương trình. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/008 Location, Location, Location - Pavlov's Coding Corner.mp4 b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/008 Location, Location, Location - Pavlov's Coding Corner.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..af953277dca7f9c9425c14aa6864c969b5fb5bad --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/008 Location, Location, Location - Pavlov's Coding Corner.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b04eaa8a8469844df6aae307b8f06e76eee77ff25aad2f5aadad9e177580593 +size 41122572 diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/008 Location, Location, Location - Pavlov's Coding Corner_vi.srt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/008 Location, Location, Location - Pavlov's Coding Corner_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..297317b96f90959462a39ad9ffe54eabbee93919 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/008 Location, Location, Location - Pavlov's Coding Corner_vi.srt @@ -0,0 +1,60 @@ +1 +00:00:01,120 --> 00:00:04,220 +Hoàn thành tốt ngày 15. + +2 +00:00:04,780 --> 00:00:06,620 +Bạn đang làm rất, rất tốt. + +3 +00:00:07,270 --> 00:00:15,070 +Bây giờ, hôm nay, tôi có một mẹo học khác cho bạn và mẹo nghiên cứu liên quan đến nơi bạn học. Bởi vì những gì tôi nhận thấy là khi tôi kết + +4 +00:00:15,310 --> 00:00:22,180 +hợp khu vực nơi tôi có mọi hoạt động giải trí, nơi tôi xem Netflix, nơi tôi ăn uống hoặc + +5 +00:00:22,180 --> 00:00:29,590 +nơi tôi vui vẻ với nơi tôi học, thì tôi có thể bắt đầu hơi bối rối và não nề. giống như, + +6 +00:00:29,590 --> 00:00:33,120 +"Này, đợi một chút. Chúng tôi đã từng xem Netflix ở đây. + +7 +00:00:33,430 --> 00:00:35,700 +Bây giờ tại sao chúng ta đang làm điều thực sự khó khăn này? + +8 +00:00:35,830 --> 00:00:40,100 +Tôi chỉ muốn quay lại xem Netflix đó và có thể là một ít bỏng ngô. “Vì vậy, những gì bạn có + +9 +00:00:40,750 --> 00:00:48,700 +thể làm là xác định khu vực học tập, tìm một chút ngóc ngách, đi xuống gầm cầu thang nếu bạn + +10 +00:00:48,700 --> 00:00:49,270 +phải. + +11 +00:00:49,570 --> 00:00:55,960 +Chỉ cần đảm bảo rằng bạn chỉ học ở một nơi đó và bạn không làm bất cứ điều gì khác. Theo cách đó, mỗi khi bạn bước vào không gian đó, + +12 +00:00:55,960 --> 00:01:00,790 +bạn sẽ cảm thấy như, "Ồ, tôi biết. Tôi biết mình phải làm gì ở đây. + +13 +00:01:00,970 --> 00:01:01,900 +Tôi phải học. "Và + +14 +00:01:02,380 --> 00:01:06,310 +đây là một mẹo thực sự đã giúp tôi đánh bại sự trì hoãn. + +15 +00:01:06,490 --> 00:01:08,050 +Vì vậy, tôi hy vọng bạn cũng sẽ thử nó. + diff --git a/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/external-links.txt b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..9be1e3b414b1680057ea2bfc9e4f7360ccc6a388 --- /dev/null +++ b/part2/15 - Day 15 - Intermediate - Local Development Environment Setup & the Coffee Machine/external-links.txt @@ -0,0 +1,33 @@ + +001 Step-1-Install-Python-3-on-your-Machine +https://www.python.org/downloads/ + +002 Step-2-Download-Install-Pycharm +https://www.jetbrains.com/pycharm/download/ + +003 Python-PEP8-Style-Guide +https://www.python.org/dev/peps/pep-0008/ + +006 Day-15-Goal-Press-Play-button-bottom-right- +https://repl.it/@appbrewery/coffee-machine-final?embed=1&output=1#main.py + +006 Fork-the-Day-15-Starting-Repl +https://repl.it/@appbrewery/coffee-machine-start + +006 PyCharm-Keyboard-Shortcuts +https://www.jetbrains.com/help/pycharm/running-and-debugging-shortcuts.html?keymap=secondary_windows + +006 Add-a-Coffee-Emoji-from-Emojipedia.org +https://emojipedia.org/hot-beverage/ + +006 How-to-bring-up-the-Emoji-Keyboard-on-Windows-10 +https://support.microsoft.com/en-gb/help/4534547/windows-10-keyboard-tips-and-tricks + +006 How-to-bring-up-the-Emoji-Keyboard-on-Mac +https://support.apple.com/en-gb/guide/mac-help/mchlp1560/mac + +007 Day-15-Ending-Code +https://repl.it/@appbrewery/coffee-machine-final + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/001 Why do we need OOP and how does it work.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/001 Why do we need OOP and how does it work.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..00b7fbbc20ec0e9cdc6887110c7ef44c4a50d988 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/001 Why do we need OOP and how does it work.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:481f92c228023e0a8c5daabca50169e5c1c8505dc4a2677cf71e1ee944ac38dd +size 65227671 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/001 Why do we need OOP and how does it work_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/001 Why do we need OOP and how does it work_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..05394d8e9a69e1d1c648129bbee7e9f6616cdfd1 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/001 Why do we need OOP and how does it work_vi.srt @@ -0,0 +1,452 @@ +1 +00:00:00,030 --> 00:00:04,500 +Chào! Chào mừng bạn đến với Ngày 16 của 100 Ngày viết mã. Hôm nay, chúng ta + +2 +00:00:04,530 --> 00:00:05,100 +sẽ + +3 +00:00:05,100 --> 00:00:08,250 +khai thác những khẩu súng lớn, chúng ta sẽ + +4 +00:00:08,280 --> 00:00:12,210 +học về Lập trình hướng đối tượng hay còn gọi là OOP. + +5 +00:00:12,630 --> 00:00:16,890 +Tại sao chúng ta lại tìm hiểu về nó? Chà, nếu bạn nghĩ lại dự án của ngày + +6 +00:00:17,310 --> 00:00:21,450 +hôm qua, một số bạn mà tôi chắc chắn rằng tại một số thời điểm trong quá trình + +7 +00:00:21,450 --> 00:00:25,740 +dự án, sẽ có cảm giác như thế này có gì đang xảy ra với mã của tôi không? + +8 +00:00:25,920 --> 00:00:30,060 +Và lý do là bởi vì mã của chúng ta ngày càng phức tạp, nó đang + +9 +00:00:30,330 --> 00:00:32,369 +cố gắng thực hiện rất nhiều thứ, + +10 +00:00:32,490 --> 00:00:35,850 +và nó đang cố gắng quản lý một loạt các mối quan hệ. + +11 +00:00:36,150 --> 00:00:39,540 +Vì vậy, một hàm đang thay đổi một biến, và sau đó + +12 +00:00:39,540 --> 00:00:43,740 +chính hàm đó đang thực hiện một điều gì đó khác với một biến khác. + +13 +00:00:44,100 --> 00:00:48,810 +Và tại một số điểm, logic của mã của chúng ta bắt đầu trông rất giống + +14 +00:00:48,810 --> 00:00:49,643 +mì Ý. + +15 +00:00:49,920 --> 00:00:54,630 +Và tại thời điểm này, thật khó để theo dõi và ghi nhớ những gì đang thực sự diễn + +16 +00:00:54,720 --> 00:00:56,460 +ra trong mã của chúng tôi. + +17 +00:00:57,180 --> 00:01:00,510 +Vì vậy, phong cách lập trình này được gọi là Lập trình + +18 +00:01:00,510 --> 00:01:05,510 +theo thủ tục, nơi chúng ta thiết lập các thủ tục hoặc hàm thực hiện những việc cụ thể. + +19 +00:01:06,600 --> 00:01:11,250 +Và sau đó một thủ tục này dẫn đến một thủ tục khác, và nhìn chung, máy tính + +20 +00:01:11,250 --> 00:01:15,690 +chủ yếu hoạt động từ trên xuống dưới và sau đó nhảy ra một chức năng + +21 +00:01:15,690 --> 00:01:16,523 +khi cần thiết. + +22 +00:01:17,250 --> 00:01:22,110 +Lập trình theo thủ tục là một trong những mô hình sớm nhất của Lập trình. + +23 +00:01:22,410 --> 00:01:27,210 +Trên thực tế, trong những ngày chúng ta có các ngôn ngữ cũ hơn như Fortran và + +24 +00:01:27,840 --> 00:01:30,840 +COBOL, chúng hoàn toàn dựa vào lập trình thủ tục như + +25 +00:01:30,840 --> 00:01:32,670 +những gì chúng ta đang làm. + +26 +00:01:33,780 --> 00:01:36,120 +Nhưng sự gia tăng độ phức tạp, + +27 +00:01:36,150 --> 00:01:40,410 +sự gia tăng số lượng các mối quan hệ mà chúng ta cần ghi + +28 +00:01:40,800 --> 00:01:45,540 +nhớ và quản lý bắt đầu khiến nó giống như lịch sử hẹn hò của Kardashians. + +29 +00:01:45,930 --> 00:01:47,160 +Và nó trở nên rất, rất + +30 +00:01:47,160 --> 00:01:52,020 +khó hiểu bởi vì mọi người đã liên lạc với người khác. Bây giờ, kiểu quan hệ mà + +31 +00:01:52,080 --> 00:01:56,280 +tôi thích là một với một, tôi và chiếc ghế dài của tôi. + +32 +00:01:56,700 --> 00:02:01,700 +Vậy làm thế nào chúng ta có thể duy trì một mối quan hệ đơn giản trong mã của mình trong khi + +33 +00:02:03,120 --> 00:02:07,320 +có thể viết nhiều dự án phức tạp hơn? Chà, đây là lúc mà + +34 +00:02:07,350 --> 00:02:11,430 +mô hình Hướng đối tượng trở nên thực sự hữu ích. + +35 +00:02:12,090 --> 00:02:17,090 +Bây giờ, hãy tưởng tượng rằng bạn được giao nhiệm vụ tạo ra chương trình cho một chiếc + +36 +00:02:18,150 --> 00:02:21,090 +ô tô tự lái. Bây giờ, như bạn có + +37 +00:02:21,090 --> 00:02:24,660 +thể tưởng tượng, đây là một dự án khá phức tạp và nó rất nhiều, + +38 +00:02:24,660 --> 00:02:29,220 +rất nhiều rãnh phía trên máy pha cà phê mà chúng tôi đã phải vật lộn cho đến nay. + +39 +00:02:29,970 --> 00:02:33,630 +Nhưng nếu bạn phá vỡ nó thì sao? Xe ô tô tự lái là gì? + +40 +00:02:34,020 --> 00:02:38,160 +Các thành phần khác nhau tạo nên một chiếc xe tự lái là gì? Chà, nó có thể cần một số + +41 +00:02:38,220 --> 00:02:43,220 +loại mô-đun camera để theo dõi những gì đang trên đường và để nhận ra những gì trên đường, + +42 +00:02:43,560 --> 00:02:45,360 +nó có thể sẽ cần một + +43 +00:02:45,990 --> 00:02:50,990 +dạng phát hiện làn đường để biết liệu chúng ta có thực sự đang ở trong làn đường hay + +44 +00:02:51,750 --> 00:02:56,750 +không hoặc nếu chúng ta cần tắt hoặc nếu chúng ta cần đỗ xe và sẽ cần một số + +45 +00:02:58,560 --> 00:03:02,740 +cách điều hướng để khi người dùng nói, tôi muốn đến ngân hàng, họ xác định + +46 +00:03:02,980 --> 00:03:05,290 +chi nhánh họ muốn đến và sau đó + +47 +00:03:05,380 --> 00:03:09,370 +điều hướng được thiết lập và chiếc xe biết làm thế nào để đến đó. + +48 +00:03:09,940 --> 00:03:14,080 +Và cuối cùng, có lẽ bạn sẽ cần một số hình thức quản lý nhiên liệu, phải không? + +49 +00:03:14,140 --> 00:03:16,330 +Điều gì sẽ xảy ra khi nhiên liệu gần hết? + +50 +00:03:16,660 --> 00:03:20,290 +Nó có nên đi và tự động nạp tiền tại một điểm xác định không? + +51 +00:03:20,800 --> 00:03:24,010 +Bây giờ rõ ràng là tôi đang đơn giản hóa nhiệm vụ này. Còn rất nhiều, rất nhiều thứ + +52 +00:03:24,010 --> 00:03:27,160 +khác liên quan đến việc tạo ra một chiếc ô tô tự động. + +53 +00:03:27,730 --> 00:03:32,140 +Nhưng chúng tôi đã quản lý để chia nó thành nhiều mô-đun mà chúng tôi có thể nghĩ + +54 +00:03:32,320 --> 00:03:34,000 +về việc giải quyết, phải không? + +55 +00:03:34,540 --> 00:03:39,540 +Nhưng hãy tưởng tượng nếu bạn có cả một nhóm đều đang làm việc trong dự án này + +56 +00:03:39,790 --> 00:03:40,750 +và trong nhóm + +57 +00:03:40,750 --> 00:03:45,010 +đó, có các nhóm phụ đang làm việc trên từng mô-đun khác nhau này. + +58 +00:03:45,490 --> 00:03:50,490 +Vậy thì bằng cách chia nhỏ nhiệm vụ phức tạp lớn này thành các mô-đun riêng biệt, sau đó tất + +59 +00:03:51,520 --> 00:03:54,640 +cả chúng ta có thể làm việc đồng thời trên chiếc xe + +60 +00:03:55,570 --> 00:03:57,820 +này, cải thiện hàng loạt năng suất của + +61 +00:03:58,180 --> 00:04:02,500 +chúng ta, khiến việc xây dựng tất cả phần mềm cho chiếc xe này nhanh hơn nhiều. + +62 +00:04:03,280 --> 00:04:06,850 +Thêm vào đó, rất nhiều mô-đun này có thể tái sử dụng. + +63 +00:04:07,270 --> 00:04:12,270 +Vì vậy, nếu điều đó xảy ra vào năm tới, chúng tôi được giao nhiệm vụ chế tạo một chiếc máy + +64 +00:04:12,640 --> 00:04:16,390 +bay không người lái, tốt, rất nhiều mô-đun lập trình mà chúng tôi đã xây dựng, + +65 +00:04:16,390 --> 00:04:18,700 +như mô-đun camera, quản lý nhiên liệu, điều hướng, + +66 +00:04:18,910 --> 00:04:23,910 +tất cả sẽ vô cùng hữu ích trong phần mềm giao hàng bằng máy bay không người lái của chúng tôi. + +67 +00:04:24,370 --> 00:04:29,370 +Và bởi vì chúng tôi đã lấy ra những đoạn mã riêng lẻ này và mô-đun hóa chúng bằng cách sử + +68 +00:04:29,890 --> 00:04:32,020 +dụng Lập trình hướng đối tượng, chúng tôi + +69 +00:04:32,260 --> 00:04:36,340 +sẽ không phải viết lại chúng theo cách mà chúng tôi có thể cần nếu chúng tôi + +70 +00:04:36,460 --> 00:04:38,380 +đang sử dụng lập trình thủ tục. + +71 +00:04:39,180 --> 00:04:44,180 +Vậy chính xác thì Lập trình hướng đối tượng là gì? Chúng tôi đã thấy rằng chúng tôi có + +72 +00:04:46,140 --> 00:04:49,620 +thể chia một nhiệm vụ lớn hơn thành các phần nhỏ hơn. + +73 +00:04:50,070 --> 00:04:54,690 +Và mỗi phần trong số đó có thể được làm việc bởi các nhóm riêng biệt, những người + +74 +00:04:54,990 --> 00:04:59,460 +riêng biệt và mỗi phần đó có thể được tái sử dụng nếu chúng ta cần cùng + +75 +00:04:59,460 --> 00:05:03,030 +một chức năng trong tương lai. Nhưng Lập trình hướng đối tượng + +76 +00:05:03,030 --> 00:05:05,940 +thực sự còn đưa khái niệm đó đi xa hơn. + +77 +00:05:06,510 --> 00:05:08,130 +Và tôi nghĩ cách tốt nhất để giải + +78 +00:05:08,340 --> 00:05:11,730 +thích điều đó là tưởng tượng rằng bạn được giao nhiệm vụ điều hành một nhà hàng. + +79 +00:05:12,420 --> 00:05:16,320 +Vì vậy, bạn tiếp quản nhà hàng này từ người chú đã mất từ lâu của mình và + +80 +00:05:16,440 --> 00:05:19,980 +bạn nhận ra rằng việc điều hành một nhà hàng thực sự rất khó khăn. + +81 +00:05:20,550 --> 00:05:25,550 +Vì vậy, trước tiên, bạn phải là lễ tân và bạn đặt chỗ cho khách của nhà hàng của + +82 +00:05:26,220 --> 00:05:29,400 +bạn và sau đó khi họ gọi món gì đó, bạn phải + +83 +00:05:29,430 --> 00:05:32,520 +là nhân viên phục vụ và mang món cho họ. + +84 +00:05:32,970 --> 00:05:35,370 +Và sau đó tất nhiên đơn đặt hàng cần phải được nấu lên, phải không? + +85 +00:05:35,370 --> 00:05:39,600 +Vì vậy, bạn cũng sẽ chạy vào bếp và trở thành đầu bếp, tạo ra những thứ + +86 +00:05:39,600 --> 00:05:41,130 +họ đặt hàng và cuối cùng, + +87 +00:05:41,130 --> 00:05:44,550 +bạn cũng sẽ trở thành người dọn dẹp ngăn nắp sau khi mọi + +88 +00:05:44,580 --> 00:05:47,070 +người đã rời đi. Như bạn có thể + +89 +00:05:47,070 --> 00:05:50,280 +tưởng tượng, nếu bạn là một người phải làm tất cả những công + +90 +00:05:50,730 --> 00:05:55,410 +việc này, đó sẽ là một ngày khá khó khăn. Trên thực tế, có những nhà hàng chỉ dành + +91 +00:05:55,500 --> 00:05:58,310 +cho một người, và tôi đã thấy một số hoạt động + +92 +00:05:58,700 --> 00:06:01,970 +thực sự hiệu quả ở Nhật Bản, nơi bạn có một người nhận + +93 +00:06:02,300 --> 00:06:05,300 +đặt hàng, người nấu đồ ăn, người đang thu dọn sau bạn. + +94 +00:06:05,720 --> 00:06:10,040 +Tuy nhiên, hạn chế ở đây là nhìn vào số lượng chỗ ngồi của anh ta. + +95 +00:06:10,190 --> 00:06:15,190 +Bạn không thể có một nhà hàng lớn điều hành mọi thứ một mình. Theo cách tương tự, chúng ta không thể tạo + +96 +00:06:16,340 --> 00:06:20,780 +một dự án phần mềm rất phức tạp và thực sự lớn nếu chúng ta đang + +97 +00:06:21,170 --> 00:06:25,370 +sử dụng kiểu lập trình theo thủ tục, nơi chúng ta đang điều hành một + +98 +00:06:25,370 --> 00:06:27,380 +ban nhạc nam. Nó trở nên + +99 +00:06:27,380 --> 00:06:30,620 +rất, rất phức tạp và rất khó quản lý rất nhanh. + +100 +00:06:31,280 --> 00:06:33,260 +Vì vậy, chúng ta hãy xem xét các thay thế. + +101 +00:06:33,770 --> 00:06:38,770 +Điều gì sẽ xảy ra nếu chúng ta vừa thuê một nhóm người mà mỗi người đều có vai + +102 +00:06:39,290 --> 00:06:42,590 +trò cá nhân của riêng mình. Họ được đào tạo cho điều đó, họ biết phải làm gì. + +103 +00:06:42,800 --> 00:06:46,940 +Người phục vụ biết cách chờ đợi và người đầu bếp biết cách nấu ăn. Trong trường hợp này, bạn chỉ có thể + +104 +00:06:46,940 --> 00:06:47,600 +là + +105 +00:06:47,600 --> 00:06:52,600 +người quản lý và bạn có thể quản lý tất cả nhân viên của mình và cho họ biết + +106 +00:06:53,210 --> 00:06:54,560 +họ cần phải làm gì. + +107 +00:06:54,980 --> 00:06:59,510 +Nhưng sau đó bạn sẽ không phải lo lắng về các chi tiết thực tế về chính xác cách họ cần + +108 +00:06:59,510 --> 00:07:02,660 +để thực hiện công việc của mình. Vì vậy, ví dụ, bạn không cần + +109 +00:07:02,660 --> 00:07:04,040 +phải nói với người phục vụ + +110 +00:07:04,050 --> 00:07:08,300 +làm thế nào để chờ đợi khách hàng và bạn không cần phải nói với đầu bếp cách nấu một quả + +111 +00:07:08,450 --> 00:07:10,370 +trứng vì họ đã biết cách làm điều đó. + +112 +00:07:11,000 --> 00:07:16,000 +Và chúng ta có thể sử dụng cùng một khái niệm để đơn giản hóa các mối quan hệ trong mã của chúng ta + +113 +00:07:17,090 --> 00:07:21,080 +và làm cho nó có thể mở rộng cho một dự án lớn hơn và phức tạp hơn. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/002 How to use OOP Classes and Objects.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/002 How to use OOP Classes and Objects.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..31684f4fb73e37c2175e75fa9d45525a8dd2b90d --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/002 How to use OOP Classes and Objects.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d25493b30724725c9ab82b7df468542d12b45b388eb993c4bcdde22a9ce4f8d +size 9683491 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/002 How to use OOP Classes and Objects_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/002 How to use OOP Classes and Objects_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5b86b15e1c47ee549f3363b14dd4901a8ee8d49e --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/002 How to use OOP Classes and Objects_vi.srt @@ -0,0 +1,244 @@ +1 +00:00:00,060 --> 00:00:04,620 +Chúng ta đã biết một chút lý do tại sao Lập trình hướng đối tượng thực sự hữu + +2 +00:00:04,980 --> 00:00:09,510 +ích, nhưng bây giờ hãy xem cách bạn thực sự triển khai Lập trình hướng đối tượng + +3 +00:00:09,510 --> 00:00:10,530 +như thế nào. + +4 +00:00:11,370 --> 00:00:15,240 +Vì vậy, trong bài học trước, chúng ta đã nói về ví dụ này về + +5 +00:00:15,750 --> 00:00:18,600 +nhà hàng, nơi chúng tôi thuê ba loại nhân viên và + +6 +00:00:19,020 --> 00:00:24,020 +chúng tôi có một người quản lý sau đó sẽ quản lý tất cả ba loại nhân viên khác + +7 +00:00:24,300 --> 00:00:25,830 +nhau này. Bây giờ, + +8 +00:00:26,160 --> 00:00:31,160 +lý do tại sao Lập trình hướng đối tượng được gọi như vậy là vì nó đang cố + +9 +00:00:31,410 --> 00:00:34,350 +gắng mô hình hóa một đối tượng trong thế giới thực. + +10 +00:00:34,770 --> 00:00:39,570 +Vì vậy, giả sử rằng chúng tôi đang tạo một nhà hàng ảo. Trong trường hợp này, chúng ta có thể phải + +11 +00:00:39,570 --> 00:00:43,320 +mô hình hóa một đầu bếp ảo, người phục vụ, người dọn dẹp + +12 +00:00:43,350 --> 00:00:44,760 +và người quản lý. + +13 +00:00:45,270 --> 00:00:50,270 +Vì vậy, hãy giả sử rằng chúng tôi sẽ làm mẫu một người phục vụ. Để làm mẫu cho người phục vụ của chúng + +14 +00:00:50,910 --> 00:00:55,910 +ta, có lẽ chúng ta cần phải suy nghĩ hai điều: nó có gì và nó làm gì. + +15 +00:00:56,790 --> 00:01:00,540 +Về mặt những gì nó có, à, nó có thể có các biến như, nó + +16 +00:01:00,570 --> 00:01:02,790 +đang giữ một cái đĩa, đúng hay sai? + +17 +00:01:03,360 --> 00:01:08,360 +Hay nó chịu trách nhiệm về những bảng nào? Có thể là bảng 4, 5 và 6. + +18 +00:01:09,510 --> 00:01:11,940 +Bây giờ nó cũng có những thứ mà nó làm. + +19 +00:01:12,390 --> 00:01:17,390 +Có thể họ có thể đặt hàng cho đầu bếp và có thể họ cũng cần thanh + +20 +00:01:17,670 --> 00:01:22,470 +toán và thêm tiền cho nhà hàng. Vì vậy, hai thứ khác nhau này, những + +21 +00:01:22,500 --> 00:01:25,650 +gì người phục vụ có và những gì người phục + +22 +00:01:25,650 --> 00:01:30,650 +vụ làm là hai thứ quan trọng nhất tạo nên một đối tượng: thuộc tính và phương + +23 +00:01:32,520 --> 00:01:34,980 +thức của nó. Bằng cách nhìn + +24 +00:01:35,010 --> 00:01:39,750 +vào mã, bạn có thể thấy rằng các thuộc tính về cơ bản là một biến. + +25 +00:01:40,260 --> 00:01:45,260 +Thuộc tính chỉ là một từ hoa mỹ để chỉ một biến được liên kết với một đối tượng được mô hình hóa + +26 +00:01:46,410 --> 00:01:48,660 +như người phục vụ của chúng ta ở đây. + +27 +00:01:49,260 --> 00:01:52,500 +Bởi vì nó không chỉ là một bit nổi tự do của một biến, phải không? + +28 +00:01:52,500 --> 00:01:54,690 +Nó không chỉ ở đâu đó trong chính của chúng tôi. py + +29 +00:01:55,050 --> 00:01:59,130 +Nó thực sự là một biến được gắn với một đối tượng cụ thể. + +30 +00:01:59,400 --> 00:02:02,130 +Đó là bàn của người phục vụ chịu trách nhiệm. + +31 +00:02:02,850 --> 00:02:05,970 +Bây giờ phương pháp đi dọc theo cùng một tĩnh mạch. Như bạn có thể thấy + +32 +00:02:06,060 --> 00:02:08,520 +rõ, chúng chỉ là các hàm nhưng chúng tôi + +33 +00:02:09,090 --> 00:02:14,090 +gọi nó là một phương thức vì nó là một hàm mà một đối tượng được mô hình hóa + +34 +00:02:14,730 --> 00:02:16,500 +cụ thể có thể thực hiện. + +35 +00:02:17,160 --> 00:02:22,160 +Chúng tôi cần một đối tượng bồi bàn để nhận đơn đặt hàng và chúng tôi cần một đối + +36 +00:02:22,260 --> 00:02:25,950 +tượng bồi bàn để nhận thanh toán. Một lần nữa, đây không chỉ là các hàm thả nổi tự do. + +37 +00:02:26,520 --> 00:02:31,520 +Bây giờ, có rất nhiều từ mới là một phần của Lập trình hướng đối tượng và + +38 +00:02:31,740 --> 00:02:35,160 +lập trình nói chung, chúng ta sẽ thấy chúng lặp đi lặp + +39 +00:02:35,220 --> 00:02:38,160 +lại, và cuối cùng nó sẽ trở thành một từ + +40 +00:02:38,160 --> 00:02:42,720 +sẽ có trong từ điển của bạn. Nhưng hiện tại, hãy nhớ rằng trong Lập trình hướng + +41 +00:02:42,720 --> 00:02:43,350 +đối tượng, + +42 +00:02:43,350 --> 00:02:48,350 +chúng tôi đang cố gắng mô hình hóa các đối tượng trong cuộc sống thực và những đối tượng đó có những + +43 +00:02:49,590 --> 00:02:51,720 +thứ và chúng cũng có thể làm được những thứ. + +44 +00:02:52,110 --> 00:02:54,780 +Những thứ mà chúng có là thuộc tính của chúng + +45 +00:02:55,200 --> 00:02:59,980 +và những thứ này thường được mô hình hóa bằng các biến, và những thứ chúng có thể làm được + +46 +00:03:00,280 --> 00:03:03,400 +gọi là phương thức và chúng được mô hình hóa bởi các hàm. + +47 +00:03:04,060 --> 00:03:09,060 +Vì vậy, về cơ bản, một đối tượng chỉ là một cách kết hợp một số phần dữ + +48 +00:03:10,810 --> 00:03:14,170 +liệu và một số chức năng hoàn toàn trong cùng một thứ. + +49 +00:03:15,370 --> 00:03:20,370 +Nhưng chúng ta thực sự có thể có nhiều đối tượng được tạo từ cùng một loại. + +50 +00:03:21,190 --> 00:03:24,940 +Vì vậy, khi chúng tôi đã mô hình hóa một công việc cụ thể trong nhà hàng ảo + +51 +00:03:25,030 --> 00:03:26,800 +của mình như công việc của người phục + +52 +00:03:27,490 --> 00:03:31,090 +vụ, và chúng tôi đã tìm ra những thứ mà người phục vụ có và những thứ + +53 +00:03:31,090 --> 00:03:33,220 +mà nó có thể làm, tốt, chúng tôi thực sự + +54 +00:03:33,220 --> 00:03:38,220 +có thể tạo ra nhiều phiên bản của cùng một đối tượng. Vì vậy, chúng tôi có thể có Henry là + +55 +00:03:38,950 --> 00:03:43,270 +bồi bàn và chúng tôi cũng có thể có Betty là bồi bàn, và chúng tôi + +56 +00:03:43,840 --> 00:03:48,460 +có thể tạo ra bao nhiêu trong số này tùy thích từ cùng một bản thiết kế. + +57 +00:03:48,970 --> 00:03:53,970 +Và trong OOP, chúng tôi gọi đây là bản thiết kế, hoặc kiểu này, một lớp. + +58 +00:03:56,170 --> 00:04:01,170 +Và chúng tôi gọi những đối tượng riêng lẻ này được tạo ra từ bản thiết kế là + +59 +00:04:01,480 --> 00:04:02,320 +một đối tượng. + +60 +00:04:03,070 --> 00:04:08,070 +Vì vậy, bây giờ chúng ta hãy xem cách bạn sử dụng các bản thiết kế lớp này để tạo một đối tượng + +61 +00:04:08,380 --> 00:04:08,950 +thực tế. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Constructing Objects and Accessing their Attributes and Methods.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Constructing Objects and Accessing their Attributes and Methods.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2de3b35a93592dbbbcffd96fcbb39b0cf5cce742 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Constructing Objects and Accessing their Attributes and Methods.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b88978d9485ce5c021c4a73e754945fb0c2e468f5d6adc52866bcb51990c5e67 +size 115838407 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Constructing Objects and Accessing their Attributes and Methods_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Constructing Objects and Accessing their Attributes and Methods_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..63082de2609dac6c50e2816cb791fe0d85faa30c --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Constructing Objects and Accessing their Attributes and Methods_vi.srt @@ -0,0 +1,924 @@ +1 +00:00:00,000 --> 00:00:05,000 +[không nghe được] 1: Đây là bản thiết kế cho + +2 +00:00:06,020 --> 00:00:08,210 +một chiếc ô tô. + +3 +00:00:08,840 --> 00:00:13,010 +Và bản thiết kế đó chỉ rõ màu sắc của chiếc xe, + +4 +00:00:13,010 --> 00:00:17,900 +số bánh xe cần có, quãng đường đi được, bao nhiêu nhiên liệu, tất cả + +5 +00:00:17,900 --> 00:00:22,310 +các bit dữ liệu đó được kết hợp với tất cả các chức + +6 +00:00:22,340 --> 00:00:26,840 +năng của nó như khả năng lái xe, khả năng dừng và phá vỡ. + +7 +00:00:27,470 --> 00:00:32,470 +Và bản thiết kế mô hình một chiếc xe hơi ngoài đời thực được gọi là đẳng cấp. + +8 +00:00:33,380 --> 00:00:35,060 +Và từ bản thiết kế này, lớp này, + +9 +00:00:35,060 --> 00:00:40,040 +chúng ta có thể tạo ra bao nhiêu đối tượng tùy thích. Bây giờ, đối tượng là thứ + +10 +00:00:40,040 --> 00:00:43,970 +thực sự mà chúng ta sẽ sử dụng trong mã của mình. + +11 +00:00:44,720 --> 00:00:47,090 +Đoạn mã tương đương với những gì vừa + +12 +00:00:47,150 --> 00:00:50,300 +xảy ra, tạo một đối tượng mới từ một bản thiết kế, + +13 +00:00:50,480 --> 00:00:54,770 +trông giống như thế này trong Python. Bạn có lớp thường + +14 +00:00:55,010 --> 00:00:59,930 +được viết với chữ cái đầu tiên của mỗi từ được viết hoa, + +15 +00:01:00,350 --> 00:01:02,510 +được gọi là trường hợp Pascal. + +16 +00:01:03,230 --> 00:01:08,030 +Điều này là để phân biệt nó với tất cả các tên biến và hàm mà chúng tôi + +17 +00:01:08,030 --> 00:01:12,140 +cung cấp trong Python, trong đó mỗi từ được phân tách bằng dấu gạch dưới. + +18 +00:01:12,740 --> 00:01:13,790 +Vì vậy, trong trường + +19 +00:01:14,090 --> 00:01:19,090 +hợp này, chiếc xe là một đối tượng và nó được tạo ra từ bản thiết kế xe hơi này. + +20 +00:01:21,320 --> 00:01:26,320 +Tất cả những gì chúng ta phải làm để tạo đối tượng từ lớp là đặt tên cho + +21 +00:01:27,260 --> 00:01:32,150 +đối tượng, nó có thể là bất kỳ thứ gì bạn muốn, đặt nó bằng tên của lớp + +22 +00:01:32,570 --> 00:01:36,920 +và sau đó là dấu ngoặc đơn, giống như cách nó kích hoạt chức năng, + +23 +00:01:37,220 --> 00:01:41,090 +nó kích hoạt việc xây dựng đối tượng này từ bản thiết kế. + +24 +00:01:41,990 --> 00:01:46,220 +Bây giờ, để chúng ta thực hành điều này và để thấy nó + +25 +00:01:46,580 --> 00:01:51,170 +hoạt động, chúng ta sẽ sử dụng một thư viện mã mà người khác đã tạo. + +26 +00:01:51,830 --> 00:01:56,830 +Và những gì nó cho phép chúng tôi làm là cuối cùng bắt đầu đưa đồ + +27 +00:01:57,290 --> 00:01:59,990 +họa lên màn hình. Tiền đề thực sự đơn giản. + +28 +00:02:00,410 --> 00:02:05,240 +Giả sử rằng ai đó ở đâu đó đã tạo ra một bản thiết kế cho một con rùa. + +29 +00:02:05,870 --> 00:02:09,050 +Bây giờ con rùa này có một cây cọ vẽ trên lưng, và + +30 +00:02:09,500 --> 00:02:13,460 +bạn có thể bảo con rùa nhúng cọ bằng các màu khác nhau, chọn một loại + +31 +00:02:13,790 --> 00:02:17,120 +cọ sơn có kích thước khác nhau và quan trọng nhất là bạn + +32 +00:02:17,210 --> 00:02:19,430 +có thể bảo nó vẽ lên màn hình. + +33 +00:02:20,300 --> 00:02:25,300 +Thư viện này được gọi là đồ họa con rùa và nó được tải sẵn với mỗi lần tải xuống + +34 +00:02:25,820 --> 00:02:29,150 +Python để chúng ta có thể bắt đầu với nó ngay lập tức. + +35 +00:02:30,200 --> 00:02:34,100 +Vì vậy, hãy tiếp tục và mở PyCharm và tạo một dự án mới. + +36 +00:02:34,700 --> 00:02:39,440 +Bây giờ tôi sẽ gọi của tôi, bắt đầu ngày 16 quy ước cũ và đảm bảo + +37 +00:02:41,240 --> 00:02:45,350 +rằng tôi đang sử dụng phiên bản Python mới nhất trong trình thông dịch cơ + +38 +00:02:45,680 --> 00:02:50,660 +sở của mình, tôi sẽ nhấp vào tạo. Bây giờ, khi bạn đã tạo dự án mới, hãy + +39 +00:02:51,080 --> 00:02:54,800 +tiếp tục và tạo dự án chính. py như chúng tôi đã luôn làm. + +40 +00:02:55,310 --> 00:02:56,143 +Trong trường + +41 +00:02:56,150 --> 00:03:00,610 +hợp của chúng ta, chúng ta sẽ tạo một đối tượng từ bản thiết kế mà người + +42 +00:03:00,610 --> 00:03:01,630 +khác đã tạo và + +43 +00:03:02,230 --> 00:03:05,650 +bản thiết kế nằm trong một mô-đun khác có tên là con rùa. + +44 +00:03:05,890 --> 00:03:07,990 +Vì vậy, chúng tôi sẽ phải nhập mô-đun đó. + +45 +00:03:09,190 --> 00:03:11,680 +Và chúng tôi biết rằng từ trước đó, + +46 +00:03:11,710 --> 00:03:16,710 +chúng tôi có thể nhập các mô-đun khác và sử dụng những thứ được khai báo bên trong + +47 +00:03:17,110 --> 00:03:21,340 +mô-đun bằng cách nhập nó, sau đó khai thác nhiều thứ khác nhau trong đó. + +48 +00:03:21,790 --> 00:03:25,600 +Vì vậy, ví dụ, nếu tôi định tạo một tệp mới khác mà + +49 +00:03:25,810 --> 00:03:27,400 +tôi sẽ gọi là another_module. + +50 +00:03:29,470 --> 00:03:33,250 +Bây giờ bên trong another_module, giả sử tôi tạo một biến khác. + +51 +00:03:34,810 --> 00:03:38,290 +Và bây giờ tôi có thể quay trở lại chính của tôi. py, tôi có thể + +52 +00:03:38,320 --> 00:03:42,190 +nhập another_module của mình mà tôi vừa tạo và tôi có + +53 +00:03:42,580 --> 00:03:44,920 +thể khai thác biến đó nằm bên + +54 +00:03:44,950 --> 00:03:49,950 +trong một mô-đun khác bằng cách nói một mô-đun khác chấm một biến khác. + +55 +00:03:51,100 --> 00:03:54,010 +Bây giờ chúng ta hãy tiếp tục và chạy mã này như nó vốn có. + +56 +00:03:55,570 --> 00:04:00,400 +Và bạn có thể thấy giá trị của biến đó từ mô-đun khác đang được sử dụng bên trong chính + +57 +00:04:00,430 --> 00:04:02,200 +của chúng tôi. py + +58 +00:04:03,070 --> 00:04:07,510 +Bây giờ tôi muốn làm điều tương tự bằng cách sử dụng rùa, nhưng trong + +59 +00:04:07,540 --> 00:04:11,050 +trường hợp này, tôi muốn khai thác lớp có tên là rùa + +60 +00:04:11,320 --> 00:04:16,269 +được khai báo bên trong mô-đun rùa này. Cách diễn đạt hơi khó hiểu, nhưng hãy để tôi cho + +61 +00:04:16,300 --> 00:04:17,500 +bạn hiểu ý của tôi. + +62 +00:04:18,070 --> 00:04:23,070 +Vì vậy, tôi sẽ khai thác vào mô-đun rùa và tôi sẽ nắm + +63 +00:04:24,640 --> 00:04:28,390 +được một lớp rùa. Vì vậy, hãy chú ý + +64 +00:04:28,690 --> 00:04:33,070 +cách nó có chữ C ở đây biểu thị rằng đây là bản thiết + +65 +00:04:33,070 --> 00:04:38,070 +kế để tạo một đối tượng rùa mới. Bây giờ, hãy nhớ rằng để thực sự xây dựng đối tượng, + +66 +00:04:38,770 --> 00:04:41,260 +chúng ta cần thêm dấu ngoặc đơn vào cuối và bây + +67 +00:04:41,710 --> 00:04:46,600 +giờ chúng ta có thể lưu tất cả những thứ này vào một đối tượng thực tế, mà chúng ta cần đặt tên. + +68 +00:04:47,020 --> 00:04:49,180 +Vì vậy, tôi sẽ gọi con rùa của mình là + +69 +00:04:49,870 --> 00:04:54,790 +timmy và bây giờ tôi đã có một đối tượng rùa mới. Về cơ bản, chúng tôi đã làm điều + +70 +00:04:54,790 --> 00:04:57,550 +tương tự như chúng tôi đã làm ở đây. + +71 +00:04:58,060 --> 00:05:01,090 +Chúng tôi đã nhập một mô-đun có tên là rùa, chúng tôi đã + +72 +00:05:01,630 --> 00:05:05,140 +khai thác vào mô-đun rùa đó ở đây và sau đó chúng tôi đã tìm + +73 +00:05:05,620 --> 00:05:09,460 +nạp một thứ gì đó từ mô-đun đó. Trong trường hợp này, nó là + +74 +00:05:09,460 --> 00:05:10,990 +một biến. Và trong trường + +75 +00:05:11,020 --> 00:05:15,580 +hợp này, nó là một lớp được ký hiệu bằng chữ T viết hoa, ở đây là trường hợp Pascal. + +76 +00:05:16,300 --> 00:05:19,300 +Và sau đó chúng tôi đã sử dụng dấu ngoặc đơn để + +77 +00:05:19,330 --> 00:05:22,870 +khởi tạo hoặc về cơ bản xây dựng một đối tượng từ bản thiết kế đó + +78 +00:05:23,230 --> 00:05:26,530 +và chúng tôi đã lưu nó vào một đối tượng có tên là Timmy. + +79 +00:05:27,550 --> 00:05:31,990 +Bây giờ tôi có thể đơn giản hóa mã này để làm cho nó trông giống như những + +80 +00:05:32,290 --> 00:05:35,380 +gì chúng ta đã có trong các trang trình bày bằng + +81 +00:05:35,380 --> 00:05:39,850 +cách nói, thay vì nhập rùa, tôi có thể nói từ, từ mô-đun rùa, hãy nhập lớp rùa. + +82 +00:05:40,420 --> 00:05:43,150 +Vì vậy, bây giờ, thay vì viết tất cả những + +83 +00:05:43,210 --> 00:05:45,520 +điều này, tôi có thể chỉ cần + +84 +00:05:45,790 --> 00:05:50,790 +viết Timmy bằng một đối tượng mới được tạo từ lớp con rùa và nó được xây dựng. + +85 +00:05:52,000 --> 00:05:55,540 +Đây là cách chúng ta xây dựng đối tượng mới của mình. + +86 +00:05:56,770 --> 00:05:59,780 +Vì vậy, bây giờ tôi có một đối tượng hoàn toàn mới + +87 +00:06:00,290 --> 00:06:02,480 +có tên là Timmy và nếu tôi tiếp tục + +88 +00:06:02,900 --> 00:06:07,900 +và in timmy, bạn có thể thấy rằng khi tôi chạy mã này, thứ được in ra là một đối tượng + +89 +00:06:09,770 --> 00:06:11,180 +rùa mới từ mô-đun rùa + +90 +00:06:11,480 --> 00:06:14,990 +và nó được lưu tại vị trí này trong bộ nhớ của máy tính. + +91 +00:06:15,590 --> 00:06:17,690 +Vì vậy, điều này rất khác + +92 +00:06:17,690 --> 00:06:21,050 +với nói nếu chúng ta chỉ in một chuỗi hoặc một số. + +93 +00:06:21,440 --> 00:06:24,710 +Nó hoạt động hoàn toàn khác. Trong trường hợp này, nó + +94 +00:06:24,740 --> 00:06:29,660 +thực sự là một đối tượng đang được in. Bây giờ, chúng ta có thể làm + +95 +00:06:29,660 --> 00:06:31,640 +gì với đối tượng này? + +96 +00:06:32,380 --> 00:06:37,380 +0: [không nghe được] Bây giờ, như chúng ta đã thấy trước đây + +97 +00:06:37,660 --> 00:06:40,480 +với đối tượng xe hơi của mình, + +98 +00:06:40,510 --> 00:06:44,440 +nó có một số thuộc tính nhất định, phải không? + +99 +00:06:44,680 --> 00:06:49,680 +Giống như tốc độ và nhiên liệu, dữ liệu mà nó có thể theo dõi thực sự quan trọng đối với việc mô + +100 +00:06:51,190 --> 00:06:55,720 +hình hóa một đối tượng ô tô thực tế. Bây giờ, khi truy + +101 +00:06:55,720 --> 00:06:58,720 +cập các thuộc tính này, cú pháp + +102 +00:06:58,840 --> 00:07:03,840 +hoặc mã sẽ như thế này. Xe trong trường hợp này là một đối tượng và + +103 +00:07:04,480 --> 00:07:09,480 +sau đó chúng ta sử dụng một dấu chấm hoặc một điểm dừng hoàn toàn để tách đối tượng khỏi thuộc tính + +104 +00:07:10,960 --> 00:07:14,530 +thực tế mà chúng ta muốn nắm giữ, trong trường hợp này là tốc độ. + +105 +00:07:15,100 --> 00:07:18,940 +Những gì mã này làm là về cơ bản nó xác định đối + +106 +00:07:19,660 --> 00:07:23,590 +tượng và sau đó nó nói, từ đối tượng này lấy thuộc tính tốc độ. + +107 +00:07:24,130 --> 00:07:28,030 +Điều này thực sự sẽ đại diện cho tốc độ của vật thể + +108 +00:07:28,030 --> 00:07:31,270 +ô tô cụ thể này. Trở lại với con rùa của chúng ta. + +109 +00:07:31,900 --> 00:07:36,900 +Một trong những lớp khác nằm bên trong mô-đun rùa này được gọi là + +110 +00:07:37,480 --> 00:07:38,313 +màn hình. + +111 +00:07:38,680 --> 00:07:43,680 +Và màn hình đại diện cho cửa sổ mà chú rùa này sẽ xuất hiện. + +112 +00:07:45,400 --> 00:07:47,320 +Vì vậy, hãy tiếp tục và tạo + +113 +00:07:47,320 --> 00:07:50,260 +đối tượng màn hình này. Tôi sẽ gọi đối tượng + +114 +00:07:50,800 --> 00:07:54,970 +của mình là my_screen và sau đó tôi sẽ tạo nó từ bản thiết kế + +115 +00:07:54,970 --> 00:07:59,320 +màn hình mà chúng tôi đã nhập này. Bây giờ chúng ta có thể khai thác một trong + +116 +00:07:59,770 --> 00:08:03,070 +các thuộc tính của màn hình được gọi là chiều cao canvas và chiều rộng canvas. + +117 +00:08:03,370 --> 00:08:07,690 +Vì vậy, hãy xem chiều cao là bao nhiêu và chú ý cách chúng tôi sử dụng ký hiệu dấu chấm đó. + +118 +00:08:07,960 --> 00:08:12,670 +Vì vậy, đây là đối tượng và sau đó được phân tách bằng dấu chấm, chúng ta có các thuộc tính + +119 +00:08:12,670 --> 00:08:14,980 +mà chúng ta muốn truy cập từ đối tượng này. + +120 +00:08:15,400 --> 00:08:19,390 +Vì vậy, tôi sẽ in nó vào bảng điều khiển. Bây giờ, khi tôi tiếp tục + +121 +00:08:19,390 --> 00:08:21,220 +và chạy đoạn mã này, + +122 +00:08:21,550 --> 00:08:25,030 +bạn sẽ thấy một cửa sổ bật lên rất nhanh và + +123 +00:08:25,480 --> 00:08:29,530 +đó là màn hình mà chú rùa của chúng ta sẽ hiển thị. + +124 +00:08:31,060 --> 00:08:33,850 +Bây giờ, nếu bạn nhìn vào bảng điều khiển, bạn + +125 +00:08:34,150 --> 00:08:37,510 +có thể thấy rằng chúng tôi không chỉ in đối tượng + +126 +00:08:37,840 --> 00:08:42,840 +con rùa mà còn in chiều cao của canvas cho màn hình cụ thể mà chúng tôi đã + +127 +00:08:43,600 --> 00:08:44,500 +tạo này. + +128 +00:08:45,610 --> 00:08:50,380 +Vì vậy, màn hình ở đây là đối tượng và chiều cao canvas đó là một thuộc tính + +129 +00:08:50,380 --> 00:08:52,360 +được liên kết với màn hình đó. + +130 +00:08:58,910 --> 00:09:02,540 +Bây giờ, ngoài những thứ mà một đối tượng có, dữ liệu + +131 +00:09:02,780 --> 00:09:06,140 +mà nó lưu giữ như tốc độ hoặc nhiên liệu mà + +132 +00:09:06,470 --> 00:09:11,060 +chúng ta đã thấy, nó còn có những thứ mà nó có thể làm, phải không? + +133 +00:09:11,060 --> 00:09:16,060 +Vì vậy, các chức năng được liên kết với đối tượng cụ thể đó. Và những hàm này khi nó được + +134 +00:09:16,730 --> 00:09:19,880 +gắn với một đối tượng được gọi là một phương thức. + +135 +00:09:20,630 --> 00:09:24,530 +Nhưng về cơ bản, chúng tôi sẽ sử dụng nó theo cách giống như chúng tôi đã làm với bất kỳ chức năng + +136 +00:09:24,530 --> 00:09:26,330 +nào khác mà chúng tôi đã tạo cho đến nay. + +137 +00:09:27,560 --> 00:09:30,980 +Sự khác biệt duy nhất là cú pháp. Đầu tiên, chúng tôi sẽ chạm vào + +138 +00:09:31,010 --> 00:09:35,570 +đối tượng ô tô và sau đó sử dụng ký hiệu dấu chấm tương tự mà chúng tôi đã thấy với + +139 +00:09:35,570 --> 00:09:39,500 +các thuộc tính, chúng tôi đang nói ô tô. dừng lại. + +140 +00:09:39,710 --> 00:09:43,640 +Vì vậy, về cơ bản những gì chúng tôi đang làm là chúng tôi đang + +141 +00:09:43,640 --> 00:09:47,870 +nắm giữ đối tượng và sau đó chúng tôi gọi hàm này được liên kết với đối + +142 +00:09:48,170 --> 00:09:52,790 +tượng đó, được gọi là một phương thức. Vì vậy, quay trở lại mã của chúng ta ở + +143 +00:09:53,060 --> 00:09:57,830 +đây, một trong những điều chúng ta có thể làm với đối tượng màn hình này mà chúng ta đã tạo + +144 +00:09:58,070 --> 00:10:02,840 +ở đây có tên là my_screen là chúng ta có thể khai thác vào một trong các chức năng của nó. + +145 +00:10:03,320 --> 00:10:06,110 +Và bởi vì nó là một hàm được gắn với một đối tượng, nó thực + +146 +00:10:06,110 --> 00:10:07,640 +sự được gọi là một phương thức. + +147 +00:10:08,150 --> 00:10:11,930 +Vì vậy, tên phương thức được gọi là exitonclick. + +148 +00:10:12,530 --> 00:10:17,390 +Và những gì điều này sẽ cho phép chúng tôi làm là thay vì màn hình của chúng tôi hiển thị và + +149 +00:10:17,390 --> 00:10:20,510 +sau đó nhanh chóng biến mất khi mã của chúng tôi kết thúc, lần + +150 +00:10:21,110 --> 00:10:26,110 +nhấp này sẽ cho phép chương trình của chúng tôi tiếp tục chạy cho đến khi chúng tôi nhấp vào màn hình + +151 +00:10:27,980 --> 00:10:30,530 +và sau đó nó thoát khỏi mã của chúng tôi. + +152 +00:10:31,010 --> 00:10:36,010 +Vì vậy, hãy thử lại lần nữa và để ý xem màn hình của chúng ta hiển thị như thế nào và + +153 +00:10:36,770 --> 00:10:41,240 +canvas này có chiều cao là 300 và chiều rộng là 300, nhưng bây giờ chúng ta có thể + +154 +00:10:41,930 --> 00:10:46,730 +nhìn thấy con rùa của mình ở dạng mũi tên. Đây là Timmy nhỏ của chúng + +155 +00:10:46,730 --> 00:10:48,830 +ta xuất hiện ở giữa. + +156 +00:10:49,280 --> 00:10:53,600 +Và mã của chúng tôi sẽ chỉ thoát ra khi màn hình phát hiện thấy + +157 +00:10:53,720 --> 00:10:58,720 +một lần nhấp vì chúng tôi đã gọi hàm này được liên kết với đối tượng màn hình. + +158 +00:10:59,000 --> 00:11:00,530 +Vì vậy, bây giờ nếu tôi + +159 +00:11:00,800 --> 00:11:05,390 +nhấp vào màn hình, bạn có thể thấy quá trình kết thúc với mã thoát là 0, mã của chúng tôi + +160 +00:11:05,390 --> 00:11:08,900 +đã kết thúc và màn hình đã biến mất. Bây giờ có các chức năng khác là tốt. + +161 +00:11:08,900 --> 00:11:13,310 +Vì vậy, nếu chúng tôi lấy vật thể nhỏ bé của chúng tôi và chúng tôi nói, tốt, timmy, tại + +162 +00:11:13,520 --> 00:11:17,090 +sao chúng tôi không thay đổi hình dạng của bạn trên màn hình và chúng tôi + +163 +00:11:17,150 --> 00:11:19,550 +sẽ thay đổi bạn thành một con rùa thực sự? + +164 +00:11:20,750 --> 00:11:22,310 +Vì vậy, bây giờ khi tôi + +165 +00:11:23,180 --> 00:11:27,770 +chạy mã, bạn có thể thấy đối tượng ở trung tâm hiện có hình dạng của một con rùa. + +166 +00:11:29,000 --> 00:11:33,590 +Bây giờ, nếu bạn muốn biết làm thế nào tôi biết về tất cả những điều tôi + +167 +00:11:33,590 --> 00:11:36,440 +có thể làm với thư viện đồ họa rùa, + +168 +00:11:36,470 --> 00:11:40,160 +thì tất nhiên, tôi lấy tất cả thông tin này từ tài liệu. + +169 +00:11:40,610 --> 00:11:42,200 +Vì vậy, trong các tài nguyên của + +170 +00:11:42,230 --> 00:11:45,740 +khóa học, bạn sẽ thấy một liên kết đến tài liệu đồ họa Turtle này và nó + +171 +00:11:46,160 --> 00:11:49,520 +cho bạn biết tất cả những điều bạn có thể làm với con rùa của mình. + +172 +00:11:49,940 --> 00:11:50,900 +Vì vậy, ví + +173 +00:11:50,900 --> 00:11:55,510 +dụ: bạn có thể gọi tất cả các phương thức này được liên kết với đối tượng con rùa + +174 +00:11:55,510 --> 00:11:58,180 +của bạn để khiến con rùa của bạn di chuyển và + +175 +00:11:58,540 --> 00:12:03,400 +vẽ, và bạn cũng có thể sử dụng nó để thay đổi vị trí của nó hoặc thay đổi tọa + +176 +00:12:03,580 --> 00:12:07,720 +độ của nó, cũng như thực hiện những việc như thay đổi màu sắc hoặc đặt lại. + +177 +00:12:08,140 --> 00:12:12,250 +Và bạn có thể duyệt qua danh sách này để xem bạn sẽ sử dụng từng + +178 +00:12:12,250 --> 00:12:15,040 +thứ này như thế nào. Vì vậy, ví dụ: + +179 +00:12:15,370 --> 00:12:18,550 +nếu tôi muốn thay đổi màu sắc của con rùa của + +180 +00:12:18,880 --> 00:12:22,600 +mình, tôi có thể thực hiện điều đó bằng cách chỉ cần gọi + +181 +00:12:23,020 --> 00:12:25,420 +phương thức này, màu và sau đó + +182 +00:12:25,450 --> 00:12:29,650 +bên trong dấu ngoặc đơn, tôi chuyển đối số của chuỗi màu thực tế. + +183 +00:12:30,400 --> 00:12:35,400 +Bây giờ bạn có thể chọn từ một loạt các màu chỉ bằng cách nhập tên + +184 +00:12:36,280 --> 00:12:40,240 +dưới dạng một chuỗi vào phương thức đó được gọi là màu. + +185 +00:12:40,870 --> 00:12:45,870 +Vì vậy, hãy tiếp tục và xem liệu bạn có thể thay đổi màu của rùa timmy của chúng tôi từ màu + +186 +00:12:46,960 --> 00:12:51,960 +mặc định chỉ là màu đen sang một trong những màu mà bạn thấy trong liên kết này ở đây hay không + +187 +00:12:53,290 --> 00:12:55,840 +và liên kết, tất nhiên, nằm trong tài nguyên khóa học. + +188 +00:12:59,170 --> 00:13:03,070 +Vì vậy, giả sử tôi muốn thay đổi nó thành một màu san hô như thế này. + +189 +00:13:03,670 --> 00:13:07,510 +Tất cả những gì tôi phải làm là chạm vào đối tượng của tôi được + +190 +00:13:08,050 --> 00:13:11,860 +gọi là timmy, sau đó gọi phương thức được gọi là màu lên nó. + +191 +00:13:12,220 --> 00:13:14,260 +Và bạn có thể thấy tất cả các phương pháp + +192 +00:13:14,260 --> 00:13:16,870 +được ký hiệu bằng một chữ M nhỏ ở đây trong vòng tròn. + +193 +00:13:17,500 --> 00:13:21,520 +Bây giờ, màu này, tất nhiên, mong đợi một số loại đầu vào. + +194 +00:13:22,180 --> 00:13:27,180 +Vì vậy, đầu vào mà nó mong đợi là một chuỗi màu thực tế. + +195 +00:13:28,030 --> 00:13:32,500 +Và sợi dây của tôi sẽ là san hô, mà tôi nhặt được từ đây. + +196 +00:13:33,640 --> 00:13:37,510 +Vì vậy, bây giờ chúng ta hãy chạy mã của chúng tôi và xem nó trông như thế nào bây giờ. + +197 +00:13:37,960 --> 00:13:39,580 +Sau khi màn hình làm mới, + +198 +00:13:39,610 --> 00:13:43,090 +bạn có thể thấy rằng con rùa của chúng ta bây giờ có + +199 +00:13:43,600 --> 00:13:46,990 +màu san hô đẹp và chúng tôi đã cố gắng thực hiện + +200 +00:13:47,020 --> 00:13:52,020 +tất cả những điều này để thay đổi hình dạng, thay đổi màu sắc, tất cả vì chúng + +201 +00:13:52,720 --> 00:13:53,800 +tôi có thể + +202 +00:13:53,800 --> 00:13:58,800 +gọi các chức năng này thuộc về sự vật. Bây giờ, hãy xem liệu bạn có thể sử dụng tài liệu + +203 +00:13:59,440 --> 00:14:02,560 +ở đây và tìm cách đưa con rùa tiến lên một trăm bước hay không. + +204 +00:14:03,760 --> 00:14:06,250 +Tạm dừng video và cố gắng hoàn thành thử thách này. + +205 +00:14:08,860 --> 00:14:09,190 +Được rồi. + +206 +00:14:09,190 --> 00:14:13,420 +Vì vậy, chúng ta đã thấy trước đó rằng nó có một loạt các phương pháp di chuyển và vẽ. + +207 +00:14:13,870 --> 00:14:18,550 +Vì vậy, chúng ta có thể chỉ cần sử dụng phương pháp chuyển tiếp này để làm cho nó tiến về phía trước. + +208 +00:14:19,030 --> 00:14:21,070 +Và về các thông số mà nó + +209 +00:14:21,340 --> 00:14:25,750 +cần, nó cần một con số để xác định khoảng cách mà nó sẽ di chuyển + +210 +00:14:25,750 --> 00:14:26,740 +về phía trước. + +211 +00:14:27,580 --> 00:14:31,600 +Vì vậy, chúng tôi nói rằng chúng tôi muốn con rùa của chúng tôi tiến về phía trước một trăm bước. + +212 +00:14:33,040 --> 00:14:37,900 +Tất cả những gì tôi phải làm là chỉ định đối tượng mà tôi muốn di + +213 +00:14:38,470 --> 00:14:43,360 +chuyển là timmy, sau đó gọi phương thức đó về phía trước và chuyển về phía xa. + +214 +00:14:43,450 --> 00:14:47,650 +Vì vậy, tôi đã nói một trăm bước. Vì vậy, bây giờ chúng ta hãy chạy lại + +215 +00:14:48,430 --> 00:14:53,180 +mã của chúng ta, và bạn có thể thấy con rùa nhỏ đó chỉ tiến về phía trước một trăm bước. + +216 +00:14:53,630 --> 00:14:58,630 +Vì vậy, bây giờ chúng ta đã thấy cách tạo một Đối tượng mới từ một bản thiết kế, chúng ta đã thấy cách + +217 +00:15:00,020 --> 00:15:05,020 +chúng ta có thể khai thác các thuộc tính của nó bằng cách sử dụng dấu chấm tên đối tượng và sau đó + +218 +00:15:08,060 --> 00:15:09,350 +là tên của thuộc tính. + +219 +00:15:09,650 --> 00:15:14,450 +Vì vậy, điều này cũng giống như việc có một biến được liên kết với đối tượng đó. + +220 +00:15:14,930 --> 00:15:15,590 +Và cuối + +221 +00:15:15,590 --> 00:15:20,300 +cùng, chúng ta đã thấy cách chúng ta có thể gọi các phương thức được liên kết với đối tượng. + +222 +00:15:20,540 --> 00:15:21,410 +Ví dụ: ở + +223 +00:15:21,410 --> 00:15:25,190 +đây khi chúng tôi thay đổi hình dạng hoặc khi chúng tôi thay đổi màu sắc hoặc khi + +224 +00:15:25,190 --> 00:15:27,830 +chúng tôi yêu cầu nó tiến lên. Bây giờ trong bài học + +225 +00:15:27,860 --> 00:15:32,000 +tiếp theo, tôi sẽ chỉ cho bạn cách bạn có thể nắm giữ nhiều thư viện + +226 +00:15:32,300 --> 00:15:37,160 +bên ngoài hơn, không chỉ rùa mà còn cả thế giới các gói mà bạn có thể khai thác. + +227 +00:15:37,460 --> 00:15:42,230 +Và bạn có thể bắt đầu sử dụng các gói mã này mà các lập trình viên khác + +228 +00:15:42,230 --> 00:15:43,130 +đã phát triển + +229 +00:15:43,430 --> 00:15:48,430 +và đơn giản bằng cách tạo các đối tượng từ các bản thiết kế hiện có và đọc tài + +230 +00:15:48,710 --> 00:15:52,070 +liệu để giúp nó thực hiện nhiều việc khác nhau mà bạn muốn. + +231 +00:15:52,550 --> 00:15:55,580 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Turtle-Colours-cs111.wellesley.edu-.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Turtle-Colours-cs111.wellesley.edu-.url new file mode 100644 index 0000000000000000000000000000000000000000..1a0df9b06456c577f27dc426b52024abaf2b2632 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Turtle-Colours-cs111.wellesley.edu-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://cs111.wellesley.edu/reference/colors \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Turtle-Graphics-Documentation.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Turtle-Graphics-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..60646a1b029a6d0157cb7d27cda8add9979e38e0 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/003 Turtle-Graphics-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/turtle.html \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 How to Add Python Packages and use PyPi.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 How to Add Python Packages and use PyPi.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0210f46b04260a15cc3f33778f82748d3b9dd7b8 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 How to Add Python Packages and use PyPi.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49906142e776512ce35b39bc465658c0eb2f69f59c16d824e3122f6264e9c592 +size 64546829 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 How to Add Python Packages and use PyPi_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 How to Add Python Packages and use PyPi_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3661aa2c6a93d15a6d172d22cce5c4839b1872d7 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 How to Add Python Packages and use PyPi_vi.srt @@ -0,0 +1,348 @@ +1 +00:00:00,330 --> 00:00:05,330 +Bây giờ tôi đã đề cập rất nhiều về việc sử dụng mã mà các nhà phát triển khác đã + +2 +00:00:05,939 --> 00:00:09,960 +viết và cách phổ biến nhất để làm điều này là sử dụng các gói mã. + +3 +00:00:10,710 --> 00:00:11,543 +Trong bài học + +4 +00:00:11,820 --> 00:00:16,200 +này, tôi sẽ chỉ cho bạn cách tích hợp một gói mã hiện có vào dự án của chúng tôi + +5 +00:00:16,200 --> 00:00:20,820 +để chúng tôi có thể thực hành tạo các đối tượng và làm việc với các thuộc tính và phương thức. + +6 +00:00:21,480 --> 00:00:26,480 +Bây giờ chúng ta đã thấy các mô-đun mã trong đó mỗi tệp chúng tôi tạo trong dự án của + +7 +00:00:27,870 --> 00:00:29,850 +mình về cơ bản là một mô-đun. + +8 +00:00:30,540 --> 00:00:35,540 +Nhưng một gói khác với một mô-đun ở chỗ nó thực sự là một mớ mã mà + +9 +00:00:36,120 --> 00:00:41,120 +người khác đã viết, rất nhiều tệp được đóng gói lại với nhau để đạt được + +10 +00:00:41,610 --> 00:00:46,470 +mục tiêu hoặc mục đích nào đó. Bây giờ, giả sử + +11 +00:00:46,470 --> 00:00:51,450 +chúng ta muốn tạo một bảng Pokemon và loại của chúng. + +12 +00:00:51,780 --> 00:00:56,780 +Vì vậy, chúng tôi muốn có một số cách ghi lại rằng Pikachu là loại điện và có + +13 +00:00:58,590 --> 00:01:01,950 +thể Squirtle là loại nước. Bây giờ, nếu chúng ta + +14 +00:01:01,980 --> 00:01:06,930 +muốn làm điều đó trong ASCII để chúng ta có thể in nó trong bảng điều khiển, thì + +15 +00:01:06,930 --> 00:01:10,410 +chúng ta sẽ phải định dạng nó và sẽ khá khó khăn. + +16 +00:01:10,800 --> 00:01:15,800 +Vì vậy, chúng ta có thể phải in một số loại đường ống và sau đó có + +17 +00:01:16,650 --> 00:01:20,580 +thể chúng ta sẽ có tên của trường, tên Pokemon, và sau đó có + +18 +00:01:21,180 --> 00:01:25,410 +thể là một đường ống khác. Và sau đó chúng ta sẽ có tên của cột tiếp + +19 +00:01:25,740 --> 00:01:27,000 +theo, đó là loại của chúng. + +20 +00:01:27,720 --> 00:01:32,010 +Và cuối cùng chúng ta sẽ đóng nó lại và sau đó + +21 +00:01:32,010 --> 00:01:36,000 +chúng ta sẽ phải in một số loại đường ngang có + +22 +00:01:36,120 --> 00:01:40,890 +thể như thế này, vân vân và vân vân chỉ để tạo bảng này. + +23 +00:01:41,100 --> 00:01:45,660 +Và nó khá khó khăn nếu bạn không quen thao tác với ASCII + +24 +00:01:45,660 --> 00:01:49,080 +và hình dung nó. Tôi chắc chắn không đạt đến nhiệm vụ này. + +25 +00:01:49,770 --> 00:01:52,500 +Vậy chúng ta có thể làm gì để thay thế? Chà, chúng tôi + +26 +00:01:52,500 --> 00:01:57,500 +có thể tìm kiếm một gói mà các nhà phát triển khác đã tạo + +27 +00:01:58,200 --> 00:02:02,880 +để đạt được mục tiêu này. Và nơi mà chúng tôi sẽ làm điều đó là + +28 +00:02:03,330 --> 00:02:06,030 +một nơi nào đó được gọi là PyPi, là chỉ mục gói Python. + +29 +00:02:06,480 --> 00:02:11,480 +Và đây là một loạt các phần mềm cho ngôn ngữ lập trình Python được phát triển + +30 +00:02:11,640 --> 00:02:16,080 +và chia sẻ bởi cộng đồng Python. Vì vậy, chúng ta có thể thấy mã nguồn + +31 +00:02:16,350 --> 00:02:17,460 +của họ, nhưng quan + +32 +00:02:17,490 --> 00:02:22,290 +trọng hơn, chúng ta có thể thấy cách triển khai mã và cách đưa nó vào dự án của chúng ta. + +33 +00:02:23,190 --> 00:02:26,670 +Ở đây, tôi sẽ tìm kiếm một thứ gọi là bảng xinh xắn. + +34 +00:02:27,600 --> 00:02:32,600 +Và đây là một thư viện rất đơn giản sẽ giúp chúng ta hiển thị các + +35 +00:02:34,410 --> 00:02:36,000 +bảng ở định dạng ASCII. + +36 +00:02:36,780 --> 00:02:41,130 +Chúng ta có thể nhấp vào các liên kết của dự án để tìm hiểu thêm về nó. + +37 +00:02:41,820 --> 00:02:45,150 +Và điều này sẽ đưa chúng ta đến kho lưu trữ mã + +38 +00:02:45,420 --> 00:02:47,370 +Google, nơi tài liệu được lưu trữ. + +39 +00:02:47,940 --> 00:02:50,460 +Nếu bạn truy cập Wiki và xem phần hướng + +40 +00:02:50,580 --> 00:02:53,700 +dẫn, bạn sẽ thấy một số tài liệu về cách sử dụng nó. + +41 +00:02:54,210 --> 00:02:59,210 +Bây giờ, gói cụ thể này không mở rộng như gói đồ họa rùa. + +42 +00:03:00,760 --> 00:03:03,670 +Vì vậy, thực tế không có nhiều thứ bạn có thể làm với nó, nhưng nó + +43 +00:03:04,090 --> 00:03:06,850 +có nhiều thứ hơn chúng ta cần cho trường hợp sử dụng của mình. + +44 +00:03:07,840 --> 00:03:12,640 +Điều đầu tiên chúng ta phải làm là cài đặt gói này vào dự án của chúng ta. + +45 +00:03:13,120 --> 00:03:15,220 +Bây giờ, không giống như gói rùa + +46 +00:03:15,220 --> 00:03:19,780 +đã được tải sẵn với mọi bản sao của Python, để sử dụng các gói + +47 +00:03:19,780 --> 00:03:23,110 +mà bạn tìm thấy trong chỉ mục gói Python, bạn thực + +48 +00:03:23,620 --> 00:03:25,660 +sự phải cài đặt nó. + +49 +00:03:25,750 --> 00:03:30,550 +Vì vậy, đây là cách chúng tôi làm điều đó trong PyCharm. Đầu tiên, hãy chuyển đến tùy chọn, vì vậy trong Windows, + +50 +00:03:30,730 --> 00:03:35,590 +tôi nghĩ nó nằm dưới tệp và sau đó là tùy chọn. Trên Mac là tùy chọn PyCharm và sau + +51 +00:03:35,590 --> 00:03:37,030 +đó là tùy chọn. + +52 +00:03:37,600 --> 00:03:40,540 +Và sau đó ở đây bạn sẽ thấy một loạt những thứ + +53 +00:03:40,570 --> 00:03:44,950 +bạn có thể thay đổi bao gồm cả trình chỉnh sửa hoặc giao diện mà chúng tôi đã làm. + +54 +00:03:45,400 --> 00:03:47,770 +Nhưng tôi muốn bạn nhấp vào dự án của bạn. + +55 +00:03:47,950 --> 00:03:52,660 +Vì vậy, dự án của tôi được gọi là ngày-16-start và sau đó chúng ta sẽ + +56 +00:03:52,660 --> 00:03:57,660 +đi vào trình thông dịch của dự án. Và ở đây chúng ta có thể nhấp vào nút dấu cộng để cài đặt + +57 +00:04:00,310 --> 00:04:04,930 +bất kỳ gói nào mà bạn tìm thấy trong chỉ mục gói Python. Ghi lại tên gọi của nó. + +58 +00:04:05,020 --> 00:04:09,670 +Vì vậy, của chúng tôi được gọi là PrettyTable và sau đó chúng tôi sẽ tìm kiếm nó bên + +59 +00:04:09,670 --> 00:04:12,310 +trong các gói có sẵn. Và khi chúng tôi tìm thấy + +60 +00:04:12,340 --> 00:04:14,650 +nó, chúng tôi sẽ chọn nó và sau đó nhấp vào cài đặt. + +61 +00:04:15,610 --> 00:04:16,990 +Nếu bạn đang làm việc với Repl. nó, bạn + +62 +00:04:17,019 --> 00:04:21,010 +cũng có thể cài đặt các gói chỉ bằng cách chuyển đến tab gói và + +63 +00:04:21,310 --> 00:04:26,050 +sau đó tìm kiếm PrettyTable một lần nữa. Khi bạn nhấp vào gói mà bạn muốn, + +64 +00:04:26,050 --> 00:04:29,920 +hãy nhấp vào nút dấu cộng để thêm gói đó vào dự án của bạn. + +65 +00:04:30,640 --> 00:04:34,120 +Bây giờ Repl. nó hơi kỳ lạ vì nó nói là cài + +66 +00:04:34,120 --> 00:04:38,320 +đặt nhưng nó không bao giờ thực sự xác nhận thành công. Nhưng một khi bạn nhấp vào chạy, mọi thứ sẽ trôi + +67 +00:04:38,440 --> 00:04:41,170 +qua và nó sẽ hoạt động hoàn hảo miễn là bạn thấy nó trong + +68 +00:04:41,440 --> 00:04:45,130 +danh sách các gói của mình ở đây. Bây giờ, nếu bạn muốn xóa gói, + +69 +00:04:45,130 --> 00:04:48,640 +bạn có thể chỉ cần nhấp vào nút dấu trừ, nhưng bây giờ chúng + +70 +00:04:49,000 --> 00:04:50,650 +ta sẽ làm việc với nó. + +71 +00:04:52,450 --> 00:04:54,790 +Vì vậy, bây giờ nó đã được cài đặt thành công, + +72 +00:04:55,030 --> 00:04:57,790 +chúng ta có thể tiếp tục và đóng nó lại và nhấp vào OK. + +73 +00:04:58,360 --> 00:05:02,650 +Và bây giờ chúng tôi có thể truy cập gói này có tên là PrettyTable trong mã của chúng tôi. + +74 +00:05:03,220 --> 00:05:03,640 +Một + +75 +00:05:03,640 --> 00:05:08,440 +lần nữa, tôi sẽ nhập nó, vì vậy tôi có thể nói nhập khẩu khá. + +76 +00:05:08,560 --> 00:05:13,120 +Và bây giờ tôi có thể sử dụng mọi thứ bên trong gói này. Bây giờ, nếu bạn muốn xem mã + +77 +00:05:13,150 --> 00:05:14,650 +nguồn, bạn thực + +78 +00:05:14,830 --> 00:05:19,720 +sự có thể nhấp chuột phải vào nó và chọn, chuyển đến phần triển khai. + +79 +00:05:19,780 --> 00:05:24,250 +Và điều này sẽ đưa bạn đến tệp Python nơi toàn bộ bảng đẹp này được triển + +80 +00:05:24,250 --> 00:05:27,250 +khai, vì vậy tất cả mã mà họ đã viết. + +81 +00:05:28,120 --> 00:05:31,330 +Nó hơi khó khăn và nó có rất nhiều mã trong đó, nhưng + +82 +00:05:31,630 --> 00:05:35,620 +chúng tôi không phải lo lắng về cách mã được tạo ra và cách nó hoạt động. + +83 +00:05:36,040 --> 00:05:41,040 +Tất cả những gì chúng ta cần làm là xem tài liệu về gói này và xem cách chúng ta có thể + +84 +00:05:41,290 --> 00:05:45,190 +triển khai nó vào dự án của mình. Bây giờ, trong bài học tiếp theo, + +85 +00:05:45,460 --> 00:05:46,540 +chúng ta sẽ + +86 +00:05:46,540 --> 00:05:51,540 +thực hành xây dựng một đối tượng khá bảng và sử dụng tài liệu để khám phá các thuộc + +87 +00:05:51,700 --> 00:05:55,630 +tính và phương thức của đối tượng này. Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 Pokemon-Pokedex.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 Pokemon-Pokedex.url new file mode 100644 index 0000000000000000000000000000000000000000..515ba340015f90e0deceb6f63c10753e2e354184 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 Pokemon-Pokedex.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pokemondb.net/pokedex/game/x-y \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 PrettyTable-Package-Documentation.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 PrettyTable-Package-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..f1f06d4285b56e8590a49bb93c02dfafaada5885 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 PrettyTable-Package-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://code.google.com/archive/p/prettytable/wikis/Tutorial.wiki \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 PrettyTable-Package.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 PrettyTable-Package.url new file mode 100644 index 0000000000000000000000000000000000000000..a597b933f0b9c82e196dfd81d1a28e2df129cf30 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 PrettyTable-Package.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pypi.org/project/PrettyTable/ \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 Python-Package-Index.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 Python-Package-Index.url new file mode 100644 index 0000000000000000000000000000000000000000..90c59534d6a8d8fe9e0aa091675769aaaee571c9 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/004 Python-Package-Index.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pypi.org/ \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/005 Practice Modifying Object Attributes and Calling Methods.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/005 Practice Modifying Object Attributes and Calling Methods.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ffd75b0b4f48c75263a9c4f51a667addc524af5f --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/005 Practice Modifying Object Attributes and Calling Methods.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda8cb6edb527fa2dddd1451b5ad27c7715a85fd7bc577263aa87a4215b1832d +size 75321703 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/005 Practice Modifying Object Attributes and Calling Methods_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/005 Practice Modifying Object Attributes and Calling Methods_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fb0671104287cf9f9f013a48db98240f1fe7e9a2 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/005 Practice Modifying Object Attributes and Calling Methods_vi.srt @@ -0,0 +1,504 @@ +1 +00:00:00,300 --> 00:00:03,780 +Trong bài học trước, chúng ta đã thêm một thư viện bên ngoài vào dự án của mình. + +2 +00:00:04,230 --> 00:00:09,060 +Bây giờ đã đến lúc tạo một đối tượng khá bảng và thực hành sử dụng các phương thức + +3 +00:00:09,060 --> 00:00:12,090 +và thuộc tính của nó. Điểm khởi đầu của chúng tôi như mọi + +4 +00:00:12,120 --> 00:00:14,190 +khi là tài liệu. Tại đây bạn + +5 +00:00:14,190 --> 00:00:17,580 +có thể xem cách tạo một đối tượng khá đẹp. + +6 +00:00:18,420 --> 00:00:22,950 +Vì vậy, hãy sử dụng những gì chúng ta đã học trước đây về việc xây dựng các đối tượng để + +7 +00:00:22,950 --> 00:00:27,360 +tiếp tục và tạo đối tượng này từ lớp. Bây giờ, trước tiên, chúng ta sẽ + +8 +00:00:27,360 --> 00:00:30,600 +làm điều tương tự như chúng ta đã làm với rùa. + +9 +00:00:31,110 --> 00:00:33,630 +Chúng ta sẽ khai thác vào gói prettytable, + +10 +00:00:34,050 --> 00:00:39,050 +và sau đó chúng ta sẽ nhập lớp prettytable được ghi chú bởi c ở đây. + +11 +00:00:41,340 --> 00:00:44,640 +Bây giờ chúng ta có quyền truy cập vào lớp này bên trong + +12 +00:00:45,030 --> 00:00:50,030 +mã của chúng ta, tôi muốn bạn tiếp tục và tạo một đối tượng từ lớp bảng đẹp này và + +13 +00:00:50,370 --> 00:00:54,780 +đối tượng phải được đặt tên là bảng. Vì vậy, hãy tạm dừng video và thử xem. + +14 +00:00:57,120 --> 00:00:59,790 +Được rồi. Vì vậy, chúng ta đã nói rằng + +15 +00:01:00,210 --> 00:01:04,319 +đối tượng của tôi sẽ được gọi là table, và sau đó chúng ta sẽ xây dựng nó từ lớp này được gọi là prettytable. + +16 +00:01:05,069 --> 00:01:07,770 +Vì vậy, chúng tôi sẽ đưa nó vào với vỏ của nó. + +17 +00:01:08,130 --> 00:01:11,160 +Vì vậy, đây là trường hợp Pascal mà chúng ta đã nói trước + +18 +00:01:11,640 --> 00:01:15,060 +đó, và sau đó để thực sự cung cấp cho nó tiến trình và + +19 +00:01:15,420 --> 00:01:18,090 +cấu trúc, chúng ta phải thêm dấu ngoặc vào cuối. + +20 +00:01:18,630 --> 00:01:23,630 +Vì vậy, bây giờ bạn đã tạo một đối tượng mới có tên là bảng từ bảng xinh xắn này và chúng tôi thực + +21 +00:01:24,960 --> 00:01:28,770 +sự có thể tiếp tục và in bảng này. Và ngay cả ở giai đoạn này, + +22 +00:01:28,800 --> 00:01:33,450 +nó đã sẵn sàng để bắt đầu in ra một phiên bản xương trần trên tất cả các bàn. + +23 +00:01:33,810 --> 00:01:36,060 +Nhưng tất nhiên bảng này không có dữ liệu Vì + +24 +00:01:36,180 --> 00:01:39,960 +vậy, thực sự rất khó để hình dung tất cả các ký tự ASCII này đang + +25 +00:01:39,960 --> 00:01:41,610 +làm gì trong một bảng trống. + +26 +00:01:42,390 --> 00:01:47,390 +Nhưng không có vấn đề gì, điều tiếp theo chúng ta có thể thấy trong tài liệu + +27 +00:01:48,420 --> 00:01:52,110 +của mình là cách thêm cột. Vì vậy, nó có phương thức này, + +28 +00:01:52,110 --> 00:01:57,110 +hãy nhớ các phương thức là các hàm được liên kết với một đối tượng và phương thức này sẽ thêm các + +29 +00:01:57,930 --> 00:02:02,670 +cột vào bất kỳ bảng nào chúng ta chỉ định. Bây giờ phương thức này có hai đầu vào. + +30 +00:02:02,970 --> 00:02:05,220 +Một là tên của trường, vì + +31 +00:02:05,820 --> 00:02:09,270 +vậy tên trường của chúng ta là tên và loại Pokemon. + +32 +00:02:10,350 --> 00:02:13,320 +Và sau đó chúng tôi có một danh sách các chuỗi sẽ + +33 +00:02:13,620 --> 00:02:18,420 +là dữ liệu sẽ đi vào cột đó. Về cơ bản, mỗi khi chúng + +34 +00:02:18,510 --> 00:02:21,690 +ta gọi phương thức đó, hãy thêm cột, nó sẽ + +35 +00:02:21,990 --> 00:02:25,740 +cho phép chúng ta đặt tên trường dưới dạng một chuỗi và + +36 +00:02:26,070 --> 00:02:29,970 +sau đó là danh sách dữ liệu để chúng đi vào bảng. + +37 +00:02:30,450 --> 00:02:35,450 +Vì vậy, chúng tôi sẽ thêm bảng của chúng tôi từng cột một. Sử dụng tài liệu đó để xem liệu bạn có + +38 +00:02:36,600 --> 00:02:41,600 +thể thêm cả hai cột này vào đối tượng bảng của chúng tôi hay không và sau đó khi bạn + +39 +00:02:43,080 --> 00:02:46,410 +đã hoàn thành việc đó, chúng tôi sẽ in lại đối tượng bảng + +40 +00:02:46,740 --> 00:02:51,270 +và chúng ta sẽ thấy một bảng ASCII. Đây là những gì bạn đang hướng tới khi + +41 +00:02:51,270 --> 00:02:52,470 +chạy mã của mình. + +42 +00:02:52,830 --> 00:02:57,810 +Nó sẽ in ra bảng của bạn và định dạng độc đáo theo kiểu ASCII này. + +43 +00:02:58,200 --> 00:03:00,460 +Tạm dừng video và hoàn thành thử thách. + +44 +00:03:04,110 --> 00:03:04,380 +1: Đúng không? + +45 +00:03:04,380 --> 00:03:04,650 +0: Được rồi. + +46 +00:03:04,650 --> 00:03:09,510 +Vì vậy, chúng ta đã có đối tượng bảng của mình và hãy nhớ rằng các phương thức là + +47 +00:03:09,510 --> 00:03:14,190 +các hàm được liên kết với đối tượng. Vì vậy, chúng tôi nói dấu chấm đối + +48 +00:03:14,310 --> 00:03:16,140 +tượng bảng, và sau đó + +49 +00:03:16,530 --> 00:03:21,090 +chúng tôi gọi phương thức đó, add_column. Và lưu ý cách nó sử dụng hai + +50 +00:03:21,120 --> 00:03:24,240 +đầu vào, tên trường và dữ liệu sẽ đi vào cột. + +51 +00:03:24,840 --> 00:03:26,700 +Vì vậy, tên trường sẽ là một chuỗi + +52 +00:03:27,000 --> 00:03:31,350 +và đây sẽ là tên ở đầu cột của chúng ta. Vì vậy, trong trường hợp của chúng tôi, + +53 +00:03:31,350 --> 00:03:35,490 +nó được gọi là tên Pokemon. Và sau dấu phẩy, chúng ta + +54 +00:03:35,490 --> 00:03:40,380 +phải đưa vào danh sách tất cả dữ liệu sẽ chuyển vào cột của chúng ta. + +55 +00:03:41,280 --> 00:03:44,880 +Vì vậy, xin nhắc lại nhanh chóng, cột đầu tiên của chúng tôi chứa + +56 +00:03:44,880 --> 00:03:46,140 +Pikachu, Squirtle và Charmander. + +57 +00:03:46,140 --> 00:03:51,140 +Bây giờ, chúng ta nên thêm một cột vào bảng của mình và bạn có thể yên tâm bỏ qua + +58 +00:03:53,340 --> 00:03:57,690 +tất cả những lỗi chính tả này vì tất nhiên, tên Pokemon không phải là từ thực. + +59 +00:03:58,020 --> 00:04:01,200 +Nhưng nếu bạn muốn kiểm tra poke dex, bạn thực sự có thể truy cập + +60 +00:04:01,380 --> 00:04:04,110 +liên kết này trong tài nguyên khóa học và bạn có thể + +61 +00:04:04,440 --> 00:04:08,490 +xem cách đánh vần của từng Pokemon này. Bây giờ, điều + +62 +00:04:08,700 --> 00:04:12,870 +tiếp theo chúng tôi muốn thêm là loại liên + +63 +00:04:12,870 --> 00:04:17,130 +kết với mỗi Pokemons này. Vì vậy, ví dụ, Charmander là Pokemon loại + +64 +00:04:17,160 --> 00:04:19,230 +lửa, Squirtle là Pokemon hệ nước, + +65 +00:04:19,709 --> 00:04:23,430 +nhưng về cơ bản chúng ta sẽ thêm dữ liệu trong cột thứ hai. + +66 +00:04:23,880 --> 00:04:27,270 +Vì vậy, tên trường được gọi là loại, và sau đó + +67 +00:04:27,570 --> 00:04:32,430 +chúng ta có ba phần dữ liệu cần đưa vào danh sách theo thứ tự giống + +68 +00:04:32,430 --> 00:04:35,370 +như Pokemon trước đó. Bằng cách đó, chúng tôi sẽ thực sự kết hợp chúng đúng cách. + +69 +00:04:37,200 --> 00:04:40,110 +Vì vậy, nếu bạn chưa có, hãy tiếp tục và thêm cột thứ hai. + +70 +00:04:40,920 --> 00:04:41,753 +1: Đúng không? + +71 +00:04:44,460 --> 00:04:45,090 +0: + +72 +00:04:45,090 --> 00:04:50,090 +Một lần nữa, tôi sẽ gọi cùng một phương thức trên bảng của mình và lần này + +73 +00:04:50,310 --> 00:04:55,310 +tôi sẽ thêm loại trường và dữ liệu sẽ đi theo thứ tự của dữ liệu + +74 +00:04:56,670 --> 00:05:01,440 +mà tôi đã có từ cột trước đó. Vì vậy, loại đầu tiên là loại Pikachu chạy điện. + +75 +00:05:02,010 --> 00:05:06,900 +Và loại thứ hai là loại dành cho Squirtle, là Water. Và cuối cùng, chúng tôi đã + +76 +00:05:06,930 --> 00:05:08,880 +tiếp lửa cho Charmander. + +77 +00:05:09,480 --> 00:05:12,210 +Vì vậy, bây giờ cái này sẽ được khớp với cái này, cái này + +78 +00:05:12,300 --> 00:05:14,730 +sẽ được khớp với cái này, vân vân và vân vân. + +79 +00:05:15,210 --> 00:05:17,700 +Nếu chúng ta tiếp tục và in bảng của mình + +80 +00:05:17,820 --> 00:05:20,820 +ngay bây giờ, vì vậy nếu chúng ta chạy mã của mình và + +81 +00:05:20,850 --> 00:05:25,850 +xem ở đây, bạn có thể thấy cách chúng ta có một bảng được định dạng độc đáo bằng cách tạo + +82 +00:05:27,870 --> 00:05:32,640 +một đối tượng từ lớp xinh xắn được tạo sẵn này và chúng tôi ' Bây giờ đã gọi phương + +83 +00:05:32,730 --> 00:05:36,810 +thức này là add_column để thêm hai cột. Và khi chúng tôi in bảng của mình, + +84 +00:05:36,870 --> 00:05:41,160 +giờ đây nó được định dạng độc đáo bằng ASCII. Bây giờ, hãy nhớ rằng chúng + +85 +00:05:41,190 --> 00:05:44,880 +ta cũng có thể thay đổi các thuộc tính của đối tượng. + +86 +00:05:45,900 --> 00:05:48,780 +Ví dụ: nếu chúng ta muốn thay đổi giao diện của bảng, có + +87 +00:05:49,170 --> 00:05:53,580 +thể nó được điều khiển bởi một thuộc tính. Nếu cuộn xuống, bạn có thể thấy + +88 +00:05:53,640 --> 00:05:58,640 +rằng chúng tôi có thể thay đổi kiểu bảng bằng cách nhấn vào từng thuộc tính này. + +89 +00:05:59,600 --> 00:06:03,710 +Ví dụ: nếu tôi muốn thay đổi căn chỉnh của dữ liệu trong bảng, tôi + +90 +00:06:04,040 --> 00:06:09,040 +có thể thay đổi thuộc tính căn chỉnh này thành L cho căn trái, C cho căn giữa hoặc + +91 +00:06:10,550 --> 00:06:11,900 +R cho căn phải. + +92 +00:06:13,010 --> 00:06:17,750 +Bạn có nhớ cách khai thác vào thuộc tính của một đối tượng không? Nếu bạn làm vậy, hãy tiếp tục và + +93 +00:06:18,110 --> 00:06:23,110 +xem liệu bạn có thể thay đổi bảng của chúng tôi từ căn giữa theo mặc + +94 +00:06:23,600 --> 00:06:27,650 +định thành căn trái hay không. Tạm dừng video và cố gắng hoàn thành thử thách đó. + +95 +00:06:28,180 --> 00:06:29,013 +1: Đúng không? + +96 +00:06:30,340 --> 00:06:31,090 +0: Vì + +97 +00:06:31,090 --> 00:06:36,090 +vậy, một lần nữa, chúng ta sẽ nhấn vào đối tượng bảng của chúng ta và chúng ta sẽ + +98 +00:06:36,250 --> 00:06:38,290 +sử dụng ký hiệu dấu chấm, nhưng + +99 +00:06:38,320 --> 00:06:42,280 +lần này thay vì truy cập vào một phương thức được liên kết với đối + +100 +00:06:42,550 --> 00:06:47,110 +tượng tất nhiên được ký hiệu là M, chúng ta sẽ truy cập một thuộc tính hoặc + +101 +00:06:47,110 --> 00:06:50,140 +trong trường hợp này, họ đặt tên F là một trường. + +102 +00:06:50,710 --> 00:06:55,510 +Và cái mà chúng tôi muốn là căn chỉnh này. Vì vậy, hãy tiếp tục và nhập căn chỉnh, và bây giờ + +103 +00:06:55,960 --> 00:07:00,340 +chúng ta có quyền truy cập vào thuộc tính này. Hãy xem điều gì sẽ xảy ra + +104 +00:07:00,340 --> 00:07:03,340 +nếu tôi tiếp tục và in thuộc tính align này. + +105 +00:07:04,270 --> 00:07:08,770 +Bạn có thể thấy rằng đối với cả hai cột của tôi, tên và loại Pokemon, + +106 +00:07:09,100 --> 00:07:12,370 +thuộc tính align được đặt thành C, được căn giữa. + +107 +00:07:13,240 --> 00:07:18,240 +Điều tôi muốn làm là thay đổi toàn bộ bảng thành căn trái. Cũng giống như chúng ta làm với bất kỳ biến + +108 +00:07:18,730 --> 00:07:21,760 +nào khác, tất nhiên, chúng ta có thể in nó, nhưng chúng ta + +109 +00:07:22,090 --> 00:07:23,800 +cũng có thể thay đổi nó. + +110 +00:07:24,280 --> 00:07:28,090 +Và chúng ta sẽ thay đổi một biến chỉ bằng cách sử dụng dấu bằng, phải không? + +111 +00:07:28,390 --> 00:07:31,330 +Vì vậy, hãy thay đổi căn chỉnh thành căn trái và + +112 +00:07:31,810 --> 00:07:33,490 +bây giờ hãy chạy lại mã. + +113 +00:07:34,570 --> 00:07:39,570 +Và bạn có thể thấy bây giờ cả hai cột của tôi đều đang thẳng hàng với lề + +114 +00:07:40,150 --> 00:07:40,983 +bên trái. + +115 +00:07:42,700 --> 00:07:45,580 +Vì vậy, chúng tôi đã thấy cách chúng tôi có thể sử dụng + +116 +00:07:45,640 --> 00:07:49,480 +các thuộc tính như các thuộc tính ở đây để thay đổi kiểu dáng của bảng của chúng tôi. + +117 +00:07:49,750 --> 00:07:52,300 +Chúng tôi đã thấy cách chúng tôi có thể sử + +118 +00:07:52,510 --> 00:07:57,510 +dụng các phương thức như add_column hoặc add_row để làm việc với đối tượng bảng này và làm cho nó thực + +119 +00:07:58,810 --> 00:08:02,680 +hiện một số loại chức năng, chẳng hạn như thêm các phần dữ liệu vào nó. + +120 +00:08:03,130 --> 00:08:08,130 +Và chúng tôi đã thấy cách chúng tôi có thể tạo các đối tượng mới bằng cách đơn giản xây + +121 +00:08:08,350 --> 00:08:13,000 +dựng nó từ lớp kế hoạch chi tiết. Hãy thoải mái với những bảng xếp hạng xinh xắn bao + +122 +00:08:13,240 --> 00:08:15,940 +nhiêu tùy thích khi bạn muốn thay đổi, những thứ khác về nó + +123 +00:08:16,000 --> 00:08:17,770 +hoặc thêm các phần dữ liệu khác nhau. + +124 +00:08:18,130 --> 00:08:23,130 +Nhưng một khi bạn hài lòng với việc tạo đối tượng thay đổi các thuộc tính và gọi các phương + +125 +00:08:23,770 --> 00:08:25,150 +thức, thì hãy chuyển sang + +126 +00:08:25,510 --> 00:08:28,900 +bài học tiếp theo mà tôi có một bài kiểm tra cho bạn. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/006 Python Objects Quiz.html b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/006 Python Objects Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..0b3103a8494b4818653843d89b4be1e8e646c14c --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/006 Python Objects Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Building the Coffee Machine in OOP.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Building the Coffee Machine in OOP.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4b50df6b6130d4ccd491300c572c9e3bbee4cf09 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Building the Coffee Machine in OOP.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:853b9aa6e7f5d38d0fd2221da6a1de3b813d382b399638b8546403c403428f4c +size 85355534 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Building the Coffee Machine in OOP_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Building the Coffee Machine in OOP_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..33fd8ce82af42bc033c952adc97d950a98fb8427 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Building the Coffee Machine in OOP_vi.srt @@ -0,0 +1,444 @@ +1 +00:00:00,240 --> 00:00:05,240 +Bây giờ khi chúng ta bắt đầu sử dụng các đối tượng và các thuộc tính và phương thức của chúng ngày càng nhiều, + +2 +00:00:05,640 --> 00:00:10,410 +chúng ta sẽ bắt đầu tìm hiểu lý do tại sao chúng lại hữu ích và được các lập trình viên yêu + +3 +00:00:10,410 --> 00:00:12,120 +thích đến vậy. Bây giờ, tôi nghĩ + +4 +00:00:12,150 --> 00:00:17,150 +một trong những người không phải lập trình viên giải thích OOP tốt nhất thực sự là Steve Jobs + +5 +00:00:18,350 --> 00:00:19,183 +quá cố. + +6 +00:00:19,730 --> 00:00:24,730 +Và anh ấy có một ví dụ tuyệt vời này làm cho nó thực sự rõ ràng tại sao các vật thể lại + +7 +00:00:25,880 --> 00:00:28,100 +tuyệt vời như vậy. Trong câu chuyện + +8 +00:00:28,280 --> 00:00:33,280 +của mình, anh ấy nói về khái niệm này, giả sử bạn đang đi du lịch đến Nhật Bản + +9 +00:00:33,440 --> 00:00:35,450 +và sau một chuyến bay dài, cuối cùng + +10 +00:00:36,020 --> 00:00:40,910 +bạn đã hạ cánh và bạn đi ra ngoài và có những bông hoa anh đào tuyệt đẹp, Mt. + +11 +00:00:40,910 --> 00:00:44,270 +Fuji trông thật tuyệt. Nhưng không may trên chuyến bay, bạn đã làm + +12 +00:00:44,630 --> 00:00:45,920 +bẩn chiếc áo phông của mình. + +13 +00:00:45,950 --> 00:00:50,950 +Bạn quá háo hức với nước ép cà chua và bạn đã làm đổ mọi + +14 +00:00:51,560 --> 00:00:55,460 +thứ lên mình. Vậy ta phải làm sao? Chà, bạn đang + +15 +00:00:55,520 --> 00:00:58,700 +ở thành phố xa lạ này và thậm chí bạn không + +16 +00:00:58,730 --> 00:01:02,420 +biết liệu mình đang ở đâu để tìm tiệm giặt khô hay + +17 +00:01:02,600 --> 00:01:06,320 +tiệm giặt là nhỏ gần nhất. Và trên hết, bạn không + +18 +00:01:06,380 --> 00:01:09,470 +có nội tệ. Họ lấy tiền yên, nhưng bạn chỉ + +19 +00:01:09,500 --> 00:01:14,240 +có bảng Anh và bạn thậm chí không nói được tiếng Nhật. Vậy bạn làm gì? + +20 +00:01:14,750 --> 00:01:18,890 +Đó sẽ là một cuộc đấu tranh thực sự để giải quyết vấn đề này. Chà, bạn đang ở khách + +21 +00:01:19,130 --> 00:01:22,970 +sạn, phải không? Và nhân viên khách sạn có lẽ nói tiếng Anh. + +22 +00:01:23,420 --> 00:01:28,250 +Vì vậy, bạn đến gặp lễ tân và bạn nói với khách sạn rằng, Này, áo phông của tôi bị bẩn và + +23 +00:01:28,280 --> 00:01:32,270 +họ nói, Này, không có vấn đề gì. Chúng tôi sẽ lấy điều đó từ bạn. + +24 +00:01:32,420 --> 00:01:35,240 +Và chúng tôi sẽ đi xử lý tất cả những thứ lộn xộn đó. + +25 +00:01:35,540 --> 00:01:37,280 +Chúng tôi biết cách tìm cửa hàng giặt khô, + +26 +00:01:37,550 --> 00:01:40,820 +chúng tôi có thể thanh toán bằng đồng nội tệ và chúng tôi nói tiếng địa phương. + +27 +00:01:41,270 --> 00:01:44,990 +Và những gì bạn nhận lại chỉ là một chiếc áo thun sạch đẹp. + +28 +00:01:45,500 --> 00:01:50,360 +Vì vậy, điều này tương tự như quá trình làm việc với các đối tượng. Về cơ bản, nếu bạn có đối tượng + +29 +00:01:50,360 --> 00:01:52,640 +khách sạn này có bản thiết kế + +30 +00:01:52,790 --> 00:01:56,450 +cho cách xử lý giặt hấp một số loại quần áo, thì tất + +31 +00:01:56,510 --> 00:02:01,510 +cả những gì bạn phải làm là lấy khách sạn đối tượng và sau đó gọi phương thức + +32 +00:02:03,170 --> 00:02:06,500 +liên quan của nó là giặt khô, và sau đó nó sẽ + +33 +00:02:06,920 --> 00:02:10,039 +làm tất cả của những thứ lộn xộn cho bạn. + +34 +00:02:10,280 --> 00:02:14,090 +Và bạn không phải lo lắng về việc thực hiện chức năng này. + +35 +00:02:14,750 --> 00:02:18,020 +Vì vậy, bây giờ bạn có thể làm việc với nhiều đối + +36 +00:02:18,350 --> 00:02:23,330 +tượng để họ làm những việc khác nhau và tin tưởng rằng họ biết cách quản lý dữ + +37 +00:02:23,330 --> 00:02:26,510 +liệu và cách thực hiện các chức năng cần thiết. + +38 +00:02:27,350 --> 00:02:30,410 +Quay trở lại vấn đề mà chúng tôi đã giải quyết khi tạo ra chiếc máy pha + +39 +00:02:30,710 --> 00:02:35,090 +cà phê đó với tất cả các yêu cầu của chương trình. Chà, đã đến lúc thử nghiệm + +40 +00:02:35,090 --> 00:02:39,740 +kiến thức Lập trình hướng đối tượng của chúng tôi bởi vì chúng tôi sẽ + +41 +00:02:39,740 --> 00:02:44,180 +tạo ra một phiên bản OOP cho chiếc máy pha cà phê của mình. + +42 +00:02:44,990 --> 00:02:48,020 +Bây giờ chương trình vẫn có các yêu cầu tương + +43 +00:02:48,020 --> 00:02:51,050 +tự như trước đây. Bạn phải in báo cáo + +44 +00:02:51,050 --> 00:02:54,350 +cho tất cả các nguồn, bạn phải kiểm tra xem các nguồn có đủ + +45 +00:02:54,530 --> 00:02:59,530 +không, xử lý tiền xu, kiểm tra giao dịch có thành công hay không, và cuối cùng là pha cà phê. + +46 +00:03:00,100 --> 00:03:03,700 +Nhưng trong trường hợp này, bạn sẽ làm việc với các đối tượng. + +47 +00:03:04,810 --> 00:03:06,220 +Trong các tài nguyên của + +48 +00:03:06,250 --> 00:03:11,110 +khóa học, bạn sẽ tìm thấy một liên kết đến dự án bắt đầu cho máy pha cà phê OOP. + +49 +00:03:11,620 --> 00:03:13,090 +Vì vậy, nếu bạn truy cập + +50 +00:03:13,240 --> 00:03:17,170 +liên kết này, bạn có thể thấy rằng có rất nhiều mã mà chúng tôi đã viết + +51 +00:03:17,170 --> 00:03:18,250 +cho bạn. Bây giờ, + +52 +00:03:18,280 --> 00:03:22,300 +ý tưởng ở đây là bạn sẽ không chạm vào bất kỳ tệp nào khác trong số + +53 +00:03:22,300 --> 00:03:27,160 +này, máy kiếm tiền, menu hay máy pha cà phê. Tất cả mã đó đã được viết cho bạn + +54 +00:03:27,160 --> 00:03:28,360 +và nó gần giống + +55 +00:03:28,690 --> 00:03:31,750 +như bạn đang làm việc với một thư viện bên ngoài. + +56 +00:03:32,260 --> 00:03:35,020 +Bạn sẽ chỉ tin tưởng rằng họ làm những gì họ nói. + +57 +00:03:35,980 --> 00:03:40,270 +Và bạn sẽ tìm thấy một liên kết đến tài liệu về máy pha cà + +58 +00:03:40,630 --> 00:03:45,630 +phê này mà tôi đã tạo, mô tả chi tiết những gì mỗi lớp hoặc bản thiết + +59 +00:03:46,390 --> 00:03:50,560 +kế này cho phép bạn làm. Vì vậy, khi bạn tạo một đối tượng từ + +60 +00:03:50,830 --> 00:03:54,340 +lớp mục menu, thì bạn có quyền truy cập vào thuộc tính tên, thuộc tính + +61 +00:03:54,340 --> 00:03:58,690 +chi phí, thuộc tính thành phần và cũng có mô tả về những gì nó phải làm và + +62 +00:03:58,930 --> 00:04:00,610 +ví dụ có thể là gì. + +63 +00:04:01,450 --> 00:04:05,860 +Bạn có quyền truy cập vào tất cả các lớp này và bạn có thể xây dựng các đối + +64 +00:04:05,860 --> 00:04:08,620 +tượng từ mỗi lớp này để giải quyết dự án này. + +65 +00:04:09,670 --> 00:04:13,540 +Để làm việc với PyCharm, tất cả những gì bạn cần làm là tải xuống tệp zip chứa + +66 +00:04:13,540 --> 00:04:16,810 +tất cả mã bắt đầu từ trang web tài nguyên khóa học của chúng tôi. + +67 +00:04:17,260 --> 00:04:18,160 +Ngoài ra, + +68 +00:04:18,190 --> 00:04:22,270 +nếu bạn đã đăng nhập trên Repl. nó, chỉ cần fork dự án và sau đó nhấp vào + +69 +00:04:22,270 --> 00:04:26,350 +ba dấu chấm này để tải xuống tệp zip tại đây. Bây giờ, khi bạn thấy rằng trong + +70 +00:04:26,350 --> 00:04:28,510 +thư mục tải xuống của mình, tất cả + +71 +00:04:28,540 --> 00:04:31,450 +những gì bạn phải làm là giải nén hoặc giải nén nó. + +72 +00:04:32,020 --> 00:04:35,140 +Và sau đó bạn có thể vào PyCharm và mở nó tại đây. + +73 +00:04:35,260 --> 00:04:40,030 +Vì vậy, hãy nhấp vào nút mở và sau đó điều hướng đến nơi bạn đã + +74 +00:04:40,030 --> 00:04:43,330 +tải xuống thư mục đó. Hãy nhớ rằng nó cần được giải nén. + +75 +00:04:44,260 --> 00:04:48,550 +Nếu bạn đang sử dụng windows, hãy nhấp chuột phải vào tệp zip và chọn giải nén tất cả. + +76 +00:04:48,880 --> 00:04:50,260 +Sau đó bấm giải nén. + +77 +00:04:50,560 --> 00:04:54,280 +Bạn sẽ thấy cửa sổ bật lên thư mục đã giải nén bên cạnh tệp zip của mình. + +78 +00:04:55,240 --> 00:05:00,240 +Nếu bạn đang sử dụng Mac thì tất cả những gì bạn cần làm là chỉ cần nhấp đúp vào. tệp zip. + +79 +00:05:01,750 --> 00:05:04,000 +Bây giờ, nếu chúng ta nhấp vào mở trên thư mục + +80 +00:05:04,660 --> 00:05:08,740 +đó, thì nó sẽ mở ra dự án này. Và khi bạn mở thư mục dự + +81 +00:05:08,770 --> 00:05:11,230 +án, bạn sẽ thấy tất cả các tệp giống nhau. + +82 +00:05:11,770 --> 00:05:16,300 +Bây giờ bạn sẽ chỉ làm việc từ chính. py Trên thực tế, tôi + +83 +00:05:16,300 --> 00:05:20,200 +thậm chí không muốn bạn quan tâm nhiều đến mã trong các + +84 +00:05:20,200 --> 00:05:21,033 +tệp khác. + +85 +00:05:21,190 --> 00:05:25,840 +Nó có các định nghĩa về lớp và nhiều thứ khác mà chúng ta sẽ tìm hiểu + +86 +00:05:25,840 --> 00:05:27,370 +trong bài học tiếp theo. + +87 +00:05:27,790 --> 00:05:32,170 +Nhưng hiện tại, tôi muốn bạn coi nó như thể nó là một thư viện bên ngoài + +88 +00:05:32,350 --> 00:05:37,000 +mà bạn sẽ sử dụng. Ngay từ đầu của main. tệp py, tôi đã + +89 +00:05:37,060 --> 00:05:41,380 +nhập tất cả bốn lớp mà bạn sẽ sử dụng; menu, mục menu, + +90 +00:05:41,410 --> 00:05:44,110 +máy pha cà phê và máy tính tiền. + +91 +00:05:44,800 --> 00:05:49,690 +Bây giờ tất cả các lớp này được ghi lại trong trang web tài liệu về máy pha + +92 +00:05:49,690 --> 00:05:50,523 +cà phê. + +93 +00:05:50,800 --> 00:05:55,800 +Tất cả những gì bạn phải làm là truy cập trang web này và đọc qua + +94 +00:05:56,140 --> 00:05:59,930 +những gì mỗi lớp làm. Một số trong số chúng có thuộc tính và phương + +95 +00:06:00,260 --> 00:06:02,120 +thức, những người khác chỉ có phương thức. + +96 +00:06:02,720 --> 00:06:07,720 +Vì vậy, mỗi lớp trong số các lớp này đã được viết sẵn mã để thực hiện rất nhiều + +97 +00:06:08,450 --> 00:06:12,740 +công việc nặng nhọc và tất cả mã mà chúng ta phải viết khi viết mã máy + +98 +00:06:12,740 --> 00:06:14,330 +pha cà phê từ đầu. + +99 +00:06:14,810 --> 00:06:19,790 +Nhưng lần này bạn sẽ chỉ sử dụng bốn lớp này và các đối tượng được + +100 +00:06:19,790 --> 00:06:24,470 +tạo ra từ chúng để đạt được chính xác các mục tiêu như trước đây. + +101 +00:06:25,100 --> 00:06:29,120 +Vì vậy, trong khi các mục tiêu vẫn còn mới trong đầu bạn từ + +102 +00:06:29,540 --> 00:06:33,500 +ngày hôm trước, bạn nên xem lại mã từ ngày hôm trước, sau + +103 +00:06:33,500 --> 00:06:38,500 +đó đọc tài liệu và xem cách bạn sẽ triển khai chính xác cùng một dự án + +104 +00:06:38,930 --> 00:06:43,310 +nhưng lần này chỉ sử dụng các đối tượng được tạo từ các lớp này. + +105 +00:06:43,880 --> 00:06:47,300 +Bạn sẽ cần dành một chút thời gian cho việc này vì bạn sẽ cần + +106 +00:06:47,300 --> 00:06:52,300 +phải suy nghĩ về cách tạo các đối tượng từ các lớp kế hoạch chi tiết này và sau đó là cách sử + +107 +00:06:52,510 --> 00:06:56,420 +dụng các đối tượng, cách gọi các phương thức và logic cần thiết để kết hợp mọi + +108 +00:06:56,420 --> 00:06:58,430 +thứ lại với nhau. Hãy tạm dừng + +109 +00:06:58,430 --> 00:07:02,480 +video ngay bây giờ, suy nghĩ về vấn đề này và cố gắng làm cho máy pha + +110 +00:07:02,480 --> 00:07:07,480 +cà phê hoạt động hoàn toàn giống và có tất cả các chức năng giống như máy pha cà phê mà + +111 +00:07:08,030 --> 00:07:10,190 +bạn đã tạo trong dự án ngày hôm qua. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Coffee-Machine-Classes-Documentation.pdf b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Coffee-Machine-Classes-Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f08f51d0ded4cf0afb34e9634d3bf1b7790de0e6 Binary files /dev/null and b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Coffee-Machine-Classes-Documentation.pdf differ diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Coffee-Machine-Program-Requirements.pdf b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Coffee-Machine-Program-Requirements.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a13f19090797ad910137350fd69eca7bef1e44f6 Binary files /dev/null and b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Coffee-Machine-Program-Requirements.pdf differ diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 OOP-Coffee-Machine-Project-Starting-Code.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 OOP-Coffee-Machine-Project-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..8d6aa5468be398d24b1264abce42ce83fb7cd820 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 OOP-Coffee-Machine-Project-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/oop-coffee-machine-start \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Steve-Jobs-on-Object-Oriented-Programming.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Steve-Jobs-on-Object-Oriented-Programming.url new file mode 100644 index 0000000000000000000000000000000000000000..9a3e703989c42815ee96d0e9535404eb84bfb61a --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 Steve-Jobs-on-Object-Oriented-Programming.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.rollingstone.com/culture/culture-news/steve-jobs-in-1994-the-rolling-stone-interview-231132/ \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 oop-coffee-machine-start.zip b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 oop-coffee-machine-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..46f534fdaefd50d35cf9930432f686467a76479c --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/007 oop-coffee-machine-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfb5bbb48c48741fe268763dbf058e1faf97d1fd283b32d49e9f307e9394671c +size 2083 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Course-Fixes-Report-an-Issue.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 OOP-Coffee-Machine-Project-Final-Code.url b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 OOP-Coffee-Machine-Project-Final-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..2db53b4f2d34ec5e4b0062971006eade9de3164c --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 OOP-Coffee-Machine-Project-Final-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/oop-coffee-machine-final \ No newline at end of file diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Walkthrough and Solution for the OOP Coffee Machine.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Walkthrough and Solution for the OOP Coffee Machine.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..adb073ee9c945b170401543c8870859d804e89a8 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Walkthrough and Solution for the OOP Coffee Machine.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e4f47411e5085cdfea762e9421e6652025a07355ec2dc23c396a6fae5e61ddc +size 87284616 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Walkthrough and Solution for the OOP Coffee Machine_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Walkthrough and Solution for the OOP Coffee Machine_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..50c806d89d57e6e72c2c2e1d887658fd0a56907e --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/008 Walkthrough and Solution for the OOP Coffee Machine_vi.srt @@ -0,0 +1,700 @@ +1 +00:00:00,450 --> 00:00:07,140 +Nếu bạn gặp khó khăn hoặc nếu bạn gặp bất kỳ vấn đề nào khi hoàn thành dự án này, bước khởi đầu đầu tiên là xem lại những bài học bạn đã + +2 +00:00:07,140 --> 00:00:08,380 +học được ngày hôm nay. + +3 +00:00:08,760 --> 00:00:14,280 +Có thể bạn chỉ cần xem lý thuyết một vài lần nữa và nghe lại một vài lần nữa và + +4 +00:00:14,280 --> 00:00:19,410 +thực hành thêm vài lần nữa trước khi bạn sẵn sàng giải quyết thử thách cuối cùng này. + +5 +00:00:20,070 --> 00:00:24,660 +Nhưng nếu bạn đã hoàn thành nó và bạn chỉ muốn xem giải pháp, thì tôi sẽ đi qua nó với bạn + +6 +00:00:24,660 --> 00:00:25,380 +ngay bây giờ. + +7 +00:00:26,400 --> 00:00:30,210 +Một lần nữa, chúng tôi sẽ hoàn thành từng bước tất cả các yêu cầu của chương trình. + +8 +00:00:30,570 --> 00:00:38,610 +Vì vậy, điều đầu tiên là in một báo cáo cho tất cả các tài nguyên hiện tại trong máy pha cà phê. Quay lại PyCharm, tôi thực sự sẽ thu gọn toàn bộ thư + +9 +00:00:38,610 --> 00:00:39,090 +mục + +10 +00:00:39,330 --> 00:00:44,310 +dự án này vì tôi sẽ không viết bất kỳ mã nào ngoài mã bên + +11 +00:00:44,310 --> 00:00:46,140 +trong main. py + +12 +00:00:47,040 --> 00:00:54,270 +Bây giờ bạn có thể thấy ở đây, chúng tôi đã có quyền truy cập vào bốn lớp học. Và nếu chúng ta xem bên trong tài liệu, bạn có thể + +13 +00:00:54,480 --> 00:01:00,990 +thấy rằng cả lớp máy pha cà phê và lớp máy kiếm tiền đều có một phương thức được gọi là báo cáo. + +14 +00:01:01,560 --> 00:01:06,690 +Và điều này sẽ in ra một báo cáo về tất cả các nguồn tài nguyên như nước, sữa, cà phê, và + +15 +00:01:06,990 --> 00:01:09,810 +đây sẽ là một báo cáo về lợi nhuận hiện tại. + +16 +00:01:10,260 --> 00:01:16,290 +Vì vậy, báo cáo cuối cùng của chúng tôi sẽ là báo cáo từ máy kiếm tiền cũng như máy pha cà phê. + +17 +00:01:17,310 --> 00:01:22,380 +Hãy tiếp tục và bắt đầu bằng cách tạo một số đối tượng từ các lớp này. + +18 +00:01:22,950 --> 00:01:27,840 +Ví dụ: máy kiếm tiền sẽ chỉ được gọi là money_machine hoặc bạn + +19 +00:01:27,870 --> 00:01:30,250 +có thể gọi nó là my_money_machine. + +20 +00:01:30,270 --> 00:01:33,090 +Bạn thực sự có thể đặt tên cho đồ vật của mình bất cứ thứ gì bạn thích. + +21 +00:01:33,720 --> 00:01:41,160 +Nhưng tôi sẽ chỉ sử dụng trường hợp rắn Python mặc định để tạo một biến money_machine mới, + +22 +00:01:41,160 --> 00:01:46,980 +sẽ chứa đối tượng của tôi. Và đối tượng của tôi tất nhiên sẽ được tạo từ lớp + +23 +00:01:46,980 --> 00:01:47,520 +money machine. + +24 +00:01:48,090 --> 00:01:51,900 +Và việc xây dựng xảy ra khi tôi thêm các dấu ngoặc đơn. + +25 +00:01:52,500 --> 00:01:58,440 +Vì vậy, bây giờ tôi có một đối tượng được tạo và lưu trữ bên trong biến money_machine này. + +26 +00:01:59,280 --> 00:02:06,870 +Bây giờ, nếu tôi muốn cỗ máy kiếm tiền này tạo báo cáo, thì tất cả những gì tôi phải làm là chạm vào đối tượng + +27 +00:02:07,260 --> 00:02:12,360 +rồi viết dấu chấm và sau đó gọi phương thức mà tôi cần, đó là báo cáo. + +28 +00:02:13,020 --> 00:02:15,630 +Vì vậy, bây giờ nếu tôi tiếp tục và chạy + +29 +00:02:18,360 --> 00:02:22,110 +mã của mình, bạn có thể thấy nó in ra số tiền hiện tại trong máy. + +30 +00:02:22,890 --> 00:02:25,710 +Bây giờ chúng ta hãy làm điều tương tự cho máy pha cà phê của chúng ta. + +31 +00:02:26,630 --> 00:02:31,010 +Một lần nữa, tôi sẽ gọi nó là coffee_maker, và bạn thấy điều này thường xuyên. + +32 +00:02:31,020 --> 00:02:39,840 +Việc đặt tên đối tượng có xu hướng là chữ thường và chữ hoa, do đó được phân tách bằng dấu gạch dưới, phiên bản của + +33 +00:02:39,840 --> 00:02:40,740 +tên lớp. + +34 +00:02:40,950 --> 00:02:47,580 +Vì vậy, tên của lớp là CoffeeMaker, và thông thường bạn sẽ thấy mọi người đặt tên cho đối tượng giống hệt + +35 +00:02:47,580 --> 00:02:49,290 +nhau, nhưng bằng chữ thường. + +36 +00:02:50,280 --> 00:02:57,900 +Và bây giờ tôi đã có máy pha cà phê của mình, sau đó tôi có thể tiếp tục và gọi phương thức báo cáo trên đối tượng + +37 +00:02:57,900 --> 00:02:58,410 +đó. + +38 +00:02:58,800 --> 00:03:05,190 +Và bây giờ, nếu tôi chạy mã của mình một lần nữa, bạn có thể thấy rằng tôi đã có mọi thứ hiện đang được báo cáo và in ra. + +39 +00:03:06,060 --> 00:03:12,870 +Vì vậy, trong trường hợp này, chúng tôi thực sự không phải quan tâm đến việc báo cáo đang triển khai tất cả các chức năng này như thế nào. + +40 +00:03:13,200 --> 00:03:19,470 +Tất cả những gì chúng ta phải làm là đọc tài liệu, tìm phương pháp thực hiện những điều chúng ta muốn và sau + +41 +00:03:19,470 --> 00:03:23,640 +đó tin tưởng rằng nó sẽ thực hiện các chức năng như được mô tả. + +42 +00:03:24,870 --> 00:03:30,480 +Bây giờ chúng ta đã hoàn thành bước 1, bước tiếp theo là kiểm tra xem các nguồn lực có đủ hay không. + +43 +00:03:31,080 --> 00:03:35,370 +Cổng gọi đầu tiên của tôi sẽ chuyển sang phần tài liệu. + +44 +00:03:35,820 --> 00:03:42,240 +Và bạn có thể thấy rằng lớp coffeemaker thực sự có một phương thức được gọi là _resource_eosystem. + +45 +00:03:42,600 --> 00:03:50,130 +Và tất cả những gì chúng ta phải làm là chuyển đồ uống, đây là một món trong thực đơn, sau đó nó sẽ kiểm tra và + +46 +00:03:50,130 --> 00:03:56,640 +đưa ra kết quả đúng, nếu món đồ uống đó có thể được thực hiện, và sai nếu không đủ thành phần. + +47 +00:03:57,840 --> 00:04:03,930 +Vì vậy, làm thế nào để chúng ta nắm giữ mục menu đồ uống này để chuyển sang phương pháp này? + +48 +00:04:04,650 --> 00:04:11,700 +Chà, nếu chúng ta nhìn vào lớp menu, bạn có thể thấy nó có một phương thức gọi là get_items và đây là nơi + +49 +00:04:11,700 --> 00:04:15,030 +bạn thực sự thấy việc đọc tài liệu đúng cách, thực + +50 +00:04:15,450 --> 00:04:19,800 +sự hấp thụ mọi thứ ở đây trở nên thực sự, thực sự hữu ích. + +51 +00:04:20,459 --> 00:04:24,570 +Lớp menu này có hai phương thức thực sự hữu ích. + +52 +00:04:25,050 --> 00:04:30,870 +Một, Nó có thể nắm được tên của tất cả các món có trên menu. + +53 +00:04:31,350 --> 00:04:35,370 +Và nó trả về nó dưới dạng một chuỗi được phân tách bằng dấu gạch chéo về phía trước. + +54 +00:04:36,120 --> 00:04:40,560 +Nó cũng có thể tìm đồ uống dựa trên tên đơn hàng. + +55 +00:04:40,590 --> 00:04:47,550 +Vì vậy, nếu chúng ta đã chuyển một trong những tên này cho hàm find_drink này, thì nó sẽ trả về một đối tượng menu + +56 +00:04:47,550 --> 00:04:49,770 +item nếu nó thực sự tồn tại. + +57 +00:04:50,040 --> 00:04:51,990 +Nếu không, nó sẽ không trả về. + +58 +00:04:52,620 --> 00:04:56,670 +Chúng tôi sẽ cần cả hai điều này để hỏi người dùng họ muốn gì. + +59 +00:04:57,530 --> 00:05:02,520 +Hãy tiếp tục và thiết lập vòng lặp while của chúng tôi. Như chúng ta đã làm trước đó, + +60 +00:05:02,540 --> 00:05:08,660 +tôi sẽ tạo một biến mới được gọi là is_on và nó sẽ bắt đầu trở thành true. + +61 +00:05:09,230 --> 00:05:16,880 +Và sau đó, khi máy pha cà phê đang bật, thì chúng tôi sẽ nắm bắt tất cả các tùy chọn mà chúng + +62 +00:05:16,880 --> 00:05:22,850 +tôi có thể cung cấp cho người dùng. Và chúng tôi nhận được điều đó bằng cách gọi phương thức get_items đó. + +63 +00:05:23,300 --> 00:05:28,580 +Nhưng tất nhiên, bởi vì đây là một phương thức, nó được liên kết với một đối tượng. + +64 +00:05:28,670 --> 00:05:32,240 +Vì vậy, chúng ta phải tạo một đối tượng từ bản thiết kế menu này. + +65 +00:05:33,440 --> 00:05:36,770 +Vì vậy, hãy làm điều đó bên cạnh tất cả các đối tượng khác đang được tạo. + +66 +00:05:37,190 --> 00:05:42,050 +Vì vậy, chúng ta hãy tạo một đối tượng menu và nó sẽ được tạo từ lớp menu, sau đó chúng + +67 +00:05:42,050 --> 00:05:43,640 +ta thêm các dấu ngoặc đơn. + +68 +00:05:44,030 --> 00:05:47,840 +Và bây giờ chúng ta có quyền truy cập vào đối tượng đó bằng menu tên. + +69 +00:05:48,380 --> 00:05:54,800 +Các tùy chọn sẽ ngang bằng với đối tượng menu và sau đó chúng ta sẽ gọi phương thức get_items. + +70 +00:05:55,340 --> 00:06:01,580 +Và sau đó khi phương thức này trả về, nó sẽ lưu chuỗi và tất cả các tùy chọn vào biến này được gọi + +71 +00:06:01,580 --> 00:06:02,390 +là tùy chọn. + +72 +00:06:02,990 --> 00:06:09,800 +Bây giờ chúng tôi có thể có được sự lựa chọn của người dùng bằng cách yêu cầu họ về những gì bạn muốn? + +73 +00:06:11,170 --> 00:06:17,650 +Và sau đó bên trong một tập hợp các dấu ngoặc đơn, chúng tôi sẽ cung cấp cho họ tất cả các tùy chọn. Và sau đó, tất nhiên, tôi cần biến điều + +74 +00:06:17,650 --> 00:06:19,480 +này thành một sợi dây. + +75 +00:06:19,630 --> 00:06:24,070 +Và mã đánh dấu ngay lập tức cho tôi biết rằng điều này thực sự đang hoạt động. + +76 +00:06:24,640 --> 00:06:32,740 +Vì vậy, khi tôi đã có lựa chọn của người dùng, thì tôi có thể kết hợp hành vi báo cáo vào lựa chọn này. + +77 +00:06:33,130 --> 00:06:42,310 +Hãy nhớ rằng, trước đây chúng ta đã nói nếu lựa chọn bằng với tắt, thì điều đó có nghĩa là is_on sẽ bằng false và nếu lựa chọn + +78 +00:06:42,310 --> 00:06:45,390 +tương đương với báo cáo, tốt, trong trường hợp này, + +79 +00:06:45,400 --> 00:06:47,860 +chúng ta sẽ lấy máy pha cà + +80 +00:06:48,310 --> 00:06:53,110 +phê và máy kiếm tiền để thực hiện các báo cáo của họ vào bảng + +81 +00:06:53,110 --> 00:06:54,040 +điều khiển. + +82 +00:06:54,970 --> 00:07:03,040 +Cuối cùng, chúng tôi đã sẵn sàng giải quyết vấn đề tiếp theo, đó là làm cách nào để kiểm tra xem chúng tôi có đủ tài nguyên hay không? + +83 +00:07:04,100 --> 00:07:10,520 +Và điều này sẽ yêu cầu chúng tôi tìm đồ uống có tên đơn hàng mà người dùng đã + +84 +00:07:10,520 --> 00:07:17,440 +chọn từ lựa chọn và sau đó giữ mục menu xuất hiện dưới dạng đầu ra từ lệnh gọi phương thức này. + +85 +00:07:18,430 --> 00:07:26,110 +Vì vậy, nếu không, chúng ta sẽ tiết kiệm đồ uống của mình dưới dạng một biến thể được gọi là đồ uống, và + +86 +00:07:26,110 --> 00:07:35,500 +sau đó chúng ta sẽ khai thác thực đơn. find_drink. Và find_drink, bạn sẽ nhận thấy, lấy tên đơn hàng làm đầu vào. + +87 +00:07:35,980 --> 00:07:42,370 +Vì vậy, đây là một chuỗi và điều này sẽ bằng với bất kỳ thứ gì người dùng đã chọn bên trong lựa chọn này. + +88 +00:07:42,940 --> 00:07:45,910 +Vì vậy, hãy đặt sự lựa chọn ở đây làm đầu vào. + +89 +00:07:46,450 --> 00:07:51,190 +Và bây giờ, khi chúng ta đã cầm trên tay thức uống này, chúng ta hãy tiếp tục và in nó. + +90 +00:07:51,820 --> 00:07:55,930 +Hãy nhớ rằng, chúng tôi đang mong đợi một đối tượng mục menu ở giai đoạn này. + +91 +00:07:56,500 --> 00:08:01,480 +Vì vậy, chúng ta hãy nhấp vào chạy và hãy đảm bảo rằng chúng ta có + +92 +00:08:01,870 --> 00:08:11,440 +thể nhấn báo cáo để nhận báo cáo, chúng ta có thể tắt để tắt máy và thoát mã và chúng ta cũng có thể giữ một ly latte bằng + +93 +00:08:11,440 --> 00:08:14,530 +cách chuyển latte như thức uống chúng tôi muốn. + +94 +00:08:15,040 --> 00:08:21,940 +Và bây giờ chúng ta sẽ in một đối tượng mục menu tại vị trí cụ thể này trong bộ nhớ của máy tính. + +95 +00:08:22,450 --> 00:08:23,040 +Hoàn hảo. + +96 +00:08:23,050 --> 00:08:25,330 +Mọi thứ đang hoạt động như mong đợi. + +97 +00:08:26,140 --> 00:08:32,590 +Bây giờ, thay vì in đồ uống, tôi sẽ giải quyết bước 2 này, đó là kiểm tra xem các nguồn + +98 +00:08:32,590 --> 00:08:34,330 +lực có đủ hay không. + +99 +00:08:35,440 --> 00:08:42,400 +Một lần nữa, điều đó sẽ yêu cầu chúng tôi xem qua tài liệu của chúng tôi. Và bạn sẽ thấy rằng lớp máy pha cà + +100 +00:08:42,400 --> 00:08:43,600 +phê có + +101 +00:08:43,600 --> 00:08:50,260 +phương thức đó là is_resource _sunough và nó yêu cầu một đối tượng menu item làm đầu vào. + +102 +00:08:50,710 --> 00:08:54,970 +Và sau đó nó sẽ trả về true khi nó có thể được thực hiện và false nếu nó không thể. + +103 +00:08:55,960 --> 00:09:03,550 +Vì vậy, chúng ta hãy nắm giữ đối tượng máy pha cà phê của chúng tôi và sau đó kiểm tra xem các nguồn lực có đủ để tạo ra + +104 +00:09:03,940 --> 00:09:07,000 +đồ uống hiện tại mà chúng ta quan tâm hay không. + +105 +00:09:07,870 --> 00:09:11,770 +Và hãy tiếp tục và in kết quả ở đây và chạy + +106 +00:09:12,820 --> 00:09:14,350 +mã của chúng tôi. + +107 +00:09:15,190 --> 00:09:23,290 +Giả sử rằng chúng tôi muốn pha một ly latte. Đó sẽ là nguồn tài nguyên đầy đủ, rất đúng. Espresso, cũng đúng, + +108 +00:09:23,620 --> 00:09:27,560 +và một Cappuccino cũng đúng. + +109 +00:09:27,580 --> 00:09:29,740 +Vì vậy, về cơ bản chúng ta có thể làm cả ba loại đồ uống. + +110 +00:09:30,070 --> 00:09:37,480 +Bây giờ, thay vì in nó ra, những gì chúng ta muốn làm là chúng ta muốn kiểm tra xem điều này có đúng không và sau đó + +111 +00:09:37,480 --> 00:09:40,210 +tiến hành bước tiếp theo nếu có đủ tài nguyên. + +112 +00:09:40,870 --> 00:09:47,830 +Bây giờ bước tiếp theo là nhận thanh toán từ người dùng và xử lý tiền và kiểm tra xem giao dịch có thành + +113 +00:09:47,830 --> 00:09:48,700 +công hay không. + +114 +00:09:49,630 --> 00:09:56,980 +Lưu ý rằng trong tài liệu về máy pha cà phê của chúng tôi cho máy tính tiền, chúng + +115 +00:09:56,980 --> 00:10:05,050 +tôi thực sự không có cách xử lý tiền xu. Nhưng những gì nó có là nó cho phép chúng tôi thực hiện thanh toán + +116 +00:10:05,050 --> 00:10:11,530 +chuyển qua chi phí đồ uống và sau đó nó sẽ trả về true khi thanh toán được chấp nhận hoặc sai, nếu không đủ. + +117 +00:10:12,160 --> 00:10:15,650 +Vì vậy, hãy xem điều gì sẽ xảy ra nếu chúng tôi thực sự cố gắng thanh toán. + +118 +00:10:16,510 --> 00:10:23,110 +Hãy khai thác đối tượng máy tính tiền của chúng tôi và sau đó gọi phương thức make_payment và chúng tôi phải + +119 +00:10:23,110 --> 00:10:26,170 +chuyển chi phí đồ uống mà người dùng đã đặt. + +120 +00:10:26,710 --> 00:10:34,480 +Vì vậy, chúng tôi đã có đối tượng đồ uống ở đây, hãy nhớ là một mục trong thực đơn và mỗi mục trong thực đơn có ba thuộc + +121 +00:10:34,480 --> 00:10:39,880 +tính mà chúng tôi quan tâm: tên của thức uống, chi phí của thức uống và danh sách thành + +122 +00:10:39,880 --> 00:10:40,240 +phần. + +123 +00:10:40,630 --> 00:10:49,360 +Vì vậy, đây là những gì chúng tôi quan tâm vào lúc này. Vì vậy, chúng tôi có thể vượt qua trong đồ uống. cost là thuộc tính liên quan đến + +124 +00:10:49,360 --> 00:10:52,270 +đối tượng đồ uống và chi + +125 +00:10:52,750 --> 00:10:59,110 +phí đó sẽ được xử lý bằng phương thức make_payment này từ máy tính tiền. + +126 +00:10:59,740 --> 00:11:05,020 +Và cuối cùng, nó sẽ cho chúng ta biết liệu điều này có thành công hay không. + +127 +00:11:05,410 --> 00:11:08,200 +Vì vậy, hãy xem điều gì sẽ xảy ra khi chúng ta chạy đoạn mã này. + +128 +00:11:09,230 --> 00:11:11,230 +Giả sử tôi muốn một ly latte, + +129 +00:11:12,170 --> 00:11:14,820 +hãy để ý cách nó yêu cầu tôi nạp tiền: + +130 +00:11:14,840 --> 00:11:22,340 +bao nhiêu phần tư, bao nhiêu dime, bao nhiêu niken và bao nhiêu xu. Một chiếc máy pha cà phê, tôi thực + +131 +00:11:22,700 --> 00:11:28,490 +sự không cần quan tâm đến cách xử lý tiền và đồng xu. + +132 +00:11:29,090 --> 00:11:35,180 +Tất cả những gì tôi phải làm là gọi make_payment và nó tự động giải quyết tất cả những điều này. + +133 +00:11:36,170 --> 00:11:43,430 +Cuối cùng, nó cung cấp cho tôi thay đổi và nó trả về true, cho tôi biết rằng make_payment này đã thực sự + +134 +00:11:43,430 --> 00:11:44,240 +thành công. + +135 +00:11:45,140 --> 00:11:52,610 +Nếu bạn thực sự nhìn vào bên trong mã money_machine, thì bạn có thể thấy rằng nó có một phương thức gọi + +136 +00:11:52,610 --> 00:11:56,790 +là process_ coins, nhưng nó được gọi khi kích hoạt thanh toán. + +137 +00:11:57,290 --> 00:12:02,960 +Lớp này sẽ xử lý tiền xu và sau đó sẽ quyết định xem nó + +138 +00:12:03,170 --> 00:12:07,820 +có thành công hay không. Và nếu thành công, nó sẽ cộng chi phí vào + +139 +00:12:08,120 --> 00:12:13,130 +lợi nhuận, và nếu không, nó sẽ cho bạn biết rằng số tiền đó không đủ và tiền của bạn sẽ được hoàn lại. + +140 +00:12:14,980 --> 00:12:23,620 +Quay lại đây, nếu điều này thành công, thì điều đó có nghĩa là người dùng đã quản lý để thanh toán và chúng tôi + +141 +00:12:23,680 --> 00:12:27,850 +đã thực hiện bước 3 và 4 chỉ bằng một phương pháp. + +142 +00:12:28,960 --> 00:12:32,440 +Điều cuối cùng chúng tôi phải làm là thực sự pha cà phê. + +143 +00:12:33,160 --> 00:12:35,830 +Và điều đó, tất nhiên, xảy ra ngay ở phần cuối ở đây. + +144 +00:12:36,430 --> 00:12:42,730 +Và tất cả những gì chúng ta phải làm để pha cà phê là cầm vào đối tượng máy pha cà phê và sau đó gọi + +145 +00:12:42,730 --> 00:12:48,220 +phương thức pha cà phê và chúng ta có thể chuyển theo thứ tự, đó là thức uống của chúng ta. + +146 +00:12:48,700 --> 00:12:54,850 +Vì hãy nhớ rằng phương thức make_coffee mong đợi một mục menu làm tham số đầu vào. + +147 +00:12:55,990 --> 00:13:03,280 +Chúng tôi thực sự có thể đơn giản hóa mã này hơn nữa bằng cách nói, tốt, nếu máy pha cà + +148 +00:13:04,030 --> 00:13:11,620 +phê is_resource_sunough và máy tính tiền có thể thanh toán, thì chúng ta có thể nhờ người pha cà phê pha cà phê. + +149 +00:13:12,310 --> 00:13:14,320 +Vì vậy, bây giờ chúng ta hãy tiếp tục và chạy mã của chúng ta. + +150 +00:13:16,530 --> 00:13:21,930 +Và chúng ta hãy báo cáo để bắt đầu, để xem chúng ta có bao nhiêu tài nguyên để bắt đầu. + +151 +00:13:22,380 --> 00:13:24,780 +Và sau đó chúng ta hãy gọi một ly cà phê. + +152 +00:13:26,930 --> 00:13:30,890 +Đưa thật nhiều tiền và chúng tôi đã nhận lại được cà phê của mình. + +153 +00:13:31,400 --> 00:13:39,800 +Vì vậy, bây giờ chúng ta hãy tiếp tục và gọi một ly cà phê, latte khác, và hãy tiếp tục và nạp thật nhiều tiền. + +154 +00:13:40,370 --> 00:13:42,380 +Và bạn có thể thấy, đây là ly cà phê của tôi. + +155 +00:13:42,770 --> 00:13:49,910 +Nhưng bây giờ, nếu tôi nhấn báo cáo, bạn có thể thấy rằng các đối tượng, máy pha cà phê đã quản lý tài nguyên của chúng tôi + +156 +00:13:50,420 --> 00:13:53,240 +và money_machine đang quản lý lợi nhuận của chúng tôi. + +157 +00:13:53,960 --> 00:13:59,900 +Bây giờ, nếu tôi quyết định gọi một cốc cà phê khác, thì nó sẽ thực sự cho tôi biết, xin + +158 +00:13:59,900 --> 00:14:04,520 +lỗi, không đủ nước và không đủ sữa. Vì vậy, nó không thể làm cho tôi đồ uống đó. + +159 +00:14:05,150 --> 00:14:12,650 +Và chúng tôi đã quản lý để đạt được tất cả các chức năng này bằng cách viết rất ít dòng mã, + +160 +00:14:12,650 --> 00:14:16,130 +và bản thân mã thực sự rất, rất dễ hiểu. + +161 +00:14:16,370 --> 00:14:22,840 +Ngay cả khi bạn đến với điều này hoàn toàn mới mẻ, bạn chưa bao giờ nhìn thấy từng phương pháp được thực hiện như thế nào, bạn không biết máy pha cà + +162 +00:14:22,850 --> 00:14:24,440 +phê hoạt động như thế nào, bạn không + +163 +00:14:24,710 --> 00:14:26,240 +biết cách hoạt động của máy kiếm + +164 +00:14:26,540 --> 00:14:29,000 +tiền, bạn có thể thấy khá dễ dàng. nó đang cố gắng làm. + +165 +00:14:29,960 --> 00:14:35,660 +Và vì vậy nếu bạn chỉ phải viết loại mã này, thì việc tạo ra các chức năng thậm chí phức tạp hơn + +166 +00:14:35,660 --> 00:14:39,440 +trong máy pha cà phê của bạn sẽ dễ dàng hơn rất nhiều, phải không? + +167 +00:14:40,430 --> 00:14:43,130 +Vì vậy, hãy chơi một vòng với các lớp này: + +168 +00:14:43,580 --> 00:14:50,270 +Máy pha cà phê, Máy móc tiền, thực đơn, món trong thực đơn, v.v. Và hãy xem bạn có thể làm gì khác với mã + +169 +00:14:50,270 --> 00:14:51,590 +này trong khi + +170 +00:14:51,860 --> 00:14:55,880 +không chạm vào bất kỳ bản thiết kế nào cho từng lớp này. + +171 +00:14:57,200 --> 00:15:02,660 +Bây giờ, trong bài học tiếp theo, tôi sẽ chỉ cho bạn cách tạo các lớp của riêng bạn để bạn có + +172 +00:15:02,660 --> 00:15:07,880 +thể thực sự bắt đầu cấu trúc mã của mình bằng cách sử dụng lập trình hướng đối tượng đầy đủ. + +173 +00:15:08,390 --> 00:15:14,420 +Và chúng ta sẽ tìm hiểu về những thứ này như khởi tạo và cách các lớp được khai báo và tại sao lại + +174 +00:15:14,420 --> 00:15:16,910 +có tất cả những thứ này ở khắp nơi. + +175 +00:15:17,630 --> 00:15:20,480 +Đó là tất cả vẫn chưa đến trong các bài học ngày mai. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/009 Don't forget to review occasionally.mp4 b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/009 Don't forget to review occasionally.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fdbc5b1f418e94c1c977042ec598e2d769165e31 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/009 Don't forget to review occasionally.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92b62b538646fa94c48bad673f3e03c81336b8e07a18bafa070aec53f79863b2 +size 33890047 diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/009 Don't forget to review occasionally_vi.srt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/009 Don't forget to review occasionally_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e3fe31c84d0c730893cc4be82af70a584c697e4c --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/009 Don't forget to review occasionally_vi.srt @@ -0,0 +1,44 @@ +1 +00:00:00,750 --> 00:00:05,050 +Này, các bạn, hoàn thành tốt ngày 16. + +2 +00:00:05,100 --> 00:00:07,170 +Bây giờ, đây là một cột mốc quan trọng. + +3 +00:00:07,200 --> 00:00:14,940 +Bây giờ bạn đã hoàn thành rất nhiều bài học. Nhưng điều thực sự quan trọng là phải dành một chút thời gian để + +4 +00:00:14,940 --> 00:00:20,640 +xem lại những gì bạn đã học được vì rất dễ dàng chỉ cần xem video và tiếp tục và cảm thấy + +5 +00:00:20,640 --> 00:00:21,300 +như bạn + +6 +00:00:21,780 --> 00:00:27,690 +đang tiến bộ, nhưng nếu bạn không quay lại và kiểm tra một số điều bạn đã học và đảm bảo rằng + +7 +00:00:27,690 --> 00:00:34,770 +nó thực sự được củng cố theo sự hiểu biết của riêng bạn. Có thể thử một biến thể của dự án, có + +8 +00:00:34,770 --> 00:00:40,290 +thể chuyển đổi mọi thứ, có thể thử thách thức mã, có thể thử một trong + +9 +00:00:40,290 --> 00:00:46,710 +các hướng dẫn nhưng bằng cách tự nhập mã. Chỉ cần đảm bảo rằng bạn dành một chút thời gian để xem lại những gì bạn + +10 +00:00:46,710 --> 00:00:48,620 +đã học thay vì chỉ chăm chăm vào học. + +11 +00:00:49,320 --> 00:00:55,500 +Bằng cách này, bạn sẽ có một sự hiểu biết vững chắc hơn và bạn sẽ có thể tiến bộ một cách tự tin hơn. + diff --git a/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/external-links.txt b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..423da35a999c4e5bf108b3f9bf709bf957146159 --- /dev/null +++ b/part2/16 - Day 16 - Intermediate - Object Oriented Programming (OOP)/external-links.txt @@ -0,0 +1,30 @@ + +003 Turtle-Graphics-Documentation +https://docs.python.org/3/library/turtle.html + +003 Turtle-Colours-cs111.wellesley.edu- +https://cs111.wellesley.edu/reference/colors + +004 Pokemon-Pokedex +https://pokemondb.net/pokedex/game/x-y + +004 Python-Package-Index +https://pypi.org/ + +004 PrettyTable-Package +https://pypi.org/project/PrettyTable/ + +004 PrettyTable-Package-Documentation +https://code.google.com/archive/p/prettytable/wikis/Tutorial.wiki + +007 Steve-Jobs-on-Object-Oriented-Programming +https://www.rollingstone.com/culture/culture-news/steve-jobs-in-1994-the-rolling-stone-interview-231132/ + +007 OOP-Coffee-Machine-Project-Starting-Code +https://repl.it/@appbrewery/oop-coffee-machine-start + +008 OOP-Coffee-Machine-Project-Final-Code +https://repl.it/@appbrewery/oop-coffee-machine-final + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day 17 Goals what we will make by the end of the day.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day 17 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1f62acdb14319cba7a2482068c8109dd07a21989 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day 17 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e60d0ffcd960eaac674960938e442ee0cc9c3c37d3e4031b6e6f3872526046c +size 6330723 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day 17 Goals what we will make by the end of the day_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day 17 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..26eff772d046f7d140f99e80fb4070341a1f678e --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day 17 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,80 @@ +1 +00:00:00,060 --> 00:00:04,740 +Xin chào các bạn, chào mừng đến với ngày 17 của 100 Ngày viết mã. Bây giờ, hôm nay chúng ta sẽ tập + +2 +00:00:04,770 --> 00:00:05,430 +trung vào + +3 +00:00:05,430 --> 00:00:09,690 +cách chúng ta thực sự tạo ra các lớp mà chúng ta đã sử dụng + +4 +00:00:09,690 --> 00:00:11,910 +trong các bài học ngày hôm qua. + +5 +00:00:12,480 --> 00:00:17,480 +Dự án cuối cùng của ngày hôm nay mà chúng ta sẽ xây dựng là một trò chơi đố vui. + +6 +00:00:18,180 --> 00:00:20,460 +Vì vậy, chúng tôi sẽ có thể tạo ra một câu đố đúng + +7 +00:00:20,850 --> 00:00:22,260 +- sai và chúng tôi sẽ có + +8 +00:00:22,620 --> 00:00:25,110 +thể chơi câu đố, trả lời các câu hỏi và theo dõi điểm số. + +9 +00:00:25,560 --> 00:00:30,560 +Nhưng chúng tôi sẽ xây dựng điều này hoàn toàn bằng cách sử dụng Lập trình hướng đối tượng. Chúng tôi sẽ tự tạo các lớp của + +10 +00:00:30,570 --> 00:00:35,040 +mình và sau đó sử dụng các đối tượng được tạo từ các lớp đó + +11 +00:00:35,040 --> 00:00:39,480 +để xây dựng trò chơi này. Và khi bạn đã hoàn tất, đây + +12 +00:00:39,570 --> 00:00:44,520 +là những gì bạn sẽ có thể tạo. Câu một, Máu của sên có màu xanh lục, + +13 +00:00:44,520 --> 00:00:47,760 +đúng hay sai. ĐÚNG VẬY. Bây giờ, nếu bạn + +14 +00:00:47,790 --> 00:00:51,090 +muốn chơi thử dự án cuối cùng để cảm nhận cách nó + +15 +00:00:51,090 --> 00:00:51,690 +hoạt + +16 +00:00:51,690 --> 00:00:56,550 +động, thì bạn sẽ tìm thấy liên kết đến phiên bản cuối cùng của trò chơi đố vui này + +17 +00:00:56,550 --> 00:00:58,920 +trong tài nguyên khóa học. Nhưng khi bạn đã sẵn + +18 +00:00:59,130 --> 00:01:02,610 +sàng, hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu bằng cách tìm + +19 +00:01:02,610 --> 00:01:07,110 +hiểu cách tạo các lớp tùy chỉnh của riêng mình. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp + +20 +00:01:07,230 --> 00:01:07,710 +bạn ở đó. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day-17-Goal-Click-Run-to-see-the-final-project.url b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day-17-Goal-Click-Run-to-see-the-final-project.url new file mode 100644 index 0000000000000000000000000000000000000000..b933b466e77f33e1358ffd7309714e2658b09e5e --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/001 Day-17-Goal-Click-Run-to-see-the-final-project.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/quiz-game-final?v=1 \ No newline at end of file diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/002 How to create your own Class in Python.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/002 How to create your own Class in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f1ef3e7d7f202e5cacb20fed10b902a12fe86de8 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/002 How to create your own Class in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bfcdff502ff3cd9f399d7ef9680f6fca1f65316269e394e1b4842b8cb112a43 +size 14081404 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/002 How to create your own Class in Python_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/002 How to create your own Class in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bb84428f5d9f153ae2e266dd8e990fe423dfded7 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/002 How to create your own Class in Python_vi.srt @@ -0,0 +1,296 @@ +1 +00:00:00,270 --> 00:00:04,920 +Trong suốt ngày hôm qua, chúng tôi đã sử dụng các lớp học của người khác. + +2 +00:00:05,460 --> 00:00:10,460 +Và chúng tôi đã nói rằng một lớp đơn giản chỉ là một bản thiết kế để tạo ra một + +3 +00:00:11,490 --> 00:00:13,800 +đối tượng cuối cùng. Trong bài học này, chúng + +4 +00:00:13,830 --> 00:00:17,490 +ta sẽ nói về cách chúng ta có thể tạo các lớp của riêng mình, vì vậy + +5 +00:00:17,970 --> 00:00:22,830 +các bản thiết kế của riêng chúng ta, mà chúng ta có thể sử dụng để tạo các đối tượng của riêng mình. + +6 +00:00:23,910 --> 00:00:28,080 +Bây giờ chúng ta hãy tiếp tục và tạo các lớp tùy chỉnh của riêng chúng ta trong mã. + +7 +00:00:28,530 --> 00:00:33,240 +Tiếp tục và tạo một dự án mới trong PyCharm hoặc Repl. nó bất cứ nơi + +8 +00:00:33,240 --> 00:00:37,140 +nào bạn thích. Và chúng tôi sẽ đặt tên cho nó là + +9 +00:00:37,950 --> 00:00:41,430 +ngày 17 bắt đầu, sau đó nhấn tạo. Và một lần nữa, như mọi khi, khi + +10 +00:00:41,460 --> 00:00:46,170 +bạn đã tạo xong dự án của mình, đã đến lúc tạo tệp đầu tiên của bạn mà chúng tôi sẽ + +11 +00:00:46,170 --> 00:00:48,090 +đặt tên là chính. py + +12 +00:00:48,480 --> 00:00:52,890 +Và sau đó chúng ta có thể thu gọn thanh bên của dự án và tập trung vào mã. + +13 +00:00:54,240 --> 00:00:59,070 +Vậy chúng ta tạo một lớp như thế nào? Cú pháp trông rất đơn giản. + +14 +00:00:59,100 --> 00:01:05,120 +Bạn có từ khóa "class" theo sau là tên lớp của bạn và sau đó là dấu hai chấm. + +15 +00:01:05,129 --> 00:01:09,360 +và sau đó tất cả mã trong lớp của bạn sẽ tuân theo điều này + +16 +00:01:09,360 --> 00:01:13,320 +và nó sẽ được thụt lề. Hãy tạo lớp đầu tiên của chúng ta bằng Python. + +17 +00:01:13,920 --> 00:01:14,760 +Như tôi + +18 +00:01:14,790 --> 00:01:19,440 +đã đề cập, cách chúng ta tạo một lớp trước tiên là sử dụng từ khóa lớp. + +19 +00:01:20,250 --> 00:01:22,740 +Và sau đó chúng ta đặt tên cho lớp của mình. + +20 +00:01:23,220 --> 00:01:28,220 +Giả sử rằng chúng tôi đang xây dựng một trang web và chúng tôi cần một lớp để tạo mô hình cho người dùng trang + +21 +00:01:29,490 --> 00:01:30,323 +web của chúng tôi. + +22 +00:01:30,570 --> 00:01:35,570 +Vì vậy, lớp này về cơ bản sẽ là bản thiết kế để đại diện cho những gì người dùng của chúng + +23 +00:01:35,880 --> 00:01:39,450 +tôi có và những gì họ có thể làm trên trang web của chúng tôi. + +24 +00:01:40,170 --> 00:01:42,000 +Hãy gọi lớp của chúng ta là Người dùng và + +25 +00:01:42,510 --> 00:01:47,510 +sau đó chúng ta kết thúc khai báo này bằng dấu hai chấm như bình thường. Và mọi thứ khác sẽ đi vào + +26 +00:01:48,480 --> 00:01:50,010 +bên trong lớp + +27 +00:01:50,010 --> 00:01:54,180 +này sẽ cần phải được thụt vào sau dấu hai chấm. + +28 +00:01:54,870 --> 00:01:57,780 +Hãy bắt đầu với một lớp học hoàn toàn trống. + +29 +00:01:58,200 --> 00:02:02,820 +Bây giờ lớp người dùng của chúng tôi sẽ hoàn toàn không làm gì cả. Tuy nhiên, vì tôi đã tạo bản thiết kế + +30 +00:02:02,820 --> 00:02:04,530 +của mình nên tôi đã có + +31 +00:02:04,620 --> 00:02:08,310 +thể sử dụng nó để tạo đối tượng người dùng đầu tiên của mình. + +32 +00:02:08,940 --> 00:02:11,220 +Vì vậy, giả sử tôi muốn tạo một người + +33 +00:02:11,640 --> 00:02:14,490 +dùng_1 và tôi sẽ tạo nó bằng cách sử dụng lớp đó, + +34 +00:02:14,880 --> 00:02:17,760 +thông báo rằng nó hiện đang được PyCharm nhận ra và nó + +35 +00:02:18,150 --> 00:02:21,330 +có ký hiệu C bên cạnh. Và tất nhiên, để + +36 +00:02:21,330 --> 00:02:23,850 +khởi tạo một đối tượng từ một lớp, + +37 +00:02:23,880 --> 00:02:26,190 +chúng ta phải thêm dấu ngoặc vào cuối. + +38 +00:02:26,940 --> 00:02:31,020 +Bây giờ chúng tôi gặp lỗi ở đây vì dự kiến có một khoảng thụt lề. + +39 +00:02:31,440 --> 00:02:33,540 +Vì vậy, về cơ bản Python không thích + +40 +00:02:33,630 --> 00:02:38,340 +nó khi bạn tạo một thứ gì đó giống như một lớp hoặc khi bạn tạo một thứ gì đó giống + +41 +00:02:38,340 --> 00:02:40,950 +như một hàm và bạn có dấu hai chấm, nhưng bạn không + +42 +00:02:41,280 --> 00:02:46,080 +có bất kỳ thứ gì bên trong hàm hoặc lớp đó. Ví dụ: nếu tôi ngay lập + +43 +00:02:46,080 --> 00:02:49,560 +tức muốn in "hello" sau đó, tôi nhận được chính + +44 +00:02:49,590 --> 00:02:52,650 +xác lỗi tương tự; thụt lề mong đợi. + +45 +00:02:53,100 --> 00:02:56,640 +Nó mong đợi hàm này mà bạn đã tạo hoặc lớp này + +46 +00:02:56,640 --> 00:03:01,640 +bạn vừa tạo có một số loại nội dung trước khi bạn tiếp tục và làm + +47 +00:03:01,810 --> 00:03:04,630 +việc khác. Vì vậy, làm thế nào chúng ta có thể sửa chữa điều này? Chà, nếu chúng + +48 +00:03:04,660 --> 00:03:08,200 +ta thực sự muốn để trống hàm này hoặc lớp này, chúng ta + +49 +00:03:08,320 --> 00:03:10,390 +có thể sử dụng từ khóa là pass. + +50 +00:03:10,960 --> 00:03:15,370 +Và tất cả những gì nó làm là nó chỉ trôi qua. Nó nói rằng, tôi không muốn đi ngay bây giờ. + +51 +00:03:15,640 --> 00:03:19,840 +Chỉ cần tiếp tục đến dòng mã tiếp theo. Và điều này sẽ loại bỏ các lỗi của + +52 +00:03:19,900 --> 00:03:21,880 +chúng ta cả trong khai báo hàm + +53 +00:03:22,210 --> 00:03:26,650 +cũng như trong khai báo lớp của chúng ta. Về cơ bản, chúng ta đã hoàn thành + +54 +00:03:26,650 --> 00:03:29,050 +bước đầu tiên để tạo các lớp tùy + +55 +00:03:29,320 --> 00:03:34,320 +chỉnh của mình, đó là viết khai báo và sau đó xây dựng một đối tượng có + +56 +00:03:34,960 --> 00:03:39,370 +tên là user_1 từ lớp đó. Và chúng ta cũng đã thấy cách đặt tên cho các lớp trong Python. + +57 +00:03:39,940 --> 00:03:43,960 +Bây giờ tên của lớp nên có chữ cái đầu tiên của mỗi từ được + +58 +00:03:44,140 --> 00:03:44,980 +viết hoa. + +59 +00:03:45,550 --> 00:03:50,550 +Và kiểu đặt tên cụ thể này trong Lập trình được gọi là trường hợp Pascal. + +60 +00:03:52,060 --> 00:03:55,030 +Vì vậy, nếu bạn nghĩ về Blaise Pascal như một người, thì chúng + +61 +00:03:55,060 --> 00:03:56,950 +ta biết rằng tên của mọi người, tên + +62 +00:03:56,950 --> 00:04:01,950 +của mọi người, có chữ cái đầu tiên được viết hoa và cũng là chữ cái đầu tiên của họ hoặc + +63 +00:04:02,400 --> 00:04:04,890 +tên đệm của họ và về cơ bản mọi tên tiếp + +64 +00:04:04,980 --> 00:04:08,100 +theo đều được viết hoa. Bây giờ, nó khác với + +65 +00:04:08,130 --> 00:04:12,180 +một loại vỏ khác mà bạn có thể đã gặp, được gọi là + +66 +00:04:12,420 --> 00:04:13,800 +vỏ lạc đà. + +67 +00:04:14,160 --> 00:04:19,160 +Và cách viết hoa camel chỉ khác với kiểu chữ Pascal vì từ đầu tiên là chữ + +68 +00:04:19,380 --> 00:04:23,910 +thường, nhưng mỗi từ tiếp theo nó có chữ cái đầu tiên được viết hoa + +69 +00:04:24,030 --> 00:04:27,870 +giống hệt như kiểu chữ Pascal. Và cuối cùng, chúng ta cũng + +70 +00:04:27,900 --> 00:04:31,590 +đã gặp trường hợp con rắn trong đó tất cả các từ đều + +71 +00:04:31,740 --> 00:04:32,880 +là chữ thường + +72 +00:04:32,880 --> 00:04:37,830 +nhưng chúng được phân tách bằng dấu gạch dưới. Trong lập trình Python, bạn sẽ không thấy nhiều vỏ lạc đà. + +73 +00:04:37,860 --> 00:04:41,430 +Bạn sẽ thấy trường hợp Pascal được sử dụng cho các tên lớp, trường hợp + +74 +00:04:41,760 --> 00:04:45,210 +rắn được sử dụng khá nhiều để đặt tên cho mọi thứ khác. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/003 Working with Attributes, Class Constructors and the __init__() Function.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/003 Working with Attributes, Class Constructors and the __init__() Function.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..72262f3027afbbbcaf84890e7289fdc8eab44cd0 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/003 Working with Attributes, Class Constructors and the __init__() Function.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f190772cd266c7d4b9c3d11d8b801b531368d030d366a67e5ba296000c1012b9 +size 34518053 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/003 Working with Attributes, Class Constructors and the __init__() Function_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/003 Working with Attributes, Class Constructors and the __init__() Function_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9898252fc7d1e0c0732a6bfabe00ec716bb702fe --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/003 Working with Attributes, Class Constructors and the __init__() Function_vi.srt @@ -0,0 +1,636 @@ +1 +00:00:00,060 --> 00:00:03,480 +Bây giờ chúng ta đã thấy cách chúng ta có thể tạo một lớp mới. + +2 +00:00:03,540 --> 00:00:06,060 +Ngay cả khi đó là một lớp học không có gì bên trong. + +3 +00:00:06,600 --> 00:00:10,290 +Và chúng ta đã thấy cách chúng ta có thể tạo một đối tượng mới từ lớp đó bằng cách sử + +4 +00:00:10,740 --> 00:00:14,010 +dụng cùng một đoạn mã mà chúng ta đã sử dụng trong các bài học ngày hôm qua. + +5 +00:00:14,430 --> 00:00:19,350 +Câu hỏi tiếp theo là: “Chà, làm cách nào để chúng ta tạo một thuộc tính cho lớp đó? ". Chà, một trong những cách + +6 +00:00:19,350 --> 00:00:24,350 +đơn giản nhất để thực hiện việc này là chỉ cần chạm vào đối tượng của bạn và + +7 +00:00:24,390 --> 00:00:26,130 +sau đó thêm một thuộc tính. + +8 +00:00:26,310 --> 00:00:33,293 +Vì vậy, chúng ta có thể nói rằng user_1. id = "001". + +9 +00:00:33,960 --> 00:00:38,960 +Và chúng tôi có thể thêm bao nhiêu thuộc tính tùy thích chỉ bằng cách sử dụng phương pháp này sử dụng ký + +10 +00:00:39,570 --> 00:00:42,570 +hiệu dấu chấm sau tên của đối tượng, sau đó chỉ cần thêm + +11 +00:00:42,960 --> 00:00:47,370 +bất kỳ phần dữ liệu nào chúng tôi muốn. Vì vậy, bây giờ, nếu + +12 +00:00:47,370 --> 00:00:51,930 +tôi tiếp tục và in user_1. tên người dùng, bạn sẽ thấy thuộc + +13 +00:00:52,290 --> 00:00:55,860 +tính này hiện tồn tại trong đối tượng này [Không rõ tiếng] + +14 +00:00:55,880 --> 00:00:56,713 +0: Và + +15 +00:00:58,910 --> 00:01:03,470 +bạn có thể thấy giá trị được giữ trong thuộc tính đó đang được in + +16 +00:01:03,470 --> 00:01:05,870 +trong bảng điều khiển. Vì vậy, chỉ cần + +17 +00:01:05,900 --> 00:01:10,820 +một lời nhắc nhanh, một thuộc tính là một biến được liên kết với một đối tượng. + +18 +00:01:11,450 --> 00:01:16,130 +Vì vậy, gần như thể chúng ta vừa tạo một biến mới, nhưng trong trường hợp này, chúng + +19 +00:01:16,160 --> 00:01:20,630 +ta đã gắn nó vào một đối tượng. Nhưng đây là một câu hỏi, + +20 +00:01:21,710 --> 00:01:25,640 +nếu chúng ta có rất nhiều thuộc tính như thế này + +21 +00:01:25,880 --> 00:01:29,030 +và mỗi lần chúng ta tạo một người dùng + +22 +00:01:29,420 --> 00:01:34,420 +mới, giả sử chúng ta đã tạo user_2 và chúng ta phải làm điều + +23 +00:01:34,550 --> 00:01:36,830 +tương tự, tạo nó từ lớp và + +24 +00:01:36,830 --> 00:01:41,000 +sau đó nói, người dùng_2. id = "002" và + +25 +00:01:41,120 --> 00:01:43,910 +người dùng_2. tên người + +26 +00:01:45,440 --> 00:01:49,430 +dùng = "jack". Và đây là một, một chút + +27 +00:01:49,610 --> 00:01:54,500 +dễ bị lỗi vì tôi hoàn toàn hợp lệ khi mắc lỗi chính tả hoặc thay đổi tên + +28 +00:01:54,530 --> 00:01:58,940 +của một thuộc tính mà tôi kết thúc bằng một cái gì đó như thế này. + +29 +00:01:59,300 --> 00:02:02,120 +Vậy có cách nào làm cho việc này đơn giản hơn không? + +30 +00:02:02,510 --> 00:02:06,770 +Làm cách nào tôi có thể chỉ định tất cả các phần thông tin bắt đầu này khi + +31 +00:02:07,040 --> 00:02:11,300 +tôi tạo đối tượng của mình từ lớp? Bây giờ, để làm được điều + +32 +00:02:11,330 --> 00:02:15,320 +này, chúng ta phải hiểu một thứ gọi là hàm tạo, là một + +33 +00:02:15,770 --> 00:02:20,770 +phần của bản thiết kế cho phép chúng ta chỉ định điều gì sẽ xảy ra khi + +34 +00:02:21,470 --> 00:02:24,410 +đối tượng của chúng ta đang được xây dựng. + +35 +00:02:25,160 --> 00:02:29,240 +Và điều này còn được gọi trong lập trình là khởi + +36 +00:02:29,270 --> 00:02:32,840 +tạo một đối tượng. Khi đối tượng đang được khởi tạo, chúng ta + +37 +00:02:32,870 --> 00:02:37,870 +có thể đặt các biến hoặc bộ đếm thành giá trị bắt đầu của chúng. Trong Python, cách chúng ta + +38 +00:02:39,560 --> 00:02:44,560 +tạo hàm tạo là sử dụng một hàm đặc biệt, đó + +39 +00:02:45,980 --> 00:02:47,570 +là hàm init. + +40 +00:02:48,140 --> 00:02:52,070 +Và bạn có thể nói nó đặc biệt vì nó không chỉ là từ khóa Def + +41 +00:02:52,310 --> 00:02:55,850 +và sau đó là tên của hàm. Nó có hai dấu gạch dưới + +42 +00:02:55,910 --> 00:02:57,110 +hai bên của tên. + +43 +00:02:57,740 --> 00:03:02,740 +Và điều này có nghĩa rằng đó là một phương thức mà trình thông dịch Python biết và biết rằng nó có + +44 +00:03:03,100 --> 00:03:05,800 +một chức năng đặc biệt. Bây giờ, + +45 +00:03:05,800 --> 00:03:10,800 +chức năng đặc biệt là gì? Chà, nó thường được sử dụng để khởi tạo các thuộc tính. + +46 +00:03:12,580 --> 00:03:14,260 +Vì vậy, nếu bên trong lớp của chúng + +47 +00:03:14,590 --> 00:03:19,590 +tôi, chúng tôi thêm hàm init này và bạn có thể thấy ngay khi tôi viết def và sau đó init, tôi thực + +48 +00:03:19,690 --> 00:03:23,320 +sự đã có chế độ tự động điền giúp tôi nên tôi có thể nhấn enter khi + +49 +00:03:23,620 --> 00:03:25,510 +nó được chọn. Bây giờ, bên + +50 +00:03:25,630 --> 00:03:30,630 +trong hàm init này là nơi chúng ta khởi tạo hoặc tạo các giá trị bắt đầu cho các + +51 +00:03:30,970 --> 00:03:33,940 +thuộc tính của chúng ta. Bây giờ, điều + +52 +00:03:34,000 --> 00:03:39,000 +quan trọng cần nhớ là hàm init sẽ được gọi mỗi khi + +53 +00:03:39,370 --> 00:03:43,210 +bạn tạo một đối tượng mới từ lớp này. + +54 +00:03:43,690 --> 00:03:45,400 +Ví dụ: nếu tôi + +55 +00:03:47,830 --> 00:03:51,460 +in, thì mỗi khi cấu trúc này xảy ra khi chúng + +56 +00:03:51,730 --> 00:03:53,770 +tôi tạo người dùng mới, + +57 +00:03:54,130 --> 00:03:57,220 +thì câu lệnh in này sẽ được kích hoạt. + +58 +00:03:59,920 --> 00:04:03,940 +Vì vậy, bạn có thể thấy ở đây, câu lệnh in này được kích hoạt + +59 +00:04:04,360 --> 00:04:08,410 +và sau đó chúng tôi in tên người dùng của user_1 và sau đó chúng tôi + +60 +00:04:08,410 --> 00:04:12,490 +có một người dùng khác được tạo. Cũng giống như một lời + +61 +00:04:12,520 --> 00:04:16,720 +nhắc nhanh, các thuộc tính là những thứ mà đối tượng sẽ có. + +62 +00:04:17,350 --> 00:04:22,210 +Và về cơ bản chúng chỉ là các biến được liên kết với + +63 +00:04:22,210 --> 00:04:25,870 +đối tượng cuối cùng. Vì vậy, ví dụ: nếu bạn đang xây dựng + +64 +00:04:25,900 --> 00:04:29,500 +một chiếc xe ô tô, thì một trong những thuộc tính đó có thể là số lượng ghế mà + +65 +00:04:29,500 --> 00:04:31,150 +nó có và thông thường nó bằng năm. + +66 +00:04:31,720 --> 00:04:36,220 +Vậy làm cách nào để đặt các thuộc tính này trong hàm tạo? Đây là mã sẽ trông + +67 +00:04:36,220 --> 00:04:37,930 +như thế nào. + +68 +00:04:38,350 --> 00:04:42,460 +Chúng ta có hàm init và bên trong hàm init, ngoài thứ + +69 +00:04:42,820 --> 00:04:44,950 +gọi là self, là đối + +70 +00:04:45,010 --> 00:04:50,010 +tượng thực tế đang được tạo hoặc đang được khởi tạo, ngoài ra, bạn + +71 +00:04:50,890 --> 00:04:54,250 +có thể thêm bao nhiêu tham số tùy thích. + +72 +00:04:54,670 --> 00:04:59,670 +Và tham số đó sẽ được chuyển vào khi một đối tượng được xây + +73 +00:05:00,850 --> 00:05:04,300 +dựng từ lớp này. Và khi bạn nhận được dữ + +74 +00:05:04,390 --> 00:05:09,010 +liệu đó, thì bạn có thể sử dụng nó để thiết lập các thuộc tính của đối tượng. + +75 +00:05:10,090 --> 00:05:14,470 +Đây là những gì nó sẽ trông như thế nào khi chúng ta thực sự gọi hàm tạo của mình. + +76 +00:05:15,250 --> 00:05:20,250 +Chúng ta biết rằng chúng ta có thể tạo một đối tượng bằng cách gọi tên của lớp + +77 +00:05:20,980 --> 00:05:25,810 +và sau đó thêm các dấu ngoặc đơn. Nhưng nếu bên trong hàm init của chúng tôi, + +78 +00:05:25,900 --> 00:05:27,970 +chúng tôi có một số tham + +79 +00:05:28,240 --> 00:05:32,350 +số bổ sung, thì chúng tôi cũng có thể chuyển dữ liệu vào các tham số + +80 +00:05:32,470 --> 00:05:36,460 +đó sẽ được sử dụng để thiết lập các thuộc tính cho đối tượng đó. + +81 +00:05:36,760 --> 00:05:40,330 +Vì vậy, trong trường hợp này, khi dòng mã này đã + +82 +00:05:40,510 --> 00:05:44,710 +hoàn thành, sau đó là my_car. số ghế sẽ bằng năm. + +83 +00:05:45,790 --> 00:05:49,390 +Và điều này giống hệt như khi chúng ta tạo đối tượng my_car trước + +84 +00:05:49,390 --> 00:05:53,560 +và sau đó chúng ta nói my_car. ghế = 5. + +85 +00:05:53,590 --> 00:05:55,180 +Nó hoàn toàn giống nhau. + +86 +00:05:56,230 --> 00:06:00,500 +Nhưng nó làm cho nó nhanh hơn rất nhiều khi bạn đang tạo nhiều đối tượng + +87 +00:06:00,500 --> 00:06:05,150 +cần tất cả các thuộc tính giống nhau. Hãy xem cách chúng tôi sẽ làm điều đó ở đây. + +88 +00:06:05,150 --> 00:06:07,400 +Chúng tôi đã khai báo hàm init của chúng tôi. + +89 +00:06:08,000 --> 00:06:11,780 +Vì vậy, nếu chúng ta muốn chuyển qua một ID người dùng khi chúng ta xây dựng các + +90 +00:06:11,810 --> 00:06:15,890 +đối tượng của mình, chúng ta có thể thêm nó dưới dạng một tham số và sau đó bên + +91 +00:06:16,340 --> 00:06:20,060 +trong init, chúng ta có thể tự nói. id, + +92 +00:06:20,330 --> 00:06:25,330 +như vậy tự. id sẽ là thuộc tính được liên kết với + +93 +00:06:25,910 --> 00:06:30,910 +lớp này và chúng ta có thể đặt nó bằng với user_id được chuyển vào khi bất kỳ + +94 +00:06:31,580 --> 00:06:35,450 +người dùng nào được xây dựng. Vì vậy, bây giờ khi chúng tôi + +95 +00:06:36,050 --> 00:06:40,880 +tạo người dùng của mình, thay vì tạo các thuộc tính này sau này, tại thời điểm xây dựng, + +96 +00:06:41,000 --> 00:06:44,420 +bạn có thể thấy rằng chúng tôi có thể thêm ID người dùng. + +97 +00:06:45,170 --> 00:06:47,000 +Vì vậy, hãy cung cấp cho nó cùng một ID. + +98 +00:06:48,020 --> 00:06:50,990 +Và bây giờ chúng ta hãy thêm một thuộc tính khác. + +99 +00:06:51,320 --> 00:06:56,320 +Vì vậy, chúng tôi sẽ chuyển tên người dùng và tôi sẽ + +100 +00:06:56,930 --> 00:07:00,710 +tự đặt thuộc tính. tên người dùng bằng với tên người dùng đã qua nó. + +101 +00:07:01,280 --> 00:07:05,510 +Lưu ý rằng trong trường hợp này, tôi đã đặt tên tham số của mình là user_id như thế + +102 +00:07:05,840 --> 00:07:10,640 +nào và giá trị đó sẽ trở thành chính nó. thuộc tính id. + +103 +00:07:11,060 --> 00:07:14,120 +Vì vậy, hãy chú ý xem hai cái này thực sự có tên khác nhau như thế nào. + +104 +00:07:14,510 --> 00:07:17,480 +Bạn có thể đặt tên cho bất cứ thứ gì bạn muốn. + +105 +00:07:18,230 --> 00:07:23,120 +Thông thường, bạn sẽ thấy tên của tham số bằng với tên của thuộc tính, nhưng + +106 +00:07:23,120 --> 00:07:27,590 +không phải lúc nào bạn cũng phải tuân theo các quy tắc này. + +107 +00:07:28,970 --> 00:07:33,590 +Bây giờ chúng ta hãy quay lại phương thức khởi tạo của chúng ta, trong khi trước đây nó trống, bây + +108 +00:07:33,830 --> 00:07:38,830 +giờ chúng ta có ID người dùng của chúng ta đang được chuyển vào và bây giờ tôi có thể chuyển vào + +109 +00:07:39,620 --> 00:07:44,060 +thuộc tính thứ hai, đó là tên người dùng. Vì vậy, tên người dùng của tôi sẽ là Angela. + +110 +00:07:45,650 --> 00:07:49,370 +Và bây giờ chúng tôi đã tạo một người dùng mới, là + +111 +00:07:49,520 --> 00:07:53,480 +user_1 từ lớp người dùng này và chúng tôi đang khởi tạo nó + +112 +00:07:53,690 --> 00:07:58,690 +bằng các giá trị bắt đầu này, trong đó giá trị đầu tiên sẽ trở thành ID + +113 +00:07:59,690 --> 00:08:03,860 +người dùng sẽ là chính nó. id và giá trị thứ hai sẽ + +114 +00:08:04,220 --> 00:08:08,780 +trở thành chính nó. tên tài khoản. Vì vậy, bây giờ, + +115 +00:08:08,780 --> 00:08:12,560 +nếu tôi muốn in tên người dùng của user_1, + +116 +00:08:12,950 --> 00:08:14,420 +thì tôi + +117 +00:08:14,420 --> 00:08:17,690 +chỉ cần viết user_1. tên người dùng giống hệt như trước đây + +118 +00:08:17,990 --> 00:08:21,350 +hoặc nếu tôi muốn ID, thì đó sẽ là user_1. Tôi. + +119 +00:08:22,070 --> 00:08:26,750 +Vì vậy, bây giờ chúng ta hãy nhận xét phần còn lại của mã và nhấn chạy, và bạn có thể + +120 +00:08:27,680 --> 00:08:32,179 +thấy chúng tôi đã in ID người dùng ở đây. Bây giờ, hãy nhớ rằng khi + +121 +00:08:32,179 --> 00:08:35,539 +bạn thêm các tham số vào hàm tạo là hàm + +122 +00:08:35,659 --> 00:08:36,919 +init, bây giờ + +123 +00:08:37,460 --> 00:08:42,460 +bạn đang nói rằng bất cứ khi nào một đối tượng mới đang được xây + +124 +00:08:43,130 --> 00:08:47,600 +dựng từ lớp này, nó phải cung cấp hai phần dữ liệu này. + +125 +00:08:48,530 --> 00:08:53,150 +Nếu chúng tôi bỏ ghi chú điều này và bạn cố gắng chạy nó, bạn sẽ thấy mình gặp lỗi. + +126 +00:08:53,840 --> 00:08:56,160 +Và nó nói rằng trên dòng + +127 +00:08:56,940 --> 00:09:00,840 +12, người dùng này đang được tạo từ lớp người dùng. + +128 +00:09:01,320 --> 00:09:06,180 +Nhưng theo init, chúng tôi thực sự thiếu hai đối số bắt buộc; ID người + +129 +00:09:06,360 --> 00:09:08,010 +dùng và tên người dùng. + +130 +00:09:08,790 --> 00:09:12,300 +Vì vậy, bây giờ khi chúng tôi tạo bất kỳ đối tượng nào + +131 +00:09:12,600 --> 00:09:16,290 +từ lớp này, chúng tôi phải cung cấp ID người dùng và tên người dùng. + +132 +00:09:17,190 --> 00:09:20,190 +Nhưng điều này bây giờ đã thuận tiện hơn rất nhiều, phải không? + +133 +00:09:20,250 --> 00:09:23,970 +Mặc dù trước đây chúng tôi cần ba dòng mã, nhưng giờ chúng tôi chỉ có một dòng. + +134 +00:09:25,200 --> 00:09:27,540 +Bây giờ, đôi khi khi chúng tôi tạo các thuộc + +135 +00:09:27,840 --> 00:09:31,170 +tính của mình, chúng tôi có thể muốn bắt đầu bằng một giá trị mặc định. + +136 +00:09:31,230 --> 00:09:35,460 +Và nếu tại một thời điểm nào đó sau này trong chương trình của chúng tôi, chúng tôi muốn sửa đổi nó, thì chúng tôi + +137 +00:09:35,460 --> 00:09:36,840 +sẽ thực hiện tại thời điểm đó. + +138 +00:09:37,140 --> 00:09:42,140 +Nhưng không có ý nghĩa gì khi tất cả các thuộc tính được khởi tạo khi chúng ta thực + +139 +00:09:42,510 --> 00:09:46,200 +sự tạo đối tượng của mình. Vì vậy, nếu, ví dụ, trong trường hợp của chúng tôi, + +140 +00:09:46,230 --> 00:09:50,010 +giả sử rằng chúng tôi đang mã hóa ứng dụng Instagram, phải không? Mỗi người dùng Instagram, họ + +141 +00:09:50,010 --> 00:09:53,160 +sẽ có một ID, họ sẽ có tên người dùng + +142 +00:09:53,430 --> 00:09:56,940 +và họ có thể sẽ có số lượng người theo dõi. + +143 +00:09:57,330 --> 00:10:01,170 +Vì vậy, họ có thể có một cái gì đó giống như tự. những người theo dõi. + +144 +00:10:02,460 --> 00:10:07,050 +Điều này sẽ luôn bắt đầu bằng 0, phải không? Bạn bắt đầu một tài khoản mới, bạn sẽ + +145 +00:10:07,110 --> 00:10:10,350 +không có người theo dõi. Bạn có thể nhận được một số người theo dõi sau + +146 +00:10:10,620 --> 00:10:11,453 +này, bạn có thể không. + +147 +00:10:11,700 --> 00:10:16,700 +Nhưng không có ý nghĩa gì đối với những người theo dõi là thứ mà chúng ta phải cung cấp bất cứ khi nào + +148 +00:10:17,520 --> 00:10:19,410 +chúng ta xây dựng một đối tượng mới. + +149 +00:10:19,680 --> 00:10:23,670 +Có vẻ rất lãng phí khi phải luôn viết số 0 khi bạn xây dựng bất + +150 +00:10:23,880 --> 00:10:27,900 +kỳ đối tượng nào từ lớp này. Vì vậy, trong Python, chúng tôi cũng + +151 +00:10:27,900 --> 00:10:31,770 +có thể cung cấp một giá trị mặc định giống như tôi đã làm ở đây. + +152 +00:10:32,220 --> 00:10:37,170 +Thay vì đặt nó bằng một trong các tham số được truyền vào khi + +153 +00:10:37,170 --> 00:10:41,610 +lớp này đang được khởi tạo, thay vào đó tôi chỉ đặt nó + +154 +00:10:41,640 --> 00:10:46,470 +thành một giá trị, bằng 0. Hãy loại bỏ điều đó khỏi trình khởi tạo vì bây + +155 +00:10:46,500 --> 00:10:48,840 +giờ chúng ta có giá trị mặc định là 0. + +156 +00:10:49,380 --> 00:10:52,530 +Và nếu tôi tiếp tục và in + +157 +00:10:52,530 --> 00:10:57,180 +của mình, giả sử, user_1. thuộc tính người theo dõi và tôi nhấn + +158 +00:10:57,570 --> 00:11:02,570 +run, sau đó bạn có thể thấy nó bằng 0 vì tất cả các đối tượng được tạo từ lớp + +159 +00:11:04,170 --> 00:11:07,830 +này sẽ có thuộc tính người theo dõi được đặt bằng 0 để bắt đầu. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/004 Adding Methods to a Class.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/004 Adding Methods to a Class.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d8ca0f90611e30bf4780296ffcd1c65d5ebd8b31 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/004 Adding Methods to a Class.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:468ab8a9481b3aeb4c30ac03269bfa823bc211eb48e69531932aed6e3b06264c +size 36493668 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/004 Adding Methods to a Class_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/004 Adding Methods to a Class_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..12555c7cc89da3c6e8f461333d7167bfb5830cbe --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/004 Adding Methods to a Class_vi.srt @@ -0,0 +1,248 @@ +1 +00:00:00,570 --> 00:00:04,920 +Ngoài việc tạo các thuộc tính, chúng ta biết rằng chúng ta cũng có thể tạo các phương thức. + +2 +00:00:05,370 --> 00:00:09,360 +Các thuộc tính là những thứ mà đối tượng có và các phương thức là + +3 +00:00:09,420 --> 00:00:11,520 +những thứ mà đối tượng đó làm. + +4 +00:00:12,330 --> 00:00:16,620 +Giả sử rằng chúng tôi đang tạo hạng xe và chúng tôi đã thực sự tạo + +5 +00:00:16,650 --> 00:00:18,810 +thuộc tính chỗ ngồi. Chà, sau này, + +6 +00:00:18,840 --> 00:00:23,840 +chúng tôi có thể quyết định rằng chúng tôi muốn gọi một phương thức để thay + +7 +00:00:24,420 --> 00:00:29,370 +đổi giá trị của thuộc tính ghế. Ví dụ, tôi đã xem rất nhiều cuộc đua xe tải gần đây. + +8 +00:00:29,520 --> 00:00:29,720 +Ừ. + +9 +00:00:29,720 --> 00:00:34,720 +1: [không nghe được] 0: Và một trong những điều mà mọi người thường + +10 +00:00:35,690 --> 00:00:39,920 +làm khi sửa đổi ô tô của họ để đua là + +11 +00:00:39,920 --> 00:00:43,940 +họ tháo một số ghế. Bằng cách này, nó làm giảm trọng lượng của chiếc xe, + +12 +00:00:43,970 --> 00:00:48,170 +và nó có nghĩa là bạn có thể đi nhanh hơn một chút. Vì vậy, trong lớp xe hơi của + +13 +00:00:48,200 --> 00:00:49,250 +chúng tôi, trên + +14 +00:00:49,250 --> 00:00:53,780 +thực tế, chúng tôi có thể có một phương pháp mà chiếc xe có thể vào chế + +15 +00:00:54,170 --> 00:00:57,110 +độ đua, nơi các ghế được giảm từ 5 xuống 2. + +16 +00:00:58,010 --> 00:01:02,270 +Đây là những gì phương pháp sẽ trông như thế nào. Bên trong khai báo lớp, chúng ta có + +17 +00:01:02,630 --> 00:01:07,250 +một hàm, nhưng hãy nhớ khi một hàm được gắn vào một đối tượng thì nó được + +18 +00:01:07,310 --> 00:01:08,810 +gọi là một phương thức. + +19 +00:01:09,830 --> 00:01:14,540 +Phương thức này trông giống hệt như cách chúng ta đã tạo các hàm khác. + +20 +00:01:14,540 --> 00:01:17,660 +Chúng ta có từ khóa Def, chúng ta có tên của phương thức, chúng ta + +21 +00:01:17,900 --> 00:01:21,470 +có một số dấu ngoặc đơn có thể nhận đầu vào, dấu hai chấm, và sau đó + +22 +00:01:21,560 --> 00:01:24,650 +là nội dung của phương thức. Vì vậy, trong trường hợp + +23 +00:01:24,650 --> 00:01:29,650 +này, tất cả những gì nó làm là giữ đối tượng và sau đó là thuộc tính đối tượng + +24 +00:01:32,030 --> 00:01:36,620 +ghế và sau đó thay đổi nó thành 2. Vì vậy, bây giờ khi bạn gọi phương + +25 +00:01:36,710 --> 00:01:41,710 +thức đó, tất cả những gì bạn cần làm là nắm giữ đối tượng và sau đó bạn sử + +26 +00:01:42,560 --> 00:01:46,310 +dụng ký hiệu dấu chấm để gọi phương thức đó enter_race_mode, và tất nhiên, với + +27 +00:01:46,310 --> 00:01:47,750 +dấu ngoặc đơn ở cuối. + +28 +00:01:48,920 --> 00:01:52,640 +Vì vậy, giả sử rằng trong khi chúng tôi đang làm mẫu cho người dùng Instagram của + +29 +00:01:53,120 --> 00:01:56,720 +mình, chúng tôi muốn có một cách để người dùng theo dõi nhau, phải không? + +30 +00:01:57,140 --> 00:02:01,550 +Và khi họ theo dõi nhau, số lượng người theo dõi của họ rõ ràng sẽ tăng lên. + +31 +00:02:02,000 --> 00:02:06,890 +Vì vậy, hãy xác định một phương pháp mới. Vì vậy, chúng tôi sẽ sử dụng từ khóa def và sau đó chúng + +32 +00:02:07,190 --> 00:02:11,690 +tôi sẽ đặt tên cho phương pháp của chúng tôi theo sau. Bây giờ, một phương thức, không + +33 +00:02:11,780 --> 00:02:16,780 +giống như một hàm, luôn cần có một tham số self làm tham số đầu tiên. + +34 +00:02:18,980 --> 00:02:21,230 +Điều này có nghĩa là khi phương thức này được gọi, + +35 +00:02:21,560 --> 00:02:25,490 +nó sẽ biết đối tượng đã gọi nó. Bây giờ, ngoài thông số tự + +36 +00:02:25,520 --> 00:02:27,380 +đó, chúng tôi cũng sẽ + +37 +00:02:27,410 --> 00:02:31,430 +chuyển vào người dùng mà chúng tôi đã quyết định theo dõi. + +38 +00:02:32,270 --> 00:02:35,510 +Vì vậy, bây giờ hãy nói rằng chúng ta thực sự + +39 +00:02:35,930 --> 00:02:39,860 +có hai thuộc tính, người theo dõi và số lượng sau đây, phải không? + +40 +00:02:39,860 --> 00:02:43,430 +Vì vậy, cả hai đều bắt đầu từ số không, vì vậy hai thuộc tính mặc định. + +41 +00:02:44,000 --> 00:02:47,990 +Nhưng khi một người dùng quyết định theo dõi một người dùng khác, tốt trong + +42 +00:02:48,500 --> 00:02:49,460 +trường hợp này + +43 +00:02:49,580 --> 00:02:54,580 +là người dùng mà chúng ta đang theo dõi, thì số lượng người theo dõi của họ sẽ tăng lên + +44 +00:02:57,500 --> 00:03:02,500 +bởi một người và của chúng ta, cũng như vậy. số sau cũng tăng lên một. + +45 +00:03:03,550 --> 00:03:07,930 +Vì vậy, từ khóa self trở nên khá quan trọng khi chúng ta đang làm + +46 +00:03:07,930 --> 00:03:12,760 +việc với các lớp và đối tượng. Đó là một cách để chúng ta + +47 +00:03:12,790 --> 00:03:17,790 +tham chiếu đến đối tượng sẽ được tạo từ lớp này bên trong bản thiết kế lớp. + +48 +00:03:18,790 --> 00:03:22,030 +Vì vậy, bạn sẽ không bao giờ nhìn thấy bản thân khi bạn đang sử + +49 +00:03:22,540 --> 00:03:26,530 +dụng các đối tượng nhưng bạn sẽ thấy nó rất nhiều khi bạn viết mã bên trong lớp của mình. + +50 +00:03:27,340 --> 00:03:30,070 +Bây giờ chúng ta hãy tiếp tục và gọi cái này. + +51 +00:03:30,310 --> 00:03:35,310 +Và giả sử rằng người dùng_1 quyết định theo + +52 +00:03:37,120 --> 00:03:41,530 +dõi người dùng_2. Đây là đối tượng user_1 + +53 +00:03:41,980 --> 00:03:46,300 +và đây là phương thức follow từ đối tượng user_1. + +54 +00:03:46,750 --> 00:03:50,560 +Và sau đó người dùng_2 là người mà chúng tôi sẽ theo dõi. + +55 +00:03:51,160 --> 00:03:55,630 +Vì vậy, bây giờ chúng ta hãy tiếp tục và in số + +56 +00:03:56,050 --> 00:04:01,050 +lượng người theo dõi của user_1 và số lượng người theo dõi của user_1. + +57 +00:04:03,280 --> 00:04:06,820 +Và hãy làm điều tương tự cho người dùng_2. + +58 +00:04:09,370 --> 00:04:12,220 +Bạn có thể thấy sau khi phương pháp này chạy, + +59 +00:04:12,790 --> 00:04:16,089 +thì tài khoản theo dõi của user_1 vẫn bằng 0, nhưng + +60 +00:04:16,390 --> 00:04:18,790 +user_1 hiện đang theo dõi một người. + +61 +00:04:19,360 --> 00:04:24,340 +Người dùng_2 có một người theo dõi và không có người nào đang theo dõi. + +62 +00:04:26,640 --> 00:04:26,730 +2: Đúng không? + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Download-or-Fork-the-Quiz-Game-Starting-Code.url b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Download-or-Fork-the-Quiz-Game-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..f21a8f6903e456ed7436e9a46905ccac8f6dc78c --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Download-or-Fork-the-Quiz-Game-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/quiz-game-start \ No newline at end of file diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Quiz Project Part 1 Creating the Question Class.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Quiz Project Part 1 Creating the Question Class.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..71f9217863a312bd4032c7582d3964aaf23eb64a --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Quiz Project Part 1 Creating the Question Class.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e9e9aa33e8ec7866a286b14e335e8b640dc702220e8fad1987c2647301f7cc0 +size 25626575 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Quiz Project Part 1 Creating the Question Class_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Quiz Project Part 1 Creating the Question Class_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..edbcbd4bf45d4d1f838158fa405242565bcdeb3c --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 Quiz Project Part 1 Creating the Question Class_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,390 --> 00:00:04,230 +Bây giờ chúng ta đã thấy cách tạo các lớp tùy chỉnh của riêng mình, cuối cùng chúng ta + +2 +00:00:04,650 --> 00:00:06,990 +đã sẵn sàng để xây dựng trò chơi đố vui. + +3 +00:00:07,680 --> 00:00:10,710 +Bây giờ trò chơi này sẽ là một trò chơi đúng / sai đơn giản. + +4 +00:00:11,010 --> 00:00:15,000 +Vì vậy, một câu hỏi sẽ được đặt ra cho người dùng và họ sẽ chọn đúng hoặc sai, + +5 +00:00:15,420 --> 00:00:19,080 +sau đó chúng tôi sẽ cho họ biết họ nhận đúng hay sai và cho điểm. + +6 +00:00:20,040 --> 00:00:24,270 +Bây giờ để bắt đầu, bước đầu tiên bạn cần làm là tải xuống tệp zip chứa tất + +7 +00:00:24,270 --> 00:00:27,570 +cả mã bắt đầu từ trang web tài nguyên khóa học của chúng tôi. + +8 +00:00:28,020 --> 00:00:28,920 +Ngoài ra, + +9 +00:00:28,950 --> 00:00:33,030 +nếu bạn đã đăng nhập trên Repl. nó chỉ cần tách dự án và sau đó + +10 +00:00:33,030 --> 00:00:35,550 +nhấp vào ba dấu chấm này để tải xuống tệp zip tại đây. + +11 +00:00:36,720 --> 00:00:40,050 +Và khi bạn đã giải nén thư mục + +12 +00:00:40,050 --> 00:00:44,520 +thực tế, đố-trò-chơi-bắt đầu từ. tệp zip, sau đó chúng tôi đã sẵn sàng tiếp + +13 +00:00:44,670 --> 00:00:47,610 +tục và mở nó bằng PyCharm. Trong PyCharm, chúng tôi sẽ + +14 +00:00:47,640 --> 00:00:51,960 +nhấp vào mở và sau đó chúng tôi sẽ điều hướng đến nơi chúng tôi bắt + +15 +00:00:51,960 --> 00:00:56,460 +đầu trò chơi đố vui của mình, trong trường hợp của tôi là trong thư mục tải xuống. + +16 +00:00:57,390 --> 00:01:01,080 +PyCharm sẽ tự động định cấu hình phiên bản Python mới nhất mà bạn + +17 +00:01:01,080 --> 00:01:03,120 +đã cài đặt làm trình thông dịch. + +18 +00:01:03,480 --> 00:01:06,150 +Vì vậy, bạn có thể tiếp tục và đóng các cửa sổ bật lên này. + +19 +00:01:06,630 --> 00:01:09,480 +Và nếu chúng tôi mở thư mục bắt đầu trò + +20 +00:01:09,720 --> 00:01:13,110 +chơi đố vui của mình, bạn có thể thấy chúng tôi có bốn + +21 +00:01:13,140 --> 00:01:15,450 +tệp, dữ liệu, chính, câu hỏi_mẫu và quiz_brain. + +22 +00:01:16,050 --> 00:01:18,240 +Và trong một vài bài học tiếp theo, + +23 +00:01:18,300 --> 00:01:22,290 +chúng tôi sẽ viết mã trong tất cả các tệp này để chúng tôi kết thúc việc + +24 +00:01:22,320 --> 00:01:24,600 +tạo dự án bài kiểm tra cuối cùng của mình. + +25 +00:01:25,650 --> 00:01:30,650 +Nhiệm vụ đầu tiên mà chúng tôi phải làm là tạo một mô hình cho một câu hỏi trong bài kiểm tra của chúng tôi. + +26 +00:01:32,280 --> 00:01:37,280 +Nếu chúng ta có một đối tượng câu hỏi, thì nó phải có loại thuộc tính nào? + +27 +00:01:37,860 --> 00:01:42,030 +Nó có thể có một thuộc tính văn bản cho văn bản câu hỏi và nó cũng có + +28 +00:01:42,360 --> 00:01:44,940 +thể chứa một thuộc tính câu trả lời sẽ là câu + +29 +00:01:45,090 --> 00:01:49,260 +trả lời chính xác cho câu hỏi đó. Bây giờ, hai thuộc tính + +30 +00:01:49,260 --> 00:01:53,340 +này sẽ được khởi tạo với một giá trị khi một + +31 +00:01:53,640 --> 00:01:57,720 +đối tượng câu hỏi mới được tạo từ lớp này. + +32 +00:01:58,230 --> 00:02:02,040 +Ví dụ, nếu câu hỏi đầu tiên của chúng tôi là 2 + 3 = 5, mà chúng tôi biết + +33 +00:02:02,340 --> 00:02:05,340 +câu trả lời đúng phải là đúng. Chà, sau đó + +34 +00:02:05,340 --> 00:02:10,139 +chúng ta có thể viết mã như thế này để thực sự khởi + +35 +00:02:10,139 --> 00:02:15,140 +tạo một đối tượng câu hỏi mới. Và khi quá trình khởi tạo này đi qua mã + +36 +00:02:16,890 --> 00:02:17,820 +khởi tạo bên + +37 +00:02:18,120 --> 00:02:23,120 +trong lớp câu hỏi sẽ lấy hai phần dữ liệu này rồi thêm chúng vào các thuộc tính tương + +38 +00:02:23,220 --> 00:02:25,470 +ứng là văn bản và câu trả lời. + +39 +00:02:26,070 --> 00:02:31,070 +Và vì vậy đối tượng câu hỏi mới của chúng ta sẽ có cả hai thuộc tính này được khởi tạo + +40 +00:02:31,470 --> 00:02:32,490 +với một giá trị + +41 +00:02:32,760 --> 00:02:37,760 +khi một đối tượng câu hỏi mới đang được tạo. Bên trong dự án của bạn, hãy + +42 +00:02:39,030 --> 00:02:42,660 +chuyển đến câu hỏi_mẫu. tệp py và hãy + +43 +00:02:43,110 --> 00:02:48,030 +tiếp tục tạo một lớp mới có tên là câu hỏi và lớp câu + +44 +00:02:48,510 --> 00:02:51,960 +hỏi đó phải có một phương thức init sẽ khởi + +45 +00:02:52,200 --> 00:02:55,170 +tạo hai thuộc tính, văn bản và câu trả + +46 +00:02:55,440 --> 00:02:59,950 +lời giống như bạn đã thấy trong các trang trình bày trước đó. + +47 +00:03:00,850 --> 00:03:04,600 +Tạm dừng video và xem liệu bạn có thể hoàn thành thử thách này bằng cách tạo lớp học này + +48 +00:03:04,600 --> 00:03:05,130 +hay không. + +49 +00:03:05,130 --> 00:03:05,963 +1: Đúng. + +50 +00:03:10,590 --> 00:03:12,600 +0: Được rồi. Vì vậy, chúng ta biết rằng để + +51 +00:03:12,600 --> 00:03:16,260 +tạo một lớp, trước tiên chúng ta phải sử dụng từ khóa lớp. Và sau đó trong trường hợp của + +52 +00:03:16,290 --> 00:03:20,700 +chúng tôi, tên của lớp sẽ được gọi là Câu hỏi vì chúng tôi đang mô hình hóa một câu + +53 +00:03:20,700 --> 00:03:23,160 +hỏi sẽ như thế nào trong trò chơi của chúng tôi. + +54 +00:03:23,940 --> 00:03:27,270 +Chúng tôi biết rằng mỗi câu hỏi này có hai thuộc tính; + +55 +00:03:27,690 --> 00:03:30,240 +cái giá sách. văn bản và bản thân. câu trả lời. + +56 +00:03:30,840 --> 00:03:34,650 +Và hai thuộc tính đó sẽ được khởi tạo khi chúng ta + +57 +00:03:35,400 --> 00:03:40,400 +tạo một đối tượng câu hỏi mới. Vì vậy, chúng ta cần hàm init ở đây. + +58 +00:03:41,520 --> 00:03:43,770 +Và chúng tôi sẽ sử dụng tính năng tự động điền khá nhiều. + +59 +00:03:43,830 --> 00:03:46,980 +Vì vậy, một khi bạn viết Def và sau đó bạn viết init, bạn + +60 +00:03:47,280 --> 00:03:50,610 +có thể thấy nó trong danh sách thả xuống và sau đó chỉ cần nhấn enter + +61 +00:03:50,970 --> 00:03:54,240 +và mã sẽ được chèn tự động. Bằng cách này, bạn không + +62 +00:03:54,240 --> 00:03:58,050 +phải nhớ thứ tự chính xác của các dấu ngoặc đơn hoặc vị trí + +63 +00:03:58,050 --> 00:04:02,340 +đặt dấu hai chấm, vân vân, vân vân. Bây giờ, bên trong hàm init, chúng + +64 +00:04:02,370 --> 00:04:05,580 +ta sẽ thiết lập hai thuộc tính như chúng ta đã nói. + +65 +00:04:05,910 --> 00:04:09,660 +Một sẽ được gọi là văn bản và một sẽ được gọi là câu trả lời. + +66 +00:04:10,290 --> 00:04:13,980 +Và nếu chúng ta muốn tạo một thuộc tính, chúng ta phải sử + +67 +00:04:14,050 --> 00:04:17,040 +dụng cú pháp này, self. và sau đó là + +68 +00:04:17,370 --> 00:04:21,120 +tên của thuộc tính, vì cuối cùng khi chúng ta tạo một đối tượng + +69 +00:04:21,390 --> 00:04:26,390 +mới từ lớp này nói một đối tượng câu hỏi mới, thì chúng ta sẽ chuyển vào hai mục + +70 +00:04:27,510 --> 00:04:30,270 +này, một đoạn văn bản sẽ là câu hỏi, và + +71 +00:04:30,510 --> 00:04:35,400 +sau đó là câu trả lời đúng hoặc sai. Và sau đó nếu chúng ta muốn + +72 +00:04:35,400 --> 00:04:37,320 +truy cập văn bản, thì chúng + +73 +00:04:37,380 --> 00:04:40,590 +ta sẽ nói new_q. chữ. + +74 +00:04:41,190 --> 00:04:42,720 +Tất nhiên bây giờ, tất + +75 +00:04:42,750 --> 00:04:46,680 +cả những thứ này đều bị ố vàng vì nó dường như không có tác dụng. + +76 +00:04:47,010 --> 00:04:51,510 +Không có cách nào để nhận giá trị cho từng thuộc tính này. + +77 +00:04:51,990 --> 00:04:56,010 +Và để làm điều đó, chúng ta phải thêm một số đầu vào bên trong hàm init. + +78 +00:04:56,490 --> 00:04:59,730 +Vì vậy, hãy chỉ gọi nó là q_text và q_answer. + +79 +00:05:00,090 --> 00:05:02,910 +Tất nhiên bạn có thể gọi các tham số này bất cứ thứ gì bạn muốn. + +80 +00:05:03,330 --> 00:05:08,330 +Nhưng phần quan trọng là bạn thiết lập bản thân. văn bản cho giá trị đầu tiên đó + +81 +00:05:09,960 --> 00:05:12,450 +và bản thân. câu trả lời cho giá trị thứ hai. + +82 +00:05:13,020 --> 00:05:18,020 +Vì vậy, bây giờ khi chúng ta thực sự tiếp tục và in new_q này. đối tượng văn bản như chúng ta có + +83 +00:05:18,840 --> 00:05:20,730 +ở đây, sau đó nó sẽ + +84 +00:05:20,820 --> 00:05:24,750 +tiếp tục và thực sự tìm nạp giá trị này vào đầu ra. + +85 +00:05:26,250 --> 00:05:30,810 +Nếu bạn chạy và sau đó chạy và sau đó chọn một mô hình câu hỏi, + +86 +00:05:31,380 --> 00:05:35,400 +bạn có thể thấy đó là những gì được in trong bảng điều khiển. + +87 +00:05:37,110 --> 00:05:41,940 +Hãy xóa hai dòng đó và bây giờ chúng ta đã hoàn thành nhiệm vụ đầu tiên + +88 +00:05:42,270 --> 00:05:46,200 +của mình, đó là tạo lớp câu hỏi của chúng ta từ đầu. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 quiz-game-start.zip b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 quiz-game-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..efaaefa8efada627b667909b4616b306019ca045 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/005 quiz-game-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afbb8274a8b252f2bdd0987683b04d5218f61d7a8314d99bff2b045ede6ed3a1 +size 995 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/006 Quiz Project Part 2 Creating the List of Question Objects from the Data.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/006 Quiz Project Part 2 Creating the List of Question Objects from the Data.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7a7170bfdd50553c8e11dd68f2ebb77db08ee7a5 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/006 Quiz Project Part 2 Creating the List of Question Objects from the Data.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d510159e4ed14bbfe59c467f637830191bad2fe8cffc135247f78278c27030a +size 71384017 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/006 Quiz Project Part 2 Creating the List of Question Objects from the Data_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/006 Quiz Project Part 2 Creating the List of Question Objects from the Data_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a6a0cba3bad54ab5f0a21cea249936fb10aa19f0 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/006 Quiz Project Part 2 Creating the List of Question Objects from the Data_vi.srt @@ -0,0 +1,472 @@ +1 +00:00:00,330 --> 00:00:01,650 +Bây giờ trong bài học trước, + +2 +00:00:01,680 --> 00:00:05,610 +chúng ta đã tạo lớp câu hỏi của mình. Trong bài học này, chúng + +3 +00:00:05,640 --> 00:00:10,470 +ta sẽ tạo một ngân hàng câu hỏi gồm các đối tượng câu hỏi. + +4 +00:00:11,070 --> 00:00:15,930 +Lưu ý cách chúng ta có thể tạo một đối tượng câu hỏi bằng cách sử dụng tên của lớp và sau đó cung cấp cho nó + +5 +00:00:15,930 --> 00:00:20,250 +một số đầu vào cho câu hỏi và câu trả lời. Bây giờ, nếu chúng ta tạo một loạt + +6 +00:00:20,250 --> 00:00:25,080 +các câu hỏi đó và sau đó đưa chúng vào một danh sách như thế này, thì chúng ta có thể + +7 +00:00:25,140 --> 00:00:29,580 +tạo một ngân hàng câu hỏi gồm các câu hỏi để sử dụng trong bài kiểm tra của mình. + +8 +00:00:30,720 --> 00:00:33,570 +Nếu bạn nhìn vào bên trong dữ liệu. tệp py, bạn sẽ thấy + +9 +00:00:33,900 --> 00:00:38,900 +rằng tôi đã bao gồm rất nhiều câu hỏi bên trong đây, và bạn có thể thấy nó có một + +10 +00:00:39,270 --> 00:00:42,300 +số văn bản và nó có một số câu trả lời. + +11 +00:00:42,780 --> 00:00:47,780 +Vì vậy, cấu trúc chính xác của tệp này là nó có rất nhiều từ điển, + +12 +00:00:48,360 --> 00:00:51,030 +tổng cộng có 12 từ điển và tất cả + +13 +00:00:51,330 --> 00:00:55,110 +các từ điển này đều được lưu trong một danh sách và + +14 +00:00:55,440 --> 00:01:00,270 +danh sách đó được gọi là question_data. Bây giờ, khi bạn lần đầu tiên truy cập vào tệp + +15 +00:01:00,300 --> 00:01:04,019 +này, bạn sẽ thấy một số cảnh báo, những dòng chữ nguệch ngoạc nhỏ màu vàng này. + +16 +00:01:04,500 --> 00:01:08,190 +Và lý do là bởi vì nó sẽ được định dạng thích hợp, mỗi từ điển + +17 +00:01:08,580 --> 00:01:13,140 +này phải được thụt vào bên trong danh sách. Bây giờ, về chức năng thực + +18 +00:01:13,200 --> 00:01:16,620 +tế, điều này sẽ không thay đổi bất cứ điều gì. + +19 +00:01:16,650 --> 00:01:21,650 +Việc thụt lề của các mục trong danh sách không quan trọng bằng việc thụt lề trong + +20 +00:01:21,810 --> 00:01:23,820 +phương thức hoặc vòng lặp for. + +21 +00:01:24,360 --> 00:01:27,210 +Nhưng tốt hơn hết là bạn nên loại bỏ tất cả những cảnh báo này. + +22 +00:01:27,630 --> 00:01:32,250 +Vì vậy, những gì chúng ta sẽ làm là chúng ta sẽ chọn mọi thứ bên trong tệp này, chúng + +23 +00:01:32,310 --> 00:01:35,520 +ta sẽ đi đến mã và sau đó tự động thụt lề dòng. + +24 +00:01:36,090 --> 00:01:39,060 +Và điều này bạn sẽ nhận thấy hiện đã tự động thụt + +25 +00:01:39,330 --> 00:01:42,120 +lề cho tất cả các từ điển bên trong danh sách. + +26 +00:01:42,720 --> 00:01:47,190 +Bây giờ bạn sẽ vẫn nhận thấy một số dòng chữ nguệch ngoạc màu đỏ. Vì vậy, trong trường hợp này, + +27 +00:01:47,190 --> 00:01:51,690 +nguyên nhân là do dòng quá dài, nó lớn hơn 120 ký tự. + +28 +00:01:51,960 --> 00:01:55,260 +Bạn có thể thấy đó là điểm giới hạn. Vì vậy, trong PyCharm, + +29 +00:01:55,260 --> 00:01:57,390 +rất dễ dàng để tách các dòng. + +30 +00:01:57,420 --> 00:02:01,020 +Nếu bạn chỉ xác định một vị trí tốt trong dòng đó, hãy + +31 +00:02:01,050 --> 00:02:05,700 +nhấn enter và nó sẽ tự động thêm một số dấu ngoặc kép xung quanh nó để nó vẫn + +32 +00:02:05,700 --> 00:02:09,660 +hoạt động giống như trước đây, nhưng bây giờ nó nằm trên các dòng riêng biệt. + +33 +00:02:10,090 --> 00:02:12,450 +Và tôi cũng sẽ làm như vậy với dòng 8. + +34 +00:02:12,840 --> 00:02:16,440 +Bây giờ, cảnh báo cuối cùng mong đợi một dòng mới ở cuối tệp, vì vậy hãy cung + +35 +00:02:16,650 --> 00:02:17,790 +cấp cho nó điều đó. + +36 +00:02:18,150 --> 00:02:22,710 +Và điều cuối cùng mà bạn sẽ nhận thấy ở đây là có một dòng chữ nguệch ngoạc + +37 +00:02:22,740 --> 00:02:26,880 +ở đây dưới Backrub bởi vì đó là một từ không xác định trong từ điển. + +38 +00:02:27,240 --> 00:02:31,050 +Vì vậy, nếu bạn muốn, bạn thực sự có thể lưu các từ vào từ điển để + +39 +00:02:31,320 --> 00:02:33,420 +loại bỏ tất cả những dòng nguệch ngoạc này. + +40 +00:02:33,780 --> 00:02:35,940 +Đây thực sự là tên của một công ty, + +41 +00:02:35,940 --> 00:02:38,280 +vì vậy nó có thể sẽ không có trong từ điển. + +42 +00:02:38,580 --> 00:02:41,250 +Nhưng nếu bạn tiếp tục và đặt con trỏ của bạn vào nó + +43 +00:02:41,490 --> 00:02:45,720 +như thế này, bạn sẽ thấy một bóng đèn nhỏ sáng lên và bạn có thể tiếp tục và chọn lưu 'Backrub' + +44 +00:02:45,720 --> 00:02:47,490 +vào từ điển cấp dự án và điều + +45 +00:02:47,910 --> 00:02:50,850 +đó sẽ loại bỏ tất cả các cảnh báo và lỗi của bạn và bạn + +46 +00:02:51,120 --> 00:02:54,000 +sẽ thấy một dấu kiểm màu xanh lá cây đẹp mắt ở góc bên phải. + +47 +00:02:55,110 --> 00:02:57,990 +Bây giờ chúng ta đã thực hiện tất cả định dạng này + +48 +00:02:58,020 --> 00:03:03,020 +với dữ liệu, hãy thực sự kiểm tra nó. Những gì chúng tôi có ở đây là một danh sách các từ điển. + +49 +00:03:04,390 --> 00:03:09,390 +Mỗi từ điển đều có cùng một khóa cho nội dung câu hỏi và cùng một khóa cho + +50 +00:03:09,640 --> 00:03:11,320 +câu trả lời câu hỏi. + +51 +00:03:11,890 --> 00:03:16,890 +Vì vậy, điều chúng ta cần làm là chúng ta cần có thể đưa dữ liệu câu + +52 +00:03:17,560 --> 00:03:21,850 +hỏi này vào chính. tệp py. Nhưng thay vì có một danh sách + +53 +00:03:22,240 --> 00:03:25,120 +các từ điển, chúng ta muốn có một danh sách các đối tượng câu hỏi. + +54 +00:03:25,690 --> 00:03:30,690 +Chúng tôi đã biết rằng chúng tôi có thể tạo một đối tượng câu hỏi mới bằng cách đơn giản tạo một + +55 +00:03:31,690 --> 00:03:35,740 +đối tượng từ câu hỏi và sau đó cung cấp cho nó các đầu vào cần thiết. + +56 +00:03:36,160 --> 00:03:39,700 +Nhưng để làm được điều này bên trong main. tệp py, tất nhiên, chúng + +57 +00:03:40,420 --> 00:03:45,420 +tôi phải nhập mô hình câu hỏi và chúng tôi cũng cần nhập + +58 +00:03:45,790 --> 00:03:49,480 +dữ liệu. py Vì vậy, từ + +59 +00:03:49,480 --> 00:03:54,310 +mô hình câu hỏi, tôi sẽ nhập lớp câu hỏi và từ tệp dữ liệu, + +60 +00:03:54,340 --> 00:03:56,830 +tôi sẽ nhập dữ liệu câu hỏi. + +61 +00:03:57,550 --> 00:04:02,260 +Bây giờ bạn đã có cả dữ liệu câu hỏi và lớp câu hỏi, mục + +62 +00:04:02,950 --> 00:04:06,010 +tiêu của bạn là tạo ngân hàng câu hỏi. + +63 +00:04:06,670 --> 00:04:08,020 +Và khi bạn đã + +64 +00:04:08,200 --> 00:04:12,100 +hoàn tất, nó sẽ chứa một danh sách các đối tượng câu hỏi, mỗi + +65 +00:04:12,520 --> 00:04:15,610 +đối tượng được khởi tạo với một câu hỏi và một + +66 +00:04:16,390 --> 00:04:21,390 +câu trả lời, và dữ liệu sẽ đến từ các từ điển này từ dữ liệu câu hỏi. + +67 +00:04:22,450 --> 00:04:26,440 +Vì vậy, bạn sẽ cần suy nghĩ về cách bạn có thể lặp lại dữ liệu câu hỏi + +68 +00:04:26,440 --> 00:04:28,930 +đó để tạo danh sách các đối tượng câu hỏi này. + +69 +00:04:29,440 --> 00:04:31,510 +Tạm dừng video và bắt đầu ngay bây giờ. + +70 +00:04:34,930 --> 00:04:37,690 +Được rồi. Vì vậy, chúng tôi biết rằng chúng tôi + +71 +00:04:37,750 --> 00:04:40,600 +cần tạo ngân hàng câu hỏi này sẽ là một danh sách các đối tượng câu hỏi. + +72 +00:04:41,110 --> 00:04:43,930 +Vì vậy, tôi sẽ bắt đầu chỉ bằng cách + +73 +00:04:44,380 --> 00:04:49,380 +tạo một danh sách trống và sau đó tôi sẽ lặp lại từng câu hỏi bên + +74 +00:04:49,720 --> 00:04:53,380 +trong dữ liệu câu hỏi. Và đối với mỗi câu + +75 +00:04:53,380 --> 00:04:58,180 +hỏi này, tôi sẽ tạo một biến, mà chúng tôi sẽ gọi + +76 +00:04:58,870 --> 00:05:03,870 +là question_text và question_text sẽ đến từ các từ điển câu hỏi đó + +77 +00:05:04,660 --> 00:05:06,730 +từ đây. Và nếu chúng ta tưởng + +78 +00:05:06,730 --> 00:05:10,330 +tượng rằng chúng ta có một trong những từ điển này và chúng ta muốn nắm bắt câu hỏi_text, + +79 +00:05:10,660 --> 00:05:12,910 +thì chúng ta sẽ cần phải nhấn vào phím văn bản. + +80 +00:05:13,390 --> 00:05:18,130 +Vì vậy, tôi sẽ đưa văn bản vào bên trong đây và tôi sẽ làm điều tương tự cho + +81 +00:05:18,130 --> 00:05:18,963 +câu trả lời. + +82 +00:05:19,570 --> 00:05:24,570 +Vì vậy, đây sẽ là sử dụng phím trả lời mà chúng ta thấy ngay tại đây. + +83 +00:05:25,600 --> 00:05:29,500 +Vì vậy, bây giờ nếu chúng ta lặp lại cái đầu tiên, chúng ta sẽ có + +84 +00:05:29,500 --> 00:05:34,500 +'Máu của một con sên có màu xanh lá cây. 'và' True 'cho hai biến này. + +85 +00:05:35,080 --> 00:05:38,230 +Vì vậy, bây giờ tôi đã sẵn sàng tạo câu hỏi mới của + +86 +00:05:39,040 --> 00:05:41,980 +mình, câu hỏi này sẽ được tạo từ lớp câu hỏi. + +87 +00:05:42,430 --> 00:05:46,660 +Và bạn có thể thấy rằng trong hàm tạo, nó + +88 +00:05:46,930 --> 00:05:51,930 +mong đợi hai tham số; một là q_text và một là q_answer. + +89 +00:05:53,650 --> 00:05:58,340 +Chúng ta có thể đặt q_text thành biến cục bộ có tên là question_text và chúng ta có + +90 +00:05:58,760 --> 00:06:02,750 +thể đặt câu trả lời cho question_answer. Và tất nhiên, vì lợi ích đơn + +91 +00:06:02,750 --> 00:06:04,100 +giản, chúng ta cũng có + +92 +00:06:04,130 --> 00:06:09,130 +thể loại bỏ các tham số đã đặt tên và có chúng giống như các tham số như + +93 +00:06:09,400 --> 00:06:10,233 +thế này. + +94 +00:06:10,630 --> 00:06:15,630 +Vì vậy, bây giờ chúng tôi đã tạo đối tượng câu hỏi mới này và lưu nó trong biến new_question, + +95 +00:06:16,000 --> 00:06:19,690 +chúng tôi đã sẵn sàng thêm nó vào ngân hàng câu hỏi của mình. + +96 +00:06:19,870 --> 00:06:22,060 +Vì vậy, chúng ta có thể nói câu hỏi_ ngân hàng. chắp thêm, và chúng + +97 +00:06:22,450 --> 00:06:26,560 +tôi sẽ nối từng câu hỏi mới này mà chúng tôi tạo trong vòng lặp for. + +98 +00:06:27,190 --> 00:06:30,640 +Vì vậy, bây giờ nếu tôi tiếp tục và in ngân hàng câu + +99 +00:06:31,120 --> 00:06:35,350 +hỏi này, bạn sẽ thấy rằng khi tôi nhấn chạy và chọn tệp chính của mình, + +100 +00:06:35,830 --> 00:06:40,830 +sau đó nó in ra một danh sách được biểu thị bằng dấu ngoặc vuông và bên trong danh sách, + +101 +00:06:41,830 --> 00:06:46,090 +bạn có một loạt đối tượng câu hỏi. Và nếu bạn đếm, thực sự có + +102 +00:06:46,120 --> 00:06:47,920 +12 trong tổng số, một + +103 +00:06:48,190 --> 00:06:52,060 +cho mỗi từ điển bên trong dữ liệu câu hỏi của chúng tôi. + +104 +00:06:52,750 --> 00:06:55,600 +Vì vậy, rất thường xuyên khi bạn lấy dữ liệu + +105 +00:06:55,810 --> 00:06:59,410 +từ internet hoặc từ một nơi khác, nó có thể sẽ có định + +106 +00:06:59,410 --> 00:07:04,210 +dạng rất giống với định dạng này. Những gì chúng tôi đang làm là chúng tôi đang + +107 +00:07:04,210 --> 00:07:08,500 +chuyển đổi từng phần dữ liệu này có khóa chuỗi, điều đó có nghĩa là rất dễ + +108 +00:07:08,680 --> 00:07:10,630 +mắc lỗi chính tả nếu chúng tôi sử + +109 +00:07:10,630 --> 00:07:12,880 +dụng điều này trong mã của mình ở mọi + +110 +00:07:13,270 --> 00:07:15,760 +nơi và chúng tôi đang chuyển đổi nó thành một + +111 +00:07:16,120 --> 00:07:21,120 +đối tượng hiện có tất cả dữ liệu đó theo cách rất dễ dàng và dễ hiểu để truy cập vào + +112 +00:07:22,660 --> 00:07:26,380 +văn bản và câu trả lời. Và bạn sẽ nhận thấy ở + +113 +00:07:26,410 --> 00:07:29,050 +đây, nếu tôi thực sự viết sai, thì nó thực sự + +114 +00:07:29,320 --> 00:07:31,810 +sẽ làm nổi bật với tôi rằng đây không phải + +115 +00:07:32,080 --> 00:07:35,980 +là thứ mà bạn có thể sử dụng. Và nếu tôi bắt đầu nhập, tôi cũng + +116 +00:07:36,010 --> 00:07:38,920 +đã nhận được sự trợ giúp của tính năng tự động chèn. + +117 +00:07:40,480 --> 00:07:45,480 +Bây giờ chúng tôi đã tạo ngân hàng câu hỏi gồm các đối tượng câu hỏi, bước tiếp theo là thực sự bắt + +118 +00:07:46,240 --> 00:07:48,160 +đầu và chạy câu hỏi của chúng tôi. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/007 Quiz Project Part 3 The QuizBrain and the next_question() Method.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/007 Quiz Project Part 3 The QuizBrain and the next_question() Method.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d5f06946acd8ce0a1bcd12a39f47b8c9b9c37767 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/007 Quiz Project Part 3 The QuizBrain and the next_question() Method.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:484144c4846b28960e526abe8b072d732e3a3f3a042e792a3cec42743cbd9b7c +size 62900066 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/007 Quiz Project Part 3 The QuizBrain and the next_question() Method_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/007 Quiz Project Part 3 The QuizBrain and the next_question() Method_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c357218136fe2599a807d07e0690918fed14700f --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/007 Quiz Project Part 3 The QuizBrain and the next_question() Method_vi.srt @@ -0,0 +1,452 @@ +1 +00:00:00,480 --> 00:00:03,360 +Bây giờ chúng tôi đã quản lý để tạo ra một + +2 +00:00:03,420 --> 00:00:06,960 +ngân hàng câu hỏi bao gồm một danh sách các đối tượng câu hỏi, + +3 +00:00:06,990 --> 00:00:11,990 +điều tự nhiên tiếp theo cần làm là thực sự đưa ra một trong những câu hỏi đó và + +4 +00:00:13,440 --> 00:00:18,440 +yêu cầu người dùng trả lời câu hỏi. Bây giờ, đối với tất cả chức + +5 +00:00:19,380 --> 00:00:23,370 +năng đặt câu hỏi và đố vui, chúng tôi sẽ đưa nó + +6 +00:00:23,760 --> 00:00:25,890 +vào QuizBrain, đây sẽ là + +7 +00:00:26,370 --> 00:00:28,800 +một lớp theo đúng nghĩa của nó. + +8 +00:00:29,280 --> 00:00:33,570 +Và nó sẽ quản lý mọi thứ, từ việc hỏi người dùng cho câu hỏi tiếp theo, kiểm tra xem + +9 +00:00:33,870 --> 00:00:37,920 +câu trả lời có đúng hay không và cũng kiểm tra xem liệu chúng ta có thực sự đang + +10 +00:00:37,920 --> 00:00:39,660 +ở cuối bài kiểm tra hay không. + +11 +00:00:40,530 --> 00:00:44,070 +Bạn sẽ tạo QuizBrain và lớp này và lớp này sẽ + +12 +00:00:44,550 --> 00:00:49,550 +có hai thuộc tính để bắt đầu; một số câu hỏi sẽ có giá trị mặc + +13 +00:00:50,910 --> 00:00:53,760 +định là 0 vì tất cả các câu + +14 +00:00:54,090 --> 00:00:57,660 +hỏi của chúng tôi sẽ bắt đầu từ câu hỏi đầu tiên. + +15 +00:00:58,290 --> 00:01:02,700 +Và điều này sẽ theo dõi xem người dùng hiện đang đặt câu hỏi nào. + +16 +00:01:03,210 --> 00:01:07,410 +Và chúng ta sẽ sử dụng số đó để xem qua danh sách + +17 +00:01:07,770 --> 00:01:12,570 +các câu hỏi sẽ được chuyển đến đối tượng QuizBrain này khi nó được khởi tạo. + +18 +00:01:13,230 --> 00:01:17,100 +Và sau đó bạn sẽ có một phương thức được gọi là next_question sẽ + +19 +00:01:17,490 --> 00:01:21,210 +kéo câu hỏi từ danh sách đó lên tùy thuộc vào số câu hỏi + +20 +00:01:21,450 --> 00:01:23,880 +hiện tại mà chúng ta đang sử dụng. + +21 +00:01:24,480 --> 00:01:28,080 +Nếu bạn nhìn vào phiên bản cuối cùng của trò chơi đố vui, bạn có + +22 +00:01:28,500 --> 00:01:33,500 +thể thấy rằng nó hiển thị số câu hỏi, Q. và sau đó là số. + +23 +00:01:34,050 --> 00:01:36,120 +Và sau đó nó hiển thị văn bản câu + +24 +00:01:36,600 --> 00:01:39,900 +hỏi và sau đó nó yêu cầu người dùng nhập một đầu vào, true hoặc false. + +25 +00:01:40,860 --> 00:01:43,380 +Đây là những gì chúng ta sẽ tập trung vào trong bài học này. + +26 +00:01:44,130 --> 00:01:46,890 +Trong phần bắt đầu trò chơi đố vui + +27 +00:01:47,160 --> 00:01:51,060 +của bạn, hãy truy cập tệp quiz_brain và tạo lớp não câu đố. + +28 +00:01:51,600 --> 00:01:54,930 +Thêm hai thuộc tính đó; một là số câu hỏi + +29 +00:01:54,930 --> 00:01:59,310 +bắt đầu với giá trị mặc định và một là danh sách câu hỏi sẽ + +30 +00:01:59,520 --> 00:02:03,000 +được khởi tạo khi bạn tạo một bộ não đố mới. + +31 +00:02:03,540 --> 00:02:08,539 +Và chúng tôi sẽ chuyển ngân hàng câu hỏi này ở đây vào danh sách câu hỏi này + +32 +00:02:08,940 --> 00:02:11,280 +khi chúng tôi khởi tạo QuizBrain mới. + +33 +00:02:12,030 --> 00:02:15,300 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +34 +00:02:15,380 --> 00:02:16,213 +1: Đúng không? + +35 +00:02:19,880 --> 00:02:23,030 +0: Được rồi. Vì vậy, hãy bắt đầu + +36 +00:02:23,060 --> 00:02:28,060 +bằng cách tạo lớp mới của chúng ta sẽ được gọi là QuizBrain và bên trong lớp này, chúng ta + +37 +00:02:28,790 --> 00:02:30,920 +sẽ cần khởi tạo một số thuộc tính + +38 +00:02:31,280 --> 00:02:35,870 +đó, vì vậy tôi sẽ tạo phương thức init. Bên trong phương thức init, tôi + +39 +00:02:35,930 --> 00:02:40,700 +sẽ tạo thuộc tính đầu tiên được gọi là question_number và tôi đã nói rằng + +40 +00:02:41,570 --> 00:02:45,230 +chúng ta sẽ đặt nó có giá trị mặc định là 0. + +41 +00:02:45,380 --> 00:02:48,800 +Vì vậy, điều này có nghĩa là mỗi khi chúng ta tạo một + +42 +00:02:48,800 --> 00:02:50,390 +đối tượng QuizBrain mới từ + +43 +00:02:50,750 --> 00:02:55,190 +lớp này, nó sẽ sẵn sàng có một thuộc tính gọi là question_number được đặt thành 0. + +44 +00:02:56,030 --> 00:03:00,520 +Bây giờ thuộc tính tiếp theo được gọi là question_list, và thuộc tính này sẽ + +45 +00:03:01,210 --> 00:03:05,230 +không có giá trị mặc định. Thay vào đó, nó sẽ + +46 +00:03:05,290 --> 00:03:08,470 +nhận nó khi một giá trị được chuyển qua. + +47 +00:03:09,040 --> 00:03:14,040 +Vì vậy, hãy đặt nó dưới dạng q_list ở đây và đặt nó bằng question_list. + +48 +00:03:15,490 --> 00:03:18,640 +Vì vậy, những gì sẽ xảy ra là bên trong chính của chúng tôi. tệp py, chúng tôi sẽ + +49 +00:03:18,910 --> 00:03:23,260 +khởi tạo QuizBrain đó và giá trị mà chúng tôi sẽ đưa vào đó vì danh + +50 +00:03:23,260 --> 00:03:28,260 +sách câu hỏi sẽ là ngân hàng câu hỏi. Bằng cách này, chúng tôi sẽ nhận + +51 +00:03:30,010 --> 00:03:34,810 +được ngân hàng câu hỏi và nó sẽ nằm trong thuộc tính danh + +52 +00:03:34,840 --> 00:03:38,170 +sách câu hỏi này. Bây giờ tôi có một thử thách khác cho bạn. + +53 +00:03:38,560 --> 00:03:42,640 +Tạo một phương thức được gọi là next_question bên trong QuizBrain. + +54 +00:03:43,360 --> 00:03:48,250 +Phương pháp này cần lấy mục ở số câu hỏi hiện tại từ danh + +55 +00:03:48,250 --> 00:03:51,250 +sách câu hỏi. Và khi bạn có mục + +56 +00:03:51,310 --> 00:03:56,310 +này, hãy sử dụng chức năng nhập để hiển thị cho người dùng văn bản câu hỏi và yêu cầu + +57 +00:03:56,440 --> 00:03:59,650 +câu trả lời của người dùng. Tạm dừng video và tiếp tục. + +58 +00:04:04,930 --> 00:04:06,430 +Được rồi, đây là giải pháp. + +59 +00:04:06,880 --> 00:04:10,330 +Đầu tiên, chúng ta sẽ định nghĩa một phương thức mới được + +60 +00:04:11,470 --> 00:04:16,470 +gọi là next_question, và phương thức này về cơ bản sẽ nắm được câu hỏi hiện tại và + +61 +00:04:17,980 --> 00:04:21,279 +điều đó tất nhiên sẽ nằm trong danh sách câu hỏi. + +62 +00:04:21,730 --> 00:04:26,650 +Và sau đó, chúng tôi sẽ khai thác vào danh sách đó và giữ mục ở + +63 +00:04:26,860 --> 00:04:30,430 +số câu hỏi hiện tại. Vì vậy, ví dụ, question_number sẽ + +64 +00:04:30,430 --> 00:04:32,920 +bắt đầu bằng 0 và vì vậy nó sẽ + +65 +00:04:33,460 --> 00:04:36,160 +đi vào danh sách này, về cơ bản sẽ là + +66 +00:04:36,220 --> 00:04:41,220 +danh sách các câu hỏi từ chính của chúng ta. py, vì vậy ngân hàng câu hỏi + +67 +00:04:41,830 --> 00:04:43,300 +của chúng tôi. + +68 +00:04:43,870 --> 00:04:48,870 +Và hãy nhớ rằng mỗi mục bên trong danh sách đó là một đối tượng câu hỏi và các đối + +69 +00:04:49,030 --> 00:04:52,900 +tượng câu hỏi có thuộc tính văn bản và thuộc tính câu trả lời. + +70 +00:04:53,440 --> 00:04:56,800 +Vì vậy, ngoài việc nắm bắt câu hỏi hiện tại, sau + +71 +00:04:57,310 --> 00:05:02,310 +đó chúng ta có thể nắm bắt văn bản câu hỏi hiện tại bằng cách lấy câu hỏi + +72 +00:05:04,690 --> 00:05:09,610 +hiện tại và sau đó chỉ cần viết. văn bản để nhận giá trị được lưu trong + +73 +00:05:09,610 --> 00:05:10,443 +thuộc tính đó. + +74 +00:05:11,290 --> 00:05:14,830 +Chúng tôi sẽ sử dụng một đầu vào để hỏi người dùng về câu + +75 +00:05:14,890 --> 00:05:17,200 +trả lời của họ cho câu hỏi này. + +76 +00:05:17,560 --> 00:05:21,550 +Đây sẽ là một chuỗi vì chúng ta sẽ chèn + +77 +00:05:21,550 --> 00:05:25,960 +câu hỏi current_. chữ. Và ngay từ đầu + +78 +00:05:26,470 --> 00:05:27,340 +nếu bạn + +79 +00:05:27,340 --> 00:05:31,660 +nhớ, chúng ta cũng có Q. và sau đó là số và sau đó là dấu hai chấm. + +80 +00:05:32,260 --> 00:05:35,530 +Vì vậy, đó sẽ là bản thân. câu hỏi_số. + +81 +00:05:36,100 --> 00:05:39,490 +Và sau đó chúng ta có dấu hai chấm và sau đó nó sẽ là văn bản câu hỏi. + +82 +00:05:39,880 --> 00:05:44,530 +Và sau đó chúng tôi sẽ yêu cầu người dùng cung cấp thông tin đầu vào; đúng hay sai. + +83 +00:05:45,880 --> 00:05:48,220 +Và đó là nó. Điều đó hoàn thành thử thách. + +84 +00:05:48,670 --> 00:05:53,650 +Bây giờ tất cả những gì còn lại là hiển thị câu hỏi đầu tiên cho người dùng và + +85 +00:05:53,650 --> 00:05:58,250 +chạy mã của chúng tôi. Hãy quay trở lại chính. py và nhập lớp QuizBrain. + +86 +00:05:58,970 --> 00:06:03,970 +Vì vậy, chúng ta sẽ nói từ tệp quiz_brain nhập lớp QuizBrain. + +87 +00:06:05,840 --> 00:06:08,030 +Và khi chúng tôi đã tạo ngân hàng câu hỏi + +88 +00:06:08,390 --> 00:06:11,810 +của mình, thì việc tiếp theo cần làm là tạo bài kiểm tra mới của chúng tôi. + +89 +00:06:12,290 --> 00:06:15,380 +Vì vậy, đây sẽ là một đối tượng QuizBrain mới và + +90 +00:06:15,980 --> 00:06:20,090 +khi chúng ta khởi tạo nó, chúng ta phải chuyển vào danh sách các câu hỏi. + +91 +00:06:20,510 --> 00:06:23,450 +Và đó tất nhiên sẽ là ngân hàng câu hỏi. + +92 +00:06:24,290 --> 00:06:27,050 +Vì vậy, bây giờ chúng tôi đã thiết lập và chạy bài kiểm tra, + +93 +00:06:27,110 --> 00:06:31,460 +sau đó chúng tôi có thể nói bài kiểm tra. câu hỏi tiếp theo. + +94 +00:06:32,090 --> 00:06:35,000 +Hãy tiếp tục và chạy chính này. tệp py. + +95 +00:06:35,660 --> 00:06:40,660 +Và bạn có thể thấy rằng chúng tôi nhận được văn bản câu hỏi của chúng tôi được hiển thị, đúng hay + +96 +00:06:41,240 --> 00:06:45,110 +sai khi được hỏi, nhưng số câu hỏi của chúng tôi bắt đầu từ số không. + +97 +00:06:45,770 --> 00:06:46,790 +Và đó là tất + +98 +00:06:46,790 --> 00:06:51,790 +nhiên, bởi vì chúng ta cần số 0 ở đây để nắm bắt câu hỏi đầu tiên từ danh sách và + +99 +00:06:52,520 --> 00:06:56,330 +đó là lý do tại sao câu hỏi này có giá trị mặc định là 0. + +100 +00:06:56,840 --> 00:06:59,030 +Nhưng vào thời điểm chúng tôi đạt được đầu + +101 +00:06:59,120 --> 00:07:03,080 +vào này, sẽ thực sự tốt nếu điều này thực sự đọc một thay vì số không. + +102 +00:07:03,620 --> 00:07:07,160 +Vì vậy, một cách chúng tôi có thể làm điều này là chúng tôi có + +103 +00:07:07,610 --> 00:07:12,140 +thể làm điều này cộng một, nhưng hãy nhớ rằng chúng tôi thực sự cần phải tăng số lượng câu + +104 +00:07:12,140 --> 00:07:14,570 +hỏi mỗi khi chúng tôi gọi next_question dù sao, + +105 +00:07:14,930 --> 00:07:17,870 +sau đó khi chúng tôi đã nắm được câu hỏi hiện tại, + +106 +00:07:18,170 --> 00:07:23,170 +chúng tôi thực sự có thể nhấn vào bản thân đó. câu hỏi_số và tăng nó lên một. + +107 +00:07:23,900 --> 00:07:25,610 +Điều này sẽ có tác dụng tương + +108 +00:07:25,760 --> 00:07:30,320 +tự, và nếu bạn nhìn vào nó bây giờ, chúng tôi đã có đúng số câu hỏi được hiển + +109 +00:07:30,680 --> 00:07:35,570 +thị ở đây, văn bản phù hợp được hiển thị và sau đó chúng tôi có thể chèn đúng hoặc sai. + +110 +00:07:36,680 --> 00:07:37,760 +Bây giờ ở giai + +111 +00:07:37,790 --> 00:07:42,020 +đoạn này, chương trình của chúng ta sẽ thoát ra. Trong bài học tiếp theo, chúng ta sẽ phải tìm + +112 +00:07:42,260 --> 00:07:47,260 +ra cách để các câu hỏi của chúng ta tiếp tục được hỏi. Và chúng tôi sẽ cần viết + +113 +00:07:48,080 --> 00:07:50,840 +thêm một số mã để nó hoạt động. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/008 Quiz Project Part 4 How to continue showing new Questions.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/008 Quiz Project Part 4 How to continue showing new Questions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0c4147887287afcfbf5586463c347a3290c9f532 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/008 Quiz Project Part 4 How to continue showing new Questions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:902519e701f03eb86f2c33193f475b13ab636a59b8b5590e829e39e23befd48e +size 39112719 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/008 Quiz Project Part 4 How to continue showing new Questions_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/008 Quiz Project Part 4 How to continue showing new Questions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e4e57ce3dc33d45ab8ab8cebcdcf566208972c7 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/008 Quiz Project Part 4 How to continue showing new Questions_vi.srt @@ -0,0 +1,284 @@ +1 +00:00:00,330 --> 00:00:01,620 +Trong bài học trước, chúng + +2 +00:00:01,650 --> 00:00:06,650 +tôi đã quản lý để thiết lập và chạy QuizBrain của mình và bắt đầu hỏi người dùng câu trả + +3 +00:00:07,200 --> 00:00:08,032 +lời của họ. + +4 +00:00:08,550 --> 00:00:13,550 +Nhưng hiện tại, không có cách nào để chương trình của chúng tôi tiếp tục câu hỏi tiếp theo khi người + +5 +00:00:14,220 --> 00:00:17,250 +dùng đã nhập một đầu vào. Tuy nhiên, nếu chúng ta + +6 +00:00:17,250 --> 00:00:19,920 +xem phiên bản cuối cùng của trò chơi đố + +7 +00:00:20,280 --> 00:00:23,400 +vui, bạn có thể thấy sau khi người dùng nhập một đầu + +8 +00:00:23,400 --> 00:00:28,400 +vào, nó sẽ chuyển sang câu hỏi tiếp theo và hiển thị cho họ câu hỏi số 2 và + +9 +00:00:28,620 --> 00:00:31,320 +nội dung câu hỏi cho câu hỏi thứ hai đó. + +10 +00:00:32,189 --> 00:00:36,360 +Làm cách nào chúng tôi có thể tạo chức năng đó để hoạt động với QuizBrain của chúng tôi? + +11 +00:00:37,050 --> 00:00:42,210 +Chà, nếu chúng ta có thể tạo một phương thức khác được gọi là still_has_questions thì + +12 +00:00:42,540 --> 00:00:46,800 +bên trong main của chúng ta. py, chúng ta có thể tạo một + +13 +00:00:47,140 --> 00:00:48,420 +vòng lặp while và + +14 +00:00:48,480 --> 00:00:52,950 +vòng lặp while sẽ kiểm tra xem bài kiểm tra có còn câu hỏi hay không. + +15 +00:00:53,550 --> 00:00:57,240 +Vậy thì trong trường hợp đó, chúng ta sẽ tiếp tục chuyển sang câu hỏi tiếp theo. + +16 +00:00:57,870 --> 00:01:02,870 +Vậy làm cách nào để tạo chức năng này và làm cách nào để + +17 +00:01:03,270 --> 00:01:07,680 +tạo nó bên trong QuizBrain? Công việc của bạn là tạo + +18 +00:01:08,040 --> 00:01:11,820 +một phương thức mới ở đây sẽ được gọi là still_has_questions. + +19 +00:01:12,450 --> 00:01:16,440 +Và điều này sẽ trả về một boolean, đúng hoặc sai. + +20 +00:01:16,800 --> 00:01:18,240 +Và tùy thuộc vào boolean + +21 +00:01:18,360 --> 00:01:22,290 +đó, chúng ta có thể có được vòng lặp while của mình để tiếp tục hoạt động + +22 +00:01:22,650 --> 00:01:25,020 +và tiếp tục chạy và lặp lại, hoặc chúng ta + +23 +00:01:25,260 --> 00:01:28,050 +sẽ dừng vòng lặp khi bài kiểm tra hết câu hỏi. + +24 +00:01:29,250 --> 00:01:33,000 +Đây là hành vi mà bạn đang tìm kiếm khi kết thúc thử thách. + +25 +00:01:33,420 --> 00:01:38,280 +Vòng lặp while sẽ tiếp tục cung cấp câu hỏi tiếp theo cho người dùng cho đến khi chúng + +26 +00:01:38,280 --> 00:01:40,050 +tôi kết thúc bài kiểm tra. + +27 +00:01:40,380 --> 00:01:45,380 +Hãy suy nghĩ xem số câu hỏi và độ dài của danh sách câu hỏi liên quan với nhau + +28 +00:01:45,870 --> 00:01:50,190 +như thế nào và xem liệu bạn có thể hoàn thành thử thách này không. + +29 +00:01:53,820 --> 00:01:54,180 +Được rồi. + +30 +00:01:54,180 --> 00:01:59,180 +Vì vậy, chúng tôi biết rằng chúng tôi có thể nhận được độ dài của danh sách câu hỏi + +31 +00:02:00,120 --> 00:02:05,120 +của chúng tôi bằng cách sử dụng hàm Len. Hiện tại, trong tất cả các phiên bản hiện tại + +32 +00:02:05,700 --> 00:02:08,430 +của ngân hàng câu hỏi, chúng tôi có tổng cộng 12 câu hỏi. + +33 +00:02:08,880 --> 00:02:11,250 +Vì vậy, độ dài sẽ là 12. + +34 +00:02:11,850 --> 00:02:16,850 +Bây giờ chúng tôi muốn vòng lặp của mình tiếp tục cho đến khi chúng tôi đạt đến số lượng câu hỏi trong + +35 +00:02:17,700 --> 00:02:18,570 +danh sách của mình. + +36 +00:02:19,170 --> 00:02:24,170 +Những gì chúng tôi có thể làm là chúng tôi có thể kiểm tra xem liệu bản thân. số câu hỏi nhỏ hơn độ + +37 +00:02:25,530 --> 00:02:30,530 +dài của bản thân. câu hỏi_danh sách. Trong trường hợp đó, chúng tôi sẽ + +38 +00:02:32,430 --> 00:02:35,130 +trả về true, nhưng nếu không, chúng tôi sẽ trả về false. + +39 +00:02:36,600 --> 00:02:40,980 +Hãy nhớ rằng số lượng câu hỏi này sẽ tăng lên mỗi khi chúng tôi hiển thị + +40 +00:02:40,980 --> 00:02:44,640 +cho người dùng câu hỏi tiếp theo. Nó bắt đầu bằng 0 và + +41 +00:02:44,880 --> 00:02:46,920 +sau đó nó chuyển ngay sang một. + +42 +00:02:47,370 --> 00:02:51,150 +Và sau đó chúng ta đi đến phần cuối của hàm câu hỏi tiếp theo và + +43 +00:02:51,540 --> 00:02:54,570 +chúng ta đến vòng lặp while. Vì vậy, trong vòng lặp while + +44 +00:02:54,600 --> 00:02:59,100 +của chúng tôi, chúng tôi có thể kiểm tra xem bài kiểm tra có còn câu hỏi hay không. + +45 +00:02:59,710 --> 00:03:04,210 +Và nếu điều này là đúng, thì hãy chuyển sang câu hỏi tiếp theo. Nhưng nếu nó sai, thì hãy thoát khỏi + +46 +00:03:04,240 --> 00:03:06,970 +vòng lặp và chúng ta đã kết thúc trò chơi. + +47 +00:03:08,050 --> 00:03:10,090 +Quay lại bên trong QuizBrain của chúng + +48 +00:03:10,300 --> 00:03:15,300 +tôi, chúng tôi thực sự có thể đơn giản hóa phương pháp này hơn nữa vì chúng tôi + +49 +00:03:16,020 --> 00:03:18,570 +biết rằng điều này sẽ được máy tính đánh + +50 +00:03:18,930 --> 00:03:23,010 +giá và nó sẽ đúng hoặc sai. Nếu nó là sự thật thì nó + +51 +00:03:23,040 --> 00:03:26,130 +sẽ đi vào khối này. Và nếu nó sai, thì + +52 +00:03:26,190 --> 00:03:27,900 +nó sẽ đi vào khối khác. + +53 +00:03:28,410 --> 00:03:32,100 +Chúng tôi thực sự có thể tiết kiệm cho mình tất cả nỗ lực này bằng + +54 +00:03:32,130 --> 00:03:36,540 +cách chỉ cần trả lại biểu thức này. Bây giờ, những gì nó + +55 +00:03:36,540 --> 00:03:41,540 +sẽ làm là, giả sử rằng a = 5 và b = + +56 +00:03:45,030 --> 00:03:45,863 +3. + +57 +00:03:46,260 --> 00:03:50,100 +Và nếu chúng ta trả về năm lớn hơn ba, + +58 +00:03:50,130 --> 00:03:51,540 +thì điều + +59 +00:03:51,870 --> 00:03:55,560 +này về cơ bản giống như biểu thức này + +60 +00:03:55,890 --> 00:04:00,150 +được máy tính đánh giá. Và khi mã này chạy, + +61 +00:04:00,180 --> 00:04:05,080 +nó sẽ đúng hoặc sẽ sai. Vì vậy, giá trị đó sau đó + +62 +00:04:05,130 --> 00:04:07,860 +sẽ được phương thức này trả về ngay + +63 +00:04:07,860 --> 00:04:12,180 +lập tức trở lại vòng lặp while này để xem liệu chúng ta có + +64 +00:04:12,240 --> 00:04:15,960 +nên tiếp tục chuyển sang câu hỏi tiếp theo hay không. + +65 +00:04:16,620 --> 00:04:21,510 +Vì vậy, hãy chạy tệp này và bạn có thể thấy nó hỏi tôi câu hỏi đầu tiên. + +66 +00:04:22,230 --> 00:04:24,480 +Và sau đó sẽ chuyển sang câu hỏi tiếp theo. + +67 +00:04:24,810 --> 00:04:29,810 +Và sau đó về cơ bản nó sẽ tiếp tục cho đến khi nó đi đến cuối danh sách các + +68 +00:04:31,230 --> 00:04:32,910 +câu hỏi và sau đó nó + +69 +00:04:32,970 --> 00:04:37,230 +kết thúc toàn bộ chương trình của chúng ta. Trong bài học tiếp theo, chúng ta + +70 +00:04:37,290 --> 00:04:42,150 +sẽ tìm hiểu cách chúng ta có thể kiểm tra câu trả lời mà người dùng đã nhập vào + +71 +00:04:42,150 --> 00:04:45,930 +đây và xem nó có thực sự là câu trả lời chính xác hay không. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/009 Quiz Project Part 5 Checking Answers and Keeping Score.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/009 Quiz Project Part 5 Checking Answers and Keeping Score.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7b076ac5d888a48aec814941e0792d47d1ecf727 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/009 Quiz Project Part 5 Checking Answers and Keeping Score.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b945893234e69c2ff7d489c0dae53ed778fdbff97841584279089aeeea414863 +size 48231777 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/009 Quiz Project Part 5 Checking Answers and Keeping Score_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/009 Quiz Project Part 5 Checking Answers and Keeping Score_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..76c137cd5387f1af810ada4c5b655e8672421238 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/009 Quiz Project Part 5 Checking Answers and Keeping Score_vi.srt @@ -0,0 +1,472 @@ +1 +00:00:00,180 --> 00:00:02,490 +Hiện tại, khi chúng tôi chạy mã của mình, + +2 +00:00:02,910 --> 00:00:06,780 +bạn có thể thấy rằng mặc dù chúng tôi có thể nhập câu trả lời của + +3 +00:00:07,380 --> 00:00:12,030 +mình, nhưng mã của chúng tôi thực sự không thực sự quan tâm vì nó không kiểm tra xem + +4 +00:00:12,030 --> 00:00:14,280 +nó đúng hay sai. Trong bài học + +5 +00:00:14,310 --> 00:00:17,520 +này, chúng ta sẽ thêm một phương thức nữa vào + +6 +00:00:17,970 --> 00:00:22,970 +QuizBrain và đó là khả năng kiểm tra câu trả lời mà người dùng đã nhập + +7 +00:00:22,980 --> 00:00:27,870 +và xem nó có đúng hay không. Và điều đó có nghĩa là chúng ta cần theo dõi điểm của người dùng. + +8 +00:00:27,990 --> 00:00:30,300 +Vì vậy, chúng tôi sẽ thêm một điểm thuộc tính + +9 +00:00:30,540 --> 00:00:33,030 +khác có giá trị mặc định bằng 0 để bắt đầu và + +10 +00:00:33,360 --> 00:00:38,220 +nó sẽ tăng lên mỗi khi họ nhận được câu hỏi đúng. Vì vậy, trong bài học này, + +11 +00:00:38,250 --> 00:00:42,660 +chúng ta sẽ tạo một phương thức mới có tên là check_answer. + +12 +00:00:43,470 --> 00:00:48,470 +Và hàm check_answer này sẽ được sử dụng để xem liệu câu trả lời của người dùng đến + +13 +00:00:50,640 --> 00:00:55,640 +từ đầu vào này có giống với câu trả lời thực tế cho câu hỏi hiện tại + +14 +00:00:57,240 --> 00:00:58,073 +hay không. + +15 +00:00:58,920 --> 00:01:03,920 +Những gì chúng tôi cần làm là chúng tôi cần lưu thông tin đầu vào của người dùng này bên trong + +16 +00:01:05,190 --> 00:01:07,350 +một biến mà chúng tôi sẽ gọi là user_answer. + +17 +00:01:08,430 --> 00:01:12,150 +Và sau đó tôi sẽ gọi phương thức check_answer của chúng tôi + +18 +00:01:12,600 --> 00:01:17,100 +và tôi muốn chuyển qua user_answer. Ngoài ra, bây giờ tôi + +19 +00:01:17,100 --> 00:01:22,100 +cũng muốn chuyển câu trả lời đúng và câu trả lời đúng + +20 +00:01:22,830 --> 00:01:26,130 +sẽ là current_question. câu trả lời. + +21 +00:01:26,430 --> 00:01:30,330 +Vì vậy, hãy thay thế nó bằng current_question. trả lời vì chúng + +22 +00:01:30,990 --> 00:01:35,190 +ta biết rằng current_question là một đối tượng câu hỏi có + +23 +00:01:35,490 --> 00:01:38,820 +thuộc tính text và thuộc tính câu trả lời. + +24 +00:01:39,480 --> 00:01:44,480 +Và khi chúng tôi đã chuyển qua câu trả lời của người dùng và câu trả lời chính xác, + +25 +00:01:45,180 --> 00:01:49,440 +thì chúng tôi có thể nhận nó bên trong hàm check_answer dưới dạng một tham số. + +26 +00:01:50,580 --> 00:01:52,770 +Vì vậy, chúng tôi sẽ gọi cái + +27 +00:01:53,340 --> 00:01:56,760 +này là user_answer và cái thứ hai chúng tôi sẽ gọi là true_answer. + +28 +00:01:58,560 --> 00:02:01,860 +Vì vậy, bây giờ đầu vào này sẽ được chuyển qua + +29 +00:02:02,310 --> 00:02:06,210 +đây và câu trả lời chính xác sẽ nằm dưới tên biến này. + +30 +00:02:06,780 --> 00:02:11,780 +Vì vậy, bây giờ chúng tôi có thể xem liệu user_answer có bằng đúng_answer không. + +31 +00:02:13,260 --> 00:02:14,790 +Và chỉ vì mục + +32 +00:02:14,820 --> 00:02:18,840 +đích an toàn, bạn nên giảm cả hai bên thành chữ thường để + +33 +00:02:18,840 --> 00:02:22,050 +chúng có thể so sánh được. Bằng cách này, chỉ + +34 +00:02:22,050 --> 00:02:25,620 +trong trường hợp người dùng trả lời Đúng hoặc đúng, nó sẽ + +35 +00:02:25,890 --> 00:02:27,660 +được xử lý giống hệt nhau. + +36 +00:02:28,860 --> 00:02:32,940 +Nếu user_answer khớp với câu trả lời đúng, thì điều này có nghĩa + +37 +00:02:32,940 --> 00:02:35,880 +là họ đã đúng, vì vậy hãy in nó. + +38 +00:02:38,550 --> 00:02:42,960 +Nhưng mặt khác, nếu điều đó là sai thì điều đó có nghĩa là họ đã sai. + +39 +00:02:43,080 --> 00:02:45,210 +Vì vậy, hãy nói với họ điều đó là sai. + +40 +00:02:46,500 --> 00:02:51,500 +Bây giờ, nó cũng có thể là một ý tưởng hay để cho người dùng biết câu trả + +41 +00:02:51,750 --> 00:02:56,010 +lời chính xác thực sự là gì. Bây giờ bạn có một sự lựa chọn tùy thuộc vào nơi bạn muốn đặt nó. + +42 +00:02:56,070 --> 00:03:01,070 +Vì vậy, bạn có thể chọn chỉ hiển thị cho họ câu trả lời đúng nếu + +43 +00:03:01,510 --> 00:03:03,340 +họ sai như thế này. + +44 +00:03:03,580 --> 00:03:06,670 +Nhưng tôi nghĩ rằng thực sự là một ý kiến hay khi chỉ cho họ câu trả lời chính + +45 +00:03:06,970 --> 00:03:08,320 +xác ngay cả khi họ hiểu đúng. + +46 +00:03:08,470 --> 00:03:13,030 +Vì vậy, tôi sẽ thay đổi thụt lề để nó thực sự nằm ngoài khối + +47 +00:03:13,030 --> 00:03:13,990 +if / + +48 +00:03:14,500 --> 00:03:19,120 +else và nó chỉ đơn giản xảy ra khi khối if / else hoàn tất. + +49 +00:03:19,930 --> 00:03:24,930 +Bây giờ, điều tiếp theo cần làm là theo dõi điểm của người dùng để + +50 +00:03:25,780 --> 00:03:30,760 +mỗi khi họ nhận được câu hỏi thì nó sẽ tăng điểm lên một. + +51 +00:03:31,450 --> 00:03:36,450 +Tạm dừng video và thêm thuộc tính mới gọi là điểm vào lớp QuizBrain và tăng từng thuộc + +52 +00:03:37,510 --> 00:03:41,650 +tính mỗi khi người dùng làm đúng. Bây giờ, những gì bạn đang + +53 +00:03:41,650 --> 00:03:46,510 +hướng tới là có thể in ra điểm và câu hỏi hiện tại để bạn + +54 +00:03:46,510 --> 00:03:51,510 +có thể cho người dùng biết 'Điểm hiện tại của bạn là:' và được in + +55 +00:03:52,330 --> 00:03:54,340 +ra sau mỗi câu hỏi. + +56 +00:03:55,300 --> 00:03:57,730 +Tạm dừng video ngay bây giờ và hoàn thành thử thách này. + +57 +00:04:00,400 --> 00:04:04,750 +Được rồi. Vì vậy, hãy tiếp tục và tạo thuộc tính điểm mới + +58 +00:04:05,110 --> 00:04:08,440 +của chúng tôi, thuộc tính này một lần nữa sẽ có giá trị bắt đầu mặc định là 0. + +59 +00:04:09,070 --> 00:04:12,820 +Và sau đó bất cứ khi nào người dùng nhận được một câu hỏi đúng, + +60 +00:04:13,090 --> 00:04:16,300 +thì chúng tôi sẽ tăng điểm của họ lên từng câu một. + +61 +00:04:16,660 --> 00:04:20,290 +Vì vậy, chúng ta hãy khai thác thuộc tính điểm đó và sau đó tăng nó lên một. + +62 +00:04:21,250 --> 00:04:24,010 +Bây giờ chúng tôi đã theo dõi điểm số của mình, + +63 +00:04:24,070 --> 00:04:28,810 +sau đó chúng tôi muốn có thể in ra điểm số hiện tại của người dùng là bao nhiêu. + +64 +00:04:29,350 --> 00:04:34,090 +Vì vậy, ở cuối check_answer, hãy tạo một câu lệnh in khác để cung cấp + +65 +00:04:34,450 --> 00:04:36,640 +cho người dùng điểm của họ. + +66 +00:04:36,820 --> 00:04:39,820 +Vì vậy, 'Điểm hiện tại của bạn là:' và sau đó chúng + +67 +00:04:40,360 --> 00:04:43,360 +tôi sẽ chèn bản thân. ghi bàn. + +68 +00:04:44,440 --> 00:04:49,090 +Và chúng tôi cũng sẽ cho họ biết một số câu hỏi có thể xảy ra, để chúng + +69 +00:04:49,120 --> 00:04:52,240 +tôi có thể tự chèn vào. câu hỏi_số. + +70 +00:04:52,660 --> 00:04:56,380 +Vì vậy, điều này có nghĩa là họ đã hoàn thành năm câu hỏi cho đến nay, trong đó + +71 +00:04:56,380 --> 00:04:58,600 +họ có năm cơ hội để đạt được mọi thứ ngay + +72 +00:04:58,930 --> 00:05:03,040 +sau đó chúng tôi có thể cho họ thấy rằng họ có rất nhiều câu đúng trong số năm câu hỏi đó. + +73 +00:05:03,370 --> 00:05:07,510 +Vì vậy, có thể họ đúng 3/5, hoặc có thể + +74 +00:05:07,510 --> 00:05:10,570 +họ đúng 5/5. Và bây giờ nếu chúng ta chạy mã + +75 +00:05:10,630 --> 00:05:12,970 +của mình, chúng ta có thể thấy câu lệnh in đó đang hoạt động. + +76 +00:05:15,400 --> 00:05:18,850 +Vì vậy, nó cho tôi biết rằng tôi đã hiểu đúng + +77 +00:05:19,930 --> 00:05:23,590 +và sau đó-- và sau đó câu trả lời chính xác là đúng. + +78 +00:05:24,070 --> 00:05:26,950 +Và điểm số hiện tại của tôi là 1/1. + +79 +00:05:32,940 --> 00:05:33,773 +1: Đúng + +80 +00:05:34,260 --> 00:05:36,780 +0: Bây giờ, nếu tôi sai một trong + +81 +00:05:37,350 --> 00:05:42,300 +những điều này, thì bạn có thể thấy rằng số điểm hiện tại của tôi là 3/4. + +82 +00:05:43,230 --> 00:05:46,800 +Và nó cho người dùng biết rằng họ đã bỏ lỡ một điểm. + +83 +00:05:47,760 --> 00:05:51,510 +Sẽ rất tuyệt nếu bạn thêm một chút khoảng trống vào giữa mỗi câu hỏi. + +84 +00:05:51,570 --> 00:05:55,110 +Tôi muốn có thể xem tất cả các câu hỏi mà tôi đã làm cho đến nay. + +85 +00:05:55,320 --> 00:05:56,910 +Vì vậy, tôi không muốn xóa + +86 +00:05:57,230 --> 00:06:00,020 +màn hình, nhưng tôi muốn có thể thêm một dòng mới ở đây. + +87 +00:06:00,560 --> 00:06:05,540 +Vì vậy, ở cuối câu lệnh in của tôi, tôi sẽ thêm một bản in sẽ + +88 +00:06:05,570 --> 00:06:07,490 +in ra một dòng mới. + +89 +00:06:08,780 --> 00:06:10,670 +Vì vậy, ở giữa mỗi câu hỏi, + +90 +00:06:10,670 --> 00:06:14,930 +tôi có một chút không gian để phân biệt từng câu hỏi với câu hỏi kia. + +91 +00:06:16,010 --> 00:06:20,060 +Điều cuối cùng tôi cần làm là cho người dùng biết điểm số + +92 +00:06:20,330 --> 00:06:23,660 +cuối cùng của họ sau khi toàn bộ bài kiểm tra + +93 +00:06:24,170 --> 00:06:29,170 +kết thúc và chúng tôi muốn có thể in nội dung như 'Bạn đã hoàn thành bài + +94 +00:06:32,450 --> 00:06:34,730 +kiểm tra' và sau đó chúng + +95 +00:06:34,760 --> 00:06:38,210 +tôi sẽ in ra, ừm, đại loại như 'Điểm cuối cùng + +96 +00:06:38,390 --> 00:06:42,230 +của bạn là:' và sau đó chúng tôi sẽ cho họ điểm cuối + +97 +00:06:42,620 --> 00:06:47,420 +cùng để có thể họ đã đúng 10/12. Và bằng cách này, họ có thể thấy kết quả cuối cùng của họ là gì. + +98 +00:06:47,900 --> 00:06:51,740 +Vì vậy, hãy suy nghĩ về cách bạn có thể in hai dòng này ở + +99 +00:06:52,190 --> 00:06:57,190 +đây và làm thế nào bạn có thể nắm giữ số câu hỏi và điểm của người dùng để in bên + +100 +00:06:57,800 --> 00:07:01,820 +trong chính của chúng tôi. py Vì vậy, hãy tạm dừng video và hoàn thành thử thách này. + +101 +00:07:03,620 --> 00:07:06,080 +Được rồi. Vì vậy, dòng đầu tiên rất dễ in. + +102 +00:07:06,140 --> 00:07:08,990 +Tất cả những gì chúng ta cần làm là quấn một câu lệnh in xung quanh nó. + +103 +00:07:09,560 --> 00:07:13,610 +Dòng thứ hai phức tạp hơn một chút vì nó sẽ cần phải có một + +104 +00:07:13,610 --> 00:07:14,443 +sợi dây. + +105 +00:07:14,450 --> 00:07:19,450 +Vì vậy, chúng tôi muốn giá trị thứ hai này là tổng số câu hỏi trong ngân hàng + +106 +00:07:20,300 --> 00:07:21,133 +câu hỏi + +107 +00:07:21,350 --> 00:07:25,700 +hoặc nó có thể là số câu hỏi hiện tại mà người dùng đang sử dụng. + +108 +00:07:26,270 --> 00:07:27,200 +Bạn có thể làm một trong hai. + +109 +00:07:27,230 --> 00:07:32,230 +Bạn có thể nói ngân hàng câu hỏi và bao hàm độ dài xung quanh nó, như thế này, điều này sẽ + +110 +00:07:34,100 --> 00:07:37,010 +cung cấp cho bạn tổng số câu hỏi vì bây giờ chúng + +111 +00:07:37,310 --> 00:07:40,880 +ta đang ở cuối bài kiểm tra. Ngoài ra, bạn cũng có + +112 +00:07:40,910 --> 00:07:45,910 +thể nhấn vào đối tượng câu đố và nhận số câu hỏi khi câu + +113 +00:07:46,910 --> 00:07:50,150 +hỏi kết thúc. Và tương tự với điểm số, bạn có + +114 +00:07:50,150 --> 00:07:52,370 +thể nói câu đố. ghi bàn. + +115 +00:07:53,120 --> 00:07:56,300 +Vì vậy, bây giờ khi bài kiểm tra đã hoàn thành, bạn có thể + +116 +00:07:57,980 --> 00:08:01,700 +xem các báo cáo in của chúng tôi. Bạn đã hoàn thành bài kiểm tra và điểm + +117 +00:08:01,730 --> 00:08:06,500 +cuối cùng của bạn là 0/12 bởi vì tôi chỉ đang nghiền nút và nó không nhận được bất kỳ câu + +118 +00:08:06,500 --> 00:08:07,370 +hỏi nào đúng. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Course-Fixes-Report-an-Issue.url b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Open-Trivia-Database.url b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Open-Trivia-Database.url new file mode 100644 index 0000000000000000000000000000000000000000..3efba4ac7084fc31455d928954018ceb884f3471 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Open-Trivia-Database.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://opentdb.com/ \ No newline at end of file diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Quiz-Project-Final-Code.url b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Quiz-Project-Final-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..030f0010c75e37588e186f7e98b5a25263da3699 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 Quiz-Project-Final-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/quiz-game-final \ No newline at end of file diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 The Benefits of OOP Use Open Trivia DB to Get New Questions.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 The Benefits of OOP Use Open Trivia DB to Get New Questions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..18cab21e4adee140f64131e421efd3f39f156702 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 The Benefits of OOP Use Open Trivia DB to Get New Questions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7d085b2ea67a7f0808bb8f09d3c202148f8dd4052753d81538dfad3c3cba8ab +size 59308741 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 The Benefits of OOP Use Open Trivia DB to Get New Questions_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 The Benefits of OOP Use Open Trivia DB to Get New Questions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f5378ae2aef0d8554ca6ad94a36b77f1bf8dfcfe --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/010 The Benefits of OOP Use Open Trivia DB to Get New Questions_vi.srt @@ -0,0 +1,304 @@ +1 +00:00:00,120 --> 00:00:03,360 +Vì vậy, tôi chắc chắn rằng bạn đã làm một vài lần với bài kiểm tra của mình + +2 +00:00:03,360 --> 00:00:06,930 +và bạn đã trả lời tất cả các câu hỏi và bạn biết tất cả các câu trả lời chính xác. + +3 +00:00:07,440 --> 00:00:11,670 +Nó hơi khô khan nếu chúng ta chỉ có một ngân hàng câu hỏi, phải không? + +4 +00:00:12,210 --> 00:00:15,660 +Thật tuyệt khi có thể chuyển đổi dữ liệu câu hỏi bằng một + +5 +00:00:15,660 --> 00:00:19,530 +số câu hỏi mới phải không? Bây giờ bạn chắc chắn có thể + +6 +00:00:19,560 --> 00:00:24,000 +viết câu hỏi của riêng mình, chỉ cần thay đổi từng văn bản và câu trả lời + +7 +00:00:24,000 --> 00:00:28,740 +cho bất kỳ câu hỏi nào bạn muốn thêm. Tuy nhiên, một giải pháp thay thế là sử dụng cơ + +8 +00:00:28,920 --> 00:00:33,480 +sở dữ liệu Câu đố mở, đây là cơ sở dữ liệu câu hỏi đố vui do người dùng đóng góp miễn phí + +9 +00:00:33,900 --> 00:00:38,900 +và nó có hơn 3000 câu hỏi đã được xác minh để chọn. Trong các tài nguyên khóa học, tôi có + +10 +00:00:39,300 --> 00:00:44,190 +một liên kết đến TDB mở, cơ sở dữ liệu câu đố mở và chúng ta + +11 +00:00:44,610 --> 00:00:49,610 +có thể tiếp tục và xem qua API của họ để xem cách chúng tôi có + +12 +00:00:49,710 --> 00:00:54,120 +thể tạo một số câu hỏi. Ví dụ: nếu tôi muốn có + +13 +00:00:54,480 --> 00:00:59,430 +10 câu hỏi trên, giả sử máy tính và tôi muốn độ khó trở nên + +14 +00:00:59,880 --> 00:01:02,850 +dễ dàng và tôi muốn chọn loại là true + +15 +00:01:03,270 --> 00:01:06,840 +hoặc false Sau đó, tôi sẽ nhấp vào tạo URL API. + +16 +00:01:07,420 --> 00:01:08,940 +Bây giờ tôi đã có URL + +17 +00:01:08,940 --> 00:01:12,600 +của mình, tôi có thể mở một tab mới và đi đến vị trí đó. + +18 +00:01:13,320 --> 00:01:18,320 +Bây giờ, chúng ta sẽ nhận được một số dữ liệu được tạo ở định dạng + +19 +00:01:18,990 --> 00:01:21,750 +JSON, đây là một ký hiệu đối + +20 +00:01:22,170 --> 00:01:26,700 +tượng JavaScript nhưng nó thực sự trông khá giống với một từ điển Python. + +21 +00:01:27,210 --> 00:01:32,210 +Vì vậy, hãy tiếp tục và sao chép mọi thứ ở đây và sau đó đi vào dữ liệu của chúng tôi. py và tôi sẽ thay thế + +22 +00:01:33,570 --> 00:01:38,570 +toàn bộ dữ liệu câu hỏi bằng những gì tôi vừa nhận được. + +23 +00:01:39,330 --> 00:01:42,870 +Bây giờ một khi bạn dán nó vào, nó sẽ rất khó đọc. + +24 +00:01:42,930 --> 00:01:47,930 +Vì vậy, chúng ta sẽ cần phải đi mã và sau đó định dạng lại mã để làm cho nó trông + +25 +00:01:48,870 --> 00:01:50,160 +bình thường hơn một chút. + +26 +00:01:50,610 --> 00:01:55,610 +Vì vậy, bạn có thể thấy rằng chúng tôi có từ điển này và nó có hai cặp khóa-giá trị. + +27 +00:01:57,480 --> 00:02:02,480 +Một là mã phản hồi và một là danh sách nằm dưới kết quả chính. + +28 +00:02:04,350 --> 00:02:06,060 +Nếu tôi đi và định + +29 +00:02:06,090 --> 00:02:10,949 +dạng lại điều này, bạn có thể thấy rằng kết quả bao gồm 10 từ điển. + +30 +00:02:11,490 --> 00:02:16,700 +Bây giờ, mỗi từ điển này chứa một loạt các cặp khóa-giá trị và bên + +31 +00:02:17,430 --> 00:02:20,760 +trong mỗi cặp khóa-giá trị này, nó có + +32 +00:02:20,760 --> 00:02:24,960 +một loạt các thứ bao gồm danh mục, loại đó, độ khó, + +33 +00:02:24,960 --> 00:02:29,370 +câu hỏi, câu trả lời đúng và sai. các câu trả lời. + +34 +00:02:29,850 --> 00:02:34,850 +Vì vậy, những gì chúng ta có thể thấy ở đây là chúng ta có một từ điển và sau đó chúng ta có hai cặp + +35 +00:02:35,820 --> 00:02:36,653 +giá trị khóa này. + +36 +00:02:37,110 --> 00:02:42,110 +Vì vậy, bạn có thể đơn giản chỉ cần loại bỏ từ điển kèm theo và để nó để bạn + +37 +00:02:43,080 --> 00:02:47,940 +có nó như một danh sách các từ điển. Bây giờ, nếu chúng ta đi và + +38 +00:02:47,970 --> 00:02:52,970 +định dạng lại mã của mình để có thể thấy từng đối tượng từ điển + +39 +00:02:53,310 --> 00:02:54,143 +này, bạn + +40 +00:02:54,390 --> 00:02:59,070 +có thể thấy có tổng cộng năm cặp giá trị khóa và mỗi cặp + +41 +00:02:59,080 --> 00:03:03,970 +có danh mục khóa, loại, câu hỏi, là văn bản câu hỏi và câu trả + +42 +00:03:04,000 --> 00:03:06,550 +lời đúng là một chuỗi đúng hoặc sai. + +43 +00:03:07,120 --> 00:03:10,360 +Đây là hai bit thông tin mà chúng tôi quan tâm. + +44 +00:03:10,840 --> 00:03:15,840 +Vì vậy, bạn có thể tìm ra cách bạn có thể sửa đổi chính. py để làm cho bài kiểm tra + +45 +00:03:16,030 --> 00:03:20,320 +của chúng ta bắt đầu hoạt động trở lại với dữ liệu mới này? + +46 +00:03:20,830 --> 00:03:23,110 +Tạm dừng video và hoàn thành thử thách này. + +47 +00:03:26,400 --> 00:03:30,810 +Được rồi. Vì vậy, chúng tôi đã có dữ liệu câu hỏi + +48 +00:03:31,320 --> 00:03:35,010 +của mình từ tệp dữ liệu, nhưng bây giờ chúng tôi phải thay đổi tên của các khóa này. + +49 +00:03:35,460 --> 00:03:37,890 +Trong khi trước đây nó được gọi là văn bản và câu + +50 +00:03:38,310 --> 00:03:41,340 +trả lời, bây giờ nó được gọi là câu hỏi và câu trả lời chính xác. + +51 +00:03:41,520 --> 00:03:46,520 +Vì vậy, câu hỏi_text nằm dưới câu hỏi quan trọng và câu trả lời đúng nằm dưới + +52 +00:03:46,830 --> 00:03:48,330 +câu hỏi chính xác _answer. + +53 +00:03:48,840 --> 00:03:53,250 +Vì vậy, chỉ cần thay đổi hai điều đó và dán tất cả dữ liệu đó vào, chúng ta đã có + +54 +00:03:53,640 --> 00:03:58,640 +thể bắt đầu với bài kiểm tra hoàn toàn mới này. Và bạn có thể chơi với nó + +55 +00:04:00,780 --> 00:04:04,620 +và lộn xộn với các dữ liệu khác nhau từ cơ sở dữ liệu + +56 +00:04:04,860 --> 00:04:07,380 +câu đố mở, thay đổi danh mục, thay đổi + +57 +00:04:07,710 --> 00:04:10,770 +độ khó và bạn có vô số câu hỏi để chơi. + +58 +00:04:11,460 --> 00:04:16,260 +Và điều này thực sự mang lại một số lợi thế của Lập + +59 +00:04:16,260 --> 00:04:21,260 +trình hướng đối tượng. Chú ý cách chỉ chính của chúng tôi. tệp py thực sự có kiến thức + +60 +00:04:23,550 --> 00:04:28,550 +về cách hoạt động và hoạt động của từng lớp này. QuizBrain của chúng tôi thực sự không cần + +61 +00:04:30,000 --> 00:04:31,470 +phải đụng đến khi + +62 +00:04:31,500 --> 00:04:36,150 +chúng tôi thay đổi dữ liệu của mình. Đây là mô-đun tốt nhất của nó. + +63 +00:04:36,450 --> 00:04:41,450 +Chúng tôi có thể chuyển đổi hoàn toàn dữ liệu câu hỏi sang một ngôn ngữ khác, một chủ + +64 +00:04:41,670 --> 00:04:46,200 +đề khác, sang một định dạng khác và bộ não của câu hỏi không quan tâm. + +65 +00:04:46,680 --> 00:04:51,680 +Tất cả những gì nó phải quan tâm là làm thế nào để theo dõi câu hỏi chúng ta đang ở, làm thế nào để + +66 +00:04:52,080 --> 00:04:55,230 +nhận được câu hỏi tiếp theo, làm thế nào để kiểm tra câu trả lời. + +67 +00:04:55,650 --> 00:04:59,940 +Và miễn là nó có thể làm điều đó và thực hiện chức năng của một bài kiểm tra, + +68 +00:05:00,330 --> 00:05:04,440 +nó sẽ không bị quan tâm bởi dữ liệu đến từ đâu, nó được định dạng như thế + +69 +00:05:04,770 --> 00:05:08,430 +nào và nó sẽ tiếp tục hoạt động. Vì vậy, như bạn có thể tưởng tượng, + +70 +00:05:08,460 --> 00:05:10,770 +nếu đồng nghiệp của bạn đang làm việc trên bộ não + +71 +00:05:11,190 --> 00:05:15,450 +đố, họ thực sự không cần biết dữ liệu trông như thế nào hoặc cấu trúc của nó như thế nào. + +72 +00:05:15,840 --> 00:05:19,170 +Và bạn, mặt khác, có thể đang làm việc trên + +73 +00:05:19,200 --> 00:05:23,070 +dữ liệu, nắm giữ từng phần dữ liệu này hoặc viết câu đố. + +74 +00:05:23,550 --> 00:05:26,910 +Và bạn đã có thể thấy cách chúng tôi có một phần + +75 +00:05:27,210 --> 00:05:32,210 +chương trình có thể phức tạp hơn nhiều so với những gì chúng tôi từng có thể tạo bằng + +76 +00:05:32,580 --> 00:05:34,050 +mã thủ tục đơn giản. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/011 Run for that Bus!.mp4 b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/011 Run for that Bus!.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bc4eae5034828e15d6b46a4a0bae7460f19aa3be --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/011 Run for that Bus!.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a7429aa5b07e45785dc127b89bb7bb6cef78f4e5d9a9b9413d2d77fc49f7341 +size 47482883 diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/011 Run for that Bus!_vi.srt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/011 Run for that Bus!_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..400e47c4651b8cbb29331a86f698152cb1f3ebe3 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/011 Run for that Bus!_vi.srt @@ -0,0 +1,72 @@ +1 +00:00:00,870 --> 00:00:09,950 +Này, các bạn, hoàn thành tốt ngày 17. Bạn đang làm rất tốt và tôi rất tự hào về bạn. + +2 +00:00:09,960 --> 00:00:13,620 +Nếu không có ai khác nói với bạn điều này, tôi sẽ nói với bạn ngay bây giờ. + +3 +00:00:13,620 --> 00:00:16,000 +Bạn đang ở ngày 17 và điều đó thật tuyệt vời. + +4 +00:00:16,710 --> 00:00:23,830 +Vì vậy, một trong những điều mà chúng ta phải luôn ghi nhớ là bạn phải tiếp tục cố gắng. + +5 +00:00:24,090 --> 00:00:29,130 +Bạn biết đấy, một trong những việc tôi thường làm khi còn đi học là phải chạy xe buýt bắt + +6 +00:00:29,130 --> 00:00:29,910 +xe buýt, + +7 +00:00:29,910 --> 00:00:32,090 +và tôi phải mất 30 phút để đến trường. + +8 +00:00:32,940 --> 00:00:37,590 +Và rất thường xuyên, tôi sẽ ở trong tình huống có thể nhìn thấy xe buýt đang chạy + +9 +00:00:38,160 --> 00:00:42,660 +tới và tôi cảm thấy có cơ hội mình có thể đến được hoặc có thể không. + +10 +00:00:43,880 --> 00:00:51,590 +Và sức mạnh của nhân vật mà bạn phải xây dựng là chạy cho chiếc xe buýt đó, ngay cả khi bạn không biết mình có đi + +11 +00:00:51,590 --> 00:00:52,560 +được hay không. + +12 +00:00:52,580 --> 00:00:57,560 +Và đôi khi bạn chạy rất mạnh, bạn đổ mồ hôi, bạn không thể thở, phổi của bạn như + +13 +00:00:57,570 --> 00:01:01,480 +muốn nổ tung và chiếc xe buýt rời đi mà không có bạn, nhưng điều + +14 +00:01:01,880 --> 00:01:04,340 +đó không sao vì bạn đã cố gắng. + +15 +00:01:05,150 --> 00:01:07,070 +Vì vậy, đây là những gì tôi đang cố gắng nói. + +16 +00:01:07,160 --> 00:01:12,230 +Hãy chạy xe buýt đó ngay cả khi bạn không đến được vì bạn sẽ có 50% thời gian. + +17 +00:01:12,800 --> 00:01:16,080 +Nếu bạn tiếp tục cố gắng, tôi tin rằng bạn sẽ thành công. + +18 +00:01:16,670 --> 00:01:18,230 +Vì vậy, hãy cứ tiếp tục. + diff --git a/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/external-links.txt b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..0ae9cdee8e77060875f4c3ef30308ac96525a559 --- /dev/null +++ b/part2/17 - Day 17 - Intermediate - The Quiz Project & the Benefits of OOP/external-links.txt @@ -0,0 +1,15 @@ + +001 Day-17-Goal-Click-Run-to-see-the-final-project +https://replit.com/@appbrewery/quiz-game-final?v=1 + +005 Download-or-Fork-the-Quiz-Game-Starting-Code +https://repl.it/@appbrewery/quiz-game-start + +010 Open-Trivia-Database +https://opentdb.com/ + +010 Quiz-Project-Final-Code +https://repl.it/@appbrewery/quiz-game-final + +010 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/001 Day 18 Goals what we will make by the end of the day.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/001 Day 18 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..06a39c3c6c2faa7933693f91e9768383b28a5915 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/001 Day 18 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5173041c8451acb4d78db8d30bc6fe0bb4618257082d4307ec065c75e8340253 +size 3629492 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/001 Day 18 Goals what we will make by the end of the day_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/001 Day 18 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f994ef579ae65353906ce8318da040369bbb923c --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/001 Day 18 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,64 @@ +1 +00:00:00,090 --> 00:00:04,890 +Xin chào các bạn, chào mừng đến với Ngày 18 của 100 Ngày viết mã. Bây giờ, hôm nay, chúng ta sẽ + +2 +00:00:04,890 --> 00:00:07,680 +tìm hiểu về một số điều thực sự thú vị. + +3 +00:00:07,710 --> 00:00:10,110 +Chúng ta sẽ xem xét sâu hơn về + +4 +00:00:10,470 --> 00:00:15,120 +đồ họa rùa, bắt đầu làm những việc với đồ họa, với sự trợ giúp của mô-đun rùa. + +5 +00:00:15,450 --> 00:00:19,020 +Và chúng tôi cũng sẽ tìm hiểu về các bộ giá trị trong Python cũng + +6 +00:00:19,020 --> 00:00:22,200 +như tìm hiểu sâu hơn về việc nhập các mô-đun bằng Python. + +7 +00:00:23,010 --> 00:00:24,540 +Vào cuối ngày hôm + +8 +00:00:24,570 --> 00:00:29,570 +nay, chúng tôi sẽ viết một số mã có khả năng tạo ra những tác phẩm + +9 +00:00:31,110 --> 00:00:34,740 +kỳ quặc hàng triệu đô la. Vì vậy, chúng tôi đang xem xét một chiếc + +10 +00:00:35,010 --> 00:00:38,640 +Damien Hirst, được bán với giá 1 chiếc. 275 triệu + +11 +00:00:38,640 --> 00:00:41,970 +bảng cách đây ít lâu. + +12 +00:00:42,450 --> 00:00:47,450 +Và chúng tôi sẽ sử dụng con rùa Python để tạo ra một bức tranh chấm chấm + +13 +00:00:50,820 --> 00:00:51,653 +đẹp tương + +14 +00:00:51,690 --> 00:00:56,580 +tự, có thể được ngẫu nhiên hóa và tạo ra những tác phẩm nghệ thuật tuyệt + +15 +00:00:56,700 --> 00:00:59,550 +đẹp như bức tranh này. Khi bạn đã sẵn + +16 +00:00:59,610 --> 00:01:02,790 +sàng, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Trinket-Turtle-Colours.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Trinket-Turtle-Colours.url new file mode 100644 index 0000000000000000000000000000000000000000..b1749194ae445b5d02227eab2973925ebc25b385 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Trinket-Turtle-Colours.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://trinket.io/docs/colors \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Turtle-Colours.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Turtle-Colours.url new file mode 100644 index 0000000000000000000000000000000000000000..1a0df9b06456c577f27dc426b52024abaf2b2632 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Turtle-Colours.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://cs111.wellesley.edu/reference/colors \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Turtle-Graphics-Documentation.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Turtle-Graphics-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..60646a1b029a6d0157cb7d27cda8add9979e38e0 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Turtle-Graphics-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/turtle.html \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Understanding Turtle Graphics and How to use the Documentation.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Understanding Turtle Graphics and How to use the Documentation.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d85127e3cea6bbcb1634f10a81a445a4e6d7e256 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Understanding Turtle Graphics and How to use the Documentation.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cacc1e514b2e659589a51323491da8781ac5a23f9c1d50ce13750c98ca0c3eeb +size 150724094 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Understanding Turtle Graphics and How to use the Documentation_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Understanding Turtle Graphics and How to use the Documentation_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f1bd658d9170ba14d316d13bf0869e385cacea57 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/002 Understanding Turtle Graphics and How to use the Documentation_vi.srt @@ -0,0 +1,592 @@ +1 +00:00:00,540 --> 00:00:02,700 +Như tôi đã đề cập, trong phần + +2 +00:00:02,700 --> 00:00:06,030 +này, chúng ta sẽ làm việc nhiều với mô-đun Python rùa. + +3 +00:00:06,630 --> 00:00:08,070 +Và như chúng ta đã thấy + +4 +00:00:08,130 --> 00:00:13,130 +trước đây, mô-đun rùa này về cơ bản là một cách để chúng tôi có thể vẽ đồ họa lên + +5 +00:00:13,380 --> 00:00:14,213 +màn hình. + +6 +00:00:14,520 --> 00:00:19,320 +Và bạn có thể tưởng tượng nó giống như con rùa nhỏ lang thang này với một cây bút trên + +7 +00:00:19,320 --> 00:00:23,160 +lưng và ở bất cứ đâu nó đi qua, nó đều để lại một dấu vết. + +8 +00:00:23,970 --> 00:00:28,230 +Vì vậy, chúng ta hãy xem xét kỹ hơn mô-đun đồ họa rùa. Bây giờ ở đây, tôi đã tạo + +9 +00:00:28,260 --> 00:00:33,240 +một dự án PyCharm hoàn toàn mới có tên là day-18-start và tôi đã tạo + +10 +00:00:33,630 --> 00:00:37,800 +một main trống. py Trong dự án này, + +11 +00:00:37,890 --> 00:00:42,450 +chúng tôi sẽ nhập rùa của chúng tôi. Vì vậy, như bạn đã thấy + +12 +00:00:42,450 --> 00:00:47,070 +từ các bài học trước, chúng ta có thể nhập mô-đun rùa và nắm + +13 +00:00:47,100 --> 00:00:50,220 +giữ lớp rùa bằng cách đơn giản nói từ mô-đun + +14 +00:00:50,520 --> 00:00:55,520 +rùa, nhập lớp Rùa với chữ T. Và bây giờ chúng ta có thể làm việc + +15 +00:00:56,760 --> 00:01:01,230 +với lớp đó và chúng ta sẽ sử dụng nó để tạo một đối tượng con rùa mới. + +16 +00:01:01,680 --> 00:01:03,540 +Hãy gọi nó là + +17 +00:01:05,310 --> 00:01:09,210 +timmy_the_turtle, và nó sẽ được tạo từ lớp con rùa. + +18 +00:01:09,240 --> 00:01:13,410 +Vì vậy, đây sẽ là một đối tượng rùa mới được lưu bên trong biến này. + +19 +00:01:14,070 --> 00:01:16,680 +Bây giờ, khi chúng tôi thực sự chạy dự án + +20 +00:01:18,630 --> 00:01:21,450 +của mình, bạn sẽ thấy một cửa sổ nhấp nháy ngắn + +21 +00:01:21,510 --> 00:01:25,950 +và sau đó nó sẽ biến mất. Để cửa sổ đó ở nguyên vị trí của + +22 +00:01:26,040 --> 00:01:29,430 +nó và chỉ thoát ra khi chúng ta thực sự nhấp vào cửa sổ, chúng ta + +23 +00:01:29,730 --> 00:01:33,510 +phải tạo một đối tượng khác, cái mà chúng ta sẽ gọi là màn hình của chúng ta. + +24 +00:01:34,020 --> 00:01:36,870 +Và điều này cũng đến từ tổng mô-đun. + +25 +00:01:36,960 --> 00:01:39,690 +Và đó là một lớp có tên là Màn hình. + +26 +00:01:40,140 --> 00:01:42,720 +Chúng tôi cũng phải nhập nó nếu chúng tôi muốn sử dụng nó. + +27 +00:01:43,260 --> 00:01:45,390 +Vì vậy, bây giờ chúng ta đã nắm giữ + +28 +00:01:45,420 --> 00:01:49,110 +màn hình, chúng ta có thể sử dụng một trong những chức năng được gọi là exitonclick. + +29 +00:01:50,520 --> 00:01:52,560 +Vì vậy, theo cách này, khi chúng tôi chạy mã + +30 +00:01:52,590 --> 00:01:57,590 +của mình, chúng tôi có thể thấy con rùa của chúng tôi xuất hiện ở giữa như mũi tên nhỏ này và cửa sổ của chúng tôi + +31 +00:01:58,200 --> 00:02:02,490 +sẽ không biến mất cho đến khi chúng tôi nhấp vào nó. Đó là những gì exitonclick làm. + +32 +00:02:02,970 --> 00:02:06,210 +Vì vậy, chúng ta cần giữ đoạn mã này ở dưới cùng. + +33 +00:02:06,330 --> 00:02:09,810 +Nó phải xảy ra sau khi chúng tôi làm tất cả những thứ này với rùa. + +34 +00:02:09,930 --> 00:02:13,920 +Vì vậy, tôi sẽ chuyển nó xuống cuối tệp. Bây giờ đây là một câu hỏi. + +35 +00:02:13,950 --> 00:02:18,850 +Làm thế nào để tôi biết làm thế nào để làm điều đó? Có phải vì tôi siêu kinh nghiệm và tôi nhớ + +36 +00:02:18,850 --> 00:02:21,450 +mọi thứ trong đầu? Không. + +37 +00:02:21,780 --> 00:02:25,920 +Có phải vì tôi siêu thông minh và tôi có thể giải quyết mọi việc? Không, đó chắc chắn không phải + +38 +00:02:26,070 --> 00:02:27,750 +là câu trả lời. + +39 +00:02:28,170 --> 00:02:32,730 +Cách mà các lập trình viên tìm ra cách sử dụng các mô-đun hoặc + +40 +00:02:32,730 --> 00:02:36,240 +gói này là thông qua việc sử dụng tài liệu. + +41 +00:02:36,570 --> 00:02:41,570 +Vì vậy, chúng ta hãy xem qua tài liệu đồ họa con rùa. + +42 +00:02:42,810 --> 00:02:46,530 +Và đây là tài liệu trông như thế nào. Đó là một tài liệu + +43 +00:02:46,530 --> 00:02:51,530 +rất dài trình bày tất cả những điều bạn có thể làm với + +44 +00:02:52,560 --> 00:02:55,260 +mô-đun này. Bây giờ, nếu chúng + +45 +00:02:55,260 --> 00:03:00,260 +ta cuộn xuống, bạn đã có một trang nội dung ở đây và bạn có thể thấy nhiều thứ + +46 +00:03:00,550 --> 00:03:05,550 +khác nhau mà bạn có thể làm với con rùa. Kiểm soát chuyển động của nó hoặc điều khiển bút hoặc thay + +47 +00:03:06,910 --> 00:03:11,380 +đổi khả năng hiển thị hoặc hình thức của nó. Bây giờ chúng ta hãy xem xét chức + +48 +00:03:11,890 --> 00:03:16,240 +năng hình dạng này, và bạn có thể xem tài liệu giải thích cho chúng tôi rằng chức + +49 +00:03:16,570 --> 00:03:20,800 +năng cụ thể này sẽ đặt hình dạng con rùa thành một hình dạng có tên nhất định. + +50 +00:03:21,520 --> 00:03:26,440 +Và chúng ta có thể chọn từ các hình dạng khác nhau, bao gồm mũi tên, con rùa, hình tròn, hình vuông, + +51 +00:03:26,450 --> 00:03:29,370 +hình tam giác và cổ điển. Vì vậy, hãy sử + +52 +00:03:29,380 --> 00:03:34,380 +dụng kiến thức này và thay đổi timmy_the_turtle để có một hình dạng khác. + +53 +00:03:35,440 --> 00:03:38,050 +Vì vậy, bên trong đây, chúng ta có thể đặt bất kỳ chuỗi nào trong số đó. + +54 +00:03:38,080 --> 00:03:42,490 +Vì vậy, tôi sẽ thay đổi nó thành hình con rùa. Bằng cách này khi tôi chạy mã của mình, + +55 +00:03:42,520 --> 00:03:45,610 +bạn có thể thấy một con rùa thực sự xuất hiện trên màn hình. + +56 +00:03:45,670 --> 00:03:49,510 +Nó chỉ làm cho nó dễ dàng hơn một chút để hình dung những gì + +57 +00:03:49,510 --> 00:03:53,290 +đang xảy ra với mô-đun này. Bây giờ, tất nhiên bạn có thể thay đổi nó thành bất + +58 +00:03:53,380 --> 00:03:57,610 +kỳ cái nào khác, hãy kiểm tra nó và xem nó có hoạt động không. Trong một thế giới lý tưởng, + +59 +00:03:57,640 --> 00:04:02,640 +bạn sẽ đọc qua toàn bộ tài liệu của một mô-đun trước khi bắt đầu + +60 +00:04:02,650 --> 00:04:05,170 +sử dụng nó. Nhưng tất nhiên, trong thế + +61 +00:04:05,170 --> 00:04:08,110 +giới thực, chúng ta đều biết rằng điều đó không hoàn toàn khả thi. + +62 +00:04:08,680 --> 00:04:13,030 +Thông thường, bạn sẽ cần sự trợ giúp của Stack Overflow. Ví dụ, nếu chúng tôi muốn + +63 +00:04:13,060 --> 00:04:18,060 +xem hình ảnh con rùa và chúng tôi muốn thay đổi hình dạng + +64 +00:04:19,980 --> 00:04:21,420 +của con rùa. + +65 +00:04:22,500 --> 00:04:26,310 +0: Sau đó, bạn có thể thấy rằng khi bạn thực sự tìm kiếm + +66 +00:04:26,310 --> 00:04:30,690 +điều này bên trong thanh tìm kiếm Stack Overflow, kết quả của bạn không phù hợp lắm. + +67 +00:04:31,260 --> 00:04:36,260 +Nhưng nếu tôi đặt cùng một truy vấn vào google. com và ở cuối tôi gắn thẻ từ + +68 +00:04:37,530 --> 00:04:41,490 +khóa Stack Overflow, chúng tôi nhận được kết quả có liên quan hơn nhiều. + +69 +00:04:41,610 --> 00:04:43,950 +Vì vậy, nếu chúng ta xem bài đăng này, + +70 +00:04:44,010 --> 00:04:48,090 +bạn có thể thấy rằng nó đang bắt đầu nói về phương pháp hình dạng này. + +71 +00:04:48,600 --> 00:04:52,740 +Và ở dưới đây, câu trả lời này thậm chí còn liên kết đến phần liên quan + +72 +00:04:53,100 --> 00:04:57,150 +của tài liệu mà chúng ta đã thấy trước đây, phương pháp hình dạng này. + +73 +00:04:57,600 --> 00:05:02,600 +Ý tưởng là bạn có thể cần phải Google xung quanh để xem cách đạt được một điều nhất định + +74 +00:05:02,940 --> 00:05:03,960 +bạn muốn làm. + +75 +00:05:04,410 --> 00:05:07,710 +Và sau khi bạn đã thấy một số phương pháp mà họ + +76 +00:05:07,710 --> 00:05:08,543 +đã đề + +77 +00:05:08,580 --> 00:05:13,470 +cập trong câu trả lời, hãy truy cập tài liệu và đọc nó để thực sự hiểu nó + +78 +00:05:13,470 --> 00:05:18,120 +làm gì và sử dụng nó như thế nào. Trở lại với con rùa của chúng ta, nếu chúng ta muốn + +79 +00:05:18,240 --> 00:05:22,200 +thay đổi màu sắc của con rùa thì sao? Chà, điều này + +80 +00:05:22,200 --> 00:05:26,550 +sẽ khá dễ dàng. Chúng ta có thể thấy rằng trong phần + +81 +00:05:26,850 --> 00:05:31,850 +điều khiển màu, chúng ta có thể sử dụng phương pháp màu này để thiết lập màu bút và màu tô. + +82 +00:05:32,880 --> 00:05:36,600 +Vì vậy, ví dụ, chúng ta có thể nói timmy_the_turtle. màu, và chúng ta có thể + +83 +00:05:36,870 --> 00:05:39,180 +đặt một chuỗi ở đây như màu đỏ. + +84 +00:05:39,690 --> 00:05:42,000 +Vì vậy, bây giờ khi tôi chạy mã của + +85 +00:05:42,330 --> 00:05:47,330 +mình, bạn có thể thấy rằng timmy rùa của tôi bây giờ là màu đỏ thay vì màu mặc định trước + +86 +00:05:48,660 --> 00:05:50,760 +đây là màu đen. Bây giờ, làm cách + +87 +00:05:50,760 --> 00:05:55,140 +nào để biết tôi có thể sử dụng màu nào ngoài những màu được hiển thị trong ví dụ, màu đỏ + +88 +00:05:55,170 --> 00:05:57,350 +hoặc màu xanh lá cây? Vâng, nó nói + +89 +00:05:57,350 --> 00:06:02,350 +rằng khi chúng ta muốn thay đổi màu sắc bằng cách sử dụng một chuỗi màu hoặc + +90 +00:06:02,690 --> 00:06:07,190 +một màu RGB, thì nó sẽ chấp nhận các đầu vào như trong màu bút. + +91 +00:06:07,220 --> 00:06:12,220 +Vì vậy, về cơ bản nó nói rằng nó đang sử dụng phương pháp này để thiết lập màu sắc. Và phương thức này lấy + +92 +00:06:12,560 --> 00:06:16,880 +màu từ một chuỗi thông số kỹ thuật màu Tk. + +93 +00:06:17,300 --> 00:06:19,700 +Vì vậy, hãy Google và xem đó là gì. + +94 +00:06:21,950 --> 00:06:23,300 +Nếu chúng tôi nhấp vào + +95 +00:06:23,330 --> 00:06:28,330 +liên kết đầu tiên, bạn có thể thấy nó đưa chúng tôi đến các chuỗi và chúng tôi có một loạt + +96 +00:06:28,610 --> 00:06:31,160 +các tên và giá trị RGB tương ứng của chúng. + +97 +00:06:31,640 --> 00:06:34,610 +Vậy chính xác thì Tk này là gì? + +98 +00:06:35,390 --> 00:06:39,170 +Tk là viết tắt của tkinter module, là + +99 +00:06:39,200 --> 00:06:40,820 +giao diện Tk. + +100 +00:06:40,910 --> 00:06:45,200 +Và đây là một trong những cách mà bạn có thể sử dụng Python để tạo + +101 +00:06:45,200 --> 00:06:48,350 +giao diện người dùng đồ họa, còn được gọi là GUI. + +102 +00:06:48,680 --> 00:06:52,520 +Nếu bạn nghĩ về thời kỳ đầu của lịch sử máy tính, nếu bạn nghĩ + +103 +00:06:53,060 --> 00:06:55,340 +về chiếc Apple Lisa, đó là chiếc máy tính + +104 +00:06:55,400 --> 00:06:59,270 +đầu tiên có giao diện người dùng đồ họa, nơi nó có một con chuột + +105 +00:06:59,270 --> 00:07:01,430 +và bạn có thể trỏ và nhấp. + +106 +00:07:01,820 --> 00:07:04,100 +Và điều này là rất lớn trở lại trong ngày. + +107 +00:07:04,640 --> 00:07:08,480 +Nhưng trước đó chúng ta có các giao diện văn bản như MS-DOS hoặc như + +108 +00:07:08,480 --> 00:07:12,170 +bảng điều khiển của chúng ta khi chúng ta đang sử dụng Python. + +109 +00:07:12,770 --> 00:07:17,540 +Giao diện văn bản chấp nhận các lệnh văn bản và giao diện người dùng đồ họa có + +110 +00:07:17,540 --> 00:07:22,540 +thể hiển thị hình ảnh và cho phép bạn nhấp và kéo và thực hiện tất cả những điều + +111 +00:07:23,150 --> 00:07:28,150 +đó bằng cách nhìn thay vì chỉ nhập lệnh. Và tkinter là thứ mà mô-đun rùa thực + +112 +00:07:29,810 --> 00:07:34,460 +sự dựa vào để tạo ra những đồ họa này, giống như con rùa của + +113 +00:07:34,700 --> 00:07:36,860 +chúng ta hiển thị ở đây. + +114 +00:07:37,790 --> 00:07:40,520 +Vì vậy, bây giờ chúng ta đã biết những cái tên này đến + +115 +00:07:40,970 --> 00:07:45,970 +từ đâu, một cách dễ dàng hơn nhiều để sử dụng những màu này là thông qua một trang mà tất cả chúng + +116 +00:07:46,550 --> 00:07:50,030 +đã được hiển thị trên màn hình. Vì vậy, trong tài nguyên khóa học, chúng + +117 +00:07:50,060 --> 00:07:54,680 +tôi liên kết đến trang này, nơi bạn có thể thấy tất cả các màu bên cạnh tên của chúng và bạn + +118 +00:07:54,920 --> 00:07:57,290 +có thể chọn và chọn bất kỳ màu nào bạn muốn. + +119 +00:07:57,980 --> 00:08:02,980 +Hãy thử thay đổi màu sắc của con rùa bằng cách sử dụng một trong những màu này mà bạn nhìn + +120 +00:08:03,050 --> 00:08:04,040 +thấy trên màn hình. + +121 +00:08:05,390 --> 00:08:09,710 +Bây giờ chúng ta đã thấy cách chúng ta có thể tạo ra một con rùa mới và thay đổi diện mạo của nó, đã đến + +122 +00:08:09,980 --> 00:08:14,750 +lúc xem cách chúng ta có thể khiến nó làm những việc nhất định. Trong tài liệu, bạn có + +123 +00:08:14,780 --> 00:08:18,620 +thể thấy có rất nhiều thứ bạn có thể + +124 +00:08:18,620 --> 00:08:23,600 +làm về di chuyển và vẽ. Một cách rất đơn giản là di chuyển nó về phía trước hoặc di chuyển nó về phía sau. + +125 +00:08:26,570 --> 00:08:30,590 +Vì vậy, chúng ta có thể yêu cầu nó di chuyển về phía trước một trăm bước. + +126 +00:08:31,310 --> 00:08:33,980 +Và khi chúng tôi chạy lại mã, đây là những gì chúng tôi thấy. + +127 +00:08:35,059 --> 00:08:39,110 +Vì vậy, chúng ta có thể làm cho nó di chuyển về phía trước, di chuyển về phía sau + +128 +00:08:39,110 --> 00:08:43,400 +và cũng có thể di chuyển sang trái và phải. Vì vậy, ở đây, đầu vào mà nó + +129 +00:08:43,490 --> 00:08:48,490 +cần là một góc, một số từ 0 đến 360 để cho biết góc nào để rẽ + +130 +00:08:48,740 --> 00:08:51,530 +phải hoặc rẽ trái. Ví dụ, hiện tại con + +131 +00:08:51,560 --> 00:08:56,100 +rùa của chúng ta đang quay mặt về hướng Đông. Vì vậy, nếu chúng ta muốn quay mặt 2: Nam, thì + +132 +00:08:56,310 --> 00:08:56,960 +chúng ta + +133 +00:08:56,960 --> 00:09:01,670 +phải làm cho nó quay sang phải một góc 90 độ. Vì vậy, chúng ta có + +134 +00:09:01,910 --> 00:09:05,090 +thể nói, timmy_the_turtle. phải và sau đó chúng tôi đặt 90 ở đây. + +135 +00:09:06,380 --> 00:09:10,400 +Và đó là những gì nó trông như thế nào. Trong các bài học sắp tới, + +136 +00:09:10,430 --> 00:09:13,820 +chúng tôi có rất nhiều thử thách rùa dành cho bạn, + +137 +00:09:14,300 --> 00:09:18,290 +sẽ kiểm tra không chỉ kiến thức về lập trình mà bạn đã học + +138 +00:09:18,290 --> 00:09:23,150 +cho đến nay, mà còn kiểm tra mức độ bạn có thể đọc và hiểu tài liệu. + +139 +00:09:23,630 --> 00:09:28,630 +Đây là kỹ năng quan trọng cần có với tư cách là một nhà phát triển dày dạn kinh nghiệm bởi vì suy cho cùng, chúng ta không phải + +140 +00:09:29,390 --> 00:09:32,030 +lúc nào cũng dựa vào người khác chỉ bảo chúng ta phải làm gì. + +141 +00:09:32,060 --> 00:09:34,070 +Chúng tôi phải có thể lấy nó từ nguồn. + +142 +00:09:34,490 --> 00:09:38,420 +Vì vậy, hãy đảm bảo rằng bạn đã có tài liệu được kéo lên và + +143 +00:09:38,450 --> 00:09:39,283 +xem qua nó. + +144 +00:09:39,320 --> 00:09:42,950 +Sau đó, bạn có thể chuyển sang bài học tiếp theo và bắt đầu giải quyết một số + +145 +00:09:42,950 --> 00:09:43,783 +thách thức này. + +146 +00:09:44,390 --> 00:09:48,770 +Bây giờ hãy nhớ rằng một số trong những thách thức này có thể khá khó khăn, nhưng + +147 +00:09:49,130 --> 00:09:53,180 +hãy nhớ rằng cuộc đấu tranh là tốt. Bạn càng đấu tranh nhiều, bạn càng trở + +148 +00:09:53,180 --> 00:09:55,940 +nên mạnh mẽ hơn. Hẹn gặp lại các bạn vào bài học tiếp theo. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Challenge-1-Draw-a-Square-Starting-Code.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Challenge-1-Draw-a-Square-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..58ab17a7bf98dee7c05cb673e03f39409fd8fcc9 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Challenge-1-Draw-a-Square-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-1-start \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Solution-to-Challenge-1.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Solution-to-Challenge-1.url new file mode 100644 index 0000000000000000000000000000000000000000..b809e36d2f52ea15a5d460b0363194f0356650d3 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Solution-to-Challenge-1.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-1-end \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Turtle Challenge 1 - Draw a Square.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Turtle Challenge 1 - Draw a Square.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ab24bb298c67bbbc55a9223e1eeb77db84afad58 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Turtle Challenge 1 - Draw a Square.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f85a54c6a19984a04a156d95492a92aa305ee0026e4b4ad295dcc3f9ae46d9f3 +size 8617798 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Turtle Challenge 1 - Draw a Square_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Turtle Challenge 1 - Draw a Square_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..75f2dc8c0c366b6ad094b683215f8a116ab78a9a --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/003 Turtle Challenge 1 - Draw a Square_vi.srt @@ -0,0 +1,164 @@ +1 +00:00:00,420 --> 00:00:01,050 +Được rồi. Bây + +2 +00:00:01,050 --> 00:00:05,460 +giờ, thử thách con rùa đầu tiên mà tôi dành cho bạn khá dễ dàng. + +3 +00:00:05,490 --> 00:00:09,060 +Nó giống như thực hiện các động tác kéo căng của bạn trước khi + +4 +00:00:09,060 --> 00:00:14,040 +chúng ta bắt đầu với bài tập phù hợp. Vì vậy, trong thử thách này, bạn sẽ sử dụng con rùa để vẽ một hình vuông. + +5 +00:00:14,400 --> 00:00:17,610 +Nó sẽ là một hình vuông đơn giản 100 x 100 và không quan + +6 +00:00:18,060 --> 00:00:19,980 +trọng nó nằm ở đâu trên màn hình. + +7 +00:00:20,250 --> 00:00:24,000 +Miễn là bạn có thể rút ra được điều này, thì hãy coi như bạn đã thành công. + +8 +00:00:24,600 --> 00:00:27,300 +Tạm dừng video, đọc qua tài liệu, suy + +9 +00:00:27,330 --> 00:00:30,510 +nghĩ về thử thách và tiếp tục và hoàn thành nó. + +10 +00:00:34,590 --> 00:00:34,920 +Được rồi. + +11 +00:00:34,920 --> 00:00:38,370 +Vì vậy, tôi sẽ bình luận về các dòng mã trước + +12 +00:00:38,370 --> 00:00:39,960 +đó ngoài dòng mà + +13 +00:00:39,960 --> 00:00:43,890 +chúng tôi đã tạo timmy_ the_turtle. Bây giờ để vẽ một hình vuông là khá đơn giản. + +14 +00:00:43,920 --> 00:00:48,240 +Tất cả những gì chúng ta phải làm là làm cho nó đi về phía trước một trăm + +15 +00:00:48,570 --> 00:00:52,470 +bước, và sau đó chúng ta rẽ trái hoặc rẽ phải một góc 90 độ. + +16 +00:00:52,890 --> 00:00:57,890 +Và sau đó chúng ta lặp lại quá trình này một lần cho mỗi bên. + +17 +00:00:58,320 --> 00:00:59,760 +Và khi chúng tôi chạy mã, bây + +18 +00:00:59,820 --> 00:01:04,680 +giờ bạn có thể thấy nó vẽ một hình vuông đơn giản. Tất nhiên, bây giờ, bởi vì chúng ta + +19 +00:01:04,680 --> 00:01:07,410 +là lập trình viên, lười biếng và chúng ta không + +20 +00:01:07,410 --> 00:01:11,970 +thích nhìn mã lặp lại, một cách đơn giản hơn nhiều để làm điều này là chỉ + +21 +00:01:11,970 --> 00:01:13,920 +cần tạo một vòng lặp for. + +22 +00:01:14,280 --> 00:01:19,280 +Và chúng ta sẽ sử dụng toán tử phạm vi để nói rằng vòng lặp này sẽ chạy bốn + +23 +00:01:19,830 --> 00:01:23,040 +lần và sau đó hãy thụt lề hai dòng mã này. + +24 +00:01:23,490 --> 00:01:26,640 +Và bây giờ nó sẽ hoạt động giống hệt như trước + +25 +00:01:26,940 --> 00:01:31,140 +đây nhưng lần này chúng ta chỉ phải viết ba dòng mã thay vì một triệu. + +26 +00:01:31,350 --> 00:01:33,720 +Đây có lẽ là giải pháp tốt nhất, nhưng + +27 +00:01:33,810 --> 00:01:38,340 +tôi cũng sẽ áp dụng giải pháp này vì suy cho cùng thì chúng ta cũng chỉ + +28 +00:01:38,370 --> 00:01:42,240 +đang khởi động thôi phải không? Bây giờ, trong khi thực hiện bài + +29 +00:01:42,270 --> 00:01:46,260 +tập đó, bạn có thể nhận ra rằng thực sự rất khó khăn khi tiếp tục gọi + +30 +00:01:46,260 --> 00:01:49,590 +đối tượng của chúng ta là timmy_the_turtle bằng một cái tên dài như vậy. + +31 +00:01:50,100 --> 00:01:52,710 +Nhưng bây giờ chúng tôi đã viết nó thành rất nhiều dòng, + +32 +00:01:52,770 --> 00:01:55,020 +đặc biệt nếu bạn đã tạo phiên bản mã này, + +33 +00:01:55,410 --> 00:01:58,920 +thực sự khá khó khăn khi xem qua từng dòng và thay đổi tên của nó. + +34 +00:01:59,400 --> 00:02:00,840 +Hãy nhớ rằng trong PyCharm, chúng tôi + +35 +00:02:00,840 --> 00:02:05,370 +có một cách thực sự đơn giản để thay đổi tên của một biến hoặc một hàm, về cơ bản là bất kỳ + +36 +00:02:05,550 --> 00:02:09,840 +thứ gì mà chúng tôi đã tự đặt tên cho mình. Tất cả những gì chúng ta phải làm là nhấp chuột phải + +37 +00:02:09,840 --> 00:02:12,300 +vào tên, cấu trúc lại và đổi tên, và chúng ta có thể thay đổi + +38 +00:02:12,630 --> 00:02:17,100 +nó thành một cái gì đó thực sự đơn giản như Tim chẳng hạn. Bây giờ chúng tôi đã làm cho mã + +39 +00:02:17,100 --> 00:02:21,600 +của chúng tôi trông đơn giản hơn rất nhiều chỉ bằng cách thực hiện một việc đó. + +40 +00:02:22,500 --> 00:02:25,440 +Tôi sẽ cố gắng nhắc bạn về một số phím tắt này khi chúng ta tiếp + +41 +00:02:25,860 --> 00:02:28,530 +tục, nhưng khi bạn đã sẵn sàng, hãy bắt đầu thử thách tiếp theo. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/004 Importing Modules, Installing Packages, and Working with Aliases.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/004 Importing Modules, Installing Packages, and Working with Aliases.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3ee8f8efda5422aa821e0f28dbc39b84896bff1a --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/004 Importing Modules, Installing Packages, and Working with Aliases.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72d79e7d0e5951c6a9ca2848599ebd7a3dec67b21c3c137da453f1c366a4b5e8 +size 63882126 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/004 Importing Modules, Installing Packages, and Working with Aliases_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/004 Importing Modules, Installing Packages, and Working with Aliases_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..80f644afdd6d64d77bf808eb913baabd0782321e --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/004 Importing Modules, Installing Packages, and Working with Aliases_vi.srt @@ -0,0 +1,484 @@ +1 +00:00:00,330 --> 00:00:04,500 +Vì vậy, chúng tôi đang nhập mô-đun rùa để sử dụng nó trong mã của chúng tôi. + +2 +00:00:05,010 --> 00:00:09,450 +Vì vậy, tôi muốn dành một vài phút để nói nhanh về tất cả các cách mà chúng + +3 +00:00:09,450 --> 00:00:10,770 +ta có thể nhập mô-đun. + +4 +00:00:10,940 --> 00:00:15,940 +1: [không nghe được] 0: Bạn đã thấy thao tác nhập + +5 +00:00:18,380 --> 00:00:21,740 +cơ bản và nó rất đơn giản. + +6 +00:00:21,740 --> 00:00:23,480 +Chúng tôi có nhập từ khóa và + +7 +00:00:23,750 --> 00:00:26,300 +sau đó chúng tôi có tên mô-đun mà chúng tôi muốn nhập. + +8 +00:00:27,320 --> 00:00:31,580 +Vì vậy, nếu chúng ta chỉ nhập mô-đun rùa của mình bằng cách nhập + +9 +00:00:32,000 --> 00:00:34,280 +đơn giản, thì để tạo một con + +10 +00:00:34,640 --> 00:00:39,620 +rùa mới, chúng ta sẽ phải nói tên mô-đun và sau đó là tên của lớp. + +11 +00:00:40,100 --> 00:00:42,290 +Và chúng tôi sẽ tạo ra một con rùa mới như thế này. + +12 +00:00:49,970 --> 00:00:50,630 +1: Bây + +13 +00:00:50,630 --> 00:00:54,170 +giờ điều này, hoàn toàn ổn, nhưng sẽ thuận tiện hơn rất nhiều + +14 +00:00:54,200 --> 00:00:59,120 +nếu chúng ta sử dụng lớp rùa đó rất nhiều để viết mã của chúng ta như thế này. + +15 +00:00:59,660 --> 00:01:04,099 +Bằng cách này, chúng tôi không phải tiếp tục viết rùa. Con rùa hoặc con rùa. + +16 +00:01:04,129 --> 00:01:07,580 +bất cứ điều gì khác mà chúng tôi muốn nhập. Và mã này một + +17 +00:01:07,610 --> 00:01:11,240 +lần nữa khá đơn giản. Chúng tôi có từ khóa from, chúng tôi + +18 +00:01:11,570 --> 00:01:13,160 +có nhập từ khóa, chúng tôi + +19 +00:01:13,280 --> 00:01:16,280 +có tên mô-đun, và cả thứ trong mô-đun mà chúng tôi muốn nhập. + +20 +00:01:17,570 --> 00:01:21,110 +Như bạn đã thấy với loại cú pháp này, chúng ta có thể đơn giản viết ... + +21 +00:01:24,440 --> 00:01:27,890 +Và điều này có nghĩa là nếu chúng ta tạo ra rất nhiều rùa, giả + +22 +00:01:27,980 --> 00:01:30,680 +sử thay vì chỉ tạo thời gian, chúng ta cũng tạo + +23 +00:01:32,690 --> 00:01:33,800 +ra tom và terry. + +24 +00:01:34,340 --> 00:01:41,180 +Vậy thì chúng ta không cần phải tiếp tục viết rùa nữa. Rùa, rùa. + +25 +00:01:41,180 --> 00:01:41,180 +Rùa mỗi lần một. + +26 +00:01:41,660 --> 00:01:44,510 +Vì vậy, điều này từ nhập thực sự hữu ích + +27 +00:01:44,510 --> 00:01:48,890 +nếu bạn đang sử dụng thứ mà bạn đang nhập rất nhiều và bạn không muốn + +28 +00:01:48,890 --> 00:01:51,320 +tiếp tục viết tên của mô-đun trước nó. + +29 +00:01:51,740 --> 00:01:55,430 +Bây giờ bạn thực sự có thể tiến thêm một bước nữa. Thay vì nói chỉ + +30 +00:01:55,430 --> 00:01:58,640 +nhập từ rùa bất cứ thứ gì bạn muốn, + +31 +00:01:59,000 --> 00:02:04,000 +bạn thực sự có thể nhập mọi thứ bằng cách sử dụng asterix. + +32 +00:02:06,020 --> 00:02:10,759 +Bây giờ bạn có thể sử dụng mọi thứ trong mô-đun đó như thể + +33 +00:02:10,759 --> 00:02:14,870 +nó ở trong tệp hiện tại. Và điều này có ưu điểm + +34 +00:02:15,410 --> 00:02:20,410 +cũng như nhược điểm bởi vì nó có thể khiến bạn thực sự khó biết từng + +35 +00:02:20,630 --> 00:02:25,580 +lớp hoặc phương thức này đến từ đâu. Vì vậy, ví dụ, nếu tôi vừa viết về phía trước, bạn có thể thấy, tôi có thể, + +36 +00:02:25,580 --> 00:02:26,420 +tôi có thể làm điều này. + +37 +00:02:26,720 --> 00:02:31,720 +Nhưng thực sự khó hiểu khi chỉ nhìn thấy phương pháp này ở đâu đó tách biệt bởi vì nó giống + +38 +00:02:32,600 --> 00:02:36,380 +như, tốt, điều gì đang tiến lên? Điều gì đang thực sự xảy ra, điều + +39 +00:02:36,380 --> 00:02:37,550 +này đến từ đâu? + +40 +00:02:39,230 --> 00:02:43,640 +Và rõ ràng hơn khi bạn nhập một mô-đun như ngẫu nhiên. + +41 +00:02:43,640 --> 00:02:46,520 +Vì vậy, từ việc nhập ngẫu nhiên mọi thứ, và sau đó ở + +42 +00:02:47,180 --> 00:02:49,310 +một nơi khác trong mã của chúng tôi, chúng + +43 +00:02:49,340 --> 00:02:52,250 +tôi có thể chỉ cần viết một cái gì đó như lựa chọn. + +44 +00:02:52,490 --> 00:02:57,490 +Và đây là một phương pháp từ ngẫu nhiên, nơi chúng ta có thể chọn một mục ngẫu nhiên từ một + +45 +00:02:57,620 --> 00:03:01,060 +chuỗi, chẳng hạn như một danh sách. Bây giờ mã này hoạt + +46 +00:03:01,090 --> 00:03:04,990 +động nhưng nó thực sự khó hiểu. Giống như, lựa chọn này hoạt động như thế nào? + +47 +00:03:05,410 --> 00:03:10,150 +Nó đến từ đâu? Mô-đun nào cho phép khả năng này? Thay vào đó, chúng tôi + +48 +00:03:10,150 --> 00:03:13,150 +chỉ có phương thức ngay trong mã của chúng tôi và + +49 +00:03:13,510 --> 00:03:16,030 +nó rất khó hiểu về nguồn gốc của nó. + +50 +00:03:16,570 --> 00:03:18,370 +Vì vậy, giữa cộng đồng Python, + +51 +00:03:18,400 --> 00:03:22,210 +rất bất thường khi bạn sẽ thấy mã tốt được viết như thế này. + +52 +00:03:22,540 --> 00:03:26,890 +Tôi muốn bạn biết nó làm gì vì bạn có thể bắt gặp nó trong tự nhiên, chỉ để + +53 +00:03:27,130 --> 00:03:29,350 +bạn hiểu nó thực sự đang làm gì, + +54 +00:03:29,650 --> 00:03:32,410 +nhưng tôi muốn bạn thử và tránh viết mã như thế này. + +55 +00:03:32,860 --> 00:03:36,610 +Thay vào đó, nếu bạn đang sử dụng nội dung nào đó từ một mô-đun + +56 +00:03:36,610 --> 00:03:41,380 +nhiều lần, nhiều hơn ba lần, thì bạn có thể nghĩ đến việc sử dụng điều này từ quá trình nhập. + +57 +00:03:41,770 --> 00:03:44,080 +Nhưng nếu bạn chỉ sử dụng nó một hoặc hai lần, + +58 +00:03:44,320 --> 00:03:49,320 +thì chỉ cần nhập toàn bộ mô-đun và viết ra con rùa này. Turtle để bạn có thể thấy + +59 +00:03:49,380 --> 00:03:54,380 +rằng mô-đun này là mô-đun chứa lớp này và được nhập và chúng tôi + +60 +00:03:55,060 --> 00:03:58,540 +đang sử dụng nó để tạo đối tượng này. + +61 +00:03:59,110 --> 00:04:01,960 +Nó chỉ biểu đạt hơn rất nhiều về mặt mã. + +62 +00:04:09,240 --> 00:04:12,660 +Bây giờ, điều cuối cùng tôi muốn cho bạn thấy một điều khá hữu ích, đó là + +63 +00:04:12,870 --> 00:04:16,019 +cách đặt bí danh cho các mô-đun. Vì vậy, ví dụ, chúng + +64 +00:04:16,110 --> 00:04:19,500 +ta có thể nhập con rùa của mình dưới dạng t. + +65 +00:04:19,709 --> 00:04:24,710 +Vì vậy, những gì điều này làm là chúng tôi nhập từ mô-đun rùa và chúng tôi đặt cho mô-đun đó một tên bí + +66 +00:04:25,830 --> 00:04:27,930 +danh, vì vậy một tên mà chúng tôi xác định. + +67 +00:04:29,700 --> 00:04:33,630 +Và điều này có nghĩa là nếu bạn tạo đối tượng mới từ + +68 +00:04:33,630 --> 00:04:37,770 +mô-đun rùa, thay vì viết ra rùa mỗi lần, bạn chỉ có thể + +69 +00:04:37,980 --> 00:04:41,760 +viết t và nó sẽ đại diện cho toàn bộ mô-đun. + +70 +00:04:42,030 --> 00:04:45,360 +Vì vậy, đôi khi bạn sẽ có những mô-đun thực sự rất dài. + +71 +00:04:45,360 --> 00:04:49,350 +Vì vậy, nó có thể có một cái tên thực sự dài và bạn không muốn gõ nó + +72 +00:04:49,350 --> 00:04:50,183 +ra mỗi lần. + +73 +00:04:50,400 --> 00:04:54,780 +Vì vậy, bạn đặt cho nó một tên bí danh và nó sẽ giống hệt như tham chiếu + +74 +00:04:54,780 --> 00:04:56,490 +đến toàn bộ tên của mô-đun. + +75 +00:04:57,240 --> 00:05:00,990 +Và bạn có thể tạo ra một con rùa như thế này. Bây giờ, mặc dù + +76 +00:05:01,050 --> 00:05:03,330 +chúng tôi đã viết nhập, nhưng có + +77 +00:05:03,630 --> 00:05:07,170 +một số mô-đun mà bạn không thể chỉ nhập, phải không? + +78 +00:05:15,030 --> 00:05:19,560 +Vì vậy, ví dụ: nếu tôi muốn nhập mô-đun anh hùng, thứ mà + +79 +00:05:19,920 --> 00:05:24,920 +tôi có thể sử dụng để tạo tên anh hùng như Decepticon hoặc Leopardon, + +80 +00:05:26,160 --> 00:05:28,950 +hoặc Askew-Tronics, thì tôi có thể sử dụng + +81 +00:05:29,310 --> 00:05:33,390 +một trong các chức năng trong mô-đun đó, anh hùng, được + +82 +00:05:33,450 --> 00:05:35,310 +gọi là tạo . + +83 +00:05:35,940 --> 00:05:40,940 +Nhưng nếu tôi chỉ vào mã của mình và cố gắng nhập mô-đun được gọi là + +84 +00:05:42,420 --> 00:05:45,900 +anh hùng này, thì bạn có thể thấy tôi gặp lỗi. + +85 +00:05:46,290 --> 00:05:49,830 +Và lỗi cho biết, không có mô-đun nào có tên anh hùng. + +86 +00:05:50,580 --> 00:05:55,170 +Tại sao tôi không làm được điều này mà tôi có thể nhập rùa? + +87 +00:05:55,980 --> 00:06:00,620 +Lý do là vì rùa là một mô-đun được đóng gói với + +88 +00:06:00,620 --> 00:06:04,640 +thư viện chuẩn Python. Và đây là một thư viện mã nhỏ + +89 +00:06:04,940 --> 00:06:09,800 +chỉ chứa những điều cơ bản để giúp bạn bắt đầu như một bộ cốt lõi khi bạn mua một trò chơi + +90 +00:06:09,800 --> 00:06:14,150 +trên bàn cờ hoặc giống như những đoạn mã cơ bản khi bạn mua một bộ bánh xe nóng. + +91 +00:06:14,810 --> 00:06:19,130 +Vì vậy, bạn có thể hình dung thư viện mã này giống như một thư viện gia đình, + +92 +00:06:19,160 --> 00:06:22,580 +dễ dàng truy cập, nhưng rất nhỏ. Bây giờ, nếu chúng ta muốn + +93 +00:06:22,610 --> 00:06:27,140 +truy cập vào toàn bộ thế giới của các mô-đun và gói Python, thì chúng ta cần + +94 +00:06:27,530 --> 00:06:32,150 +phải đi đến một thư viện lớn hơn nhiều. Và tất nhiên, đó là các + +95 +00:06:32,150 --> 00:06:34,580 +gói Python, được lưu trữ trên internet + +96 +00:06:34,880 --> 00:06:39,470 +và chúng ta có thể cài đặt vào dự án của mình khi + +97 +00:06:39,470 --> 00:06:41,540 +nào cần. Vì vậy, theo + +98 +00:06:41,540 --> 00:06:46,540 +cách này, dự án cuối cùng của chúng tôi không trở nên quá lớn vì chúng tôi đã tải tất + +99 +00:06:46,640 --> 00:06:48,260 +cả các mô-đun vào nó từ internet. + +100 +00:06:48,560 --> 00:06:51,860 +Thay vào đó, chúng tôi chỉ cắm và chạy bất cứ thứ gì chúng tôi cần. + +101 +00:06:52,760 --> 00:06:57,050 +Vì vậy, PyCharm thực sự đã đủ thông minh để biết rằng tôi có thể muốn một mô-đun + +102 +00:06:57,320 --> 00:06:58,670 +mà tôi chưa cài đặt. + +103 +00:06:59,150 --> 00:07:03,740 +Và bạn có thể thấy rằng ngay sau khi tôi nhấp vào lỗi này với gạch dưới màu đỏ, tôi + +104 +00:07:04,250 --> 00:07:08,480 +nhận được một bóng đèn màu đỏ ở đây. Và nếu tôi nhấp vào nó, nó + +105 +00:07:08,550 --> 00:07:12,440 +sẽ cho tôi lời nhắc cài đặt gói này có tên là anh hùng. + +106 +00:07:12,950 --> 00:07:14,180 +Và sau khi hoàn thành, chúng ta + +107 +00:07:14,360 --> 00:07:19,360 +thực sự có thể khai thác vào mô-đun này và có thể nói là anh hùng. gen. + +108 +00:07:20,780 --> 00:07:24,200 +Và điều này sẽ tạo ra cho chúng ta một tên anh hùng mới. + +109 +00:07:24,830 --> 00:07:27,080 +Vì vậy, hãy tiếp tục và chạy mã của chúng tôi. + +110 +00:07:30,460 --> 00:07:33,820 +Và bạn có thể thấy chúng tôi có một cái tên là + +111 +00:07:33,850 --> 00:07:35,680 +Galvatron, thực ra không tệ. + +112 +00:07:36,880 --> 00:07:41,410 +Vì vậy, điều quan trọng cần nhớ là khi bạn cố gắng nhập một thứ gì đó chưa được + +113 +00:07:41,410 --> 00:07:44,440 +cài đặt, chẳng hạn như gói nhân vật phản diện này, thì + +114 +00:07:44,800 --> 00:07:46,540 +khi bạn cố gắng chạy mã, + +115 +00:07:46,840 --> 00:07:50,230 +bạn sẽ gặp lỗi không có mô-đun nào có tên nhân vật phản diện. + +116 +00:07:50,770 --> 00:07:53,050 +Và điều này sẽ khiến bạn suy nghĩ, à, + +117 +00:07:53,080 --> 00:07:57,460 +có thể mô-đun đó không phải là một phần của thư viện chuẩn Python như rùa và + +118 +00:07:57,760 --> 00:07:59,710 +tôi thực sự phải cài đặt nó. + +119 +00:08:00,220 --> 00:08:03,100 +Chỉ cần nhớ rằng trước khi bạn có thể nhập một mô-đun + +120 +00:08:03,280 --> 00:08:06,670 +đôi khi nếu nó không được đóng gói với thư viện chuẩn Python, thì bạn + +121 +00:08:07,030 --> 00:08:08,710 +có thể phải cài đặt nó. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Challenge-2-Draw-a-Dashed-Line-Starting-Code.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Challenge-2-Draw-a-Dashed-Line-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..adce71bb93604bd0fdd472d6a81ae80feef39995 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Challenge-2-Draw-a-Dashed-Line-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-2-start \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Solution-to-Challenge-2.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Solution-to-Challenge-2.url new file mode 100644 index 0000000000000000000000000000000000000000..bbb9e66eb583617196c3e9490ebe9b8d0e2e20ea --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Solution-to-Challenge-2.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-2-end \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Turtle Challenge 2 - Draw a Dashed Line.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Turtle Challenge 2 - Draw a Dashed Line.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8d39dcdb3311142df76b8ba82142e93abe9bb459 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Turtle Challenge 2 - Draw a Dashed Line.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe7d2b70b353fbdab83e562ea4088c0a3b3346baac1a59c9e45c0626d37ee8e9 +size 33479594 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Turtle Challenge 2 - Draw a Dashed Line_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Turtle Challenge 2 - Draw a Dashed Line_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..10c44bbbbbc93ef907ef2bc04648c7f664eae3c3 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/005 Turtle Challenge 2 - Draw a Dashed Line_vi.srt @@ -0,0 +1,168 @@ +1 +00:00:00,390 --> 00:00:03,480 +Được rồi. Chuyển sang thử thách rùa tiếp theo. + +2 +00:00:03,990 --> 00:00:06,960 +Vì vậy, cái này sẽ chuyên sâu hơn một chút, nhưng + +3 +00:00:06,990 --> 00:00:08,880 +vẫn còn một chút khởi động. + +4 +00:00:08,910 --> 00:00:13,910 +Vì vậy, chúng ta sẽ chỉ chạy bộ nhẹ và chúng ta sẽ vẽ một đường đứt nét. + +5 +00:00:15,150 --> 00:00:18,720 +Bạn sẽ yêu cầu con rùa của bạn vẽ một đường thẳng như thế này, + +6 +00:00:19,050 --> 00:00:24,000 +trong đó nó sẽ vẽ một đường thẳng trong 10 bước và sau đó là khoảng cách 10 bước và sau đó + +7 +00:00:24,360 --> 00:00:26,400 +là một đường liền nét trong 10 bước + +8 +00:00:26,400 --> 00:00:30,150 +một lần nữa và nó sẽ lặp lại điều này cho đến khi nó 50 lần này. + +9 +00:00:30,720 --> 00:00:33,270 +Chiều dài thực tế của đoạn thẳng không thực + +10 +00:00:33,630 --> 00:00:37,260 +sự quan trọng, chiều dài thực tế của mỗi phần không thực sự quan trọng. + +11 +00:00:37,260 --> 00:00:41,580 +Điều thực sự quan trọng là bạn có thể làm cho điều hòa - không rút + +12 +00:00:41,580 --> 00:00:44,850 +xen kẽ này diễn ra. Để hoàn thành thử + +13 +00:00:44,880 --> 00:00:49,880 +thách này, bạn sẽ cần xem qua tài liệu và có thể sử dụng sự + +14 +00:00:50,760 --> 00:00:55,230 +trợ giúp của Google hoặc Stack Overflow và tìm ra cách bạn có thể + +15 +00:00:55,230 --> 00:01:00,090 +làm cho hành vi này xảy ra. Hãy suy nghĩ về nó và tạm dừng video và hoàn thành thử thách. + +16 +00:01:03,000 --> 00:01:06,330 +Được rồi. Vì vậy, nếu chúng ta xem + +17 +00:01:06,720 --> 00:01:11,550 +qua mục lục ở đây, chúng ta có thể thấy rằng thứ điều khiển cây bút nằm trong phần này. + +18 +00:01:11,670 --> 00:01:15,660 +Chúng tôi có thể kiểm soát bản vẽ, màu sắc, tô màu và hơn thế nữa. + +19 +00:01:16,080 --> 00:01:18,960 +Bây giờ nếu chúng ta nhìn vào điều khiển bản vẽ, bạn có thể thấy + +20 +00:01:18,960 --> 00:01:23,790 +chúng ta có thể đặt nó xuống và đặt bút lên. Khi chúng ta kéo bút xuống, điều đó có + +21 +00:01:23,970 --> 00:01:27,450 +nghĩa là bút nằm trên giấy và nó sẽ tạo ra một dấu hiệu. + +22 +00:01:27,840 --> 00:01:32,370 +Nhưng khi cây bút được kéo lên, sẽ không có hình vẽ nào xảy ra khi con + +23 +00:01:32,610 --> 00:01:34,740 +rùa của chúng ta đang di chuyển. + +24 +00:01:35,700 --> 00:01:39,270 +Điều đó có nghĩa là chúng ta có thể viết một số loại vòng lặp, phải không? + +25 +00:01:39,270 --> 00:01:44,070 +Khi chúng ta làm cho con rùa của chúng ta di chuyển về phía trước 10 bước + +26 +00:01:44,640 --> 00:01:48,720 +và sau đó chúng ta có thể lấy nó để kéo bút lên. + +27 +00:01:49,620 --> 00:01:54,300 +Và điều này sẽ làm là cho phép chúng ta tiến lên phía trước mà không cần vẽ. + +28 +00:01:54,720 --> 00:01:59,220 +Vì vậy, bây giờ, trong khi cây bút được cầm lên, chúng ta sẽ đi tiếp. Thêm 10 bước nữa, điều này + +29 +00:01:59,310 --> 00:02:03,420 +sẽ vẽ ra ô trống. Và cuối cùng, chúng ta sẽ + +30 +00:02:03,420 --> 00:02:06,000 +tiếp tục và đặt bút xuống một lần nữa. + +31 +00:02:07,890 --> 00:02:12,890 +Vì vậy, bây giờ, tất cả những gì chúng ta cần là lặp lại bốn bước này 15 lần để chúng ta + +32 +00:02:15,780 --> 00:02:20,280 +có thể viết một vòng lặp for và sau đó tạo một phạm vi từ 0 đến 15. + +33 +00:02:20,730 --> 00:02:25,730 +Và sau đó khi chúng tôi thụt lề khối này bên trong vòng lặp for và chạy mã của chúng tôi, thì + +34 +00:02:26,430 --> 00:02:29,340 +bạn có thể thấy nó vẽ đường đứt nét của chúng tôi. + +35 +00:02:30,030 --> 00:02:31,620 +Bạn đã quản lý để có được giải pháp này? + +36 +00:02:31,980 --> 00:02:36,420 +Bạn đã xoay xở để tìm phần liên quan của tài liệu để có thể kéo bút + +37 +00:02:36,420 --> 00:02:41,420 +lên và đặt bút xuống, hay bạn chỉ cần thay đổi mã của mình để nó vẽ màu đen + +38 +00:02:41,790 --> 00:02:45,840 +và sau đó nó vẽ màu trắng? Tất cả các giải pháp này đều + +39 +00:02:45,930 --> 00:02:50,930 +có hiệu quả, nhưng điều tôi thực sự muốn bạn làm là tìm hiểu tài liệu và tìm những + +40 +00:02:51,540 --> 00:02:54,360 +phần sẽ giúp bạn đạt được mục tiêu của mình. + +41 +00:02:55,710 --> 00:02:57,000 +Hãy chuyển sang bài học + +42 +00:02:57,120 --> 00:03:00,180 +tiếp theo và tôi có một thử thách khác hơi khó hơn cho bạn. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Challenge-3-Drawing-Different-Shapes-Starting-Code.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Challenge-3-Drawing-Different-Shapes-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..8b0db147565809eba45238c9104df0dfe121e4c9 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Challenge-3-Drawing-Different-Shapes-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-3-start \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Solution-to-Challenge-3.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Solution-to-Challenge-3.url new file mode 100644 index 0000000000000000000000000000000000000000..bbc31677072e4c446d2b22bf9c62f1bdfb9e2e71 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Solution-to-Challenge-3.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-3-end \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Turtle Challenge 3 - Drawing Different Shapes.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Turtle Challenge 3 - Drawing Different Shapes.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b575fedd0b0f94ab611ef35c7f0317bc3f472e1e --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Turtle Challenge 3 - Drawing Different Shapes.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf869455400f63bd1de0acdb088ad436eb3e973473920bf21f2b50323e0c28ab +size 52331635 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Turtle Challenge 3 - Drawing Different Shapes_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Turtle Challenge 3 - Drawing Different Shapes_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1f17a8319de9a242c532c2e3ad7be7eb0a555fbe --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/006 Turtle Challenge 3 - Drawing Different Shapes_vi.srt @@ -0,0 +1,332 @@ +1 +00:00:00,390 --> 00:00:03,969 +Được rồi, thử thách tiếp theo sẽ khó hơn một chút. + +2 +00:00:04,110 --> 00:00:10,200 +Nó giống như chúng ta đang ngồi lên bây giờ. Trong thử thách này, bạn sẽ vẽ một hình tam giác, hình vuông, + +3 +00:00:10,200 --> 00:00:13,950 +hình ngũ giác, hình lục giác, hình lục giác, hình bát giác, hình nonagon và hình lục giác. + +4 +00:00:14,220 --> 00:00:21,180 +Vì vậy, từ hình dạng ba cạnh đến hình dạng mười cạnh và mỗi hình dạng đó sẽ được vẽ + +5 +00:00:21,180 --> 00:00:26,340 +bằng một màu ngẫu nhiên và mỗi cạnh sẽ có chiều dài bằng 100, và + +6 +00:00:26,700 --> 00:00:34,470 +kết quả cuối cùng sẽ giống như thế này . Tất cả những hình dạng này chồng lên nhau và vẽ + +7 +00:00:34,470 --> 00:00:36,390 +ra theo trình tự. + +8 +00:00:37,140 --> 00:00:42,900 +Vì vậy, bạn sẽ phải suy nghĩ một chút về điều này vì chúng ta biết rằng một hình vuông có các góc 90 độ. + +9 +00:00:43,230 --> 00:00:48,980 +Vì vậy, chúng tôi có thể làm cho rô-bốt của mình tiến về phía trước và sau đó rẽ phải 90 độ và sau đó lại tiếp tục đi về phía trước. + +10 +00:00:49,470 --> 00:00:51,430 +Nhưng còn Lầu Năm Góc thì sao? + +11 +00:00:51,690 --> 00:00:52,890 +À, một hình + +12 +00:00:52,890 --> 00:00:56,210 +ngũ giác, mỗi góc có một góc 72 độ. + +13 +00:00:57,390 --> 00:00:59,330 +Vậy mối quan hệ thực tế là gì? + +14 +00:00:59,340 --> 00:01:00,570 +Làm thế nào chúng ta có thể giải quyết vấn đề này? + +15 +00:01:01,110 --> 00:01:05,700 +Chúng tôi biết rằng để quay một vòng tròn, nó là 360 độ. + +16 +00:01:06,150 --> 00:01:14,370 +Vì vậy, cách bạn tính ra góc của mỗi hình này là chia 360 cho số cạnh. + +17 +00:01:14,730 --> 00:01:17,410 +Vậy 360 chia cho năm là 72. + +18 +00:01:17,490 --> 00:01:20,700 +Vì vậy, mỗi góc là 72 độ. + +19 +00:01:21,570 --> 00:01:27,000 +Sử dụng kiến thức này và những gì bạn đã học về Turtle, hãy tiếp tục và xem liệu bạn có thể hoàn thành thử thách + +20 +00:01:27,000 --> 00:01:27,570 +này không. + +21 +00:01:27,750 --> 00:01:29,400 +Tạm dừng video ngay bây giờ và bắt đầu. + +22 +00:01:32,880 --> 00:01:36,840 +Được rồi, vì vậy tôi sẽ xóa mã trước đó và chúng ta sẽ viết mã + +23 +00:01:36,840 --> 00:01:43,560 +để vẽ tất cả các hình dạng này. Điều đầu tiên tôi muốn làm là tôi muốn đưa ra phương trình đó. Vì vậy, chúng ta biết + +24 +00:01:43,560 --> 00:01:51,550 +rằng nếu chúng ta có 360 độ chia cho số cạnh, thì chúng ta sẽ có góc, phải không? + +25 +00:01:51,780 --> 00:01:55,620 +Vì vậy, hãy lưu nó vào một biến gọi là góc. + +26 +00:01:56,520 --> 00:02:02,840 +Và sau đó tất cả những gì chúng ta phải làm là đưa robot + +27 +00:02:04,350 --> 00:02:13,800 +của chúng ta tiến lên 100 tuổi, chúng tôi nói. Và sau đó để làm cho nó rẽ phải và góc mà nó sẽ rẽ phải là góc + +28 +00:02:13,800 --> 00:02:16,320 +mà chúng tôi đã xác định ở trên cùng. + +29 +00:02:17,010 --> 00:02:22,680 +Vì vậy, sau đó chúng ta chỉ cần lặp lại điều này bao nhiêu lần khi chúng ta có số cạnh. + +30 +00:02:23,580 --> 00:02:25,830 +Vì vậy, chúng ta có thể tạo một vòng lặp for chẳng hạn. + +31 +00:02:27,520 --> 00:02:31,120 +Và phạm vi sẽ tính đến số lượng trang web. + +32 +00:02:32,650 --> 00:02:39,520 +Vì vậy, bây giờ nếu số lượng trang web bằng năm, giả sử chúng tôi đang cố gắng vẽ một hình ngũ + +33 +00:02:40,090 --> 00:02:42,050 +giác, thì đây sẽ là mã. + +34 +00:02:42,640 --> 00:02:44,170 +Vì vậy, hãy thay đổi điều đó theo. + +35 +00:02:44,530 --> 00:02:47,200 +Và bây giờ nếu chúng ta tiếp tục và chạy đoạn + +36 +00:02:48,680 --> 00:02:56,900 +mã này, bạn có thể thấy nó vẽ cho chúng ta một hình ngũ giác, một hình năm cạnh. Vậy làm thế nào chúng ta có thể làm cho vòng lặp này chạy cho + +37 +00:02:56,900 --> 00:02:58,220 +các phía khác nhau? + +38 +00:02:58,700 --> 00:03:07,550 +Làm thế nào chúng ta có thể đưa nó đi từ hình ba cạnh, hình tam giác, tất cả thành hình mười cạnh, hình lục giác? + +39 +00:03:08,780 --> 00:03:13,220 +Để làm được điều này, thay vì đặt tĩnh số cạnh như thế này, tại sao chúng + +40 +00:03:13,530 --> 00:03:16,700 +ta không tạo một hàm? Hãy gọi nó là draw_shape. + +41 +00:03:17,270 --> 00:03:24,470 +Và hàm này sẽ lấy số cạnh của hình dạng này làm đầu vào. + +42 +00:03:24,980 --> 00:03:29,660 +Và sau đó phần còn lại của mã này có thể được thụt vào bên trong hàm. + +43 +00:03:30,260 --> 00:03:33,890 +Và có lẽ sẽ hợp lý nếu chỉ tính toán góc một + +44 +00:03:34,130 --> 00:03:39,080 +lần khi chúng ta cần vẽ hình vì đối với số cạnh đã cho, góc đó sẽ + +45 +00:03:39,080 --> 00:03:41,340 +giống nhau trên toàn bộ hình dạng. + +46 +00:03:42,500 --> 00:03:48,950 +Ví dụ, nếu nó là một hình vuông thì chúng ta sẽ vẽ từ một đến bốn lần vẽ này bốn lần. + +47 +00:03:49,700 --> 00:03:56,960 +Vì vậy, bây giờ sau này, chúng ta có thể xác định một vòng lặp for khác và vòng lặp for này sẽ đi qua tất cả + +48 +00:03:56,960 --> 00:03:59,270 +số cạnh khác nhau mà chúng ta cần. + +49 +00:03:59,870 --> 00:04:06,560 +Bây giờ, nếu chúng ta muốn một dải số từ 3 đến 10, chúng ta thực sự cần viết + +50 +00:04:06,560 --> 00:04:10,700 +hàm 3, 11, vì số dừng bị loại trừ nên nó + +51 +00:04:10,710 --> 00:04:14,150 +sẽ dừng ở 10. Khi chúng tôi lặp lại phạm vi này. + +52 +00:04:14,570 --> 00:04:21,010 +shape_side_n này sẽ nhận giá trị tùy thuộc vào vị trí của chúng ta trong phạm vi. + +53 +00:04:21,350 --> 00:04:26,630 +Vì vậy, khi lần đầu tiên chúng ta vẽ cái này, chúng ta sẽ vẽ một hình tam giác có + +54 +00:04:26,630 --> 00:04:33,380 +ba cạnh để sau đó chúng ta có thể chuyển shape_side_n này vào hàm draw_shape của chúng ta và điều đó sẽ tăng từ 3 đến 10. + +55 +00:04:33,920 --> 00:04:40,970 +Vì vậy, hãy chạy mã của chúng ta và xem nó vẽ hình tam giác của chúng ta trước rồi đến hình vuông của chúng ta và sau đó nó cứ tiếp tục cho + +56 +00:04:40,970 --> 00:04:44,000 +đến khi nó vẽ được tất cả các hình dạng mà chúng ta cần. + +57 +00:04:45,020 --> 00:04:51,030 +Bây giờ, phần cuối cùng của thử thách là làm cho mỗi đường có một màu ngẫu nhiên khác nhau. + +58 +00:04:51,560 --> 00:04:53,090 +Vì vậy, làm thế nào chúng ta có thể làm điều này? + +59 +00:04:54,440 --> 00:04:59,270 +Vì vậy, tất nhiên, chúng tôi sẽ tìm đến người bạn tốt của chúng tôi là Google và chúng tôi sẽ + +60 +00:04:59,270 --> 00:05:01,140 +tìm kiếm màu sắc của rùa trong Python. + +61 +00:05:01,370 --> 00:05:08,510 +Lần đầu tiên tôi thử vào Google cái này mà không có con trăn, và tôi nhận được những màu sắc khác nhau của nhiều loài rùa, điều này + +62 +00:05:08,840 --> 00:05:10,280 +thực sự hấp dẫn nhưng + +63 +00:05:10,280 --> 00:05:11,980 +đó không phải là điều tôi muốn. + +64 +00:05:12,560 --> 00:05:14,270 +Vì vậy, nếu chúng ta xem + +65 +00:05:14,630 --> 00:05:21,260 +liên kết đầu tiên, liên kết này đến từ một trang web có tên là Trinket và nó có bảng màu tương tác này, nơi bạn + +66 +00:05:21,260 --> 00:05:27,740 +có thể chọn một trong những màu bạn thích và sau đó bạn sẽ nhận được tên con rùa, sau đó bạn có thể sao + +67 +00:05:27,740 --> 00:05:30,230 +chép và dán vào có thể là một danh sách. + +68 +00:05:30,740 --> 00:05:31,910 +Hãy gọi nó là màu sắc. + +69 +00:05:34,180 --> 00:05:39,940 +Và bạn có thể đặt bao nhiêu màu vào bảng màu này tùy thích, và bạn có thể mở rộng + +70 +00:05:39,940 --> 00:05:41,200 +hoặc ngắn tùy ý. + +71 +00:05:41,860 --> 00:05:44,490 +Vì vậy, đây là danh sách mà tôi đã tạo trước đó. + +72 +00:05:44,950 --> 00:05:55,990 +Và bây giờ, nếu chúng ta tiếp tục và đặt màu cho chú rùa của mình, vì vậy hãy tiếp tục lấy Tim và đặt màu của anh ấy thành màu ngẫu nhiên từ danh sách + +73 +00:05:56,020 --> 00:06:03,160 +này mà chúng ta biết là đơn giản như chỉ cần nhập mô-đun ngẫu nhiên và sau đó chúng ta có thể + +74 +00:06:03,550 --> 00:06:06,880 +nắm giữ của ngẫu nhiên. lựa chọn và sau đó bên + +75 +00:06:07,240 --> 00:06:14,080 +trong phương thức đó, chúng ta có thể chuyển vào danh sách các màu của mình để nó chọn một màu ngẫu nhiên từ danh + +76 +00:06:14,080 --> 00:06:14,680 +sách đó. + +77 +00:06:15,280 --> 00:06:16,990 +Vì vậy, bây giờ hãy chạy + +78 +00:06:16,990 --> 00:06:23,860 +lại nó và bạn có thể thấy mỗi khi hình dạng được vẽ, nó sẽ chọn một màu ngẫu nhiên từ danh sách các màu của chúng tôi. + +79 +00:06:24,610 --> 00:06:25,680 +Vì vậy, bạn có nó. + +80 +00:06:26,020 --> 00:06:28,680 +Đó là giải pháp cho thách thức này. + +81 +00:06:29,140 --> 00:06:34,330 +Và điều này khó hơn một chút mà tôi muốn nói bởi vì chúng ta đang thực hiện các chức năng và vòng lặp và bạn + +82 +00:06:34,330 --> 00:06:37,780 +phải nắm được một số màu sắc và bạn phải tìm ra tất cả những điều đó. + +83 +00:06:38,050 --> 00:06:42,700 +Nhưng hy vọng rằng bạn đã quản lý tốt và bạn đã sẵn sàng để chuyển sang thử thách tiếp theo. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Challenge-4-Generate-a-Random-Walk-Starting-Code.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Challenge-4-Generate-a-Random-Walk-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..73b6ca79157549ec8b5538e91c3e5c9c85dc115c --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Challenge-4-Generate-a-Random-Walk-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-4-start \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Solution-to-Challenge-4.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Solution-to-Challenge-4.url new file mode 100644 index 0000000000000000000000000000000000000000..a4333ded267ae0fd1a2826c31fa128aaa76d8ca2 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Solution-to-Challenge-4.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-4-end \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Turtle Challenge 4 - Generate a Random Walk.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Turtle Challenge 4 - Generate a Random Walk.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..920bcef1a170fb245180e54bd842c9311c42b1ca --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Turtle Challenge 4 - Generate a Random Walk.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c0be1b713e2db6a96b08250a292afdef2b47151bd3759fd4f13274e214246ea +size 74091921 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Turtle Challenge 4 - Generate a Random Walk_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Turtle Challenge 4 - Generate a Random Walk_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5bb517963851fd53e519b1a4638bbdf1c14f0f24 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 Turtle Challenge 4 - Generate a Random Walk_vi.srt @@ -0,0 +1,436 @@ +1 +00:00:00,360 --> 00:00:03,330 +Bây giờ, thử thách tiếp theo của chúng tôi là ép lên. + +2 +00:00:04,170 --> 00:00:09,170 +Và thử thách này sẽ yêu cầu bạn vẽ một bước đi ngẫu nhiên. + +3 +00:00:10,080 --> 00:00:14,850 +Về cơ bản, con rùa của bạn thực hiện các chuyển động ngẫu nhiên theo hướng Bắc, + +4 +00:00:14,850 --> 00:00:19,620 +Đông, Nam hoặc Tây, mỗi lần nó di chuyển theo cùng một khoảng cách, nhưng tại + +5 +00:00:19,950 --> 00:00:24,810 +bất kỳ thời điểm nào, nó có thể chọn hướng mà nó muốn đi trong bốn khoảng cách. + +6 +00:00:25,290 --> 00:00:29,130 +Và bạn cũng có thể thấy chúng tôi đã giữ lại bảng màu từ thử + +7 +00:00:29,460 --> 00:00:34,410 +thách trước và tôi chỉ áp dụng nó cho bước đi ngẫu nhiên để mỗi lần đi bộ, nó + +8 +00:00:34,470 --> 00:00:36,090 +sẽ chọn một màu khác. + +9 +00:00:37,110 --> 00:00:42,110 +Giờ đây, bước đi ngẫu nhiên này là thứ thường được sử dụng trong toán học và các + +10 +00:00:42,630 --> 00:00:43,463 +ngành khác. + +11 +00:00:43,650 --> 00:00:48,650 +Vì vậy, đó là một cách có thể được sử dụng để mô hình hóa các tình huống thực tế khác nhau. + +12 +00:00:49,380 --> 00:00:50,700 +Ví dụ như + +13 +00:00:50,700 --> 00:00:55,700 +tình trạng tài chính của một con bạc hoặc những thứ như đường đi của + +14 +00:00:57,270 --> 00:01:01,320 +phân tử trong chất lỏng hoặc khí hoặc đường tìm kiếm của động + +15 +00:01:01,380 --> 00:01:06,000 +vật kiếm ăn, và nhiều thứ khác. Hãy xem bài viết này trên Wikipedia mà + +16 +00:01:06,030 --> 00:01:09,600 +tôi sẽ liên kết đến và xem xét tất cả các ứng dụng bao + +17 +00:01:09,630 --> 00:01:14,630 +gồm chế tạo tác phẩm điêu khắc, Vật lý hoặc nghiên cứu não bộ và nhiều hơn thế nữa. + +18 +00:01:16,560 --> 00:01:17,820 +Vì vậy, khi bạn đã sẵn sàng, + +19 +00:01:18,030 --> 00:01:23,030 +hãy tiếp tục và xem liệu bạn có thể lập trình cho chú rùa của mình để tạo ra một cuộc đi dạo ngẫu nhiên bằng cách sử dụng màu + +20 +00:01:23,310 --> 00:01:24,210 +sắc ngẫu nhiên hay không. + +21 +00:01:24,480 --> 00:01:29,480 +Và tôi muốn bạn nghĩ xem làm thế nào bạn có thể có được độ dày của hình vẽ được thấy ở + +22 +00:01:30,180 --> 00:01:33,600 +đây, vì vậy mỗi đường đều dày hơn rất nhiều so với trước đây. + +23 +00:01:34,140 --> 00:01:39,140 +Và cũng hãy xem liệu bạn có thể tìm ra cách bạn có thể tăng tốc con rùa để + +24 +00:01:39,330 --> 00:01:43,050 +nó vẽ nhanh hơn nhiều không. Và mọi thứ tất nhiên sẽ có + +25 +00:01:43,050 --> 00:01:47,430 +trong tài liệu ở đâu đó để bạn tìm. Tạm dừng video và hoàn thành thử thách + +26 +00:01:47,430 --> 00:01:48,660 +ngay bây giờ. + +27 +00:01:52,820 --> 00:01:56,240 +Được rồi. Vì vậy, tôi sẽ xóa tất cả mã khỏi thử + +28 +00:01:56,510 --> 00:01:59,150 +thách trước đó của chúng tôi, nhưng tôi sẽ giữ lại danh sách các màu ngẫu nhiên, + +29 +00:01:59,450 --> 00:02:01,610 +mà tôi sẽ sử dụng cho chuyến đi ngẫu nhiên của mình ở đây. + +30 +00:02:02,510 --> 00:02:04,370 +Bây giờ tôi sẽ tiếp tục nhập + +31 +00:02:04,400 --> 00:02:08,180 +ngẫu nhiên mặc dù nó hiện không được sử dụng bởi vì, như bạn đoán, bước đi + +32 +00:02:08,190 --> 00:02:10,759 +ngẫu nhiên của chúng tôi sẽ yêu cầu một số ngẫu nhiên. + +33 +00:02:11,780 --> 00:02:16,640 +Vậy làm thế nào để chúng ta thực sự khiến robot của mình di chuyển theo bốn hướng khác nhau? + +34 +00:02:17,090 --> 00:02:20,240 +Chúng ta hãy xác định một danh sách khác được gọi là + +35 +00:02:20,750 --> 00:02:24,560 +chỉ đường và điều này sẽ có tất cả các hướng khác nhau mà con + +36 +00:02:24,590 --> 00:02:27,800 +rùa có thể đối mặt. Vì vậy, chúng ta + +37 +00:02:28,190 --> 00:02:32,240 +sẽ bắt đầu từ 0 sẽ quay về phía Đông và sau đó + +38 +00:02:32,240 --> 00:02:37,240 +là 90, sẽ quay về phía Bắc, 180 sẽ là Tây và 270 sẽ là Nam. + +39 +00:02:40,220 --> 00:02:42,800 +Vì vậy, bây giờ chúng ta đã có những chỉ dẫn ngẫu nhiên + +40 +00:02:42,830 --> 00:02:46,160 +này, chúng ta có thể khiến Tim, chú rùa nhỏ của chúng ta, bắt đầu di chuyển. + +41 +00:02:46,610 --> 00:02:49,940 +Vì vậy, mỗi khi chúng ta tiến về phía trước bằng cùng một khoảng + +42 +00:02:50,630 --> 00:02:53,360 +cách, và bạn sẽ di chuyển con rùa của mình bao + +43 +00:02:53,780 --> 00:02:56,480 +xa miễn là bạn đặt một con số hợp lý. + +44 +00:02:56,750 --> 00:03:01,750 +Vì vậy, tôi sẽ chỉ chọn 30 và sau đó tôi sẽ làm cho con rùa của tôi quay theo + +45 +00:03:02,560 --> 00:03:03,820 +một hướng ngẫu nhiên. + +46 +00:03:04,330 --> 00:03:09,330 +Vì vậy, tôi không muốn chỉ sử dụng bên phải mọi lúc, vì vậy bạn có thể sử dụng bên trái hoặc bên phải + +47 +00:03:10,390 --> 00:03:14,710 +và chọn một hướng ngẫu nhiên từ danh sách. Nhưng cách khác, bạn thực sự có thể + +48 +00:03:14,710 --> 00:03:18,490 +sử dụng tiêu đề tập hợp này. Vì vậy, ví dụ, chúng + +49 +00:03:18,520 --> 00:03:21,100 +ta có thể đặt nó theo bốn hướng đó. + +50 +00:03:21,640 --> 00:03:26,560 +Tất cả những gì chúng ta phải làm là gọi setheading và sau đó chuyển theo một trong những góc độ đó. + +51 +00:03:27,250 --> 00:03:28,210 +Đó là những gì chúng ta sẽ làm ở đây. + +52 +00:03:28,240 --> 00:03:33,240 +Chúng ta sẽ sử dụng mô-đun ngẫu nhiên và phương pháp lựa chọn ngẫu nhiên để chọn + +53 +00:03:34,900 --> 00:03:36,340 +một hướng ngẫu nhiên. + +54 +00:03:37,660 --> 00:03:42,660 +Vì vậy, bây giờ robot này sẽ di chuyển về phía trước và sau đó nó + +55 +00:03:43,420 --> 00:03:47,230 +sẽ quay một hướng ngẫu nhiên. Nhưng tất nhiên, chúng tôi muốn điều này lặp lại một vài lần. + +56 +00:03:47,320 --> 00:03:50,350 +Vì vậy, giả sử rằng chúng ta làm cho nó lặp lại 200 lần. + +57 +00:03:50,410 --> 00:03:53,740 +Tôi nghĩ rằng như vậy là đủ để vẽ một hình ảnh có kích thước vừa phải. + +58 +00:03:54,400 --> 00:03:58,600 +Hãy đặt phạm vi có thể là 200 lần để vòng lặp này chạy. + +59 +00:03:58,930 --> 00:04:01,480 +Tôi nghĩ điều đó sẽ giúp chúng ta có một hình ảnh đẹp. Bây giờ, nếu bạn + +60 +00:04:01,480 --> 00:04:05,770 +chọn 300 hoặc 500 hoặc bất kỳ số nào, điều đó không quan trọng. + +61 +00:04:06,190 --> 00:04:10,240 +Miễn là bạn có thể có được một hình ảnh đẹp trên màn hình, thì điều đó hoàn toàn ổn. + +62 +00:04:10,960 --> 00:04:14,170 +Vì vậy, bây giờ chúng tôi đã thỏa mãn những ràng buộc cơ bản của một + +63 +00:04:14,350 --> 00:04:18,130 +cuộc đi dạo ngẫu nhiên và bạn có thể thấy con rùa của chúng tôi hiện đang lang thang quanh + +64 +00:04:18,160 --> 00:04:21,820 +con hẻm này, hoàn toàn không có mục đích và mô hình một quá trình sống thực, giống như + +65 +00:04:21,880 --> 00:04:23,650 +một con vật đang săn tìm thức ăn. + +66 +00:04:25,120 --> 00:04:27,370 +Bây giờ chúng ta hãy thực hiện phần tiếp theo của điều này. + +67 +00:04:27,490 --> 00:04:32,490 +Hãy tiếp tục và thay đổi mã của chúng ta để nó tạo ra một màu ngẫu nhiên cho + +68 +00:04:32,560 --> 00:04:33,393 +mỗi bước. + +69 +00:04:33,850 --> 00:04:37,870 +Đó là lý do khá đơn giản mà chúng ta đã làm trước đây trong bài học trước. + +70 +00:04:38,200 --> 00:04:42,640 +Vì vậy, chúng tôi sẽ yêu cầu Tim thay đổi màu sắc của mình và chúng + +71 +00:04:42,640 --> 00:04:43,473 +tôi sẽ + +72 +00:04:45,100 --> 00:04:50,100 +sử dụng mô-đun ngẫu nhiên và phương pháp lựa chọn để chọn từ tất cả các màu mà chúng + +73 +00:04:50,800 --> 00:04:55,390 +tôi đã có trong danh sách này ở đây. Bây giờ nó có khá nhiều màu sắc ngẫu + +74 +00:04:55,540 --> 00:04:58,510 +nhiên, đi bộ ngẫu nhiên, điều tiếp theo chúng tôi muốn làm nếu + +75 +00:04:58,780 --> 00:05:03,780 +bạn đã xem bản demo của tôi về nó là chúng tôi muốn làm cho mỗi dòng dày hơn một chút. + +76 +00:05:04,570 --> 00:05:09,040 +Vì vậy, làm thế nào để chúng tôi làm điều đó? Chà, chúng ta phải quay lại tài liệu. + +77 +00:05:09,670 --> 00:05:12,370 +Vì vậy, nó có thể sẽ là một trong những phương pháp này. + +78 +00:05:12,760 --> 00:05:15,100 +Và nếu chúng ta chỉ đọc qua tên của các + +79 +00:05:15,400 --> 00:05:20,400 +phương thức, chúng sẽ cung cấp cho chúng ta một chút dấu hiệu về phương thức nào có thể là phương thức mà + +80 +00:05:20,680 --> 00:05:21,513 +chúng ta muốn. + +81 +00:05:22,540 --> 00:05:26,020 +Nếu chúng ta xem xét điều khiển bản vẽ cho bút của mình, bạn có + +82 +00:05:26,290 --> 00:05:31,290 +thể thấy có một phương pháp gọi là kích thước bút và bạn có thể gọi đây là kích thước bút hoặc chiều + +83 +00:05:31,480 --> 00:05:35,350 +rộng, nhưng nó cũng hoạt động tương tự. Về cơ bản, nó chỉ + +84 +00:05:35,350 --> 00:05:39,130 +đặt kích thước của cây bút mà con rùa dùng để vẽ. + +85 +00:05:40,900 --> 00:05:45,070 +Nếu chúng ta đặt kích thước bút thành một thứ gì đó rộng hơn một + +86 +00:05:47,380 --> 00:05:50,710 +chút, chẳng hạn có thể là 15 chiều rộng, thì bạn có + +87 +00:05:51,370 --> 00:05:53,830 +thể thấy khi con rùa của chúng ta vẽ, + +88 +00:05:53,890 --> 00:05:57,130 +nó hiện rộng hơn rất nhiều và dễ dàng nhìn thấy nó + +89 +00:05:57,260 --> 00:05:59,420 +đang làm gì. Bây giờ, mẹo + +90 +00:05:59,420 --> 00:06:03,290 +cuối cùng mà tôi muốn chỉ cho bạn là làm thế nào bạn có thể + +91 +00:06:03,290 --> 00:06:07,100 +tăng tốc hoạt ảnh của con rùa. Vì vậy, nếu tôi đợi nó vẽ xong ở + +92 +00:06:07,100 --> 00:06:08,630 +đây, điều đó hoàn toàn có + +93 +00:06:08,840 --> 00:06:13,840 +thể xảy ra, nhưng tôi cũng có thể tăng tốc nó bằng cách khai thác vào phương thức tốc độ cho rùa. + +94 +00:06:15,020 --> 00:06:20,020 +Và tôi có thể chỉ định tốc độ này dưới dạng số nguyên hoặc chuỗi. + +95 +00:06:22,070 --> 00:06:25,940 +Vì vậy, các chuỗi là nhanh nhất, nhanh nhất, bình thường, chậm nhất, + +96 +00:06:26,240 --> 00:06:30,950 +chậm nhất và điều này xác định tốc độ hoạt ảnh của con rùa khi nó vẽ. + +97 +00:06:31,370 --> 00:06:35,900 +Vì vậy, tôi sẽ đi nhanh nhất để chúng ta có thể nói thời gian. + +98 +00:06:35,900 --> 00:06:40,340 +tốc độ, vận tốc. Và chúng tôi sẽ đưa vào chuỗi đó, nhanh nhất. + +99 +00:06:41,480 --> 00:06:46,040 +Và bây giờ khi chúng tôi chạy nó, bạn có thể thấy nó hoạt hình nhanh hơn và + +100 +00:06:46,400 --> 00:06:48,500 +nó đang vẽ với tốc độ ánh sáng. + +101 +00:06:49,070 --> 00:06:52,580 +Chú rùa nhỏ của chúng ta đang hoàn toàn phát điên, nhưng điều + +102 +00:06:53,780 --> 00:06:58,610 +này có nghĩa là sẽ mất ít thời gian hơn nhiều để hoàn thành 200 chu kỳ như chúng + +103 +00:06:58,630 --> 00:06:59,620 +ta yêu cầu. + +104 +00:07:00,970 --> 00:07:04,870 +Vì vậy, tôi hy vọng bạn thích bài học này và bạn đã quản lý để đưa con rùa của bạn đi + +105 +00:07:04,870 --> 00:07:06,130 +dạo ngẫu nhiên. Bây giờ, + +106 +00:07:06,250 --> 00:07:09,760 +nhiều người trong số các bạn đã thực hiện thử thách này và có thể bạn + +107 +00:07:09,760 --> 00:07:14,760 +đã nghĩ, sẽ không hay nếu tôi có thể tạo ra một màu hoàn toàn ngẫu nhiên thay vì chỉ chọn một màu + +108 +00:07:15,070 --> 00:07:17,800 +ngẫu nhiên từ danh sách này? Chà, chúng ta có thể làm + +109 +00:07:17,920 --> 00:07:21,520 +được điều đó và tôi sẽ chỉ cho bạn cách thực hiện trong bài học tiếp theo. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 What-is-a-Random-Walk-.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 What-is-a-Random-Walk-.url new file mode 100644 index 0000000000000000000000000000000000000000..7dd1b29c29ab512d56c61b282a7b3582bb20bbf6 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/007 What-is-a-Random-Walk-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/Random_walk \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 Python Tuples and How to Generate Random RGB Colours.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 Python Tuples and How to Generate Random RGB Colours.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c940738fa31c2fc9509ce4e71781a9d182b93cc1 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 Python Tuples and How to Generate Random RGB Colours.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51acd11095d0d2b189d50e060f6b6f6b58c09514fff81848ed6509c7e7b4ab05 +size 73376219 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 Python Tuples and How to Generate Random RGB Colours_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 Python Tuples and How to Generate Random RGB Colours_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..95a83d6f8148d6235ddd8e799aa6e796e048c33d --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 Python Tuples and How to Generate Random RGB Colours_vi.srt @@ -0,0 +1,456 @@ +1 +00:00:00,330 --> 00:00:05,250 +Vì vậy, trong bài học trước, chúng ta đã xem cách tạo ra một con rùa đi bộ ngẫu nhiên. + +2 +00:00:05,760 --> 00:00:07,020 +Bây giờ trong bài + +3 +00:00:07,080 --> 00:00:12,080 +học này, tôi muốn chỉ cho bạn cách bạn có thể tạo một màu ngẫu nhiên cho bức vẽ + +4 +00:00:12,540 --> 00:00:16,890 +con rùa của mình thay vì chỉ sử dụng các màu đã đặt tên và sau đó + +5 +00:00:16,890 --> 00:00:21,390 +chọn một màu ngẫu nhiên trong danh sách. Khi bạn nhìn vào màu bút của con + +6 +00:00:21,810 --> 00:00:26,810 +rùa, bạn có thể thấy rằng bạn có thể sử dụng một chuỗi màu, chẳng hạn như những gì chúng tôi + +7 +00:00:26,940 --> 00:00:30,420 +đã làm bằng cách sử dụng màu đỏ, vàng hoặc chuỗi hex đại diện cho + +8 +00:00:31,020 --> 00:00:33,690 +màu sắc hoặc chúng ta có thể sử dụng Màu RGB. + +9 +00:00:34,170 --> 00:00:39,170 +Và màu RGB sẽ được thể hiện bằng một loạt các màu đỏ, xanh lá + +10 +00:00:39,510 --> 00:00:43,560 +cây và xanh lam khác nhau. Vậy chính xác thì tuple là gì? + +11 +00:00:44,310 --> 00:00:44,760 +Chà, + +12 +00:00:44,760 --> 00:00:49,760 +tuple là một kiểu dữ liệu trong Python và nó trông giống như thế này. + +13 +00:00:50,130 --> 00:00:52,830 +Nó có dấu ngoặc tròn xung quanh và + +14 +00:00:53,190 --> 00:00:56,970 +sau đó mỗi mục bên trong được phân tách bằng dấu phẩy. + +15 +00:00:57,570 --> 00:00:59,970 +Vì vậy, điều này có nhắc bạn về một kiểu dữ liệu khác không? + +16 +00:01:00,600 --> 00:01:04,110 +Nó trông không giống một danh sách? Chà, quả thực một + +17 +00:01:04,110 --> 00:01:08,880 +tuple rất giống với một danh sách. Mỗi mục trong số các mục + +18 +00:01:08,880 --> 00:01:10,260 +được đặt hàng. + +19 +00:01:10,740 --> 00:01:15,720 +Vì vậy, hãy kéo bảng điều khiển Python của tôi lên đây và tạo bộ tuple của tôi + +20 +00:01:17,130 --> 00:01:21,060 +được biểu thị bằng một tập hợp các dấu ngoặc tròn và sau đó + +21 +00:01:21,450 --> 00:01:25,410 +chúng ta hãy đặt ba mục, 1, 3 và 8, và ở đó chúng + +22 +00:01:26,010 --> 00:01:28,320 +tôi đã tạo một bộ tuple mới. + +23 +00:01:28,950 --> 00:01:32,370 +Bây giờ để nắm được bất kỳ mục nào trong số đó, tôi + +24 +00:01:32,460 --> 00:01:36,540 +có thể viết tên của biến và sau đó sử dụng dấu ngoặc vuông, tôi + +25 +00:01:36,570 --> 00:01:38,460 +có thể truy cập chỉ mục. + +26 +00:01:38,730 --> 00:01:43,710 +Vì vậy, 1 sẽ ở vị trí số không, 3 sẽ ở vị trí một và 8 + +27 +00:01:43,740 --> 00:01:47,220 +sẽ ở vị trí hai. Vì vậy, nếu tôi nhấn enter vào điều + +28 +00:01:47,280 --> 00:01:49,350 +này, thì bạn có thể thấy rằng nó sẽ bằng 8. + +29 +00:01:50,820 --> 00:01:52,860 +Và nếu bạn nhấp vào trình đơn thả + +30 +00:01:52,890 --> 00:01:56,700 +xuống này ở bên phải, bạn có thể thấy cùng một đại diện; vị trí 0, + +31 +00:01:57,060 --> 00:02:00,510 +1, 2 và các phần dữ liệu đó và tổng độ dài là ba. + +32 +00:02:01,110 --> 00:02:05,760 +Vì vậy, tại thời điểm này, bạn có thể tự hỏi mình, tôi đã biết về danh sách, vậy tại sao tôi + +33 +00:02:05,820 --> 00:02:10,320 +cần biết về các bộ giá trị? Sự khác biệt là gì? Chà, một tuple sẽ + +34 +00:02:10,350 --> 00:02:14,220 +được chạm khắc trên đá, vì vậy bạn không thể thay đổi + +35 +00:02:14,460 --> 00:02:18,390 +các giá trị như bạn có thể làm với các danh sách. + +36 +00:02:19,500 --> 00:02:22,020 +Ví dụ: nếu tôi muốn nói hãy nắm + +37 +00:02:22,020 --> 00:02:26,220 +giữ bộ tuple của tôi và thay vì 8 ở vị trí hai, tôi + +38 +00:02:26,610 --> 00:02:30,630 +muốn thay đổi nó thành 12. Bây giờ, nếu tôi tiếp tục và + +39 +00:02:30,660 --> 00:02:34,350 +nhấn enter, bạn có thể thấy tôi gặp lỗi và đây là lỗi loại. + +40 +00:02:34,890 --> 00:02:39,390 +Loại cụ thể này, tuple, không hỗ trợ gán mục. + +41 +00:02:39,600 --> 00:02:42,720 +Vì vậy, tôi không thể tự ý thay đổi nó như thế này. + +42 +00:02:43,290 --> 00:02:46,380 +Và tôi cũng không thể xóa các mục khỏi tuple, tôi không + +43 +00:02:46,620 --> 00:02:51,330 +thể thay đổi nó theo bất kỳ cách nào. Một khi bạn đã tạo ra bộ tuple của + +44 +00:02:51,360 --> 00:02:56,360 +mình, bạn có thể coi nó như được khắc trên đá và nó là cái mà chúng tôi gọi là bất biến. + +45 +00:02:57,150 --> 00:03:01,900 +Nó không thể thay đổi được. Vì vậy, tại sao bạn sẽ sử dụng một tuple sau đó? + +46 +00:03:02,620 --> 00:03:03,880 +Chà, hãy nghĩ về những + +47 +00:03:04,150 --> 00:03:07,990 +thời điểm như giả sử bạn đang tạo bảng màu cho trang web của mình hay + +48 +00:03:07,990 --> 00:03:12,220 +bạn đang tạo một danh sách nào đó mà bạn muốn giữ nguyên và bạn không muốn ai + +49 +00:03:12,220 --> 00:03:16,360 +đó vô tình thay đổi hoặc vô tình làm rối tung nó lên, tốt, sau đó bạn + +50 +00:03:16,360 --> 00:03:18,610 +có thể muốn xem xét sử dụng một tuple. + +51 +00:03:20,050 --> 00:03:23,800 +Và nếu bạn thấy mình đang tạo một bộ tuple và sau đó nhận ra, Ồ, thực ra + +52 +00:03:23,830 --> 00:03:26,020 +tôi cần phải thay đổi nó thật tốt, thì bạn + +53 +00:03:26,020 --> 00:03:29,650 +có thể chỉ cần đặt bộ tuple của mình bên trong một danh sách như thế này + +54 +00:03:30,010 --> 00:03:32,800 +và bạn thực sự có thể chuyển đổi nó thành một danh sách. + +55 +00:03:34,150 --> 00:03:36,010 +Quay lại tài liệu của chúng + +56 +00:03:36,400 --> 00:03:41,400 +tôi, màu được biểu thị bằng một bộ giá trị vì nếu bạn xác định một màu, bạn + +57 +00:03:41,680 --> 00:03:43,330 +không thể thay đổi nó. + +58 +00:03:44,020 --> 00:03:46,870 +Và sau đó chúng ta có r, g và + +59 +00:03:46,960 --> 00:03:50,380 +b, nằm trong phạm vi giữa 0 và chế độ màu. + +60 +00:03:50,860 --> 00:03:55,860 +Vì vậy, chế độ có thể nằm trong khoảng từ 0 đến 1 hoặc 0 đến 255. Trong các tài nguyên của khóa học, tôi + +61 +00:03:58,030 --> 00:04:01,810 +đã liên kết với công cụ máy tính RGB thực sự tiện dụng này, + +62 +00:04:02,290 --> 00:04:06,190 +công cụ này cho thấy màu RGB hoạt động hoàn hảo như thế nào. + +63 +00:04:06,610 --> 00:04:10,060 +Bạn có thể thấy rằng nếu chúng ta không có lượng màu đỏ, không có lượng màu xanh lá cây, không có + +64 +00:04:10,090 --> 00:04:11,920 +lượng màu xanh lam thì chúng ta sẽ có màu đen. + +65 +00:04:12,430 --> 00:04:17,430 +Nhưng nếu chúng ta trộn các lượng khác nhau của màu đỏ và các lượng khác nhau của màu xanh lá cây và các lượng khác nhau + +66 +00:04:18,670 --> 00:04:22,029 +của màu xanh lam, thì chúng ta có thể nhận được tất cả các màu trong cầu vồng. + +67 +00:04:22,360 --> 00:04:26,020 +Ba màu cơ bản có thể tạo ra bất kỳ màu nào mà bạn mơ ước. + +68 +00:04:26,620 --> 00:04:29,110 +Và mỗi thanh trượt + +69 +00:04:29,140 --> 00:04:34,000 +này, bạn có thể thấy, đi từ 0 đến 255. + +70 +00:04:34,570 --> 00:04:38,230 +Vì vậy, nhiều màu đỏ hơn, nhiều màu xanh lá cây hơn hoặc nhiều màu xanh lam hơn. + +71 +00:04:39,220 --> 00:04:42,730 +Và đây là màu RGB cuối cùng trông như thế nào. + +72 +00:04:43,930 --> 00:04:48,790 +Tôi thấy dễ dàng hơn khi nghĩ về phạm vi từ 0 đến 255. + +73 +00:04:49,330 --> 00:04:50,200 +Vì vậy, + +74 +00:04:50,200 --> 00:04:54,880 +trong con rùa, chúng tôi thực sự phải thay đổi chế độ màu thành 255. + +75 +00:04:55,510 --> 00:04:57,340 +Vì vậy, để làm được điều này, hơi khó một chút đó + +76 +00:04:57,370 --> 00:04:59,920 +là lý do tại sao tôi không muốn đặt điều này như một phần của thử thách. + +77 +00:05:00,310 --> 00:05:04,750 +Nhưng chúng ta phải nhấn vào mô-đun con rùa thực tế chứ không phải đối tượng con rùa, sau + +78 +00:05:04,990 --> 00:05:09,910 +đó thay đổi chế độ màu cho mô-đun đó. Quay lại mã của chúng tôi, + +79 +00:05:09,940 --> 00:05:12,490 +chúng tôi có thể khai thác vào mô-đun + +80 +00:05:12,820 --> 00:05:15,910 +rùa được gọi là 't' trong mã của chúng tôi. + +81 +00:05:17,080 --> 00:05:22,080 +Và sau đó chúng ta có thể nhấn vào chế độ màu để chuyển từ 0 đến 255. + +82 +00:05:24,610 --> 00:05:29,590 +Vì vậy, bây giờ chúng ta đã thay đổi chế độ màu, bây giờ chúng ta có thể tạo một màu ngẫu nhiên. + +83 +00:05:30,040 --> 00:05:33,280 +Vì vậy, chúng ta hãy loại bỏ danh sách màu sắc này. Thay vào đó, tôi + +84 +00:05:33,280 --> 00:05:36,880 +sẽ tạo một hàm mới có tên là màu sắc ngẫu + +85 +00:05:37,960 --> 00:05:42,960 +nhiên và hàm này sẽ trả về một màu ngẫu nhiên bằng cách sử dụng RGB. + +86 +00:05:44,440 --> 00:05:47,410 +Vì vậy, trước tiên hãy tạo một màu đỏ ngẫu nhiên. + +87 +00:05:48,280 --> 00:05:53,280 +Vì vậy, chúng tôi sử dụng mô-đun ngẫu nhiên và sau đó sử dụng randint và + +88 +00:05:53,620 --> 00:05:56,740 +sau đó tạo một số từ 0 đến 255. + +89 +00:05:57,710 --> 00:06:02,420 +Và sau đó chúng ta có thể lặp lại quá trình này cho hai không + +90 +00:06:02,750 --> 00:06:05,900 +gian màu còn lại, xanh lục và xanh lam. + +91 +00:06:06,920 --> 00:06:08,930 +Bây giờ chúng ta có ba số ngẫu nhiên, mỗi + +92 +00:06:08,960 --> 00:06:11,480 +số đại diện cho từng không gian màu và sau đó chúng ta + +93 +00:06:11,840 --> 00:06:15,590 +có thể tạo bộ giá trị của mình. Đây là thách thức dành cho bạn. + +94 +00:06:15,950 --> 00:06:18,290 +Xem liệu bạn có thể trả về + +95 +00:06:18,350 --> 00:06:23,350 +từ hàm này một bộ mã bao gồm ba số nguyên ngẫu nhiên, r, g và b, + +96 +00:06:24,710 --> 00:06:29,710 +sau đó sử dụng màu ngẫu nhiên đó để tô màu cho bức vẽ con rùa thay + +97 +00:06:30,920 --> 00:06:34,070 +vì mã bị hỏng dựa trên danh sách màu trước đó. + +98 +00:06:34,610 --> 00:06:37,220 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +99 +00:06:40,150 --> 00:06:42,460 +Được rồi. Vì vậy, chúng ta biết + +100 +00:06:42,460 --> 00:06:45,460 +rằng để tạo một bộ giá trị, chúng ta cần một tập hợp các dấu ngoặc + +101 +00:06:45,940 --> 00:06:48,610 +tròn hoặc dấu ngoặc đơn, và sau đó chúng ta sẽ sắp xếp từng + +102 +00:06:48,610 --> 00:06:53,380 +thứ trong số này theo thứ tự, vì vậy r, g và b. Vì vậy, đây là bộ tuple của chúng tôi + +103 +00:06:53,410 --> 00:06:56,860 +đã tạo, và về cơ bản đây là màu ngẫu nhiên mới của chúng tôi. + +104 +00:06:57,460 --> 00:07:02,460 +Và sau đó hàm này sẽ trả về màu ngẫu nhiên đó làm đầu ra. + +105 +00:07:03,850 --> 00:07:08,350 +Vì vậy, bây giờ thay vì sử dụng ngẫu nhiên. và sử dụng danh sách trước đó, tất cả + +106 +00:07:08,860 --> 00:07:11,770 +những gì chúng ta phải làm là nắm giữ một màu + +107 +00:07:12,160 --> 00:07:16,840 +ngẫu nhiên sẽ được xuất ra từ chức năng này và sau đó sử dụng nó để tô màu + +108 +00:07:16,840 --> 00:07:19,780 +cho bức vẽ của Tim. Vì vậy, hãy chạy lại + +109 +00:07:20,320 --> 00:07:23,380 +đoạn mã này, và bạn sẽ có thể thấy rằng trong bước đi + +110 +00:07:23,500 --> 00:07:25,780 +ngẫu nhiên này, màu sắc là hoàn toàn ngẫu nhiên. + +111 +00:07:26,110 --> 00:07:31,110 +Khá nhiều lần lượt sẽ vẽ một thứ hoàn toàn khác về màu + +112 +00:07:31,540 --> 00:07:32,373 +sắc. + +113 +00:07:33,190 --> 00:07:38,080 +Và điều này đạt được bằng cách tìm hiểu một chút về cách màu sắc hoạt động và cách chúng + +114 +00:07:38,080 --> 00:07:41,860 +ta có thể tạo ra chúng bằng cách sử dụng các màu RGB ngẫu nhiên. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 RGB-Tool-from-W3Schools.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 RGB-Tool-from-W3Schools.url new file mode 100644 index 0000000000000000000000000000000000000000..24bfc6c9e6acd6743a938480dec7d70a0afa1f50 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/008 RGB-Tool-from-W3Schools.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/colors/colors_rgb.asp \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Challenge-5-Create-a-Spirograph-Starting-Code.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Challenge-5-Create-a-Spirograph-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..8b06ea7ef4e248a130ae98c9a3ae790428b1977d --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Challenge-5-Create-a-Spirograph-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-5-start \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Solution-to-Challenge-5-Day-18-Ending-Code-.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Solution-to-Challenge-5-Day-18-Ending-Code-.url new file mode 100644 index 0000000000000000000000000000000000000000..d73fca282b240fe09101bc5d571ff3ab57e9db28 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Solution-to-Challenge-5-Day-18-Ending-Code-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-18-5-end \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Turtle Challenge 5 - Draw a Spirograph.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Turtle Challenge 5 - Draw a Spirograph.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a6f8d7f24920aa9dd490ef6097ffb2b389ea1213 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Turtle Challenge 5 - Draw a Spirograph.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c74fadd7a948a78ff3532a022b127e40d3eee453a1e4c5a80948b73608fcea3 +size 38188891 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Turtle Challenge 5 - Draw a Spirograph_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Turtle Challenge 5 - Draw a Spirograph_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a0eac943486fbcd79502b8408b929df566f69154 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/009 Turtle Challenge 5 - Draw a Spirograph_vi.srt @@ -0,0 +1,560 @@ +1 +00:00:00,180 --> 00:00:05,180 +Bây giờ, thử thách cuối cùng cho ngày hôm nay là lịch sự của một món đồ chơi thời thơ ấu + +2 +00:00:05,190 --> 00:00:08,310 +mà bạn có thể đã thấy. Vì vậy, đây sẽ là chiếc xe đạp + +3 +00:00:08,610 --> 00:00:12,330 +tập của chúng tôi, và nó sẽ là bài tập viết mã cuối cùng trước khi chúng tôi hoàn + +4 +00:00:12,330 --> 00:00:16,500 +thành dự án cuối cùng của mình. Vì vậy, những gì chúng ta đang làm gì? Chúng tôi đang làm một máy đo xoắn khuẩn. + +5 +00:00:16,800 --> 00:00:19,350 +Bạn có nhớ những thứ có hình bánh răng hình học + +6 +00:00:19,350 --> 00:00:23,160 +mà bạn sẽ vẽ và vẽ và nó sẽ tạo nên những hình tròn vui nhộn này không? + +7 +00:00:23,490 --> 00:00:25,980 +Đó là những gì chúng ta sẽ làm, nhưng với rùa. + +8 +00:00:26,400 --> 00:00:31,400 +Chúng ta sẽ yêu cầu con rùa của chúng ta vẽ một số vòng tròn với bán kính + +9 +00:00:32,040 --> 00:00:35,250 +một trăm trong khoảng cách. Và một khi nó hoàn + +10 +00:00:35,280 --> 00:00:39,060 +thành, chúng ta sẽ kết thúc với một cái gì đó giống như thế này. + +11 +00:00:39,900 --> 00:00:43,710 +Vì vậy, chúng tôi sẽ sử dụng màu sắc ngẫu nhiên của chúng tôi và chúng tôi sẽ + +12 +00:00:43,710 --> 00:00:44,640 +sử dụng tài liệu. + +13 +00:00:45,540 --> 00:00:50,070 +Tôi muốn bạn tìm hiểu tài liệu và xem liệu bạn có thể tìm ra + +14 +00:00:50,070 --> 00:00:54,330 +cách vẽ hình tròn và xác định độ lớn của hình tròn hay không. + +15 +00:00:55,020 --> 00:00:59,910 +Và sau đó tôi muốn bạn tìm ra cách bạn có thể vẽ liên tục + +16 +00:01:00,180 --> 00:01:05,129 +một vòng tròn và thay đổi độ nghiêng của hình tròn mỗi lần một chút, để + +17 +00:01:05,370 --> 00:01:09,930 +bạn có được hiệu ứng đó. Tạm dừng video và bắt đầu ngay bây giờ. + +18 +00:01:12,960 --> 00:01:13,770 +Được rồi. Một lần + +19 +00:01:13,770 --> 00:01:16,530 +nữa, chúng tôi sẽ duyệt qua tất cả các phương pháp hiện có để + +20 +00:01:16,590 --> 00:01:18,960 +tìm kiếm thứ gì đó có thể giúp ích cho chúng tôi. + +21 +00:01:19,800 --> 00:01:23,790 +Tôi nghĩ nó sẽ ở đâu đó trong phần chuyển động và vẽ của rùa. + +22 +00:01:24,150 --> 00:01:25,740 +Và nếu bạn nhìn xuống danh + +23 +00:01:25,770 --> 00:01:30,770 +sách này, bạn có thể thấy có một phương pháp cho phép chúng ta vẽ một đường tròn với bán + +24 +00:01:31,110 --> 00:01:31,943 +kính cho trước. + +25 +00:01:32,070 --> 00:01:37,070 +Vì vậy, chúng ta có thể đặt bán kính làm một trong những đầu vào và vẽ đường tròn của chúng ta. Quay lại mã của chúng tôi, tôi + +26 +00:01:37,950 --> 00:01:39,420 +sẽ xóa một + +27 +00:01:39,450 --> 00:01:44,450 +số phần trước đó mà chúng tôi đã chỉ đường và cũng thay + +28 +00:01:44,970 --> 00:01:46,710 +đổi kích thước bút. + +29 +00:01:47,040 --> 00:01:51,090 +Tôi sẽ để tốc độ nhanh nhất vì chúng tôi sẽ cần tốc độ đó khá + +30 +00:01:51,090 --> 00:01:53,430 +nhanh để vẽ tất cả các vòng tròn đó. + +31 +00:01:53,910 --> 00:01:56,400 +Và tôi cũng sẽ xóa vòng lặp for cuối cùng. + +32 +00:01:57,270 --> 00:02:01,710 +Bây giờ hãy chú ý cách tôi có cảnh báo này ở đây cho tôi biết + +33 +00:02:01,740 --> 00:02:06,740 +rằng nó không thực sự giống như ý tưởng tôi gọi một biến giống như tên của một hàm. + +34 +00:02:07,470 --> 00:02:10,889 +Vì vậy, tại sao chúng ta không chỉ gọi màu này thay thế + +35 +00:02:11,250 --> 00:02:16,230 +và sau đó chúng ta có thể trả về nó làm đầu ra và loại bỏ cảnh báo đó. + +36 +00:02:16,860 --> 00:02:20,490 +Bây giờ chúng tôi đã sẵn sàng để viết mã xoắn ốc của chúng tôi. + +37 +00:02:20,820 --> 00:02:25,170 +Vì vậy, điều đầu tiên mà chúng tôi sẽ thử và làm là vẽ một vòng tròn. + +38 +00:02:25,650 --> 00:02:29,100 +Bây giờ hình tròn yêu cầu bán kính, vì vậy tôi sẽ cung + +39 +00:02:29,130 --> 00:02:33,570 +cấp cho nó bán kính một trăm. Và khi tôi nhấn run, chúng ta + +40 +00:02:33,810 --> 00:02:37,080 +có thể thấy sơ qua rằng nó vẽ một vòng tròn. + +41 +00:02:37,530 --> 00:02:42,060 +Vì vậy, hãy tiếp tục và tạo màn hình của chúng ta từ t. màn hình. + +42 +00:02:42,660 --> 00:02:47,660 +Và sau đó chúng ta có thể sử dụng màn hình đó. Phương thức exitonclick để khi chúng tôi chạy mã + +43 +00:02:48,480 --> 00:02:53,130 +của mình, nó không thực sự xóa cửa sổ cho đến khi chúng tôi nhấp vào nó. + +44 +00:02:53,880 --> 00:02:57,120 +Vì vậy, tôi có thể thấy rằng tôi đã vẽ hình + +45 +00:02:57,300 --> 00:03:01,750 +tròn đầu tiên của mình và tôi muốn, nếu có thể, làm cho hình tròn của + +46 +00:03:01,960 --> 00:03:04,060 +tôi có một màu khác mỗi lần. + +47 +00:03:04,420 --> 00:03:09,420 +Vì vậy, tôi sẽ thay đổi màu sắc để sử dụng một màu ngẫu nhiên được tạo + +48 +00:03:10,030 --> 00:03:13,630 +ra bởi chức năng này. Vì vậy, bây giờ mỗi khi tôi chạy + +49 +00:03:13,690 --> 00:03:16,270 +mã của mình, bạn sẽ thấy một vòng tròn có màu khác nhau. + +50 +00:03:17,050 --> 00:03:22,050 +Về cơ bản, con rùa sẽ vẽ ra con đường này và sau đó quay trở lại vị + +51 +00:03:22,870 --> 00:03:25,600 +trí ban đầu của nó hướng về phía Đông. + +52 +00:03:26,020 --> 00:03:29,740 +Nếu chúng ta muốn nhiều vòng tròn chồng lên nhau, thì + +53 +00:03:29,860 --> 00:03:34,150 +chúng ta sẽ phải thay đổi tiêu đề hoặc hướng trỏ của con + +54 +00:03:34,150 --> 00:03:37,450 +rùa của chúng ta. Nếu chúng ta nhìn vào + +55 +00:03:37,750 --> 00:03:40,300 +phần này, trạng thái hiện tại của con rùa của + +56 +00:03:40,540 --> 00:03:43,420 +chúng ta, bạn có thể thấy rằng bạn có thể nhận + +57 +00:03:43,450 --> 00:03:46,900 +được vị trí hiện tại, tọa độ Y hiện tại và tọa độ X, + +58 +00:03:47,110 --> 00:03:49,450 +nhưng bạn cũng có thể nắm được tiêu đề + +59 +00:03:49,480 --> 00:03:52,150 +hiện tại, vì vậy nó đang chỉ về hướng nào . + +60 +00:03:52,720 --> 00:03:55,840 +Và tất cả những gì chúng ta phải làm là chỉ cần gọi phương thức tiêu đề này. + +61 +00:03:56,770 --> 00:04:01,210 +Vì vậy, bây giờ nếu tôi in thời gian của tôi. thì bạn có thể thấy rằng + +62 +00:04:01,720 --> 00:04:06,720 +khi tôi chạy mã của mình và xem bên trong bảng điều khiển, nó đang + +63 +00:04:07,030 --> 00:04:09,400 +chỉ về 0. 0. + +64 +00:04:10,090 --> 00:04:15,040 +Điều gì sẽ xảy ra nếu chúng ta có thể thay đổi tiêu đề để làm cho nó dịch chuyển một chút? + +65 +00:04:15,670 --> 00:04:20,740 +Thực ra có một phương pháp khác để thay đổi tiêu + +66 +00:04:20,740 --> 00:04:25,570 +đề và lấy tiêu đề. Ví dụ, nếu chúng ta muốn đặt tiêu đề, + +67 +00:04:25,600 --> 00:04:29,590 +thì chúng ta phải sử dụng phương pháp này và cung cấp cho nó một số. + +68 +00:04:30,370 --> 00:04:32,890 +Vì vậy, điều gì sẽ xảy ra nếu tôi + +69 +00:04:35,980 --> 00:04:39,580 +nhận được tiêu đề hiện tại và sau đó tôi có thể thêm 5 hoặc + +70 +00:04:39,910 --> 00:04:44,050 +10 độ vào nó, và sau đó tôi thay đổi tiêu đề con rùa của mình bằng + +71 +00:04:44,050 --> 00:04:47,560 +cách sử dụng bộ tiêu đề thành tiêu đề hiện tại cộng với 10. + +72 +00:04:49,450 --> 00:04:54,190 +Và sau đó chúng tôi nhận được một vòng tròn mới được vẽ. Vì vậy, hãy xem điều này trông như thế nào. + +73 +00:04:55,840 --> 00:04:59,830 +Và bạn có thể thấy rằng tôi đã vẽ một vòng tròn và sau đó tôi nghiêng sang trái + +74 +00:04:59,830 --> 00:05:03,940 +một chút rồi vẽ một vòng tròn thứ hai. Vì vậy, ngoại suy điều này, bạn có thể + +75 +00:05:03,970 --> 00:05:06,610 +tưởng tượng rằng nếu chúng ta có một vòng lặp liên tục, thì + +76 +00:05:06,850 --> 00:05:09,610 +chúng ta có thể vẽ hình dạng xoắn ốc cuối cùng của chúng ta. + +77 +00:05:10,180 --> 00:05:11,860 +Hãy tạo vòng lặp đó. + +78 +00:05:12,160 --> 00:05:15,910 +Vì vậy, những phần không cần thiết trong vòng lặp là cài đặt tốc độ. + +79 +00:05:16,300 --> 00:05:18,880 +Nhưng màu sắc cần thay đổi mỗi lần, + +80 +00:05:19,120 --> 00:05:23,410 +vòng tròn cần được vẽ mỗi lần và tiêu đề cần được cập nhật + +81 +00:05:23,410 --> 00:05:24,243 +mỗi lần. + +82 +00:05:24,280 --> 00:05:29,280 +Bây giờ tôi sẽ đơn giản hóa dòng mã này để hợp đồng nó thành một dòng duy nhất. + +83 +00:05:31,540 --> 00:05:34,870 +Vì vậy, tôi đang đặt Tim thành một tiêu đề mới và + +84 +00:05:35,230 --> 00:05:38,290 +đó là từ tiêu đề hiện tại cộng với 10. + +85 +00:05:39,250 --> 00:05:43,000 +Vì vậy, bây giờ hãy tạo vòng lặp của chúng tôi và giả sử + +86 +00:05:43,000 --> 00:05:45,550 +chúng tôi sẽ lặp lại hàng trăm lần. + +87 +00:05:48,540 --> 00:05:51,900 +Bây giờ hãy chạy mã của chúng tôi và xem nó trông như thế nào. + +88 +00:05:54,090 --> 00:05:56,910 +Bạn có thể thấy nó đang vẽ ra xoắn ốc của chúng tôi. + +89 +00:05:56,930 --> 00:06:00,350 +Nó không dày đặc như trước đây, nhưng hãy nhìn vào những + +90 +00:06:00,830 --> 00:06:02,330 +gì nó đang làm. + +91 +00:06:02,390 --> 00:06:06,410 +Nó đang vẽ cùng một vòng tròn bên trên một vòng tròn trước đó, vì nó + +92 +00:06:06,650 --> 00:06:08,510 +không biết khi nào dừng lại. + +93 +00:06:09,200 --> 00:06:13,790 +Nó chỉ dừng lại khi nó trải qua hàng trăm vòng quay. + +94 +00:06:14,270 --> 00:06:19,270 +Vì vậy, làm thế nào chúng ta có thể tìm ra một cách để làm cho nó chỉ vẽ bao nhiêu vòng tròn mà + +95 +00:06:19,730 --> 00:06:20,563 +chúng ta cần? + +96 +00:06:21,740 --> 00:06:26,740 +Giả sử rằng tôi đã tạo một hàm mới có tên là draw_spirograph + +97 +00:06:27,890 --> 00:06:31,520 +và hàm này chấp nhận một tham số duy + +98 +00:06:31,790 --> 00:06:35,390 +nhất, đó là kích thước của khoảng trống. + +99 +00:06:37,550 --> 00:06:42,260 +Và đó sẽ là kích thước sẽ có giữa mỗi vòng tròn + +100 +00:06:42,260 --> 00:06:43,490 +được vẽ này. + +101 +00:06:44,000 --> 00:06:48,230 +Và điều đó tất nhiên được xác định bởi hướng mũi tên của tôi. + +102 +00:06:48,890 --> 00:06:51,710 +Vì vậy, nếu tôi vượt qua kích thước của khoảng + +103 +00:06:51,740 --> 00:06:56,450 +cách này, tôi sẽ sử dụng nó ở đây để thay đổi độ nghiêng của vòng tròn của tôi. + +104 +00:06:57,020 --> 00:07:02,020 +Nhưng tôi cũng có thể sử dụng điều đó bởi vì nó là một mức độ để xác định số lần đo + +105 +00:07:02,780 --> 00:07:04,460 +xoắn khuẩn của tôi cần được vẽ. + +106 +00:07:04,910 --> 00:07:09,440 +Vì vậy, chúng tôi biết rằng có 360 độ trong một vòng tròn đầy đủ. + +107 +00:07:09,980 --> 00:07:12,980 +Và đối với mỗi vòng tròn mà chúng ta đang vẽ, về cơ bản chúng ta + +108 +00:07:13,310 --> 00:07:17,720 +đang tạo cho nó một độ lệch khác nhau phải không? Và đó là size_of_gap của + +109 +00:07:17,720 --> 00:07:19,070 +chúng tôi. + +110 +00:07:19,490 --> 00:07:22,760 +Vì vậy, nếu chúng ta chia 360 cho mỗi độ lệch, thì chúng ta + +111 +00:07:23,120 --> 00:07:28,120 +sẽ lặp lại mã của mình nhiều lần nếu chúng ta cần để vẽ tất cả các vòng tròn và hoàn + +112 +00:07:28,760 --> 00:07:31,940 +thành biểu đồ xoắn cuối cùng. Bây giờ, vấn + +113 +00:07:32,000 --> 00:07:35,960 +đề duy nhất là nếu tôi gọi phương pháp + +114 +00:07:36,770 --> 00:07:40,460 +này, dra, tôi nghĩ tôi muốn viết hòa. + +115 +00:07:41,540 --> 00:07:45,410 +Vì vậy, hãy vẽ spirograph và tôi cho nó kích thước là năm. + +116 +00:07:45,470 --> 00:07:47,750 +Vì vậy, nhỏ hơn một chút so với + +117 +00:07:48,050 --> 00:07:52,100 +lần trước, nghiêng một chút mỗi lần. Bạn có thể thấy rằng nếu tôi chạy mã này, + +118 +00:07:52,490 --> 00:07:53,780 +chúng tôi sẽ gặp lỗi. + +119 +00:07:54,350 --> 00:07:59,350 +Và lỗi nói rằng đối tượng float không thể được sử dụng như một số nguyên và nó cho chúng ta + +120 +00:08:00,650 --> 00:08:03,380 +biết chúng ta có đối tượng float đó ở đâu. + +121 +00:08:03,950 --> 00:08:08,240 +Vì vậy, hãy nhớ rằng con số này sẽ đi vào đây và sau đó 360 + +122 +00:08:08,300 --> 00:08:13,220 +chia cho năm thực sự sẽ cung cấp cho chúng ta một số dấu phẩy động, mặc dù + +123 +00:08:13,220 --> 00:08:16,070 +nó chia rõ ràng chỉ vì đây là cách phép + +124 +00:08:16,100 --> 00:08:19,340 +chia hoạt động trong Python. Bây giờ, thật không + +125 +00:08:19,370 --> 00:08:24,370 +may, mặc dù hàm phạm vi của chúng ta sẽ cần một số nguyên, một + +126 +00:08:25,160 --> 00:08:26,030 +số nguyên. + +127 +00:08:26,360 --> 00:08:30,890 +Nó không thể lấy một số dấu phẩy động vì sau đó chúng ta lặp lại nó bao + +128 +00:08:30,890 --> 00:08:34,070 +nhiêu lần? 3. 4 lần? Điều đó thậm chí có nghĩa là gì? + +129 +00:08:34,370 --> 00:08:37,130 +Vì vậy, đầu vào này phải là một số nguyên. + +130 +00:08:37,520 --> 00:08:42,520 +Vì vậy, hãy biến nó thành một số nguyên bằng cách tạo một số nguyên và sau đó đặt + +131 +00:08:44,059 --> 00:08:48,470 +phép tính này bên trong dấu ngoặc. Vì vậy, bây giờ khi chúng tôi chạy + +132 +00:08:48,500 --> 00:08:53,500 +mã của mình, bạn có thể thấy nó vẽ biểu đồ xoắn của chúng tôi, dịch chuyển năm độ mỗi lần. + +133 +00:08:54,710 --> 00:08:59,670 +Và một khi nó trải qua tất cả các lần lặp lại và biểu đồ xoắn + +134 +00:08:59,670 --> 00:09:02,280 +hoàn tất, thì nó thực sự dừng lại. + +135 +00:09:03,750 --> 00:09:07,050 +Bạn đã xoay sở để tìm ra giải pháp cho thử thách này chưa? + +136 +00:09:07,500 --> 00:09:12,500 +Nếu không, hãy nhớ xem lại bài học này và sửa mã của bạn nếu cần. Một khi bạn hài lòng với mọi thứ + +137 +00:09:13,020 --> 00:09:15,600 +mà chúng tôi đã giải thích cho đến nay, + +138 +00:09:16,050 --> 00:09:19,080 +thì đã đến lúc phải đi đến thử thách cuối cùng. + +139 +00:09:19,530 --> 00:09:22,560 +Hãy tiếp tục và tạo ra một bức tranh triệu đô. + +140 +00:09:23,160 --> 00:09:26,400 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 Colorgram-Package.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 Colorgram-Package.url new file mode 100644 index 0000000000000000000000000000000000000000..296d97bbc56916b032f06aa484851949d8a2fad5 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 Colorgram-Package.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pypi.org/project/colorgram.py/ \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 The Hirst Painting Project Part 1 - How to Extract RGB Values from Images.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 The Hirst Painting Project Part 1 - How to Extract RGB Values from Images.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..182afed16971a0826a36b3f5a28430ea61d22a55 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 The Hirst Painting Project Part 1 - How to Extract RGB Values from Images.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:090b7b1ac89e7aab585eaa5f4d7e6302f7d2d3733e70e3343f359c9f311d26d4 +size 212165036 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 The Hirst Painting Project Part 1 - How to Extract RGB Values from Images_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 The Hirst Painting Project Part 1 - How to Extract RGB Values from Images_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..395190eeb1ed4b4a2f6dc13c16e4504c317f4b95 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 The Hirst Painting Project Part 1 - How to Extract RGB Values from Images_vi.srt @@ -0,0 +1,784 @@ +1 +00:00:00,480 --> 00:00:02,370 +Câu hỏi này có vẻ hơi kỳ + +2 +00:00:02,400 --> 00:00:07,260 +quặc, nhưng bạn đã bao giờ đến một viện bảo tàng nghệ thuật và xem triển lãm và + +3 +00:00:07,260 --> 00:00:08,093 +tự nghĩ, + +4 +00:00:08,550 --> 00:00:13,550 +tôi nghĩ mình có thể làm được điều này và thực sự không hiểu tại sao nó lại + +5 +00:00:14,160 --> 00:00:16,880 +được coi là nghệ thuật. Chà, đây là một tác phẩm nghệ thuật của + +6 +00:00:16,940 --> 00:00:21,320 +Goldschmied và Chiari có tên 'Tối nay chúng ta nên đi khiêu vũ ở đâu? '. + +7 +00:00:22,130 --> 00:00:24,950 +Và nó có nghĩa là một tác phẩm nghệ + +8 +00:00:25,280 --> 00:00:30,110 +thuật ý tưởng, nhưng khi những người dọn dẹp bảo tàng đến đây vào cuối ngày và + +9 +00:00:30,110 --> 00:00:35,110 +nhìn vào đống tàn thuốc, giày dép và những chai lọ ngẫu nhiên này, họ nghĩ rằng + +10 +00:00:35,600 --> 00:00:39,140 +đó là rác và họ đã nhanh chóng dọn dẹp mọi thứ. + +11 +00:00:39,590 --> 00:00:43,640 +Vì vậy, đây là những gì triển lãm trông như thế nào sau khi dọn dẹp + +12 +00:00:43,640 --> 00:00:46,190 +xong vào ngày hôm sau. Vì vậy, trước sự + +13 +00:00:46,550 --> 00:00:51,550 +kinh hoàng của bảo tàng, triển lãm ngôi sao của họ bị dọn sạch và bị nhầm là rác rưởi. + +14 +00:00:52,880 --> 00:00:56,480 +Vì vậy, tôi đang nói chuyện với một người bạn và tôi nói, bạn biết đấy, rất nhiều + +15 +00:00:56,540 --> 00:00:59,510 +tác phẩm nghệ thuật hiện đại này, tôi có thể làm được, phải không? + +16 +00:00:59,540 --> 00:01:03,680 +Chúng tôi có thể tụ tập với nhau, đặt vài cái chai trên sàn, làm lộn + +17 +00:01:03,710 --> 00:01:07,070 +xộn, gọi đó là nghệ thuật. Và anh ấy nói với tôi, thực ra, không, bạn không thể. + +18 +00:01:07,220 --> 00:01:10,820 +Và bạn nên đọc cuốn sách có tên là con cá mập nhồi 12 triệu đô la này. + +19 +00:01:11,360 --> 00:01:14,150 +Và nó nói về tính kinh tế của nghệ thuật đương đại. + +20 +00:01:14,210 --> 00:01:15,650 +Và đó là một bài đọc hấp dẫn. + +21 +00:01:15,680 --> 00:01:20,680 +Tôi đã học được rất nhiều điều về cách định giá của nghệ thuật đương đại và lý do tại + +22 +00:01:20,720 --> 00:01:25,670 +sao chúng được định giá theo cách của chúng. Nhưng nó cũng khiến tôi khám phá ra một số khám + +23 +00:01:25,700 --> 00:01:28,190 +phá khá lớn, gây sốc. Ví dụ: tác + +24 +00:01:28,190 --> 00:01:33,190 +phẩm nghệ thuật được đề cập trên bìa của trang là con cá mập này. + +25 +00:01:33,920 --> 00:01:37,040 +Đó là một con cá mập được đánh bắt ngoài khơi bờ biển + +26 +00:01:37,370 --> 00:01:42,200 +Australia và sau đó nó được bảo quản trong formaldehyde. Nhưng nó đã được bảo quản thực sự tồi tệ như + +27 +00:01:42,200 --> 00:01:44,060 +họ không sử dụng đủ hóa chất và con + +28 +00:01:44,090 --> 00:01:48,500 +cá mập bắt đầu chuyển sang màu xanh lá cây và một chút màu xám ở những nơi khác và + +29 +00:01:48,500 --> 00:01:50,060 +nó cũng bắt đầu bị mốc. + +30 +00:01:50,660 --> 00:01:55,660 +Nhưng con cá mập xanh mốc này đã được mua với giá 12 triệu USD. + +31 +00:01:56,510 --> 00:02:00,470 +Và đây thậm chí không phải là tác phẩm điên rồ nhất. Ví dụ, chiếc đầu lâu nạm + +32 +00:02:00,470 --> 00:02:04,790 +kim cương này được cho là đã được bán với giá 50 triệu đô la. + +33 +00:02:05,150 --> 00:02:07,130 +Và những cánh bướm đã được mổ xẻ và + +34 +00:02:07,130 --> 00:02:12,130 +dán vào một tấm bạt này đã được bán với giá 8 chiếc. 5 triệu. + +35 +00:02:13,280 --> 00:02:15,920 +Vậy chính xác thì kẻ điên rồ này là + +36 +00:02:15,950 --> 00:02:20,090 +ai, người đã tạo ra tất cả những tác phẩm nghệ thuật có giá + +37 +00:02:20,090 --> 00:02:23,180 +trị điên rồ này? Đó là một người tên là Damien Hirst. + +38 +00:02:23,750 --> 00:02:28,460 +Và tôi nghĩ trong số tất cả các bức tranh của anh ấy, bức điên rồ nhất là những bức tranh vẽ đốm, bởi vì nó thực + +39 +00:02:28,790 --> 00:02:33,790 +sự là những đốm màu được sắp xếp ngẫu nhiên trên một trang giấy. Và kiểm tra điều + +40 +00:02:37,130 --> 00:02:38,060 +này. + +41 +00:02:38,120 --> 00:02:43,120 +Tác phẩm cụ thể này đã được bán với giá khổng lồ 1. 275 triệu + +42 +00:02:43,700 --> 00:02:45,920 +bảng. + +43 +00:02:46,580 --> 00:02:48,950 +Vì vậy, có thể giống như $ 1. 5 triệu. + +44 +00:02:49,580 --> 00:02:53,120 +Thật là điên rồ đối với một bức tranh về các dấu chấm. + +45 +00:02:53,720 --> 00:02:57,770 +Nhưng điều tôi nghĩ thậm chí còn điên rồ hơn là nếu bạn nhìn vào bức tranh này, + +46 +00:02:57,800 --> 00:02:59,920 +ít nhất nó có khá ít chấm, phải không? + +47 +00:03:00,340 --> 00:03:04,150 +Bạn đang nhận được những dấu chấm đáng giá tiền của mình. Nhưng hãy nhìn cái này! + +48 +00:03:04,550 --> 00:03:07,740 +Đây là cùng một nghệ sĩ, Damien Hirst, và bức tranh này, + +49 +00:03:07,770 --> 00:03:12,770 +tôi đếm được chỉ có 25 bức và bức tranh này đã được bán với giá nửa triệu bảng. + +50 +00:03:15,390 --> 00:03:19,980 +Nó thậm chí không phải về số lượng các điểm. Vì vậy, cá nhân tôi, như bạn thấy, + +51 +00:03:19,980 --> 00:03:22,560 +không thể thực sự tạo ra nghệ thuật đương đại, + +52 +00:03:23,070 --> 00:03:28,070 +nhưng những gì tôi có thể tìm ra là làm thế nào để lấy mã Python để bẻ + +53 +00:03:29,520 --> 00:03:30,353 +khóa bảng màu + +54 +00:03:30,360 --> 00:03:35,360 +của Damien Hirst và sử dụng những màu đó để tạo ra một bức tranh vẽ ngẫu nhiên + +55 +00:03:39,540 --> 00:03:40,373 +trông không + +56 +00:03:40,470 --> 00:03:44,670 +kém, nếu không muốn nói là hấp dẫn hơn một số trong Damien Hirst gốc. + +57 +00:03:45,180 --> 00:03:48,480 +Vì vậy, đây là những gì chúng tôi sẽ làm trong dự án của chúng tôi. + +58 +00:03:49,080 --> 00:03:54,080 +Và chúng tôi sẽ sử dụng gói màu đó, bảng màu, để nắm giữ bảng màu và sau + +59 +00:03:54,810 --> 00:03:55,643 +đó chúng + +60 +00:03:55,800 --> 00:04:00,780 +tôi sẽ sử dụng những màu đó để tạo ra bức tranh điểm của riêng chúng tôi + +61 +00:04:01,020 --> 00:04:03,600 +trông giống như thế này. Đầu tiên, chúng ta + +62 +00:04:03,630 --> 00:04:08,630 +sẽ sử dụng một gói có tên là colorgram và colorgram là một thư viện mã được + +63 +00:04:10,560 --> 00:04:14,700 +viết bằng Python cho phép bạn trích xuất màu sắc từ hình ảnh. + +64 +00:04:15,150 --> 00:04:18,149 +Vì vậy, ví dụ, nếu bạn nhìn vào bức tranh + +65 +00:04:18,360 --> 00:04:23,360 +này, sau khi nó được chạy qua bảng màu và 10 màu phổ biến nhất được trích + +66 +00:04:24,690 --> 00:04:29,160 +xuất, bạn sẽ có một bảng màu trông khá giống với các màu trong + +67 +00:04:29,160 --> 00:04:29,993 +hình ảnh. + +68 +00:04:30,360 --> 00:04:35,340 +Đây là ví dụ về cách bạn sử dụng gói colorgram này. + +69 +00:04:35,760 --> 00:04:39,480 +Và trong trường hợp này, họ đang trích xuất sáu màu từ một + +70 +00:04:39,750 --> 00:04:44,670 +hình ảnh, vì vậy về cơ bản, nó cần hai đầu vào, một hình ảnh và số lượng màu. + +71 +00:04:45,510 --> 00:04:49,860 +Nếu chúng ta vào tìm kiếm hình ảnh trên Google và tìm kiếm bức tranh vẽ tại chỗ của Hirst, bạn có + +72 +00:04:50,280 --> 00:04:53,940 +thể thấy rằng có rất nhiều bức tranh vẽ tại chỗ mà anh chàng này đã tạo ra. + +73 +00:04:54,480 --> 00:04:59,460 +Tôi muốn bạn chọn một bức tranh có bảng màu mà bạn thích, ừm, có + +74 +00:04:59,790 --> 00:05:04,470 +thể như thế này, hoặc có thể sáng hơn một chút như bức này. + +75 +00:05:05,010 --> 00:05:05,850 +Nhưng về cơ + +76 +00:05:05,910 --> 00:05:09,810 +bản, hãy chọn một trong những hình ảnh này và sau đó tiếp tục và tải xuống. + +77 +00:05:10,260 --> 00:05:11,910 +Vì vậy, hãy lưu hình ảnh. + +78 +00:05:12,600 --> 00:05:16,560 +Và sau đó bạn sẽ lưu hình ảnh đó dưới dạng hình ảnh. jpg, + +79 +00:05:16,620 --> 00:05:20,820 +vậy jpg. Và sau đó tiếp tục và nhấn lưu. + +80 +00:05:22,620 --> 00:05:26,070 +Bây giờ, hãy tiếp tục và tạo một dự án PyCharm mới. + +81 +00:05:26,130 --> 00:05:30,090 +Tôi đã gọi là bức tranh hirst-painting của tôi, bạn có thể gọi là của bạn bất cứ thứ gì bạn muốn. + +82 +00:05:30,870 --> 00:05:33,720 +Bây giờ chúng ta sẽ kéo hình ảnh, hình + +83 +00:05:33,990 --> 00:05:38,640 +ảnh mới tải xuống của chúng ta. jpeg vào thư mục dự án này, hirst-painting. + +84 +00:05:39,210 --> 00:05:42,120 +Và nó sẽ hỏi bạn xem liệu bạn có muốn chuyển tệp từ, trong + +85 +00:05:42,150 --> 00:05:46,020 +trường hợp của tôi, thư mục tải xuống sang dự án vẽ tranh đầu tiên của tôi hay không. + +86 +00:05:46,620 --> 00:05:49,470 +Vì vậy, sau đó chúng tôi sẽ đồng ý và nhấp vào refactor. + +87 +00:05:50,040 --> 00:05:54,600 +Vì vậy, bây giờ bức tranh này nằm trong dự án vẽ tranh đầu tiên của tôi, và tôi đã sẵn sàng để tiếp + +88 +00:05:54,990 --> 00:05:59,180 +tục và tạo một tệp mới có tên là chính. py đó là những gì + +89 +00:05:59,570 --> 00:06:04,160 +tôi sẽ sử dụng để trích xuất màu sắc từ hình ảnh này. + +90 +00:06:05,720 --> 00:06:06,920 +Đây là một thách thức dành cho bạn. + +91 +00:06:07,070 --> 00:06:10,790 +Xem liệu bạn có thể tìm ra cách sử dụng gói này, colorgram, bằng + +92 +00:06:10,820 --> 00:06:15,820 +cách sử dụng mô tả dự án của họ tại đây và sử dụng mã ví dụ hay không. + +93 +00:06:16,880 --> 00:06:21,880 +Mục đích của bạn là có thể in ra danh sách tất cả các màu được trích + +94 +00:06:22,520 --> 00:06:27,520 +xuất từ hình ảnh và mỗi mục trong danh sách là một bộ nguyên liệu mà + +95 +00:06:28,610 --> 00:06:29,443 +bạn tạo. + +96 +00:06:29,690 --> 00:06:34,690 +Vì vậy, hãy nhớ trước đây chúng ta đã thấy cách mô-đun rùa thích làm việc với các + +97 +00:06:34,940 --> 00:06:38,900 +bộ màu được tạo ra với một lượng màu đỏ, lượng màu xanh + +98 +00:06:39,200 --> 00:06:44,200 +lá cây và lượng màu xanh lam, tất cả đều được chứa bên trong một bộ giá trị. + +99 +00:06:44,900 --> 00:06:47,990 +Đây là định dạng mà bạn sẽ thử và đưa dữ liệu của mình vào. + +100 +00:06:48,340 --> 00:06:50,720 +Có thể mất một chút băn khoăn và một chút + +101 +00:06:50,990 --> 00:06:54,440 +suy nghĩ, nhưng ngay trước khi bạn bắt đầu, đây là một thông tin nhanh. + +102 +00:06:54,980 --> 00:06:59,630 +Tôi nhận thấy điều đó khi tôi đang thử nghiệm điều này trên repl. nó và khi tôi tìm kiếm gam + +103 +00:06:59,630 --> 00:07:01,880 +màu trong các gói, tôi + +104 +00:07:02,060 --> 00:07:06,560 +thực sự không thể tìm thấy gói để cài đặt vào dự án. + +105 +00:07:06,980 --> 00:07:10,790 +Vì vậy, đây là một lý do chính đáng khác để sử dụng PyCharm. + +106 +00:07:11,120 --> 00:07:15,320 +Nó chỉ cung cấp cho bạn tất cả các công cụ chuyên nghiệp và nó có quyền truy cập + +107 +00:07:15,320 --> 00:07:18,830 +vào tất cả những thứ bạn cần. Vì vậy, hãy tạm dừng video và hoàn thành thử thách này. + +108 +00:07:20,870 --> 00:07:24,260 +Được rồi. Vì vậy, chúng tôi biết rằng + +109 +00:07:24,290 --> 00:07:28,010 +để sử dụng các gói bên ngoài, những gói không được cài đặt với thư viện + +110 +00:07:28,340 --> 00:07:33,340 +chuẩn Python, trước tiên chúng tôi phải cài đặt gói. Để cài đặt một gói, chúng tôi đi đến tùy + +111 +00:07:33,410 --> 00:07:38,000 +chọn của mình và sau đó chúng tôi chọn dự án của mình và sau đó chúng tôi đi + +112 +00:07:38,450 --> 00:07:40,700 +đến trình thông dịch dự án của chúng tôi. + +113 +00:07:41,240 --> 00:07:44,720 +Bây giờ chúng ta nhấp vào nút dấu cộng và chúng ta tìm kiếm colorgram. + +114 +00:07:45,500 --> 00:07:49,250 +Và nó đây. Bây giờ chúng ta hãy tiếp tục và cài đặt gói. + +115 +00:07:49,640 --> 00:07:54,470 +Và khi đã cài đặt thành công, chúng ta có thể đóng tất cả những + +116 +00:07:54,500 --> 00:07:58,400 +thứ này lại và bấm OK. Bây giờ chúng tôi đã có gói của mình, + +117 +00:07:58,430 --> 00:08:01,910 +chúng tôi thực sự có thể nhập nó. Vì vậy, chúng tôi sẽ nhập colorgram và chúng + +118 +00:08:02,780 --> 00:08:07,780 +tôi có thể sử dụng phương pháp được mô tả ở đây gọi là cologram. chiết xuất để có + +119 +00:08:10,160 --> 00:08:15,050 +được sáu màu. Bây giờ, nếu chúng ta muốn có nhiều màu hơn, + +120 +00:08:15,620 --> 00:08:18,830 +chẳng hạn như trong hình ảnh này, đó có thể là 30 màu tốt. + +121 +00:08:18,920 --> 00:08:23,060 +Vì vậy, hãy tiếp tục và trích xuất 30 màu từ hình ảnh này. + +122 +00:08:23,360 --> 00:08:27,320 +Nhưng tất nhiên hình ảnh của chúng ta không được gọi là sweet_pic. jpg. + +123 +00:08:27,440 --> 00:08:29,870 +Của chúng tôi thực sự được gọi là hình ảnh. jpg. + +124 +00:08:30,320 --> 00:08:35,150 +Vì vậy, hãy tiếp tục và đổi tên hình ảnh này để nó phù hợp với tệp của chúng ta. + +125 +00:08:35,630 --> 00:08:40,520 +Và hãy nhớ rằng hình ảnh của bạn phải ở cùng cấp độ với hình ảnh chính của bạn. py để loại mã + +126 +00:08:40,520 --> 00:08:42,380 +này hoạt động. + +127 +00:08:42,590 --> 00:08:46,820 +Vì vậy, hãy đảm bảo rằng bạn đã có nó bên trong thư mục dự án + +128 +00:08:46,820 --> 00:08:48,980 +hirst-paint, ở cùng mức thụt lề như chính. + +129 +00:08:49,400 --> 00:08:54,260 +Bây giờ chúng ta hãy tiếp tục và in ra các màu được tạo ra. + +130 +00:08:54,710 --> 00:08:58,620 +Và hãy nhớ rằng khi bạn nhấn run, quá trình này có thể mất một chút thời gian. + +131 +00:08:59,100 --> 00:09:02,370 +Và tác giả của thư viện nói rằng đối với một hình + +132 +00:09:02,370 --> 00:09:07,170 +ảnh 512 x 512, nó mất khoảng 0. 6 giây. + +133 +00:09:07,770 --> 00:09:10,980 +Rõ ràng, nếu hình ảnh lớn hơn, nó có thể sẽ lâu hơn một chút. + +134 +00:09:11,580 --> 00:09:15,720 +Hãy tiếp tục và nhấn run và xem những gì chúng ta nhận được. + +135 +00:09:17,070 --> 00:09:19,350 +Khi quá trình kết thúc, bạn có thể + +136 +00:09:19,380 --> 00:09:24,380 +thấy nó được tạo ra một số màu và những màu này nằm trong danh sách và nó có + +137 +00:09:26,730 --> 00:09:31,730 +một số định dạng khác nhau cho màu sắc. Để hiểu điều đó, chúng ta phải quay lại + +138 +00:09:32,280 --> 00:09:33,720 +tài liệu của mình. + +139 +00:09:34,260 --> 00:09:38,610 +Bạn có thể thấy rằng màu được trích xuất có thể là màu RGB mà + +140 +00:09:38,640 --> 00:09:42,120 +chúng tôi quan tâm hoặc màu HSL không hoàn toàn như + +141 +00:09:42,330 --> 00:09:44,130 +những gì chúng tôi muốn. + +142 +00:09:44,610 --> 00:09:49,610 +Vì vậy, hãy tiếp tục và viết một vòng lặp for kết hợp với từng màu đó. + +143 +00:09:53,750 --> 00:09:56,210 +Vì vậy, đối với màu sắc, hãy tiếp + +144 +00:09:56,810 --> 00:10:01,810 +tục và tạo một danh sách mới có tên là rgb_colors, và chúng ta sẽ chỉ + +145 +00:10:04,700 --> 00:10:09,470 +để nó như một danh sách trống. Và sau đó đối với mỗi + +146 +00:10:09,530 --> 00:10:14,530 +màu này, chúng ta sẽ thêm vào rgb_colors của mình bằng cách thêm vào. + +147 +00:10:15,440 --> 00:10:19,550 +Và thứ chúng ta sắp xếp là từng đối tượng màu riêng lẻ này, và sau + +148 +00:10:19,970 --> 00:10:22,400 +đó chúng ta sẽ nhận được giá trị RGB. + +149 +00:10:23,240 --> 00:10:25,820 +Và khi quá trình này hoàn tất, hãy + +150 +00:10:26,120 --> 00:10:29,330 +tiếp tục và in các màu RGB của chúng ta. + +151 +00:10:30,500 --> 00:10:35,480 +Vì vậy, bây giờ bạn có thể thấy chúng ta có một loạt các màu RGB với r + +152 +00:10:35,480 --> 00:10:37,130 +bằng gì, g bằng gì + +153 +00:10:37,430 --> 00:10:41,870 +và b bằng gì, nhưng đây không phải là định dạng mà chúng ta cần để + +154 +00:10:41,870 --> 00:10:45,380 +sử dụng nó bên trong con rùa. Chúng tôi thực sự phải tiến thêm một bước nữa. + +155 +00:10:45,830 --> 00:10:47,900 +Chúng ta phải tạo ra một chữ + +156 +00:10:48,110 --> 00:10:53,110 +r từ màu sắc. rgb. r và sau đó chúng + +157 +00:10:55,520 --> 00:10:59,180 +tôi lặp lại quá trình này cho màu xanh lá cây và + +158 +00:11:00,890 --> 00:11:02,090 +màu xanh lam. + +159 +00:11:04,700 --> 00:11:09,700 +Và sau đó, chúng tôi tạo bộ tuple của chúng tôi bằng cách tạo new_color của + +160 +00:11:10,850 --> 00:11:14,780 +chúng tôi sẽ bằng với một bộ tuple có dấu ngoặc đơn và + +161 +00:11:14,810 --> 00:11:19,490 +sau đó là r, g và b. Cuối cùng, chúng tôi sẽ + +162 +00:11:19,490 --> 00:11:24,490 +thêm vào rgb_colors của mình bằng cách thêm màu mới này. + +163 +00:11:25,910 --> 00:11:29,150 +Bây giờ chúng ta hãy in rgb_colors của chúng ta. + +164 +00:11:34,550 --> 00:11:35,600 +Và bạn có thể + +165 +00:11:35,600 --> 00:11:40,600 +thấy cuối cùng chúng tôi đã có nó ở định dạng mà chúng tôi cần, một bộ giá trị r, giá trị + +166 +00:11:41,600 --> 00:11:45,530 +g và giá trị b mà chúng tôi có thể sử dụng trong dự án của mình. + +167 +00:11:46,190 --> 00:11:50,990 +Bây giờ chúng tôi đã giải quyết được phần đầu tiên của vấn đề nên chúng tôi có thể tiếp tục sao chép toàn + +168 +00:11:50,990 --> 00:11:55,990 +bộ danh sách này và dán nó vào chính của chúng tôi. py + +169 +00:11:58,270 --> 00:12:01,540 +Tôi khuyên bạn nên thực sự thử nghiệm những + +170 +00:12:01,840 --> 00:12:04,780 +màu này bằng công cụ RGB của w3schools. + +171 +00:12:05,050 --> 00:12:09,760 +Hãy tiếp tục và dán màu của bạn để thay thế bộ tuple hiện tại này tại đây. + +172 +00:12:10,180 --> 00:12:14,230 +Đảm bảo rằng bạn vẫn có từ rgb đó ở đó, sau đó nhấn enter + +173 +00:12:14,680 --> 00:12:18,190 +và nó sẽ chèn từng giá trị này vào r, g và b. + +174 +00:12:18,640 --> 00:12:22,030 +Vì vậy, bạn có thể thấy màu đầu tiên chúng tôi nhận được thực sự là một màu trắng, + +175 +00:12:22,030 --> 00:12:24,100 +vì vậy có thể là một trong những hình nền. + +176 +00:12:24,730 --> 00:12:28,630 +Vì vậy, chúng ta có thể tiếp tục và xóa cái đó đi vì chúng ta sẽ không + +177 +00:12:28,630 --> 00:12:31,090 +vẽ nền theo ý mình. Nó sẽ chỉ có màu trắng. + +178 +00:12:31,510 --> 00:12:36,310 +Bây giờ chúng ta hãy kiểm tra cái tiếp theo. Như bạn có thể thấy, các con số + +179 +00:12:36,340 --> 00:12:40,450 +càng gần với 255, thì càng có nhiều khả năng nó có màu trắng. + +180 +00:12:40,840 --> 00:12:45,280 +Vì vậy, màu này có thể là một trong các màu nền khác trong hình ảnh này nên chúng ta + +181 +00:12:45,490 --> 00:12:48,730 +cũng có thể xóa màu đó. Và cuối cùng, cái + +182 +00:12:48,730 --> 00:12:52,570 +cuối cùng này có lẽ cũng sẽ khá trắng, và chúng + +183 +00:12:53,020 --> 00:12:58,020 +ta có thể xóa cái đó đi. Cái này vì màu xanh lam, + +184 +00:12:58,810 --> 00:13:03,580 +màu 109 Tôi sẽ khá chắc chắn rằng đây thực sự là màu thật. + +185 +00:13:04,270 --> 00:13:06,370 +Và chúng ta bắt đầu, chúng ta nhận + +186 +00:13:06,910 --> 00:13:10,690 +được loại màu cát này, trông rất giống với một số màu chúng ta thấy ở đây. + +187 +00:13:11,080 --> 00:13:13,060 +Vì vậy, chúng ta có thể cho rằng phần + +188 +00:13:13,120 --> 00:13:17,770 +còn lại của những bức tranh này, vì chúng được lấy mẫu theo tần suất xuất hiện, có lẽ sẽ là những màu + +189 +00:13:17,770 --> 00:13:20,290 +thực mà chúng ta có thể đưa vào bức tranh của mình. + +190 +00:13:20,770 --> 00:13:24,340 +Hãy lưu danh sách này dưới dạng color_list của chúng tôi và + +191 +00:13:27,070 --> 00:13:32,070 +chúng tôi có thể nhận xét phần còn lại của mã này vì chúng tôi không cần phải + +192 +00:13:32,110 --> 00:13:33,970 +chạy tính toán này mỗi lần. + +193 +00:13:34,240 --> 00:13:39,240 +Chúng tôi chỉ muốn trích xuất các màu và sau đó bạn có thể xóa hoặc nhận + +194 +00:13:39,490 --> 00:13:43,030 +xét mã liên quan đến colorgram. Trong bài học tiếp theo, chúng + +195 +00:13:43,060 --> 00:13:47,230 +ta sẽ sử dụng danh sách màu này để tạo bức tranh Hirst của chúng ta. + +196 +00:13:47,650 --> 00:13:49,210 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 hirst-painting-start.zip b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 hirst-painting-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..63101a2424502aa95fe0f41b102000bc8e9f31c6 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/010 hirst-painting-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72144130aee834e3f74b801f7fedb10a2003206bcda713738e16fc3a1c326032 +size 19507 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 Course-Fixes-Report-an-Issue.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 Hirst-Painting-Project-Final-Code.url b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 Hirst-Painting-Project-Final-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..e3a5344cf02a43ed31ee2c3f0dca6bcc5954b25d --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 Hirst-Painting-Project-Final-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/hirstpainting-final \ No newline at end of file diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 The Hirst Painting Project Part 2 - Drawing the Dots.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 The Hirst Painting Project Part 2 - Drawing the Dots.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2afe9ec3a3a96da964eece91dfc391ca29027d3c --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 The Hirst Painting Project Part 2 - Drawing the Dots.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:175060af3aa08570bc39a5c3f5ec23a2f5b46c49d7f0d061550cc356c1c65329 +size 120324235 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 The Hirst Painting Project Part 2 - Drawing the Dots_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 The Hirst Painting Project Part 2 - Drawing the Dots_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..00fb8de1ba52b0a4b25077b37d7d6601c3303e51 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/011 The Hirst Painting Project Part 2 - Drawing the Dots_vi.srt @@ -0,0 +1,712 @@ +1 +00:00:00,270 --> 00:00:05,270 +Bây giờ chúng tôi đã sử dụng bảng màu để trích xuất tất cả các màu từ hình ảnh của mình và + +2 +00:00:06,630 --> 00:00:11,490 +chúng tôi đã tạo một danh sách từ việc trích xuất đó và chúng tôi đã loại bỏ tất cả các + +3 +00:00:11,490 --> 00:00:12,323 +sắc thái trắng, sau + +4 +00:00:12,660 --> 00:00:17,660 +đó chúng tôi đã sẵn sàng tiếp tục và bắt đầu sử dụng danh sách màu này để tạo bức tranh Hirst + +5 +00:00:18,630 --> 00:00:19,463 +của chúng tôi. + +6 +00:00:19,620 --> 00:00:23,490 +Vì vậy, bạn có thể xóa phần còn lại của mã hoặc để lại phần nhận xét. + +7 +00:00:24,000 --> 00:00:29,000 +Nhưng mục tiêu của thử thách là sử dụng con rùa và những màu mà bạn vừa + +8 +00:00:29,400 --> 00:00:33,240 +trích xuất để tạo ra một bức tranh đốm như thế này. + +9 +00:00:33,750 --> 00:00:36,270 +Đây là yêu cầu của chương trình. + +10 +00:00:36,810 --> 00:00:41,810 +Bạn sẽ vẽ một bức tranh với 10 x 10 hàng điểm. + +11 +00:00:42,900 --> 00:00:47,700 +Vì vậy, đó sẽ là 10 dọc theo bên này và 10 dọc theo bên này. + +12 +00:00:48,330 --> 00:00:53,330 +Mỗi dấu chấm của bạn phải có kích thước khoảng 20 và cách nhau khoảng + +13 +00:00:53,490 --> 00:00:54,323 +50 bước. + +14 +00:00:54,990 --> 00:00:59,990 +Vì vậy, bạn sẽ cần phải xem tài liệu về rùa để tìm ra cách + +15 +00:01:00,060 --> 00:01:01,590 +vẽ những chấm này. + +16 +00:01:02,160 --> 00:01:06,750 +Bạn sẽ phải tìm ra cách di chuyển con rùa của mình để nó tạo ra mẫu + +17 +00:01:06,780 --> 00:01:11,780 +10 x 10 này và vẽ hàng trăm chấm của chúng tôi bằng cách sử dụng bảng màu + +18 +00:01:13,260 --> 00:01:16,410 +mà chúng tôi đã tạo. Đây là cơ hội để bạn + +19 +00:01:16,710 --> 00:01:20,100 +tỏa sáng và đã đến lúc tạm dừng video và hoàn thành dự án cuối cùng. + +20 +00:01:25,880 --> 00:01:30,140 +Vì vậy, điều đầu tiên chúng tôi sẽ làm là tất nhiên chúng tôi sẽ cần nhập khẩu rùa + +21 +00:01:30,200 --> 00:01:31,070 +của chúng tôi. + +22 +00:01:31,640 --> 00:01:35,720 +Và tôi sẽ đặt cho nó một bí danh chỉ để làm rõ hơn nó + +23 +00:01:35,720 --> 00:01:40,550 +là gì mà tôi đang đề cập đến. Tôi sẽ tạo ra con rùa của mình, mà tôi sẽ gọi lại là Tim. + +24 +00:01:40,970 --> 00:01:45,050 +Và nó sẽ được tạo ra từ mô-đun rùa và bên trong đó, + +25 +00:01:45,080 --> 00:01:46,700 +có một lớp rùa. + +26 +00:01:47,360 --> 00:01:51,740 +Bây giờ chúng tôi đã tạo và lưu đối tượng của mình bên trong Tim, chúng tôi đã sẵn + +27 +00:01:52,160 --> 00:01:55,310 +sàng để tiếp tục và làm một số việc với con rùa này. + +28 +00:01:55,880 --> 00:01:59,210 +Nếu bạn xem tài liệu về rùa, bạn có thể thấy rằng + +29 +00:01:59,630 --> 00:02:04,630 +thay vì chỉ vẽ các vòng tròn hoặc chỉ di chuyển về phía trước hoặc trái hoặc phải, + +30 +00:02:05,030 --> 00:02:07,280 +bạn cũng có thể vẽ một dấu chấm. + +31 +00:02:07,820 --> 00:02:10,280 +Bây giờ một dấu chấm có hai + +32 +00:02:10,580 --> 00:02:13,310 +tham số, kích thước và màu sắc của nó. + +33 +00:02:13,760 --> 00:02:18,170 +Vì vậy, chúng tôi đã đề cập rằng chúng tôi sẽ vẽ một chấm kích thước 20 và sau đó + +34 +00:02:18,170 --> 00:02:22,340 +chúng tôi sẽ chuyển sang một màu ngẫu nhiên. Vì vậy, hãy tạo dấu chấm của chúng tôi. + +35 +00:02:22,370 --> 00:02:25,040 +Hãy nói thời gian. dấu chấm, và sau đó hãy cho + +36 +00:02:25,550 --> 00:02:30,550 +nó kích thước là 20 và sau đó hãy cho nó một màu ngẫu nhiên. Bây giờ vì chúng tôi đang sử + +37 +00:02:31,640 --> 00:02:36,640 +dụng màu RGB có các giá trị r, g và b từ 0 + +38 +00:02:39,380 --> 00:02:40,790 +đến 255, trước + +39 +00:02:41,330 --> 00:02:46,330 +tiên chúng tôi phải yêu cầu mô-đun rùa thay đổi chế độ màu + +40 +00:02:46,610 --> 00:02:49,910 +của nó thành 255. Và chúng ta đã thấy điều này trong các bài học trước. + +41 +00:02:50,510 --> 00:02:55,510 +Vì vậy, bây giờ chúng ta có thể đi vào danh sách màu của mình và chọn một màu ngẫu nhiên bằng cách sử dụng + +42 +00:02:56,870 --> 00:02:57,703 +mô-đun ngẫu nhiên. + +43 +00:02:58,160 --> 00:03:03,160 +Vì vậy, hãy nhấn vào mô-đun ngẫu nhiên và nắm giữ phương thức lựa chọn và chuyển vào color_list + +44 +00:03:04,450 --> 00:03:05,320 +của chúng tôi. + +45 +00:03:05,830 --> 00:03:10,210 +Vì vậy, bây giờ nó sẽ chọn một màu ngẫu nhiên từ danh sách đó và + +46 +00:03:10,360 --> 00:03:15,360 +sau đó hy vọng tạo một dấu chấm. Bây giờ chúng tôi không muốn bức vẽ của chúng tôi biến mất sau khi chúng + +47 +00:03:15,760 --> 00:03:17,800 +tôi nhấn run, bởi vì ngay bây giờ nếu tôi chạy đoạn mã + +48 +00:03:18,040 --> 00:03:20,650 +này, bạn có thể thấy nó vẽ một dấu chấm và sau đó nó nhanh chóng biến mất. + +49 +00:03:21,190 --> 00:03:26,190 +Vì vậy, hãy tạo một đối tượng màn hình mới từ mô-đun rùa và lớp được gọi + +50 +00:03:27,580 --> 00:03:28,630 +là màn hình. + +51 +00:03:29,170 --> 00:03:34,170 +Và sau đó, chúng ta có thể khiến màn hình của mình thay đổi hành vi của nó bằng cách gọi exitonclick. + +52 +00:03:36,430 --> 00:03:40,030 +Bằng cách này khi chúng tôi chạy mã của mình, bạn có thể thấy dấu chấm được sơn của chúng tôi + +53 +00:03:40,450 --> 00:03:42,910 +và sau đó chỉ khi chúng tôi nhấp vào, nó mới biến mất. + +54 +00:03:43,450 --> 00:03:46,060 +Vì vậy, chúng tôi đã cố gắng đưa dấu chấm đầu tiên của mình lên màn hình. + +55 +00:03:46,570 --> 00:03:50,710 +Bước tiếp theo là tìm cách chúng ta có thể lặp lại quá trình này. + +56 +00:03:51,280 --> 00:03:56,280 +Điều gì sẽ xảy ra nếu chúng ta khiến Tim của chúng ta tiến lên trước + +57 +00:03:56,500 --> 00:04:00,520 +50 bước, và sau đó chúng ta vẽ một dấu chấm khác. + +58 +00:04:00,640 --> 00:04:03,100 +Vì vậy, hãy đặt khối này vào một + +59 +00:04:04,540 --> 00:04:06,460 +vòng lặp, để nó chạy 10 + +60 +00:04:07,090 --> 00:04:11,800 +lần, và sau đó hãy thụt lề khối này để nó đi vào bên trong vòng lặp. + +61 +00:04:12,430 --> 00:04:15,670 +Và bây giờ con rùa của chúng ta sẽ vẽ 10 chấm. + +62 +00:04:16,180 --> 00:04:20,620 +Nhưng hãy chú ý cách nó tắt màn hình và nó bắt đầu nổ ở giữa. + +63 +00:04:21,130 --> 00:04:25,120 +Và cũng có những vấn đề khác như chúng ta đang vẽ đường khi + +64 +00:04:25,120 --> 00:04:28,330 +con rùa đang di chuyển. Hãy giải quyết từng việc một. + +65 +00:04:28,390 --> 00:04:33,100 +Hãy cố gắng di chuyển dấu chấm bắt đầu của chúng ta để nó bắt đầu từ đâu đó xuống đây. + +66 +00:04:33,730 --> 00:04:38,730 +Bây giờ có khá nhiều cách để giải quyết vấn đề này. Một cách đơn giản là xoay Tim của chúng + +67 +00:04:40,120 --> 00:04:45,120 +ta, con rùa, trước khi chúng ta đi vào vòng lặp và thiết lập tiêu đề của + +68 +00:04:46,000 --> 00:04:48,250 +nó để nó chỉ theo hướng này. + +69 +00:04:51,030 --> 00:04:56,030 +Bạn có thể chơi xung quanh tiêu đề và thông qua thử nghiệm của tôi + +70 +00:04:56,820 --> 00:04:58,110 +hoặc chơi xung quanh + +71 +00:04:58,140 --> 00:05:03,060 +mã, tôi nhận ra rằng tôi cần lấy tiêu đề này trong khoảng từ 180 + +72 +00:05:03,060 --> 00:05:03,893 +đến 270. + +73 +00:05:04,320 --> 00:05:09,120 +Vậy khoảng giữa 270 và 180 là bao nhiêu? Chà, nó + +74 +00:05:09,120 --> 00:05:12,150 +sẽ là 225. + +75 +00:05:12,630 --> 00:05:16,080 +Vì vậy, hãy thay đổi tiêu đề của chúng ta và thử lại. + +76 +00:05:17,670 --> 00:05:22,320 +Và bạn có thể thấy rằng con rùa của chúng ta hiện đang di chuyển gần đúng hướng. + +77 +00:05:22,890 --> 00:05:26,250 +Vì vậy, chúng ta biết rằng mỗi lần con rùa di chuyển được 50. + +78 +00:05:26,640 --> 00:05:31,530 +Vì vậy, nếu chúng ta muốn nó bắt đầu ở đây, thì chúng ta cần di chuyển nó + +79 +00:05:31,530 --> 00:05:33,480 +một, hai, ba, bốn, năm lần. + +80 +00:05:33,480 --> 00:05:36,840 +Vì vậy, 50 nhân năm là 250. + +81 +00:05:37,230 --> 00:05:42,230 +Vì vậy, chúng tôi sẽ đặt hướng đi cho Tim và sau đó chúng tôi sẽ giúp anh + +82 +00:05:42,720 --> 00:05:47,580 +ấy tiến về phía trước thêm 250 bước. Vì vậy, theo cách đó chúng tôi bắt đầu ngay tại đây. + +83 +00:05:48,270 --> 00:05:49,290 +Bây giờ, tại + +84 +00:05:49,290 --> 00:05:53,880 +thời điểm này, nó vẫn sẽ chỉ theo hướng mà chúng ta đã đặt ở đây. + +85 +00:05:54,240 --> 00:05:57,680 +Vì vậy, chúng tôi sẽ phải đặt tiêu đề trở về 0 nếu + +86 +00:05:57,710 --> 00:06:00,560 +chúng tôi muốn nó tiếp tục theo hướng này. + +87 +00:06:03,380 --> 00:06:04,280 +Bây giờ ở giai đoạn + +88 +00:06:04,310 --> 00:06:09,310 +này, bạn có thể nhận ra rằng bạn cần phải thực hiện một chút điều chỉnh. Vì vậy, chúng ta có thể di chuyển con rùa + +89 +00:06:10,220 --> 00:06:15,220 +của mình về phía trước thêm một chút để nó bắt đầu xung quanh đây và chúng ta có đủ + +90 +00:06:15,950 --> 00:06:18,440 +không gian cho các dấu chấm của mình. + +91 +00:06:19,640 --> 00:06:23,270 +Nhưng điều quan trọng tiếp theo mà chúng ta cần giải quyết trước khi bỏ đường + +92 +00:06:23,300 --> 00:06:25,730 +đi vì chúng ta vẫn có thể nhìn thấy đường + +93 +00:06:25,760 --> 00:06:29,990 +đi của con rùa, điều này thực sự hữu ích, đó là chúng ta cần tìm ra cách + +94 +00:06:30,260 --> 00:06:33,860 +để con rùa rẽ trái, di chuyển lên 50 , rẽ trái một lần nữa + +95 +00:06:34,220 --> 00:06:36,650 +và sau đó bắt đầu tạo hàng thứ hai. + +96 +00:06:37,580 --> 00:06:42,230 +Điều đó có nghĩa là chúng ta cần xoay Tim sao cho nó hướng lên, + +97 +00:06:42,620 --> 00:06:45,500 +có tiêu đề là 90, hoặc bạn cũng có thể + +98 +00:06:45,860 --> 00:06:48,650 +xoay nó sang trái một góc 90 độ. + +99 +00:06:49,190 --> 00:06:53,570 +Và sau đó, chúng ta sẽ làm cho nó tiến thêm 50 bước. + +100 +00:06:54,110 --> 00:06:57,200 +Và sau đó chúng ta sẽ làm cho nó rẽ trái một lần nữa. + +101 +00:06:57,230 --> 00:07:01,400 +Vì vậy, chúng tôi sẽ đặt tiêu đề thành 180, hướng về bên trái. + +102 +00:07:02,270 --> 00:07:05,450 +Thông qua những thay đổi khôn ngoan này đối với mã của bạn, + +103 +00:07:05,660 --> 00:07:08,660 +bạn thực sự có thể hiểu rõ về những gì nó đang + +104 +00:07:08,840 --> 00:07:12,680 +làm bởi vì bạn có thể thấy nó vẽ và sau đó xem nó có đang + +105 +00:07:12,680 --> 00:07:16,970 +làm những gì bạn muốn hay không. Bây giờ chúng ta biết rằng chúng ta + +106 +00:07:17,000 --> 00:07:20,840 +có vòng lặp for có thể vẽ một đường dấu chấm đi từ trái sang phải. + +107 +00:07:21,350 --> 00:07:25,040 +Tại sao chúng ta không di chuyển con rùa của mình để nó bắt đầu lại ở đây, và sau + +108 +00:07:25,460 --> 00:07:28,100 +đó nó có thể di chuyển dọc theo và tạo ra một đường khác? + +109 +00:07:29,510 --> 00:07:31,250 +Vì vậy, sau khi + +110 +00:07:31,490 --> 00:07:36,170 +xoay nó sang trái, chúng ta sẽ làm cho nó đi về phía + +111 +00:07:36,170 --> 00:07:38,240 +trước một, hai, ba, bốn, + +112 +00:07:38,240 --> 00:07:42,110 +năm, sáu, bảy, tám, chín, mười, nhân 10 lần 50 bước. + +113 +00:07:42,380 --> 00:07:44,450 +Vì vậy, đó sẽ là 500. + +114 +00:07:46,940 --> 00:07:51,940 +Vì vậy, bây giờ điều cuối cùng chúng ta cần làm là thay đổi tiêu đề của nó để + +115 +00:07:53,450 --> 00:07:56,390 +nó quay mặt lại ngay. Và bây giờ chúng tôi đã khá thân thiết. + +116 +00:07:56,600 --> 00:07:59,060 +Tất cả những gì chúng ta cần làm + +117 +00:07:59,090 --> 00:08:02,690 +là lặp lại điều này mỗi khi chúng ta vẽ được 10 chấm. + +118 +00:08:03,680 --> 00:08:06,830 +Làm thế nào chúng ta có thể làm điều đó? Trước hết, điều này cần phải + +119 +00:08:06,860 --> 00:08:10,460 +đi vào bên trong vòng lặp for. Giả sử chúng + +120 +00:08:10,490 --> 00:08:15,490 +ta tạo một biến mới có tên là number_of_dots và chúng + +121 +00:08:18,170 --> 00:08:22,790 +ta đặt nó thành một trăm. Chúng tôi sẽ sử dụng điều đó thay vì + +122 +00:08:23,390 --> 00:08:27,680 +phạm vi và chúng tôi sẽ tạo phạm vi từ 1 đến tổng số dấu chấm mà chúng + +123 +00:08:27,680 --> 00:08:28,513 +tôi cần tạo. + +124 +00:08:28,700 --> 00:08:32,750 +Và sau đó chúng ta có thể thay thế dấu gạch dưới này bằng một biến thực tế mà chúng ta sẽ + +125 +00:08:32,780 --> 00:08:35,480 +sử dụng bên trong vòng lặp for. Vì vậy, chúng + +126 +00:08:36,980 --> 00:08:41,980 +tôi sẽ gọi nó là dot_count vì nó sẽ đại diện cho số lượng dấu + +127 +00:08:42,590 --> 00:08:46,250 +chấm hiện tại đã được vẽ. Bây giờ chúng ta đã + +128 +00:08:46,400 --> 00:08:51,400 +có số chấm, sau đó chúng ta có thể tiếp tục và sử dụng câu lệnh + +129 +00:08:54,720 --> 00:08:59,460 +if để kiểm tra và xem liệu dot_count% 10 có bằng 0 hay không. + +130 +00:09:00,060 --> 00:09:05,040 +Sau đó, điều này có nghĩa là số chấm là 10 hoặc là 20, + +131 +00:09:05,040 --> 00:09:07,410 +30, 40, 50, 60, 70, 100. + +132 +00:09:08,430 --> 00:09:10,680 +Và trong những trường hợp đó, chúng + +133 +00:09:10,740 --> 00:09:15,740 +tôi muốn thời gian của chúng tôi di chuyển để nó có thể chuyển sang một dòng mới. + +134 +00:09:16,770 --> 00:09:18,270 +Vì vậy, bây giờ, nếu + +135 +00:09:19,320 --> 00:09:24,320 +tôi chạy điều này, bạn có thể thấy rằng Tim vẽ một hàng chấm và sau đó quay ngược lại, + +136 +00:09:24,900 --> 00:09:29,900 +bắt đầu từ đầu và vẽ một hàng chấm khác. Và sau đó tiếp tục lặp + +137 +00:09:30,030 --> 00:09:34,020 +lại điều này cho đến khi nó được vẽ hàng trăm chấm. + +138 +00:09:34,530 --> 00:09:36,300 +Nhưng điều này rõ ràng là + +139 +00:09:36,390 --> 00:09:41,390 +rất chậm vì vậy chúng tôi có thể tăng tốc mọi thứ một chút bằng cách thay đổi tốc + +140 +00:09:42,060 --> 00:09:44,280 +độ của Tim ngay từ đầu thành nhanh nhất. + +141 +00:09:44,730 --> 00:09:49,730 +Vì vậy, theo cách này, nó sẽ hoạt hình nhanh hơn rất nhiều và chúng ta có thể thấy các dấu chấm của chúng ta hiển thị và + +142 +00:09:51,060 --> 00:09:53,310 +mất ít thời gian hơn một chút để thấy nó hoạt động. + +143 +00:09:54,060 --> 00:09:57,930 +Sau khi bức tranh của chúng tôi hoàn thành, bạn có thể thấy có một lỗi khác. + +144 +00:09:58,440 --> 00:10:02,580 +Dấu chấm cuối cùng của chúng tôi không được sơn. Và điều này là tất nhiên + +145 +00:10:02,580 --> 00:10:07,350 +bởi vì toán tử phạm vi của chúng tôi đi từ 1 đến + +146 +00:10:07,890 --> 00:10:12,890 +100 và điều đó có nghĩa là nó sẽ chỉ chạy 99 lần vì 100 + +147 +00:10:15,120 --> 00:10:18,330 +- 1 bằng 99. Vì vậy, chúng ta có thể thêm một cái vào cái này. + +148 +00:10:21,140 --> 00:10:21,590 +2: Vâng. + +149 +00:10:21,590 --> 00:10:25,550 +0: Vì vậy, khi chúng tôi đã thay đổi điều đó, thì chúng tôi đã cố gắng đạt được dấu chấm thứ một trăm của mình, + +150 +00:10:26,000 --> 00:10:29,660 +tất nhiên, một lần nữa, lại kích hoạt một dòng mới. Bây giờ, rất nhiều dòng này + +151 +00:10:29,720 --> 00:10:32,180 +thực sự hữu ích khi chúng tôi cố gắng + +152 +00:10:32,250 --> 00:10:35,540 +hình dung con rùa của chúng tôi đang di chuyển như thế nào. + +153 +00:10:36,020 --> 00:10:37,970 +Nhưng bây giờ chúng tôi đã có bức tranh của + +154 +00:10:38,180 --> 00:10:40,220 +mình, chúng tôi cần cố gắng loại bỏ những đường nét này. + +155 +00:10:40,880 --> 00:10:45,880 +Vì vậy, chúng tôi biết rằng từ tài liệu, chúng tôi có thể sử dụng bút lên và bút xuống. Ở thời điểm bắt đầu và + +156 +00:10:46,310 --> 00:10:49,310 +thời điểm chúng tôi tạo ra Tim, chúng + +157 +00:10:49,610 --> 00:10:54,610 +tôi đã có thể đưa cây bút lên để chúng tôi không vẽ + +158 +00:10:54,980 --> 00:10:59,420 +những đường mà bạn thấy. Bằng cách vẽ các dấu chấm, chúng ta thực sự không cần bút đi xuống. + +159 +00:10:59,720 --> 00:11:02,000 +Nó sẽ chỉ để lại một dấu chấm và sau đó tiếp tục. + +160 +00:11:02,450 --> 00:11:05,300 +Vì vậy, chỉ bằng cách viết bút lên và không đặt bút xuống, + +161 +00:11:05,540 --> 00:11:08,150 +chúng ta đã vẽ được các dấu chấm của mình. + +162 +00:11:09,830 --> 00:11:14,300 +Bây giờ cải tiến cuối cùng mà tôi có thể nghĩ đến là sau khi bức tranh của chúng + +163 +00:11:14,300 --> 00:11:18,440 +tôi hoàn thành, tôi thực sự muốn loại bỏ hình dạng của con rùa, trong trường hợp + +164 +00:11:18,470 --> 00:11:20,720 +của chúng tôi là một mũi tên nhỏ. + +165 +00:11:21,170 --> 00:11:24,140 +Bây giờ điều đó thực sự hữu ích khi chúng tôi đang cố gắng tìm ra hướng + +166 +00:11:24,140 --> 00:11:29,090 +mà nó đang đối mặt hoặc nó đang di chuyển như thế nào. Nhưng cuối cùng, chúng tôi không thực sự muốn điều này. + +167 +00:11:31,010 --> 00:11:35,660 +Vì vậy, một lần nữa, trở lại tài liệu, làm thế nào chúng ta có thể thoát khỏi con rùa của mình? + +168 +00:11:36,110 --> 00:11:39,290 +Chà, có rùa ẩn và rùa ẩn. + +169 +00:11:39,710 --> 00:11:41,540 +Và đây là cách chúng + +170 +00:11:41,540 --> 00:11:46,540 +tôi làm cho con rùa trở nên vô hình. Nó thậm chí còn cho chúng tôi biết rằng bạn có thể làm điều này khi + +171 +00:11:47,660 --> 00:11:50,840 +đang ở giữa bản vẽ vì việc ẩn con rùa sẽ làm tăng tốc độ bản vẽ một cách quan sát. + +172 +00:11:51,320 --> 00:11:56,320 +Vì vậy, chúng ta hãy tiếp tục và ẩn con rùa của chúng ta cũng như di chuyển cây bút lên. + +173 +00:11:58,570 --> 00:12:01,390 +Và chúng ta hãy hình dung lại điều này. + +174 +00:12:03,400 --> 00:12:07,570 +Và bạn có thể thấy các dấu chấm của chúng tôi được vẽ mà không có con rùa của + +175 +00:12:07,930 --> 00:12:12,930 +chúng tôi và chúng tôi kết thúc với một bức tranh Hirst tuyệt đẹp mà chúng tôi đã tạo ra hoàn toàn + +176 +00:12:13,930 --> 00:12:15,220 +từ đầu. Chà, có + +177 +00:12:15,250 --> 00:12:18,310 +thể nhờ một chút trợ giúp từ bảng màu của Damien Hirst. + +178 +00:12:19,060 --> 00:12:23,920 +Vì vậy, tôi hy vọng bạn thích dự án này. Và tôi mong được gặp bạn vào ngày mai. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/012 Space out your study sessions and stay consistent.mp4 b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/012 Space out your study sessions and stay consistent.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6f5ad670b1bca3ad97dd17f87c76858092d04afd --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/012 Space out your study sessions and stay consistent.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8908c88f3515011ce8c14986523a7023981c94c481d3483051b36ea530db12ba +size 56952284 diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/012 Space out your study sessions and stay consistent_vi.srt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/012 Space out your study sessions and stay consistent_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7dd2affc6d45a4c051468afc9e52a2cd1d517943 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/012 Space out your study sessions and stay consistent_vi.srt @@ -0,0 +1,92 @@ +1 +00:00:00,430 --> 00:00:09,520 +Này, các bạn, hoàn thành tốt ngày 18. Bây giờ hôm nay tôi muốn nói về cách theo nhiều cách, mặc dù bạn không nghĩ về + +2 +00:00:09,520 --> 00:00:15,880 +một lập trình viên như một người nào đó, bạn biết đấy, là một người yêu thích tập gym, nhưng nó thực sự rất giống + +3 +00:00:15,880 --> 00:00:16,370 +nhau. + +4 +00:00:16,690 --> 00:00:17,670 +Bây giờ hãy nghe tôi nói. + +5 +00:00:18,400 --> 00:00:21,270 +Tôi biết chúng tôi không nhìn-- tất cả chúng tôi đều không giống Arnold. + +6 +00:00:21,280 --> 00:00:22,780 +Tôi chắc chắn rằng có những lập trình viên làm. + +7 +00:00:23,350 --> 00:00:30,580 +Tuy nhiên, bạn biết đấy, theo nhiều cách, học viết mã và nâng cao sức mạnh tại phòng tập thực sự rất giống nhau, bởi vì + +8 +00:00:30,580 --> 00:00:34,810 +nếu bạn nghĩ về nó, bạn không thể làm tất cả trong một lần. + +9 +00:00:34,810 --> 00:00:39,640 +Bạn không thể đến phòng tập thể dục và nói, "Bạn biết không, tôi sẽ cắm trại ở đây trong 48 giờ. + +10 +00:00:40,090 --> 00:00:42,460 +Tôi sẽ sử dụng tất cả các thiết bị. + +11 +00:00:42,460 --> 00:00:46,510 +Tôi sẽ tiếp tục làm điều đó cho đến khi tôi hoàn toàn có kinh nghiệm. "48 giờ sau, + +12 +00:00:46,960 --> 00:00:49,000 +bạn sẽ trông như cũ. + +13 +00:00:49,000 --> 00:00:50,380 +Tôi hứa với bạn, tôi đã cố gắng. + +14 +00:00:50,950 --> 00:00:56,020 +Nhưng vấn đề là, bạn biết đấy, bạn phải tiếp tục xuất hiện hàng ngày. + +15 +00:00:56,170 --> 00:00:58,870 +Điều đó lặp đi lặp lại - về cơ + +16 +00:00:58,960 --> 00:01:04,480 +bản là về số đại diện mà bạn thực hiện mỗi ngày, rằng bạn sẽ phát triển cơ bắp của + +17 +00:01:04,480 --> 00:01:07,630 +mình, bạn cũng sẽ phát triển cơ mã hóa của mình. + +18 +00:01:07,960 --> 00:01:11,350 +Và theo cách đó, bạn sẽ liên tục cải thiện. + +19 +00:01:11,350 --> 00:01:13,930 +Đó là điều quan trọng, sự nhất quán. + +20 +00:01:14,470 --> 00:01:23,110 +Vì vậy, đừng lo lắng nếu bạn đã bỏ lỡ một ngày ở đây hoặc nếu bạn không thể làm tất cả các bài học trong + +21 +00:01:23,110 --> 00:01:29,530 +một lần, chỉ cần đảm bảo rằng bạn tiếp tục xuất hiện và bạn luôn dồn sức cho nó. + +22 +00:01:29,530 --> 00:01:31,210 +Cuối cùng, bạn sẽ đến được đó. + +23 +00:01:32,540 --> 00:01:35,720 +Và một khi bạn làm như vậy, hãy thể hiện cơ bắp viết mã của bạn trong phần Hỏi và Đáp. + diff --git a/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/external-links.txt b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..55d953a2cb63753dcff8a3e26adcd16a97b27555 --- /dev/null +++ b/part2/18 - Day 18 - Intermediate - Turtle & the Graphical User Interface (GUI)/external-links.txt @@ -0,0 +1,54 @@ + +002 Turtle-Graphics-Documentation +https://docs.python.org/3/library/turtle.html + +002 Trinket-Turtle-Colours +https://trinket.io/docs/colors + +002 Turtle-Colours +https://cs111.wellesley.edu/reference/colors + +003 Challenge-1-Draw-a-Square-Starting-Code +https://repl.it/@appbrewery/day-18-1-start + +003 Solution-to-Challenge-1 +https://repl.it/@appbrewery/day-18-1-end + +005 Challenge-2-Draw-a-Dashed-Line-Starting-Code +https://repl.it/@appbrewery/day-18-2-start + +005 Solution-to-Challenge-2 +https://repl.it/@appbrewery/day-18-2-end + +006 Challenge-3-Drawing-Different-Shapes-Starting-Code +https://repl.it/@appbrewery/day-18-3-start + +006 Solution-to-Challenge-3 +https://repl.it/@appbrewery/day-18-3-end + +007 Challenge-4-Generate-a-Random-Walk-Starting-Code +https://repl.it/@appbrewery/day-18-4-start + +007 What-is-a-Random-Walk- +https://en.wikipedia.org/wiki/Random_walk + +007 Solution-to-Challenge-4 +https://repl.it/@appbrewery/day-18-4-end + +008 RGB-Tool-from-W3Schools +https://www.w3schools.com/colors/colors_rgb.asp + +009 Challenge-5-Create-a-Spirograph-Starting-Code +https://repl.it/@appbrewery/day-18-5-start + +009 Solution-to-Challenge-5-Day-18-Ending-Code- +https://repl.it/@appbrewery/day-18-5-end + +010 Colorgram-Package +https://pypi.org/project/colorgram.py/ + +011 Hirst-Painting-Project-Final-Code +https://repl.it/@appbrewery/hirstpainting-final + +011 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/001 Day 19 Goals what we will make by the end of the day.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/001 Day 19 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..158a8870bb5c23f10273a9a4153f90f9fa557f33 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/001 Day 19 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5572022f5220e525a02b64e4c36f88f898313477e70d548f6ace9c971115320c +size 9214300 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/001 Day 19 Goals what we will make by the end of the day_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/001 Day 19 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..dc8772299f4cacbdb6ba0ecbcb92685cbf455bc5 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/001 Day 19 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,112 @@ +1 +00:00:00,480 --> 00:00:01,050 +Xin chào + +2 +00:00:01,050 --> 00:00:06,050 +các bạn, chào mừng đến với Ngày 19 của 100 Ngày viết mã. Hôm nay chúng ta sẽ tìm hiểu + +3 +00:00:06,150 --> 00:00:09,060 +thêm về đồ họa con rùa, nhưng chúng ta cũng + +4 +00:00:09,330 --> 00:00:14,220 +sẽ xem xét các trình xử lý sự kiện, các hàm bậc cao hơn, trạng thái + +5 +00:00:14,310 --> 00:00:16,950 +và nhiều trường hợp của một đối tượng. + +6 +00:00:17,160 --> 00:00:21,540 +Và chúng tôi sẽ sử dụng kiến thức này để xây dựng một loạt các trò chơi. Chúng tôi sẽ làm Etch-a-Sketch, một + +7 +00:00:21,540 --> 00:00:24,960 +trong những đồ chơi thời thơ ấu yêu thích của tôi. + +8 +00:00:25,320 --> 00:00:30,320 +Và trò chơi này sẽ cho phép chúng ta sử dụng các mũi tên lên và xuống để di chuyển con rùa + +9 +00:00:30,360 --> 00:00:32,040 +của mình tới và lui, sau đó + +10 +00:00:32,369 --> 00:00:37,370 +chúng ta có thể xoay con rùa của mình theo chiều kim đồng hồ và ngược chiều kim đồng hồ để tiếp + +11 +00:00:38,640 --> 00:00:39,270 +tục vẽ. + +12 +00:00:39,270 --> 00:00:44,270 +Vì vậy, chúng tôi có thể sử dụng điều này để tạo vòng tròn hoặc để tạo đường. + +13 +00:00:46,140 --> 00:00:50,430 +Và về cơ bản chúng ta có thể tạo các bản vẽ bằng chương trình con rùa của mình. + +14 +00:00:51,060 --> 00:00:51,660 +Ngoài ra, + +15 +00:00:51,660 --> 00:00:56,660 +chúng tôi cũng sẽ thực hiện một trò chơi đua rùa, nơi chúng tôi sẽ đặt cược vào màu sắc + +16 +00:00:56,820 --> 00:00:59,850 +của chú rùa nào sẽ giành chiến thắng trong cuộc đua. + +17 +00:01:00,270 --> 00:01:02,850 +Và sau đó khi chúng ta nhấp vào OK vào cửa sổ + +18 +00:01:03,150 --> 00:01:08,150 +bật lên, thì tất cả các con rùa của chúng ta sẽ đi đến vạch xuất phát và chúng bắt đầu di chuyển với + +19 +00:01:08,340 --> 00:01:09,360 +tốc độ ngẫu nhiên. + +20 +00:01:09,990 --> 00:01:14,250 +Và sau khi con rùa đầu tiên chạm vào mép bên phải của màn hình, nó sẽ + +21 +00:01:14,520 --> 00:01:19,520 +được tuyên bố là người chiến thắng và chúng ta sẽ xem liệu con rùa của chúng ta có thắng hay không. + +22 +00:01:20,340 --> 00:01:24,300 +Vì vậy, hiện tại, con rùa đỏ không có vẻ gì là sẽ làm được. + +23 +00:01:24,500 --> 00:01:28,010 +1: Tôi nghĩ quả cam có lẽ-- Ồ, màu vàng đang vượt qua nó. + +24 +00:01:30,500 --> 00:01:34,040 +0: Và chúng ta bắt đầu. Chúng tôi thua. Con rùa màu tím là + +25 +00:01:34,140 --> 00:01:36,920 +người chiến thắng trong cuộc đua. Vì vậy, tôi hy vọng bạn cũng + +26 +00:01:37,130 --> 00:01:41,660 +hào hứng như tôi để cùng nhau xây dựng những dự án này. Khi bạn đã sẵn sàng, hãy chuyển sang bài + +27 +00:01:41,690 --> 00:01:46,280 +học tiếp theo và chúng ta hãy tìm hiểu về cách chúng ta có thể lắng nghe các lần + +28 +00:01:46,280 --> 00:01:47,810 +gõ phím trên bàn phím. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 Python Higher Order Functions & Event Listeners.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 Python Higher Order Functions & Event Listeners.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a0a1297accbd8ab8c8211725bb00d426aa2ea902 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 Python Higher Order Functions & Event Listeners.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9100971b652a1449b98b6fe622931890755abbf8867e4a14a20aca014c09945b +size 51074515 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 Python Higher Order Functions & Event Listeners_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 Python Higher Order Functions & Event Listeners_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..82eaceb9940c799d592506b23977d3fc4b68a55d --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 Python Higher Order Functions & Event Listeners_vi.srt @@ -0,0 +1,412 @@ +1 +00:00:00,270 --> 00:00:03,870 +Bây giờ để có thể tạo ra nhiều trò chơi mà chúng tôi đã nói về + +2 +00:00:04,290 --> 00:00:09,290 +nó, chúng tôi cần một cách để có thể lắng nghe những gì người dùng làm, chẳng hạn như khi người dùng + +3 +00:00:10,020 --> 00:00:14,580 +nhấn vào một phím cụ thể trên bàn phím. Và đoạn mã cho phép chúng ta + +4 +00:00:14,580 --> 00:00:17,220 +làm điều này được gọi là trình nghe sự kiện. + +5 +00:00:17,610 --> 00:00:20,370 +Vì vậy, nếu chúng ta xem tài liệu về + +6 +00:00:20,520 --> 00:00:24,150 +rùa, bạn có thể thấy rằng có toàn bộ phần về các sự + +7 +00:00:24,540 --> 00:00:29,540 +kiện trên màn hình, bao gồm nghe các lần nhấn phím hoặc nghe một lần nhấp hoặc những + +8 +00:00:31,050 --> 00:00:35,700 +thứ khác mà bạn có thể nghe. Vì vậy, điều quan trọng là phương pháp lắng nghe này. + +9 +00:00:36,150 --> 00:00:41,150 +Điều này cho phép màn hình con rùa bắt đầu lắng nghe và chờ đợi các sự kiện mà người dùng + +10 +00:00:42,180 --> 00:00:44,910 +có thể kích hoạt, chẳng hạn như nhấn vào một phím. + +11 +00:00:45,540 --> 00:00:50,460 +Tôi đã tiếp tục và tạo một dự án PyCharm mới mà tôi gọi là ngày-19 và tôi đã + +12 +00:00:50,850 --> 00:00:54,810 +tạo chính của mình. tệp py bên trong dự án. Bây giờ, + +13 +00:00:54,810 --> 00:00:59,810 +điều đầu tiên tôi sẽ làm là nhập lớp con rùa và + +14 +00:01:00,090 --> 00:01:02,400 +lớp màn hình từ mô-đun rùa. + +15 +00:01:02,850 --> 00:01:06,600 +Và sau đó tôi sẽ sử dụng chúng để tạo ra chú rùa + +16 +00:01:08,310 --> 00:01:12,000 +Tim của tôi và cũng tạo ra một đối tượng màn hình. + +17 +00:01:12,390 --> 00:01:17,130 +Về cơ bản, điều này sẽ kiểm soát cửa sổ khi chúng tôi chạy mã của mình. + +18 +00:01:17,160 --> 00:01:19,560 +Vì vậy, bạn đã thấy nó chỉ nhấp nháy ngay bây giờ. + +19 +00:01:20,160 --> 00:01:22,770 +Bây giờ để bắt đầu lắng nghe các sự + +20 +00:01:22,800 --> 00:01:27,570 +kiện, chúng ta phải giữ đối tượng trên màn hình và sau đó yêu cầu nó bắt đầu nghe. + +21 +00:01:28,140 --> 00:01:29,970 +Và một khi nó bắt đầu nghe, + +22 +00:01:30,000 --> 00:01:34,920 +chúng ta phải liên kết một chức năng sẽ được kích hoạt khi một phím cụ thể được + +23 +00:01:34,920 --> 00:01:37,470 +nhấn trên bàn phím. Bây giờ, để liên + +24 +00:01:37,530 --> 00:01:41,730 +kết một hành trình phím với một sự kiện trong mã của chúng ta, chúng + +25 +00:01:42,090 --> 00:01:44,460 +ta phải sử dụng trình nghe sự kiện. + +26 +00:01:45,090 --> 00:01:48,990 +Vì vậy, một trong những chúng tôi sẽ sử dụng là phương pháp onkey này. + +27 +00:01:49,350 --> 00:01:54,350 +Và bạn có thể thấy nó mong đợi một hàm không có đối số và cũng là một phím, + +28 +00:01:56,250 --> 00:01:57,060 +như phím + +29 +00:01:57,060 --> 00:02:02,060 +'a' trên bàn phím của bạn hoặc một biểu tượng phím, vì vậy dấu cách hoặc lên hoặc xuống. + +30 +00:02:02,700 --> 00:02:05,610 +Vì vậy, tôi sẽ nói màn hình. onkey và sau đó + +31 +00:02:06,180 --> 00:02:10,259 +tôi phải liên kết một số loại chức năng với phương thức này. + +32 +00:02:10,500 --> 00:02:14,400 +Vì vậy, hãy tạo một hàm và chúng ta sẽ gọi nó là + +33 +00:02:14,990 --> 00:02:15,860 +move_ forwards. + +34 +00:02:17,510 --> 00:02:22,340 +0: Và tất cả những gì mà chức năng này sẽ làm là giúp + +35 +00:02:22,400 --> 00:02:26,780 +Tim tiến thêm 10 bước. Và chúng ta đừng quên dấu hai chấm của chúng ta ở đây. + +36 +00:02:27,320 --> 00:02:30,200 +Bây giờ, quay lại với phương thức onkey + +37 +00:02:30,440 --> 00:02:35,330 +của tôi, tôi sẽ nói rằng khi phím khoảng trắng, tức là phím cách, được + +38 +00:02:35,750 --> 00:02:38,450 +nhấn, thì hãy kích hoạt hàm move_forwards. + +39 +00:02:38,990 --> 00:02:43,990 +Bây giờ đây là một điểm thực sự quan trọng; khi chúng ta sử dụng một hàm làm + +40 +00:02:44,270 --> 00:02:48,230 +đối số, vì vậy thứ gì đó sẽ được chuyển vào một hàm khác, chúng + +41 +00:02:48,650 --> 00:02:51,440 +ta thực sự không thêm dấu ngoặc vào cuối. + +42 +00:02:51,920 --> 00:02:55,430 +Dấu ngoặc đơn kích hoạt chức năng xảy ra ở đó và sau đó. + +43 +00:02:55,880 --> 00:03:00,880 +Nhưng những gì chúng tôi muốn là chúng tôi muốn phương thức này, onkey, lắng nghe khi + +44 +00:03:02,710 --> 00:03:07,710 +nhấn phím cách và chỉ khi điều đó xảy ra để kích hoạt hàm move_forwards này. + +45 +00:03:08,770 --> 00:03:13,750 +Bây giờ, điều cuối cùng tôi cần làm là thêm exitonclick để màn hình của tôi không biến + +46 +00:03:13,750 --> 00:03:15,460 +mất khi tôi chạy nó. + +47 +00:03:16,180 --> 00:03:20,470 +Và bây giờ những gì tôi sẽ thử là khi tôi nhấn phím + +48 +00:03:20,860 --> 00:03:25,780 +cách, bạn sẽ thấy con rùa của tôi di chuyển về phía trước 10 bước mỗi lần. + +49 +00:03:26,440 --> 00:03:30,790 +Vì vậy, bây giờ chúng ta đang điều khiển con rùa của mình bằng cách sử dụng một tổ hợp phím. + +50 +00:03:31,360 --> 00:03:36,360 +Những gì chúng ta có ở đây về cơ bản là một hàm đang được sử dụng làm đầu vào. + +51 +00:03:37,270 --> 00:03:39,970 +Giả sử chúng ta có một hàm được gọi + +52 +00:03:39,970 --> 00:03:42,490 +là function_a nhận một số loại đầu vào. + +53 +00:03:43,090 --> 00:03:48,090 +Và sau đó chúng ta có một hàm được gọi là function_b, chúng ta thực sự có + +54 +00:03:48,280 --> 00:03:50,980 +thể chuyển function_b vào function_a như thế này. + +55 +00:03:51,400 --> 00:03:54,370 +Vì vậy, hãy lưu ý rằng khi chúng ta truyền một hàm + +56 +00:03:54,670 --> 00:03:58,480 +làm đầu vào, chúng ta chỉ truyền tên mà không có dấu ngoặc đơn ở cuối. + +57 +00:03:59,050 --> 00:04:03,220 +Nhưng chính xác thì chức năng onkey này hoạt động như thế nào? + +58 +00:04:03,250 --> 00:04:08,250 +Bởi vì thật là điên rồ khi sử dụng một hàm làm đầu vào cho một hàm khác, + +59 +00:04:09,670 --> 00:04:10,390 +phải không? + +60 +00:04:10,390 --> 00:04:15,390 +Vì vậy, tôi muốn chỉ cho bạn một ví dụ nhanh về việc chuyển một hàm + +61 +00:04:16,540 --> 00:04:21,190 +vào một hàm khác, và tôi sẽ sử dụng ví dụ máy tính mà chúng + +62 +00:04:21,190 --> 00:04:26,080 +ta đã làm rất nhiều lần trước. Ừm, khi chúng tôi tạo một máy tính có + +63 +00:04:26,170 --> 00:04:29,410 +thể lấy hai số, cộng, trừ, nhân hoặc chia các số đó. + +64 +00:04:29,980 --> 00:04:32,260 +Vì vậy, chúng tôi có bốn chức năng của chúng tôi ở đây. Bây giờ, bạn không thực + +65 +00:04:32,290 --> 00:04:35,260 +sự phải viết bất kỳ điều gì trong số này, vì nó khá tẻ nhạt. + +66 +00:04:35,590 --> 00:04:37,480 +Tôi chỉ muốn bạn xem và lắng nghe. + +67 +00:04:38,170 --> 00:04:42,880 +Vì vậy, giả sử tôi tạo một hàm cuối cùng, mà tôi sẽ gọi là máy tính. + +68 +00:04:43,630 --> 00:04:48,610 +Và hàm này sẽ nhận n1 và n2, hai số, nhưng nó + +69 +00:04:49,000 --> 00:04:53,050 +cũng sẽ lấy một hàm làm đầu vào. + +70 +00:04:53,770 --> 00:04:56,110 +Bây giờ, bên trong hàm máy + +71 +00:04:56,260 --> 00:05:00,010 +tính này, tôi sẽ lấy tên hàm đã được truyền vào + +72 +00:05:00,460 --> 00:05:05,460 +và sau đó gọi hàm đó bằng cách thêm các dấu ngoặc và sau đó + +73 +00:05:06,100 --> 00:05:10,300 +chuyển vào n1 và n2. Vì vậy, bây giờ tôi có chức năng + +74 +00:05:10,690 --> 00:05:13,840 +máy tính có thể nhận bất kỳ chức năng nào làm đầu vào. + +75 +00:05:14,140 --> 00:05:16,630 +Và một khi hàm đó đã được chuyển vào đây, + +76 +00:05:17,050 --> 00:05:22,050 +thì hàm đó sẽ được kích hoạt chuyển vào n1 và n2. Hãy trả về kết quả này dưới dạng + +77 +00:05:23,590 --> 00:05:25,510 +đầu ra, và sau đó chúng + +78 +00:05:25,900 --> 00:05:28,690 +ta hãy gọi hàm máy tính của chúng ta, + +79 +00:05:28,990 --> 00:05:33,340 +hãy chuyển vào một số số và hãy chuyển bằng tên của một hàm. + +80 +00:05:34,060 --> 00:05:39,060 +Vì vậy, bây giờ chúng ta hãy tiếp tục và lưu nó vào một biến và sau đó in + +81 +00:05:40,450 --> 00:05:43,000 +kết quả biến đó. Vì vậy, bây giờ khi + +82 +00:05:43,030 --> 00:05:48,030 +tôi chạy mã, bạn có thể thấy tôi nhận được năm bản in và đó là bởi vì tôi đã có thêm + +83 +00:05:48,070 --> 00:05:52,630 +làm đầu vào thứ ba ở đây. Nhưng điều gì sẽ xảy ra nếu tôi thay đổi điều này thành nhân? Tôi nhận + +84 +00:05:52,630 --> 00:05:54,700 +được sáu thay vì năm. + +85 +00:05:55,150 --> 00:05:59,360 +Và điều gì xảy ra nếu tôi đặt số chia? Tôi nhận được số 0 bởi vì nó + +86 +00:05:59,380 --> 00:06:01,210 +làm tròn đến một số nguyên. + +87 +00:06:01,690 --> 00:06:05,470 +Nhưng về cơ bản những gì tôi đang cố gắng chứng minh cho + +88 +00:06:05,620 --> 00:06:09,640 +bạn là khái niệm này được gọi là Hàm bậc cao hơn trong Python. + +89 +00:06:10,150 --> 00:06:15,150 +Và ý tưởng về một chức năng bậc cao là một chức năng có thể hoạt động với các + +90 +00:06:15,670 --> 00:06:17,650 +chức năng khác. Vì vậy, trong + +91 +00:06:17,710 --> 00:06:22,710 +trường hợp này, máy tính của chúng ta là một hàm bậc cao hơn vì nó thực sự lấy + +92 +00:06:23,230 --> 00:06:28,180 +một hàm khác làm đầu vào, và sau đó làm việc với nó bên trong phần thân của hàm. + +93 +00:06:28,870 --> 00:06:33,190 +Bây giờ có một số ngôn ngữ lập trình mà bạn không thể làm được điều này. + +94 +00:06:33,460 --> 00:06:36,280 +Nhưng trong Python, điều này được sử dụng khá phổ biến. + +95 +00:06:36,550 --> 00:06:41,550 +Và nó thực sự hữu ích khi chúng ta cần lắng nghe các sự kiện và sau đó + +96 +00:06:42,160 --> 00:06:46,270 +kích hoạt một chức năng cụ thể. Bây giờ, trong khi chúng ta đang + +97 +00:06:46,450 --> 00:06:51,340 +nói về chủ đề của các hàm, tôi khuyên bạn nên sử dụng các phương thức mà bạn chưa tự + +98 +00:06:51,370 --> 00:06:55,330 +tạo, chẳng hạn như onkey, hãy sử dụng các đối số từ khóa thay vì các + +99 +00:06:55,360 --> 00:06:59,050 +đối số vị trí, đặc biệt nếu trong trường hợp này, vị trí không + +100 +00:06:59,260 --> 00:07:01,390 +thực sự có bất kỳ ý nghĩa nào. + +101 +00:07:02,230 --> 00:07:04,630 +Vì vậy, bây giờ bạn đã thấy cách hoạt động của trình + +102 +00:07:04,870 --> 00:07:08,980 +xử lý sự kiện, chúng ta sẽ sử dụng trình xử lý sự kiện để xây dựng chương trình Etch-A-Sketch + +103 +00:07:09,040 --> 00:07:12,790 +của chúng tôi trong bài học tiếp theo. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 The-listen-method.url b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 The-listen-method.url new file mode 100644 index 0000000000000000000000000000000000000000..d9d2f6e6f5671d2bcd222bf24d6e98afebfc62a9 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/002 The-listen-method.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/turtle.html#turtle.listen \ No newline at end of file diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Challenge Make an Etch-A-Sketch App.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Challenge Make an Etch-A-Sketch App.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e71af1befd5eee7fea25ba369d2675f8890869b1 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Challenge Make an Etch-A-Sketch App.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d2b54ef2b933c1d31956dab72c0581f5aa0db52d364a9bbe40a85db94b7b5b7 +size 69187380 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Challenge Make an Etch-A-Sketch App_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Challenge Make an Etch-A-Sketch App_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..688fa4de827d2c87a51917baa1c8e6be56028360 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Challenge Make an Etch-A-Sketch App_vi.srt @@ -0,0 +1,428 @@ +1 +00:00:00,030 --> 00:00:04,080 +Bây giờ bạn đã thấy cách hoạt động của người nghe sự kiện, đây là một thách thức dành cho bạn. + +2 +00:00:04,650 --> 00:00:07,680 +Tôi muốn bạn tạo một ứng dụng Etch-A-Sketch. + +3 +00:00:08,370 --> 00:00:09,840 +Đây là những gì bạn đang hướng tới. + +4 +00:00:10,320 --> 00:00:15,320 +Bạn sẽ có thể tạo ra một con rùa cho phép bạn nhấn phím W + +5 +00:00:15,990 --> 00:00:19,980 +để đi tới, phím S để đi lùi, phím A để đi + +6 +00:00:20,310 --> 00:00:25,310 +ngược chiều kim đồng hồ hoặc sang trái và phím D để đi sang phải + +7 +00:00:26,970 --> 00:00:31,440 +hoặc theo chiều kim đồng hồ. Và sau đó có thể vẽ những thứ + +8 +00:00:31,530 --> 00:00:36,000 +như thế này, hoặc bạn có thể thực hiện và vẽ các đường cong như thế này. + +9 +00:00:36,330 --> 00:00:40,410 +Chúng tôi đang tạo ra trò chơi thời thơ ấu đó là Etch-A-Sketch. + +10 +00:00:41,070 --> 00:00:42,660 +Khi bạn nhấn phím C, nó + +11 +00:00:42,720 --> 00:00:47,100 +sẽ xóa tất cả các bản vẽ của bạn và đưa con rùa của bạn trở lại trung tâm. + +12 +00:00:47,640 --> 00:00:51,450 +Vì vậy, hãy nghĩ về những gì bạn đã học được cho đến nay về cách hoạt động của + +13 +00:00:51,690 --> 00:00:53,880 +trình xử lý sự kiện, sau đó sử dụng tài + +14 +00:00:54,120 --> 00:00:56,550 +liệu rùa, đọc qua các phương pháp khác nhau mà bạn có + +15 +00:00:56,910 --> 00:01:00,900 +quyền truy cập, sau đó cố gắng tìm ra cách bạn có thể có được Etch-A-Sketch này chương trình hoạt + +16 +00:01:00,900 --> 00:01:04,739 +động theo cách được hiển thị ở đây. Vì vậy, hãy tạm dừng video và thực hiện thử thách này. + +17 +00:01:08,870 --> 00:01:11,780 +Đây là mã demo từ trước đó và đây + +18 +00:01:11,870 --> 00:01:16,870 +là phiên bản thực sự đơn giản về cách hoạt động của trình xử lý sự kiện. + +19 +00:01:17,960 --> 00:01:21,740 +Ví dụ: chúng ta có hàm move_forwards sẽ + +20 +00:01:22,040 --> 00:01:27,040 +được kích hoạt khi màn hình phát hiện phím khoảng trắng. + +21 +00:01:28,880 --> 00:01:33,620 +Và màn hình có thể phát hiện ra nó vì nó đang lắng nghe những tiếng gõ và nhấp + +22 +00:01:33,620 --> 00:01:35,720 +chuột trên bàn phím. Bây giờ, vì + +23 +00:01:35,720 --> 00:01:40,720 +hàm onkey chỉ có thể nhận một hàm không có đối số, ít nhất đây là những + +24 +00:01:41,270 --> 00:01:43,640 +gì chúng ta thấy trong tài liệu, điều + +25 +00:01:43,970 --> 00:01:48,680 +đó có nghĩa là chúng ta phải tạo bốn hàm riêng biệt, tiến lên, lùi + +26 +00:01:48,710 --> 00:01:50,810 +lại, rẽ trái và rẽ phải. + +27 +00:01:51,260 --> 00:01:55,970 +Vì vậy, bây giờ tất cả những gì tôi cần là thêm ba chức năng nữa, + +28 +00:01:56,360 --> 00:02:01,070 +di chuyển lùi, rẽ trái và rẽ phải. Bây giờ, tôi sẽ thay đổi + +29 +00:02:01,130 --> 00:02:06,130 +ràng buộc này từ không gian sang w sẽ được di chuyển về + +30 +00:02:07,080 --> 00:02:07,913 +phía trước. + +31 +00:02:08,330 --> 00:02:13,330 +Và sau đó tôi sẽ sao chép cái này và tạo + +32 +00:02:13,730 --> 00:02:15,950 +thêm ba cái nữa để + +33 +00:02:16,430 --> 00:02:20,210 +tôi có w là move_forwards, và sau đó tôi + +34 +00:02:21,050 --> 00:02:26,050 +có S là move_backwards, a là turn_left và d là turn_ + +35 +00:02:28,070 --> 00:02:28,903 +right. + +36 +00:02:29,840 --> 00:02:34,520 +Vì vậy, bây giờ tất cả những gì chúng ta cần làm là thực sự tạo ra các hàm này. + +37 +00:02:35,000 --> 00:02:37,850 +Vì vậy, hãy tạo move_backwards + +38 +00:02:40,130 --> 00:02:44,990 +của chúng tôi, sẽ đưa Tim lùi 10 bước. + +39 +00:02:45,380 --> 00:02:49,160 +Và sau đó, hàm tiếp theo chúng ta sẽ tạo là turn_left. + +40 +00:02:49,760 --> 00:02:54,760 +Và điều này sẽ lấy tiêu đề hiện tại của con rùa của chúng ta và thêm 10 độ + +41 +00:02:58,400 --> 00:02:59,050 +vào nó. + +42 +00:02:59,050 --> 00:03:03,940 +Vì vậy, nếu bạn tưởng tượng rằng con rùa bắt đầu hướng về phía Đông + +43 +00:03:04,120 --> 00:03:08,620 +và hướng này sẽ bằng không. Và chúng tôi biết rằng nếu chỉ về phía + +44 +00:03:08,680 --> 00:03:12,400 +Bắc, nó sẽ trở thành 90. Vì vậy, nếu chúng ta muốn nó + +45 +00:03:12,700 --> 00:03:16,960 +chuyển sang trái, thì chúng ta phải thêm vào giá trị tiêu đề hiện tại như thế này. + +46 +00:03:17,470 --> 00:03:19,570 +Vì vậy, đây có thể là new_heading + +47 +00:03:20,200 --> 00:03:23,170 +của chúng tôi, và sau đó chúng tôi có thể yêu cầu + +48 +00:03:23,230 --> 00:03:28,230 +Tim đặt nó đang hướng đến tiêu đề mới đó để chúng tôi quay sang trái 10 độ mỗi lần. + +49 +00:03:30,520 --> 00:03:34,240 +Bây giờ bạn cũng có thể chỉ sử dụng chức năng bên trái một cách đơn giản. + +50 +00:03:34,240 --> 00:03:38,590 +Vì vậy, bạn có thể đã nói thời gian. sang trái 10 độ. Cả hai phương pháp đều hoạt động + +51 +00:03:38,680 --> 00:03:43,630 +và bạn chọn phương pháp nào hoàn toàn phụ thuộc vào bạn. Bây giờ để rẽ phải về + +52 +00:03:43,660 --> 00:03:48,610 +cơ bản thì ngược lại. Vì vậy, thay vì cộng 10 độ, tất + +53 +00:03:48,850 --> 00:03:53,620 +cả những gì chúng ta phải làm là trừ đi 10 độ hoặc gọi cách khác + +54 +00:03:53,620 --> 00:03:55,870 +là thời gian. đúng, đi qua 10 độ. + +55 +00:03:56,590 --> 00:04:01,590 +Bây giờ chúng ta có tất cả bốn chức năng được định nghĩa và gắn liền với một tổ hợp phím, hãy tiếp + +56 +00:04:02,470 --> 00:04:03,730 +tục và kiểm tra nó. + +57 +00:04:04,240 --> 00:04:08,320 +Vì vậy, w nên đưa chúng ta về phía trước, s nên đưa chúng ta + +58 +00:04:08,680 --> 00:04:12,160 +về phía sau, a nên rẽ trái và D nên rẽ phải. + +59 +00:04:12,670 --> 00:04:13,750 +Rất hoàn hảo. + +60 +00:04:14,500 --> 00:04:18,760 +Bây giờ, điều cuối cùng chúng tôi muốn viết mã là một + +61 +00:04:18,760 --> 00:04:22,750 +số cách xóa màn hình. Và chúng tôi đã nói rằng chúng tôi sẽ liên kết điều đó với phím C. + +62 +00:04:23,290 --> 00:04:27,790 +Vì vậy, tôi sẽ tạo một hàm có tên là clear mà tôi sẽ định nghĩa ở đây. + +63 +00:04:28,570 --> 00:04:33,160 +Và chức năng này sẽ xóa màn hình xóa sạch tất cả bản vẽ và sau + +64 +00:04:33,520 --> 00:04:36,940 +đó đưa chú rùa của chúng ta trở lại ban đầu, + +65 +00:04:36,940 --> 00:04:38,950 +lúc đó ở giữa màn hình. + +66 +00:04:39,490 --> 00:04:43,750 +Điều này sẽ yêu cầu một chút đọc trong tài liệu về rùa. + +67 +00:04:43,960 --> 00:04:48,670 +Nếu bạn cuộn qua danh sách này, bạn sẽ thực sự tìm thấy hai phương pháp rõ ràng. + +68 +00:04:49,150 --> 00:04:53,680 +Một là phương pháp dành cho con rùa và phương + +69 +00:04:54,130 --> 00:04:58,750 +thức khác là phương thức rõ ràng cho màn hình, về + +70 +00:04:59,650 --> 00:05:04,330 +cơ bản là cửa sổ. Bây giờ rõ ràng này sẽ rõ ràng mọi thứ. + +71 +00:05:04,330 --> 00:05:08,260 +Nó sẽ xóa con rùa của chúng tôi và mọi thứ khác trên màn hình. + +72 +00:05:08,710 --> 00:05:10,450 +Trong khi phần rõ ràng + +73 +00:05:10,450 --> 00:05:15,220 +này, được gắn với con rùa, chỉ sẽ xóa các hình vẽ của con + +74 +00:05:15,220 --> 00:05:18,220 +rùa đặc biệt này. Vì vậy, đây là những gì chúng ta cần làm. + +75 +00:05:18,250 --> 00:05:23,250 +Chúng ta cần nắm lấy Tim và sau đó kêu gọi anh ấy xóa bỏ tất cả các bản vẽ mà anh ấy đã thực + +76 +00:05:23,800 --> 00:05:25,630 +hiện cho đến nay. Bây giờ, + +77 +00:05:25,630 --> 00:05:30,220 +điều tiếp theo chúng ta sẽ làm là đưa con rùa của chúng ta trở + +78 +00:05:30,220 --> 00:05:32,230 +lại trung tâm, điểm xuất phát. + +79 +00:05:32,560 --> 00:05:37,420 +Và điều này sẽ được hỗ trợ bởi một trong những phương pháp được gọi là nhà. + +80 +00:05:37,450 --> 00:05:41,710 +Vì vậy, tôi tìm thấy điều này trong tài liệu và nó nói rằng nó di chuyển con rùa + +81 +00:05:41,710 --> 00:05:45,190 +đến điểm gốc, ở giữa màn hình. Bây giờ, tất cả những gì chúng + +82 +00:05:45,190 --> 00:05:50,190 +ta cần làm là gọi điện về nhà và thông báo điều gì sẽ xảy ra nếu tôi chạy như vậy. + +83 +00:05:52,120 --> 00:05:56,530 +Vì vậy, tôi có thể vẽ và về cơ bản làm cho một mớ hỗn độn. + +84 +00:05:57,740 --> 00:06:00,170 +Và sau đó khi tôi nhấn C, bạn có thể thấy nó + +85 +00:06:02,180 --> 00:06:04,160 +quay trở lại nhà, nhưng thực ra nó + +86 +00:06:04,190 --> 00:06:09,190 +cũng đang vẽ toàn bộ con đường của nó trở lại đó. Để ngăn điều này xảy ra, chúng tôi phải + +87 +00:06:09,740 --> 00:06:13,250 +kéo cây bút lên, loại bút mà chúng tôi đã sử dụng trước đây. + +88 +00:06:13,760 --> 00:06:17,960 +Và khi Tim đã về đến nhà, chúng ta sẽ đặt bút xuống để sẵn sàng + +89 +00:06:18,200 --> 00:06:19,850 +cho bức vẽ tiếp theo. + +90 +00:06:20,390 --> 00:06:25,390 +Vì vậy, bây giờ chúng ta có thể tạo một bản vẽ, nhấn C, và sau đó nó quay trở lại trung tâm. + +91 +00:06:26,420 --> 00:06:30,470 +Bạn đã quản lý để hoàn thành thử thách này? Đừng đánh bại bản thân nếu + +92 +00:06:30,500 --> 00:06:34,400 +bạn không tìm ra một số phương pháp như tại nhà hoặc rõ ràng. + +93 +00:06:34,820 --> 00:06:38,630 +Vấn đề là bạn phải thực hành đọc tài liệu và có đủ kiên + +94 +00:06:38,630 --> 00:06:42,200 +nhẫn để đọc qua nó và tìm kiếm các phương pháp phù hợp. + +95 +00:06:42,680 --> 00:06:45,950 +Và trên hết, nó chỉ là một vấn đề lộn xộn với mã. + +96 +00:06:46,280 --> 00:06:50,600 +Hãy thử mọi thứ ra, xem điều gì sẽ xảy ra. Và mỗi khi bạn thêm một thứ gì đó, hãy chạy mã, xem + +97 +00:06:50,600 --> 00:06:54,020 +nó có thực hiện những gì bạn muốn hay không. Và nếu không, hãy sửa chữa nó. + +98 +00:06:54,320 --> 00:06:56,810 +Và đó là chu kỳ phát triển phần mềm vô tận. + +99 +00:06:57,140 --> 00:06:59,450 +Vì vậy, đừng nản lòng nếu bạn gặp khó khăn. + +100 +00:06:59,660 --> 00:07:01,520 +Miễn là cuối cùng bạn đã cố gắng làm cho + +101 +00:07:01,790 --> 00:07:03,680 +nó hoạt động và bạn đã học được một số bài + +102 +00:07:04,130 --> 00:07:07,190 +học từ quá trình này, thì bạn có thể tự chúc mừng vì đã hoàn thành công việc. + +103 +00:07:07,550 --> 00:07:10,310 +Và tôi thấy rằng tôi luôn học hỏi được nhiều điều hơn khi tôi mắc nhiều sai + +104 +00:07:10,340 --> 00:07:13,670 +lầm hơn và khi tôi đấu tranh nhiều hơn. Khi bạn đã chơi xong + +105 +00:07:13,820 --> 00:07:17,770 +mã, hãy chuyển sang bài học tiếp theo, và chúng ta sẽ + +106 +00:07:17,770 --> 00:07:22,770 +tìm hiểu về trạng thái đối tượng và tạo nhiều phiên bản của cùng một đối tượng. + +107 +00:07:23,360 --> 00:07:26,300 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Solution-etch-a-sketch-final.zip b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Solution-etch-a-sketch-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..a140c4649385207569cc9127e9a4fe5e256001d6 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 Solution-etch-a-sketch-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c127990463d380c6d5f7370ab526b41e0fb93ad50317eeec8ba31b028b7b8467 +size 376 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 etch-a-sketch-start.zip b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 etch-a-sketch-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..2ea918240d5e81bda2ea68dc3957c701fdfc3fb0 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/003 etch-a-sketch-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7f4a40a7d20bd9e19d0589d39478bb750f248ba0f26091f2a0c6ebd99c3b288 +size 260 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/004 Object State and Instances.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/004 Object State and Instances.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a9dcfa267dad03ee3a811c88a30427ee478b4c99 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/004 Object State and Instances.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f542008b1add0666e33b04764d8bb012dd97157f9e1990f0cbd7fc35726c5120 +size 7597966 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/004 Object State and Instances_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/004 Object State and Instances_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6a9b2f11a5f99a625174054e9fa620f36512b7ab --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/004 Object State and Instances_vi.srt @@ -0,0 +1,200 @@ +1 +00:00:00,540 --> 00:00:04,530 +Mục tiêu là chúng tôi muốn có thể xây dựng một cuộc đua rùa, + +2 +00:00:04,860 --> 00:00:09,860 +nơi chúng tôi có nhiều rùa để chạy dọc theo một đường và sau đó xem ai + +3 +00:00:10,860 --> 00:00:14,400 +thực sự về đích trước. Bây giờ đây là một câu hỏi mặc dù. + +4 +00:00:14,970 --> 00:00:18,660 +Chúng ta biết cách tạo ra một con rùa từ bản thiết kế về rùa, nhưng + +5 +00:00:18,930 --> 00:00:23,130 +nếu chúng ta cần nhiều rùa hơn thì sao? Làm thế nào để chúng tôi nắm giữ chúng? + +6 +00:00:23,490 --> 00:00:24,210 +Chà, chúng ta + +7 +00:00:24,210 --> 00:00:29,210 +biết rằng chúng ta có thể sử dụng một lớp hoặc một bản thiết kế để xác định một con rùa sẽ trông + +8 +00:00:31,950 --> 00:00:34,350 +như thế nào và nó sẽ hoạt động như thế nào. + +9 +00:00:34,710 --> 00:00:37,830 +Vì vậy, những gì nó có và những gì nó có thể làm. Bây giờ, chúng ta có + +10 +00:00:37,830 --> 00:00:42,830 +thể lấy lớp này và xây dựng một đối tượng rùa thực sự từ nó, sau đó thực + +11 +00:00:43,470 --> 00:00:46,980 +hiện tất cả các bản vẽ và đi vòng quanh trên màn hình. + +12 +00:00:47,430 --> 00:00:51,900 +Vì vậy, đây là những gì mã đã trông giống như cho đến nay. Chúng tôi có Timmy là + +13 +00:00:51,960 --> 00:00:56,960 +đối tượng rùa của chúng tôi và rùa đến từ mô-đun rùa là lớp được + +14 +00:00:57,330 --> 00:01:00,060 +sử dụng để xây dựng đối tượng này. + +15 +00:01:00,420 --> 00:01:05,420 +Nhưng đó không phải là kết thúc của câu chuyện bởi vì lý do tại sao chúng ta có thể có + +16 +00:01:06,120 --> 00:01:10,440 +những bản thiết kế này là để chúng ta có thể tạo ra nhiều đồ vật hơn. + +17 +00:01:10,830 --> 00:01:15,060 +Vì vậy, chúng tôi không chỉ giới hạn ở một đối tượng rùa. + +18 +00:01:15,090 --> 00:01:19,980 +Chúng tôi có thể tạo bao nhiêu tùy thích theo cách chúng tôi đã tạo Timmy. + +19 +00:01:20,220 --> 00:01:23,910 +Chúng tôi tạo ra Tommy, Johnny, Jenny và Benny. + +20 +00:01:24,840 --> 00:01:28,890 +Mặc dù cả Timmy và Tommy đều là vật thể rùa, chúng + +21 +00:01:29,130 --> 00:01:32,610 +thực sự hoạt động hoàn toàn độc lập với nhau. + +22 +00:01:32,940 --> 00:01:37,920 +Vì vậy, trong lập trình, chúng ta sẽ nói rằng chúng là một thể hiện riêng biệt. + +23 +00:01:38,100 --> 00:01:39,750 +Vậy điều đó có ý nghĩa gì? Điều đó + +24 +00:01:39,750 --> 00:01:43,830 +có nghĩa là chúng là một ví dụ của đối tượng rùa. + +25 +00:01:44,160 --> 00:01:48,810 +Vì vậy, giống như bạn và tôi đều là ví dụ về các đối tượng người, Timmy + +26 +00:01:48,930 --> 00:01:52,140 +và Tommy đều là ví dụ về các đối tượng rùa. + +27 +00:01:52,650 --> 00:01:55,020 +Và điều đó có nghĩa là tại bất kỳ thời điểm + +28 +00:01:55,140 --> 00:01:59,070 +nào, chúng có thể có các thuộc tính khác nhau và chúng có thể làm những việc khác nhau. + +29 +00:01:59,730 --> 00:02:01,260 +Vì vậy, điều đó có nghĩa + +30 +00:02:01,290 --> 00:02:06,290 +là, ví dụ, Timmy có thể đặt màu của mình thành xanh lá cây trong khi Tommy có thể đặt màu của nó + +31 +00:02:06,960 --> 00:02:09,360 +thành một thứ hoàn toàn khác, chẳng hạn như màu tím. + +32 +00:02:09,750 --> 00:02:14,750 +Bây giờ thực tế là mỗi đối tượng này có thể có các thuộc tính khác nhau và có thể + +33 +00:02:16,050 --> 00:02:21,050 +thực hiện các phương thức khác nhau tại bất kỳ thời điểm nào trong lập trình được gọi là trạng + +34 +00:02:21,660 --> 00:02:22,493 +thái của chúng. + +35 +00:02:23,070 --> 00:02:28,070 +Vì vậy, trạng thái thuộc tính màu của Timmy là màu xanh lá cây và thuộc tính màu của Tommy + +36 +00:02:29,370 --> 00:02:31,260 +là màu tím. Vì vậy, trong + +37 +00:02:31,290 --> 00:02:35,970 +trường hợp này, chúng có trạng thái khác nhau về thuộc tính hoặc hình dạng của chúng. + +38 +00:02:36,510 --> 00:02:39,780 +Nhưng họ cũng có thể có trạng thái khác nhau về việc liệu họ có đang + +39 +00:02:39,780 --> 00:02:42,780 +làm điều gì đó hay không. Ví dụ, Timmy + +40 +00:02:42,810 --> 00:02:47,810 +có thể được yêu cầu di chuyển lên phía trước trong khi Tommy + +41 +00:02:48,750 --> 00:02:51,900 +hoàn toàn đứng yên. Vì vậy, Timmy đang ở giữa một + +42 +00:02:51,930 --> 00:02:56,340 +cuộc gọi phương thức trong khi Tommy không làm gì cả. Bây giờ trong bài học tiếp theo, chúng ta + +43 +00:02:56,370 --> 00:02:59,200 +sẽ xây dựng trò chơi đua rùa của mình và chúng ta + +44 +00:02:59,620 --> 00:03:01,360 +sẽ thấy điều này hoạt động. + +45 +00:03:01,540 --> 00:03:06,540 +Ý tưởng rằng bạn có thể có các phiên bản riêng biệt của cùng một đối tượng, + +46 +00:03:07,480 --> 00:03:12,480 +mỗi phiên bản có một trạng thái khác nhau và hoạt động hoàn toàn độc lập với + +47 +00:03:13,600 --> 00:03:17,560 +nhau để chạy đua với nhau. Vì vậy, đừng lo lắng nếu điều này không có + +48 +00:03:17,560 --> 00:03:20,440 +ý nghĩa một trăm phần trăm. Hãy chuyển sang bài học tiếp theo + +49 +00:03:20,740 --> 00:03:24,190 +và chúng ta sẽ bắt đầu viết một số mã thực để hiểu rõ hơn về khái + +50 +00:03:24,190 --> 00:03:24,850 +niệm này. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Turtle.textinput-documentation.url b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Turtle.textinput-documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..e5e854181ba3c1f5aca8b3980b828ba1578a3f17 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Turtle.textinput-documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3.1/library/turtle.html#turtle.textinput \ No newline at end of file diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Understanding the Turtle Coordinate System.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Understanding the Turtle Coordinate System.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1839647383b1b337316fc10134c74850fb8363c5 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Understanding the Turtle Coordinate System.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec9fdfa1eb8d566d81cd064dfeb062b75782eb99bbb7e255fb0f9c75973ec484 +size 108047310 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Understanding the Turtle Coordinate System_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Understanding the Turtle Coordinate System_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f8081a1153b32758a68ca12128244af48215fbcc --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 Understanding the Turtle Coordinate System_vi.srt @@ -0,0 +1,792 @@ +1 +00:00:00,060 --> 00:00:04,470 +Tất cả các quyền. Trong bài học này, chúng ta sẽ xây dựng cuộc đua rùa của chúng ta. + +2 +00:00:04,830 --> 00:00:06,060 +Và thông qua việc xây + +3 +00:00:06,090 --> 00:00:11,090 +dựng cuộc đua này, chúng ta sẽ quen thuộc hơn với các khái niệm về trạng thái và cá thể này. + +4 +00:00:11,820 --> 00:00:15,720 +Và đó là bởi vì chúng tôi cần tạo ra nhiều rùa để tham gia cuộc đua của chúng tôi. + +5 +00:00:16,110 --> 00:00:18,390 +Đây là những gì chúng tôi đang hướng tới. Ban đầu, sẽ + +6 +00:00:18,450 --> 00:00:23,450 +có một cửa sổ bật lên nhỏ yêu cầu chúng ta đặt cược xem ai + +7 +00:00:23,610 --> 00:00:26,640 +sẽ thắng cuộc đua. Và nó yêu cầu tôi chọn một màu. + +8 +00:00:27,000 --> 00:00:29,370 +Bây giờ những con rùa có màu sắc của cầu vồng, vì + +9 +00:00:29,370 --> 00:00:33,060 +vậy tôi sẽ chỉ chọn một con màu đỏ. Sau khi tôi nhấn OK, tất cả + +10 +00:00:33,060 --> 00:00:37,830 +rùa của chúng tôi đã xếp hàng ở vị trí bắt đầu và chúng sẽ bắt đầu thực hiện các bước + +11 +00:00:37,860 --> 00:00:42,450 +ngẫu nhiên về phía cạnh bên phải của màn hình. Bây giờ, rào cản đầu tiên + +12 +00:00:42,450 --> 00:00:46,620 +vượt qua mép bên phải của màn hình sẽ là người + +13 +00:00:46,620 --> 00:00:47,453 +chiến thắng. + +14 +00:00:47,670 --> 00:00:52,670 +Và lúc này có vẻ như con rùa xanh có lẽ sẽ + +15 +00:00:52,770 --> 00:00:57,750 +về đích trước. Chúng ta bắt đầu. Vì vậy, ngay sau khi một + +16 +00:00:58,920 --> 00:01:03,390 +con rùa vượt qua vạch đích, nó sẽ in ra một dòng cho chúng ta biết liệu chúng ta có + +17 +00:01:03,390 --> 00:01:06,990 +thắng hay chúng ta thua cược hay không và chú rùa nào đã thắng trò chơi. + +18 +00:01:07,200 --> 00:01:08,430 +Vì vậy, đây là mục tiêu. + +19 +00:01:08,970 --> 00:01:13,800 +Bây giờ tôi sẽ bắt đầu bằng cách xóa tất cả mã bên trong dự án + +20 +00:01:13,800 --> 00:01:17,220 +Etch-A-Sketch trước đây của chúng tôi ngoài vài dòng này. + +21 +00:01:17,280 --> 00:01:19,890 +Vì vậy, tôi đã có Tim con rùa của mình, màn + +22 +00:01:19,890 --> 00:01:24,890 +hình là một đối tượng màn hình sẽ giữ màn hình cho đến khi tôi nhấp vào nó để tôi có + +23 +00:01:26,130 --> 00:01:30,150 +thể xem những gì đang xảy ra. Bây giờ, bởi vì trong trò chơi + +24 +00:01:30,180 --> 00:01:35,180 +này, kích thước của màn hình hoặc của cửa sổ thực sự rất quan trọng, tôi sẽ không chỉ + +25 +00:01:35,940 --> 00:01:40,020 +hiển thị kích thước màn hình mặc định. Thay vào đó, tôi thực sự + +26 +00:01:40,020 --> 00:01:44,430 +sẽ sử dụng một trong những phương thức có trong đối tượng màn hình + +27 +00:01:44,460 --> 00:01:48,060 +được gọi là thiết lập. Và thiết lập, như bạn có thể + +28 +00:01:48,060 --> 00:01:52,290 +thấy, cho phép tôi thiết lập chiều rộng và chiều cao của cửa sổ này + +29 +00:01:52,290 --> 00:01:53,310 +sẽ hiển thị. + +30 +00:01:54,510 --> 00:01:59,510 +Vì vậy, tôi sẽ đặt chiều rộng của màn hình là 500 và chiều cao là 400. + +31 +00:02:00,360 --> 00:02:05,000 +Vì vậy, tôi nên kết thúc với một màn hình rộng 500 pixel, cao 400 pixel. + +32 +00:02:05,480 --> 00:02:09,710 +Và khi tôi nhấn run, bạn có thể thấy đây là những gì nó được thay đổi kích thước. + +33 +00:02:10,370 --> 00:02:13,700 +Bây giờ, nếu bạn bắt gặp mã này và đó là mã của người khác, thì + +34 +00:02:14,030 --> 00:02:17,960 +những con số này và vị trí của chúng thực sự không có ý nghĩa gì nhiều, cái nào là + +35 +00:02:17,990 --> 00:02:21,230 +chiều cao, cái nào là chiều rộng. Vì vậy, trong những tình huống này, tôi khuyên + +36 +00:02:21,260 --> 00:02:25,880 +bạn nên sử dụng đối số từ khóa hơn là đối số vị trí. Ồ, hãy viết ra các tham số + +37 +00:02:25,910 --> 00:02:29,000 +một cách rõ ràng. Chiều rộng là 500 + +38 +00:02:29,030 --> 00:02:32,540 +và chiều cao là 400. Bằng cách này khi ai + +39 +00:02:32,540 --> 00:02:34,880 +đó khác đi cùng và đọc mã của + +40 +00:02:34,910 --> 00:02:38,990 +bạn, nó sẽ dễ hiểu hơn rất nhiều thay vì chỉ 500 và 400, vì + +41 +00:02:38,990 --> 00:02:40,880 +nó có thể là cả hai cách. + +42 +00:02:41,630 --> 00:02:44,120 +Vì vậy, bây giờ chúng ta đã thiết lập + +43 +00:02:44,180 --> 00:02:49,180 +xong màn hình, điều tiếp theo tôi muốn làm là hiển thị cửa sổ bật lên đó và + +44 +00:02:49,280 --> 00:02:53,510 +yêu cầu người dùng đặt cược. Bây giờ, nếu chúng ta xem + +45 +00:02:53,960 --> 00:02:56,750 +tài liệu Python, ừm, nơi chúng ta đã dành + +46 +00:02:57,020 --> 00:03:00,910 +rất nhiều thời gian gần đây, bạn có thể thấy rằng có một + +47 +00:03:00,970 --> 00:03:03,670 +phương thức trên màn hình được gọi là textinput. + +48 +00:03:04,060 --> 00:03:09,060 +Và điều này sẽ hiển thị một cửa sổ bật lên và nó cho phép người dùng + +49 +00:03:09,940 --> 00:03:13,960 +nhìn vào lời nhắc và tiêu đề và nhập một đoạn văn bản. + +50 +00:03:14,410 --> 00:03:18,100 +Và nếu bạn muốn người dùng nhập một số, thì bạn sẽ sử dụng numinput. + +51 +00:03:18,550 --> 00:03:22,570 +Vì vậy, hãy tiếp tục và thêm điều đó ở đây. Vì vậy, nó sẽ là một phương + +52 +00:03:22,600 --> 00:03:26,800 +thức từ màn hình được gọi là textinput và sau đó nó có hai tham số. + +53 +00:03:26,860 --> 00:03:31,000 +Một là tiêu đề mà trong trường hợp của tôi, tôi sẽ + +54 +00:03:31,000 --> 00:03:33,220 +nói 'Hãy đặt cược của bạn'. + +55 +00:03:33,850 --> 00:03:38,710 +Và sau đó tham số thứ hai sẽ là dấu nhắc. Và trong trường hợp của tôi, tôi + +56 +00:03:38,740 --> 00:03:40,750 +có thể sẽ nói, + +57 +00:03:40,870 --> 00:03:45,610 +ừm, con rùa nào thắng cuộc đua và bảo chúng nhập màu. + +58 +00:03:46,120 --> 00:03:48,490 +Bây giờ, điều này thực sự hoạt động tương + +59 +00:03:48,490 --> 00:03:53,350 +tự như đầu vào của chúng tôi mà chúng tôi đã thực sự quen thuộc vì nó sẽ trả về chuỗi + +60 +00:03:53,350 --> 00:03:56,170 +và chúng tôi có thể bắt chuỗi đó bên trong một biến. + +61 +00:03:56,200 --> 00:04:01,200 +Vì vậy, chúng tôi sẽ gọi nó là user_bet và chúng tôi sẽ đặt nó bằng với kết quả đầu ra từ + +62 +00:04:02,620 --> 00:04:03,453 +phương thức này. + +63 +00:04:06,870 --> 00:04:09,150 +Bây giờ chúng ta hãy thử điều này. + +64 +00:04:09,570 --> 00:04:14,130 +Hãy chạy mã và sau đó chúng ta hãy nhập một màu sắc, nhấn OK. + +65 +00:04:14,190 --> 00:04:16,350 +Và nếu chúng ta nhìn vào bảng điều + +66 +00:04:16,589 --> 00:04:20,550 +khiển của mình, bạn có thể thấy rằng chuỗi đặt cược đó được in ở đây. + +67 +00:04:21,540 --> 00:04:25,680 +Vì vậy, bây giờ điều tiếp theo chúng ta sẽ làm là chúng ta cần làm gì đó với + +68 +00:04:25,680 --> 00:04:28,200 +con rùa của chúng ta. Tôi sẽ chuyển nó xuống một chút. + +69 +00:04:28,590 --> 00:04:33,590 +Và những gì tôi muốn con rùa của tôi làm là tôi muốn nó đi đến đầu hàng. + +70 +00:04:35,130 --> 00:04:39,810 +Vì vậy, các cạnh bên trái của màn hình của tôi. Tất nhiên bây giờ tôi có + +71 +00:04:39,810 --> 00:04:43,890 +thể chỉ nói thời gian. lùi lại, ừm, dù nhiều bước, + +72 +00:04:43,920 --> 00:04:45,330 +nhưng nghĩ về phía + +73 +00:04:45,750 --> 00:04:50,520 +trước và biết rằng tôi sắp có sáu hoặc bảy con rùa này, tôi + +74 +00:04:50,520 --> 00:04:51,240 +không + +75 +00:04:51,240 --> 00:04:54,720 +thể chỉ bảo tất cả chúng lùi lại vì chúng + +76 +00:04:54,720 --> 00:04:59,660 +sẽ đi đến cùng một vị trí . Thay vào đó, chúng tôi sẽ sử dụng một phương pháp mà con + +77 +00:04:59,710 --> 00:05:01,110 +rùa có được gọi là goto. + +78 +00:05:01,650 --> 00:05:06,210 +Và điều này cho phép chúng ta xác định giá trị X và giá trị Y. + +79 +00:05:06,600 --> 00:05:10,650 +Nhưng làm thế nào để chúng ta biết những giá trị X và Y để cung cấp cho nó? Vâng, trước tiên chúng ta + +80 +00:05:10,650 --> 00:05:14,640 +phải hiểu cách thức hoạt động của hệ tọa độ rùa Python. + +81 +00:05:14,970 --> 00:05:19,970 +Vì vậy, nếu bạn tưởng tượng cửa sổ chương trình của mình như một biểu đồ mà tâm của nó nằm ở + +82 +00:05:20,460 --> 00:05:22,740 +tọa độ (0, 0). Vậy thì + +83 +00:05:22,740 --> 00:05:27,330 +nếu bạn có một cửa sổ có chiều cao là 400, + +84 +00:05:27,690 --> 00:05:32,690 +thì biểu đồ đó sẽ có trục Y kéo dài từ tâm + +85 +00:05:34,590 --> 00:05:37,740 +bằng 0 lên đến mép trên và sau + +86 +00:05:37,740 --> 00:05:42,630 +đó từ giữa nó đi xuống tận cùng cạnh, sẽ là -200. + +87 +00:05:42,840 --> 00:05:47,840 +Vì vậy, 200 cộng với 200 tạo thành 400 và điều tương tự cũng xảy ra với trục X. + +88 +00:05:49,500 --> 00:05:52,530 +Vì vậy, nếu chiều rộng của màn hình + +89 +00:05:52,750 --> 00:05:57,750 +là 500, thì trục X đi từ tâm 0 đến chiều dương 250, + +90 +00:05:58,310 --> 00:06:03,050 +do đó một nửa của 500. Và sau đó từ 0 đến -250. + +91 +00:06:03,470 --> 00:06:07,310 +Vì vậy, đây là một câu hỏi. Giả sử chúng tôi muốn chuyển con rùa của mình đến đây. + +92 +00:06:07,430 --> 00:06:10,370 +Bạn nghĩ tọa độ X và Y của điểm đó là bao nhiêu? + +93 +00:06:13,210 --> 00:06:14,350 +2: Được rồi. Vì vậy, + +94 +00:06:14,460 --> 00:06:19,460 +giả sử rằng đây là khoảng một nửa trên trục X và khoảng một nửa trên trục Y. + +95 +00:06:21,250 --> 00:06:26,250 +Khi đó một nửa của 250 là 125 và một nửa của 200 là 100. + +96 +00:06:28,300 --> 00:06:33,300 +Vì vậy, tại thời điểm này sẽ có tọa độ là 125 x 100. + +97 +00:06:35,500 --> 00:06:40,210 +Nếu chúng ta muốn chú rùa của mình đi hết phía bên trái của màn hình, hãy nói rằng có thể + +98 +00:06:40,420 --> 00:06:44,020 +bắt đầu từ đây hoặc bắt đầu lại đây, thì chúng ta sẽ phải sử dụng + +99 +00:06:44,020 --> 00:06:45,520 +phương thức goto đó và sau + +100 +00:06:45,550 --> 00:06:50,550 +đó chỉ định giá trị X và giá trị Y . Sau đó, theo logic của hệ tọa độ + +101 +00:06:54,700 --> 00:06:59,560 +tổng thể, để di chuyển con rùa của chúng ta sang rìa bên trái, thì chúng + +102 +00:06:59,800 --> 00:07:03,520 +ta nên cung cấp giá trị X là trừ 250, tức là + +103 +00:07:03,610 --> 00:07:05,770 +một nửa chiều rộng của 500. + +104 +00:07:06,400 --> 00:07:11,400 +Bây giờ giá trị Y sẽ xác định vị trí trên trục Y mà con rùa của chúng ta di chuyển đến. + +105 +00:07:12,850 --> 00:07:14,500 +Vì vậy, nếu chúng ta có nó + +106 +00:07:14,500 --> 00:07:18,730 +ở mức 0 thì về cơ bản nó sẽ chỉ đi thẳng về phía sau và nó sẽ + +107 +00:07:18,730 --> 00:07:21,970 +không đi lên hoặc đi xuống. Nhưng hãy nói rằng + +108 +00:07:22,060 --> 00:07:26,260 +chúng tôi đặt nó ở, ừm, -100. Vì vậy, bây giờ nếu tôi chạy mã này, bạn + +109 +00:07:26,920 --> 00:07:29,170 +có thể thấy rằng nó đi đúng hướng, nhưng thực sự + +110 +00:07:29,380 --> 00:07:31,180 +nó đã biến mất khỏi màn hình. + +111 +00:07:31,510 --> 00:07:36,510 +Vì vậy, những gì đã xảy ra ở đây là -250 nằm ở rất, + +112 +00:07:36,730 --> 00:07:38,530 +rất cạnh của cửa sổ. + +113 +00:07:38,890 --> 00:07:42,910 +Và một khi con rùa của chúng ta di chuyển đến đó và mũi tên ở phía sau, + +114 +00:07:43,150 --> 00:07:45,160 +thì bạn thực sự không thể nhìn thấy nó. + +115 +00:07:45,400 --> 00:07:50,320 +Vì vậy, hãy thử thay đổi giá trị X đó và dịch chuyển con rùa của + +116 +00:07:50,320 --> 00:07:55,270 +chúng ta sang bên phải một chút nữa. Sau đó, bạn có thể thấy nó di chuyển đến phần đầu của cửa sổ. + +117 +00:07:55,840 --> 00:08:00,840 +Vì vậy, tôi khuyên bạn nên sử dụng phương pháp goto này và thử một số con số khác nhau chỉ + +118 +00:08:02,170 --> 00:08:04,570 +để xem nó kết thúc ở đâu trên màn hình. + +119 +00:08:05,080 --> 00:08:07,300 +Và một khi bạn đặt một số con số khác + +120 +00:08:07,510 --> 00:08:11,350 +nhau vào đây, bạn sẽ bắt đầu hiểu rõ về cách hệ tọa độ này thực sự hoạt động. + +121 +00:08:11,740 --> 00:08:15,280 +Nhưng chỉ cần nhớ rằng trục X nằm dọc theo phương ngang. + +122 +00:08:15,580 --> 00:08:18,790 +Nó đi từ 0 sang dương và 0 sang âm. + +123 +00:08:19,120 --> 00:08:21,790 +Và sau đó trục Y nằm dọc theo phương + +124 +00:08:21,820 --> 00:08:24,940 +thẳng đứng, đi từ 0 sang dương và 0 sang âm. + +125 +00:08:25,930 --> 00:08:30,930 +Vì vậy, chúng tôi muốn loại bỏ dòng này và chúng tôi không thực sự muốn con rùa của + +126 +00:08:31,660 --> 00:08:36,549 +chúng tôi vẽ chút nào. Vì vậy, để làm được điều đó, chúng ta sẽ tính thời gian. penup, và chúng tôi thực + +127 +00:08:37,000 --> 00:08:40,299 +sự sẽ không bao giờ đặt bút xuống bởi vì chúng tôi + +128 +00:08:40,299 --> 00:08:42,130 +sẽ di chuyển chính con rùa. + +129 +00:08:42,640 --> 00:08:46,360 +Và một điều nữa là sẽ rất tuyệt nếu thay vì một mũi tên, chúng + +130 +00:08:46,360 --> 00:08:48,250 +ta thực sự có một con rùa. + +131 +00:08:48,640 --> 00:08:53,640 +Vì vậy, tất nhiên chúng ta có thể nói thời gian. định hình và đặt nó thành hình con rùa, nhưng đây + +132 +00:08:54,960 --> 00:08:59,370 +là một cách thậm chí còn dễ dàng hơn. Khi chúng tôi tạo một con rùa mới, hãy xem + +133 +00:08:59,700 --> 00:09:01,770 +lời nhắc mà nó đưa ra cho chúng tôi. + +134 +00:09:02,040 --> 00:09:07,040 +Nó thực sự cung cấp cho chúng ta một cách để khởi tạo một đối tượng rùa mới đã được thiết + +135 +00:09:08,730 --> 00:09:09,720 +lập sẵn hình dạng. + +136 +00:09:10,230 --> 00:09:14,130 +Bây giờ hình dạng này được đặt để có giá trị mặc định về + +137 +00:09:14,160 --> 00:09:15,600 +cơ bản là mũi tên. + +138 +00:09:16,020 --> 00:09:21,020 +Nhưng chúng ta cũng có thể chỉ định hình dạng và tạo cho nó hình dạng con rùa để bắt đầu. + +139 +00:09:23,580 --> 00:09:27,570 +Bây giờ, khi tôi chạy mã, bạn có thể thấy rằng đầu + +140 +00:09:27,990 --> 00:09:32,990 +tiên, tôi có một hình con rùa, sau đó bút hướng lên và tôi không vẽ + +141 +00:09:33,120 --> 00:09:37,980 +và sau đó nó di chuyển đến vị trí này trên biểu đồ; -230, -100. + +142 +00:09:38,880 --> 00:09:43,880 +Vì vậy, bây giờ điều tiếp theo chúng ta muốn làm là có thể tạo ra rất nhiều rùa, + +143 +00:09:44,430 --> 00:09:45,263 +phải không? + +144 +00:09:45,420 --> 00:09:50,420 +Điều gì sẽ xảy ra nếu chúng ta có tất cả các màu trong cầu vồng và chúng ta tạo ra một con rùa + +145 +00:09:51,420 --> 00:09:52,253 +cho mỗi màu? + +146 +00:09:52,290 --> 00:09:56,580 +Vì vậy, có sáu màu trong danh sách này và tất nhiên, những + +147 +00:09:56,670 --> 00:10:00,600 +màu này tương ứng với màu mà rùa sẽ nhận ra. + +148 +00:10:01,050 --> 00:10:02,760 +Vì vậy, đây là một thách thức cho bạn. + +149 +00:10:03,330 --> 00:10:06,360 +Tôi muốn bạn tạo sáu con rùa, một + +150 +00:10:06,840 --> 00:10:10,050 +con cho mỗi màu trong danh sách các màu này. + +151 +00:10:10,320 --> 00:10:15,320 +Bạn đang nhắm đến việc tất cả các con rùa đều đi đến vạch xuất phát trong một bản phân + +152 +00:10:15,960 --> 00:10:19,350 +phối trông giống như thế này. Nó không cần phải chính xác, bạn + +153 +00:10:19,380 --> 00:10:21,150 +không cần phải làm cho nó hoàn toàn đúng. + +154 +00:10:21,480 --> 00:10:25,980 +Nhưng chỉ cần đảm bảo rằng chúng được sắp xếp cách đều nhau + +155 +00:10:25,980 --> 00:10:30,570 +và chúng ở vạch xuất phát. Vì vậy, đây là những gì bạn đang hướng tới; sáu + +156 +00:10:30,600 --> 00:10:34,650 +con rùa, sáu màu, tất cả đều bắt đầu từ điểm xuất phát dọc theo một điểm khác trên trục Y. + +157 +00:10:35,340 --> 00:10:36,780 +Tạm dừng video và tiếp tục. + +158 +00:10:39,060 --> 00:10:41,610 +Vì vậy, chúng tôi biết rằng để tạo ra nhiều rùa, + +159 +00:10:41,670 --> 00:10:43,920 +chúng tôi sẽ cần một số loại vòng lặp. + +160 +00:10:44,370 --> 00:10:49,370 +Vì vậy, hãy tiếp tục và sử dụng vòng lặp for để nói rùa_index và chúng + +161 +00:10:50,130 --> 00:10:55,130 +ta sẽ tạo một phạm vi để chỉ định số lượng rùa mà chúng ta cần. + +162 +00:10:56,730 --> 00:11:00,900 +Hàm phạm vi của chúng tôi sẽ đi từ 0 đến 6. + +163 +00:11:01,380 --> 00:11:05,880 +Và hãy nhớ rằng hàm phạm vi thực sự không bao gồm số sáu, vì vậy nó sẽ + +164 +00:11:05,910 --> 00:11:10,890 +tạo ra một phạm vi từ 0 đến 5. Và một khi chúng tôi đã làm điều đó, + +165 +00:11:10,890 --> 00:11:15,890 +sau đó chúng tôi có thể thụt lề khối mã này để chúng tôi tạo ra sáu con rùa. + +166 +00:11:17,160 --> 00:11:19,650 +Nhưng hiện tại, tất cả đều đang ở cùng một vị trí. + +167 +00:11:20,790 --> 00:11:23,220 +Vậy làm thế nào chúng ta có thể thay đổi điều này? Chúng tôi muốn + +168 +00:11:23,580 --> 00:11:27,900 +vị trí X luôn giống nhau đối với tất cả các con rùa, vì vị + +169 +00:11:27,960 --> 00:11:31,260 +trí X nằm dọc theo trục hoành và chúng tôi muốn + +170 +00:11:31,410 --> 00:11:34,680 +tất cả các con rùa bắt đầu ở điểm xuất phát. + +171 +00:11:35,010 --> 00:11:39,780 +Không ai có được một khởi đầu. Nhưng vị trí Y là thứ mà chúng tôi muốn thay đổi. + +172 +00:11:40,290 --> 00:11:45,290 +Một cách thực sự đơn giản để làm điều này là chỉ cần tạo một danh sách các vị trí Y và bạn + +173 +00:11:46,650 --> 00:11:50,400 +có thể tìm ra một số loại vị trí hợp lý mà bạn muốn đảm nhận. + +174 +00:11:50,670 --> 00:11:55,660 +Vì vậy, giả sử chúng tôi bắt đầu ở mức -70 và sau đó chúng tôi chỉ tăng thêm 30 + +175 +00:11:55,660 --> 00:11:56,380 +mỗi lần. + +176 +00:11:56,380 --> 00:12:01,380 +Vì vậy, sau đó trở thành -40 và sau đó -10 và sau đó + +177 +00:12:01,720 --> 00:12:04,000 +là 20, 50 và 80. + +178 +00:12:04,060 --> 00:12:08,410 +Vì vậy, nó đại khái được phân phối ở đâu đó dọc theo giữa. Bây giờ, thay vì sử + +179 +00:12:08,410 --> 00:12:11,380 +dụng vị trí Y này được mã hóa + +180 +00:12:11,380 --> 00:12:13,630 +cứng -100, chúng tôi sẽ sử + +181 +00:12:14,020 --> 00:12:19,020 +dụng các vị trí Y và sau đó chuyển vào rùa_index của chúng tôi + +182 +00:12:19,080 --> 00:12:21,900 +như thế này. Vì vậy, bây giờ khi chúng + +183 +00:12:21,960 --> 00:12:24,270 +tôi chạy lại mã này, bạn có thể thấy rằng + +184 +00:12:24,300 --> 00:12:27,060 +đối với mỗi con rùa, chúng đều sẽ có được một vị + +185 +00:12:27,450 --> 00:12:30,660 +trí Y riêng lẻ và tất cả chúng đều cách nhau 30 khoảng cách. + +186 +00:12:31,080 --> 00:12:34,650 +Bây giờ chúng ta đã xếp những con rùa của mình ngay ngắn ở điểm xuất phát. + +187 +00:12:34,950 --> 00:12:37,530 +Điều tiếp theo là cung cấp cho chúng một màu sắc khác. + +188 +00:12:37,650 --> 00:12:42,030 +Vì vậy, chúng tôi sẽ sử dụng danh sách các màu và sau đó chọn màu bằng + +189 +00:12:42,090 --> 00:12:43,440 +cách sử dụng rùa_index. + +190 +00:12:43,770 --> 00:12:48,770 +Vì vậy, bây giờ chúng ta nên kiếm một số rùa nhiều màu và sẽ dễ dàng hơn nhiều để + +191 +00:12:49,830 --> 00:12:53,280 +đặt cược vào một con rùa. Vì vậy, bây giờ chúng ta đã thiết lập + +192 +00:12:53,340 --> 00:12:55,020 +xong cuộc đua rùa của mình và sẵn + +193 +00:12:55,350 --> 00:12:58,890 +sàng bắt đầu, bước tiếp theo là thực sự làm cho những con rùa bắt đầu di chuyển. + +194 +00:12:59,310 --> 00:13:00,750 +Nhưng trước khi chúng ta có + +195 +00:13:00,840 --> 00:13:05,840 +thể làm điều đó, tôi thực sự muốn bạn hiểu rõ về cách thức hoạt động của hệ tọa + +196 +00:13:05,940 --> 00:13:08,220 +độ trong rùa. Vì vậy, trong bài học tiếp theo, + +197 +00:13:08,310 --> 00:13:11,850 +tôi có một bài kiểm tra nhanh cho bạn chỉ để đảm bảo rằng bạn thực sự hiểu những gì + +198 +00:13:11,880 --> 00:13:12,930 +đang xảy ra ở đây. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 turtle-race-start.zip b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 turtle-race-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..0f3c7413e6898897a240f448c17adade84a16d01 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/005 turtle-race-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbd6b8416d5e41c03f3f555b3896e0a9b3f852c01a07a7e3ae688bab47ac3709 +size 197 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/006 Turtle Coordinate System Quiz.html b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/006 Turtle Coordinate System Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..ef49872f7d7274698d74b40af7b8e1efa341b948 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/006 Turtle Coordinate System Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Aaaand, we're off to the races!.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Aaaand, we're off to the races!.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4ec196c1a158d36942b759b8da96d4ddee877475 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Aaaand, we're off to the races!.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e373b998ff836bdc749940f63095b3ec9bfaabf906ca909fa573f85cafb90b43 +size 95765372 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Aaaand, we're off to the races!_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Aaaand, we're off to the races!_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..81c9187dc0aed1b09ea75284c6924a268d2e37bf --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Aaaand, we're off to the races!_vi.srt @@ -0,0 +1,588 @@ +1 +00:00:00,030 --> 00:00:01,140 +Trong bài học + +2 +00:00:01,170 --> 00:00:06,170 +trước, chúng ta đã tìm ra cách chúng ta có thể đưa rùa chạy nhanh và đưa rùa + +3 +00:00:06,930 --> 00:00:09,270 +về vị trí xuất phát. Bây giờ, công + +4 +00:00:09,300 --> 00:00:13,980 +việc tiếp theo mà chúng ta phải làm là tìm cách làm thế nào để những + +5 +00:00:14,010 --> 00:00:18,150 +con rùa này bắt đầu di chuyển. Chuyển động sẽ phải ngẫu nhiên và mỗi + +6 +00:00:18,540 --> 00:00:23,540 +bước họ thực hiện sẽ phải là một số ngẫu nhiên. Bằng cách đó, họ không đi thẳng đến + +7 +00:00:23,580 --> 00:00:24,690 +điểm cuối và + +8 +00:00:24,960 --> 00:00:28,620 +chúng tôi kết thúc với một trải nghiệm chơi game khủng khiếp. + +9 +00:00:29,190 --> 00:00:33,360 +Vì vậy, những gì chúng ta sẽ làm là chúng ta sẽ tạo ra một số + +10 +00:00:33,390 --> 00:00:36,000 +ngẫu nhiên, giả sử từ 0 đến 10, và + +11 +00:00:36,450 --> 00:00:40,860 +sau đó chúng ta sẽ nói với con rùa tiếp tục theo số lượng ngẫu nhiên đó. + +12 +00:00:40,860 --> 00:00:43,230 +Vì vậy, nó có thể nằm trong khoảng từ 0 đến 10. + +13 +00:00:43,950 --> 00:00:47,490 +Và sau đó chúng ta sẽ làm cho điều này lặp lại nhiều, nhiều lần. + +14 +00:00:48,840 --> 00:00:49,740 +Như bạn có thể + +15 +00:00:49,770 --> 00:00:52,740 +đã đoán, điều này có thể sẽ liên quan đến một số loại vòng lặp while. + +16 +00:00:53,160 --> 00:00:58,160 +Vì vậy, giả sử chúng ta bắt đầu với một biến được gọi là is_race_on và nó bắt đầu + +17 +00:00:59,460 --> 00:01:00,293 +là false. + +18 +00:01:00,570 --> 00:01:05,570 +Nhưng khi người dùng đã đặt cược và chúng tôi có thể kiểm tra + +19 +00:01:05,880 --> 00:01:10,170 +xem user_bet có tồn tại hay không, thì trong trường hợp + +20 +00:01:10,230 --> 00:01:13,800 +đó, chúng tôi sẽ chuyển is_race_on đó thành true. + +21 +00:01:16,050 --> 00:01:20,430 +Và sau đó chúng ta có thể sử dụng is_race_on bên trong vòng lặp while. + +22 +00:01:20,910 --> 00:01:25,910 +Bây giờ theo cách này, chúng tôi ngăn vòng lặp while của chúng tôi khởi động trong khi người dùng vẫn + +23 +00:01:25,980 --> 00:01:28,920 +đang quyết định xem họ sẽ đặt cược vào con rùa nào. + +24 +00:01:29,160 --> 00:01:31,020 +Vì vậy, nó không bắt đầu sớm. + +25 +00:01:31,710 --> 00:01:36,480 +Bây giờ khi người dùng đã đặt cược và cuộc đua đang bắt đầu, bây + +26 +00:01:36,480 --> 00:01:40,080 +giờ chúng ta sẽ cần nắm giữ một số ngẫu nhiên. + +27 +00:01:43,130 --> 00:01:48,130 +Chúng tôi sẽ sử dụng mô-đun ngẫu nhiên để nắm giữ một số nguyên ngẫu + +28 +00:01:49,430 --> 00:01:52,220 +nhiên trong phạm vi từ 0 đến 10. + +29 +00:01:52,610 --> 00:01:55,250 +Bây giờ randint thực sự đã bao gồm, + +30 +00:01:55,250 --> 00:01:59,060 +vì vậy số ngẫu nhiên có thể bằng 0 cho đến 10. + +31 +00:01:59,780 --> 00:02:03,740 +Vì vậy, bây giờ chúng ta sẽ gọi nó là rand_distance, và đây + +32 +00:02:04,520 --> 00:02:09,520 +sẽ là khoảng cách mà một trong những con rùa của chúng ta sẽ di chuyển về + +33 +00:02:09,949 --> 00:02:10,580 +phía trước. + +34 +00:02:10,580 --> 00:02:15,580 +Vì vậy, chúng tôi muốn một số loại rùa. về phía trước và khoảng cách mà nó đi về phía + +35 +00:02:18,350 --> 00:02:20,030 +trước là khoảng cách ngẫu nhiên. + +36 +00:02:20,750 --> 00:02:23,720 +Bây giờ chúng tôi có rất nhiều rùa mà chúng tôi đã tạo ra, nhưng + +37 +00:02:24,050 --> 00:02:26,240 +chúng tôi thực sự chưa làm được gì với chúng. + +38 +00:02:26,690 --> 00:02:31,280 +Thay vào đó, những gì chúng tôi muốn làm là có một số loại danh sách rùa. + +39 +00:02:31,310 --> 00:02:33,380 +Vì vậy, chúng tôi sẽ gọi + +40 +00:02:34,070 --> 00:02:36,350 +all_turtles và danh sách này bắt đầu trống. + +41 +00:02:36,740 --> 00:02:39,290 +Nhưng mỗi khi chúng ta tạo ra một con rùa mới, thì chúng + +42 +00:02:39,560 --> 00:02:43,970 +ta có thể thêm con rùa đó vào danh sách này. Vì vậy, ở giai đoạn này, nó không thực + +43 +00:02:44,000 --> 00:02:47,870 +sự hợp lý để gọi tất cả các con rùa là thời gian nữa, phải không? + +44 +00:02:47,870 --> 00:02:50,900 +Bởi vì tất cả chúng sẽ là những cá thể riêng lẻ. + +45 +00:02:51,470 --> 00:02:56,470 +Vì vậy, hãy tiếp tục cấu trúc lại và đổi tên nó thành new_turtle. + +46 +00:02:58,900 --> 00:03:03,900 +Và bây giờ những gì đang xảy ra trong vòng lặp for của chúng tôi là chúng tôi đang tạo ra + +47 +00:03:04,060 --> 00:03:09,060 +một con rùa mới và mỗi con rùa mới đó sẽ được thêm vào danh sách all_turtles của chúng tôi. + +48 +00:03:11,320 --> 00:03:15,730 +Vì vậy, bây giờ chúng ta sẽ có một danh sách gồm nhiều cá thể + +49 +00:03:16,270 --> 00:03:20,260 +rùa và mỗi cá thể đó sẽ có một trạng thái khác nhau. + +50 +00:03:20,530 --> 00:03:21,490 +Vì vậy, ví + +51 +00:03:21,520 --> 00:03:25,780 +dụ, họ đã bắt đầu với một vị trí Y khác và một màu khác. + +52 +00:03:26,320 --> 00:03:27,340 +Nhưng sau này, + +53 +00:03:27,400 --> 00:03:31,600 +chúng tôi cũng sẽ khiến họ tiến lên theo một mức độ khác. + +54 +00:03:32,170 --> 00:03:35,560 +Vì vậy, chúng ta có thể lặp lại danh sách rùa của + +55 +00:03:35,590 --> 00:03:38,080 +mình, vì vậy đối với rùa trong + +56 +00:03:40,980 --> 00:03:45,980 +all_turtles, hãy tiếp tục và tạo khoảng cách ngẫu nhiên cho từng con rồi di chuyển con rùa + +57 +00:03:46,740 --> 00:03:49,320 +đó về phía trước theo khoảng cách ngẫu nhiên. + +58 +00:03:49,860 --> 00:03:52,050 +Vì vậy, bây giờ nếu chúng tôi chạy mã + +59 +00:03:53,670 --> 00:03:55,200 +của mình và thấy nó + +60 +00:03:55,620 --> 00:03:59,580 +hoạt động, bạn có thể thấy rằng khi tất cả các con rùa đã đi + +61 +00:03:59,580 --> 00:04:04,560 +vào vị trí xuất phát của chúng, chúng sẽ ngừng leo lên mỗi lần với một lượng khác nhau. + +62 +00:04:08,190 --> 00:04:12,990 +Tuy nhiên, bây giờ, những con rùa của chúng ta thực sự sẽ tiếp tục tồn tại cho đến mãi mãi. + +63 +00:04:13,110 --> 00:04:16,140 +Về cơ bản nó là một vòng lặp không bao giờ dừng lại. + +64 +00:04:16,620 --> 00:04:20,700 +Vì vậy, chúng ta hãy suy nghĩ về những gì các điều kiện dừng nên là. Chà, một khi bất kỳ + +65 +00:04:20,730 --> 00:04:25,730 +con rùa nào trong số những con rùa này đã thực sự đến cuối + +66 +00:04:26,730 --> 00:04:31,170 +màn hình có giá trị X là +250, một khi chúng + +67 +00:04:31,170 --> 00:04:35,820 +đã đến vạch này, thì đó là sự kết thúc của cuộc đua, + +68 +00:04:35,850 --> 00:04:36,683 +phải không? + +69 +00:04:36,990 --> 00:04:41,490 +Nhưng đối tượng rùa là đối tượng 40 x 40. + +70 +00:04:41,910 --> 00:04:45,390 +Vì vậy, nếu chúng tôi chỉ phát hiện con số 250, thì + +71 +00:04:45,660 --> 00:04:48,390 +con rùa của chúng tôi đã phóng quá mức. + +72 +00:04:48,480 --> 00:04:53,480 +Vì vậy, thay vào đó, chúng tôi muốn phát hiện khi nào con rùa đã đạt đến mốc 230. Quay lại mã của chúng tôi + +73 +00:04:55,230 --> 00:04:56,700 +trong vòng lặp + +74 +00:04:57,060 --> 00:05:01,620 +của chúng tôi, chúng tôi có thể kiểm tra xem liệu + +75 +00:05:02,190 --> 00:05:07,190 +con rùa mà chúng tôi hiện đang lặp lại, nếu tọa độ X + +76 +00:05:09,210 --> 00:05:13,710 +của nó lớn hơn 230. Chà, trong trường hợp này, về cơ bản nó đã thắng. + +77 +00:05:14,190 --> 00:05:15,510 +Bây giờ ở giai + +78 +00:05:15,600 --> 00:05:19,890 +đoạn này, nếu chúng ta in màu của con rùa hiện tại này, thì bạn + +79 +00:05:20,340 --> 00:05:23,370 +sẽ thực sự thấy một điều gì đó hơi kỳ lạ. + +80 +00:05:25,530 --> 00:05:27,360 +Bạn có thể thấy rằng trước + +81 +00:05:27,360 --> 00:05:31,890 +tiên, nó in ra nhiều giá trị vì vòng lặp while vẫn đang tiếp tục và các con + +82 +00:05:31,890 --> 00:05:34,020 +rùa khác tiếp tục đi về phía trước. + +83 +00:05:34,470 --> 00:05:37,770 +Nhưng giá trị đầu tiên sẽ là con rùa chiến thắng. + +84 +00:05:38,340 --> 00:05:41,370 +Và bạn có thể thấy nó in màu vàng và màu vàng. + +85 +00:05:41,880 --> 00:05:45,840 +Vậy điều gì đang xảy ra ở đây? Vâng, nếu chúng ta nhìn vào phương + +86 +00:05:45,930 --> 00:05:50,790 +pháp màu này, bạn có thể thấy rằng bạn có thể sử dụng nó để thiết lập màu bút + +87 +00:05:51,090 --> 00:05:54,720 +và màu tô, hoặc nó sẽ trả về màu bút và màu tô. + +88 +00:05:55,170 --> 00:05:56,940 +Vì vậy, khi nó + +89 +00:05:57,650 --> 00:06:01,430 +in ra hai màu, màu đầu tiên sẽ là màu bút và + +90 +00:06:01,430 --> 00:06:05,720 +màu thứ hai sẽ là màu tô. Vì vậy, nếu chúng ta chỉ muốn biết + +91 +00:06:06,050 --> 00:06:10,910 +màu bút, thì chúng ta có thể nắm lấy con rùa. màu bút. + +92 +00:06:10,970 --> 00:06:15,290 +Đây sẽ là màu của cơ thể của con rùa. Vì vậy, trong mã của chúng tôi, chúng tôi có thể + +93 +00:06:15,320 --> 00:06:20,320 +nói rằng màu sắc chiến thắng là bằng với con rùa hiện tại. màu bút. + +94 +00:06:25,100 --> 00:06:30,100 +Và bây giờ chúng ta có thể kiểm tra xem màu chiến thắng có bằng với số tiền đặt cược của + +95 +00:06:31,100 --> 00:06:35,420 +người dùng hay không, bởi vì nếu đúng như vậy thì người dùng đã thắng, phải không? + +96 +00:06:35,450 --> 00:06:38,090 +Vì vậy, chúng tôi có thể nói với họ rằng bạn đã thắng. + +97 +00:06:38,330 --> 00:06:41,300 +Và sau đó chúng ta có thể cho họ biết màu sắc của con rùa chiến thắng. + +98 +00:06:44,200 --> 00:06:45,070 +Tuy nhiên, + +99 +00:06:45,070 --> 00:06:49,480 +bây giờ, nếu điều này là sai hoặc đúng hơn trong tuyên bố khác, thì, trong trường + +100 +00:06:49,870 --> 00:06:53,140 +hợp đó, chúng ta sẽ phải in ra thứ tương tự nhưng + +101 +00:06:53,470 --> 00:06:56,770 +bây giờ chúng ta sẽ nói với họ rằng họ đã thua. + +102 +00:06:59,020 --> 00:06:59,410 +1: Vâng. + +103 +00:06:59,410 --> 00:07:03,790 +0: Cuối cùng, khi con rùa đầu tiên đạt đến tọa độ X, khi màu + +104 +00:07:03,790 --> 00:07:06,160 +đầu tiên này được in ra, chúng ta muốn + +105 +00:07:06,280 --> 00:07:09,160 +dừng vòng lặp while. Bằng cách này, những con + +106 +00:07:09,160 --> 00:07:12,490 +rùa còn lại không tiếp tục di chuyển về phía trước và chúng ta + +107 +00:07:12,790 --> 00:07:17,170 +sẽ có rất nhiều người chiến thắng như thế này. Vì vậy, bên trong câu + +108 +00:07:17,200 --> 00:07:21,520 +lệnh if này, khi tọa độ X của con rùa đã vượt + +109 +00:07:21,820 --> 00:07:25,390 +qua 230, chúng ta sẽ thay đổi is_race_on thành false. + +110 +00:07:26,020 --> 00:07:30,190 +Bây giờ chúng tôi đã sẵn sàng để kiểm tra mã của mình. Và một lần nữa, tôi sẽ đặt + +111 +00:07:30,190 --> 00:07:34,390 +cược vào con rùa đỏ và tôi sẽ tăng tốc độ phát lại của cuộc + +112 +00:07:34,420 --> 00:07:36,640 +đua này khi tôi chỉnh sửa video này. + +113 +00:07:37,240 --> 00:07:42,240 +Và bây giờ trò chơi đã kết thúc và bạn có thể thấy rằng con rùa xanh là + +114 +00:07:42,760 --> 00:07:44,920 +con đầu tiên vượt qua vạch đích. + +115 +00:07:45,460 --> 00:07:50,260 +Và nó cho tôi biết nhiều như vậy. Tôi đã thua và con rùa xanh là người chiến thắng. + +116 +00:07:51,070 --> 00:07:56,070 +Vì vậy, bây giờ chúng tôi đã sử dụng Python rùa để xây dựng một trò chơi đua rùa rất đơn giản. + +117 +00:07:56,680 --> 00:08:01,680 +Và chúng tôi đang bắt đầu sử dụng các vị trí X và Y này + +118 +00:08:02,350 --> 00:08:06,520 +trong hệ tọa độ rùa. Bây giờ, các tọa độ này cần + +119 +00:08:06,850 --> 00:08:11,850 +một chút để làm quen, đặc biệt là suy nghĩ về những thứ chẳng hạn như nếu một con rùa + +120 +00:08:12,160 --> 00:08:14,770 +có chiều rộng 40 pixel, thì để đưa con rùa về + +121 +00:08:14,980 --> 00:08:19,300 +vạch xuất phát, chúng ta phải trừ đi một nửa chiều rộng của con rùa, là 20. + +122 +00:08:19,540 --> 00:08:23,350 +Vì vậy, 250 trừ 20 trở thành 230. + +123 +00:08:23,680 --> 00:08:26,740 +Và những thứ như thế này cần một chút thời gian để làm quen. + +124 +00:08:27,220 --> 00:08:31,480 +Vì vậy, những gì tôi thực sự khuyên bạn nên thử với các giá trị này, + +125 +00:08:31,750 --> 00:08:36,429 +làm cho nó nhỏ hơn hoặc làm cho nó lớn hơn, thay đổi kích thước của màn hình. + +126 +00:08:36,730 --> 00:08:41,049 +Và chỉ cho đến khi bạn thực sự quen thuộc với cách thức hoạt động của hệ tọa độ + +127 +00:08:41,080 --> 00:08:44,620 +trước khi bạn chuyển sang bài học tiếp theo, bởi vì khi bạn tiếp tục, + +128 +00:08:44,620 --> 00:08:48,160 +tôi sẽ cho rằng bạn đã từng thử nghiệm với nó và bạn biết chính + +129 +00:08:48,160 --> 00:08:50,560 +xác cách nó hoạt động. Bây giờ, điều + +130 +00:08:50,590 --> 00:08:55,150 +khác mà chúng tôi thấy rất nhiều trong dự án này là khái niệm có nhiều + +131 +00:08:55,380 --> 00:08:59,700 +đối tượng được tạo từ cùng một lớp. Vì vậy, trong trường hợp này, chúng ta + +132 +00:08:59,700 --> 00:09:04,590 +đang sử dụng lớp rùa để tạo một đối tượng rùa có tên là Timmy, nhưng chúng ta cũng + +133 +00:09:04,860 --> 00:09:09,860 +có một đối tượng riêng biệt có tên là Tommy. Và Timmy và Tommy đều là vật thể của Tuttle, + +134 +00:09:10,020 --> 00:09:14,900 +nhưng chúng là những trường hợp khác nhau. Vì vậy, chúng có thể hoạt động độc lập, + +135 +00:09:14,900 --> 00:09:18,110 +chúng có thể xuất hiện khác nhau, chúng có thể có màu sắc + +136 +00:09:18,110 --> 00:09:21,380 +khác nhau, thuộc tính khác nhau và tốc độ di chuyển cũng khác nhau. + +137 +00:09:21,830 --> 00:09:26,830 +Vì vậy, chúng tôi đã thấy trong cuộc đua rùa của mình rằng mỗi cá thể trong số này có thể hoạt động + +138 +00:09:27,140 --> 00:09:29,690 +theo cách riêng của chúng và có trạng thái khác nhau. + +139 +00:09:29,930 --> 00:09:33,860 +Và điều đó được thể hiện ở tốc độ di chuyển khác nhau và khả + +140 +00:09:33,860 --> 00:09:37,580 +năng tạo ra nhiều đối tượng có thể hoạt động và cư xử độc + +141 +00:09:37,880 --> 00:09:42,590 +lập thực sự là bí quyết giải thích tại sao Lập trình hướng đối tượng có thể mạnh + +142 +00:09:42,590 --> 00:09:43,423 +mẽ đến vậy. + +143 +00:09:43,550 --> 00:09:48,050 +Chúng tôi có thể tạo rất nhiều đối tượng trong số này và yêu cầu chúng thực hiện việc đặt giá thầu trong các phần khác + +144 +00:09:48,050 --> 00:09:50,480 +nhau của chương trình của chúng tôi. Và trong các bài + +145 +00:09:50,510 --> 00:09:52,970 +học sắp tới khi chúng tôi xây dựng các dự án + +146 +00:09:53,270 --> 00:09:58,130 +ngày càng phức tạp hơn, bạn sẽ thấy khái niệm này về việc có nhiều trường hợp với trạng thái khác + +147 +00:09:58,130 --> 00:10:02,060 +nhau được hiển thị lặp đi lặp lại. Và chúng tôi sẽ đến để xem và tận hưởng những lợi ích. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Course-Fixes-Report-an-Issue.url b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Solution-turtle-race-final.zip b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Solution-turtle-race-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..028994233159bdbf468303b3f1a4e952c1c99b55 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/007 Solution-turtle-race-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b4b494d9b8f0c6a99556d05973c5c45c7bdea45e0b00ab7644ae9ae94648f37 +size 707 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/008 Expand on the Solutions.mp4 b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/008 Expand on the Solutions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..54b9100704d1e285a4783ca6100873c92cd8c041 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/008 Expand on the Solutions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cc9b3db6896220a70ccf237e9224d734520e013c7da535831691681c2460783 +size 63982292 diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/008 Expand on the Solutions_vi.srt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/008 Expand on the Solutions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ba1265f29441833c9960d51fc790c39ce5f8b83b --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/008 Expand on the Solutions_vi.srt @@ -0,0 +1,88 @@ +1 +00:00:01,110 --> 00:00:10,230 +Này, các bạn, hoàn thành tốt ngày 19. Bây giờ ở giai đoạn này, bạn có thể đã đến thời điểm mà bạn đang nghĩ, “Ồ, tôi rất muốn mở + +2 +00:00:10,230 --> 00:00:14,550 +rộng ra một số dự án trong số này. "Và đó là + +3 +00:00:15,060 --> 00:00:17,940 +ý tưởng hoàn hảo để có. + +4 +00:00:17,940 --> 00:00:19,710 +Đó chính xác là những gì tôi muốn bạn nghĩ. + +5 +00:00:20,220 --> 00:00:25,560 +Nhưng bạn có thể đang xem mã giải pháp mà tôi viết và đại loại là, "Ồ, thực ra, bạn biết đấy, mã giải pháp + +6 +00:00:25,570 --> 00:00:31,800 +quá đơn giản, hoặc như nó không nắm bắt được tất cả các trường hợp góc cạnh hoặc, bạn biết đấy, nó không cho phép tôi tối đa hóa dự + +7 +00:00:31,800 --> 00:00:39,510 +án về tất cả các tính năng của nó hoặc tất cả các ý tưởng của bạn. "Nhưng đó là bởi vì mã giải pháp phải + +8 +00:00:40,230 --> 00:00:45,960 +phù hợp với, bạn biết đấy, ít nhiều giống như khung thời gian một + +9 +00:00:45,960 --> 00:00:48,030 +giờ hoặc hai giờ. + +10 +00:00:48,030 --> 00:00:54,630 +Và nó phải đủ đơn giản để bất kỳ ai ở giai đoạn này cũng có thể hiểu được khi tôi trải qua nó. + +11 +00:00:55,050 --> 00:00:58,710 +Vì vậy, nó sẽ không nắm bắt mọi khả năng, nó + +12 +00:00:58,980 --> 00:01:01,440 +sẽ không bao gồm tất cả. + +13 +00:01:01,800 --> 00:01:07,830 +Nhưng những gì tôi muốn bạn làm là một khi bạn cảm thấy thoải mái với mã giải pháp, một khi bạn hiểu những + +14 +00:01:07,830 --> 00:01:12,720 +gì đang xảy ra và bạn có ý tưởng để mở rộng dự án, thì hãy thực hiện nó. + +15 +00:01:13,320 --> 00:01:19,320 +Hãy tiếp tục và thử viết mã mà bạn muốn dự án thực hiện. + +16 +00:01:19,740 --> 00:01:22,420 +Bây giờ, điều này có thể liên quan đến một chút + +17 +00:01:22,420 --> 00:01:25,440 +googling, nó có thể liên quan đến một chút nghiên cứu về phía bạn. + +18 +00:01:25,440 --> 00:01:31,230 +Và bạn cũng có thể thấy rằng, "Này, thực ra, tôi cần đợi cho đến khi có lẽ là 20 bài học khi tôi tìm hiểu thêm về một số chủ đề khác + +19 +00:01:31,230 --> 00:01:35,220 +trước khi tôi có thể quay lại với dự án này. "Nhưng hãy bắt đầu suy nghĩ + +20 +00:01:35,430 --> 00:01:42,020 +về cách bạn có thể mở rộng các dự án này, cách bạn có thể làm cho chúng tốt hơn và không + +21 +00:01:42,030 --> 00:01:44,780 +bị giới hạn bởi mã giải pháp của tôi. + +22 +00:01:45,000 --> 00:01:46,490 +Đó là điều tôi muốn nói với bạn ngày hôm nay. + diff --git a/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/external-links.txt b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..10570e49251ed4468d7789244bec369234ca5e91 --- /dev/null +++ b/part2/19 - Day 19 - Intermediate - Instances, State and Higher Order Functions/external-links.txt @@ -0,0 +1,9 @@ + +002 The-listen-method +https://docs.python.org/3/library/turtle.html#turtle.listen + +005 Turtle.textinput-documentation +https://docs.python.org/3.1/library/turtle.html#turtle.textinput + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/001 Day 20 Goals what we will make by the end of the day.mp4 b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/001 Day 20 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fa9486e41599d6aef0440f01ec1d2afabfedd42f --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/001 Day 20 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b84c3c2f23221cd9fb1e948b8322dba8625a7d6977be4eee53c248f1f68b1986 +size 27027948 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/001 Day 20 Goals what we will make by the end of the day_vi.srt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/001 Day 20 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ae79771d9e2e6557e27d1ec03da68eaf9a56d9aa --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/001 Day 20 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,300 @@ +1 +00:00:00,510 --> 00:00:04,010 +Xin chào các bạn, chào mừng đến với Ngày 20/100 1: Ngày + +2 +00:00:04,010 --> 00:00:05,560 +lập mã. Hôm nay + +3 +00:00:05,680 --> 00:00:09,200 +0: thực sự thú vị bởi vì chúng ta sẽ sử dụng kiến thức + +4 +00:00:09,200 --> 00:00:11,630 +thu được về Lập trình hướng đối tượng cũng + +5 +00:00:11,990 --> 00:00:16,370 +như những gì chúng ta học được về cách sử dụng mô-đun con rùa để xây dựng + +6 +00:00:16,370 --> 00:00:18,830 +trò chơi rắn nổi tiếng. Bây giờ, đây có lẽ + +7 +00:00:18,830 --> 00:00:22,430 +là một trong những trò chơi di động nổi tiếng nhất từng có, và nó chắc + +8 +00:00:22,490 --> 00:00:27,490 +chắn là một trong những trò chơi yêu thích của tôi. Và lịch sử của tôi với nó + +9 +00:00:28,760 --> 00:00:32,390 +quay ngược lại với chiếc điện thoại di động đầu + +10 +00:00:32,420 --> 00:00:37,280 +tiên của tôi, Nokia 3310. Nó có thể hiển thị tuổi của tôi một + +11 +00:00:37,340 --> 00:00:40,580 +chút ở đây, nhưng đây là điện thoại di động đầu tiên của tôi. + +12 +00:00:40,890 --> 00:00:45,830 +Tôi nhớ mình đã yêu nó đến nỗi tôi đã thực sự đặt nó + +13 +00:00:45,830 --> 00:00:50,180 +bên cạnh gối khi đi ngủ. Và đây có lẽ là một trong những điện thoại di động giá cả phải chăng đầu tiên. + +14 +00:00:50,270 --> 00:00:55,270 +Và nó có thể tùy chỉnh liên tục với các trường hợp khác nhau và các phím khác nhau. + +15 +00:00:56,360 --> 00:00:58,640 +Nhưng thú vị nhất của nó là + +16 +00:00:58,880 --> 00:01:01,090 +trò chơi rắn. Tôi sẽ so sánh với + +17 +00:01:01,190 --> 00:01:04,489 +bạn bè của mình và xem ai có điểm cao nhất trong trò chơi rắn và chúng + +18 +00:01:04,730 --> 00:01:09,590 +tôi sẽ dành ngày này qua ngày khác để chơi trò chơi này. Và so với các trò chơi trên iPhone + +19 +00:01:09,590 --> 00:01:14,060 +ngày nay, tất nhiên, trò chơi này rất, rất đơn giản, nhưng dù sao, + +20 +00:01:14,060 --> 00:01:17,990 +nó vẫn siêu gây nghiện. Trong hai ngày tới, đây là + +21 +00:01:18,110 --> 00:01:22,700 +trò chơi mà chúng tôi sẽ xây dựng. Một trò chơi rắn có, ừm, một + +22 +00:01:22,760 --> 00:01:26,180 +con rắn di chuyển, bạn điều khiển bằng bàn phím và bạn + +23 +00:01:26,630 --> 00:01:29,030 +có thể đi lấy thức ăn, sau đó nó + +24 +00:01:29,300 --> 00:01:31,910 +lớn dần lên khi ăn nhiều thức ăn hơn. + +25 +00:01:32,240 --> 00:01:35,480 +Và bạn phải chắc chắn rằng bạn không bị rối hoặc va + +26 +00:01:35,480 --> 00:01:36,170 +vào tường. + +27 +00:01:36,170 --> 00:01:40,940 +Và mục tiêu là ăn càng nhiều thức ăn càng tốt trong khi vẫn còn sống. + +28 +00:01:41,600 --> 00:01:45,350 +Có một số người thực sự là bậc thầy trong trò chơi này, ừm, cá + +29 +00:01:45,410 --> 00:01:47,420 +nhân tôi thì không, nhưng họ đã xoay + +30 +00:01:47,780 --> 00:01:52,430 +sở để khiến những con rắn của họ đạt được độ dài điên cuồng và bắt đầu có những chiến + +31 +00:01:52,430 --> 00:01:57,430 +lược này để làm thế nào bạn có thể tránh va vào đuôi và làm thế nào bạn có thể tiếp tục. + +32 +00:01:58,100 --> 00:02:01,400 +Vì vậy, khi bạn đã xây dựng trò chơi rắn của mình, bạn sẽ có thể chơi với + +33 +00:02:01,550 --> 00:02:04,700 +nó và bạn sẽ có thể khoe điểm cao của mình với những người còn lại, nhưng + +34 +00:02:04,910 --> 00:02:07,310 +tôi chắc chắn rằng bạn sẽ làm tốt hơn tôi rất nhiều. + +35 +00:02:07,700 --> 00:02:10,850 +Không khó để đánh bại tôi với con rắn. Như mọi khi, khi + +36 +00:02:10,850 --> 00:02:13,040 +chúng ta suy nghĩ về một vấn + +37 +00:02:13,070 --> 00:02:16,340 +đề phức tạp, bước đầu tiên là chia nhỏ vấn đề. + +38 +00:02:16,940 --> 00:02:21,940 +Và tôi sẽ chia nhỏ vấn đề này khi xây dựng trò chơi rắn thành bảy + +39 +00:02:22,040 --> 00:02:23,150 +bước riêng biệt. + +40 +00:02:23,420 --> 00:02:26,660 +Và cách chúng ta sẽ làm là chúng ta sẽ giải quyết + +41 +00:02:26,660 --> 00:02:30,470 +ba bước đầu tiên vào Ngày 1 và bốn bước cuối cùng vào Ngày 2. + +42 +00:02:30,950 --> 00:02:34,730 +Vì vậy, chúng tôi sẽ chia trò chơi này thành hai phần và chúng + +43 +00:02:34,760 --> 00:02:39,680 +tôi sẽ giải quyết nó trong hai ngày. Bước đầu tiên là tạo thân rắn và chúng + +44 +00:02:40,070 --> 00:02:43,880 +ta sẽ làm điều đó bằng cách tạo ba hình vuông trên màn hình, + +45 +00:02:44,270 --> 00:02:45,950 +tất cả được xếp cạnh nhau. + +46 +00:02:46,760 --> 00:02:51,290 +Và sau đó chúng ta sẽ tìm ra cách di chuyển con rắn để nó liên tục di chuyển về phía trước + +47 +00:02:51,290 --> 00:02:52,250 +và tất cả những + +48 +00:02:52,460 --> 00:02:57,170 +gì chúng ta phải làm là yêu cầu nó thay đổi hướng. Sau đó, chúng ta sẽ tìm ra + +49 +00:02:57,230 --> 00:03:01,300 +cách điều khiển con rắn bằng cách sử dụng điều khiển bàn phím. + +50 +00:03:01,570 --> 00:03:06,570 +Vì vậy, chúng tôi sẽ sử dụng các phím mũi tên lên, trái, xuống và phải để di chuyển con rắn + +51 +00:03:07,240 --> 00:03:08,680 +của chúng tôi trên màn hình. + +52 +00:03:09,070 --> 00:03:12,520 +Và đó là những gì chúng tôi đang hướng tới vào cuối ngày + +53 +00:03:12,520 --> 00:03:14,920 +hôm nay, Ngày 20. Vào Ngày 21, chúng ta + +54 +00:03:15,070 --> 00:03:18,340 +sẽ tiếp tục và sẽ xây dựng bốn bước cuối cùng của trò + +55 +00:03:18,340 --> 00:03:19,173 +chơi rắn. + +56 +00:03:19,630 --> 00:03:24,100 +Sau đó, chúng ta sẽ cần bắt đầu đặt một số thức ăn lên màn hình và bắt + +57 +00:03:24,100 --> 00:03:28,210 +đầu phát hiện sự va chạm với thức ăn để một khi con rắn chạm vào + +58 +00:03:28,450 --> 00:03:33,400 +thức ăn, thì một miếng thức ăn mới sẽ được tạo ngẫu nhiên trên màn hình tại một số vị + +59 +00:03:33,520 --> 00:03:34,570 +trí ngẫu nhiên. + +60 +00:03:35,410 --> 00:03:40,240 +Và sau đó là vấn đề theo dõi điểm số và lập bảng điểm. + +61 +00:03:40,510 --> 00:03:45,430 +Vì vậy, chúng ta sẽ học cách viết văn bản trong chương trình của mình để một khi con rắn + +62 +00:03:45,430 --> 00:03:48,970 +chạm vào một miếng thức ăn, điểm số sẽ tự động cập nhật. + +63 +00:03:49,480 --> 00:03:52,870 +Và tiếp theo, chúng tôi sẽ tìm ra khi nào trò chơi sẽ kết thúc. + +64 +00:03:53,020 --> 00:03:58,020 +Vì vậy, một trong những trường hợp mà trò chơi nên kết thúc là khi con + +65 +00:03:58,480 --> 00:04:02,470 +rắn đã va vào tường. Và tại thời điểm này, chúng ta sẽ thấy + +66 +00:04:02,470 --> 00:04:06,430 +trò chơi kết thúc, hiển thị trên màn hình và con rắn sẽ không còn di chuyển nữa. + +67 +00:04:06,910 --> 00:04:08,140 +Và cuối cùng, + +68 +00:04:08,200 --> 00:04:12,880 +lý do khác khiến trò chơi của chúng ta có thể kết thúc là khi con + +69 +00:04:12,880 --> 00:04:17,470 +rắn va chạm với chính đuôi của nó. Vì vậy, con rắn về cơ bản không thể đuổi theo đuôi của chính mình. + +70 +00:04:17,740 --> 00:04:21,610 +Và khi rắn càng lâu, vấn đề này càng dễ xảy ra. + +71 +00:04:22,060 --> 00:04:26,500 +Và khi đầu của họ chạm vào bất kỳ phần nào trên cơ thể của con rắn, + +72 +00:04:26,560 --> 00:04:29,860 +thì trò chơi lại kết thúc. Vì vậy, đây là bảy bước + +73 +00:04:29,890 --> 00:04:32,040 +cần thiết để tạo ra trò chơi rắn. + +74 +00:04:32,670 --> 00:04:37,440 +0: Và khi bạn đã sẵn sàng, chúng ta sẽ bắt đầu với bước một trong bài học tiếp theo. + +75 +00:04:37,650 --> 00:04:38,340 +Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/002 Screen Setup and Creating a Snake Body.mp4 b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/002 Screen Setup and Creating a Snake Body.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2da5e6a8a601c37f435927f14f3c4a9b6a1695cd --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/002 Screen Setup and Creating a Snake Body.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4bfcaf15f20d5ad019fdd2429ca4b8db3a0240c34f3583da39c3d2fb2b4c226 +size 33383812 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/002 Screen Setup and Creating a Snake Body_vi.srt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/002 Screen Setup and Creating a Snake Body_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..705bafbce7595fa12670dc9641a58f9c7583a81e --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/002 Screen Setup and Creating a Snake Body_vi.srt @@ -0,0 +1,488 @@ +1 +00:00:00,330 --> 00:00:01,650 +Vì vậy, để bắt + +2 +00:00:01,740 --> 00:00:06,210 +đầu, hãy tiếp tục và tạo một dự án mới có tên là solid_game trong PyCharm. + +3 +00:00:06,870 --> 00:00:11,340 +Và sau đó bên trong dự án này, chúng ta sẽ tạo một chính mới. tệp py. + +4 +00:00:12,450 --> 00:00:16,500 +Và bên trong tệp của chúng tôi, chúng tôi sẽ cần nhập thông thường của chúng tôi. + +5 +00:00:16,860 --> 00:00:21,860 +Vì vậy, tôi sẽ nói từ rùa nhập lớp màn hình và cả + +6 +00:00:24,120 --> 00:00:25,890 +lớp rùa. Bây giờ, + +7 +00:00:25,920 --> 00:00:29,880 +điều đầu tiên chúng ta sẽ làm là tạo một màn hình mới, + +8 +00:00:29,940 --> 00:00:32,820 +về cơ bản đây sẽ là cửa sổ hiển thị. + +9 +00:00:33,390 --> 00:00:38,390 +Và sau đó chúng tôi sẽ thiết lập màn hình của mình để nó có kích thước 600 x 600. + +10 +00:00:40,380 --> 00:00:45,380 +Vì vậy, chiều rộng sẽ là 600 pixel và chiều cao cũng + +11 +00:00:47,310 --> 00:00:51,780 +sẽ là 600 pixel. Và lưu ý cách tôi sử dụng các đối số + +12 +00:00:51,810 --> 00:00:55,530 +từ khóa này để người tiếp theo xem mã này rõ ràng hơn điều gì đang thực + +13 +00:00:55,770 --> 00:00:58,290 +sự xảy ra ở đây. Bây giờ, điều + +14 +00:00:58,320 --> 00:01:01,770 +khác tôi muốn thay đổi là màu nền của màn hình. + +15 +00:01:02,160 --> 00:01:06,570 +Vì vậy, có một phương pháp được gọi là bgcolor và bên trong đây chúng + +16 +00:01:06,570 --> 00:01:11,310 +ta sẽ viết văn bản màu đen để cuối cùng chúng ta có một màn hình đen. + +17 +00:01:11,880 --> 00:01:12,300 +Bây + +18 +00:01:12,300 --> 00:01:17,300 +giờ, một điều khác mà bạn có thể chưa thấy trước đây là cách đặt tiêu + +19 +00:01:17,340 --> 00:01:21,600 +đề của cửa sổ hiển thị. Và chúng tôi thực hiện điều đó thông qua một phương pháp có tên + +20 +00:01:21,870 --> 00:01:26,430 +là title, và bạn có thể đặt tên cho chương trình của mình tại đây. Vì vậy, tôi sẽ gọi nó là 'Trò chơi rắn của tôi', nhưng tất + +21 +00:01:26,790 --> 00:01:30,870 +nhiên bạn có thể gọi nó bất cứ điều gì bạn muốn. Cuối cùng, ở cuối + +22 +00:01:30,870 --> 00:01:35,550 +tệp, tôi sẽ nói màn hình. exitonclick. + +23 +00:01:35,790 --> 00:01:40,050 +Vì vậy, theo cách này, khi tôi thực sự chạy nó, nó không chỉ biến mất ngay lập tức mà nó + +24 +00:01:40,770 --> 00:01:44,640 +đang đợi tôi và tôi có thể xem những gì thực sự đã xảy ra cho đến nay. + +25 +00:01:45,090 --> 00:01:49,230 +Vì vậy, tôi sẽ nhấp vào chạy và sau đó chọn tệp chính của mình. + +26 +00:01:49,680 --> 00:01:51,000 +Và khi nó + +27 +00:01:51,030 --> 00:01:56,030 +bật lên, đây là những gì bạn sẽ thấy, một cửa sổ 600 x 600 vuông và + +28 +00:01:56,520 --> 00:01:59,880 +sau đó ở đầu cửa sổ, bạn sẽ thấy tên chương + +29 +00:01:59,910 --> 00:02:04,620 +trình của mình, đó là My Snake Game. Và nền bây giờ là màu đen. + +30 +00:02:05,640 --> 00:02:07,500 +Bây giờ chúng ta đã thiết lập màn + +31 +00:02:07,530 --> 00:02:11,039 +hình của mình, chúng ta đã sẵn sàng thực hiện bước đầu tiên trong số bảy + +32 +00:02:11,340 --> 00:02:13,500 +bước của chúng ta, đó là tạo cơ thể rắn. + +33 +00:02:14,160 --> 00:02:17,520 +Và chúng ta sẽ tạo ra ba hình vuông, mỗi + +34 +00:02:17,610 --> 00:02:19,590 +hình vuông sẽ là những + +35 +00:02:19,830 --> 00:02:24,090 +con rùa và chúng sẽ được xếp cạnh nhau dọc theo trục hoành. + +36 +00:02:24,210 --> 00:02:28,020 +Vì vậy, chúng ta hãy suy nghĩ về điều này. Khi chúng tôi tạo một + +37 +00:02:28,290 --> 00:02:33,290 +con rùa mới, nó có kích thước chiều rộng 20 pixel x chiều cao 20 pixel. + +38 +00:02:34,530 --> 00:02:38,100 +Và nếu chúng ta muốn ba trong số chúng xếp cạnh nhau, thì chúng ta phải nghĩ + +39 +00:02:38,370 --> 00:02:43,050 +về cách chúng ta tạo ra tọa độ của chúng. Như một thách thức, tôi muốn bạn suy nghĩ về cách chúng + +40 +00:02:43,170 --> 00:02:46,260 +tôi có thể tạo ra điều này. Ở đây chúng ta có + +41 +00:02:46,260 --> 00:02:48,990 +ba hình vuông riêng biệt, mỗi hình là + +42 +00:02:49,050 --> 00:02:54,050 +một vật thể rùa và chúng có hình dạng giống như một hình vuông và + +43 +00:02:54,330 --> 00:02:57,420 +chúng có màu trắng. Bây giờ, chúng được + +44 +00:02:57,450 --> 00:03:00,130 +định vị sao cho ô đầu tiên là (0, + +45 +00:03:00,490 --> 00:03:04,810 +0), ô tiếp theo cách 20 pixel ở bên trái và ô tiếp theo lại + +46 +00:03:04,870 --> 00:03:08,920 +cách 20 pixel ở bên trái để không có ô vuông nào chồng lên + +47 +00:03:09,100 --> 00:03:12,940 +nhau, nhưng cũng không có khoảng trống. Vì vậy, nó trông giống như một con rắn toàn bộ. + +48 +00:03:13,510 --> 00:03:14,980 +Đây là thách thức của + +49 +00:03:15,160 --> 00:03:18,820 +bạn và bạn có thể phải suy nghĩ về một số điều mà chúng tôi đã + +50 +00:03:18,820 --> 00:03:22,450 +làm trước đây để đạt được điều này. Vì vậy, hãy duyệt qua tài liệu, xem lại + +51 +00:03:22,810 --> 00:03:26,650 +đoạn mã trước đó mà bạn đã viết và xem liệu bạn có thể giải quyết được thử thách + +52 +00:03:26,650 --> 00:03:28,240 +này hay không. Tạm dừng video ngay bây giờ. + +53 +00:03:32,590 --> 00:03:32,980 +Được rồi. + +54 +00:03:32,980 --> 00:03:37,060 +Vì vậy, điều đầu tiên chúng ta cần làm là tạo ra một số loại rùa, + +55 +00:03:37,060 --> 00:03:37,660 +phải không? + +56 +00:03:37,660 --> 00:03:42,660 +Vì vậy, chúng ta hãy gọi đây là phân đoạn_1 và đây sẽ là một con rùa mới. + +57 +00:03:43,150 --> 00:03:45,880 +Và hãy nhớ rằng khi chúng ta khởi tạo con rùa, chúng + +58 +00:03:46,090 --> 00:03:48,310 +ta đã có thể chỉ định hình dạng. + +59 +00:03:48,580 --> 00:03:51,850 +Vì vậy, chúng ta có thể nói shape = "square", hoặc đơn + +60 +00:03:51,940 --> 00:03:56,740 +giản là chỉ để nó là hình vuông. Vì vậy, bây giờ tại thời điểm này, chúng + +61 +00:03:56,740 --> 00:04:01,150 +ta nên kết thúc với một con rùa vuông, nhưng vì nó màu đen, khi chúng ta chạy + +62 +00:04:01,180 --> 00:04:04,630 +mã, chúng ta sẽ không thực sự nhìn thấy nó trên màn hình. + +63 +00:04:05,140 --> 00:04:09,970 +Vì vậy, hãy thay đổi màu phân đoạn này thành màu trắng. + +64 +00:04:10,570 --> 00:04:14,920 +Và tất cả những gì chúng ta phải làm là viết từ cho màu + +65 +00:04:15,370 --> 00:04:18,279 +sắc và bây giờ khi chúng ta chạy lại + +66 +00:04:18,339 --> 00:04:22,330 +mã của mình, bạn có thể thấy một hình vuông màu trắng ở + +67 +00:04:22,360 --> 00:04:24,790 +tâm, nằm ở vị trí (0, 0). + +68 +00:04:25,690 --> 00:04:30,690 +Bây giờ bước tiếp theo là tạo hai hình vuông màu trắng khác của chúng ta. + +69 +00:04:32,290 --> 00:04:35,560 +Vì vậy, hãy tiếp tục và sao chép các bit mã + +70 +00:04:36,070 --> 00:04:39,340 +này, và tôi sẽ tạo tổng cộng ba trong số chúng. + +71 +00:04:39,340 --> 00:04:43,300 +Vì vậy, phân khúc_2 và phân đoạn_3. + +72 +00:04:45,130 --> 00:04:47,860 +Bây giờ ở đây, chúng ta sẽ tạo ra thứ tương + +73 +00:04:48,040 --> 00:04:52,600 +tự, nhưng rõ ràng chúng ta phải thay đổi vị trí vì nếu không, chúng ta sẽ có + +74 +00:04:52,630 --> 00:04:55,000 +ba hình vuông chồng lên nhau và chúng + +75 +00:04:55,030 --> 00:04:58,960 +ta chỉ có thể nhìn thấy một hình vuông vì đây là hình 2-D hình ảnh. + +76 +00:04:59,530 --> 00:05:04,530 +Vì vậy, hãy tiếp tục và làm cho phân khúc_2 chuyển sang một vị trí khác. + +77 +00:05:05,320 --> 00:05:09,070 +Vì vậy, điều đầu tiên chúng ta phải xác định là + +78 +00:05:09,220 --> 00:05:12,790 +X, mà bạn nhớ là trục hoành ở đây. + +79 +00:05:13,030 --> 00:05:15,550 +Và nếu chúng ta muốn một hình vuông + +80 +00:05:15,970 --> 00:05:20,970 +khác ở bên trái của nó, thì chúng ta sẽ phải chuyển đến -20 từ 0. + +81 +00:05:21,550 --> 00:05:25,240 +Bằng cách đó, nó sẽ được dịch chuyển sang trái 20 pixel. + +82 +00:05:25,840 --> 00:05:28,750 +Giả sử đi đến -20 và khi đó trục + +83 +00:05:29,110 --> 00:05:32,650 +Y sẽ bằng 0 vì nó sẽ không di chuyển lên + +84 +00:05:32,650 --> 00:05:33,483 +hoặc xuống. + +85 +00:05:33,640 --> 00:05:38,200 +Bây giờ chúng ta hãy xem kết quả của việc này và bạn có thể thấy + +86 +00:05:38,200 --> 00:05:40,210 +bây giờ chúng ta có hai + +87 +00:05:40,540 --> 00:05:43,990 +hình vuông xếp cạnh nhau, nhưng hình vuông thứ ba vẫn ở giữa. + +88 +00:05:44,620 --> 00:05:49,030 +Vì vậy, phân đoạn thứ ba sẽ được dịch chuyển thêm 20 pixel. + +89 +00:05:49,390 --> 00:05:54,310 +Đây là trung tâm ở (0, 0), đây là (-20, 0), sau đó + +90 +00:05:54,610 --> 00:05:57,100 +điều này phải ở (-40, 0). + +91 +00:05:57,350 --> 00:06:01,700 +Vì vậy, hãy yêu cầu phân khúc_3 của chúng tôi chuyển đến (-40, 0). + +92 +00:06:02,150 --> 00:06:03,800 +Và đây là những gì chúng ta thấy. + +93 +00:06:04,190 --> 00:06:08,810 +Bạn đã quản lý để đạt được điều này hay bạn đã làm điều đó theo một cách khác? Bây giờ, một cách dễ + +94 +00:06:08,900 --> 00:06:13,700 +dàng hơn để tạo điều này là sử dụng vòng lặp for. + +95 +00:06:14,090 --> 00:06:14,990 +Ví dụ: + +96 +00:06:15,250 --> 00:06:17,340 +chúng tôi có thể đã tạo một danh + +97 +00:06:17,480 --> 00:06:18,940 +sách các vị trí bắt + +98 +00:06:20,860 --> 00:06:24,370 +đầu và điều này có thể chứa một số bộ giá trị. + +99 +00:06:24,850 --> 00:06:29,850 +Vì vậy, chúng ta biết rằng để chỉ định nơi phân đoạn sẽ đi đến, chúng ta phải + +100 +00:06:30,280 --> 00:06:34,240 +cung cấp một bộ giá trị, đó là giá trị X và Y. + +101 +00:06:34,840 --> 00:06:39,220 +Và chúng tôi biết rằng chúng tôi có thể tạo một bộ giá trị chỉ bằng cách sử dụng một tập hợp các dấu ngoặc + +102 +00:06:39,220 --> 00:06:42,130 +đơn và sau đó thêm các giá trị vào đó, được phân tách bằng dấu phẩy. + +103 +00:06:42,610 --> 00:06:46,990 +Vì vậy, nếu đoạn đầu tiên phải ở trung tâm, thì đó sẽ + +104 +00:06:46,990 --> 00:06:51,910 +là (0, 0), và sau đó đoạn thứ hai sẽ ở (-20, 0) và + +105 +00:06:52,510 --> 00:06:55,720 +đoạn thứ ba sẽ ở ( -40, 0). + +106 +00:06:56,410 --> 00:06:57,780 +Bây giờ chúng ta có thể tạo + +107 +00:06:57,940 --> 00:07:00,100 +một vòng lặp for. Vì vậy, + +108 +00:07:00,370 --> 00:07:03,040 +đối với vị trí trong start_positions, + +109 +00:07:03,490 --> 00:07:08,490 +hãy lặp lại danh sách này và tạo một phân đoạn mới + +110 +00:07:09,490 --> 00:07:13,870 +cho từng vị trí đó. Vì vậy, bây giờ chúng ta sẽ tạo + +111 +00:07:13,870 --> 00:07:16,360 +một phân đoạn mới, đó là một con rùa + +112 +00:07:16,750 --> 00:07:21,750 +vuông, sẽ có màu trắng và chúng ta sẽ đưa phân đoạn đi đến vị trí mà chúng + +113 +00:07:21,940 --> 00:07:25,570 +ta hiện đang lặp lại. Bây giờ chúng tôi có thể xóa tất cả + +114 +00:07:25,900 --> 00:07:30,370 +mã đó và khi chúng tôi chạy lại mã của mình, bạn có thể thấy chúng tôi cũng có tác dụng tương tự. + +115 +00:07:30,400 --> 00:07:35,380 +Chúng tôi có tất cả ba mảnh. Vì vậy, nếu bạn không thể nhớ cách hoạt động của + +116 +00:07:35,620 --> 00:07:38,890 +bộ giá trị, hãy nhớ quay lại các bài học về bộ giá trị trong Ngày 18, + +117 +00:07:39,220 --> 00:07:42,040 +nơi chúng ta đã nói về cách viết chúng và cách chúng hoạt động. + +118 +00:07:42,760 --> 00:07:45,070 +Nhưng điều đó đã hoàn thành bước đầu tiên của chúng tôi. + +119 +00:07:45,280 --> 00:07:50,280 +Chúng tôi đã quản lý để tạo ra ba phân đoạn sẽ bao gồm con rắn của chúng tôi + +120 +00:07:50,650 --> 00:07:51,910 +và trong bài học + +121 +00:07:51,940 --> 00:07:55,690 +tiếp theo, chúng tôi sẽ tìm ra cách để con rắn của chúng tôi bắt + +122 +00:07:55,690 --> 00:07:59,380 +đầu tự di chuyển trên màn hình. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 Animating the Snake Segments on Screen.mp4 b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 Animating the Snake Segments on Screen.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b83b2b4748ddc9b9d243e6a1a95e7dadabccb3be --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 Animating the Snake Segments on Screen.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ad49f50ca5558a15f3339908273eef0402a8a3bdae0f9c60dc41782366e7fec +size 123620686 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 Animating the Snake Segments on Screen_vi.srt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 Animating the Snake Segments on Screen_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f4402ec932b75b7411e701e174f8c3bb1074d84c --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 Animating the Snake Segments on Screen_vi.srt @@ -0,0 +1,1032 @@ +1 +00:00:00,630 --> 00:00:05,630 +Trong bài học trước, chúng ta đã tạo ra cơ thể con rắn của mình bằng cách tạo ra ba hình + +2 +00:00:05,640 --> 00:00:10,260 +vuông tương ứng với mỗi đối tượng là rùa. Bây giờ trong bài học này, chúng ta + +3 +00:00:10,290 --> 00:00:14,280 +sẽ chuyển sang bước tiếp theo, nơi chúng ta thực sự di chuyển con rắn + +4 +00:00:14,520 --> 00:00:18,570 +của mình tự động trên màn hình mà không cần phải làm bất cứ điều gì. + +5 +00:00:19,050 --> 00:00:24,050 +Vì vậy, theo cách này, con rắn liên tục di chuyển về phía trước và tất cả những gì chúng ta phải làm với tư cách là + +6 +00:00:24,120 --> 00:00:27,570 +người dùng chỉ là thay đổi hướng của nó. Bây giờ, chúng ta sẽ di chuyển + +7 +00:00:27,600 --> 00:00:30,990 +con rắn như thế nào? Chà, chúng tôi đã + +8 +00:00:31,020 --> 00:00:36,000 +tạo các phân đoạn khác nhau này, nhưng hiện tại, không có cách + +9 +00:00:36,030 --> 00:00:39,360 +nào để tổ chức tất cả các phân đoạn. + +10 +00:00:39,720 --> 00:00:42,480 +Chúng chỉ được tạo ra và đặt trên màn hình. + +11 +00:00:43,140 --> 00:00:47,310 +Vì vậy, hãy đặt chúng vào một danh sách được gọi là phân đoạn, và hãy bắt đầu + +12 +00:00:47,820 --> 00:00:52,020 +danh sách đó như một danh sách trống. Và sau đó, khi chúng tôi + +13 +00:00:52,020 --> 00:00:54,180 +đã tạo từng phân đoạn mới, chúng + +14 +00:00:54,420 --> 00:00:57,300 +tôi tiếp tục và thêm nó vào danh sách này. + +15 +00:00:58,770 --> 00:01:02,250 +Nếu chúng ta muốn điều gì đó liên tục xảy ra trong chương trình của + +16 +00:01:02,700 --> 00:01:05,910 +mình, cách mà chúng ta thường làm là thông qua vòng lặp while. + +17 +00:01:06,510 --> 00:01:11,510 +Vì vậy, hãy tạo một biến mới có tên là game_is_on và hãy đặt nó thành true. + +18 +00:01:14,520 --> 00:01:16,680 +Và trong khi trò chơi đang + +19 +00:01:17,100 --> 00:01:20,280 +diễn ra, thì chúng ta sẽ chuyển từng phân đoạn. + +20 +00:01:20,670 --> 00:01:25,440 +Cách đơn giản nhất mà tôi có thể nghĩ ra để di chuyển phân đoạn này + +21 +00:01:25,560 --> 00:01:29,190 +là lặp lại từng phân đoạn trong danh sách các phân đoạn + +22 +00:01:29,730 --> 00:01:34,730 +của chúng tôi và sau đó để từng phân đoạn này tiếp tục và tiến về phía trước. + +23 +00:01:35,640 --> 00:01:38,160 +Vì vậy, giả sử chúng ta di chuyển về phía trước 20 pixel. + +24 +00:01:38,580 --> 00:01:41,340 +Hãy tiếp tục và chạy chương trình này và xem những gì chúng ta nhận được. + +25 +00:01:42,450 --> 00:01:46,290 +Điều đầu tiên chúng tôi nhận thấy là hành vi rất kỳ lạ. + +26 +00:01:46,710 --> 00:01:49,080 +Chúng tôi có một đường đang + +27 +00:01:49,470 --> 00:01:52,260 +được vẽ và xuất phát từ mỗi phân + +28 +00:01:52,620 --> 00:01:55,320 +đoạn là những con rùa riêng lẻ. + +29 +00:01:55,410 --> 00:01:57,810 +Và tất cả họ đều vẽ đường này khi họ đang di chuyển. + +30 +00:01:58,590 --> 00:02:00,690 +Điều đầu tiên chúng tôi muốn sửa là dòng đó. + +31 +00:02:00,960 --> 00:02:03,630 +Vì vậy, khi chúng ta tạo mỗi phân đoạn mới, trước khi + +32 +00:02:03,750 --> 00:02:07,020 +chúng ta yêu cầu nó đi đến vị trí của nó, hãy tiếp tục + +33 +00:02:07,410 --> 00:02:11,760 +và yêu cầu nó kéo cây bút lên. Bằng cách này, nó sẽ không thực sự + +34 +00:02:11,760 --> 00:02:13,260 +vẽ và tất cả + +35 +00:02:13,470 --> 00:02:16,950 +những gì chúng ta sẽ thấy là những miếng rùa thực sự. + +36 +00:02:19,110 --> 00:02:24,110 +Vì vậy, bây giờ chúng ta thấy ba mảnh rùa của chúng ta đang nháo nhào chạy theo giống như một loại Sâu + +37 +00:02:24,960 --> 00:02:28,500 +bướm kỳ lạ nào đó, nhưng chắc chắn không phải theo cách như một con rắn. + +38 +00:02:29,420 --> 00:02:30,620 +1: Làm thế nào chúng tôi có thể sửa chữa điều này? + +39 +00:02:31,490 --> 00:02:36,490 +0: Một trong những điều bạn nhận thấy về con rùa là nó sẽ tạo ra con rùa + +40 +00:02:37,400 --> 00:02:39,500 +đầu tiên khi nó chạy đường này, + +41 +00:02:39,800 --> 00:02:44,780 +con rùa sẽ được tạo ra ở các vị trí trung tâm, do đó, tọa độ (0, 0). + +42 +00:02:45,530 --> 00:02:49,730 +Và sau đó nó sẽ được di chuyển đến bất kỳ vị trí nào mà chúng tôi yêu cầu nó đi đến. + +43 +00:02:49,940 --> 00:02:54,890 +Ví dụ: đối với phân đoạn thứ ba, nó bắt đầu hoạt động ở (0, 0) và + +44 +00:02:55,070 --> 00:03:00,040 +sau đó ngay khi được yêu cầu chuyển đến vị trí này, nó sẽ chuyển sang (-40, 0). + +45 +00:03:00,580 --> 00:03:03,310 +Bây giờ chúng ta có thể thấy điều đó đang xảy ra trên màn hình. + +46 +00:03:03,940 --> 00:03:05,920 +Khi chúng tôi tạo cơ thể rắn + +47 +00:03:06,190 --> 00:03:10,960 +của mình, bạn có thể thấy từng mảnh riêng lẻ được tạo ra và sau đó chuyển + +48 +00:03:10,960 --> 00:03:14,560 +đến vị trí của chúng. Bây giờ, nếu chúng ta muốn + +49 +00:03:14,800 --> 00:03:18,670 +tắt hoạt ảnh đó, thì chúng ta sẽ phải sử dụng một trong các phương + +50 +00:03:18,670 --> 00:03:23,670 +thức của lớp màn hình được gọi là tracer. Và trình đánh dấu lấy một số làm + +51 +00:03:26,050 --> 00:03:28,870 +đầu vào, và nó sẽ bật hoặc tắt hoạt ảnh. + +52 +00:03:29,140 --> 00:03:31,570 +Và khi trình đánh dấu bị tắt, thì chúng + +53 +00:03:32,020 --> 00:03:37,020 +ta có thể sử dụng phương thức cập nhật để cho chương trình của mình biết khi nào + +54 +00:03:38,380 --> 00:03:43,150 +cần làm mới và vẽ lại màn hình. Khi chúng ta nghĩ lại về + +55 +00:03:43,180 --> 00:03:46,360 +màn hình TV cũ, màn hình ống tia âm + +56 +00:03:46,720 --> 00:03:51,720 +cực hoặc màn hình CRT, cách chúng hoạt động là vẽ trên một dải màu + +57 +00:03:53,920 --> 00:03:57,550 +từng dòng, từ từ bao phủ toàn bộ màn hình. + +58 +00:03:58,060 --> 00:04:02,020 +Và sau khi hoàn thành một màn hình, nó sẽ quay trở lại phần trên cùng và sau + +59 +00:04:02,110 --> 00:04:07,090 +đó nó sẽ vẽ các pixel cho cảnh tiếp theo. Và một cách hiệu quả, nó + +60 +00:04:07,090 --> 00:04:10,240 +giống như cách hoạt động của ảnh động GIF. + +61 +00:04:10,420 --> 00:04:14,380 +Một hình ảnh động gif bao gồm nhiều hình ảnh. Vì vậy, ví dụ, nếu chúng ta muốn + +62 +00:04:14,380 --> 00:04:15,730 +hoạt ảnh, chúng ta sẽ + +63 +00:04:15,730 --> 00:04:20,730 +tăng dòng này và sau đó chúng ta sẽ bắt đầu vẽ ra một chiếc lá cho đến khi chúng ta + +64 +00:04:21,339 --> 00:04:25,900 +kết thúc với một hoạt ảnh như thế này. Bây giờ, khi tất cả được kết + +65 +00:04:26,020 --> 00:04:29,170 +hợp và phát lại rất nhanh, thì đây là hình + +66 +00:04:29,200 --> 00:04:33,460 +ảnh động mà bạn thấy. Trong trò chơi của chúng tôi, những gì + +67 +00:04:33,490 --> 00:04:38,490 +chúng tôi có thể làm là chúng tôi có thể mô tả từng cảnh này và cho chương trình của chúng tôi + +68 +00:04:40,900 --> 00:04:43,270 +biết khi nào nó nên vẽ lại từng bức tranh. + +69 +00:04:44,140 --> 00:04:49,140 +Vì vậy, theo cách đó, chúng ta có thể bắt đầu với một hình ảnh, sau đó nhấn cập nhật và sau đó làm + +70 +00:04:50,260 --> 00:04:51,610 +điều gì đó khác trên + +71 +00:04:51,640 --> 00:04:56,260 +màn hình, có thể di chuyển từng phân đoạn của chúng tôi và sau đó yêu cầu màn hình cập nhật lại + +72 +00:04:56,260 --> 00:04:58,180 +để hiển thị cho người dùng kết quả mới. + +73 +00:04:58,660 --> 00:05:01,900 +Và sau đó mỗi lần chúng tôi thực hiện các thay đổi mà chúng tôi + +74 +00:05:02,230 --> 00:05:05,500 +muốn xảy ra và sau đó gọi phương thức cập nhật đó để yêu cầu + +75 +00:05:05,590 --> 00:05:10,590 +màn hình hiển thị một hình ảnh mới mỗi lần. Đầu tiên hãy tắt trình đánh dấu. + +76 +00:05:11,770 --> 00:05:14,770 +Vì vậy, trình đánh dấu là một phương thức trong lớp + +77 +00:05:15,220 --> 00:05:18,670 +màn hình và để tắt nó đi, chúng ta sẽ đặt nó về 0. + +78 +00:05:19,210 --> 00:05:23,470 +Vì vậy, bây giờ khi trình đánh dấu tắt, nếu chúng tôi thực sự cố gắng chạy chương trình của mình, bạn có + +79 +00:05:23,710 --> 00:05:26,890 +thể thấy đó chỉ là một màn hình đen và sẽ không có gì xảy ra. + +80 +00:05:27,400 --> 00:05:32,260 +Mặc dù chúng tôi đã có vòng lặp while và vòng lặp for của chúng tôi và rất nhiều thứ đang + +81 +00:05:32,260 --> 00:05:35,980 +diễn ra, nhưng cho đến khi chúng tôi gọi cập nhật, màn hình sẽ không làm + +82 +00:05:36,160 --> 00:05:39,700 +mới và nó sẽ không cho chúng tôi biết điều gì đang xảy ra + +83 +00:05:39,700 --> 00:05:41,110 +trong mã của chúng tôi. + +84 +00:05:41,680 --> 00:05:46,680 +Vì vậy, giả sử rằng chúng tôi quyết định gọi cập nhật sau khi tất cả các phân đoạn + +85 +00:05:48,820 --> 00:05:53,200 +đã được tạo, vì vậy ngay tại đây. Hãy gọi màn hình. + +86 +00:05:53,350 --> 00:05:56,620 +cập nhật. Và bây giờ nếu tôi nhấn run, + +87 +00:05:56,890 --> 00:06:01,280 +bạn sẽ nhận thấy điều đó khá nhiều ngay lập tức. Ngay sau khi bạn chạy chương trình, + +88 +00:06:01,610 --> 00:06:04,970 +cơ thể rắn của chúng ta sẽ hiện ra, không phải + +89 +00:06:05,060 --> 00:06:08,930 +từng mảnh mà là toàn bộ. Bây giờ, nếu mặt khác, + +90 +00:06:09,020 --> 00:06:14,020 +tôi di chuyển màn hình của chúng tôi. cập nhật dòng mã vào vòng lặp while để khi + +91 +00:06:16,940 --> 00:06:20,600 +mỗi đoạn di chuyển, tôi sẽ thấy màn hình cập nhật, sau đó đây + +92 +00:06:20,930 --> 00:06:22,850 +là những gì bạn sẽ thấy. + +93 +00:06:23,210 --> 00:06:26,840 +Bạn thấy từng mảnh di chuyển dọc theo từng mảnh một. + +94 +00:06:27,290 --> 00:06:29,810 +Bây giờ nó không thực sự rõ ràng những gì đang xảy ra. + +95 +00:06:29,840 --> 00:06:31,730 +Vì vậy, tôi sẽ làm chậm lại một chút. + +96 +00:06:32,210 --> 00:06:35,240 +Và tôi sẽ làm điều này bằng cách nhập mô-đun thời gian. + +97 +00:06:35,690 --> 00:06:40,690 +Bây giờ tôi sẽ thêm thời gian. ngủ đi và tôi sẽ ngủ trong + +98 +00:06:41,900 --> 00:06:42,733 +một giây. + +99 +00:06:42,830 --> 00:06:47,830 +Vì vậy, về cơ bản điều này chỉ thêm độ trễ một giây sau khi mỗi phân đoạn di chuyển. + +100 +00:06:49,280 --> 00:06:52,040 +Vì vậy, mỗi phân đoạn di chuyển, màn hình cập nhật và + +101 +00:06:52,190 --> 00:06:55,670 +sau đó chúng tôi ngủ trong một giây trước khi điều này xảy ra lần tiếp theo. + +102 +00:06:56,240 --> 00:06:58,190 +Hãy chú ý trong trường hợp + +103 +00:06:58,280 --> 00:07:01,280 +này, con rắn của chúng ta đang di chuyển từng mảnh. + +104 +00:07:01,520 --> 00:07:04,730 +Vì vậy, đầu tiên mảnh đầu tiên này, sau đó đến + +105 +00:07:04,760 --> 00:07:08,810 +mảnh thứ hai, mảnh thứ ba với độ trễ một giây giữa mỗi chuyển động. + +106 +00:07:09,440 --> 00:07:09,800 +Bây + +107 +00:07:09,800 --> 00:07:14,800 +giờ, điều gì sẽ xảy ra nếu chúng ta di chuyển màn hình này. cập nhật bên ngoài vòng lặp này? + +108 +00:07:16,490 --> 00:07:18,920 +Vì vậy, về cơ bản, chúng tôi chỉ cập nhật màn + +109 +00:07:19,190 --> 00:07:21,770 +hình khi tất cả các phân đoạn đã chuyển về phía trước. + +110 +00:07:21,950 --> 00:07:26,950 +Bây giờ, hãy chú ý cách con rắn của chúng ta di chuyển về phía trước như một khối hoàn chỉnh. + +111 +00:07:27,590 --> 00:07:32,180 +Nó sẽ chuyển cả ba phân đoạn về phía trước trước khi bản cập nhật được kích hoạt và + +112 +00:07:32,450 --> 00:07:34,160 +chúng tôi làm mới đồ họa. + +113 +00:07:34,370 --> 00:07:38,870 +Vì vậy, nó trông giống như thể toàn bộ con rắn đang di chuyển như một mảnh. Bây giờ, thay vì làm cho nó + +114 +00:07:38,900 --> 00:07:43,580 +chậm lại một giây sau khi mỗi phân đoạn đã di chuyển, nếu tôi chuyển + +115 +00:07:43,880 --> 00:07:45,950 +nó lên đây thì nó sẽ chỉ + +116 +00:07:46,190 --> 00:07:48,950 +bị trễ một giây sau khi cả ba phân + +117 +00:07:49,220 --> 00:07:52,550 +đoạn đã di chuyển. Bằng cách này, con rắn của + +118 +00:07:52,580 --> 00:07:56,990 +chúng ta đang di chuyển nhanh hơn một chút. Và chúng ta vẫn có thể làm cho nó + +119 +00:07:57,050 --> 00:07:59,690 +di chuyển nhanh hơn nếu chúng ta cắt giảm thời gian ngủ. + +120 +00:08:00,080 --> 00:08:02,840 +Vì vậy, hãy thay đổi nó thành 0. Ngủ 1 giây và bạn có + +121 +00:08:03,290 --> 00:08:06,470 +thể thấy con rắn của chúng ta hiện đang di chuyển với tốc độ hợp lý. + +122 +00:08:06,890 --> 00:08:11,270 +Bây giờ bạn có thể nghĩ rằng chúng tôi đã giải quyết được thử thách và bây giờ chúng + +123 +00:08:11,270 --> 00:08:15,800 +tôi đã có con rắn của chúng tôi để tự động di chuyển về phía trước, nhưng có một vấn đề. + +124 +00:08:16,040 --> 00:08:17,780 +Làm thế nào để chúng tôi biến con rắn của chúng tôi? + +125 +00:08:18,170 --> 00:08:22,280 +Hãy xem điều gì sẽ xảy ra nếu chúng ta điều khiển đầu rắn và đổi hướng. + +126 +00:08:22,910 --> 00:08:27,680 +Giả sử rằng tại một thời điểm nào đó, chúng ta muốn quay con rắn để nó rẽ trái. + +127 +00:08:28,280 --> 00:08:29,750 +Chà, điều gì xảy ra sau đó? + +128 +00:08:30,380 --> 00:08:33,409 +Vì vậy, mảnh đầu tiên này đang hướng lên trên, + +129 +00:08:33,770 --> 00:08:38,299 +mảnh thứ hai sẽ tiếp tục di chuyển về phía trước và mảnh thứ ba cũng vậy. + +130 +00:08:39,020 --> 00:08:42,590 +Bây giờ, trong lần lặp tiếp theo của vòng lặp for đó, mảnh + +131 +00:08:43,010 --> 00:08:47,780 +đầu tiên sẽ tiếp tục di chuyển về phía Bắc trong khi quân thứ hai và thứ + +132 +00:08:47,780 --> 00:08:51,950 +ba sẽ tiếp tục di chuyển về phía trước vì chúng sẽ không thay đổi + +133 +00:08:51,950 --> 00:08:53,210 +hướng của chính chúng. + +134 +00:08:53,750 --> 00:08:58,590 +Chúng ta sẽ có hành vi kỳ lạ này vì các đoạn rắn của chúng ta không được liên kết với nhau. Để minh họa điều này, hãy + +135 +00:08:58,590 --> 00:09:03,270 +để tôi tiếp tục và thay đổi phân đoạn đầu tiên, để phân + +136 +00:09:03,270 --> 00:09:08,270 +đoạn ở chỉ số 0 và làm cho nó quay sang trái 90 độ. + +137 +00:09:10,350 --> 00:09:12,180 +Và hãy để ý khi tôi chạy + +138 +00:09:12,570 --> 00:09:16,380 +mã, bạn sẽ thấy cái đầu đó tự di chuyển theo một vòng tròn như + +139 +00:09:16,710 --> 00:09:21,300 +thế nào, và cơ thể đã hoàn toàn rời khỏi đầu và tiếp tục đi về phía trước. + +140 +00:09:21,950 --> 00:09:24,290 +2: Vì vậy, làm thế nào chúng ta có thể giải quyết điều này? Chà, chúng ta phải suy + +141 +00:09:24,380 --> 00:09:29,240 +nghĩ lại cách chúng ta di chuyển các phân đoạn của mình. Một lần nữa, chúng ta có ba phân + +142 +00:09:29,270 --> 00:09:34,040 +đoạn của mình, nhưng nếu thay vì chuyển mọi thứ về phía trước, thì điều gì sẽ + +143 +00:09:34,460 --> 00:09:38,840 +xảy ra nếu chúng ta nhận được phân đoạn cuối cùng, vì vậy phân đoạn_3 + +144 +00:09:38,840 --> 00:09:43,340 +trong trường hợp này, để chuyển đến vị trí của phân đoạn thứ hai đến phân + +145 +00:09:43,760 --> 00:09:48,650 +đoạn cuối cùng và sau đó là phân đoạn thứ hai để chuyển đến vị trí của phân + +146 +00:09:49,040 --> 00:09:53,570 +đoạn đầu tiên và sau đó phân đoạn đầu tiên đi về phía trước thêm 20 bước? + +147 +00:09:53,900 --> 00:09:58,400 +Và nếu chúng ta quay lại tình huống đó mà chúng ta đang cố gắng xoay con rắn của + +148 +00:09:58,880 --> 00:10:02,060 +mình, thì trong phương pháp này, nó vẫn sẽ tiếp tục hoạt động. + +149 +00:10:02,390 --> 00:10:04,970 +Vì vậy, chúng tôi có ba phân đoạn, một, hai và ba. + +150 +00:10:05,480 --> 00:10:08,840 +Đoạn thứ ba của chúng ta đi đến nơi mà đoạn thứ hai đã + +151 +00:10:09,050 --> 00:10:11,300 +từng ở, đoạn thứ hai đi đến nơi + +152 +00:10:11,570 --> 00:10:15,620 +đã từng ở, sau đó đoạn thứ ba sẽ rẽ và sau đó di chuyển sang trái. + +153 +00:10:15,980 --> 00:10:18,710 +Bây giờ, lượt tiếp theo là phần thú vị vì + +154 +00:10:19,070 --> 00:10:21,680 +tại thời điểm này, chúng ta đã thấy làm thế + +155 +00:10:21,770 --> 00:10:24,680 +nào nếu hai mảnh này tiếp tục di chuyển về phía trước, + +156 +00:10:24,980 --> 00:10:28,610 +chúng sẽ di chuyển ra khỏi đầu của con rắn và nó sẽ di chuyển + +157 +00:10:28,610 --> 00:10:31,610 +theo hai hướng ngược nhau. Nhưng bằng cách sử dụng phương pháp này, + +158 +00:10:31,880 --> 00:10:36,110 +phân đoạn thứ ba của chúng ta sẽ di chuyển đến nơi mà phân đoạn thứ hai đã từng ở, phân đoạn thứ hai + +159 +00:10:36,380 --> 00:10:38,750 +đi đến nơi mà phân đoạn đầu tiên đã từng ở đó và phân + +160 +00:10:38,990 --> 00:10:42,560 +đoạn đầu tiên tiếp tục di chuyển về phía trước. Bằng cách này, con + +161 +00:10:42,560 --> 00:10:47,270 +rắn của chúng ta đã thẳng ra khá nhiều như bạn mong đợi + +162 +00:10:47,270 --> 00:10:51,980 +con rắn này sẽ cư xử. Bây giờ, vấn đề thực sự là thực hiện điều này, + +163 +00:10:52,010 --> 00:10:53,090 +đó là phần khó. + +164 +00:10:53,600 --> 00:10:57,500 +Vì vậy, tôi sẽ tiếp tục và xóa phần mà tôi đã yêu + +165 +00:10:58,040 --> 00:11:00,620 +cầu con rắn rẽ trái và tôi sẽ + +166 +00:11:00,650 --> 00:11:05,330 +xóa vòng lặp for này vừa di chuyển mỗi đoạn trong danh sách các đoạn của + +167 +00:11:05,330 --> 00:11:09,980 +chúng ta về phía trước 20 bước. Bây giờ, thay vào đó, những gì tôi sẽ làm + +168 +00:11:10,340 --> 00:11:15,340 +là tạo một vòng lặp for, nhưng lần này tôi sẽ lặp lại từng phân đoạn đi từ phân đoạn + +169 +00:11:15,980 --> 00:11:18,170 +cuối cùng đến phân đoạn đầu tiên, về cơ + +170 +00:11:18,380 --> 00:11:22,040 +bản là ngược lại gọi món. Bây giờ để làm điều này, + +171 +00:11:22,040 --> 00:11:24,710 +tôi sẽ sử dụng kiểu phạm vi của vòng lặp for. + +172 +00:11:24,950 --> 00:11:29,950 +Vì vậy, tôi sẽ nói cho số phân đoạn hoặc seg_num trong phạm + +173 +00:11:31,490 --> 00:11:34,020 +vi và phạm vi này sẽ + +174 +00:11:34,160 --> 00:11:37,580 +có một điểm bắt đầu, một điểm dừng + +175 +00:11:38,150 --> 00:11:40,340 +và cũng là một bước. + +176 +00:11:40,820 --> 00:11:44,420 +Vì vậy, bắt đầu là con số mà chúng ta sẽ bắt đầu phạm vi, + +177 +00:11:44,420 --> 00:11:47,450 +điểm dừng là nơi phạm vi sẽ kết thúc và bước là + +178 +00:11:47,810 --> 00:11:52,370 +cách chúng ta đi từ đầu đến điểm dừng. Ví dụ: nếu chúng ta muốn phạm + +179 +00:11:52,400 --> 00:11:56,710 +vi 1, 2, 3, thì tất nhiên bắt đầu sẽ là 1, dừng sẽ + +180 +00:11:56,920 --> 00:12:01,480 +là 3 và bước sẽ là +1. Tuy nhiên, nếu chúng ta + +181 +00:12:01,480 --> 00:12:05,770 +muốn phạm vi 3, 2, 1, thì điểm bắt + +182 +00:12:05,830 --> 00:12:07,870 +đầu sẽ là 3, + +183 +00:12:08,140 --> 00:12:12,730 +điểm dừng sẽ là 1 và bước sẽ là -1. + +184 +00:12:13,420 --> 00:12:14,230 +Trong trường + +185 +00:12:14,230 --> 00:12:18,640 +hợp của chúng tôi, những gì chúng tôi thực sự muốn thực sự + +186 +00:12:19,120 --> 00:12:21,040 +là đi từ 2, 1, 0. + +187 +00:12:21,550 --> 00:12:26,550 +Vì vậy, điểm bắt đầu sẽ là 2, điểm dừng sẽ là 0 và bước sẽ là -1. + +188 +00:12:28,960 --> 00:12:33,400 +Thật không may, mặc dù chúng ta có các tham số được đặt tên này, bởi + +189 +00:12:33,760 --> 00:12:38,560 +vì hàm range trong Python thực sự là một thứ không phải là Python hoàn toàn thuần + +190 +00:12:38,560 --> 00:12:41,860 +túy, nó là thứ đến từ ngôn ngữ C, nó không + +191 +00:12:42,220 --> 00:12:45,520 +thực sự cho phép chúng ta sử dụng những tên này. + +192 +00:12:45,820 --> 00:12:49,180 +Tôi sẽ chỉ cho bạn khi chúng tôi chạy mã của mình, điều này thực sự sẽ gây ra lỗi cho chúng tôi. + +193 +00:12:49,480 --> 00:12:50,710 +Nhưng hiện tại, thực + +194 +00:12:50,740 --> 00:12:55,240 +sự dễ hình dung điều này hơn nhiều khi chúng ta viết mã bên trong + +195 +00:12:55,240 --> 00:12:57,610 +vòng lặp này. Vì vậy, trong + +196 +00:12:57,640 --> 00:13:02,640 +trường hợp này, số phân đoạn sẽ bằng 2, sau đó là 1, và + +197 +00:13:03,430 --> 00:13:04,870 +cuối cùng là 0. + +198 +00:13:05,440 --> 00:13:10,440 +Bây giờ chúng ta sẽ sử dụng nó để nắm giữ phân đoạn cuối cùng từ danh sách các phân đoạn + +199 +00:13:11,620 --> 00:13:12,453 +của chúng tôi. + +200 +00:13:12,580 --> 00:13:16,720 +Vì vậy, chúng tôi có thể khai thác danh sách đó và sau đó nắm giữ danh sách cuối + +201 +00:13:16,990 --> 00:13:18,580 +cùng bằng cách sử dụng seg_num đó. + +202 +00:13:19,060 --> 00:13:23,860 +Và sau đó chúng tôi sẽ thiết lập nó chuyển đến một vị trí X và Y cụ thể. + +203 +00:13:24,380 --> 00:13:29,380 +Bây giờ, vị trí X và Y mà chúng ta muốn nó chuyển đến sẽ là vị trí thứ hai đến + +204 +00:13:30,370 --> 00:13:32,200 +vị trí cuối cùng của phân khúc. + +205 +00:13:32,680 --> 00:13:35,800 +Vì vậy, làm thế nào chúng ta có thể nắm giữ phân đoạn thứ hai đến cuối cùng? Chà, chúng ta + +206 +00:13:36,040 --> 00:13:40,720 +sẽ nắm giữ các phân đoạn và sau đó chuyển vào seg_num + +207 +00:13:40,720 --> 00:13:44,230 +nhưng sau đó là -1. Vì vậy, khi chúng tôi mới bắt đầu, chúng tôi bắt đầu với 2. + +208 +00:13:44,530 --> 00:13:49,120 +Vì vậy, phân đoạn ở vị trí thứ hai sẽ là phân đoạn cuối cùng. + +209 +00:13:49,480 --> 00:13:54,400 +Và sau đó phân đoạn 2 - 1 sẽ là phân đoạn thứ hai đến phân đoạn cuối cùng. + +210 +00:13:54,850 --> 00:13:58,450 +Bây giờ cái này chúng ta sẽ nắm được tọa độ + +211 +00:13:59,050 --> 00:14:03,250 +X của nó và chúng ta sẽ đặt nó thành một biến có + +212 +00:14:03,760 --> 00:14:08,760 +tên là new_x, và sau đó chúng ta sẽ làm như vậy và nắm giữ new_y. + +213 +00:14:09,820 --> 00:14:13,660 +Vì vậy, chúng ta sẽ nắm giữ tọa độ Y của phân đoạn thứ hai + +214 +00:14:14,020 --> 00:14:19,020 +đến cuối cùng và sau đó chúng ta sẽ sử dụng các tọa độ này, new_x và new_y để yêu cầu + +215 +00:14:19,600 --> 00:14:24,040 +phân đoạn cuối cùng này chuyển đến vị trí của phân đoạn thứ hai đến phân đoạn cuối cùng. + +216 +00:14:24,790 --> 00:14:26,260 +Bây giờ, như tôi + +217 +00:14:26,650 --> 00:14:30,790 +đã đề cập trước đây, hàm phạm vi này đến từ ngôn ngữ C. + +218 +00:14:31,060 --> 00:14:34,330 +Vì vậy, nếu chúng ta chạy nó với các đối số từ khóa + +219 +00:14:34,630 --> 00:14:36,430 +này, nó thực sự sẽ gây ra + +220 +00:14:36,550 --> 00:14:40,840 +lỗi và nó cho chúng ta biết rằng hàm phạm vi này không có đối số từ khóa. + +221 +00:14:41,260 --> 00:14:44,410 +Vì vậy, mặc dù rất hay khi sử dụng nó để hình dung nó, + +222 +00:14:44,440 --> 00:14:48,040 +nhưng nếu chúng ta thực sự muốn nó hoạt động, chúng ta phải xóa chúng đi. + +223 +00:14:48,220 --> 00:14:50,200 +Nhưng ngay trước khi tôi xóa nó, + +224 +00:14:50,470 --> 00:14:55,190 +tôi muốn điều này để chúng tôi không còn sử dụng những con số được mã hóa cứng này nữa. + +225 +00:14:55,310 --> 00:14:57,560 +Vì vậy, thay vì đi từ + +226 +00:14:57,980 --> 00:15:02,570 +2 đến 0, chúng ta muốn đi đến độ dài của các đoạn. + +227 +00:15:02,600 --> 00:15:06,410 +Vì vậy, trong tương lai, nếu chúng tôi có 10 phân đoạn hoặc 20 phân đoạn, mã của chúng + +228 +00:15:06,620 --> 00:15:08,660 +tôi sẽ vẫn hoạt động. Bây giờ, + +229 +00:15:08,660 --> 00:15:11,750 +độ dài của phân đoạn thực sự là ba. + +230 +00:15:12,170 --> 00:15:15,800 +Và chúng tôi biết rằng danh sách bắt đầu đếm từ + +231 +00:15:15,800 --> 00:15:20,800 +0, vì vậy 0, 1, 2, ... vị trí cuối cùng sẽ là độ dài + +232 +00:15:21,440 --> 00:15:25,190 +- 1, và sau đó chúng ta sẽ dừng lại ở đoạn số không. + +233 +00:15:25,760 --> 00:15:30,560 +Vì vậy, bây giờ chúng ta có thể tiếp tục và xóa các đối số được đặt tên này. + +234 +00:15:33,260 --> 00:15:37,640 +Và chúng tôi kết thúc với điều này. Bây giờ chúng tôi có thể chạy mã của mình và chúng tôi sẽ không gặp bất kỳ lỗi nào. + +235 +00:15:38,600 --> 00:15:43,040 +Lưu ý cách cả ba phân đoạn đã đi đến cùng một vị trí, + +236 +00:15:43,580 --> 00:15:48,560 +vị trí của phân đoạn đầu tiên. Vì vậy, ngoài việc di chuyển các phân + +237 +00:15:48,590 --> 00:15:53,590 +đoạn này, hãy nhớ rằng chúng ta cũng phải di chuyển phân đoạn đầu tiên thực sự + +238 +00:15:55,940 --> 00:16:00,380 +về phía trước, ví dụ: 20 bước. Vì vậy, ở phần cuối của tất cả mã + +239 +00:16:00,560 --> 00:16:01,910 +này bên ngoài vòng lặp + +240 +00:16:02,180 --> 00:16:06,890 +bốn, chúng ta sẽ nắm giữ phân đoạn đầu tiên, vì vậy phân đoạn ở vị trí 0, và sau + +241 +00:16:07,280 --> 00:16:10,700 +đó chúng ta sẽ làm cho nó di chuyển về phía trước thêm 20 bước. + +242 +00:16:11,420 --> 00:16:12,980 +Vì vậy, bây giờ khi tôi + +243 +00:16:13,010 --> 00:16:17,810 +chạy lại điều này, bạn có thể thấy con rắn của chúng ta hiện đang di chuyển tự do về phía + +244 +00:16:17,840 --> 00:16:20,120 +trước và ngay cả khi tại một thời điểm nào + +245 +00:16:20,450 --> 00:16:23,150 +đó, con rắn cần quay lại, giả sử nó quay sang trái + +246 +00:16:23,540 --> 00:16:25,880 +90 độ, thì mã của chúng ta vẫn hoạt động. + +247 +00:16:25,970 --> 00:16:30,320 +Hãy chú ý xem con rắn của chúng ta đang quay như thế nào trong một vòng tròn và tất cả các mảnh tiếp + +248 +00:16:30,320 --> 00:16:34,400 +theo đều đi theo đầu dọc theo đường đi của nó. Đó là nó. + +249 +00:16:34,670 --> 00:16:39,670 +Đây là mã sẽ khiến con rắn của chúng ta tự động di chuyển về phía trước. + +250 +00:16:40,850 --> 00:16:43,970 +Bây giờ, có khá nhiều khái niệm được đề cập ở đây + +251 +00:16:44,480 --> 00:16:49,480 +và bạn phải suy nghĩ về các phân đoạn về cách chúng di chuyển trong biểu đồ và ý tưởng + +252 +00:16:50,720 --> 00:16:55,610 +này là nắm giữ phân đoạn cuối cùng và sau đó yêu cầu nó chuyển đến vị trí của phân + +253 +00:16:55,610 --> 00:17:00,380 +đoạn thứ hai đến phân đoạn cuối cùng và sau đó thực hiện việc này cho tất cả các + +254 +00:17:00,380 --> 00:17:01,213 +phân đoạn. + +255 +00:17:01,370 --> 00:17:05,720 +Vì vậy, đó là một chút suy nghĩ và có thể đáng giá chỉ cần xem lại + +256 +00:17:05,720 --> 00:17:10,550 +đoạn mã này và quay lại video nơi tôi giải thích cách điều này hoạt động trong các trang + +257 +00:17:10,550 --> 00:17:14,329 +trình bày, để bạn thực sự rõ ràng về cách hoạt động của nó. + +258 +00:17:14,720 --> 00:17:18,890 +Khi bạn đã có, sau đó bạn có thể tiếp tục và chuyển sang bài học tiếp theo. + diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 The-tracer-method.url b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 The-tracer-method.url new file mode 100644 index 0000000000000000000000000000000000000000..de631f4453bb054885bfa11da84ebc3105e22c78 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/003 The-tracer-method.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3.3/library/turtle.html?highlight=turtle#turtle.tracer \ No newline at end of file diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/004 Create a Snake Class & Move to OOP.mp4 b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/004 Create a Snake Class & Move to OOP.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2bb11dcea5031cdf44bb9be6ebf90f06f3eae635 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/004 Create a Snake Class & Move to OOP.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a572b6226fb0e8c40181e6a5c79786aefbf1cd1c28f17daa51297931043de6e1 +size 40827169 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/004 Create a Snake Class & Move to OOP_vi.srt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/004 Create a Snake Class & Move to OOP_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d07215c5a3ca6995beb04ba7a6175b14c8369922 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/004 Create a Snake Class & Move to OOP_vi.srt @@ -0,0 +1,432 @@ +1 +00:00:00,150 --> 00:00:00,750 +Cho đến + +2 +00:00:00,750 --> 00:00:05,750 +nay, chúng tôi đã cố gắng đưa các phân đoạn bắt đầu cho con rắn của chúng tôi xuất hiện trên màn ảnh. + +3 +00:00:06,630 --> 00:00:11,630 +Và sau đó, chúng tôi cố gắng làm cho con rắn của chúng tôi tự động di chuyển + +4 +00:00:12,930 --> 00:00:17,930 +về phía trước và tìm ra cách để đuôi của con rắn đi theo nơi đầu đang đi. + +5 +00:00:18,750 --> 00:00:23,750 +Bây giờ đã đến lúc thu gọn mã của chúng ta một chút để tất cả + +6 +00:00:24,390 --> 00:00:29,390 +các phần liên quan đến hành vi của rắn và ngoại hình của rắn được chuyển + +7 +00:00:30,090 --> 00:00:33,300 +thành một lớp riêng biệt. Vì vậy, đến cuối toàn + +8 +00:00:33,330 --> 00:00:37,410 +bộ dự án, chúng ta sẽ kết thúc với ba lớp; một lớp rắn, một + +9 +00:00:37,500 --> 00:00:41,130 +lớp thức ăn và một bảng điểm. Và tất cả các lớp này sẽ nằm trong các + +10 +00:00:41,370 --> 00:00:43,170 +tệp riêng biệt, chỉ quản lý một thứ. + +11 +00:00:43,650 --> 00:00:48,150 +Và mục tiêu của việc tái cấu trúc là để bạn có + +12 +00:00:48,150 --> 00:00:52,860 +thể tạo một tệp riêng biệt. py, nhập lớp rắn mà bạn đã tạo trong tệp đó. + +13 +00:00:53,430 --> 00:00:55,500 +Và sau đó khi bạn khởi tạo + +14 +00:00:55,560 --> 00:01:00,330 +con rắn này, nó sẽ thực hiện mọi thứ mà chúng ta có cho đến nay và tạo con + +15 +00:01:00,600 --> 00:01:04,890 +rắn ba đoạn của chúng ta trên màn hình. Và cuối cùng, trong khi vòng lặp trò chơi + +16 +00:01:05,129 --> 00:01:10,110 +đang chạy, chúng ta sẽ làm cho con rắn liên tục di chuyển về phía trước chỉ bằng cách gọi con rắn. di chuyển. Đây là những gì bạn đang hướng tới. + +17 +00:01:10,140 --> 00:01:13,140 +Hãy suy nghĩ về cách + +18 +00:01:14,310 --> 00:01:17,910 +bạn có thể lấy mã hiện có mà bạn đã có trong mã chính. py và trích xuất tất cả các chức năng liên quan đến con rắn thành một lớp + +19 +00:01:17,910 --> 00:01:22,910 +con rắn riêng biệt và tạo thành phần chính của bạn. py cuối cùng trông như thế này. + +20 +00:01:23,610 --> 00:01:28,230 +Chương trình sẽ thực hiện những điều tương tự như trước đây. + +21 +00:01:28,740 --> 00:01:31,860 +Sự khác biệt duy nhất là cách mã được tổ chức. Hãy suy nghĩ về điều này. + +22 +00:01:32,160 --> 00:01:36,450 +Có thể bạn cần ôn lại một số điều + +23 +00:01:36,660 --> 00:01:39,810 +đã học về cách tạo lớp, cách tạo đối tượng từ các bài trước. + +24 +00:01:39,810 --> 00:01:43,860 +Tuy nhiên, hãy tạm dừng video, tôi muốn các bạn thử kỹ phần + +25 +00:01:44,010 --> 00:01:45,060 +này trước + +26 +00:01:45,330 --> 00:01:49,230 +khi quay lại khi chúng ta cùng nhau xem xét giải pháp. + +27 +00:01:49,230 --> 00:01:50,250 +1: Được rồi. + +28 +00:01:53,960 --> 00:01:54,380 +0: Vì + +29 +00:01:54,380 --> 00:01:57,020 +vậy, điều đầu tiên chúng ta cần làm tất nhiên là tạo lớp con rắn của chúng ta. Và hãy nhớ rằng trong Python, tên lớp ở trong Pascal, + +30 +00:01:57,050 --> 00:02:02,050 +vì vậy chữ cái đầu tiên cần được viết hoa. + +31 +00:02:03,350 --> 00:02:06,470 +Và sau đó bên trong lớp này, tôi sẽ tạo init của mình. + +32 +00:02:07,070 --> 00:02:10,280 +Bây giờ đoạn mã ở đây sẽ xác định + +33 +00:02:11,000 --> 00:02:15,590 +điều gì sẽ xảy ra khi chúng ta khởi tạo một đối tượng rắn mới. Vì vậy, trước tiên, tôi sẽ đảm nhận các vị trí bắt đầu và giao nó + +34 +00:02:15,620 --> 00:02:19,250 +cho con rắn của chúng tôi. py + +35 +00:02:19,310 --> 00:02:24,310 +Bây giờ, tôi thực sự sẽ đặt điều này như một hằng số. Vì vậy, ngay ở trên cùng, và hãy nhớ rằng + +36 +00:02:25,460 --> 00:02:29,960 +trong Python, các hằng được đặt tên bằng tất + +37 +00:02:30,350 --> 00:02:32,150 +cả các chữ hoa như thế + +38 +00:02:32,480 --> 00:02:36,380 +này, và cả với chữ hoa chữ thường với dấu gạch dưới phân tách từng từ. + +39 +00:02:36,530 --> 00:02:40,550 +Bây giờ chúng ta có thể sử dụng các vị trí bắt đầu + +40 +00:02:41,000 --> 00:02:46,000 +này bên trong lớp con rắn của chúng ta để tạo con rắn mới của chúng ta. Vì vậy, chúng tôi cũng sẽ cần chuyển các phân đoạn của mình. + +41 +00:02:47,430 --> 00:02:51,410 +Vì vậy, hãy tạo một thuộc tính + +42 +00:02:51,830 --> 00:02:55,850 +mới được liên kết với lớp con rắn của chúng ta được gọi là phân đoạn. Và hãy nhớ rằng, chúng ta sẽ cần phải sử dụng bản thân khi chúng ta làm việc + +43 +00:02:55,850 --> 00:02:57,650 +trong một lớp học. + +44 +00:02:57,650 --> 00:03:01,120 +Sau đó, chúng ta sẽ tạo ra con rắn của mình. + +45 +00:03:02,020 --> 00:03:05,290 +Vì vậy, tôi sẽ tạo một phương thức có tên là create_snake ở đây. + +46 +00:03:05,620 --> 00:03:10,210 +Và phương pháp này sẽ thực hiện mọi thứ mà trước đây chúng + +47 +00:03:13,350 --> 00:03:18,350 +ta đã làm ở đây, nhưng chúng ta sẽ chuyển điều đó vào phương pháp này. + +48 +00:03:19,680 --> 00:03:22,320 +Bây giờ có một số điều chúng ta cần thay đổi. Đầu tiên, chúng tôi thay đổi các vị trí bắt + +49 +00:03:22,740 --> 00:03:25,230 +đầu này thành một + +50 +00:03:25,230 --> 00:03:28,260 +hằng số, vì vậy hãy làm cho điều đó nhất quán. + +51 +00:03:28,560 --> 00:03:30,270 +Điều thứ hai là chúng ta + +52 +00:03:30,750 --> 00:03:35,700 +cần nhập rùa vào tệp này từ mô-đun rùa để sử dụng nó để tạo một phân đoạn mới. + +53 +00:03:35,700 --> 00:03:39,720 +Và cuối cùng, để đề cập đến các phân + +54 +00:03:40,350 --> 00:03:44,640 +đoạn thuộc tính của chúng ta, chúng ta phải tự nói. phân đoạn và sau đó nối phân đoạn mới này vào + +55 +00:03:44,730 --> 00:03:49,730 +phân đoạn rắn của chúng tôi. Vậy là xong phần này. + +56 +00:03:51,030 --> 00:03:53,610 +Điều tiếp theo chúng + +57 +00:03:53,910 --> 00:03:58,910 +ta cần làm là loại bỏ đoạn mã này và di chuyển nó vào bên trong con rắn. Vì vậy, một lần nữa, tôi sẽ tạo một phương thức + +58 +00:04:00,480 --> 00:04:02,010 +khác + +59 +00:04:02,040 --> 00:04:06,780 +được liên kết với lớp con rắn có tên là move. Vì vậy, khi con rắn di chuyển, nó sẽ xem xét mã này để tìm ra cách + +60 +00:04:06,810 --> 00:04:09,600 +nó nên làm điều đó. Một lần nữa, bởi vì chúng ta + +61 +00:04:09,660 --> 00:04:14,660 +đang ở trong lớp của mình, nó không còn chỉ là các phân đoạn nữa. + +62 +00:04:15,090 --> 00:04:18,510 +Bây giờ là tự. các phân đoạn. + +63 +00:04:18,779 --> 00:04:21,029 +Vì vậy, chúng ta hãy tiếp tục + +64 +00:04:21,510 --> 00:04:25,500 +và thay thế nó ở tất cả những nơi chúng ta có gạch dưới màu đỏ và bây giờ đó là khá nhiều cho lớp rắn của chúng ta. + +65 +00:04:25,530 --> 00:04:29,220 +Chúng ta có thể tạo một đối tượng con rắn mới và + +66 +00:04:29,520 --> 00:04:33,780 +mỗi lần chúng ta làm điều đó, nó sẽ tạo ra một con rắn + +67 +00:04:33,930 --> 00:04:38,930 +ba đoạn bằng cách sử dụng các vị trí bắt đầu được khai báo ở trên cùng. Vì vậy, nếu chúng ta muốn con rắn hiển thị trên màn hình, thì trước tiên chúng ta + +68 +00:04:39,600 --> 00:04:44,490 +sẽ phải nhập lớp rắn từ tệp rắn, + +69 +00:04:44,760 --> 00:04:49,260 +và sau đó chúng ta sẽ tạo một đối tượng rắn mới từ lớp đó. + +70 +00:04:49,800 --> 00:04:54,800 +Và khi dòng này được kích hoạt, thì chúng ta sẽ gọi create_snake và con rắn ba + +71 +00:04:55,830 --> 00:05:00,060 +đoạn của chúng ta sẽ hiển thị trên màn hình như thế này. + +72 +00:05:00,060 --> 00:05:04,800 +Bây giờ, bước tiếp theo là khi trò chơi đang bật, màn + +73 +00:05:05,610 --> 00:05:08,490 +hình sẽ cập nhật mỗi 0. 1 giây. + +74 +00:05:08,670 --> 00:05:12,780 +Vì vậy, về cơ bản đó là những gì điều này đang làm. + +75 +00:05:13,080 --> 00:05:15,000 +Nó nói rằng sự chậm trễ cho 0. 1 giây và sau đó làm mới màn hình. + +76 +00:05:15,030 --> 00:05:19,620 +Và mỗi khi màn hình làm mới, chúng ta sẽ làm + +77 +00:05:20,250 --> 00:05:22,530 +cho con rắn di chuyển về phía trước một bước. + +78 +00:05:22,770 --> 00:05:26,640 +Hiện tại, mỗi bước được xác định ở đây là 20. + +79 +00:05:27,120 --> 00:05:31,410 +Vì vậy, một lần nữa, tôi muốn trích xuất nó thành một hằng số ở đây, vì vậy + +80 +00:05:31,830 --> 00:05:36,270 +chúng ta sẽ gọi nó là MOVE_DISTANCE và chúng ta có thể đặt nó thành 20 và sau đó + +81 +00:05:36,630 --> 00:05:39,450 +thay đổi điều này để sử dụng hằng số ở đây. + +82 +00:05:40,950 --> 00:05:45,950 +Và lý do tại sao chúng ta có tất cả các hằng số này là vì nếu chúng ta muốn điều chỉnh trò + +83 +00:05:47,430 --> 00:05:51,600 +chơi của mình, hãy nói nếu chúng ta muốn con rắn bắt đầu ở một vị trí khác + +84 +00:05:51,600 --> 00:05:52,240 +hoặc để + +85 +00:05:52,240 --> 00:05:56,940 +nó di chuyển xa hơn mỗi lần, thì chúng ta không cần phải đào phần thân của mã của chúng tôi. + +86 +00:05:56,990 --> 00:06:01,250 +Tất cả những gì chúng ta phải làm là nhìn từ trên xuống, nhìn vào tất cả những thứ mà chúng ta có thể thay + +87 +00:06:01,430 --> 00:06:03,290 +đổi và sau đó thay đổi nó cho phù hợp. + +88 +00:06:03,320 --> 00:06:06,680 +Vì vậy, bây giờ quay trở lại mã của chúng ta ở đây, tất cả + +89 +00:06:07,160 --> 00:06:10,100 +những gì chúng ta thực sự có ở đây chỉ là vài dòng + +90 +00:06:10,490 --> 00:06:15,490 +mã này và mọi thứ liên quan đến rắn, tạo ra con rắn hoặc di chuyển con rắn bây giờ được trừu tượng + +91 +00:06:15,830 --> 00:06:17,360 +hóa thành lớp riêng của nó. + +92 +00:06:17,390 --> 00:06:22,390 +Bằng cách này, khi có sự cố xảy ra với con rắn của chúng tôi, chúng tôi + +93 +00:06:24,350 --> 00:06:26,690 +biết ai là người chịu trách nhiệm + +94 +00:06:26,780 --> 00:06:30,470 +và tập tin nào cần tìm hiểu để tìm ra lý do. Bây giờ, tại thời điểm này, nếu chúng tôi tiếp tục và chạy lại mã của mình, + +95 +00:06:30,470 --> 00:06:33,380 +bạn có thể thấy rằng chương + +96 +00:06:33,380 --> 00:06:35,900 +trình của chúng tôi hoạt động giống hệt như trước đây. + +97 +00:06:36,260 --> 00:06:39,710 +Không có gì đáng ra phải thay đổi và không có gì đáng ra phải hỏng + +98 +00:06:39,740 --> 00:06:43,820 +bởi vì trò chơi của chúng ta vẫn chưa thể đi vào trò chơi theo trình tự, không có + +99 +00:06:43,820 --> 00:06:46,550 +cách nào để ngăn con rắn ngoài việc nhấn nút dừng. + +100 +00:06:46,760 --> 00:06:50,150 +Vì vậy, đừng lo lắng nếu ở giai đoạn này, bên trong bảng + +101 +00:06:50,450 --> 00:06:53,420 +điều khiển của bạn, bạn thấy nhiều màu đỏ và nó + +102 +00:06:53,450 --> 00:06:57,020 +cho biết những thứ như bàn phím bị gián đoạn hoặc theo dõi lỗi. Tất cả những điều này đều bình thường. + +103 +00:06:57,020 --> 00:07:00,050 +Điều mà bạn quan tâm hơn cả + +104 +00:07:00,380 --> 00:07:04,520 +là liệu khi bạn chạy trò chơi, liệu nó có thực sự hoạt động như trước đây hay không, cụ thể + +105 +00:07:04,700 --> 00:07:07,430 +là con rắn của bạn có di chuyển trên màn hình hay không. + +106 +00:07:07,460 --> 00:07:10,220 +Nếu nó làm chính xác những gì nó đã từng sử dụng và chính của bạn. py giờ đây đã đơn giản hơn nhiều và tất cả các + +107 +00:07:10,760 --> 00:07:15,760 +chức năng, hành vi và diện mạo con rắn của + +108 +00:07:17,180 --> 00:07:22,040 +bạn hiện nằm trong lớp riêng của nó, thì bạn đã đạt được thành công mục tiêu của bài học này. + diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 Course-Fixes-Report-an-Issue.url b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 How to Control the Snake with a Keypress.mp4 b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 How to Control the Snake with a Keypress.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e089c0bf8ab49470fed866d3694dec72361aa280 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 How to Control the Snake with a Keypress.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b749de74bd193d00edf04a8f0fef4603f8434ac1dd4498257832d5edf52b107e +size 63023299 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 How to Control the Snake with a Keypress_vi.srt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 How to Control the Snake with a Keypress_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f651916856c7eedcb6abf0074072acb7d2eff0b5 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 How to Control the Snake with a Keypress_vi.srt @@ -0,0 +1,648 @@ +1 +00:00:00,240 --> 00:00:03,750 +Vì vậy, bây giờ chúng tôi đã quản lý để tạo ra một cơ thể rắn, di chuyển + +2 +00:00:03,810 --> 00:00:08,810 +con rắn và thậm chí chúng tôi đã quản lý để đặt mã liên quan đến con rắn của chúng tôi vào một lớp riêng biệt. + +3 +00:00:10,410 --> 00:00:14,940 +Bây giờ, bước tiếp theo là tìm ra cách điều khiển con rắn. + +4 +00:00:15,600 --> 00:00:20,600 +Bây giờ chúng ta sẽ điều khiển con rắn bằng cách sử dụng các phím mũi tên lên, xuống, + +5 +00:00:21,810 --> 00:00:22,643 +trái và phải. + +6 +00:00:22,920 --> 00:00:27,150 +Và chúng ta sẽ sử dụng các ràng buộc chính mà chúng ta đã học được trong các bài học ngày hôm qua để + +7 +00:00:27,150 --> 00:00:32,150 +có thể chuyển điều này thành sự thay đổi hướng của con rắn. Trong mã của chúng tôi ngay + +8 +00:00:33,600 --> 00:00:36,780 +sau khi chúng tôi tạo con rắn của mình, + +9 +00:00:37,140 --> 00:00:42,140 +chúng tôi sẽ gọi màn hình. phương pháp nghe để bắt đầu nghe cho các tổ + +10 +00:00:42,450 --> 00:00:43,283 +hợp phím. + +11 +00:00:43,740 --> 00:00:48,740 +Và các tổ hợp phím mà chúng ta sẽ lắng nghe là các phím mũi + +12 +00:00:50,010 --> 00:00:54,510 +tên lên, xuống, trái và phải. Bây giờ các khóa đó được mô tả bằng một chuỗi. + +13 +00:00:54,810 --> 00:00:59,370 +Vì vậy, nó là một chữ hoa 'U' và sau đó là một 'p', vì vậy điều này sẽ là. + +14 +00:00:59,760 --> 00:01:03,750 +Và sau đó lại là chữ hoa + +15 +00:01:04,319 --> 00:01:06,810 +'Xuống', 'Trái' và 'Phải'. + +16 +00:01:07,320 --> 00:01:11,340 +Đây là các phím mà nó sẽ phát hiện, rõ ràng là các phím mũi tên + +17 +00:01:11,340 --> 00:01:13,710 +lên, xuống, trái và phải trên bàn phím. + +18 +00:01:14,400 --> 00:01:19,110 +Hàm mà bạn sẽ liên kết với nó sẽ là một hàm trong đối tượng rắn + +19 +00:01:19,110 --> 00:01:23,490 +và nó sẽ có cùng tên. Ví dụ, nó sẽ là con + +20 +00:01:23,490 --> 00:01:25,230 +rắn. và điều + +21 +00:01:25,320 --> 00:01:29,100 +đó sẽ được kích hoạt khi nhấn phím lên. + +22 +00:01:29,550 --> 00:01:34,470 +Và điều tương tự cũng xảy ra với rắn. xuống khi phím xuống được nhấn + +23 +00:01:34,470 --> 00:01:37,530 +và sau đó nhấn lại với trái và phải. + +24 +00:01:38,130 --> 00:01:43,130 +Công việc của bạn là suy nghĩ về cách bạn có thể tạo các phương thức + +25 +00:01:44,160 --> 00:01:46,920 +này lên, xuống, trái và phải, trong lớp + +26 +00:01:47,370 --> 00:01:51,930 +con rắn để khi phím lên hoặc phím xuống được phát hiện, bạn có thể + +27 +00:01:52,260 --> 00:01:56,820 +di chuyển con rắn và thay đổi tiêu đề của nó cho phù hợp. . + +28 +00:01:57,240 --> 00:02:02,240 +Vì vậy, hãy nhớ rằng hướng lên sẽ là hướng Bắc, xuống sẽ là hướng Nam, trái sẽ + +29 +00:02:03,510 --> 00:02:07,560 +hướng về bên trái của màn hình và phải sẽ hướng về bên phải + +30 +00:02:07,560 --> 00:02:08,430 +của màn hình. + +31 +00:02:08,820 --> 00:02:13,590 +Vì vậy, hãy suy nghĩ về các tiêu đề mà chúng ta đã nói trong các bài học trước. + +32 +00:02:14,070 --> 00:02:18,090 +Và nếu bạn cần, bạn chỉ cần thiết lập một dự án hoàn toàn + +33 +00:02:18,390 --> 00:02:23,070 +mới, bắt một con rùa khởi động và sau đó thiết lập nó đang đi từ 0 + +34 +00:02:23,070 --> 00:02:27,120 +đến 360, chỉ để xem nó thực sự đang phải đối mặt với hướng nào. + +35 +00:02:27,510 --> 00:02:29,250 +Nếu bạn đã hoàn thành thử + +36 +00:02:29,280 --> 00:02:31,410 +thách, bạn sẽ có thể điều khiển con rắn + +37 +00:02:31,680 --> 00:02:34,410 +và mặc dù nó sẽ tiếp tục di chuyển về phía + +38 +00:02:34,650 --> 00:02:39,450 +trước, nhưng bây giờ bạn xác định hướng nó di chuyển bằng cách sử dụng các phím mũi tên. + +39 +00:02:40,080 --> 00:02:43,320 +Hãy tạm dừng video ngay bây giờ và xem bạn có thể hoàn thành thử thách này không. + +40 +00:02:46,140 --> 00:02:49,860 +Được rồi. Vì vậy, tôi đã tạo tất cả + +41 +00:02:49,890 --> 00:02:53,130 +các dòng mã này sẽ giúp màn hình lắng nghe các phím bấm này. + +42 +00:02:53,580 --> 00:02:55,020 +Và sau đó khi phát + +43 +00:02:55,050 --> 00:02:58,350 +hiện ra nó, nó sẽ gọi các phương thức này trong lớp solid. + +44 +00:02:58,710 --> 00:03:02,350 +Vì vậy, bên trong lớp rắn của chúng ta, hãy tiếp tục và tạo các phương thức đó. + +45 +00:03:02,470 --> 00:03:03,570 +Vì vậy, chúng + +46 +00:03:05,820 --> 00:03:06,690 +tôi đã + +47 +00:03:08,910 --> 00:03:10,410 +lên, xuống, trái và phải. + +48 +00:03:10,890 --> 00:03:15,890 +Chúng ta hãy nghĩ về cách chúng ta có thể biến con rắn lên. Để hóa rắn, phân đoạn mà + +49 +00:03:17,160 --> 00:03:20,820 +chúng tôi quan tâm nhất là phân đoạn đầu tiên. + +50 +00:03:20,850 --> 00:03:22,740 +Về cơ bản đó là đầu của con rắn. + +51 +00:03:23,040 --> 00:03:28,040 +Vì vậy, chúng tôi có thể khai thác vào bản thân. phân đoạn và sau đó nắm giữ phân đoạn thứ 0, là + +52 +00:03:29,070 --> 00:03:33,150 +phân đoạn đầu tiên, và sau đó thay đổi tiêu đề của nó bằng cách gọi tiêu đề định hướng. + +53 +00:03:33,810 --> 00:03:36,900 +Và sau đó chúng ta có thể nói với nó, ví dụ, + +54 +00:03:36,930 --> 00:03:40,950 +nếu nó đang ở trên, thì nó thực sự sẽ quay sang hướng 90 độ, + +55 +00:03:40,980 --> 00:03:42,540 +thực ra là hướng Bắc. + +56 +00:03:43,230 --> 00:03:48,230 +Bây giờ tôi sẽ tiếp tục và đặt pass cho tất cả các phương thức khác này, để chúng tôi thực sự + +57 +00:03:49,110 --> 00:03:53,190 +có thể kiểm tra mã của mình và nó không cung cấp cho chúng tôi bất kỳ + +58 +00:03:53,490 --> 00:03:58,020 +lỗi nào vì các hàm này hiện đang trống. Bây giờ, nếu bạn không có pass, + +59 +00:03:58,140 --> 00:04:02,280 +nó sẽ không thích vì Python không thích ý tưởng về các hàm rỗng. + +60 +00:04:02,760 --> 00:04:05,970 +Nhưng bây giờ ít nhất chúng ta có thể kiểm tra một điều này. + +61 +00:04:06,600 --> 00:04:08,040 +Vì vậy, khi chúng tôi chạy + +62 +00:04:08,070 --> 00:04:12,570 +mã của mình, chúng tôi sẽ có thể nhấn phím lên và bạn có thể thấy con rắn đã đổi hướng. + +63 +00:04:12,960 --> 00:04:13,950 +Hãy để tôi chỉ làm điều đó một lần nữa. + +64 +00:04:14,520 --> 00:04:18,209 +Và điều này là do chúng tôi đã cố gắng lấy phân đoạn đầu + +65 +00:04:18,240 --> 00:04:20,190 +tiên, đầu của con rắn, để thay + +66 +00:04:20,190 --> 00:04:25,020 +đổi nó hướng sang 90 độ và sau đó phần còn lại của cơ thể sẽ quay theo vì + +67 +00:04:25,020 --> 00:04:28,110 +nó liên tục di chuyển theo từng tích tắc của đồng hồ. + +68 +00:04:28,710 --> 00:04:32,550 +Vì vậy, bằng cách sử dụng này, bây giờ chúng ta có thể thiết lập phần còn lại của các phương thức. + +69 +00:04:32,910 --> 00:04:36,660 +Nhưng vì chúng ta sẽ cần đầu của con rắn khá nhiều + +70 +00:04:36,660 --> 00:04:41,610 +lần trong mã của mình, nên việc tạo một thuộc tính riêng biệt có thể có ý nghĩa. + +71 +00:04:42,060 --> 00:04:46,980 +Vì vậy, sau khi chúng ta đã tạo con rắn, sau khi chúng ta có một số phân đoạn trong danh sách này, + +72 +00:04:47,310 --> 00:04:49,500 +chúng ta có thể tạo một thuộc tính gọi là + +73 +00:04:49,590 --> 00:04:51,180 +head, sẽ là đầu của con rắn. + +74 +00:04:51,540 --> 00:04:56,160 +Và điều này có thể được bình đẳng với bản thân. phân đoạn ở chỉ số không. Bây giờ, hãy nhớ nếu + +75 +00:04:56,160 --> 00:04:59,430 +bạn có dòng mã này phía trên create_snake, nó có thể sẽ + +76 +00:04:59,460 --> 00:05:03,990 +xảy ra lỗi vì tại thời điểm này, các phân đoạn đang trống và nếu bạn cố + +77 +00:05:04,350 --> 00:05:08,160 +gắng lấy mục đầu tiên từ nó, nó sẽ không cho phép bạn làm vậy. + +78 +00:05:08,610 --> 00:05:13,440 +Vì vậy, hãy nhìn vào vị trí của mã ở đây. Bây giờ, khi chúng ta đã có bộ này, chúng + +79 +00:05:13,500 --> 00:05:16,500 +ta có thể xuống đây và thay đổi mọi nơi chúng ta cần + +80 +00:05:16,500 --> 00:05:19,590 +sử dụng đầu của con rắn. Vì vậy, ví dụ, + +81 +00:05:19,830 --> 00:05:24,030 +khi chúng ta di chuyển đầu về phía trước và khi chúng ta di + +82 +00:05:24,060 --> 00:05:28,080 +chuyển nó lên, trái, xuống và phải. Bây giờ chúng ta + +83 +00:05:28,110 --> 00:05:33,110 +có thể đặt từng tiêu đề này. Lên là tiêu đề + +84 +00:05:34,560 --> 00:05:35,393 +90, + +85 +00:05:36,000 --> 00:05:41,000 +giảm là 270, trái là 180 và phải là 0. + +86 +00:05:41,760 --> 00:05:45,420 +Những hướng này chỉ đơn giản là ngược chiều kim đồng hồ. + +87 +00:05:45,450 --> 00:05:49,740 +Vì vậy, con rùa bắt đầu hướng về phía Đông và đó là hướng của số + +88 +00:05:50,070 --> 00:05:55,070 +0, và sau đó đi ngược chiều kim đồng hồ, lên là 90, sang trái là 180, xuống là 270. + +89 +00:05:55,920 --> 00:06:00,020 +Điều này có thể dễ dàng xác minh chỉ bằng cách kiểm tra một số con số, phải không? + +90 +00:06:00,020 --> 00:06:04,190 +Bạn có thể chỉ cần đặt một số con số vào đó và sau đó chỉ cần thử nó và xem nó + +91 +00:06:04,190 --> 00:06:07,130 +đi theo hướng nào và sau đó bạn sẽ có thể tìm ra nó. + +92 +00:06:07,580 --> 00:06:10,040 +Nhưng chúng tôi cũng đã đề cập đến vấn đề này + +93 +00:06:10,040 --> 00:06:13,730 +trong các bài học trước nên bạn cũng có thể quay lại và xem lại khi chúng + +94 +00:06:13,760 --> 00:06:18,020 +tôi xem xét tiêu đề của con rùa. Vì vậy, bây giờ nếu tôi tiếp tục + +95 +00:06:18,320 --> 00:06:23,240 +và chạy nó, thì bạn sẽ thấy rằng bây giờ tôi có thể tự do điều khiển con rắn bằng + +96 +00:06:23,240 --> 00:06:28,100 +cách đi sang trái hoặc phải hoặc xuống hoặc lên. Và nếu bạn làm được điều này, thì bạn + +97 +00:06:28,160 --> 00:06:32,000 +coi như mình đã thành công. Bây giờ, trong khi tôi đang + +98 +00:06:32,030 --> 00:06:34,160 +thử nghiệm đoạn mã này, tôi nhận + +99 +00:06:34,400 --> 00:06:39,020 +ra rằng có điều gì đó về trò chơi rắn mà chúng tôi chưa thực sự + +100 +00:06:39,380 --> 00:06:40,213 +tính đến. + +101 +00:06:40,730 --> 00:06:44,390 +Và thực tế là con rắn không thể tự di chuyển trở lại. + +102 +00:06:44,780 --> 00:06:49,310 +Nó không thể đi về phía trước và sau đó đi theo hướng ngược lại vì điều + +103 +00:06:49,310 --> 00:06:52,040 +đó đòi hỏi người đứng đầu phải thay đổi hướng. + +104 +00:06:52,280 --> 00:06:54,590 +Và điều này không được phép trong trò chơi rắn chính thức. + +105 +00:06:55,070 --> 00:06:59,420 +Vậy làm thế nào chúng ta có thể viết mã này vào trò chơi của mình? Chà, chúng ta phải + +106 +00:06:59,750 --> 00:07:04,750 +tìm ra khi nào đầu chỉ hướng xuống, khi đó chúng ta không + +107 +00:07:06,980 --> 00:07:11,360 +nên cho phép nó đi lên. Và tương tự, khi nó hướng lên, chúng ta không + +108 +00:07:11,390 --> 00:07:14,000 +nên để nó đi xuống, khi nó hướng sang phải, chúng ta + +109 +00:07:14,030 --> 00:07:17,150 +không nên để nó sang trái. Vì vậy, ở trên cùng ở đây, + +110 +00:07:17,180 --> 00:07:18,740 +tôi sẽ tạo một số hằng số. + +111 +00:07:18,770 --> 00:07:23,770 +Tôi sẽ tạo một hướng TĂNG và nó sẽ là 90, + +112 +00:07:24,920 --> 00:07:29,920 +hướng XUỐNG sẽ là 270, TRÁI sẽ bằng 180 và + +113 +00:07:33,230 --> 00:07:37,730 +RIGHT sẽ bằng 0. Vì vậy, bây giờ tôi đã có tất cả + +114 +00:07:37,880 --> 00:07:42,880 +những thứ này dưới dạng hằng số, tôi có thể vào đây và đặt tiêu đề thay vì nói LÊN khi + +115 +00:07:47,620 --> 00:07:51,640 +nó cần đi lên, XUỐNG, TRÁI và PHẢI. Ngoài ra, chúng tôi sẽ thực + +116 +00:07:51,670 --> 00:07:53,530 +hiện kiểm tra nếu. + +117 +00:07:53,560 --> 00:07:58,560 +Vì vậy, chúng tôi sẽ nói nếu bản thân hiện tại. cái đầu. đầu đề không bằng + +118 +00:08:01,810 --> 00:08:06,190 +xuống, tốt, trong trường hợp đó, nó được phép di + +119 +00:08:06,250 --> 00:08:09,190 +chuyển lên. Vì vậy, theo cách này, + +120 +00:08:09,190 --> 00:08:12,700 +nó chỉ có nghĩa là nếu tiêu đề hiện tại được trỏ xuống, + +121 +00:08:13,150 --> 00:08:16,510 +nó không thể di chuyển lên. Nhưng đối với tất cả các hướng khác, + +122 +00:08:16,540 --> 00:08:18,970 +nếu nó đã di chuyển lên trên hoặc sang trái hoặc sang phải, + +123 +00:08:19,240 --> 00:08:21,280 +thì nó có thể thay đổi tiêu đề để đi lên. + +124 +00:08:23,350 --> 00:08:27,430 +Bây giờ hãy thực sự cẩn thận ở đây bởi vì nó không chỉ là bản thân. cái đầu. , nó thực sự + +125 +00:08:27,700 --> 00:08:32,700 +là tiêu đề như một phương pháp vì hãy nhớ rằng đầu của con rắn là phân đoạn + +126 +00:08:34,150 --> 00:08:37,150 +đầu tiên trong danh sách các phân đoạn của chúng + +127 +00:08:37,630 --> 00:08:40,809 +ta và mỗi phân đoạn là một con rùa riêng lẻ. + +128 +00:08:41,409 --> 00:08:44,230 +Con rùa có một phương pháp tiêu đề sẽ cung + +129 +00:08:44,410 --> 00:08:48,820 +cấp cho bạn hướng về các con số 360 độ này và sau đó chúng ta có + +130 +00:08:49,270 --> 00:08:53,950 +thể sử dụng phương pháp đó để kiểm tra xem nó có bằng với hướng xuống hay không. + +131 +00:08:54,370 --> 00:08:57,780 +Và nếu có, thì nó không được phép tăng lên. + +132 +00:08:58,590 --> 00:09:00,780 +Vì vậy, sử dụng logic này, + +133 +00:09:00,810 --> 00:09:05,810 +hãy xem liệu bạn có thể hoàn thành phần còn lại của ba phương pháp để + +134 +00:09:06,990 --> 00:09:10,020 +khi chạy mã, bạn có thể quay theo mọi hướng. + +135 +00:09:10,440 --> 00:09:12,660 +Nhưng khi bạn đang đối mặt với + +136 +00:09:12,690 --> 00:09:15,750 +một hướng, bạn không thể quay ngược lại, như thế này. + +137 +00:09:16,520 --> 00:09:17,353 +2: Được chứ? + +138 +00:09:20,480 --> 00:09:22,880 +0: Được rồi. Vì vậy, nó sẽ khá đơn giản. + +139 +00:09:23,240 --> 00:09:27,950 +Nếu nó đã đi lên, thì nó không được phép đi xuống. + +140 +00:09:28,640 --> 00:09:31,520 +Nếu nó đã đi sang phải, thì nó không + +141 +00:09:31,820 --> 00:09:35,990 +được phép đi sang trái. Và cuối cùng, nếu nó + +142 +00:09:36,050 --> 00:09:40,310 +đã đi sang trái, thì nó không được phép đi sang phải. + +143 +00:09:41,810 --> 00:09:45,950 +Vì vậy, theo cách này, mặc dù con rắn của chúng ta có thể di chuyển tự do trong không gian, + +144 +00:09:46,280 --> 00:09:49,880 +nhưng nó không thể tự quay trở lại. Và chúng tôi đã có nó. + +145 +00:09:49,910 --> 00:09:53,990 +Bây giờ chúng tôi đã quản lý để tạo ra con rắn của mình, làm cho nó di chuyển và + +146 +00:09:54,080 --> 00:09:56,150 +điều khiển nó bằng các phím bấm của chúng tôi. + +147 +00:09:56,690 --> 00:10:00,590 +Mặc dù có vẻ như trò chơi của chúng tôi vẫn chưa hoàn thành, nhưng chúng + +148 +00:10:00,860 --> 00:10:02,660 +tôi đã tiến rất xa rồi. + +149 +00:10:02,990 --> 00:10:05,930 +Vì vậy, điều này đã đến mốc giờ của chúng tôi + +150 +00:10:06,290 --> 00:10:10,010 +và bây giờ là lúc để nghỉ ngơi, làm mới tâm trí của bạn, + +151 +00:10:10,370 --> 00:10:13,850 +xem xét một số khái niệm mà bạn có thể nhầm lẫn về + +152 +00:10:13,850 --> 00:10:14,683 +chúng tôi đã + +153 +00:10:14,720 --> 00:10:19,040 +đề cập hôm nay, đặc biệt là khái niệm sử dụng bản cập nhật để làm mới + +154 +00:10:19,460 --> 00:10:21,680 +màn hình, cũng như sử dụng bộ hẹn + +155 +00:10:21,710 --> 00:10:26,570 +giờ để trì hoãn việc làm mới để chúng tôi có thể kiểm soát tần suất nó xảy ra. + +156 +00:10:26,960 --> 00:10:31,610 +Và sau đó sử dụng các ràng buộc khóa của chúng tôi cũng như tách tất cả các lớp. + +157 +00:10:31,880 --> 00:10:34,910 +Chúng tôi đã xem xét rất nhiều thứ ngày hôm nay. Bây giờ, ngày mai, khi + +158 +00:10:34,970 --> 00:10:37,370 +bạn đã nghỉ ngơi, tinh thần sảng khoái và sẵn + +159 +00:10:37,640 --> 00:10:39,860 +sàng, chúng ta sẽ kết thúc trò chơi rắn. + +160 +00:10:40,310 --> 00:10:44,330 +Và chúng tôi sẽ tìm hiểu về kế thừa cũng như cắt và chúng + +161 +00:10:44,750 --> 00:10:48,350 +tôi sẽ xây dựng toàn bộ chức năng của trò chơi này. + +162 +00:10:48,680 --> 00:10:53,600 +Vì vậy, tôi hy vọng bạn đang mong đợi nó. Tôi chắc chắn là như vậy. Tôi sẽ gặp các bạn vào ngày mai. + diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 snake-game-part-1-final.zip b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 snake-game-part-1-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..5e0e82d00ee58ebfe1196c7f06c444595270e5b5 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/005 snake-game-part-1-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:198ce60bfa7ebcb4b0b23432cb2ea493ddc4849be5db6babe7c85fe5881445c1 +size 947 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/006 Programming is not Memorising.mp4 b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/006 Programming is not Memorising.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..27a8a7ccdf0c1c7caf94b990ee999f55d94512c0 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/006 Programming is not Memorising.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a92234f3e983d321c39e9b6e929eee00f1139f2c1cde7bb64363406a4a353447 +size 107191067 diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/006 Programming is not Memorising_vi.srt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/006 Programming is not Memorising_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..43d41430d1dd87e7eb5fff5ad19c59baf722b69b --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/006 Programming is not Memorising_vi.srt @@ -0,0 +1,112 @@ +1 +00:00:01,240 --> 00:00:11,380 +Này, bạn đã đạt được một cột mốc quan trọng. Hôm nay bạn đã hoàn thành 20 ngày viết mã. Bây giờ, đó là một phần năm chặng đường + +2 +00:00:11,380 --> 00:00:13,240 +và nó rất lớn. + +3 +00:00:13,510 --> 00:00:17,980 +Nếu bạn chưa làm được điều đó, bạn nên tự vỗ về mình vì bạn đã làm rất + +4 +00:00:17,980 --> 00:00:18,230 +tốt. + +5 +00:00:19,000 --> 00:00:25,840 +Bây giờ, hôm nay, điều tôi muốn nói đến là một câu hỏi mà sinh viên thường mắc phải, đó là “Này, bạn biết đấy, tôi đã + +6 +00:00:25,840 --> 00:00:27,460 +học đến ngày thứ 20 rồi. + +7 +00:00:27,460 --> 00:00:34,870 +Nhưng khi tôi nhìn lại những thứ mà tôi đã làm vào ngày đầu tiên, tôi không thể nhớ + +8 +00:00:34,870 --> 00:00:41,580 +chính xác tên của các hàm hoặc cách viết cú pháp cho một đoạn mã cụ thể. + +9 +00:00:41,980 --> 00:00:43,830 +Điều đó có nghĩa là tôi chưa học được gì? "Và một phép + +10 +00:00:44,410 --> 00:00:50,320 +loại suy mà tôi muốn đưa ra là, bạn đã bao giờ chơi trò chơi điện tử, đặc biệt là + +11 +00:00:50,320 --> 00:00:56,470 +trò chơi điện tử, nơi chúng yêu cầu những sự kết hợp phức tạp mà bạn phải nhớ, chẳng hạn như streetfighter? + +12 +00:00:57,280 --> 00:01:02,890 +Bạn biết đấy, để thực hiện như một động tác cụ thể, bạn cần có khả năng thực hiện lên, lên, + +13 +00:01:02,890 --> 00:01:04,629 +xuống, xuống, X, Y, a, b. + +14 +00:01:09,920 --> 00:01:15,380 +Bây giờ, khi bạn đang thực hiện nó trong thời điểm đó, khi bạn vừa mới học nó, bạn nhớ cách thực hiện nó. + +15 +00:01:15,830 --> 00:01:20,720 +Nhưng khi bạn quay lại với nó sau một tháng, bạn sẽ nói, "Ồ, tôi không nhớ những sự kết hợp đó. + +16 +00:01:21,110 --> 00:01:23,660 +Điều đó có nghĩa là tôi chưa học được gì? "Chà, vấn đề + +17 +00:01:24,170 --> 00:01:32,510 +là lập trình không phải là học thuộc lòng bởi vì chúng ta đang ở trong thời đại mà thông tin là rẻ + +18 +00:01:32,510 --> 00:01:33,080 +mạt. + +19 +00:01:33,260 --> 00:01:38,570 +Bạn có thể tìm kiếm trên Google bất kỳ thông tin nào bạn muốn và thông tin đó ở đó trong vòng một giây. + +20 +00:01:39,110 --> 00:01:47,540 +Công việc của bạn cần là hiểu cách thức hoạt động của mọi thứ. Đảm bảo rằng bạn hiểu cách sử dụng mã, + +21 +00:01:47,540 --> 00:01:52,130 +khi nào sử dụng, cách hoạt động đằng sau của mã. + +22 +00:01:52,550 --> 00:01:58,130 +Bằng cách đó, lần sau khi cần sử dụng mà quên cách viết cú pháp, bạn + +23 +00:01:58,130 --> 00:02:01,760 +có thể Google, tra cứu. Và ngay sau khi bạn nhìn thấy nó, bạn + +24 +00:02:01,760 --> 00:02:02,830 +sẽ nhớ “Ồ đúng vậy. + +25 +00:02:02,840 --> 00:02:03,830 +Tôi biết làm thế nào để sử dụng nó. “Vì + +26 +00:02:04,670 --> 00:02:06,950 +vậy, đừng lo lắng về việc học thuộc lòng. + +27 +00:02:07,560 --> 00:02:10,220 +Tập trung vào việc hiểu mã. + +28 +00:02:11,210 --> 00:02:13,490 +Vì vậy, chúc may mắn và tiếp tục. + diff --git a/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/external-links.txt b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..9133ad43256b9c94448ac0c9f6a803f4e96bdfe1 --- /dev/null +++ b/part2/20 - Day 20 - Intermediate - Build the Snake Game Part 1 Animation & Coordinates/external-links.txt @@ -0,0 +1,6 @@ + +003 The-tracer-method +https://docs.python.org/3.3/library/turtle.html?highlight=turtle#turtle.tracer + +005 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/001 Day 21 Goals what we will make by the end of the day.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/001 Day 21 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ad98067499c6bdfc4de22b08d04ad0d4b8badbb4 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/001 Day 21 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50bb7e46874c7df53e802cde884326775b57edfe9bd09817eb517db9a3b68b64 +size 2876834 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/001 Day 21 Goals what we will make by the end of the day_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/001 Day 21 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7cfd3e7bcc47f0d0bf802de8fb66c06c70ba30d6 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/001 Day 21 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,72 @@ +1 +00:00:00,540 --> 00:00:01,110 +Xin chào các + +2 +00:00:01,110 --> 00:00:05,610 +bạn, chào mừng đến với Ngày 21 của 100 Ngày viết mã. Hôm nay chúng ta sẽ tìm hiểu + +3 +00:00:05,610 --> 00:00:09,180 +về kế thừa lớp, cắt và chúng ta sẽ hoàn thành trò + +4 +00:00:09,390 --> 00:00:12,840 +chơi rắn của chúng ta. Hôm nay tôi muốn giới thiệu + +5 +00:00:12,870 --> 00:00:17,870 +với các bạn một khái niệm thực sự quan trọng khác trong Lập trình hướng đối tượng, đó là + +6 +00:00:18,420 --> 00:00:19,253 +ý tưởng + +7 +00:00:19,350 --> 00:00:24,350 +rằng các lớp có thể kế thừa từ các lớp khác, kế thừa các thuộc tính, kế thừa + +8 +00:00:24,960 --> 00:00:27,480 +các phương thức, về cơ bản là một cách + +9 +00:00:27,720 --> 00:00:30,030 +để làm cho việc sửa đổi các lớp trở + +10 +00:00:30,180 --> 00:00:33,690 +nên đơn giản hơn và cung cấp cho chúng nhiều khả năng hơn. + +11 +00:00:34,290 --> 00:00:39,290 +Bây giờ chúng ta cũng sẽ xem xét cách Python cho phép chúng ta cắt những + +12 +00:00:39,600 --> 00:00:44,310 +thứ như danh sách và từ điển. Và chúng tôi sẽ xem xét cách chúng tôi có thể làm điều đó. + +13 +00:00:44,880 --> 00:00:47,160 +Và khi chúng ta đã có được tất + +14 +00:00:47,430 --> 00:00:52,260 +cả những kỹ năng này, thì chúng ta sẽ có thể hoàn thành trò chơi rắn của mình + +15 +00:00:52,260 --> 00:00:56,490 +và hoàn thành bốn màn cuối cùng. Vì vậy, phát hiện va chạm với thực phẩm, tạo + +16 +00:00:56,550 --> 00:00:59,220 +ra một bảng điểm, phát hiện va chạm với tường và với đuôi. + +17 +00:01:00,090 --> 00:01:04,050 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và bắt đầu tìm + +18 +00:01:04,050 --> 00:01:05,489 +hiểu về kế thừa lớp. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Class Inheritance.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Class Inheritance.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6a9e9830de34ce0f2d9933c3a615a68f22423762 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Class Inheritance.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27fb5b540288835f41a744948d4bba0aead0fa379ce6e27164a630c53f65e7aa +size 66692467 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Class Inheritance_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Class Inheritance_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6072fbd9775c715fef525ba74cc99bd0f039d9a5 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Class Inheritance_vi.srt @@ -0,0 +1,396 @@ +1 +00:00:00,060 --> 00:00:03,780 +Hãy nói về một tính năng khác của Lập trình hướng đối + +2 +00:00:03,780 --> 00:00:06,090 +tượng thực sự rất tiện dụng. + +3 +00:00:06,510 --> 00:00:11,040 +Và đó là thứ mà chúng ta gọi là kế thừa lớp. Cái này hoạt động ra sao? + +4 +00:00:11,250 --> 00:00:11,660 +Giả + +5 +00:00:11,660 --> 00:00:16,280 +sử bạn thiết lập một đầu bếp rô bốt và bạn cung cấp + +6 +00:00:16,280 --> 00:00:21,170 +cho nó một loạt chức năng. Bạn cho nó biết cách nướng, cách khuấy, cách đo lường. + +7 +00:00:21,650 --> 00:00:25,190 +Và rồi đến một lúc nào đó, bạn thực sự quyết định, bạn biết đấy, trong nhà hàng của + +8 +00:00:25,190 --> 00:00:27,080 +tôi, tôi cũng cần một đầu bếp bánh ngọt. + +9 +00:00:27,380 --> 00:00:31,940 +Bây giờ đầu bếp bánh ngọt này sẽ cần biết một số điều mà một đầu bếp biết + +10 +00:00:31,940 --> 00:00:34,760 +cách làm, nhưng nó cũng cần thêm một số thứ. + +11 +00:00:35,000 --> 00:00:39,830 +Vì vậy, bạn không muốn tạo ra đầu bếp bánh ngọt này hoàn toàn từ đầu. Thay vào đó, những gì bạn muốn + +12 +00:00:39,860 --> 00:00:43,580 +làm là bạn có thể sử dụng các phương pháp bạn đã + +13 +00:00:43,580 --> 00:00:47,360 +xác định cho lớp đầu bếp và sau đó chỉ cần thêm vào + +14 +00:00:47,570 --> 00:00:50,030 +nó, thêm một vài phương pháp có liên + +15 +00:00:50,060 --> 00:00:53,270 +quan khác như cách nhào bột hoặc cách đánh trứng. . + +16 +00:00:53,720 --> 00:00:58,720 +Vì vậy, quá trình kế thừa hành vi và diện mạo từ một lớp hiện có + +17 +00:01:00,350 --> 00:01:04,760 +được gọi là kế thừa lớp. Khi chúng ta đang nói về thừa + +18 +00:01:05,030 --> 00:01:08,600 +kế lớp, bạn có thể thừa hưởng cả ngoại hình, do đó, các + +19 +00:01:08,960 --> 00:01:13,310 +thuộc tính, chẳng hạn như nếu bạn thừa hưởng đôi mắt giống mẹ của mình hoặc + +20 +00:01:13,610 --> 00:01:16,310 +nếu bạn thừa hưởng chiếc mũi giống ông của mình, + +21 +00:01:16,820 --> 00:01:19,100 +nhưng bạn cũng có thể thừa hưởng hành vi. + +22 +00:01:19,550 --> 00:01:24,550 +Vì vậy, có thể bạn băm cà chua giống như cách mà bố bạn băm cà chua. + +23 +00:01:25,220 --> 00:01:30,220 +Và nếu bạn tin mẹ tôi, tôi lười biếng giống như bố tôi lười biếng. + +24 +00:01:30,800 --> 00:01:35,360 +Vì vậy, không chỉ có thể kế thừa ngoại hình, mà chúng ta cũng có thể kế thừa hành vi. + +25 +00:01:36,080 --> 00:01:40,340 +Bây giờ, kế thừa thực sự hoạt động như thế nào về mặt mã? Chúng ta có thể định nghĩa + +26 +00:01:40,340 --> 00:01:43,310 +một lớp, chúng ta hãy gọi nó là Fish, + +27 +00:01:43,760 --> 00:01:46,130 +và nó có một bộ khởi tạo. + +28 +00:01:46,610 --> 00:01:51,260 +Bây giờ để lớp Fish này kế thừa từ một lớp khác, tất cả những gì + +29 +00:01:51,710 --> 00:01:53,600 +chúng ta phải làm là + +30 +00:01:53,630 --> 00:01:58,630 +thêm một tập hợp các dấu ngoặc đơn sau tên của lớp và sau đó cung cấp + +31 +00:01:58,730 --> 00:02:00,680 +lớp mà chúng ta muốn kế thừa. + +32 +00:02:01,130 --> 00:02:04,820 +Vì vậy, trong trường hợp này, cá của chúng ta đang kế thừa từ lớp động vật. + +33 +00:02:05,360 --> 00:02:10,360 +Và sau đó, để nắm giữ mọi thứ mà một con vật có và đang có, do đó, các thuộc tính + +34 +00:02:11,510 --> 00:02:15,350 +và phương thức của nó, tất cả những gì chúng ta phải làm là bên trong + +35 +00:02:15,500 --> 00:02:17,930 +init, thêm super () này. __trong đó__(). + +36 +00:02:18,410 --> 00:02:21,680 +Và super đề cập đến lớp cha. + +37 +00:02:21,890 --> 00:02:26,890 +Vì vậy, về cơ bản, hãy khởi tạo mọi thứ mà lớp cha có thể làm + +38 +00:02:27,530 --> 00:02:31,580 +trong lớp cá của chúng ta. Chúng ta hãy xem xét điều này dưới dạng mã thực. + +39 +00:02:32,180 --> 00:02:32,630 +Đầu + +40 +00:02:32,630 --> 00:02:37,630 +tiên, tôi sẽ tạo một lớp động vật và lớp động vật này sẽ có một trình + +41 +00:02:37,940 --> 00:02:42,650 +khởi tạo để chúng ta có thể xác định một số thuộc tính, phải không? + +42 +00:02:42,650 --> 00:02:47,090 +Vì vậy, giả sử rằng tất cả các loài động vật, ừm, hai mắt. + +43 +00:02:47,180 --> 00:02:51,680 +Vì vậy, num_eyes = 2. Đồng thời, tôi cũng sẽ định + +44 +00:02:51,710 --> 00:02:55,820 +nghĩa một phương thức liên quan đến lớp động vật này. + +45 +00:02:56,150 --> 00:02:58,940 +Giả sử rằng tất cả các loài động vật đều biết thở. + +46 +00:02:59,470 --> 00:03:03,430 +Vì vậy, bên trong phương pháp thở này, tôi sẽ giữ nó khá đơn giản. + +47 +00:03:03,430 --> 00:03:05,890 +Tôi chỉ nói hít vào, thở ra. + +48 +00:03:06,850 --> 00:03:10,210 +Vậy là đã thở xong. Bây giờ, sau này, + +49 +00:03:10,210 --> 00:03:15,210 +tôi quyết định xác định một lớp cá và lớp cá này có lẽ cũng + +50 +00:03:15,820 --> 00:03:20,500 +biết cách thực hiện một số việc. Vì vậy, chẳng hạn, có thể nó biết bơi, phải không? + +51 +00:03:22,900 --> 00:03:26,620 +Ngay bây giờ, nếu tôi tạo một đối tượng từ lớp Fish này, giả sử + +52 +00:03:26,650 --> 00:03:30,910 +tôi tạo một đối tượng có tên là nemo được tạo từ lớp Fish, thì tôi có + +53 +00:03:31,240 --> 00:03:33,790 +thể nói là nemo. bơi. + +54 +00:03:34,840 --> 00:03:39,370 +Và bạn có thể thấy khi tôi chạy đoạn mã này, nó nói rằng Nemo đang di chuyển trong nước. + +55 +00:03:40,030 --> 00:03:45,240 +Bây giờ, điều gì sẽ xảy ra nếu tôi muốn lớp Cá này kế thừa mọi thứ mà + +56 +00:03:45,970 --> 00:03:46,600 +lớp động + +57 +00:03:46,600 --> 00:03:51,600 +vật có thể làm, bao gồm cả số thuộc tính của mắt và cả phương thức thở. + +58 +00:03:52,330 --> 00:03:57,330 +Tất cả những gì tôi phải làm là thêm lớp động vật này sau tên của lớp + +59 +00:03:58,750 --> 00:03:59,950 +cá bên trong dấu + +60 +00:04:00,580 --> 00:04:05,580 +ngoặc đơn, sau đó tôi phải thêm bộ khởi tạo và bên trong bộ khởi tạo, + +61 +00:04:06,550 --> 00:04:10,540 +tôi phải kích hoạt lệnh gọi đến lớp cha, trong trường hợp này, + +62 +00:04:10,540 --> 00:04:11,650 +lớp động vật. + +63 +00:04:12,040 --> 00:04:16,540 +Và sau đó tôi sẽ gọi trình khởi tạo, như thế này. + +64 +00:04:17,019 --> 00:04:22,019 +Vì vậy, bây giờ những gì hai phần này của mã làm là nó cho phép bất cứ thứ + +65 +00:04:22,390 --> 00:04:27,390 +gì được tạo từ lớp cá của tôi kế thừa tất cả các thuộc tính và phương thức + +66 +00:04:28,060 --> 00:04:30,160 +từ lớp cha, đó là lớp thú. + +67 +00:04:30,610 --> 00:04:35,610 +Bây giờ tôi có thể làm cho Nemo của tôi bắt đầu thở. Và bạn có thể thấy nếu + +68 +00:04:35,770 --> 00:04:40,180 +tôi nhấn run, thì nó cũng sẽ hít vào và thở ra. + +69 +00:04:40,780 --> 00:04:41,800 +Và thêm vào + +70 +00:04:42,010 --> 00:04:45,850 +đó, nếu tôi muốn in nemo. num_eyes, sau đó bạn có + +71 +00:04:45,940 --> 00:04:48,520 +thể thấy điều này cũng sẽ in 2. + +72 +00:04:49,030 --> 00:04:54,030 +Vì vậy, bây giờ đối tượng của tôi được tạo từ lớp Fish bây giờ có quyền truy + +73 +00:04:54,490 --> 00:04:59,490 +cập vào tất cả các thuộc tính và phương thức từ lớp cha kế thừa từ lớp thú. + +74 +00:05:00,940 --> 00:05:04,360 +Bây giờ, nếu tôi muốn kế thừa một phương thức thì sao? + +75 +00:05:04,660 --> 00:05:09,130 +Vì vậy, hãy lấy tất cả những thứ mà nó làm, ví dụ như phương pháp thở. + +76 +00:05:09,430 --> 00:05:13,690 +Nhưng nếu tôi muốn sửa đổi nó một chút thì sao? Ví dụ, trên thực tế, + +77 +00:05:13,750 --> 00:05:17,560 +một con cá thở, nhưng nó lại thở dưới nước. + +78 +00:05:18,040 --> 00:05:21,520 +Vì vậy, giả sử tôi muốn xác định hàm + +79 +00:05:21,790 --> 00:05:26,200 +Breat và tôi muốn có cùng chức năng với lớp cha mà + +80 +00:05:26,200 --> 00:05:30,070 +tôi đang thừa kế. Vì vậy, tôi muốn in hít vào, thở ra, nhưng tôi + +81 +00:05:30,340 --> 00:05:33,640 +cũng muốn làm điều gì đó bổ sung. Chà, trong trường hợp + +82 +00:05:33,670 --> 00:05:38,230 +này, chúng ta sẽ nắm giữ lớp cha và sau đó kêu gọi nó. + +83 +00:05:39,700 --> 00:05:44,050 +Điều này có nghĩa là chúng ta sẽ làm mọi thứ mà phương thức Breat từ lớp cha làm, + +84 +00:05:44,050 --> 00:05:47,650 +vì vậy tất cả những điều này, nhưng sau đó chúng ta sẽ làm điều + +85 +00:05:47,680 --> 00:05:51,370 +gì đó đặc biệt hơn một chút. Vì vậy, chúng tôi sẽ nói + +86 +00:05:51,640 --> 00:05:55,870 +rằng chúng tôi đang làm điều này dưới nước. Bây giờ, khi dòng + +87 +00:05:55,900 --> 00:05:59,330 +này nemo. hít thở được chạy, bạn + +88 +00:05:59,630 --> 00:06:03,950 +có thể thấy điều gì xảy ra là nó sẽ in ra hít vào, + +89 +00:06:04,310 --> 00:06:08,540 +thở ra và điều này đến từ phương pháp thở siêu hạng ở đây. + +90 +00:06:09,080 --> 00:06:13,520 +Và sau đó, nó sẽ in ra cách thở độc đáo của riêng mình, vốn + +91 +00:06:13,550 --> 00:06:18,290 +đang thực hiện điều này dưới nước. Bằng cách tìm hiểu về kế thừa, những gì + +92 +00:06:18,320 --> 00:06:23,030 +nó cho phép chúng ta làm là lấy một lớp hiện có mà chúng ta đã tạo hoặc + +93 +00:06:23,030 --> 00:06:24,380 +ai đó khác đã + +94 +00:06:24,800 --> 00:06:29,690 +tạo, sau đó xây dựng trên lớp đó mà không cần phải phát minh lại bánh xe và xác + +95 +00:06:29,690 --> 00:06:33,200 +định lại mọi thứ trong lớp đó. Vì vậy, trong bài tiếp + +96 +00:06:33,230 --> 00:06:37,700 +theo, mình sẽ hướng dẫn các bạn cách chúng ta có thể kế thừa + +97 +00:06:37,700 --> 00:06:38,420 +từ lớp + +98 +00:06:38,420 --> 00:06:43,100 +rùa để nâng cấp rùa để có thể làm được những việc phụ như tạo + +99 +00:06:43,100 --> 00:06:47,120 +miếng ăn hay tạo bảng điểm. Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Inheritance-Repl.it-Example-Code.url b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Inheritance-Repl.it-Example-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..aea2db13eff4ba7206c7b47f9228c37707318cc3 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/002 Inheritance-Repl.it-Example-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/Class-Inheritance \ No newline at end of file diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/003 Inheritance Quiz.html b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/003 Inheritance Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..1811aea746b9871da2ea60aea1c1fc692271cc8d --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/003 Inheritance Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 Detect Collisions with Food.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 Detect Collisions with Food.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e0bd12fab699bbbc8c58f9e7bea54d6607f02d21 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 Detect Collisions with Food.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e139c7fedb2b86373059ce97ffd23d5636d0e284789efb89962fbc4f17a2ba67 +size 77963844 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 Detect Collisions with Food_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 Detect Collisions with Food_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..91d7e7765ecdb7f7c3c2d8ff6b55dfa85a1d9575 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 Detect Collisions with Food_vi.srt @@ -0,0 +1,708 @@ +1 +00:00:00,060 --> 00:00:02,910 +Được rồi. Vì vậy, bây giờ chúng ta đã + +2 +00:00:03,000 --> 00:00:06,300 +học tất cả về sự kế thừa, đã đến lúc áp dụng lý thuyết vào trò chơi rắn + +3 +00:00:06,570 --> 00:00:09,900 +của chúng ta và chúng ta sẽ sử dụng nó để phát hiện va chạm với thức ăn. + +4 +00:00:10,470 --> 00:00:13,590 +Con rắn của chúng ta có thể đứng đầu một miếng thức ăn, mà sẽ + +5 +00:00:13,860 --> 00:00:17,580 +chỉ là một vòng tròn màu xanh lam. Và mỗi khi nó chạm vào thức + +6 +00:00:17,790 --> 00:00:21,480 +ăn, vòng tròn sẽ di chuyển đến một vị trí mới, ngẫu nhiên trên màn hình. + +7 +00:00:22,480 --> 00:00:23,940 +Nếu chúng tôi nhìn vào mã + +8 +00:00:24,270 --> 00:00:27,780 +của chúng tôi, bạn có thể thấy rằng chính. py điều khiển toàn bộ trò chơi. + +9 +00:00:27,930 --> 00:00:32,640 +Nó chỉ định cách màn hình sẽ hoạt động và cách con rắn hoạt động. + +10 +00:00:33,150 --> 00:00:35,160 +Bây giờ, tất cả mọi thứ liên quan + +11 +00:00:35,190 --> 00:00:40,190 +đến một con rắn, đó là của cha mẹ và hành vi, tất cả đều được ghi lại bên trong một lớp. + +12 +00:00:40,650 --> 00:00:43,950 +Vì vậy, mọi thứ liên quan đến rắn đều nằm trong lớp rắn. + +13 +00:00:44,460 --> 00:00:49,460 +Vì vậy, những gì chúng tôi muốn có thể làm là tạo ra một loại thực phẩm mới. tập tin py và + +14 +00:00:51,510 --> 00:00:55,320 +thức ăn này. py sẽ trở thành lớp riêng của nó. + +15 +00:00:55,890 --> 00:01:00,890 +Và lớp thực phẩm sẽ biết cách tự hiển thị thành một vòng tròn + +16 +00:01:01,170 --> 00:01:04,530 +nhỏ trên màn hình. Và sau đó mỗi khi con rắn + +17 +00:01:04,950 --> 00:01:09,030 +chạm vào thức ăn, thì thức ăn đó sẽ di chuyển đến một vị trí ngẫu nhiên mới. + +18 +00:01:09,690 --> 00:01:13,410 +Vì vậy, hãy tạo trình khởi tạo cho lớp thực phẩm này. + +19 +00:01:14,010 --> 00:01:18,450 +Và một trong những điều chúng ta cần làm là + +20 +00:01:18,480 --> 00:01:21,990 +nhập khẩu rùa. Vì vậy, từ mô-đun + +21 +00:01:21,990 --> 00:01:23,880 +rùa, hãy nhập lớp rùa. + +22 +00:01:24,570 --> 00:01:29,570 +Và miếng thức ăn mà chúng ta sẽ thấy trên màn hình sẽ + +23 +00:01:30,240 --> 00:01:34,320 +là một vật thể rùa. Thay vì tạo nó như một thuộc tính + +24 +00:01:34,320 --> 00:01:37,710 +trong lớp này, hãy tự. food = rùa như thế này, + +25 +00:01:38,010 --> 00:01:43,010 +những gì chúng ta muốn có thể làm là chúng ta thực sự muốn class này, thức ăn, kế + +26 +00:01:43,500 --> 00:01:44,790 +thừa từ class rùa. + +27 +00:01:45,300 --> 00:01:50,280 +Vì vậy, theo cách đó, lớp thức ăn này sẽ có tất cả các khả năng của lớp rùa, + +28 +00:01:50,280 --> 00:01:51,120 +nhưng nó + +29 +00:01:51,450 --> 00:01:55,170 +cũng sẽ có một số điều cụ thể mà chúng ta sẽ cho nó + +30 +00:01:55,200 --> 00:01:59,070 +biết cách làm để nó hoạt động như một miếng thức ăn thực sự. + +31 +00:01:59,370 --> 00:02:02,700 +Đây là một thử thách nhanh chóng. Từ những điều đã học ở + +32 +00:02:02,730 --> 00:02:07,650 +bài trước, em có thể tìm ra cách để lớp thức ăn này kế thừa từ lớp rùa không? + +33 +00:02:07,980 --> 00:02:09,300 +Tạm dừng video và + +34 +00:02:09,410 --> 00:02:10,243 +tiếp tục. + +35 +00:02:12,920 --> 00:02:13,310 +0: Được rồi. + +36 +00:02:13,310 --> 00:02:17,780 +Vì vậy, chúng tôi đã đề cập rằng chỉ có hai bước chúng tôi cần làm. Đầu tiên là sau tên của lớp, + +37 +00:02:17,780 --> 00:02:18,710 +chúng ta + +38 +00:02:18,740 --> 00:02:22,940 +thêm một số dấu ngoặc và sau đó đặt tên của lớp mà + +39 +00:02:22,940 --> 00:02:26,030 +chúng ta muốn kế thừa. Vì vậy, trong trường hợp này, đó là lớp rùa. + +40 +00:02:26,630 --> 00:02:31,520 +Và sau đó, điều tiếp theo chúng ta cần làm là chúng ta cần gọi phương thức init + +41 +00:02:31,520 --> 00:02:34,550 +của rùa bên trong phương thức init của thức ăn. + +42 +00:02:35,150 --> 00:02:39,470 +Và bạn có thể thấy rằng ngay sau khi bạn thêm phần kế thừa này vào đây, init này + +43 +00:02:39,470 --> 00:02:44,090 +sẽ bắt đầu đưa ra cảnh báo cho chúng tôi. Và khi bạn nhấp vào nó, bạn có thể + +44 +00:02:44,090 --> 00:02:47,360 +thấy nó thông báo cuộc gọi tới __init__ của lớp cha bị bỏ lỡ. + +45 +00:02:47,690 --> 00:02:49,970 +Vì vậy, nó thực sự biết những gì chúng ta cần làm tiếp theo. + +46 +00:02:50,120 --> 00:02:51,950 +Điều đó có nghĩa là nếu chúng ta nhấp vào + +47 +00:02:52,190 --> 00:02:56,930 +bóng đèn, chúng ta thực sự có thể tự động thêm vào lệnh gọi 'superclass'. Điều này, tất nhiên, bạn có thể chỉ cần + +48 +00:02:56,990 --> 00:03:00,010 +gõ ra và nó tốt cho việc thực hành, nhưng trong trường + +49 +00:03:00,340 --> 00:03:03,280 +hợp bạn tự hỏi liệu mình có nhận được những cảnh báo + +50 +00:03:03,490 --> 00:03:06,850 +này hay không, bạn luôn có thể xem những gì PyCharm đang đề xuất. + +51 +00:03:07,660 --> 00:03:12,660 +Bây giờ chúng tôi đã thực sự tạo ra lớp thức ăn của mình và chúng tôi đã kế thừa + +52 +00:03:12,700 --> 00:03:13,533 +từ lớp rùa. + +53 +00:03:13,690 --> 00:03:18,580 +Điều đó có nghĩa là bây giờ chúng ta có thể bắt đầu sử dụng những thứ thuộc lớp rùa. + +54 +00:03:19,360 --> 00:03:22,750 +Ví dụ, tôi có thể thẳng thắn nói về bản thân. hình dạng, và nó biết + +55 +00:03:22,960 --> 00:03:24,460 +hình dạng là gì. + +56 +00:03:24,760 --> 00:03:29,470 +Đây là một phương thức mà lớp rùa có mà bây giờ tôi sẽ sửa đổi + +57 +00:03:29,470 --> 00:03:33,070 +trong lớp thức ăn của mình. Vì vậy, khi tôi khởi tạo + +58 +00:03:33,370 --> 00:03:36,160 +một miếng thức ăn mới, tôi sẽ đảm bảo rằng nó + +59 +00:03:36,820 --> 00:03:40,780 +có hình tròn, và tôi cũng sẽ cầm nó lên bút để nó không bị vẽ. + +60 +00:03:41,410 --> 00:03:44,020 +Và sau đó tôi sẽ xác định kích thước của nó. + +61 +00:03:44,470 --> 00:03:47,290 +Và có một thứ gọi là kích thước hình dạng mà tôi có thể sử dụng. + +62 +00:03:47,860 --> 00:03:52,860 +Và điều này cho phép tôi làm là kéo dài con rùa dọc theo chiều dài + +63 +00:03:52,990 --> 00:03:56,890 +và chiều rộng của nó. Bây giờ tôi sẽ không thực sự kéo nó lớn hơn nó. + +64 +00:03:57,130 --> 00:03:59,350 +Nó thường là 20 x 20 + +65 +00:03:59,680 --> 00:04:02,860 +pixel, nhưng tôi muốn biến nó thành 10 x 10 pixel. + +66 +00:04:03,340 --> 00:04:06,160 +Vì vậy, tôi sẽ kéo dài độ dài bằng 0. 5, vì vậy về cơ bản + +67 +00:04:06,160 --> 00:04:07,780 +tôi sẽ đi đến một nửa nó. + +68 +00:04:08,200 --> 00:04:11,260 +Và sau đó tôi sẽ kéo dài chiều rộng cũng bằng 0. 5. + +69 +00:04:11,740 --> 00:04:15,400 +Vì vậy, bây giờ nó sẽ là một hình tròn 10 x 10 mà tôi đã tạo + +70 +00:04:15,700 --> 00:04:19,240 +bằng cách xác định kích thước hình dạng. Bây giờ, hãy nhớ tất cả + +71 +00:04:19,269 --> 00:04:21,490 +các phương thức này, hình dạng, kích thước, + +72 +00:04:21,490 --> 00:04:26,380 +bút lên, hình dạng, đến từ lớp siêu rùa này và chúng ta chỉ có thể sử dụng nó vì + +73 +00:04:26,650 --> 00:04:31,650 +chúng ta đang kế thừa từ lớp cha để lớp thức ăn của chúng ta bây giờ cũng là một + +74 +00:04:32,980 --> 00:04:37,780 +loại rùa, nhưng nó giống như một con rùa súp. Cuối cùng, hãy tiếp tục và xác định + +75 +00:04:37,780 --> 00:04:41,740 +màu mà tôi sẽ đặt là màu xanh lam, nhưng tất nhiên, hãy thoải mái + +76 +00:04:42,070 --> 00:04:44,620 +đặt nó như bất kỳ thứ gì bạn thích. + +77 +00:04:45,190 --> 00:04:50,190 +Và tôi cũng sẽ đặt tốc độ của con rùa của tôi là nhanh nhất. Bằng cách này, tôi không phải nhìn + +78 +00:04:51,310 --> 00:04:55,720 +vào hoạt ảnh của thức ăn đang được tạo ở giữa màn hình, + +79 +00:04:55,720 --> 00:04:58,840 +rồi di chuyển đến vị trí mà tôi muốn. + +80 +00:04:59,560 --> 00:05:03,580 +Nói về việc di chuyển, chúng ta sẽ cần sử dụng goto để + +81 +00:05:03,580 --> 00:05:06,790 +đưa nó đến một vị trí X, Y ngẫu nhiên. + +82 +00:05:07,150 --> 00:05:11,950 +Vì vậy, hãy nhập mô-đun ngẫu nhiên và tạo một X ngẫu nhiên, + +83 +00:05:13,420 --> 00:05:18,420 +sẽ là ngẫu nhiên. randint. Hãy nhớ rằng màn hình + +84 +00:05:20,500 --> 00:05:24,820 +của chúng ta là 600 x 600, điều đó có nghĩa là trục X của + +85 +00:05:25,090 --> 00:05:29,560 +chúng ta từ -300 đến +300 và trục Y của chúng ta từ +300 đến -300. + +86 +00:05:30,010 --> 00:05:33,430 +Bây giờ chúng tôi không muốn thức ăn của chúng tôi ở + +87 +00:05:33,430 --> 00:05:37,450 +ngay cạnh màn hình, vì sẽ rất khó để bắt con rắn đi đến ngay cạnh. + +88 +00:05:37,480 --> 00:05:39,430 +Nó có thể sẽ chết trên tường. + +89 +00:05:39,850 --> 00:05:42,100 +Vì vậy, chúng tôi muốn có thể trừ điều này đi một chút. + +90 +00:05:42,100 --> 00:05:47,100 +Vì vậy, chúng ta có thể đi từ -280 đến +280 và tương tự trên trục Y. + +91 +00:05:47,950 --> 00:05:52,950 +Vì vậy, hãy tạo một số nguyên ngẫu nhiên từ -280 đến +280 và + +92 +00:05:54,340 --> 00:05:59,330 +hãy tạo một số nguyên Y ngẫu nhiên trong cùng một phạm vi. + +93 +00:05:59,780 --> 00:06:04,780 +Vì vậy, bây giờ chúng ta có thể yêu cầu thức ăn của chúng ta chuyển thành X ngẫu nhiên và Y ngẫu nhiên. Tất cả những điều này sẽ xảy + +94 +00:06:07,100 --> 00:06:08,180 +ra ngay sau + +95 +00:06:08,240 --> 00:06:12,590 +khi chúng ta tạo một đối tượng thực phẩm mới từ lớp thực phẩm. + +96 +00:06:12,860 --> 00:06:16,760 +Hãy nhớ rằng, bất cứ khi nào bạn khởi tạo một đối tượng mới từ lớp, + +97 +00:06:16,760 --> 00:06:20,420 +init sẽ được gọi. Trở lại chính của chúng tôi. py ngay bên dưới + +98 +00:06:20,600 --> 00:06:25,280 +nơi chúng tôi khởi tạo con rắn của mình, chúng tôi sẽ khởi tạo thức ăn của chúng tôi. + +99 +00:06:25,490 --> 00:06:29,750 +Vì vậy, thực phẩm bằng loại thực phẩm và sau đó là dấu ngoặc đơn. + +100 +00:06:30,290 --> 00:06:35,290 +Và tất nhiên, chúng ta cần nắm giữ hạng Thực phẩm của mình từ tệp thực phẩm, như + +101 +00:06:36,800 --> 00:06:37,633 +thế này. + +102 +00:06:38,270 --> 00:06:42,530 +Một điều khác mà bạn sẽ nhận thấy là con rùa này hiện đã chuyển sang màu xám bởi vì chúng tôi không sử dụng + +103 +00:06:42,530 --> 00:06:47,360 +lớp đó ở bất kỳ đâu bên trong main. py Vì vậy, chúng tôi có thể xóa điều đó để + +104 +00:06:47,390 --> 00:06:49,880 +loại bỏ tất cả các cảnh báo của chúng tôi trên trang này và chúng tôi + +105 +00:06:50,030 --> 00:06:54,170 +nhận được dấu kiểm màu xanh lá cây. Thức ăn của chúng tôi. py có vẻ tốt, con rắn + +106 +00:06:54,320 --> 00:06:56,330 +của chúng tôi. py có vẻ ổn + +107 +00:06:56,720 --> 00:07:00,020 +và bây giờ chúng tôi đã sẵn sàng để tiếp tục và chạy mã này. + +108 +00:07:00,800 --> 00:07:04,760 +Hãy chú ý cách chúng ta có con rắn di chuyển trên màn hình. + +109 +00:07:05,000 --> 00:07:08,030 +Và tại thời điểm này, nó không thực sự quan trọng về các bức tường. + +110 +00:07:08,030 --> 00:07:11,630 +Nó chỉ di chuyển xung quanh bất cứ nơi nào nó thích. Nhưng quan trọng hơn, chúng + +111 +00:07:11,690 --> 00:07:16,580 +tôi có thức ăn của chúng tôi được tạo ngẫu nhiên trên màn hình ngay tại đây. + +112 +00:07:17,270 --> 00:07:22,270 +Bây giờ bước tiếp theo là làm thế nào chúng ta có thể phát hiện khi nào con rắn + +113 +00:07:22,910 --> 00:07:27,500 +và thức ăn đã tiếp xúc và sau đó bảo thức ăn tự di chuyển đến một + +114 +00:07:27,530 --> 00:07:32,150 +vị trí ngẫu nhiên mới? Chà, chúng tôi sẽ làm điều đó bên trong chính của chúng tôi. py + +115 +00:07:32,360 --> 00:07:36,920 +Ngay sau khi chúng tôi cập nhật màn hình, con rắn của chúng tôi di chuyển, + +116 +00:07:36,980 --> 00:07:38,630 +sau đó chúng tôi sẽ + +117 +00:07:40,310 --> 00:07:42,410 +phát hiện va chạm với thức ăn. + +118 +00:07:43,070 --> 00:07:47,600 +Và chúng ta sẽ làm điều đó bằng cách sử dụng một phương thức từ lớp rùa được gọi + +119 +00:07:47,630 --> 00:07:48,463 +là khoảng cách. + +120 +00:07:48,860 --> 00:07:53,860 +Phương pháp khoảng cách hoạt động bằng cách so sánh khoảng cách từ con rùa này với bất cứ + +121 +00:07:55,160 --> 00:07:57,890 +thứ gì bạn đặt bên trong dấu ngoặc đơn. + +122 +00:07:58,310 --> 00:08:02,720 +Vì vậy, X có thể là một cặp số, X và Y, hoặc nó có thể + +123 +00:08:03,140 --> 00:08:06,200 +đơn giản chỉ là một ví dụ của con rùa. + +124 +00:08:06,500 --> 00:08:10,190 +Vì vậy, bạn đang so sánh con rùa này với con rùa khác, và + +125 +00:08:10,340 --> 00:08:13,670 +bạn đang cố gắng nắm bắt khoảng cách giữa hai con rùa. + +126 +00:08:14,150 --> 00:08:19,150 +Vì vậy, điều đó có nghĩa là chúng ta có thể kiểm tra xem liệu khoảng cách từ đoạn đầu tiên của con + +127 +00:08:20,990 --> 00:08:21,823 +rắn, vì vậy + +128 +00:08:21,980 --> 00:08:26,960 +nó nhớ rằng đó sẽ là con rắn. cái đầu. khoảng cách, và sau + +129 +00:08:27,920 --> 00:08:31,850 +đó khoảng cách mà chúng ta muốn biết là khoảng cách từ + +130 +00:08:31,850 --> 00:08:35,809 +đầu con rắn đến thức ăn. Lúc này, bạn có thể + +131 +00:08:35,809 --> 00:08:39,289 +kiểm tra xem nó có nhỏ hơn một lượng nào + +132 +00:08:39,590 --> 00:08:44,590 +đó không thì rất có thể phần đầu rắn đang va chạm với thức ăn. + +133 +00:08:45,200 --> 00:08:48,260 +Vì vậy, chúng ta biết rằng thức ăn là 10 x 10. + +134 +00:08:48,530 --> 00:08:51,260 +Vì vậy, nếu chúng ta thêm một chút bộ đệm, giả + +135 +00:08:51,440 --> 00:08:56,440 +sử, nếu đầu con rắn này nằm trong phạm vi 15 pixel từ thức ăn hoặc thậm chí gần hơn, vì + +136 +00:08:57,060 --> 00:08:59,790 +vậy nếu khoảng cách nhỏ hơn 15, thì chúng ta có + +137 +00:09:00,030 --> 00:09:02,760 +thể khá chắc chắn rằng chúng đã va chạm. . + +138 +00:09:03,090 --> 00:09:06,990 +Vì vậy, chúng ta hãy tiếp tục và in một cái gì đó. Tôi sẽ chỉ viết nom nom nom. + +139 +00:09:07,440 --> 00:09:12,440 +Vì vậy, nếu chúng ta tiếp tục và chạy mã của mình và chỉ cần đưa con rắn của chúng ta trở + +140 +00:09:14,160 --> 00:09:18,900 +lại xem, và nếu bây giờ tôi đi và chạm vào miếng thức ăn này, nếu tôi có thể, thì + +141 +00:09:19,650 --> 00:09:22,890 +bạn có thể thấy nom nom nom được in trên bảng điều khiển. + +142 +00:09:23,280 --> 00:09:25,830 +Bây giờ chúng ta hãy tiếp tục và chạm vào nó một lần nữa. Bạn có thể + +143 +00:09:25,830 --> 00:09:28,410 +thấy, ngay sau khi tôi va chạm với thực + +144 +00:09:28,680 --> 00:09:31,860 +phẩm đó, tôi nhận được lệnh in đó thực thi. + +145 +00:09:33,630 --> 00:09:36,990 +Vì vậy, bây giờ, thay vì chỉ viết nom nom nom nom, chúng ta hãy tìm ra + +146 +00:09:37,380 --> 00:09:39,210 +những gì chúng ta cần làm tiếp theo. + +147 +00:09:39,240 --> 00:09:44,240 +Những gì chúng tôi muốn xảy ra là thực phẩm phải được chuyển đến một địa điểm ngẫu nhiên mới. + +148 +00:09:45,390 --> 00:09:48,690 +Và, tất nhiên, điều đó đến từ phần này của mã. + +149 +00:09:49,200 --> 00:09:54,200 +Vậy tại sao chúng ta không tiếp tục và tạo một phương thức mới mà chúng ta sẽ gọi là refresh. + +150 +00:09:54,960 --> 00:09:59,960 +Và phương pháp làm mới này sẽ tạo ra một X ngẫu nhiên mới, một Y + +151 +00:10:00,030 --> 00:10:04,950 +ngẫu nhiên mới, sau đó đưa thực phẩm đến vị trí ngẫu nhiên mới đó. + +152 +00:10:05,730 --> 00:10:10,680 +Sau đó, bên trong init của chúng ta, chúng ta có thể đơn giản chỉ cần gọi là self. Làm tươi. + +153 +00:10:11,400 --> 00:10:15,420 +Vì vậy, hãy cẩn thận rằng bạn đã thiết lập lại không đúng vì đó là một trong những + +154 +00:10:15,480 --> 00:10:17,850 +phương thức từ lớp rùa mà chúng ta đang kế thừa. + +155 +00:10:18,150 --> 00:10:22,830 +Nhưng những gì chúng tôi thực sự muốn là gọi phương pháp làm mới này để thực phẩm đi đến + +156 +00:10:22,830 --> 00:10:27,300 +một vị trí ngẫu nhiên mới. Và sau đó trở lại bên trong chính của chúng tôi. py, khi đầu + +157 +00:10:27,720 --> 00:10:30,360 +rắn va chạm với thức ăn, thì chúng + +158 +00:10:30,660 --> 00:10:35,130 +ta sẽ lấy thức ăn để làm mới vị trí của chính nó. + +159 +00:10:35,610 --> 00:10:39,780 +Vì vậy, hãy kiểm tra điều này. Bây giờ, khi tôi đánh thức ăn, + +160 +00:10:41,400 --> 00:10:44,820 +thì bạn có thể thấy thức ăn hiện xuất hiện ở một vị + +161 +00:10:44,880 --> 00:10:48,870 +trí ngẫu nhiên mới. Như vậy đó. Bây giờ, tùy thuộc + +162 +00:10:48,900 --> 00:10:53,340 +vào mức độ chính xác mà bạn muốn con rắn đâm vào thức ăn, vì + +163 +00:10:53,730 --> 00:10:55,860 +vậy nó có thể cần phải đánh + +164 +00:10:56,100 --> 00:11:01,100 +chết nó hoặc nếu bạn hài lòng với việc nó chỉ lướt qua và coi đó là một + +165 +00:11:01,440 --> 00:11:06,180 +vụ va chạm, thì bạn có thể giảm số lượng ở đây từ 15 đến 10. + +166 +00:11:06,540 --> 00:11:11,520 +Bây giờ tôi đã thực hiện một chút thử nghiệm và con số này có vẻ là khoảng cách tốt nhất để có được một vụ va + +167 +00:11:11,520 --> 00:11:13,230 +chạm hợp lệ, nhưng hãy thoải mái điều + +168 +00:11:13,560 --> 00:11:18,060 +chỉnh với con số và xem nó diễn ra như thế nào. Chúng ta bắt đầu. + +169 +00:11:18,060 --> 00:11:22,110 +Chúng tôi đã tìm ra cách tạo ra một miếng thức ăn bằng cách kế + +170 +00:11:22,110 --> 00:11:25,620 +thừa từ lớp rùa, lấy thức ăn được tạo ra và sau đó + +171 +00:11:25,830 --> 00:11:28,650 +di chuyển đến một vị trí ngẫu nhiên mới mỗi + +172 +00:11:29,070 --> 00:11:31,650 +khi đầu rắn va chạm với thức ăn. + +173 +00:11:32,250 --> 00:11:33,870 +Bây giờ tôi biết rằng + +174 +00:11:33,930 --> 00:11:38,460 +trong trò chơi rắn, các đoạn rắn tăng lên khi nó chạm vào một miếng thức + +175 +00:11:38,790 --> 00:11:43,230 +ăn, nhưng chúng tôi sẽ chỉ thêm chức năng đó vào cuối dự án này khi + +176 +00:11:43,530 --> 00:11:46,080 +chúng tôi phát hiện va chạm với đuôi rắn. + +177 +00:11:46,230 --> 00:11:47,910 +Vì vậy, đừng lo lắng về điều đó ngay bây giờ. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 The-shape-and-shapesize-methods.url b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 The-shape-and-shapesize-methods.url new file mode 100644 index 0000000000000000000000000000000000000000..34d69fd9ac66595ec36f378706d927c04539914f --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/004 The-shape-and-shapesize-methods.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/turtle.html#turtle.shape \ No newline at end of file diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 Create a Scoreboard and Keep Score.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 Create a Scoreboard and Keep Score.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..078ac50805b458b0eb939109990ba11a46295d06 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 Create a Scoreboard and Keep Score.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d92590df9cb76ef965fd0362289ca0d265cf37754b311abf32875c9bb293adb +size 74484496 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 Create a Scoreboard and Keep Score_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 Create a Scoreboard and Keep Score_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d533549d7edbd28ec81d1d365e4d9abb86b14567 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 Create a Scoreboard and Keep Score_vi.srt @@ -0,0 +1,592 @@ +1 +00:00:00,420 --> 00:00:02,580 +Các bạn, chúng ta đã đi thực sự, rất xa. + +2 +00:00:03,090 --> 00:00:08,090 +Chúng tôi đã làm tất cả những điều này và bây giờ chúng tôi đang ở giai đoạn này, tạo ra một bảng điểm. + +3 +00:00:08,760 --> 00:00:13,760 +Vì vậy, những gì chúng tôi muốn là có thể viết một số văn bản trong chương trình của chúng tôi để theo dõi điểm số, về số + +4 +00:00:13,950 --> 00:00:18,390 +lượng thực phẩm mà chúng tôi đã thực sự ăn được. Bây giờ, điểm số sẽ cập nhật mỗi + +5 +00:00:18,390 --> 00:00:22,620 +khi chúng ta đánh một miếng thức ăn mới và nó sẽ ở đó và + +6 +00:00:22,620 --> 00:00:25,560 +tiếp tục tự cập nhật mỗi khi chúng ta đánh + +7 +00:00:25,620 --> 00:00:27,480 +một miếng thức ăn mới. + +8 +00:00:28,710 --> 00:00:32,729 +Bây giờ bảng điểm này cũng sẽ là một con rùa. + +9 +00:00:33,330 --> 00:00:38,160 +Vì vậy, một trong những điều bạn có thể làm với con rùa của mình là bạn có thể giúp nó viết + +10 +00:00:38,250 --> 00:00:39,330 +một đoạn văn bản. + +11 +00:00:40,140 --> 00:00:43,620 +Và đây là những gì phương pháp trông giống như trong tài liệu. + +12 +00:00:44,040 --> 00:00:48,570 +Bạn có thể cho nó biết nó nên viết gì, loại căn chỉnh nào bạn muốn, bạn muốn + +13 +00:00:48,570 --> 00:00:50,250 +nó nằm ở giữa màn hình, + +14 +00:00:50,250 --> 00:00:54,570 +ở bên trái hay bên phải của màn hình? Và sau đó bạn muốn loại phông chữ nào? + +15 +00:00:55,110 --> 00:00:58,860 +Vì vậy, tên phông chữ, kích thước phông chữ và loại phông chữ, + +16 +00:00:58,870 --> 00:01:02,820 +bình thường hoặc đậm hoặc đậm hoặc gạch chân, và chúng ta sẽ + +17 +00:01:03,510 --> 00:01:05,940 +gọi nó ít nhiều như thế này. + +18 +00:01:06,900 --> 00:01:08,520 +Vì vậy, đây là một thách thức cho bạn. + +19 +00:01:08,820 --> 00:01:13,820 +Tôi muốn bạn tiếp tục và tạo một tệp mới có tên là bảng điểm. py + +20 +00:01:15,420 --> 00:01:20,370 +Và bên trong tệp này, tôi muốn bạn tạo một lớp bảng điểm mới. + +21 +00:01:20,850 --> 00:01:26,060 +Bây giờ, lớp bảng điểm này sẽ kế thừa từ lớp rùa, giống như chúng ta + +22 +00:01:26,430 --> 00:01:28,560 +đã làm với lớp thức ăn. + +23 +00:01:29,190 --> 00:01:31,950 +Và sau đó bảng điểm sẽ là một con + +24 +00:01:32,130 --> 00:01:37,130 +rùa biết cách theo dõi điểm số và cách hiển thị nó trong chương trình của chúng tôi. + +25 +00:01:38,670 --> 00:01:42,090 +Hãy thoải mái chọn bất kỳ phông chữ nào bạn muốn, bất kỳ kích + +26 +00:01:42,360 --> 00:01:46,740 +thước nào bạn muốn, nhưng kết quả cuối cùng mà chúng tôi đang tìm kiếm là thứ trông giống + +27 +00:01:47,160 --> 00:01:51,210 +như thế này và điểm số sẽ cần được theo dõi bên trong lớp bảng điểm đó. + +28 +00:01:51,540 --> 00:01:55,530 +Và nó cần được tăng lên một lần mỗi khi con rắn + +29 +00:01:55,530 --> 00:01:59,550 +ăn một miếng thức ăn. Bạn sẽ cần sự trợ giúp của tài + +30 +00:01:59,550 --> 00:02:04,470 +liệu, bạn sẽ cần đọc về cách con rùa này. phương pháp viết hoạt động, và có lẽ + +31 +00:02:04,860 --> 00:02:09,509 +bạn cũng sẽ cần con rùa này. rõ ràng để bạn xóa bài + +32 +00:02:09,509 --> 00:02:11,910 +viết mỗi khi bạn cập nhật điểm. + +33 +00:02:12,510 --> 00:02:16,110 +Hãy suy nghĩ về cách bạn sẽ giải quyết vấn đề này và sau đó tiếp + +34 +00:02:16,170 --> 00:02:17,820 +tục, tạm dừng video và tiếp tục. + +35 +00:02:18,740 --> 00:02:23,090 +1: [không nghe được] 0: Được rồi. + +36 +00:02:23,090 --> 00:02:27,230 +Vì vậy, điều đầu tiên tôi sẽ làm là tôi sẽ tạo ra lớp bảng điểm của mình. + +37 +00:02:27,860 --> 00:02:29,030 +Và như tôi + +38 +00:02:29,030 --> 00:02:32,990 +đã đề cập, lớp này cần kế thừa từ lớp rùa. + +39 +00:02:33,230 --> 00:02:34,760 +Vì vậy, từ mô-đun rùa, chúng + +40 +00:02:34,790 --> 00:02:39,790 +ta hãy nắm giữ lớp rùa thực sự để chúng ta có thể sử dụng nó bên trong tệp này. + +41 +00:02:40,640 --> 00:02:45,440 +Và sau đó tôi sẽ thêm nó vào bảng điểm của mình làm lớp cao cấp. + +42 +00:02:46,040 --> 00:02:48,140 +Bây giờ, nếu tôi tạo inits của + +43 +00:02:48,230 --> 00:02:53,230 +mình, tôi có thể tiếp tục và sử dụng bóng đèn này để chèn lệnh gọi siêu lớp. + +44 +00:02:54,290 --> 00:02:59,290 +Vì vậy, bây giờ bảng điểm của tôi là một lớp có thể làm mọi thứ mà một lớp rùa làm. + +45 +00:03:00,460 --> 00:03:05,460 +Và một trong những điều tôi muốn nó làm là tôi muốn nó theo dõi điểm số. + +46 +00:03:06,760 --> 00:03:08,830 +Vì vậy, giả sử nó bắt đầu từ 0, + +47 +00:03:09,130 --> 00:03:14,080 +và chúng tôi muốn có thể viết điều này lên màn hình. Vì vậy, chúng ta có thể nói tự. + +48 +00:03:14,080 --> 00:03:18,310 +viết, và chúng ta hãy sử dụng một chuỗi f để nói điểm, và sau đó + +49 +00:03:18,790 --> 00:03:23,290 +chúng ta có thể chèn bản thân. điểm giá trị tại đây. + +50 +00:03:24,010 --> 00:03:29,010 +Và sau đó, chúng ta có thể thêm nếu chúng ta muốn nó được căn chỉnh vào trung tâm, + +51 +00:03:29,410 --> 00:03:34,210 +chẳng hạn, và sau đó chúng ta cũng có thể thêm một phông chữ nếu chúng ta cần. + +52 +00:03:34,600 --> 00:03:37,330 +Hãy sử dụng cùng một phông chữ như ở đây, Arial, và sau đó chúng ta sẽ + +53 +00:03:37,660 --> 00:03:39,760 +làm cho kích thước phông chữ lớn hơn một chút, và sau đó + +54 +00:03:39,790 --> 00:03:41,350 +chúng ta sẽ giữ nó như bình thường. + +55 +00:03:42,100 --> 00:03:46,240 +Vì vậy, tôi sẽ chọn một phông chữ Arial, kích thước 24, và sau + +56 +00:03:46,540 --> 00:03:48,700 +đó phong cách sẽ bình thường. + +57 +00:03:50,500 --> 00:03:51,820 +Và như bạn có thể thấy + +58 +00:03:51,820 --> 00:03:56,380 +ở đây, tôi nhận được một cảnh báo ở đây và nó cho tôi biết rằng nó mong đợi một bộ giá trị, + +59 +00:03:56,590 --> 00:03:58,840 +nhưng thay vào đó nó chỉ có một chuỗi duy nhất. + +60 +00:03:59,110 --> 00:04:02,920 +Vì vậy, chúng ta hãy so sánh điều này với mã tài liệu và + +61 +00:04:03,310 --> 00:04:07,690 +bạn có thể thấy rằng điều này có nghĩa là một bộ dữ liệu thay vì + +62 +00:04:07,690 --> 00:04:10,120 +chỉ một đoạn chuỗi. Vì vậy, hãy để tôi tiếp tục và sửa chữa điều đó. + +63 +00:04:10,600 --> 00:04:13,300 +Hãy thêm một số dấu ngoặc đơn xung quanh + +64 +00:04:13,840 --> 00:04:16,839 +điều này, và sau đó Arial này sẽ là một + +65 +00:04:17,140 --> 00:04:21,100 +chuỗi, 24 này sẽ là một số và bình thường sẽ là một chuỗi. + +66 +00:04:21,339 --> 00:04:23,170 +Và bây giờ lỗi của chúng tôi đã biến mất. + +67 +00:04:23,890 --> 00:04:26,770 +Vì vậy, bây giờ trở lại chính của chúng tôi. py hãy tiếp tục + +68 +00:04:27,130 --> 00:04:29,500 +và tạo bảng điểm của chúng ta dưới + +69 +00:04:31,330 --> 00:04:34,630 +dạng một đối tượng từ lớp bảng điểm, điều này tất + +70 +00:04:34,900 --> 00:04:38,290 +nhiên có nghĩa là chúng ta cần nhập nó vào tệp này. + +71 +00:04:38,530 --> 00:04:43,530 +Vì vậy, từ tệp bảng điểm, hãy nhập lớp Bảng điểm. + +72 +00:04:45,220 --> 00:04:48,760 +Và bây giờ nếu tôi chạy đoạn mã này, ở đâu đó + +73 +00:04:48,760 --> 00:04:50,560 +ở giữa tôi có một bảng + +74 +00:04:51,130 --> 00:04:55,540 +điểm, nhưng vì nó thực sự màu đen nên bạn không thể nhìn thấy nó. + +75 +00:04:56,200 --> 00:05:01,200 +Điều thực sự quan trọng là chúng tôi phải thay đổi màu sắc của con rùa trên bảng điểm trước khi + +76 +00:05:02,770 --> 00:05:04,270 +viết văn bản, bởi vì nếu + +77 +00:05:04,510 --> 00:05:08,590 +nó được viết là màu đen và sau đó chúng tôi đổi thành màu trắng, bạn vẫn + +78 +00:05:08,620 --> 00:05:10,330 +sẽ không nhận thấy sự khác biệt. + +79 +00:05:10,780 --> 00:05:15,780 +Vì vậy, nếu tôi thay đổi bản thân. màu ngay tại đây thành màu trắng và tôi nhấn run, sau + +80 +00:05:16,690 --> 00:05:19,000 +đó bạn có thể thấy bảng điểm đó hiển thị. + +81 +00:05:19,270 --> 00:05:23,530 +Nhưng nếu tôi chuyển dòng mã này sang sau khi chúng tôi viết xong, thì nó sẽ không thực + +82 +00:05:23,830 --> 00:05:26,590 +sự tạo ra sự khác biệt. Nó vẫn được viết bằng + +83 +00:05:26,590 --> 00:05:29,770 +màu đen ở đâu đó trên đó. Ngoài ra, bây giờ chúng tôi + +84 +00:05:29,800 --> 00:05:34,800 +muốn loại bỏ con rùa xuất hiện khi chúng tôi tạo bảng điểm bởi vì tất cả những gì chúng tôi muốn nó + +85 +00:05:35,290 --> 00:05:37,990 +làm là chúng tôi muốn nó viết, chúng tôi không muốn nó + +86 +00:05:38,050 --> 00:05:42,850 +thực sự xuất hiện một con rùa. Bản thân. hiddeneturtle, và bây giờ + +87 +00:05:43,210 --> 00:05:45,280 +mũi tên nhỏ đó biến mất. + +88 +00:05:45,790 --> 00:05:49,450 +Và chúng tôi có lẽ không muốn bảng điểm này bị nổ ở giữa. + +89 +00:05:49,540 --> 00:05:51,010 +Vì vậy, hãy di chuyển nó. + +90 +00:05:51,340 --> 00:05:55,510 +Hãy yêu cầu nó chuyển đến một vị trí X và Y cụ thể. + +91 +00:05:56,560 --> 00:06:00,290 +Bây giờ, ví dụ, ở đây, tôi đã đặt nó ở trung tâm, ngay trên cùng. + +92 +00:06:01,130 --> 00:06:05,960 +Vì vậy, chúng ta có thể giữ X là 0, nhưng hãy di chuyển Y lên trên cùng. + +93 +00:06:05,960 --> 00:06:10,700 +Vì vậy, hãy nói điều gì đó xung quanh 270. Và bây giờ nếu chúng tôi kiểm tra lại, bạn + +94 +00:06:10,970 --> 00:06:14,540 +có thể thấy rằng con rùa đã lên đỉnh, nhưng điều này đã xảy ra + +95 +00:06:14,840 --> 00:06:19,490 +sau khi dòng này đã được viết sẵn. Vì vậy, một lần nữa, điều + +96 +00:06:19,520 --> 00:06:22,520 +này cần phải xảy ra trước khi chúng ta viết. + +97 +00:06:23,270 --> 00:06:26,390 +Và bây giờ nếu chúng tôi làm mới, bạn có thể thấy nó được chuyển lên trên cùng, nhưng nó + +98 +00:06:26,840 --> 00:06:30,470 +cũng được vẽ trên một con đường để làm điều đó. Vì vậy, thay vì làm điều + +99 +00:06:30,500 --> 00:06:35,500 +đó, chúng ta có thể nói với chính mình. penup trước khi nó di chuyển đến vị trí này. + +100 +00:06:38,480 --> 00:06:43,250 +Chúng tôi có nó. Chúng tôi đã có điểm số của chúng tôi hiển thị ở đầu. Bây giờ, tất cả những + +101 +00:06:43,250 --> 00:06:48,250 +gì còn lại cần làm là theo dõi điểm số và tăng điểm bất cứ khi nào con rắn + +102 +00:06:48,620 --> 00:06:50,390 +chạm vào một miếng thức ăn mới. + +103 +00:06:51,020 --> 00:06:54,500 +Vì vậy, chúng ta biết rằng điều đó xảy ra bên trong câu lệnh + +104 +00:06:54,860 --> 00:06:59,000 +if này, khi đầu rắn va chạm với thức ăn, sau đó chúng ta làm mới thức + +105 +00:06:59,240 --> 00:07:01,730 +ăn, nhưng chúng ta cũng muốn tăng điểm số. + +106 +00:07:02,330 --> 00:07:07,250 +Vì vậy, chúng ta hãy tiếp tục và tạo một hàm bên trong lớp bảng điểm của chúng + +107 +00:07:07,280 --> 00:07:08,990 +ta có tên là gain_score. + +108 +00:07:09,830 --> 00:07:14,830 +Và chức năng này sẽ tự hoạt động. điểm và thêm một vào nó. + +109 +00:07:17,360 --> 00:07:20,750 +Và sau đó nó sẽ tự gọi. viết. + +110 +00:07:22,220 --> 00:07:24,590 +Vì vậy, bây giờ trở lại bên trong chính của chúng tôi. py, chúng ta có + +111 +00:07:24,920 --> 00:07:29,920 +thể lấy toàn bộ đối tượng trên bảng điểm của mình và yêu cầu nó tăng điểm bất cứ khi + +112 +00:07:30,860 --> 00:07:35,000 +nào con rắn va chạm với thức ăn. Vì vậy, chúng ta hãy kiểm tra điều này một lần nữa. + +113 +00:07:35,660 --> 00:07:39,110 +Và nếu tôi xoay sở để đánh thức ăn, thì + +114 +00:07:42,730 --> 00:07:46,090 +bạn có thể thấy rằng điểm số đang được + +115 +00:07:46,330 --> 00:07:51,330 +cập nhật, nhưng điều đang xảy ra là điểm số đang được viết trên + +116 +00:07:52,210 --> 00:07:55,600 +điểm số trước đó. Vì vậy, tất cả chỉ là chồng chéo với nhau. + +117 +00:07:56,980 --> 00:07:57,940 +Vì vậy, thay + +118 +00:07:57,970 --> 00:08:02,290 +vào đó, những gì chúng ta cần làm là giữa mỗi lần chúng ta cập nhật bảng điểm, + +119 +00:08:02,620 --> 00:08:05,860 +chúng ta thực sự phải xóa những gì đã có trước đó trên đó. + +120 +00:08:06,910 --> 00:08:09,940 +Và vì bây giờ chúng ta có hai dòng này + +121 +00:08:09,970 --> 00:08:12,730 +khá giống nhau ở hai vị trí, hãy tiếp + +122 +00:08:13,240 --> 00:08:17,860 +tục và tạo một hàm thay thế. Chúng tôi sẽ gọi update_scoreboard và bên trong hàm này, chúng + +123 +00:08:19,450 --> 00:08:23,560 +tôi sẽ có bản thân của chúng tôi. viết. + +124 +00:08:28,720 --> 00:08:33,720 +Và chúng ta có thể gọi là tự. update_scoreboard ở đây và cả ở đây. + +125 +00:08:39,880 --> 00:08:44,110 +Vì vậy, bây giờ trước khi chúng tôi tăng điểm số và bảng điểm cập nhật + +126 +00:08:44,440 --> 00:08:49,440 +cuộc gọi, chúng tôi có thể gọi bản thân. rõ ràng để xóa văn bản trước đó đã được viết + +127 +00:08:50,620 --> 00:08:55,090 +bởi con rùa này, đó là bảng điểm. Bây giờ, nếu chúng tôi chạy lại điều + +128 +00:08:55,860 --> 00:08:57,840 +này, bạn có thể thấy rằng khi + +129 +00:08:58,140 --> 00:09:03,000 +tôi ghi điểm, bảng điểm của tôi sẽ bị xóa và sau đó mã văn bản mới được viết. + +130 +00:09:04,380 --> 00:09:07,560 +Vì vậy, nó không trùng lặp với bảng điểm trước đó. + +131 +00:09:08,730 --> 00:09:13,730 +Điều cuối cùng tôi muốn làm chỉ là hoàn thiện là tôi không thích có những đoạn + +132 +00:09:13,830 --> 00:09:18,420 +văn bản được mã hóa cứng này bên trong nội dung chương trình của mình. + +133 +00:09:18,810 --> 00:09:23,810 +Vì vậy, sẽ tốt hơn nhiều nếu chúng ta có thể lấy những đoạn văn bản này ra và + +134 +00:09:24,240 --> 00:09:25,890 +tạo các hằng số với chúng. + +135 +00:09:25,920 --> 00:09:30,920 +Vì vậy, chúng ta có thể có một cái tên là ALIGNMENT được đặt ở trung tâm, và + +136 +00:09:31,230 --> 00:09:33,120 +sau đó một cái khác gọi + +137 +00:09:33,480 --> 00:09:36,240 +là FONT, sẽ được đặt thành bộ tuple này. + +138 +00:09:37,170 --> 00:09:40,350 +Và sau đó tôi có thể sử dụng các hằng số này ở + +139 +00:09:40,350 --> 00:09:45,210 +đây, vì vậy align = ALIGNMENT, font = FONT. Bằng cách đó, khi tôi quyết định rằng tôi muốn thay + +140 +00:09:45,210 --> 00:09:49,380 +đổi điều gì đó về căn chỉnh hoặc phông chữ, vì vậy, chẳng hạn như thay vì Arial, tôi + +141 +00:09:49,620 --> 00:09:51,750 +có thể sử dụng thứ gì đó giống với + +142 +00:09:51,780 --> 00:09:55,350 +loại phông chữ trò chơi điện tử hơn một chút như chuyển phát nhanh, sau đó + +143 +00:09:55,530 --> 00:09:57,420 +tôi không làm ' Tôi không cần phải + +144 +00:09:57,840 --> 00:10:01,560 +tìm hiểu kỹ phần nội dung chương trình của mình để tìm xem nó đã được + +145 +00:10:01,560 --> 00:10:04,170 +định nghĩa ở đâu. Tôi chỉ có thể nhìn vào phần + +146 +00:10:04,350 --> 00:10:09,350 +trên cùng chứa tất cả các hằng số và sau đó sửa nó ngay tại đây. Điều đó không nên thay đổi + +147 +00:10:09,570 --> 00:10:14,570 +bất kỳ chức năng nào. Nó chỉ làm cho bảng điểm của chúng tôi trông giống trò + +148 +00:10:14,880 --> 00:10:18,480 +chơi điện tử hơn một chút và bạn có thể thấy nó hoạt động hoàn hảo như thế nào. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 The-write-method.url b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 The-write-method.url new file mode 100644 index 0000000000000000000000000000000000000000..d3f11987a85a44aff8503497e92f1195bed8ce08 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/005 The-write-method.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/turtle.html#turtle.write \ No newline at end of file diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/006 Detect Collisions with the Wall.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/006 Detect Collisions with the Wall.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..afcd313ba93740bb10eb3f5ac49bcfdf9018e154 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/006 Detect Collisions with the Wall.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ef725ba58c96f4e6c14aeba016ceedb845f537b9b28ebf424a44e33621a53d8 +size 18832860 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/006 Detect Collisions with the Wall_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/006 Detect Collisions with the Wall_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5368b4c213c2c1b2daf7de3edbcf59d168c52050 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/006 Detect Collisions with the Wall_vi.srt @@ -0,0 +1,224 @@ +1 +00:00:00,150 --> 00:00:03,450 +Chúng tôi đã mã hóa phần lớn trò chơi này ngay bây giờ. + +2 +00:00:03,960 --> 00:00:08,960 +Tất cả những gì còn lại cần làm là xác định hai tình huống mà chúng ta có thể kết + +3 +00:00:09,060 --> 00:00:09,893 +thúc trò chơi. + +4 +00:00:10,110 --> 00:00:14,280 +Và đó là phát hiện va chạm với tường và phát hiện va chạm với đuôi. + +5 +00:00:14,730 --> 00:00:18,360 +Vì vậy, hãy giải quyết cái dễ hơn trước. Chúng tôi muốn con rắn + +6 +00:00:18,450 --> 00:00:20,640 +khi nó vượt qua một điểm nhất + +7 +00:00:20,880 --> 00:00:25,800 +định rất gần với bốn bức tường để kích hoạt trò chơi theo trình tự. + +8 +00:00:26,400 --> 00:00:31,400 +Vì vậy, chúng ta biết rằng chúng ta có một màn hình 600 x 600 và trục X và + +9 +00:00:35,340 --> 00:00:37,980 +Y hướng tới 300 và -300 ở cả bốn cạnh. + +10 +00:00:38,520 --> 00:00:42,960 +Vì vậy, nếu chúng ta tạo một hộp ranh giới có nội dung 280 ở đây, + +11 +00:00:42,960 --> 00:00:45,840 +280 ở đây, -280 và -280, sau đó ngay khi + +12 +00:00:46,290 --> 00:00:49,800 +đầu con rắn chạm vào vị trí đó, sau đó khi nó + +13 +00:00:50,160 --> 00:00:52,290 +phóng to qua nó, thì chúng + +14 +00:00:52,410 --> 00:00:56,040 +ta có thể nói rằng con rắn đã trúng khá nhiều. bức tường. + +15 +00:00:56,970 --> 00:00:59,010 +Bây giờ con số này không phải là hoàn hảo, + +16 +00:00:59,040 --> 00:01:02,370 +nó chỉ là những gì tôi thấy có hiệu quả sau khi thực hiện rất nhiều thử nghiệm. + +17 +00:01:02,760 --> 00:01:06,060 +Và đây là trường hợp của rất nhiều trò chơi, bạn phải kiểm tra nó, chạy + +18 +00:01:06,270 --> 00:01:10,950 +nó, xem nó có hoạt động theo cách bạn muốn không. Nhưng hãy tiếp tục và thêm nhận + +19 +00:01:11,010 --> 00:01:13,830 +xét, phát hiện va chạm với tường và tạo câu + +20 +00:01:14,430 --> 00:01:16,140 +lệnh if của chúng tôi. + +21 +00:01:16,440 --> 00:01:21,440 +Vì vậy, những gì chúng tôi muốn nói là nếu con rắn. đầu có tọa độ X lớn hơn + +22 +00:01:26,250 --> 00:01:30,210 +280, vì vậy nó đi quá xa về bên phải hoặc nếu + +23 +00:01:30,690 --> 00:01:35,690 +nó có tọa độ X nhỏ hơn -280, vì vậy nó đã đi quá xa về + +24 +00:01:37,290 --> 00:01:39,150 +bên trái hoặc nếu nó + +25 +00:01:39,840 --> 00:01:43,080 +có tọa độ Y. lớn hơn 280, quá xa so + +26 +00:01:43,290 --> 00:01:47,040 +với đỉnh hoặc nếu nó có tọa độ Y nhỏ hơn + +27 +00:01:47,460 --> 00:01:52,460 +-280 nên nó đã đi quá xa về phía dưới, nếu có bất kỳ tình huống + +28 +00:01:53,580 --> 00:01:58,500 +nào trong bốn trường hợp này xảy ra thì về cơ bản, điều đó có + +29 +00:01:58,560 --> 00:02:01,560 +nghĩa là con rắn đã va phải bức tường. + +30 +00:02:01,980 --> 00:02:05,160 +Vậy điều gì chúng ta muốn xảy ra khi con rắn va vào tường? Chà, chúng tôi muốn + +31 +00:02:05,160 --> 00:02:10,160 +thay đổi game_is_on này thành false vì những gì sẽ cho phép chúng tôi làm là thoát + +32 +00:02:11,070 --> 00:02:14,280 +khỏi vòng lặp while và về cơ bản kết thúc + +33 +00:02:14,610 --> 00:02:17,580 +chuyển động của con rắn và kết thúc trò chơi. + +34 +00:02:18,270 --> 00:02:19,920 +Hãy tiếp tục và kiểm tra điều này. + +35 +00:02:20,040 --> 00:02:24,090 +Vì vậy, hãy để con rắn va vào tường và bạn có thể thấy nó không còn + +36 +00:02:24,090 --> 00:02:28,110 +tiếp tục di chuyển về phía trước. Nhưng đối với người dùng, điều này có thể hơi khó hiểu. + +37 +00:02:28,110 --> 00:02:32,790 +Có vẻ như trò chơi không thực sự kết thúc. Có vẻ như nó vừa bị nghiền nát. + +38 +00:02:33,360 --> 00:02:35,820 +Vì vậy, chúng ta hãy đi vào bảng + +39 +00:02:35,850 --> 00:02:40,380 +điểm của chúng tôi, nó có rất nhiều bài viết và hãy tạo một hàm + +40 +00:02:40,440 --> 00:02:42,510 +mới sẽ được gọi là game_over. + +41 +00:02:43,770 --> 00:02:48,770 +Và chức năng game_over này sẽ chỉ đơn giản là viết một số văn bản, không phải + +42 +00:02:49,260 --> 00:02:51,030 +điểm số, mà thay vào + +43 +00:02:51,030 --> 00:02:56,030 +đó nó sẽ chỉ viết 'GAME OVER' lên màn hình bằng cách sử dụng cùng một + +44 +00:02:56,760 --> 00:03:01,210 +căn chỉnh và cùng một phông chữ. Nhưng thay vì nó ở vị + +45 +00:03:01,210 --> 00:03:03,790 +trí mà chúng ta đã xác định ban đầu + +46 +00:03:04,210 --> 00:03:09,130 +là ngay trên cùng, hãy tiếp tục và đưa nó đến trung tâm, tại (0, 0). + +47 +00:03:09,700 --> 00:03:12,040 +Vì vậy, bây giờ khi con rắn chạm + +48 +00:03:12,370 --> 00:03:14,770 +vào tường, con rắn không chỉ ngừng di chuyển + +49 +00:03:15,040 --> 00:03:19,720 +mà chúng ta còn có được bảng điểm để kích hoạt trò chơi theo một trình tự. + +50 +00:03:20,560 --> 00:03:24,730 +Vì vậy, điều đó có nghĩa là khi nó chạm vào tường, trò chơi kết thúc hiển thị ở + +51 +00:03:24,730 --> 00:03:28,360 +giữa màn hình và bạn vẫn có thể thấy điểm số đã được ghi trước đó + +52 +00:03:28,660 --> 00:03:33,100 +vì chúng tôi không thực sự đánh trúng rõ ràng trước khi chúng tôi viết trò chơi này kết thúc. + +53 +00:03:33,700 --> 00:03:37,720 +Và điều này có nghĩa là người dùng có thể thấy rằng trò chơi đã kết thúc, con rắn đã + +54 +00:03:37,750 --> 00:03:40,570 +ngừng di chuyển và họ có thể thấy điểm số cuối cùng của mình. + +55 +00:03:42,160 --> 00:03:46,780 +Vì vậy, chúng ta hãy cố gắng ghi một số điểm. Và một khi tôi đã làm được điều đó, tôi + +56 +00:03:46,810 --> 00:03:51,550 +sẽ va vào một bức tường và trận đấu kết thúc và tôi có thể thấy rằng điểm của tôi là 2. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/007 Detect Collisions with your own Tail.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/007 Detect Collisions with your own Tail.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f7dbd86d84f02c8764d91a29234f739bf91f7628 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/007 Detect Collisions with your own Tail.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:043c9eec378b168102b9601dce85b1223473aea02121a63ac079e82c6bbf1221 +size 32510618 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/007 Detect Collisions with your own Tail_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/007 Detect Collisions with your own Tail_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8f58a8aab6e070c5cda79906ed026f32a967b524 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/007 Detect Collisions with your own Tail_vi.srt @@ -0,0 +1,368 @@ +1 +00:00:00,660 --> 00:00:03,000 +Được rồi, các bạn, chúng ta đang ở đoạn cuối cùng. + +2 +00:00:03,210 --> 00:00:08,189 +Tất cả những gì chúng ta cần làm bây giờ là tìm cách phát hiện khi con rắn + +3 +00:00:08,400 --> 00:00:12,810 +va chạm với đuôi của chính nó. Khi một con rắn ngày càng dài ra, nhiều khả năng + +4 +00:00:12,900 --> 00:00:17,900 +một lúc nào đó đầu có thể đâm vào phần nào đó của đuôi. Và trong trò chơi rắn, điều này có + +5 +00:00:18,690 --> 00:00:21,150 +nghĩa là trò chơi đã kết thúc. + +6 +00:00:21,480 --> 00:00:25,800 +Vì vậy, chúng tôi phải tìm ra cách chúng tôi có thể phát hiện điều này và sau đó kích hoạt trò + +7 +00:00:25,800 --> 00:00:26,633 +chơi theo trình tự. + +8 +00:00:28,050 --> 00:00:33,050 +Một trong những điều mà chúng tôi để lại cho đến bây giờ là một cách kéo dài + +9 +00:00:34,560 --> 00:00:37,110 +con rắn mỗi khi nó kiếm được thức ăn, + +10 +00:00:37,530 --> 00:00:42,120 +bởi vì hiện tại những gì đang xảy ra là con rắn của chúng tôi vẫn giữ + +11 +00:00:42,150 --> 00:00:46,710 +nguyên kích thước với chỉ ba đoạn. Nhưng bây giờ chúng ta cần thay đổi điều đó. + +12 +00:00:47,100 --> 00:00:52,080 +Chúng ta cần thêm một đoạn vào con rắn mỗi khi nó chạm vào thức ăn để nó phát triển + +13 +00:00:52,080 --> 00:00:56,070 +chiều dài và chúng ta có thể bắt đầu phát hiện va chạm với đuôi. + +14 +00:00:57,420 --> 00:01:00,750 +Nơi chúng ta sẽ làm điều đó là bên trong lớp rắn của chúng ta. + +15 +00:01:01,290 --> 00:01:05,610 +Vì vậy, chúng tôi sẽ tạo một hàm sẽ được gọi là mở rộng. + +16 +00:01:06,540 --> 00:01:11,520 +Và chức năng mở rộng này sẽ thêm một phân đoạn mới cho con rắn. + +17 +00:01:12,660 --> 00:01:14,910 +Vì vậy, chúng ta có thể sẽ + +18 +00:01:14,910 --> 00:01:17,700 +cần một hàm khác, sẽ được gọi là add_segment, + +19 +00:01:18,300 --> 00:01:23,300 +và điều này sẽ yêu cầu vị trí để thêm phân đoạn vào về cơ bản. + +20 +00:01:25,350 --> 00:01:29,340 +Lưu ý rằng đây là một phần của mã nơi chúng tôi thực sự thêm phân đoạn. + +21 +00:01:29,610 --> 00:01:33,780 +Vì vậy, chúng ta hãy lấy nó ra khỏi vòng lặp for và đặt nó vào add_segment. + +22 +00:01:34,650 --> 00:01:39,450 +Và vì vậy bây giờ chúng ta có thể gọi chức năng này, tự. add_segment và sau đó chuyển vào + +23 +00:01:39,570 --> 00:01:42,420 +vị trí mà chúng tôi đang lặp lại. + +24 +00:01:42,990 --> 00:01:46,740 +Hai chức năng này kết hợp với nhau sẽ tạo ra con rắn của chúng ta. + +25 +00:01:47,190 --> 00:01:48,210 +Nhưng ngoài ra, + +26 +00:01:48,240 --> 00:01:52,920 +chúng ta sẽ sử dụng add_segment này khi chúng ta muốn mở rộng con rắn. + +27 +00:01:53,430 --> 00:01:57,690 +Nhưng chúng ta muốn mảnh ghép cuối cùng đó đi đến vị trí nào? Chà, chúng ta sẽ nắm + +28 +00:01:57,720 --> 00:02:02,720 +giữ danh sách các phân đoạn và chúng ta sẽ nắm giữ + +29 +00:02:02,880 --> 00:02:07,080 +phân đoạn cuối cùng. Hãy nhớ rằng với danh sách bằng + +30 +00:02:07,200 --> 00:02:07,950 +Python, bạn + +31 +00:02:07,950 --> 00:02:12,660 +có thể viết một số âm để bạn bắt đầu đếm từ cuối danh sách. + +32 +00:02:13,020 --> 00:02:16,680 +Ví dụ: nếu danh sách của chúng tôi là 1, 2 và + +33 +00:02:17,040 --> 00:02:20,610 +3, thì danh sách này ở vị trí trừ một sẽ là + +34 +00:02:20,840 --> 00:02:21,673 +1: 3. + +35 +00:02:22,880 --> 00:02:23,420 +0: Thực + +36 +00:02:23,420 --> 00:02:27,770 +sự là chúng tôi đang nắm giữ phân khúc cuối cùng trong danh sách của mình và sau đó chúng tôi + +37 +00:02:27,770 --> 00:02:30,620 +sẽ nắm giữ vị trí của nó. Và hãy nhớ rằng, đây + +38 +00:02:30,620 --> 00:02:35,620 +là một phương thức đến từ lớp con rùa và chúng ta có thể gọi nó bằng cách viết vị trí và + +39 +00:02:36,350 --> 00:02:40,250 +sau đó là dấu ngoặc đơn và chúng ta sẽ nhận được vị trí của đoạn đó. + +40 +00:02:40,760 --> 00:02:42,470 +Và sau đó chúng tôi sẽ thêm + +41 +00:02:42,680 --> 00:02:45,410 +phân đoạn mới này vào cùng vị trí với phân đoạn cuối cùng. + +42 +00:02:46,640 --> 00:02:49,670 +Vì vậy, bây giờ nếu bên trong chính của chúng tôi. py mỗi khi + +43 +00:02:50,210 --> 00:02:53,660 +con rắn của chúng ta va chạm với thức ăn, thì + +44 +00:02:53,960 --> 00:02:56,270 +chúng ta không chỉ làm mới thức + +45 +00:02:56,540 --> 00:02:59,830 +ăn mà còn khiến con rắn tự kéo dài ra. + +46 +00:03:00,370 --> 00:03:05,370 +Vì vậy, hãy tiếp tục và chạy lại trò chơi này. Và hãy để ý xem lần này, một khi + +47 +00:03:05,860 --> 00:03:07,870 +tôi đụng phải thức ăn, con rắn + +48 +00:03:08,200 --> 00:03:12,190 +thực sự tự vươn mình ra và mỗi lần như vậy nó lại dài ra. + +49 +00:03:13,030 --> 00:03:18,030 +Vì vậy, bây giờ chúng ta có thể nghĩ về cách phát hiện va chạm đuôi vì + +50 +00:03:18,820 --> 00:03:23,380 +khi con rắn dài ra, va chạm đuôi này càng trở nên khó khăn hơn. + +51 +00:03:23,740 --> 00:03:26,980 +Chúng ta có nhiều khả năng bị rối với cái đuôi của chính mình. + +52 +00:03:28,870 --> 00:03:32,320 +Hãy tiếp tục và thêm một nhận xét ở đây có nội + +53 +00:03:32,380 --> 00:03:37,380 +dung 'Phát hiện va chạm với đuôi. 'Và cách chúng tôi muốn kiểm tra điều + +54 +00:03:39,760 --> 00:03:44,620 +này là chúng tôi muốn nói nếu phần đầu va chạm với bất kỳ đoạn + +55 +00:03:46,330 --> 00:03:48,040 +nào ở phần đuôi, + +56 +00:03:48,490 --> 00:03:53,490 +thì điều này có nghĩa là chúng tôi sẽ kích hoạt trò chơi theo trình tự. + +57 +00:03:56,530 --> 00:04:01,420 +Vậy làm thế nào chúng ta có thể phát hiện ra nếu đầu va chạm với bất kỳ đoạn nào ở đuôi? + +58 +00:04:02,290 --> 00:04:02,650 +Chà, + +59 +00:04:02,650 --> 00:04:07,650 +chúng ta có thể lặp lại danh sách các phân đoạn của chúng ta trong con rắn. + +60 +00:04:08,020 --> 00:04:13,020 +Vì vậy, chúng tôi có thể nói cho phân đoạn ở rắn. các phân đoạn, vì vậy trong số tất + +61 +00:04:14,350 --> 00:04:18,339 +cả các phân đoạn rắn, chúng ta hãy đi qua từng phân đoạn. + +62 +00:04:18,850 --> 00:04:20,800 +Và sau đó chúng ta có + +63 +00:04:21,160 --> 00:04:26,160 +thể nói điều đó tốt, nếu con rắn. đầu có khoảng cách, giả sử, tôi không biết, + +64 +00:04:26,860 --> 00:04:28,090 +nhỏ hơn 10 + +65 +00:04:28,120 --> 00:04:33,120 +so với bất kỳ phân đoạn nào mà chúng ta hiện đang đi qua, có lẽ đó là + +66 +00:04:35,710 --> 00:04:38,890 +một vụ va chạm, phải không? Vì vậy, trong trường + +67 +00:04:38,920 --> 00:04:43,300 +hợp đó, chúng tôi sẽ đặt game_is_on thành false và chúng tôi sẽ lấy + +68 +00:04:43,300 --> 00:04:46,720 +bảng điểm để kích hoạt trò chơi theo trình tự. + +69 +00:04:48,160 --> 00:04:51,970 +Bây giờ chỉ có một vấn đề với điều này. Nếu chúng tôi tiếp tục và chạy mã + +70 +00:04:52,030 --> 00:04:55,570 +như hiện tại, bạn có thể thấy rằng ngay lập tức chúng tôi kết thúc trò chơi. + +71 +00:04:56,140 --> 00:04:59,410 +Và lý do là vì trong số tất cả các phân + +72 +00:04:59,530 --> 00:05:02,230 +đoạn rắn, đầu là phân đoạn đầu tiên. + +73 +00:05:02,620 --> 00:05:05,050 +Vì vậy, khi chúng ta lặp lại từng + +74 +00:05:05,230 --> 00:05:07,750 +phân đoạn, phân đoạn đầu tiên sẽ là đầu rắn. + +75 +00:05:08,080 --> 00:05:11,710 +Và vì vậy chúng tôi đang phát hiện xem đầu rắn có khoảng cách + +76 +00:05:11,710 --> 00:05:15,280 +với đầu rắn nhỏ hơn 10 hay không, tất nhiên là như vậy. + +77 +00:05:15,760 --> 00:05:19,180 +Vì vậy, chúng ta cần một số cách để bỏ qua con cá lóc. + +78 +00:05:19,630 --> 00:05:24,630 +Vì vậy, chúng ta có thể nói nếu phân đoạn hiện tại mà chúng ta đang lặp qua có + +79 +00:05:25,390 --> 00:05:30,370 +bằng, gấp đôi, bằng với con rắn hay không. đầu, tốt, trong trường hợp này, + +80 +00:05:30,400 --> 00:05:35,170 +chúng ta sẽ vượt qua. Nhưng nếu đây không phải là trường hợp, vì + +81 +00:05:35,200 --> 00:05:36,460 +vậy trong elif sau + +82 +00:05:36,820 --> 00:05:41,820 +câu lệnh if, sau đó chúng ta có thể kiểm tra xem đầu rắn có khoảng cách đến đoạn + +83 +00:05:41,980 --> 00:05:45,100 +nhỏ hơn 10 hay không. Bây giờ, nếu chúng tôi chạy + +84 +00:05:46,330 --> 00:05:49,960 +lại mã này, bạn sẽ thấy rằng nó hoạt động chính xác như chúng tôi mong đợi. + +85 +00:05:52,000 --> 00:05:55,810 +Chúng ta có thể di chuyển con rắn của mình xung quanh và ngay sau khi đầu chạm vào cơ + +86 +00:05:56,080 --> 00:05:57,830 +thể, trò chơi kết thúc với chúng ta. + +87 +00:05:59,180 --> 00:06:03,590 +Bây giờ chúng tôi đã hoàn thành khá nhiều trò chơi rắn. Nhưng trong bài học tiếp theo, tôi + +88 +00:06:03,680 --> 00:06:07,310 +muốn nói về một chức năng đặc biệt trong Python được + +89 +00:06:07,340 --> 00:06:08,690 +gọi là cắt. + +90 +00:06:09,200 --> 00:06:12,770 +Và đây là điều mà bạn sẽ thường thấy trong mã nguồn, và chúng tôi sẽ sử dụng điều đó để + +91 +00:06:13,100 --> 00:06:16,640 +cải thiện mã của mình thêm một chút nữa. Vì vậy, cho tất cả những điều đó + +92 +00:06:17,330 --> 00:06:19,310 +và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 Course-Fixes-Report-an-Issue.url b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 How to Slice Lists & Tuples in Python.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 How to Slice Lists & Tuples in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3cdaa30e0945bce7699d992778572d29edbb6136 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 How to Slice Lists & Tuples in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47677b9462736ed15aae76e00839f20ede3973695a2d99b2f855c4519ea18d63 +size 38725907 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 How to Slice Lists & Tuples in Python_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 How to Slice Lists & Tuples in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0d0fcc50429c11b00f860962c7804bcfc7e2e657 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 How to Slice Lists & Tuples in Python_vi.srt @@ -0,0 +1,444 @@ +1 +00:00:00,450 --> 00:00:04,920 +Bây giờ, mặc dù trò chơi rắn của chúng tôi hiện hoạt động với tất cả các chức năng + +2 +00:00:04,920 --> 00:00:05,753 +mà chúng tôi + +3 +00:00:06,000 --> 00:00:11,000 +đã thiết lập để tạo ra, chỉ có một điều khiến tôi hơi phiền về đoạn mã này, và đó là phần + +4 +00:00:11,370 --> 00:00:12,900 +này dài dòng như thế nào. + +5 +00:00:13,350 --> 00:00:18,350 +Tất cả những gì chúng tôi đang cố gắng làm là đảm bảo rằng chúng tôi đang phát hiện khoảng cách từ tất cả các phân + +6 +00:00:19,200 --> 00:00:23,130 +đoạn mà chúng tôi đang lặp lại trong con rắn. phân đoạn khác với phân + +7 +00:00:23,340 --> 00:00:24,810 +đoạn đầu tiên. + +8 +00:00:25,350 --> 00:00:29,400 +Chắc chắn có một cách dễ dàng hơn để làm điều này hơn là viết tất + +9 +00:00:29,400 --> 00:00:34,080 +cả những dòng mã này. Và thực sự là có. Nhưng để sử dụng nó, + +10 +00:00:34,290 --> 00:00:38,520 +chúng ta phải tìm hiểu về một khái niệm Python được gọi là cắt. + +11 +00:00:39,540 --> 00:00:44,540 +Giả sử rằng chúng tôi đã có một danh sách các phím đàn piano từ a đến g + +12 +00:00:46,050 --> 00:00:49,680 +và chúng tôi muốn nắm giữ một phần nhỏ của danh sách này. + +13 +00:00:50,130 --> 00:00:54,270 +Giả sử chúng ta muốn chia nhỏ danh sách để chúng ta chỉ lấy các khóa + +14 +00:00:54,270 --> 00:00:58,620 +c, d và e từ danh sách này. Làm thế nào chúng ta sẽ làm điều đó bằng + +15 +00:00:58,620 --> 00:01:00,390 +cách sử dụng Python? Một cách để + +16 +00:01:00,390 --> 00:01:04,830 +làm điều đó là bạn có thể viết một vòng lặp for và bạn có thể kiểm tra xem nó có phải + +17 +00:01:04,830 --> 00:01:09,300 +là c, có phải là d, có phải là d không. Nếu vậy, hãy thêm nó vào danh sách mới. + +18 +00:01:09,510 --> 00:01:12,690 +Nhưng điều đó thực sự phức tạp. Chúng tôi có một cách tốt + +19 +00:01:12,690 --> 00:01:16,890 +hơn nhiều để làm điều đó bằng Python. Và nó được gọi là cắt lát. + +20 +00:01:17,400 --> 00:01:20,940 +Đây là cú pháp sẽ trông như thế nào. Chúng tôi sẽ nắm giữ các danh + +21 +00:01:21,000 --> 00:01:24,750 +sách của mình, piano_keys và sau đó chúng tôi sẽ sử dụng một tập hợp + +22 +00:01:25,110 --> 00:01:28,980 +các dấu ngoặc vuông, nhưng thay vì chỉ truy cập vào một mục với một vị trí, + +23 +00:01:29,400 --> 00:01:34,400 +chúng tôi nhận được một tập hợp các mục bằng cách cắt nó từ vị trí 2 đến vị trí 5. + +24 +00:01:36,360 --> 00:01:40,770 +Điều này có thể hơi khó hiểu bởi vì chúng ta biết rằng a là vị + +25 +00:01:40,770 --> 00:01:44,220 +trí 0, b là 1, c là 2, nhưng một ở vị + +26 +00:01:44,640 --> 00:01:49,640 +trí 5 thực sự là f, vậy làm thế nào để chúng ta có được c, d và e? + +27 +00:01:52,590 --> 00:01:54,690 +Chà, bạn phải hình dung nó như thế này. + +28 +00:01:55,170 --> 00:02:00,170 +Hãy tưởng tượng rằng vị trí số không thực sự nằm ở đầu danh sách trước + +29 +00:02:00,870 --> 00:02:04,440 +khi vị trí bắt đầu. Và ở cuối danh sách, + +30 +00:02:04,470 --> 00:02:07,350 +chúng tôi thực sự đang ở vị trí cắt 7. + +31 +00:02:08,160 --> 00:02:09,810 +Nếu chúng ta nghĩ về + +32 +00:02:09,870 --> 00:02:14,870 +nó theo cách này, thì cách chúng ta cắt danh sách này sẽ đi từ vị trí 2 + +33 +00:02:15,990 --> 00:02:20,790 +đến vị trí 5 thì tất nhiên, chúng ta sẽ kết thúc với c, d và e. + +34 +00:02:22,020 --> 00:02:24,240 +Nếu bạn xem mã này trong Repl của tôi. nó, về cơ bản + +35 +00:02:24,420 --> 00:02:27,000 +tôi có cùng một mã mà chúng ta đã thấy trong các + +36 +00:02:27,360 --> 00:02:31,890 +trang trình bày và chúng tôi đang cắt danh sách các phím đàn piano này từ vị trí 2 đến 5. + +37 +00:02:32,370 --> 00:02:35,790 +Khi tôi nhấn run, bạn sẽ thấy rằng những gì được in ra là c, d và + +38 +00:02:35,790 --> 00:02:40,320 +e, chính xác là lát cắt mà chúng ta muốn. Bây giờ, có những thứ khác mà bạn có thể + +39 +00:02:40,350 --> 00:02:43,890 +làm với việc cắt lát khá tuyệt. Vì vậy, ví dụ: nếu + +40 +00:02:43,890 --> 00:02:47,130 +bạn muốn cắt từ vị trí 2, điều cần nhớ là + +41 +00:02:47,160 --> 00:02:48,660 +ở ngay đây bởi + +42 +00:02:48,750 --> 00:02:52,560 +vì chúng tôi đang bắt đầu từ 0, 1 và 2 và + +43 +00:02:52,890 --> 00:02:56,430 +bạn muốn cắt nó đến cuối danh sách, à, bạn chỉ + +44 +00:02:56,430 --> 00:03:00,820 +có thể phát ra số thứ hai. Bạn có thể có hai và sau đó là dấu hai chấm. + +45 +00:03:01,330 --> 00:03:04,840 +Bây giờ, khi bạn cắt phần này, bạn sẽ nhận được tất cả phần còn lại của + +46 +00:03:05,050 --> 00:03:07,840 +danh sách bắt đầu từ vị trí mà bạn đã chỉ định. + +47 +00:03:08,500 --> 00:03:10,900 +Và điều này cũng hoạt động theo hướng ngược lại. + +48 +00:03:11,320 --> 00:03:15,790 +Giả sử rằng chúng tôi muốn nắm giữ mọi thứ ở vị trí số 5. Chà, chúng ta có thể bỏ + +49 +00:03:15,790 --> 00:03:18,850 +qua số đầu tiên, thêm dấu hai chấm, rồi + +50 +00:03:19,030 --> 00:03:22,510 +sau dấu hai chấm chỉ định vị trí lát kết thúc. + +51 +00:03:22,900 --> 00:03:27,700 +Và bây giờ chúng tôi nhận được tất cả các mục trong danh sách cho đến vị trí 5 đó. + +52 +00:03:28,900 --> 00:03:32,830 +Ngoài việc chỉ cắt giữa hai số, chúng ta thực sự + +53 +00:03:33,100 --> 00:03:37,630 +có thể chỉ định một số thứ ba sau dấu hai chấm khác. + +54 +00:03:38,290 --> 00:03:42,790 +Và những gì con số này làm là nó thiết lập gia số. Ví dụ: chúng tôi muốn + +55 +00:03:42,790 --> 00:03:46,780 +lát cắt từ vị trí 2 đến vị trí 5, + +56 +00:03:47,080 --> 00:03:50,800 +nhưng chúng tôi chỉ muốn nhận mỗi mục khác. + +57 +00:03:51,190 --> 00:03:54,580 +Vì vậy, sau đó nó sẽ cho c, nó sẽ bỏ qua cái thứ hai, + +58 +00:03:54,670 --> 00:03:59,050 +và sau đó nó sẽ cho chúng ta e. Và nếu tôi nhấn run, đây chính xác là những gì bạn thấy. + +59 +00:04:00,460 --> 00:04:04,000 +Vì vậy, giả sử tôi muốn nắm giữ mọi thứ trong danh sách + +60 +00:04:04,450 --> 00:04:09,400 +này nhưng tôi muốn từng mục thứ hai. Vậy thì đây là mã của tôi trông + +61 +00:04:09,430 --> 00:04:13,900 +như thế nào, hãy đi từ đầu đến cuối và sau đó bỏ qua từng giây một. + +62 +00:04:14,590 --> 00:04:17,140 +Và tôi kết thúc bằng a, c, e, và g. + +63 +00:04:18,430 --> 00:04:21,250 +Bây giờ để mở rộng điều này xa hơn một chút, + +64 +00:04:21,640 --> 00:04:26,640 +chúng ta thực sự có thể sử dụng thủ thuật đơn giản này để chỉ định -1 làm gia số + +65 +00:04:27,430 --> 00:04:32,430 +và điều này thực sự là nó sẽ thực sự đảo ngược danh sách này để chúng ta đi + +66 +00:04:33,040 --> 00:04:37,300 +từ phải đến cuối cho đến đầu. Vì vậy, về cơ bản các gia số là bằng một, + +67 +00:04:37,540 --> 00:04:41,710 +nhưng nó bằng -1, vì vậy, theo cách đó chúng tôi nhận được danh sách bắt đầu từ cuối tất cả + +68 +00:04:41,950 --> 00:04:43,210 +các cách trở lại đầu. + +69 +00:04:43,630 --> 00:04:47,020 +Và đây là một thủ thuật thực sự gọn gàng mà bạn sẽ thấy rất nhiều người sử dụng + +70 +00:04:47,020 --> 00:04:51,310 +khi nói đến thao tác với danh sách và bộ giá trị. Vì vậy, nói về bộ giá + +71 +00:04:51,490 --> 00:04:55,810 +trị, phương pháp cắt này cũng hoạt động đối với bộ giá trị. + +72 +00:04:56,320 --> 00:04:58,540 +Vì vậy, giả sử chúng ta có một tuple + +73 +00:04:58,570 --> 00:05:03,570 +piano, bộ nhớ này được xác định bởi một tập hợp các dấu ngoặc đơn với các mục bên trong được phân + +74 +00:05:04,120 --> 00:05:06,220 +tách bằng dấu phẩy. Chà, chúng ta + +75 +00:05:06,220 --> 00:05:10,780 +có thể sử dụng cùng một phương pháp cắt để làm việc với bộ tuple của chúng ta. + +76 +00:05:11,140 --> 00:05:12,880 +Vì vậy, chúng tôi sử dụng + +77 +00:05:13,180 --> 00:05:17,230 +dấu ngoặc vuông của chúng tôi, hãy nắm giữ các mục từ phần 2 đến phần 5. + +78 +00:05:17,530 --> 00:05:20,920 +Sau đó, khi chúng ta nhấn run, bạn sẽ thấy nó cung cấp cho chúng ta mi, fa, vậy. + +79 +00:05:20,920 --> 00:05:25,330 +Vì vậy, quay lại mã của chúng tôi, tôi có một thách thức cho bạn. + +80 +00:05:25,330 --> 00:05:30,330 +Bạn có thể tìm ra cách sử dụng những gì chúng ta vừa học về cách + +81 +00:05:30,610 --> 00:05:33,850 +cắt lát để thay đổi mã này để chúng ta + +82 +00:05:33,850 --> 00:05:38,850 +loại bỏ câu lệnh if này khi chúng ta chuyển qua đầu rắn để trên thực + +83 +00:05:39,430 --> 00:05:44,430 +tế chúng ta chỉ kiểm tra xem đầu rắn có Khoảng cách đến mọi đoạn khác + +84 +00:05:45,040 --> 00:05:49,870 +với đoạn thứ nhất nhỏ hơn 10? Nếu bạn đã quản lý thành công để thực hiện điều + +85 +00:05:49,900 --> 00:05:51,340 +này, bạn sẽ có thể loại + +86 +00:05:51,340 --> 00:05:56,340 +bỏ câu lệnh if này, thay đổi điều này thành một câu lệnh if duy nhất và bằng cách nào đó tìm ra + +87 +00:05:57,590 --> 00:06:02,590 +cách làm cho mã này hoạt động bằng cách sử dụng cắt. Tạm dừng video và tiếp tục. + +88 +00:06:05,680 --> 00:06:06,130 +Được rồi, + +89 +00:06:06,130 --> 00:06:11,130 +vì vậy chúng tôi biết rằng chúng tôi muốn lặp lại mọi phân đoạn trong con rắn. phân đoạn khác với phân + +90 +00:06:11,530 --> 00:06:14,560 +đoạn đầu tiên. Tất cả những gì chúng ta cần + +91 +00:06:15,010 --> 00:06:20,010 +làm chỉ đơn giản là chia nhỏ danh sách các phân đoạn này. Vì vậy, chúng ta có + +92 +00:06:21,640 --> 00:06:26,290 +thể nắm bắt mọi thứ bắt đầu từ vị trí 1 + +93 +00:06:26,620 --> 00:06:29,350 +đến cuối, bằng cách viết 1: nothing. + +94 +00:06:29,860 --> 00:06:34,860 +Điều này sẽ cung cấp cho chúng tôi mọi thứ bên trong danh sách khác với mục đầu tiên, + +95 +00:06:35,740 --> 00:06:36,573 +giống như vậy. + +96 +00:06:37,150 --> 00:06:42,150 +Và sau đó chúng ta có thể sử dụng đoạn đó để lặp qua nó và sau đó kiểm tra mọi đoạn ở + +97 +00:06:42,490 --> 00:06:46,840 +phần đuôi so với khoảng cách đến phần đầu. Và bây giờ khi bạn chạy mã, bạn + +98 +00:06:47,080 --> 00:06:50,440 +có thể thấy rằng nó hoạt động hoàn hảo như trước đây, nhưng + +99 +00:06:51,400 --> 00:06:56,400 +hiện tại chúng tôi đã đơn giản hóa rất nhiều mã của mình bằng cách sử dụng sức mạnh + +100 +00:06:56,860 --> 00:06:57,693 +của Python. + +101 +00:06:58,600 --> 00:07:03,160 +Chúc bạn vui vẻ với trò chơi rắn của bạn và nhớ cho tôi biết điểm cao nhất của bạn + +102 +00:07:03,160 --> 00:07:05,500 +vì tôi dường như không thể vượt qua điểm 10. + +103 +00:07:05,890 --> 00:07:09,280 +Và bạn đã thấy khá nhiều trong hướng dẫn này rằng tôi tệ như thế nào trong trò chơi này, nhưng + +104 +00:07:09,580 --> 00:07:13,450 +tôi chắc chắn rằng bạn có thể làm tốt hơn nhiều. Và trên hết, hãy nghĩ về + +105 +00:07:13,480 --> 00:07:17,200 +những cách bạn có thể muốn tùy chỉnh trò chơi rắn của mình. + +106 +00:07:17,530 --> 00:07:21,370 +Có thể bạn muốn thay đổi thức ăn để có màu sắc khác hoặc hình dạng + +107 +00:07:21,370 --> 00:07:25,210 +khác, có thể con rắn của bạn đang thực sự ăn thịt rùa, tôi không biết. + +108 +00:07:25,420 --> 00:07:27,220 +Thế giới trong tầm tay bạn. + +109 +00:07:27,430 --> 00:07:30,760 +Bây giờ bạn đã học về rất nhiều khái niệm khác trong + +110 +00:07:31,000 --> 00:07:35,620 +Lập trình bao gồm kế thừa trong OOP cũng như danh sách và bộ giá trị cắt. + +111 +00:07:36,490 --> 00:07:40,180 +Vì vậy, tôi hy vọng bạn đã vui vẻ khi xây dựng trò chơi này và tôi sẽ gặp lại bạn vào ngày mai. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 Piano-Keys-List-Slicing-Repl.it.url b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 Piano-Keys-List-Slicing-Repl.it.url new file mode 100644 index 0000000000000000000000000000000000000000..322019fca51887349d5753fd44e91ce43d89df7e --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 Piano-Keys-List-Slicing-Repl.it.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/slicing \ No newline at end of file diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 snake-game-part-2-final.zip b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 snake-game-part-2-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..05d6a9f893877d1dc05961890c392f87c282d4ba --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/008 snake-game-part-2-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9048cd1458094e4aede3de3f38c37b9543f9c8175896b3b4dc1c2d61bf28c7d5 +size 1931 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/009 Stay motivated by remembering the reason you signed up.mp4 b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/009 Stay motivated by remembering the reason you signed up.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..263ea5b955ac30a6d67c4b5206633a11d3e6b9d1 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/009 Stay motivated by remembering the reason you signed up.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87c670b382f0caba5a409f17af89922081449ee931b48f1aedec422ac49a5eb4 +size 39734441 diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/009 Stay motivated by remembering the reason you signed up_vi.srt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/009 Stay motivated by remembering the reason you signed up_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2809b93c20261dec92be9f6c2e7a99d30268ddfc --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/009 Stay motivated by remembering the reason you signed up_vi.srt @@ -0,0 +1,88 @@ +1 +00:00:00,480 --> 00:00:09,210 +Này, hoàn thành tốt ngày 21. Bây giờ bạn đang đi đến điểm của khóa học mà bạn sẽ phải bắt + +2 +00:00:09,210 --> 00:00:15,870 +đầu mang lại thêm một số động lực cho chính mình, bởi vì khi chúng ta trải qua điều này, đây là một + +3 +00:00:15,870 --> 00:00:16,770 +cuộc đua marathon. + +4 +00:00:16,860 --> 00:00:17,900 +Nó không phải là một cuộc chạy nước rút. + +5 +00:00:18,330 --> 00:00:21,540 +Nếu đó là một khóa học năm giờ, bạn có thể vượt qua nó trong một ngày. + +6 +00:00:21,780 --> 00:00:24,720 +Nhưng đó không phải là cách chúng tôi trở thành nhà phát triển Python. + +7 +00:00:25,200 --> 00:00:29,140 +Đó là một cuộc chạy marathon và sự hiểu biết sẽ là chìa khóa. + +8 +00:00:29,940 --> 00:00:36,780 +Vì vậy, những gì tôi cần bạn làm là suy nghĩ về tất cả các lý do tại sao bạn phải làm điều này. + +9 +00:00:37,110 --> 00:00:38,670 +Bạn phải nhận được đòn bẩy. + +10 +00:00:38,790 --> 00:00:42,570 +Bạn phải nghĩ xem tại sao tôi lại muốn đạt được mục tiêu này? + +11 +00:00:42,570 --> 00:00:45,200 +Tại sao tôi muốn trở thành nhà phát triển python? + +12 +00:00:45,480 --> 00:00:48,180 +Tại sao tôi muốn hoàn thành 100 ngày? + +13 +00:00:48,630 --> 00:00:55,890 +Và những lý do có thể là những thứ như tôi muốn có thể mang lại một tương lai tốt đẹp hơn cho gia đình mình, hoặc cũng có thể là + +14 +00:00:55,890 --> 00:01:00,420 +vì tôi thực sự muốn xây dựng dự án này và tôi muốn nó tồn tại rất nhiều. + +15 +00:01:00,810 --> 00:01:02,640 +Đó là nó cho tôi, dù sao. + +16 +00:01:02,940 --> 00:01:09,480 +Khi tôi mới bắt đầu học viết mã, đó là bởi vì tôi chỉ có ý tưởng này và nó phải tồn tại, nó phải + +17 +00:01:09,480 --> 00:01:10,500 +được xây dựng. + +18 +00:01:11,160 --> 00:01:16,890 +Vì vậy, không quan trọng tôi phải trải qua những khó khăn gì, tôi cần phải vượt qua những rào cản + +19 +00:01:16,890 --> 00:01:18,780 +nào, tôi cần phải học bao + +20 +00:01:19,140 --> 00:01:26,250 +nhiêu bài học về lập trình, tôi đã có thể tự động viên mình vì tôi biết mình muốn gì ở cuối con đường đó. . + +21 +00:01:26,730 --> 00:01:36,330 +Vì vậy, hãy tập trung vào những gì dành cho bạn. Hãy nghĩ về mục tiêu đó là gì và bạn muốn nó đến mức nào, và nghĩ + +22 +00:01:36,330 --> 00:01:42,240 +lại về điều đó mỗi khi bạn bắt đầu hành trình này để tiếp tục tạo động lực cho bản thân. + diff --git a/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/external-links.txt b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..506e50215b1693448308d95fbed7b3798699e5f8 --- /dev/null +++ b/part2/21 - Day 21 - Intermediate - Build the Snake Game Part 2 Inheritance & List Slicing/external-links.txt @@ -0,0 +1,15 @@ + +002 Inheritance-Repl.it-Example-Code +https://repl.it/@appbrewery/Class-Inheritance + +004 The-shape-and-shapesize-methods +https://docs.python.org/3/library/turtle.html#turtle.shape + +005 The-write-method +https://docs.python.org/3/library/turtle.html#turtle.write + +008 Piano-Keys-List-Slicing-Repl.it +https://repl.it/@appbrewery/slicing + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/001 Day 22 Goals what you will make by the end of the day.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/001 Day 22 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4bfd730746a4ece62c8670501a9608d6c38981ec --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/001 Day 22 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9a86e19fe26158b91638721adbd6f63d977f8793b83a4cbfd4574dded2c3288 +size 11515363 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/001 Day 22 Goals what you will make by the end of the day_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/001 Day 22 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f21e09229c9c4e8c4c937bfe8f5d6f7036c19ea6 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/001 Day 22 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,180 --> 00:00:05,160 +Xin chào các bạn, chào mừng đến với Ngày 22 của 100 Ngày viết mã. Hôm nay chúng ta sẽ xây dựng trò chơi bóng + +2 +00:00:05,160 --> 00:00:07,170 +bàn nổi tiếng, và bạn sẽ làm điều + +3 +00:00:07,770 --> 00:00:11,610 +này bằng cách sử dụng tất cả các kỹ năng mà bạn đã học được cho + +4 +00:00:11,700 --> 00:00:12,533 +đến bây giờ. + +5 +00:00:13,440 --> 00:00:16,800 +Pong là một trò chơi arcade cổ điển, có lẽ là một + +6 +00:00:17,310 --> 00:00:20,040 +trong những trò chơi arcade đầu tiên từng có. + +7 +00:00:20,670 --> 00:00:25,050 +Và nó có một tiền đề thực sự đơn giản. Về cơ bản nó chỉ là một + +8 +00:00:25,050 --> 00:00:29,760 +quả bóng đi ngang qua bàn và hai người chơi mỗi người điều khiển một mái chèo + +9 +00:00:29,970 --> 00:00:33,240 +ném quả bóng qua lại. Nếu bạn bỏ lỡ bóng, + +10 +00:00:33,300 --> 00:00:35,010 +thì người chơi khác ghi điểm. + +11 +00:00:36,000 --> 00:00:39,180 +Bây giờ lịch sử của bóng bàn tự nó đã rất hấp dẫn. + +12 +00:00:39,570 --> 00:00:43,350 +Nó được tạo ra và viết bởi anh chàng này, Allan Alcorn. + +13 +00:00:43,860 --> 00:00:47,760 +Và anh ấy là một nhân viên mới được tuyển dụng vào công ty Atari. + +14 +00:00:48,450 --> 00:00:50,520 +Và để kiểm tra kỹ năng của anh ấy, + +15 +00:00:50,550 --> 00:00:53,580 +họ đã quyết định để anh ấy tạo ra một trò chơi, từ đầu. + +16 +00:00:54,180 --> 00:00:56,700 +Và trò chơi này tình cờ trở thành trò chơi pong, đã + +17 +00:00:57,090 --> 00:01:02,090 +trở thành một thành công vang dội khi bán được vô số máy và vô số máy ở khắp các quán bar và quán + +18 +00:01:02,160 --> 00:01:03,060 +rượu trên thế giới. + +19 +00:01:03,600 --> 00:01:08,600 +Cuối cùng, nó đã trở nên thành công đến nỗi rất nhiều chủ quán bar này đã gọi + +20 +00:01:08,700 --> 00:01:13,110 +điện cho Atari nói rằng: Này, máy của bạn sẽ phanh chỉ sau vài ngày. + +21 +00:01:13,560 --> 00:01:17,790 +Và lý do khi họ điều tra là vì máy + +22 +00:01:17,790 --> 00:01:19,740 +móc chứa đầy tiền. + +23 +00:01:20,010 --> 00:01:24,690 +Mọi người đang tập trung để chơi bóng bàn và máy + +24 +00:01:24,720 --> 00:01:26,100 +đầy quá nhanh. + +25 +00:01:26,430 --> 00:01:30,870 +Vì vậy, đây là trò chơi huyền thoại mà chúng tôi sẽ xây dựng ngày hôm nay. Theo cách, bước đầu + +26 +00:01:30,930 --> 00:01:33,390 +tiên là phân tích vấn đề. + +27 +00:01:33,840 --> 00:01:35,640 +Và tôi muốn bạn bắt tay + +28 +00:01:35,670 --> 00:01:40,140 +vào việc này, hãy nghĩ xem bạn sẽ chơi trò chơi bóng bàn này như thế nào + +29 +00:01:40,590 --> 00:01:45,480 +mà bạn đã thấy ở đây, và thành phần nào chúng ta sẽ cần viết mã, thành phần nào + +30 +00:01:45,480 --> 00:01:47,430 +có thể phù hợp tốt trong lớp riêng + +31 +00:01:47,760 --> 00:01:52,740 +của nó, và làm thế nào chúng ta có thể phá vỡ logic của trò chơi này để chúng ta + +32 +00:01:52,740 --> 00:01:56,910 +có thể giải quyết nó từng phần một. Bây giờ, tôi muốn bạn lấy một tờ + +33 +00:01:57,000 --> 00:02:02,000 +giấy, hãy nhìn vào màn hình trò chơi ngay tại đây và ghi chú lại những thành phần nào bạn nghĩ + +34 +00:02:02,310 --> 00:02:06,990 +có thể được tách thành các lớp riêng của chúng. Tóm lại, tạm dừng video và ghi lại + +35 +00:02:06,990 --> 00:02:11,280 +một số ghi chú về cách bạn có thể cấu trúc mã cho trò + +36 +00:02:11,280 --> 00:02:12,113 +chơi này. + +37 +00:02:15,080 --> 00:02:18,860 +Bây giờ tôi đã chia hướng dẫn này thành tám phần. + +38 +00:02:19,340 --> 00:02:22,910 +Giữ một mảnh giấy để viết tay trong suốt ngày hôm nay để bạn có thể so sánh + +39 +00:02:22,910 --> 00:02:24,770 +cấu trúc của bạn với giải pháp mẫu. + +40 +00:02:25,520 --> 00:02:28,430 +Pong là một trò chơi phức tạp hơn nhiều so với rắn. + +41 +00:02:28,580 --> 00:02:33,050 +Vì vậy, dừng lại để suy nghĩ về cấu trúc của mã ngay bây giờ sẽ giúp bạn nhiều + +42 +00:02:33,260 --> 00:02:37,310 +hơn trong các bài học sắp tới và nó sẽ giúp bạn dễ dàng hơn để + +43 +00:02:37,310 --> 00:02:41,900 +thấy mọi thứ khớp với nhau như thế nào. Đầu tiên, chúng ta sẽ tìm hiểu cách tạo + +44 +00:02:42,230 --> 00:02:46,400 +màn hình, cách tạo và di chuyển một vũng nước, sau đó tạo một vũng nước + +45 +00:02:46,400 --> 00:02:50,840 +khác để chúng ta có thể có trò chơi hai người chơi, sau đó tạo quả bóng + +46 +00:02:50,900 --> 00:02:55,520 +và làm cho nó di chuyển liên tục trên màn hình và tìm ra thời điểm nó va + +47 +00:02:55,520 --> 00:03:00,160 +chạm với tường và làm nó bật trở lại, sau đó phát hiện khi có va chạm với mái + +48 +00:03:00,160 --> 00:03:04,510 +chèo để biết khi nào cần bật lại. Cuối cùng, chúng tôi sẽ tìm ra khi một + +49 +00:03:04,780 --> 00:03:09,370 +người dùng ghi bàn, khi mái chèo trượt bóng và chúng tôi sẽ giữ nguyên điểm số + +50 +00:03:09,400 --> 00:03:13,150 +bằng bảng điểm như trước đây. Bây giờ, nếu bạn cảm thấy thực + +51 +00:03:13,510 --> 00:03:16,240 +sự tự tin, trên thực tế, bạn có thể chỉ cần + +52 +00:03:16,510 --> 00:03:21,040 +tạo một dự án trống, thực hiện từng bước một và xem liệu bạn có thể tự viết mã + +53 +00:03:21,040 --> 00:03:23,860 +trò chơi này hay không. Nhưng điều tôi + +54 +00:03:23,890 --> 00:03:28,810 +khuyên bạn nên xem xét các video và tôi sẽ giải thích từng vấn + +55 +00:03:28,810 --> 00:03:32,560 +đề một và bạn có thể cùng tôi xây dựng nó. + +56 +00:03:33,070 --> 00:03:35,050 +Vì vậy, nếu bạn quyết định học theo tôi, + +57 +00:03:35,200 --> 00:03:37,630 +hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu. + +58 +00:03:38,050 --> 00:03:40,120 +Nếu bạn quyết định tạo mọi thứ từ đầu, + +59 +00:03:40,360 --> 00:03:43,510 +thì hãy tạm dừng video và bắt đầu tạo trò chơi ngay bây giờ. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/002 Set up the Main Screen.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/002 Set up the Main Screen.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0ecd0d49d9d719a6bc12560c3e60ad73923e5a6f --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/002 Set up the Main Screen.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:381ae2767d4a418a143a5503c5e50249ac436ba92a88b9f574075fdecb862fb2 +size 6829034 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/002 Set up the Main Screen_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/002 Set up the Main Screen_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5cdc800c5d253d3fa14de2b8fd245d825a56a3e4 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/002 Set up the Main Screen_vi.srt @@ -0,0 +1,96 @@ +1 +00:00:00,450 --> 00:00:02,430 +Thử thách đầu tiên khá đơn giản. + +2 +00:00:02,460 --> 00:00:04,740 +Chúng tôi sẽ chỉ tạo màn hình bắt đầu. + +3 +00:00:05,160 --> 00:00:10,160 +Đó sẽ là một màn hình có chiều cao 600 pixel và + +4 +00:00:10,950 --> 00:00:14,880 +chiều rộng 800 pixel. Nó phải là màu đen về màu nền + +5 +00:00:15,300 --> 00:00:18,510 +và nó sẽ ở trên màn hình cho đến khi chúng ta nhấp vào nó. + +6 +00:00:18,930 --> 00:00:20,790 +Vì vậy, sử dụng những gì bạn đã học cho + +7 +00:00:20,910 --> 00:00:24,000 +đến nay, hãy tiếp tục và thiết lập mã bắt đầu cho dự án của chúng tôi. + +8 +00:00:27,140 --> 00:00:31,520 +Được rồi. Vì vậy, tôi đã tạo một dự án hoàn toàn mới mà tôi gọi là trò chơi bóng bàn, và + +9 +00:00:31,940 --> 00:00:34,580 +tôi đã tạo một dự án chính. py Bây giờ, điều + +10 +00:00:34,610 --> 00:00:39,610 +đầu tiên tôi sẽ làm là nhập một màn hình từ mô-đun + +11 +00:00:39,830 --> 00:00:40,663 +rùa. + +12 +00:00:42,860 --> 00:00:46,790 +Và sau đó tôi sẽ tạo một đối tượng màn hình từ lớp Màn + +13 +00:00:47,180 --> 00:00:50,780 +hình, và sau đó tôi sẽ đặt màu nền thành màu đen. + +14 +00:00:51,560 --> 00:00:56,560 +Và sau đó, tất nhiên, chúng ta sẽ cần thiết lập màn hình để + +15 +00:00:57,650 --> 00:01:02,180 +nó có chiều rộng là 800 và chiều cao là 600. + +16 +00:01:04,099 --> 00:01:07,090 +Vì vậy, bây giờ nếu tôi chạy mã này như cũ, bạn + +17 +00:01:11,270 --> 00:01:13,940 +sẽ thấy rằng nó nhấp nháy và nó biến mất. + +18 +00:01:13,970 --> 00:01:17,030 +Vì vậy, tất nhiên chúng ta cần phương thức exitonclick đó. + +19 +00:01:17,030 --> 00:01:21,140 +Cũng như một lần hoàn thiện cuối cùng, đây là hoàn toàn không bắt + +20 +00:01:21,380 --> 00:01:23,630 +buộc nhưng nó giúp xác định chương + +21 +00:01:23,750 --> 00:01:27,800 +trình, chúng ta có thể thay đổi tiêu đề màn hình thành Pong. + +22 +00:01:28,730 --> 00:01:33,320 +Và bây giờ khi tôi chạy mã, bạn có thể thấy rằng cửa sổ này hiện có nội dung là pong. + +23 +00:01:34,880 --> 00:01:38,150 +Vì vậy, bây giờ chúng tôi có màn hình 800 x 600 và bây giờ + +24 +00:01:38,510 --> 00:01:43,040 +chúng tôi đã sẵn sàng để đi đến bước tiếp theo, nơi chúng tôi tạo ra các mái chèo của mình. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/003 Create a Paddle that responds to Key Presses.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/003 Create a Paddle that responds to Key Presses.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c11206065266e60536ebbc97f4b6afe674082a4f --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/003 Create a Paddle that responds to Key Presses.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b3c31f6631dc69d91b71326217a25b8fd182db32350b0a7a2378a0e009d4546 +size 35720128 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/003 Create a Paddle that responds to Key Presses_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/003 Create a Paddle that responds to Key Presses_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4d84588b51c78432df52b6e7f2096053dc7e4272 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/003 Create a Paddle that responds to Key Presses_vi.srt @@ -0,0 +1,368 @@ +1 +00:00:00,270 --> 00:00:04,830 +Vì vậy, bây giờ chúng tôi đã tạo xong màn hình, chúng tôi đã sẵn sàng tiếp tục tạo và di chuyển + +2 +00:00:04,830 --> 00:00:06,180 +một vũng nước. Vì vậy, + +3 +00:00:06,180 --> 00:00:09,180 +mái chèo mà chúng ta sẽ tạo ra sẽ nằm ở phía bên phải. + +4 +00:00:09,480 --> 00:00:11,250 +Nó sẽ có chiều rộng + +5 +00:00:11,310 --> 00:00:16,309 +là 20, chiều cao là 100 và được định vị ở 350 pixel trên trục X và + +6 +00:00:19,380 --> 00:00:23,280 +sau đó là 0 trên trục Y. Vì vậy, đây là kiểu định vị mà chúng tôi đang tìm kiếm. + +7 +00:00:24,000 --> 00:00:25,080 +Ngoài ra, chúng + +8 +00:00:25,110 --> 00:00:29,520 +ta sẽ có thể nhấn các phím lên và xuống trên bàn phím để di chuyển paddle. + +9 +00:00:30,030 --> 00:00:34,080 +Mỗi lần nhấn phím sẽ di chuyển paddle lên hoặc xuống 20 pixel. + +10 +00:00:34,740 --> 00:00:38,850 +Hãy suy nghĩ về cách bạn có thể tạo mã cho điều này và tạm dừng video + +11 +00:00:38,940 --> 00:00:40,290 +và hoàn thành thử thách. + +12 +00:00:44,190 --> 00:00:48,540 +Được rồi. Vì vậy, để tạo ra mái chèo này, nó sẽ được tạo ra như một con rùa. + +13 +00:00:48,780 --> 00:00:53,780 +Vì vậy, hãy tiếp tục và tạo mái chèo của chúng ta từ lớp rùa và tôi + +14 +00:00:54,600 --> 00:00:57,690 +sẽ thiết lập hình dạng mái chèo thành hình vuông. + +15 +00:00:59,580 --> 00:01:04,530 +Để kéo dài nó sao cho nó có kích thước 20 x 100 pixel, hãy + +16 +00:01:04,920 --> 00:01:09,920 +nhớ rằng tất cả các con rùa đều bắt đầu bằng 20 x 20, điều đó + +17 +00:01:10,320 --> 00:01:12,540 +có nghĩa là theo chiều rộng, + +18 +00:01:12,570 --> 00:01:17,570 +chúng ta phải kéo nó ra năm và về chiều dài, chúng ta để nó như + +19 +00:01:18,450 --> 00:01:21,120 +cũ để làm cho nó 100 x 20. + +20 +00:01:21,870 --> 00:01:24,840 +Vì vậy, chúng ta hãy tiếp tục và trốn lên mái chèo. định hình, đó là những + +21 +00:01:25,290 --> 00:01:30,030 +gì chúng tôi đã sử dụng cho đến nay. Và sau đó về chiều rộng + +22 +00:01:30,090 --> 00:01:35,040 +kéo dài, chúng tôi sẽ làm cho năm. Và sau đó độ dài đoạn sẽ là một. + +23 +00:01:35,730 --> 00:01:40,320 +Bây giờ chúng ta phải đảm bảo rằng paddle của chúng ta có màu trắng để nó thực sự có + +24 +00:01:40,380 --> 00:01:45,380 +thể nhìn thấy khi chúng ta chạy mã của mình. Và bạn có thể thấy nó ở đó, có mái + +25 +00:01:46,950 --> 00:01:49,650 +chèo của chúng tôi. Và như mọi khi, + +26 +00:01:49,740 --> 00:01:53,370 +nó được khởi tạo ở trung tâm tại tọa độ (0, 0). + +27 +00:01:53,910 --> 00:01:57,030 +Vì vậy, để di chuyển nó đến vị trí chúng + +28 +00:01:57,300 --> 00:02:00,330 +ta muốn, chúng ta phải làm cho nó tiếp + +29 +00:02:00,750 --> 00:02:05,750 +tục và di chuyển lên, sau đó chúng ta có thể yêu cầu nó đi đến + +30 +00:02:07,530 --> 00:02:12,450 +vị trí 350 x 0, 350 trên trục X và 0 trên trục Y, như vậy. + +31 +00:02:13,350 --> 00:02:16,320 +Bây giờ, điều tiếp theo chúng ta cần làm là tìm cách làm cho + +32 +00:02:16,320 --> 00:02:17,640 +nó di chuyển lên và xuống. + +33 +00:02:18,150 --> 00:02:23,150 +Vì vậy, tất nhiên, chúng ta cần một số cách để màn hình lắng nghe các + +34 +00:02:23,970 --> 00:02:27,150 +lần gõ phím. Chúng tôi sẽ gọi màn hình. lắng nghe + +35 +00:02:27,270 --> 00:02:31,290 +và sau đó chúng tôi sẽ gọi onkey để nghe phím "Lên". + +36 +00:02:31,830 --> 00:02:36,480 +Và sau đó khi điều đó xảy ra, chúng ta sẽ có được mái chèo để đi lên. Bây giờ, hãy nhớ như + +37 +00:02:36,510 --> 00:02:40,770 +mọi khi, khi bạn đang sử dụng một hàm làm tham số, + +38 +00:02:41,100 --> 00:02:45,960 +bạn không muốn thêm dấu ngoặc đơn. Nếu bạn làm vậy, nó sẽ không hoạt động. + +39 +00:02:46,500 --> 00:02:49,380 +Bây giờ chúng ta hãy tạo hàm go_up của chúng ta. + +40 +00:02:50,010 --> 00:02:55,010 +Và chức năng này sẽ sử dụng mái chèo của chúng ta và di chuyển nó + +41 +00:02:59,470 --> 00:03:04,150 +để nó chuyển sang vị trí mới. Giải thích mới là X sẽ không thay đổi. + +42 +00:03:04,210 --> 00:03:07,120 +Vị trí duy nhất sẽ thay đổi là vị trí Y. + +43 +00:03:07,750 --> 00:03:11,710 +Vì vậy, vị trí Y sẽ là động lực thúc đẩy ycor hiện + +44 +00:03:12,280 --> 00:03:15,250 +tại, nhưng nó sẽ đi lên, vì vậy nó sẽ + +45 +00:03:15,280 --> 00:03:18,190 +cần phải cộng thêm, giả sử bằng 20. + +46 +00:03:18,940 --> 00:03:23,940 +Bây giờ chúng ta có thể yêu cầu mái chèo chuyển sang mái chèo hiện tại của nó. xcor. + +47 +00:03:24,970 --> 00:03:29,290 +Vì vậy, chúng tôi không thay đổi điều đó. Và sau đó để đi đến vị trí Y mới. + +48 +00:03:29,980 --> 00:03:34,980 +Bây giờ, hàm go_up này sẽ được gọi bất cứ khi nào phím Lên được phát hiện. + +49 +00:03:35,740 --> 00:03:40,450 +Và nếu chúng ta sao chép nó và chúng ta tạo một phiên bản tương tự + +50 +00:03:40,660 --> 00:03:45,550 +của hàm này, được gọi là go_down và thay vào đó chúng ta có thể trừ đi 20. + +51 +00:03:46,120 --> 00:03:50,320 +Vì vậy, bây giờ chúng ta có thể sao chép dòng này và gọi + +52 +00:03:50,350 --> 00:03:54,160 +nó là go_down khi phím mũi tên xuống được phát hiện. + +53 +00:03:54,820 --> 00:03:59,020 +Vì vậy, bây giờ chúng tôi đã tạo ra mái chèo của mình và khi tôi đánh lên, nó sẽ đi + +54 +00:03:59,050 --> 00:04:03,070 +lên, khi tôi đánh xuống thì nó sẽ đi xuống. Và điều này hoàn thành phần đầu tiên của thử thách. + +55 +00:04:03,430 --> 00:04:06,430 +Nhưng đây là một câu hỏi. Khi tôi nhấn run, + +56 +00:04:06,520 --> 00:04:09,850 +bạn có thể thấy rằng cánh khuấy đầu tiên được + +57 +00:04:10,240 --> 00:04:13,720 +tạo ở trung tâm, sau đó nó di chuyển đến vị + +58 +00:04:14,200 --> 00:04:18,399 +trí cần đến, vị trí 350 trên trục X, 0 trên trục Y. + +59 +00:04:18,940 --> 00:04:22,330 +Làm thế nào chúng ta có thể loại bỏ hoạt ảnh này để chúng ta không + +60 +00:04:22,330 --> 00:04:24,430 +phải nhìn mái chèo di chuyển đến vị trí? + +61 +00:04:24,850 --> 00:04:28,510 +Hãy suy nghĩ về những gì bạn đã học được trong các bài học trước và xem liệu + +62 +00:04:28,510 --> 00:04:32,950 +bạn có thể giải quyết vấn đề này hay không. Được rồi. + +63 +00:04:32,980 --> 00:04:37,980 +Vì vậy, bạn có thể nhớ từ các bài học trước rằng có một phương pháp + +64 +00:04:38,560 --> 00:04:41,380 +lần vết trên màn hình điều khiển hoạt ảnh. + +65 +00:04:41,920 --> 00:04:46,540 +Và để tắt hoạt ảnh, chúng ta có thể đặt số 0 trong phương thức đó. + +66 +00:04:47,080 --> 00:04:49,450 +Nhưng khi chúng tôi chạy mã của mình, như + +67 +00:04:49,480 --> 00:04:52,060 +hiện tại, bạn sẽ thấy rằng không có hoạt ảnh. + +68 +00:04:52,090 --> 00:04:54,880 +Thậm chí không còn một mái chèo xuất hiện nữa. + +69 +00:04:55,630 --> 00:04:58,180 +Hãy nhớ rằng khi bạn tắt hoạt ảnh, bạn phải cập nhật màn + +70 +00:04:58,390 --> 00:05:03,390 +hình theo cách thủ công và làm mới nó mỗi lần. Để làm điều đó, chúng ta sẽ cần + +71 +00:05:04,120 --> 00:05:06,490 +một số loại vòng lặp while. + +72 +00:05:07,000 --> 00:05:10,750 +Và vòng lặp while sẽ kiểm tra một số loại biến. + +73 +00:05:11,140 --> 00:05:15,250 +Vì vậy, hãy tạo một biến có tên là game_is_on và đặt nó thành true + +74 +00:05:15,820 --> 00:05:17,890 +và trong khi trò chơi đang bật, chúng + +75 +00:05:18,160 --> 00:05:22,660 +ta sẽ gọi màn hình. cập nhật. Bây giờ, nếu tôi + +76 +00:05:22,690 --> 00:05:25,690 +chạy lại mã, bạn sẽ thấy rằng mái chèo của tôi + +77 +00:05:25,720 --> 00:05:30,700 +bây giờ đi trực tiếp từ trung tâm đến vị trí vì điều đầu tiên xảy ra + +78 +00:05:30,700 --> 00:05:33,100 +là hoạt ảnh bị tắt, mái chèo sau + +79 +00:05:33,460 --> 00:05:36,130 +đó được tạo trong nền và cuối cùng là + +80 +00:05:36,400 --> 00:05:41,080 +nó. đến thời điểm này, nơi chúng tôi thực sự cập nhật màn hình và hiển + +81 +00:05:41,080 --> 00:05:44,200 +thị mọi thứ đã xảy ra trong nền cho đến nay. + +82 +00:05:44,890 --> 00:05:49,120 +Bạn có xoay sở để hoàn thành thử thách này và tạo ra mái chèo và đưa nó di chuyển + +83 +00:05:49,120 --> 00:05:51,760 +lên xuống bằng cách sử dụng các tổ hợp phím không? + +84 +00:05:52,270 --> 00:05:57,070 +Nếu bạn không chắc chắn hãy xem lại một số phương pháp này trong tài liệu về rùa và chơi + +85 +00:05:57,080 --> 00:06:01,160 +xung quanh mã cho đến khi bạn hoàn toàn hài lòng với những gì đang diễn ra + +86 +00:06:01,160 --> 00:06:03,130 +cho đến nay. Bây giờ, + +87 +00:06:03,160 --> 00:06:07,840 +nếu bạn đã tạo paddle trong một tệp riêng biệt dưới dạng một lớp riêng + +88 +00:06:08,170 --> 00:06:10,210 +biệt, đừng lo lắng. Chúng tôi sẽ làm điều đó tiếp theo. + +89 +00:06:10,390 --> 00:06:14,590 +Chúng tôi sẽ cấu trúc lại mã này để nó hoàn toàn tuân theo Lập + +90 +00:06:14,590 --> 00:06:16,990 +trình hướng đối tượng. Nhưng nếu bạn đã làm được rồi, + +91 +00:06:16,990 --> 00:06:18,340 +thì bạn chỉ cần đi trước một bước. + +92 +00:06:18,700 --> 00:06:20,980 +Và đó là nơi mà chúng ta sẽ hướng tới trong bài học tiếp theo. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/004 Write the Paddle Class and Create the Second Paddle.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/004 Write the Paddle Class and Create the Second Paddle.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4023dbcf444b5b97cf60fd7d2d78742b6d21c752 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/004 Write the Paddle Class and Create the Second Paddle.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:131a0a5d9ca990deb8086c97e4751aab94067d00b629cbcec1e86b39beb7c206 +size 36825478 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/004 Write the Paddle Class and Create the Second Paddle_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/004 Write the Paddle Class and Create the Second Paddle_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0611a0eca21ee11b8740069c8188eb40304e72b0 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/004 Write the Paddle Class and Create the Second Paddle_vi.srt @@ -0,0 +1,440 @@ +1 +00:00:00,660 --> 00:00:05,070 +Trong bài học trước, chúng tôi đã tạo và quản lý để di chuyển mái chèo lên và xuống. + +2 +00:00:05,670 --> 00:00:08,970 +Bây giờ trong bài học này, chúng ta sẽ tìm ra cách chúng ta có thể + +3 +00:00:08,970 --> 00:00:09,930 +tạo một mái chèo + +4 +00:00:10,260 --> 00:00:14,100 +khác, nhưng chúng ta không muốn lặp lại tất cả mã mà chúng ta đã viết cho đến nay. + +5 +00:00:14,340 --> 00:00:18,900 +Vì vậy, chúng tôi có thể sẽ cần sự trợ giúp của một lớp chèo riêng. + +6 +00:00:19,320 --> 00:00:21,270 +Vì vậy, nếu bạn chưa tạo + +7 +00:00:21,270 --> 00:00:24,690 +paddle bên trong một tệp riêng và một lớp riêng biệt, + +8 +00:00:25,050 --> 00:00:29,100 +thì đây là lúc để cấu trúc lại mã của bạn để bạn có + +9 +00:00:29,100 --> 00:00:34,100 +thể tạo một đối tượng paddle khác từ lớp puddle một cách dễ dàng và dễ dàng. + +10 +00:00:34,830 --> 00:00:36,240 +Đây là những gì chúng tôi đang hướng tới. + +11 +00:00:36,390 --> 00:00:41,390 +Chúng tôi đang hướng tới việc loại bỏ tất cả mã liên quan đến paddle này và chuyển nó vào + +12 +00:00:41,640 --> 00:00:43,140 +một lớp paddle riêng biệt. + +13 +00:00:43,650 --> 00:00:48,650 +Và sau đó, chúng tôi muốn có thể tạo một mái chèo phù hợp chỉ đơn giản bằng + +14 +00:00:50,250 --> 00:00:52,560 +cách tạo nó từ lớp mái chèo. + +15 +00:00:52,950 --> 00:00:57,360 +Và sau đó chúng ta có thể tạo một mái chèo bên trái từ bảng điều khiển của lớp. Bây giờ vì mái chèo bên phải + +16 +00:00:57,360 --> 00:01:01,380 +có tọa độ khác với mái chèo bên trái, chúng tôi sẽ cần + +17 +00:01:01,620 --> 00:01:06,620 +chuyển vị trí của mái chèo bên phải và bên trái dưới dạng một bộ điều chỉnh. + +18 +00:01:06,870 --> 00:01:11,870 +Vì vậy, chúng ta có thể nói một cái gì đó như X sẽ là 350 và Y sẽ là 0. + +19 +00:01:12,630 --> 00:01:13,980 +Và ở mái + +20 +00:01:13,980 --> 00:01:18,980 +chèo bên trái, X sẽ là -350 và Y sẽ là 0. + +21 +00:01:20,160 --> 00:01:25,160 +Vì vậy, hãy suy nghĩ về cách bạn có thể làm cho mã này hoạt động và + +22 +00:01:26,250 --> 00:01:28,980 +cấu trúc lại mã này thành một lớp + +23 +00:01:29,370 --> 00:01:33,330 +paddle riêng biệt và lớp paddle này sẽ kế thừa từ lớp rùa. + +24 +00:01:33,780 --> 00:01:37,260 +Nhìn chung, chương trình của chúng tôi sẽ hoạt động khá giống như trước đây. + +25 +00:01:37,680 --> 00:01:41,010 +Sự khác biệt duy nhất là bây giờ chúng ta có một bàn đạp + +26 +00:01:41,250 --> 00:01:45,510 +bên trái có thể di chuyển lên và xuống bằng các phím w và s trên bàn phím. + +27 +00:01:46,290 --> 00:01:48,810 +Tạm dừng video và cố gắng hoàn thành thử thách này. + +28 +00:01:51,450 --> 00:01:54,990 +Được rồi. Vì vậy, điều đầu tiên chúng ta cần là + +29 +00:01:55,260 --> 00:02:00,260 +một tệp mới, sẽ được gọi là paddle. py và mái chèo. py sẽ cần + +30 +00:02:01,410 --> 00:02:05,640 +lớp rùa từ mô-đun rùa. Vì vậy, hãy tiếp tục và nhập nó. + +31 +00:02:06,180 --> 00:02:10,770 +Và sau đó tôi sẽ tạo lớp Paddle này, và tất nhiên, tất cả các lớp + +32 +00:02:10,979 --> 00:02:13,590 +đều bắt đầu bằng một chữ cái viết hoa. + +33 +00:02:14,070 --> 00:02:19,070 +Bây giờ, lớp này sẽ lấy tất cả mã tạo paddle này và + +34 +00:02:19,680 --> 00:02:23,550 +nó sẽ thực hiện khi chúng ta khởi tạo + +35 +00:02:23,550 --> 00:02:28,290 +một đối tượng paddle mới. Đối tượng paddle này, để nó là đối + +36 +00:02:28,290 --> 00:02:32,940 +tượng rùa, chúng ta sẽ lấy nó để kế thừa từ lớp rùa như thế này. + +37 +00:02:33,420 --> 00:02:35,880 +Và để có được tất cả các khả + +38 +00:02:35,880 --> 00:02:38,610 +năng, phương thức và thuộc tính của lớp rùa, + +39 +00:02:39,000 --> 00:02:41,940 +chúng ta cần lấy lớp cha này để tự khởi tạo. + +40 +00:02:42,660 --> 00:02:47,660 +Điều tiếp theo chúng ta sẽ làm là tìm ra cách chúng ta có thể làm cho mái chèo của + +41 +00:02:47,910 --> 00:02:52,320 +mình thay đổi hình dạng, thay đổi màu sắc của nó và tất cả những thứ khác. + +42 +00:02:52,920 --> 00:02:57,920 +Vì vậy, chúng tôi có thể loại bỏ hoàn toàn dòng này vì hạng chèo của chúng tôi + +43 +00:02:58,350 --> 00:03:01,870 +bây giờ giống như hạng rùa. Và sau đó cho phần còn lại của chúng, + +44 +00:03:01,870 --> 00:03:04,960 +thay vì viết chèo. hình dạng hoặc mái chèo. màu sắc, + +45 +00:03:05,290 --> 00:03:09,460 +chúng ta sẽ nhấn lệnh R hoặc chỉ cần vào chỉnh sửa, + +46 +00:03:09,730 --> 00:03:12,280 +tìm và sau đó thay thế, và bạn + +47 +00:03:12,460 --> 00:03:16,900 +có thể xem phím tắt trên máy tính của mình về cách nắm giữ + +48 +00:03:16,900 --> 00:03:20,380 +màn hình thay thế này. Vì vậy, những gì tôi muốn thay thế + +49 +00:03:20,500 --> 00:03:23,890 +là tất cả mọi thứ được chèo. ở đây trong mã của + +50 +00:03:24,280 --> 00:03:26,680 +tôi và tôi sẽ thay thế nó bằng tự. bởi vì bây giờ chúng ta đang ở trong lớp paddle mà thực + +51 +00:03:27,190 --> 00:03:29,620 +tế giống như lớp rùa với một số tính năng bổ sung được thêm vào. + +52 +00:03:30,010 --> 00:03:34,360 +Chúng ta có thể khai thác các phương pháp và thuộc tính của mình bằng cách sử dụng từ khóa self. + +53 +00:03:34,750 --> 00:03:39,750 +Bây giờ, điều cuối cùng chúng ta cần làm để thực hiện công + +54 +00:03:41,950 --> 00:03:42,760 +việc + +55 +00:03:42,760 --> 00:03:47,760 +này là tiếp tục và nhập paddle của chúng tôi từ paddle. py + +56 +00:03:48,700 --> 00:03:51,910 +Và khi chúng tôi đã nhập nó, chúng tôi cần giải quyết cảnh báo này. + +57 +00:03:54,700 --> 00:03:58,540 +Hãy chú ý cách nó làm nổi bật khu vực này và nó cho chúng + +58 +00:03:58,810 --> 00:04:00,670 +ta biết rằng đây là một đối + +59 +00:04:00,700 --> 00:04:05,700 +số không mong muốn vì lớp paddle thực sự không nhận bất kỳ đầu vào nào khi nó được khởi tạo. + +60 +00:04:05,830 --> 00:04:09,700 +Nó chỉ có cái tôi ở đây. Nhưng trên thực tế, chúng tôi cần một vị trí + +61 +00:04:09,910 --> 00:04:12,760 +được chuyển giao. + +62 +00:04:12,790 --> 00:04:16,510 +Vì vậy, vị trí này sẽ xác định nơi + +63 +00:04:17,019 --> 00:04:21,910 +mái chèo sẽ đi đến, bởi vì hãy nhớ mái chèo bên trái + +64 +00:04:22,420 --> 00:04:26,950 +sẽ có một tọa độ khác với mái chèo bên phải. + +65 +00:04:26,950 --> 00:04:27,880 +Vì vậy, bây giờ chúng tôi đã sửa lỗi đó, đây là mã hoàn toàn hợp lệ. + +66 +00:04:28,540 --> 00:04:33,190 +Và nếu chúng tôi chạy mã như hiện tại, bạn sẽ thấy các mái chèo + +67 +00:04:35,590 --> 00:04:38,200 +của chúng tôi được tạo và trông + +68 +00:04:38,260 --> 00:04:43,180 +giống hệt như trước đây nhưng bây giờ chúng tôi có thêm một mái chèo. Đi xuống đây với các phương thức đi lên và đi xuống của chúng tôi, lý tưởng là + +69 +00:04:43,450 --> 00:04:48,450 +chúng tôi muốn chúng sống trong lớp paddle của + +70 +00:04:50,140 --> 00:04:50,973 +chúng tôi. + +71 +00:04:51,040 --> 00:04:55,360 +Vì vậy, chúng tôi muốn chúng là các phương thức bên trong lớp này. + +72 +00:04:55,690 --> 00:04:58,390 +Và hãy nhớ rằng các phương thức luôn có một thuộc tính đầu tiên là bản thân. + +73 +00:04:58,930 --> 00:05:03,930 +Ngoài ra, chúng ta phải thay thế mái chèo này + +74 +00:05:05,050 --> 00:05:07,030 +một lần nữa. với bản thân. để nó thực sự tham chiếu đến đối tượng được tạo từ lớp này để + +75 +00:05:07,060 --> 00:05:12,060 +lấy tọa độ Y hoặc lấy tọa độ X của nó. + +76 +00:05:14,410 --> 00:05:19,360 +Bây giờ, trở lại với chính của chúng ta. py, chúng tôi sẽ phải sửa đổi mã này một chút vì hàm go_up + +77 +00:05:20,080 --> 00:05:22,480 +và go_down + +78 +00:05:22,510 --> 00:05:26,800 +này hiện đã không còn nữa, và thay vào đó, chúng + +79 +00:05:26,800 --> 00:05:28,090 +tôi hiện có r_paddle. go_up và r_paddle. đi xuống. + +80 +00:05:28,450 --> 00:05:33,450 +Vì vậy, mái chèo bên phải sẽ được điều + +81 +00:05:36,970 --> 00:05:40,840 +khiển bởi các phím lên và xuống, nhưng mái chèo bên trái, chúng ta có thể điều khiển nó bằng một số phím khác. Bây giờ, trong trường hợp của chúng ta, tôi sẽ chọn phím 'w' + +82 +00:05:41,260 --> 00:05:46,210 +để đi lên và phím 's' để đi + +83 +00:05:46,210 --> 00:05:46,810 +xuống. + +84 +00:05:46,810 --> 00:05:51,810 +Vì vậy, chúng tôi sẽ cần một bộ màn hình khác. các cuộc gọi phương thức onkey. + +85 +00:05:52,780 --> 00:05:57,780 +Nhưng trong trường hợp này, điều này sẽ làm cho mái chèo bên trái đi lên và mái + +86 +00:05:58,340 --> 00:05:59,180 +chèo bên trái đi xuống. Và đi + +87 +00:05:59,180 --> 00:06:04,180 +lên được điều khiển bởi phím 'w' và + +88 +00:06:05,000 --> 00:06:07,460 +đi xuống được điều khiển bởi phím 's'. Vì vậy, bây giờ, nếu chúng tôi chạy mã của mình, bạn + +89 +00:06:07,730 --> 00:06:12,560 +có thể thấy rằng khi tôi di chuyển nó sẽ + +90 +00:06:12,590 --> 00:06:17,210 +đi lên, khi tôi di chuyển nó sẽ đi xuống và lên và xuống sẽ di chuyển bên phải của mái chèo. + +91 +00:06:17,210 --> 00:06:21,950 +Vì vậy, hãy chú ý làm thế nào bây giờ chúng tôi đã cấu + +92 +00:06:22,640 --> 00:06:23,690 +trúc lại + +93 +00:06:23,720 --> 00:06:28,720 +mã liên quan đến paddle của chúng tôi thành một lớp hoàn toàn riêng biệt, trước + +94 +00:06:29,090 --> 00:06:30,560 +tiên, chính của chúng tôi. py bây giờ đơn giản hơn rất nhiều. + +95 +00:06:30,650 --> 00:06:34,160 +Nó rõ ràng về tất cả mã liên quan đến mái chèo này. + +96 +00:06:34,190 --> 00:06:37,730 +Và trên hết, nếu tôi muốn tạo một mái chèo thứ ba, giả sử + +97 +00:06:38,270 --> 00:06:41,720 +tôi muốn bạn tạo một mái chèo hàng đầu vì một lý + +98 +00:06:41,720 --> 00:06:45,260 +do nào đó, thì tất cả những gì tôi phải làm là chỉ cần + +99 +00:06:45,530 --> 00:06:50,530 +gọi lớp chèo và sau đó chuyển vào một bộ giá trị cho vị trí của mái chèo này. + +100 +00:06:51,200 --> 00:06:53,900 +Vì vậy, hãy đặt nó ở, tôi không biết, 100 x 100. + +101 +00:06:54,950 --> 00:06:59,810 +Nếu tôi nhấn run, bạn có thể thấy có một paddle ngẫu nhiên thứ ba và tôi không + +102 +00:07:00,380 --> 00:07:01,213 +phải viết + +103 +00:07:01,220 --> 00:07:05,180 +bất kỳ mã bổ sung nào này hoặc bất kỳ phương pháp liên quan nào. Chúng tôi có thể tạo ra bao nhiêu mái chèo như chúng tôi muốn bởi + +104 +00:07:05,300 --> 00:07:10,300 +vì chúng tôi đã có lớp chèo này. + +105 +00:07:10,790 --> 00:07:15,410 +Vì vậy, với những ví dụ này, tôi hy vọng bạn sẽ hiểu được + +106 +00:07:16,460 --> 00:07:17,960 +tầm quan trọng của + +107 +00:07:18,050 --> 00:07:22,370 +các lớp và tầm quan trọng của chúng khi nói đến sự phát + +108 +00:07:22,370 --> 00:07:26,990 +triển của một dự án phức tạp hơn như trò chơi bóng bàn này. Bây giờ trong bài học tiếp theo, chúng ta sẽ tiếp tục xây dựng chương trình của + +109 +00:07:27,230 --> 00:07:30,230 +mình và chúng ta sẽ + +110 +00:07:30,230 --> 00:07:34,190 +tạo ra lớp bóng của chúng ta và làm cho quả bóng di chuyển. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/005 Write the Ball Class and Make the Ball Move.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/005 Write the Ball Class and Make the Ball Move.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0644fed226ad63c445a3404f18fea45374eaa645 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/005 Write the Ball Class and Make the Ball Move.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb60a5619ec489cae4ab848c86000127900d2fdfaf988d164d844571d8585e75 +size 19985879 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/005 Write the Ball Class and Make the Ball Move_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/005 Write the Ball Class and Make the Ball Move_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..af94133b37b5efc34d0cf028ed55d3df9f006f0b --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/005 Write the Ball Class and Make the Ball Move_vi.srt @@ -0,0 +1,268 @@ +1 +00:00:00,300 --> 00:00:02,250 +Bây giờ chúng ta đã tạo ra + +2 +00:00:02,310 --> 00:00:07,020 +cả hai mái chèo, bước rõ ràng tiếp theo là tạo ra quả bóng và làm cho nó di chuyển. + +3 +00:00:07,500 --> 00:00:12,500 +Vì vậy, quả bóng này sẽ được tạo ra như một lớp bóng riêng biệt và đối tượng + +4 +00:00:14,550 --> 00:00:19,350 +bóng mà chúng ta sẽ tạo ra từ nó sẽ có chiều rộng là 20, chiều cao + +5 +00:00:19,380 --> 00:00:23,310 +là 20 và vị trí X và Y sẽ bắt đầu ở tâm của + +6 +00:00:23,490 --> 00:00:27,300 +màn hình, do đó (0, 0). Bây giờ khi màn hình làm + +7 +00:00:27,300 --> 00:00:32,299 +mới, quả bóng sẽ tự động di chuyển trên màn hình và nó sẽ di chuyển lên + +8 +00:00:33,390 --> 00:00:34,920 +và cũng sang phải. + +9 +00:00:34,920 --> 00:00:39,920 +Vì vậy, vị trí X và Y sẽ thay đổi sau mỗi lần làm mới màn hình. + +10 +00:00:40,800 --> 00:00:45,000 +Vì vậy, điều này sẽ khó khăn hơn một chút và sẽ đòi hỏi bạn phải + +11 +00:00:45,000 --> 00:00:46,320 +suy nghĩ một chút. + +12 +00:00:46,680 --> 00:00:51,390 +Nhưng tôi muốn bạn tạm dừng video và suy nghĩ một chút về vấn đề này và xem + +13 +00:00:51,390 --> 00:00:55,590 +bạn có thể tiến được bao xa khi cố gắng đưa quả bóng di chuyển đến + +14 +00:00:55,620 --> 00:00:59,580 +mép trên bên phải của màn hình. Tạm dừng video và tiếp tục. + +15 +00:01:03,260 --> 00:01:05,330 +Được rồi. Vì vậy, để bắt + +16 +00:01:05,330 --> 00:01:10,250 +đầu, lần này tôi sẽ tạo ra một quả bóng. tập tin py và bên + +17 +00:01:10,280 --> 00:01:14,330 +trong quả bóng này. py là nơi chúng ta sẽ tạo đối tượng bóng của chúng ta. + +18 +00:01:14,750 --> 00:01:15,830 +Vì vậy, trước + +19 +00:01:15,830 --> 00:01:20,830 +tiên, tôi sẽ nhập lớp rùa của mình và sau đó tôi sẽ tạo lớp bóng của + +20 +00:01:22,040 --> 00:01:24,320 +mình sẽ kế thừa từ lớp rùa. + +21 +00:01:24,800 --> 00:01:28,130 +Và sau đó tôi sẽ thực hiện tất cả các bước khởi tạo thông thường. + +22 +00:01:30,440 --> 00:01:33,950 +Và bây giờ chúng tôi đã sẵn sàng để tạo ra lớp bóng của chúng tôi. + +23 +00:01:34,430 --> 00:01:39,080 +Quả bóng này trước hết sẽ có màu trắng. + +24 +00:01:39,710 --> 00:01:44,300 +Và thêm vào đó, nó sẽ có hình dạng là một hình tròn. + +25 +00:01:44,600 --> 00:01:47,510 +Bây giờ tôi biết rằng trong trò chơi bóng bàn ban đầu, + +26 +00:01:47,600 --> 00:01:52,250 +quả bóng bàn thực sự là một hình vuông. Vì vậy, bạn có thể giữ nó hình vuông + +27 +00:01:52,250 --> 00:01:56,300 +nếu bạn muốn chính xác về mặt lịch sử, hoặc bạn có thể thay đổi nó thành + +28 +00:01:56,300 --> 00:02:00,650 +hình tròn như tôi có ở đây để làm cho nó trông giống một quả bóng bàn hơn. + +29 +00:02:01,370 --> 00:02:02,360 +Bây giờ, ngoài ra, + +30 +00:02:02,390 --> 00:02:06,980 +chúng ta sẽ cần phải làm cho nó viết lên để nó không bị vẽ trên + +31 +00:02:06,980 --> 00:02:07,813 +màn hình. + +32 +00:02:08,210 --> 00:02:13,210 +Và bây giờ tất cả những gì chúng ta cần là khởi tạo quả bóng của chúng ta từ quả bóng. py và chúng tôi sẽ làm điều + +33 +00:02:17,870 --> 00:02:20,600 +đó ngay bên dưới mái chèo của chúng tôi. + +34 +00:02:20,660 --> 00:02:24,500 +Vì vậy, tôi sẽ tạo một đối tượng bóng mới từ lớp bóng. + +35 +00:02:25,010 --> 00:02:26,390 +Và bây giờ nếu tôi + +36 +00:02:26,420 --> 00:02:30,380 +nhấn run, bạn sẽ thấy quả bóng tròn của chúng tôi hiển thị ở giữa màn hình. + +37 +00:02:31,430 --> 00:02:36,430 +Vấn đề tiếp theo là làm thế nào để quả cầu di chuyển về phía góc trên cùng bên phải + +38 +00:02:37,310 --> 00:02:38,143 +của màn hình? + +39 +00:02:38,360 --> 00:02:42,500 +Vì vậy, điều đó sẽ liên quan đến sự thay đổi trong tọa độ X + +40 +00:02:42,500 --> 00:02:45,590 +cũng như tọa độ Y. Trong vòng lặp while của + +41 +00:02:45,740 --> 00:02:47,720 +chúng ta ở đây, nơi màn hình + +42 +00:02:48,050 --> 00:02:51,410 +của chúng ta đang cập nhật, chúng ta sẽ gọi một phương thức + +43 +00:02:51,710 --> 00:02:56,000 +trong lớp ball sẽ được gọi là move. Và phương pháp di chuyển mà chúng + +44 +00:02:56,030 --> 00:03:01,030 +ta sẽ xác định bây giờ sẽ chịu trách nhiệm di chuyển quả bóng của chúng ta. + +45 +00:03:02,290 --> 00:03:07,290 +Và cách mà nó sẽ di chuyển là nó sẽ tăng trên X + +46 +00:03:08,350 --> 00:03:12,790 +và cũng tăng trên Y. Hãy tạo một tọa độ X + +47 +00:03:12,820 --> 00:03:17,820 +mới sẽ là tọa độ hiện tại. xcor cộng với một số tiền tùy ý. + +48 +00:03:18,850 --> 00:03:20,770 +Vì vậy, giả sử tăng lên 10. + +49 +00:03:21,220 --> 00:03:26,220 +Và sau đó chữ Y mới sẽ là chính mình. ycor tăng với cùng một số lượng + +50 +00:03:27,730 --> 00:03:30,160 +tùy ý. Và cuối cùng, + +51 +00:03:30,190 --> 00:03:35,190 +chúng ta có thể đưa quả bóng của mình đến X mới và Y mới này. + +52 +00:03:37,690 --> 00:03:39,640 +Vì vậy, bây giờ khi chúng tôi chạy + +53 +00:03:39,880 --> 00:03:44,500 +mã của mình, bạn có thể thấy bóng của chúng tôi ngay lập tức rời khỏi màn hình + +54 +00:03:44,500 --> 00:03:48,130 +ở góc trên cùng bên phải. Nếu muốn bóng bay chậm lại một chút, chúng ta có + +55 +00:03:48,190 --> 00:03:50,950 +thể làm một trong hai điều sau. Hoặc chúng ta có + +56 +00:03:50,980 --> 00:03:55,980 +thể đi vào phương pháp di chuyển và thay đổi 10 điều này ở đây để nói một. + +57 +00:03:57,010 --> 00:04:01,360 +Bằng cách đó, mỗi khi vòng lặp của chúng ta chạy, quả bóng của chúng ta sẽ chỉ di chuyển một pixel. + +58 +00:04:02,080 --> 00:04:06,490 +Ngoài ra, chúng ta có thể tạm dừng vòng lặp trong một thời gian ngắn trong mỗi lần lặp. + +59 +00:04:07,480 --> 00:04:10,180 +Di chuyển quả bóng ở một mức độ nhỏ vẫn hoạt + +60 +00:04:10,330 --> 00:04:14,350 +động, nhưng tôi sẽ đi với tùy chọn thứ hai và nhập mô-đun thời gian của chúng tôi. + +61 +00:04:14,770 --> 00:04:18,790 +Sau đó, tôi sẽ để vòng lặp while của chúng tôi ngủ một chút giữa mỗi + +62 +00:04:18,790 --> 00:04:19,690 +bản cập nhật. + +63 +00:04:20,320 --> 00:04:24,460 +Vì vậy, tôi thường bắt đầu chỉ với một con số 0. Ngủ 1 giây và bạn có thể thấy bây + +64 +00:04:24,790 --> 00:04:28,450 +giờ một quả bóng di chuyển với tốc độ hợp lý hơn và chúng ta thực + +65 +00:04:28,720 --> 00:04:31,690 +sự có cơ hội bắt được nó bằng một trong các mái chèo. + +66 +00:04:32,530 --> 00:04:37,210 +Thats tất cả để có nó. Bây giờ chúng tôi đã tạo trên lớp bóng, + +67 +00:04:37,270 --> 00:04:42,270 +khởi tạo một đối tượng bóng và chúng tôi có quả bóng để di chuyển mỗi khi làm mới màn hình. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/006 Add the Ball Bouncing Logic.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/006 Add the Ball Bouncing Logic.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fe7a4170d31e05c096c8ba8c2f5d530b5c7b6ebf --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/006 Add the Ball Bouncing Logic.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77bd967611219ff55e76fa9b11752425a9dbb2bfdd3fc72c813e94d9bdaf4a40 +size 29149953 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/006 Add the Ball Bouncing Logic_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/006 Add the Ball Bouncing Logic_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..661ee62039dd74a2a28acaafdc2002be3a30db18 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/006 Add the Ball Bouncing Logic_vi.srt @@ -0,0 +1,424 @@ +1 +00:00:00,030 --> 00:00:02,580 +Bây giờ chúng tôi đã thực hiện hầu hết các phần dễ dàng, + +2 +00:00:02,610 --> 00:00:05,790 +đưa một mái chèo và một quả bóng lên và chạy trên màn hình của chúng tôi. + +3 +00:00:06,120 --> 00:00:08,700 +Một vài phần tiếp theo sẽ phức tạp hơn một chút. + +4 +00:00:09,270 --> 00:00:13,530 +Và điều đầu tiên chúng ta sẽ giải quyết là làm thế nào để phát hiện va + +5 +00:00:13,530 --> 00:00:18,530 +chạm khi quả bóng chạm vào bức tường ở phía trên và phía dưới và làm cho quả bóng nảy ra. + +6 +00:00:19,470 --> 00:00:21,210 +Bây giờ, chúng ta chỉ cần + +7 +00:00:21,240 --> 00:00:24,660 +phát hiện va chạm ở các bức tường phía trên và phía dưới bởi + +8 +00:00:24,930 --> 00:00:29,190 +vì khi quả bóng chạm vào mép phải hoặc mép trái của chương trình, nó thực sự sẽ + +9 +00:00:29,490 --> 00:00:33,300 +bị một trong các mái chèo bắt lấy. Và nếu nó không phải, thì điều đó có + +10 +00:00:33,360 --> 00:00:35,730 +nghĩa là cầu thủ đó đã bỏ lỡ bóng và đó là + +11 +00:00:35,940 --> 00:00:37,440 +một điểm sang phía bên kia. + +12 +00:00:37,920 --> 00:00:42,920 +Vì vậy, chúng ta cần tập trung vào việc làm thế nào chúng ta có thể phát hiện ra khi nào quả + +13 +00:00:43,830 --> 00:00:45,060 +bóng đã va chạm với + +14 +00:00:45,420 --> 00:00:50,420 +các bức tường phía trên hoặc phía dưới, khi vị trí của nó đã vượt qua một điểm nhất định mà nó + +15 +00:00:51,210 --> 00:00:54,810 +có thể sẽ va chạm với bức tường. Chúng tôi đã làm điều gì đó tương tự với con + +16 +00:00:54,870 --> 00:00:58,260 +rắn, nhưng đã đến lúc xem lại chủ đề này. Bây giờ, trên hết, chúng ta phải + +17 +00:00:58,260 --> 00:01:01,650 +tìm ra cách chúng ta làm thế nào để quả bóng thực sự nảy lên? + +18 +00:01:01,980 --> 00:01:06,090 +Và nảy thực sự có ý nghĩa gì về mặt thay đổi vị trí của + +19 +00:01:06,090 --> 00:01:06,923 +quả bóng? + +20 +00:01:06,960 --> 00:01:11,960 +Khi quả bóng liên tục đi lên theo giá trị Y và đi lên theo giá trị X + +21 +00:01:12,390 --> 00:01:14,340 +để đi theo hướng này, điều + +22 +00:01:14,670 --> 00:01:19,170 +gì thực sự xảy ra với các giá trị X và Y khi nó nảy lên? + +23 +00:01:19,530 --> 00:01:22,440 +Cái nào giảm đi và cái nào không đổi? + +24 +00:01:23,430 --> 00:01:28,430 +Hãy suy nghĩ về những câu hỏi đó và chơi với một số con số đó và xem liệu bạn có + +25 +00:01:29,220 --> 00:01:33,630 +thể tự mình hoàn thành thử thách này không. Nếu bạn gặp khó khăn hoặc nếu bạn chỉ muốn + +26 +00:01:33,690 --> 00:01:35,250 +kiểm tra câu trả lời, hãy + +27 +00:01:35,490 --> 00:01:37,950 +quay lại và tôi sẽ cùng bạn tìm cách giải quyết. + +28 +00:01:40,680 --> 00:01:43,590 +Được rồi. Vì vậy, nó sẽ ở + +29 +00:01:43,800 --> 00:01:48,180 +bên trong vòng lặp while của chúng tôi, nơi tôi sẽ phát hiện sự va chạm với bức tường. + +30 +00:01:48,720 --> 00:01:52,440 +Và để phát hiện va chạm với tường, về + +31 +00:01:52,470 --> 00:01:57,450 +cơ bản, điều tôi sẽ nói là nếu màn hình là 600 + +32 +00:01:57,870 --> 00:02:00,870 +x 800, khi quả bóng ở vị trí + +33 +00:02:00,900 --> 00:02:03,390 +Y trên 300, hãy nhớ + +34 +00:02:03,420 --> 00:02:05,940 +300 là một nửa của 600, + +35 +00:02:06,270 --> 00:02:11,270 +và trục Y đi từ 0 đến 300 và 0 đến -300. + +36 +00:02:12,780 --> 00:02:15,630 +Vì vậy, một khi quả bóng đã vượt quá 300, thì nó + +37 +00:02:15,930 --> 00:02:19,770 +sẽ vượt qua bức tường, phải không? Vì vậy, tại thời điểm đó, tôi + +38 +00:02:19,800 --> 00:02:22,230 +có thể chắc chắn rằng nó sẽ va vào tường + +39 +00:02:22,260 --> 00:02:23,970 +hoặc nó đã va vào tường. + +40 +00:02:24,540 --> 00:02:27,810 +Vì vậy, đó sẽ là tiêu chí phát hiện va chạm của tôi. + +41 +00:02:28,170 --> 00:02:33,170 +Vì vậy, nó có thể nói nếu quả bóng. ycor lớn hơn 300, trong trường hợp đó về cơ bản nó + +42 +00:02:36,960 --> 00:02:41,610 +đã đi quá xa và chạm vào bức tường trên cùng. Bây giờ, ngoài ra, + +43 +00:02:41,670 --> 00:02:44,820 +tôi có thể thêm một hoặc câu + +44 +00:02:44,850 --> 00:02:49,620 +lệnh để nói nếu quả bóng. ycor nhỏ hơn -300, thì điều đó + +45 +00:02:49,980 --> 00:02:53,670 +có nghĩa là nó đã đi quá xa và chạm vào thành đáy. + +46 +00:02:54,120 --> 00:02:57,690 +Vì vậy, trong trường hợp này, nó cần phải trả lại. + +47 +00:02:58,930 --> 00:03:02,350 +Vì vậy, chúng ta cần tìm cách làm thế nào để quả bóng của chúng ta nảy lên. + +48 +00:03:02,770 --> 00:03:07,770 +Và chúng tôi sẽ tạo một phương thức trả lại trong lớp bóng của chúng tôi để cho nó biết cách + +49 +00:03:08,260 --> 00:03:10,270 +thực hiện điều này. Đầu tiên, chúng ta + +50 +00:03:10,300 --> 00:03:15,300 +sẽ cần tìm ra một Y mới vì tọa độ Y cần phải đảo ngược về + +51 +00:03:15,580 --> 00:03:17,530 +cơ bản. Vì vậy, trong + +52 +00:03:17,530 --> 00:03:22,510 +khi trước đây tọa độ Y của chúng ta đi lên và đi lên và tăng lên + +53 +00:03:22,510 --> 00:03:26,860 +mỗi lần, khi nó chạm vào bức tường, nó cần phải đảo ngược hướng. + +54 +00:03:27,130 --> 00:03:28,750 +Vì vậy, nếu nó đang + +55 +00:03:28,810 --> 00:03:32,740 +tăng lên, nó cần phải giảm xuống. Nếu nó đang giảm, nó cần phải tăng lên. + +56 +00:03:33,250 --> 00:03:38,250 +Vì vậy, về cơ bản chúng ta cần điều ngược lại với những gì hiện tại. Để làm điều đó, cách dễ nhất + +57 +00:03:38,680 --> 00:03:41,770 +là tạo một thuộc tính mà tôi sẽ + +58 +00:03:41,800 --> 00:03:45,010 +gọi là x_move và một thuộc tính khác mà + +59 +00:03:45,010 --> 00:03:47,290 +tôi sẽ gọi là y_move. + +60 +00:03:48,640 --> 00:03:51,160 +Chúng sẽ bắt đầu từ lúc 10 + +61 +00:03:51,610 --> 00:03:55,300 +giờ, và mỗi khi di chuyển quả bóng, chúng tôi + +62 +00:03:55,800 --> 00:04:00,210 +sẽ tự nói. xcor + bản thân. x_move, và cộng với + +63 +00:04:00,660 --> 00:04:03,510 +bản thân. y_move. + +64 +00:04:03,960 --> 00:04:06,210 +Điều này về cơ bản không thay đổi bất cứ điều gì. + +65 +00:04:06,210 --> 00:04:09,390 +Chỉ là mỗi lần quả bóng di chuyển, nó + +66 +00:04:09,660 --> 00:04:13,950 +sẽ tăng ở tọa độ X thêm 10 pixel và cũng tăng + +67 +00:04:14,370 --> 00:04:19,290 +10 pixel ở tọa độ Y. Tuy nhiên, khi chúng ta + +68 +00:04:19,320 --> 00:04:21,060 +trả lại, chúng + +69 +00:04:21,510 --> 00:04:24,390 +ta cần thay đổi y_move của + +70 +00:04:24,630 --> 00:04:29,630 +mình để nó ngược lại với hướng của nó trước đây. + +71 +00:04:31,020 --> 00:04:35,310 +Vì vậy, nếu trước đây là +10, chúng tôi muốn bây giờ là -10, và nếu trước đây + +72 +00:04:35,790 --> 00:04:40,170 +là -10, chúng tôi muốn bây giờ là +10. Để làm được điều đó, tất cả những + +73 +00:04:40,230 --> 00:04:43,110 +gì chúng ta cần làm là nhân nó với - 1. + +74 +00:04:43,680 --> 00:04:48,680 +Vì vậy, điều đó có nghĩa là nếu y_move hiện bằng 10 và 10 đang được thêm vào tọa độ + +75 +00:04:48,990 --> 00:04:51,750 +Y, thì quả bóng này sẽ di chuyển lên trên. + +76 +00:04:52,170 --> 00:04:56,760 +Nhưng khi chúng ta đảo ngược hướng bằng cách nhân nó với + +77 +00:04:57,120 --> 00:04:59,490 +-1, bây giờ nó là -10. + +78 +00:04:59,940 --> 00:05:03,570 +Vì vậy, bây giờ chúng tôi đang cộng -10 vào tọa + +79 +00:05:03,600 --> 00:05:08,520 +độ Y, giống như trừ đi 10. Vì vậy, đây là một số môn toán trung + +80 +00:05:08,550 --> 00:05:13,080 +học cơ bản sẽ giúp chương trình bóng bàn của chúng ta bắt đầu đi đúng hướng. + +81 +00:05:14,040 --> 00:05:17,370 +Bây giờ, trở lại chính. py trong những điều + +82 +00:05:17,400 --> 00:05:19,770 +kiện này khi bóng chạm đỉnh hoặc chạm + +83 +00:05:20,130 --> 00:05:22,650 +đáy, chúng ta sẽ làm cho bóng nảy lên. + +84 +00:05:23,550 --> 00:05:28,380 +Và bây giờ nếu tôi đánh run, bạn sẽ thấy rằng khi quả bóng chạm vào màn hình trên + +85 +00:05:28,650 --> 00:05:32,580 +cùng, nó sẽ quay trở lại, chính xác theo cách mà chúng ta muốn. + +86 +00:05:33,120 --> 00:05:35,130 +Nhưng điều duy nhất mà chúng ta có thể cần điều chỉnh là + +87 +00:05:35,280 --> 00:05:39,450 +xem nó đã đi được bao xa trước khi nó thực sự bật lại. Nó hoàn toàn biến mất khỏi + +88 +00:05:40,140 --> 00:05:42,870 +màn hình trước khi nó thực sự phát ra. + +89 +00:05:43,260 --> 00:05:46,320 +Vì vậy chúng ta có thể điều chỉnh các giá trị này cho phù hợp. + +90 +00:05:46,350 --> 00:05:50,490 +Vì vậy, tôi nghĩ nó hoạt động tốt nhất khi chúng tôi thực sự có nó là 280. + +91 +00:05:51,000 --> 00:05:55,680 +Vì vậy, hãy nhớ rằng chiều rộng của quả bóng là 20 pixel, vì vậy nếu chúng ta + +92 +00:05:55,980 --> 00:05:58,580 +cách bức tường 20 pixel, thì đó là khá nhiều + +93 +00:05:58,730 --> 00:06:02,240 +nơi chúng ta cần bật lên. Vì vậy, nếu tôi chạy lại điều + +94 +00:06:02,270 --> 00:06:06,980 +này, bạn có thể thấy rằng quả bóng chạm sát vào tường và sau đó nó quay trở lại ngay lập tức. + +95 +00:06:08,300 --> 00:06:12,320 +Vì vậy, điều này sẽ mất một chút suy nghĩ để đầu của bạn xung quanh nó. + +96 +00:06:12,650 --> 00:06:17,650 +Cách tốt nhất để thực sự hiểu điều này là in ra các giá trị của new_y cũng như + +97 +00:06:19,070 --> 00:06:20,840 +của y_move và cả sau khi + +98 +00:06:21,080 --> 00:06:26,060 +bạn đã sửa đổi bước di chuyển trong lần thoát. Nhìn vào những con số đó và cuối cùng + +99 +00:06:26,150 --> 00:06:30,320 +bạn sẽ có thể hiểu điều gì đang thực sự xảy ra với vị + +100 +00:06:30,320 --> 00:06:33,140 +trí của quả bóng. Nhưng một cách hiệu + +101 +00:06:33,170 --> 00:06:38,030 +quả, tất cả những gì chúng tôi đang làm là xác định một lượng mà quả bóng + +102 +00:06:38,090 --> 00:06:40,400 +sẽ di chuyển theo trục X và Y. + +103 +00:06:40,850 --> 00:06:45,850 +Chúng tôi đang thêm số tiền đó vào tọa độ X và Y để di chuyển quả bóng. + +104 +00:06:47,000 --> 00:06:50,180 +Và khi quả bóng cần bật ra khỏi các bức tường trên + +105 +00:06:50,450 --> 00:06:55,450 +cùng và dưới cùng, chúng ta đảo ngược số y_move để chúng ta lấy nó để trừ thay vì cộng. + +106 +00:06:57,890 --> 00:07:00,230 +Và điều đó di chuyển nó theo hướng ngược lại. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/007 How to Detect Collisions with the Paddle.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/007 How to Detect Collisions with the Paddle.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..39334689170e9a3d8dce67cc0bf6898b63284b43 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/007 How to Detect Collisions with the Paddle.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53094cc6258b727753dd726bc87b4d9e56e8d86c720f4d2746e54ba48657558b +size 21976461 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/007 How to Detect Collisions with the Paddle_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/007 How to Detect Collisions with the Paddle_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fa123fa69dd629629fffed04d725cb898a89c164 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/007 How to Detect Collisions with the Paddle_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:00,180 --> 00:00:02,009 +Vì vậy, chúng tôi đã tìm ra cách + +2 +00:00:02,040 --> 00:00:07,040 +phát hiện va chạm với các bức tường trên cùng và dưới cùng và làm cho quả bóng của chúng tôi bật ra khỏi tường. + +3 +00:00:07,470 --> 00:00:11,550 +Việc tiếp theo chúng ta cần làm là phát hiện khi nào có va chạm + +4 +00:00:11,550 --> 00:00:14,970 +với mái chèo và làm bóng bật ra khỏi mái chèo. + +5 +00:00:15,630 --> 00:00:18,840 +Đây có lẽ sẽ là phần khó nhất của chương trình này vì vậy tôi muốn + +6 +00:00:19,080 --> 00:00:21,600 +nói với bạn về logic. Bây giờ, làm thế nào chúng ta + +7 +00:00:21,630 --> 00:00:25,650 +có thể biết khi nào quả bóng đã chạm vào mái chèo? Bây giờ, thông thường chúng ta + +8 +00:00:25,680 --> 00:00:30,680 +sử dụng phương pháp khoảng cách để kiểm tra khoảng cách giữa quả bóng và + +9 +00:00:30,690 --> 00:00:34,680 +mái chèo là bao nhiêu. Và nếu nó ít hơn một số tiền + +10 +00:00:34,710 --> 00:00:38,670 +nhất định, thì chúng ta có thể tương đối chắc chắn rằng họ đã liên hệ với nhau. + +11 +00:00:39,360 --> 00:00:42,540 +Vì vậy, mã mà chúng ta thường sử dụng sẽ như thế này. + +12 +00:00:42,960 --> 00:00:47,190 +Chúng tôi nhận được quả bóng của mình và chúng tôi kiểm tra khoảng cách của nó với mái chèo. + +13 +00:00:47,820 --> 00:00:52,820 +Bây giờ hãy nhớ rằng quả bóng của chúng ta có chiều rộng là 20 pixel và mái chèo của chúng + +14 +00:00:54,150 --> 00:00:57,930 +ta có chiều rộng là 20 pixel. Thông thường chúng ta sẽ + +15 +00:00:57,960 --> 00:01:02,430 +nói, tốt, nếu khoảng cách giữa hai người họ nhỏ hơn 20, thì có + +16 +00:01:02,430 --> 00:01:04,500 +lẽ họ đã liên lạc, phải không? + +17 +00:01:05,040 --> 00:01:09,300 +Nhưng vấn đề xảy ra khi quả bóng chạm vào mái chèo, không phải + +18 +00:01:09,390 --> 00:01:11,370 +ở chính giữa mà là ở + +19 +00:01:11,760 --> 00:01:16,500 +rìa của mái chèo, bởi vì khoảng cách này đo trọng tâm của quả bóng từ + +20 +00:01:16,500 --> 00:01:18,570 +tâm của mái chèo là khoảng cách. + +21 +00:01:18,600 --> 00:01:22,140 +Vì vậy, bạn có thể thấy rằng khoảng cách này lớn hơn 20, + +22 +00:01:22,410 --> 00:01:25,200 +vì vậy nó sẽ không được coi là va chạm. + +23 +00:01:26,280 --> 00:01:28,920 +Làm thế nào chúng ta có thể giải quyết vấn đề này? Chà, chúng ta có + +24 +00:01:28,950 --> 00:01:33,150 +thể thêm vào một điều kiện bổ sung. Chúng tôi có thể kiểm tra xem quả + +25 +00:01:33,150 --> 00:01:38,150 +bóng đã đi qua một điểm nhất định trên trục X chưa, nếu nó đi đủ xa về bên + +26 +00:01:38,700 --> 00:01:43,700 +phải và nằm trong khoảng cách 50 pixel so với mái chèo, thì điều đó cũng có nghĩa + +27 +00:01:44,880 --> 00:01:45,713 +là nó + +28 +00:01:45,750 --> 00:01:50,750 +đã tiếp xúc với mái chèo. Bên trong chính của chúng tôi. py Tôi sẽ thêm + +29 +00:01:52,260 --> 00:01:57,260 +một nhận xét để phát hiện va chạm với mái chèo bên phải. + +30 +00:02:00,120 --> 00:02:04,200 +Vì vậy, hãy thử nghiệm với một số con số ở đây và xem liệu chúng ta có thể làm cho quả bóng + +31 +00:02:04,200 --> 00:02:06,720 +bật ra khỏi mái chèo hay không. Trong trường hợp này, + +32 +00:02:06,750 --> 00:02:11,750 +chúng ta sẽ kiểm tra xem quả bóng. khoảng cách tới r_paddle nhỏ + +33 +00:02:15,570 --> 00:02:20,570 +hơn 50 và bóng. xcor lớn hơn 340. + +34 +00:02:24,060 --> 00:02:25,830 +Nếu quả bóng đã chạm đúng mái chèo, chúng ta hãy + +35 +00:02:26,040 --> 00:02:30,840 +in thứ gì đó ra bảng điều khiển để kiểm tra mã của chúng ta. Hãy in liên hệ. + +36 +00:02:32,940 --> 00:02:37,260 +Vì vậy, nếu chúng tôi chạy mã này và tôi quản lý để tiếp xúc với quả bóng, + +37 +00:02:37,530 --> 00:02:41,910 +bạn có thể thấy rằng nó có nội dung 'Đã tiếp xúc' trong bảng điều khiển của chúng tôi. + +38 +00:02:42,390 --> 00:02:44,850 +Vì vậy, thay vì chỉ in tiếp xúc được thực hiện, những gì + +39 +00:02:44,970 --> 00:02:49,650 +chúng ta muốn quả bóng làm là nảy lại, nảy lên. Bây giờ, lần trả lại này hơi khác + +40 +00:02:49,680 --> 00:02:52,680 +một chút so với lần trả lại cuối cùng, bởi + +41 +00:02:53,040 --> 00:02:58,040 +vì lần trả lại trước đó đang thay đổi tọa độ Y của nó để nó di chuyển + +42 +00:02:58,470 --> 00:03:02,830 +ngược lại dọc theo phương thẳng đứng. Nhưng trong trường hợp này, chúng tôi + +43 +00:03:02,860 --> 00:03:07,420 +thực sự muốn nó di chuyển theo hướng ngược lại theo phương ngang bởi vì mái chèo ở + +44 +00:03:07,420 --> 00:03:09,940 +đây và quả bóng đang tới theo hướng này, chúng + +45 +00:03:10,120 --> 00:03:14,590 +tôi muốn nó quay ngược lại theo hướng này. Vì vậy, thay vì chỉ gọi nó là bounce_, + +46 +00:03:14,620 --> 00:03:19,360 +tôi sẽ nhấp chuột phải vào nó, sau đó cấu trúc lại và đổi tên thành bounce_ y + +47 +00:03:19,420 --> 00:03:23,860 +vì nó đang nảy trong trục Y. Bây giờ, khi chúng ta nhấn refactor, + +48 +00:03:24,220 --> 00:03:28,120 +nó sẽ thay đổi nó ở đây và nó sẽ thay đổi nó ở đây. + +49 +00:03:29,770 --> 00:03:33,460 +Bây giờ, trên hết, tôi sẽ xác định bounce_x của + +50 +00:03:33,730 --> 00:03:37,600 +mình, để nó nảy theo trục X và điều này rất giống. + +51 +00:03:37,630 --> 00:03:39,910 +Chúng ta sẽ thay đổi x_move, + +52 +00:03:39,940 --> 00:03:44,940 +do đó, số lượng quả bóng di chuyển mỗi lần khi phương thức di chuyển + +53 +00:03:45,340 --> 00:03:48,100 +được gọi và tôi sẽ nhân nó với + +54 +00:03:48,430 --> 00:03:51,160 +-1, vì vậy hãy đảo ngược hướng X. + +55 +00:03:51,850 --> 00:03:54,760 +Và sau đó khi va chạm của chúng ta + +56 +00:03:54,790 --> 00:03:58,660 +được phát hiện, chúng ta sẽ làm cho quả bóng nảy theo hướng X. + +57 +00:03:59,440 --> 00:04:01,360 +Vì vậy, bây giờ nếu chúng ta chạy mã + +58 +00:04:01,390 --> 00:04:04,930 +của mình, bạn có thể thấy rằng mặc dù điều này chỉ hoạt động trên mái chèo + +59 +00:04:05,200 --> 00:04:07,030 +bên phải, nhưng khi quả bóng chạm + +60 +00:04:07,270 --> 00:04:11,500 +vào mái chèo bên phải, nó sẽ di chuyển trở lại và nó bật trở lại về phía bên trái. + +61 +00:04:11,860 --> 00:04:16,570 +Nó thay đổi hướng mà nó đang di chuyển trong trục X. + +62 +00:04:17,740 --> 00:04:22,740 +Vì vậy, bây giờ chúng ta hãy thêm va chạm cho cả hai mái chèo vì cả hai + +63 +00:04:25,690 --> 00:04:26,920 +đều cần nảy + +64 +00:04:27,280 --> 00:04:32,280 +theo trục X và vì vậy chúng ta sẽ gắn thẻ vào câu lệnh này là 'hoặc' + +65 +00:04:32,410 --> 00:04:37,410 +và chúng ta sẽ nói hoặc nếu quả bóng. khoảng cách đến mái chèo bên trái + +66 +00:04:41,860 --> 00:04:43,300 +cũng nhỏ hơn + +67 +00:04:43,450 --> 00:04:48,450 +50 và trên đó là quả bóng. xcor nhỏ hơn -340. + +68 +00:04:53,080 --> 00:04:58,080 +Vì vậy, về cơ bản điều này sẽ kiểm tra xem quả bóng đã đi đủ xa về + +69 +00:04:58,360 --> 00:05:03,360 +bên trái để vượt qua mái chèo và nó nằm trong khoảng cách 50 pixel từ mái chèo + +70 +00:05:05,230 --> 00:05:08,080 +bên trái hay chưa. Vì vậy, nếu chúng tôi chạy mã + +71 +00:05:08,110 --> 00:05:12,370 +ngay bây giờ, bạn có thể thấy rằng quả bóng của chúng tôi không chỉ nảy khi nó chạm bên phải. + +72 +00:05:14,230 --> 00:05:16,630 +Vì vậy, bây giờ khi chúng tôi chạy + +73 +00:05:16,660 --> 00:05:20,500 +lại chương trình, bạn có thể thấy rằng quả bóng không chỉ nảy lên ở + +74 +00:05:20,740 --> 00:05:24,940 +mái chèo bên phải mà nó còn nảy lên khi chạm vào mái chèo bên trái. + +75 +00:05:26,170 --> 00:05:30,370 +Bây giờ, chúng ta có thể điều chỉnh thêm một chút về tọa độ + +76 +00:05:30,370 --> 00:05:33,160 +vì bạn có thể thấy rằng khi quả bóng + +77 +00:05:33,220 --> 00:05:38,220 +chạm vào mái chèo, nó sẽ đi quá xa một chút trước khi thực sự đảo ngược hướng. + +78 +00:05:39,160 --> 00:05:44,160 +Vì vậy, chúng tôi có thể thay đổi số này thành một số nhỏ hơn một chút nếu chúng tôi muốn + +79 +00:05:45,580 --> 00:05:48,370 +nó bật lên trước khi nó nằm trong paddle thực tế. + +80 +00:05:48,700 --> 00:05:53,700 +Vì vậy, chúng tôi có thể thay đổi điều này thành 320 và điều này cũng thành 320 và lưu + +81 +00:05:55,000 --> 00:05:59,000 +ý những gì sẽ xảy ra bây giờ. Trước khi nó chạm vào mái chèo thực + +82 +00:05:59,180 --> 00:06:04,180 +sự, bây giờ nó thực sự nảy lên và trông không giống như thể quả bóng rơi vào mái chèo + +83 +00:06:05,120 --> 00:06:08,960 +trước khi nó quay trở lại. Và bạn có nó rồi đấy! + +84 +00:06:09,080 --> 00:06:12,530 +Bây giờ chúng ta chỉ cần tìm hiểu xem điều gì sẽ xảy + +85 +00:06:12,530 --> 00:06:16,220 +ra khi mái chèo trượt bóng. Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/008 How to Detect when the Ball goes Out of Bounds.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/008 How to Detect when the Ball goes Out of Bounds.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b1acab12dc2541ac6f0ec5bf863922a78b9b6473 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/008 How to Detect when the Ball goes Out of Bounds.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02994effeb4f50926067ee23f20b9d6efeab1e33b5edeb5706b6f6c8d7710bf8 +size 26131624 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/008 How to Detect when the Ball goes Out of Bounds_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/008 How to Detect when the Ball goes Out of Bounds_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..106102b2a18320fcebf1af754d78e2d2b182ad27 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/008 How to Detect when the Ball goes Out of Bounds_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,270 --> 00:00:03,120 +Bây giờ chúng ta đã gần kết thúc chương trình. + +2 +00:00:03,240 --> 00:00:08,130 +Chúng tôi đã cố gắng làm được nhiều thứ khác ngoài việc phát hiện thời điểm + +3 +00:00:08,130 --> 00:00:12,630 +mái chèo thực sự trượt bóng. Và nếu mái chèo bên phải đánh trượt + +4 +00:00:12,780 --> 00:00:15,150 +bóng, thì người chơi bên trái sẽ được tính điểm. + +5 +00:00:15,930 --> 00:00:20,340 +Và điều này sẽ kích hoạt bắt đầu lại trò chơi khi bóng quay + +6 +00:00:20,340 --> 00:00:23,760 +trở lại tâm và bắt đầu theo hướng ngược lại. + +7 +00:00:24,600 --> 00:00:26,010 +Để làm được điều này, + +8 +00:00:26,040 --> 00:00:30,240 +để phát hiện khi nào một tay chèo đã thực sự đánh trượt bóng, một cách + +9 +00:00:30,240 --> 00:00:35,130 +hiệu quả, những gì chúng tôi đang kiểm tra là quả bóng đã đi qua một điểm nhất + +10 +00:00:35,130 --> 00:00:37,590 +định trên màn hình. Vì vậy, chúng tôi biết rằng + +11 +00:00:37,590 --> 00:00:42,240 +chúng tôi đã kiểm tra khi quả bóng đi qua vạch này và nó nằm trong phạm vi 50 pixel của mái + +12 +00:00:42,240 --> 00:00:42,960 +chèo, thì + +13 +00:00:42,960 --> 00:00:46,740 +nó sẽ bật trở lại vì điều đó có nghĩa là quả bóng đã bị mái chèo bắt. + +14 +00:00:47,130 --> 00:00:51,150 +Nhưng nếu nó đi xa hơn thế, nếu nó vượt quá mức trên màn hình như + +15 +00:00:51,450 --> 00:00:53,820 +ở đây hoặc ở đây, thì điều đó có + +16 +00:00:54,090 --> 00:00:57,450 +nghĩa là nó bị trượt và chúng ta nên đặt lại quả bóng. + +17 +00:00:58,200 --> 00:01:01,140 +Hãy suy nghĩ về cách bạn có thể tạo ra hành vi này và + +18 +00:01:01,650 --> 00:01:05,310 +như một thách thức đối với bản thân, hãy xem liệu bạn có thể hoàn thành mã hay không. + +19 +00:01:09,920 --> 00:01:12,200 +Vì vậy, tôi sẽ thêm một + +20 +00:01:12,230 --> 00:01:17,230 +nhận xét khác ở đây sẽ được phát hiện khi mái chèo bên phải bị trượt. + +21 +00:01:19,490 --> 00:01:21,920 +Đòn đánh bên phải về cơ + +22 +00:01:22,040 --> 00:01:27,040 +bản đã đánh trượt bóng nếu bóng. xcor vượt quá 380. + +23 +00:01:28,430 --> 00:01:31,550 +Chúng ta biết rằng chiều rộng của màn hình + +24 +00:01:31,640 --> 00:01:34,850 +là 800 và chúng ta biết rằng cánh khuấy là 350. + +25 +00:01:35,120 --> 00:01:40,040 +Vì vậy, về cơ bản mái chèo đi từ 340 đến 360, và nếu nó + +26 +00:01:40,370 --> 00:01:42,470 +đã vượt quá 380, thì + +27 +00:01:42,470 --> 00:01:47,120 +mái chèo chắc chắn đã trượt bóng. Vì vậy, trong tình huống này, + +28 +00:01:47,150 --> 00:01:50,570 +chúng tôi sẽ đưa bóng về vị trí của nó. + +29 +00:01:51,170 --> 00:01:55,160 +Và đây sẽ là một phương pháp trong lớp bóng. + +30 +00:01:55,730 --> 00:01:58,580 +Vì vậy, hãy tạo nó và tôi sẽ dán nó vào để tôi + +31 +00:01:58,580 --> 00:02:03,580 +không mắc bất kỳ lỗi nào về cách đặt tên. Đặt lại vị trí của bóng + +32 +00:02:04,640 --> 00:02:09,639 +sẽ liên quan đến việc đưa bóng về vị trí ban đầu. + +33 +00:02:10,310 --> 00:02:15,230 +Vì vậy, chúng tôi có thể nói với bản thân để đi đến (0, 0). + +34 +00:02:16,010 --> 00:02:17,780 +Bây giờ, nếu chúng ta chạy mã + +35 +00:02:18,020 --> 00:02:22,490 +của mình, bạn có thể biết khi nào quả bóng đã đi qua một điểm nhất định và nó + +36 +00:02:22,490 --> 00:02:25,490 +không bị mái chèo bắt, nó sẽ quay trở lại trung tâm. + +37 +00:02:26,810 --> 00:02:30,380 +Nhưng chúng tôi muốn bóng đi theo hướng ngược lại khi bị + +38 +00:02:30,500 --> 00:02:35,300 +cầu thủ bên cánh phải bỏ qua. Đã đến lúc người chơi bên trái + +39 +00:02:35,300 --> 00:02:36,650 +có lượt đi. + +40 +00:02:37,430 --> 00:02:41,420 +Vì vậy, ngoài việc làm cho quả bóng đặt lại vị trí của + +41 +00:02:41,750 --> 00:02:45,830 +nó, chúng ta sẽ làm cho quả bóng đảo ngược trục X của nó. + +42 +00:02:46,280 --> 00:02:49,610 +Vì vậy, chúng ta sẽ gọi là bản thân. bounce_x. + +43 +00:02:50,480 --> 00:02:53,630 +Bây giờ hãy để ý xem khi quả bóng bị + +44 +00:02:54,050 --> 00:02:56,420 +trượt, hướng của nó bị đảo + +45 +00:02:56,510 --> 00:03:00,610 +ngược, nó bắt đầu ở giữa và đi theo hướng ngược lại. + +46 +00:03:01,360 --> 00:03:05,100 +Hãy tiếp tục và xác định lỗi mái chèo bên trái. + +47 +00:03:07,530 --> 00:03:12,530 +Và chúng ta có thể làm điều đó bằng cách nói quả bóng. xcor nhỏ hơn -380. + +48 +00:03:15,600 --> 00:03:19,920 +Và trong trường hợp này, chúng tôi sẽ lại lấy bóng để đặt lại vị trí. + +49 +00:03:20,490 --> 00:03:24,900 +Bây giờ, lý do tại sao tôi có các câu lệnh if riêng biệt là vì sau + +50 +00:03:24,930 --> 00:03:29,610 +này, chúng ta sẽ cần phát hiện khi nào người chơi bên phải hoặc người chơi bên trái + +51 +00:03:29,610 --> 00:03:33,420 +thực sự giành được một điểm. Vì vậy, khi mái chèo bên phải trượt, + +52 +00:03:33,720 --> 00:03:37,650 +người chơi bên trái được một điểm, khi mái chèo bên trái trượt người chơi bên phải sẽ + +53 +00:03:37,650 --> 00:03:38,490 +nhận được điểm. + +54 +00:03:39,660 --> 00:03:44,070 +Bây giờ khi bóng đi qua biên bên phải và nó không bị mái chèo bắt, khi + +55 +00:03:44,430 --> 00:03:47,430 +đó nó bắt đầu ở giữa và di chuyển sang trái. + +56 +00:03:47,850 --> 00:03:51,480 +Khi nó không bị bắt bởi phía bên trái của mái chèo, nó sẽ bắt + +57 +00:03:51,660 --> 00:03:54,210 +đầu ở giữa và nó đi sang bên phải. + +58 +00:03:55,080 --> 00:03:59,190 +Tất cả những gì còn lại cần làm là tìm ra cách ghi bàn. + +59 +00:03:59,550 --> 00:04:02,130 +Và đó là những gì chúng ta sẽ làm trong bài học tiếp theo. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Course-Fixes-Report-an-Issue.url b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Score Keeping and Changing the Ball Speed.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Score Keeping and Changing the Ball Speed.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9568488d54469c97155fb5843f4db1df6071c03b --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Score Keeping and Changing the Ball Speed.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67a1efb395ea89c418dde0a6dfd241f41cc9dc2e48a1fc12c463da32cc34ac06 +size 54274226 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Score Keeping and Changing the Ball Speed_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Score Keeping and Changing the Ball Speed_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6c9b7b6420a956b48efd241ff4953ded5b5db269 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Score Keeping and Changing the Ball Speed_vi.srt @@ -0,0 +1,560 @@ +1 +00:00:00,330 --> 00:00:04,260 +Để bắt đầu, chúng ta sẽ cần tạo một tệp bảng điểm mới. + +2 +00:00:05,640 --> 00:00:07,170 +Và bên trong tệp này, + +3 +00:00:07,170 --> 00:00:12,170 +chúng tôi sẽ thêm các nhập thông thường của chúng tôi và chúng tôi sẽ tạo lớp + +4 +00:00:12,390 --> 00:00:13,223 +bảng điểm. + +5 +00:00:13,650 --> 00:00:17,400 +Bây giờ lớp bảng điểm sẽ kế thừa từ lớp rùa, vì vậy chúng ta có thể tiếp tục + +6 +00:00:17,670 --> 00:00:22,670 +và thêm tất cả các inits và siêu phẩm của chúng ta. trong đó. + +7 +00:00:24,330 --> 00:00:26,700 +Bây giờ chúng ta hãy xác định bảng điểm của chúng ta. + +8 +00:00:27,000 --> 00:00:31,590 +Nó sẽ có màu trắng để nó hiển thị trên nền đen, nó sẽ + +9 +00:00:32,040 --> 00:00:35,670 +có bút lên vì chúng ta không muốn nó vẽ và + +10 +00:00:36,180 --> 00:00:41,180 +nó cũng sẽ ẩn con rùa của nó vì chúng ta chỉ quan tâm đến nó + +11 +00:00:41,310 --> 00:00:43,860 +có thể viết một cái gì đó. + +12 +00:00:44,430 --> 00:00:47,910 +Và điều mà chúng tôi muốn nó viết là điểm số hiện tại. + +13 +00:00:48,270 --> 00:00:52,140 +Hãy tiếp tục và tạo một số thuộc tính cho lớp bảng điểm. + +14 +00:00:52,500 --> 00:00:56,850 +Một sẽ là l_score bắt đầu từ 0, và + +15 +00:00:57,330 --> 00:01:01,200 +kia sẽ là r_score bắt đầu từ 0. + +16 +00:01:01,650 --> 00:01:06,240 +Vì vậy, bảng điểm của chúng tôi sẽ theo dõi hoạt động của người chơi bên trái và + +17 +00:01:06,240 --> 00:01:07,470 +người chơi bên phải. + +18 +00:01:08,640 --> 00:01:12,330 +Và sau đó nó sẽ ghi điều này lên màn hình. + +19 +00:01:12,810 --> 00:01:16,350 +Vì vậy, chúng tôi sẽ viết cái tôi. l_score trước tiên, và chúng ta + +20 +00:01:16,920 --> 00:01:21,920 +sẽ thay đổi căn chỉnh thành trung tâm và cũng thay đổi phông chữ thành một + +21 +00:01:23,070 --> 00:01:24,600 +thứ gì đó khá + +22 +00:01:24,840 --> 00:01:29,840 +lớn, như phông chữ chuyển phát nhanh với 80 điểm và có trọng lượng bình thường. + +23 +00:01:32,520 --> 00:01:35,970 +Tuy nhiên, chúng tôi muốn điều này được viết ở đâu? Bởi vì theo mặc + +24 +00:01:35,970 --> 00:01:39,990 +định, điều này sẽ được viết ở giữa màn hình, (0, 0). + +25 +00:01:40,590 --> 00:01:41,430 +Nhưng thay vào + +26 +00:01:41,490 --> 00:01:46,490 +đó, những gì chúng tôi muốn nó làm là chúng tôi có thể muốn nó đi đến một nơi nào đó ở phía + +27 +00:01:46,920 --> 00:01:49,350 +trên bên trái của màn hình. Đây là điểm số của người chơi bên trái. + +28 +00:01:49,890 --> 00:01:52,320 +Vì vậy, bạn có thể chơi với + +29 +00:01:52,440 --> 00:01:56,610 +các tọa độ, nhưng tôi thấy rằng -100 ở trục X, vì vậy, + +30 +00:01:56,640 --> 00:02:01,080 +một chút về bên trái của tâm và sau đó là 200 trên trục Y, + +31 +00:02:01,080 --> 00:02:06,080 +vì vậy gần đầu màn hình có vẻ để làm tốt cho điểm bên trái này. + +32 +00:02:06,720 --> 00:02:11,720 +Bây giờ chúng ta hãy làm cho điều này hiển thị bằng cách quay trở lại chính của chúng ta. py và nhập lớp bảng điểm + +33 +00:02:12,210 --> 00:02:16,200 +của chúng tôi và tạo một đối tượng bảng điểm mới. + +34 +00:02:17,850 --> 00:02:21,570 +Vì vậy, khi chúng tôi nhấn run, bạn có thể thấy số 0 lớn đó hiển thị sáng ở đây. + +35 +00:02:22,590 --> 00:02:23,010 +Bây + +36 +00:02:23,010 --> 00:02:27,870 +giờ, điều tiếp theo chúng ta cần làm là hiển thị điểm số của người chơi bên phải. + +37 +00:02:28,410 --> 00:02:33,410 +Chúng tôi sẽ làm cho bảng điểm của chúng tôi chuyển sang phía đối diện của màn hình, + +38 +00:02:34,800 --> 00:02:37,980 +do đó, con số đó sẽ là +100 và một lần + +39 +00:02:37,980 --> 00:02:40,230 +nữa với giá trị Y là 200. + +40 +00:02:40,980 --> 00:02:45,360 +Và sau đó chúng ta sẽ làm cho nó để viết điểm bên phải, vì vậy + +41 +00:02:45,990 --> 00:02:50,730 +điểm của chúng ta, và chúng ta sẽ có cùng một căn chỉnh và cùng một phông chữ. + +42 +00:02:51,720 --> 00:02:56,250 +Bây giờ bạn có thể thấy 0 0 khi trò chơi bắt đầu. Bây giờ, những gì chúng tôi thực + +43 +00:02:56,250 --> 00:03:00,100 +sự muốn bảng điểm của mình làm là theo dõi điểm số. + +44 +00:03:00,490 --> 00:03:05,110 +Vì vậy, khi mái chèo bên phải trượt, đó là điểm cho người chơi bên trái. + +45 +00:03:05,860 --> 00:03:08,530 +Chúng tôi có thể xác định điều đó trong chính của chúng tôi. py + +46 +00:03:09,070 --> 00:03:11,350 +Khi mái chèo bên phải bị + +47 +00:03:11,530 --> 00:03:14,500 +trượt, thì chúng ta sẽ lấy bảng điểm này + +48 +00:03:14,530 --> 00:03:17,500 +để cung cấp cho bên trái một điểm. + +49 +00:03:17,920 --> 00:03:22,920 +Vì vậy, có lẽ chúng tôi có thể có một phương pháp gọi là l_point trong bảng điểm của + +50 +00:03:24,820 --> 00:03:27,460 +chúng tôi để tăng điểm trong trình phát bên trái. + +51 +00:03:27,700 --> 00:03:32,530 +Vì vậy, chúng ta có thể nói tự. l_score + = 1. + +52 +00:03:33,400 --> 00:03:36,490 +Ngoài ra, chúng tôi sẽ cần cập nhật bảng điểm của mình, + +53 +00:03:36,880 --> 00:03:39,790 +nhưng tất cả mã đó đều bị kẹt trong init. + +54 +00:03:40,090 --> 00:03:44,740 +Vì vậy, hãy tiếp tục và chuyển nó ra một hàm riêng biệt mà + +55 +00:03:44,770 --> 00:03:47,110 +chúng ta sẽ gọi là update_scoreboard. + +56 +00:03:49,470 --> 00:03:52,290 +Và chúng ta có thể gọi là tự. update_scoreboard khi chúng tôi + +57 +00:03:52,530 --> 00:03:57,180 +khởi tạo bảng điểm lần đầu tiên cũng như khi chúng tôi ghi một điểm. + +58 +00:03:59,280 --> 00:04:00,960 +Bây giờ, khi chúng tôi + +59 +00:04:01,020 --> 00:04:05,400 +chạy mã của mình, bạn có thể thấy rằng khi bên phải bỏ lỡ, bên + +60 +00:04:05,400 --> 00:04:10,230 +trái của chúng ta sẽ nhận được một điểm. Nhưng hiện tại, nó đang ghi đè điểm số trước đó. + +61 +00:04:10,800 --> 00:04:12,030 +Vì vậy, để ngăn + +62 +00:04:12,060 --> 00:04:16,890 +chặn điều đó, chúng ta phải thêm một cái tôi. rõ ràng trước khi chúng tôi cập nhật bảng điểm. + +63 +00:04:18,269 --> 00:04:23,010 +Và bạn có thể thấy bây giờ nó xóa mọi thứ đã từng ở + +64 +00:04:23,010 --> 00:04:27,840 +đó và cập nhật điểm số. Vì vậy, chúng tôi đã giải quyết khi bạn chèo phải trượt, nhưng còn + +65 +00:04:27,900 --> 00:04:31,290 +khi chèo trái của chúng ta trượt thì sao? Chà, chúng ta cũng nên + +66 +00:04:31,290 --> 00:04:34,200 +có một phương thức gọi là r_point để cung + +67 +00:04:34,440 --> 00:04:36,720 +cấp cho phía bên phải một điểm. + +68 +00:04:38,070 --> 00:04:39,780 +Vì vậy, hãy thêm điều đó ở đây. + +69 +00:04:42,690 --> 00:04:47,550 +Tăng r_score lên một và chúng tôi sẽ gọi lại + +70 +00:04:47,550 --> 00:04:48,600 +là update_scoreboard. + +71 +00:04:52,020 --> 00:04:52,380 +1: Đúng. + +72 +00:04:52,380 --> 00:04:57,300 +0: Bây giờ khi bên trái của chúng tôi trượt, chúng tôi nhận được một điểm ở bên trái, và khi bên + +73 +00:04:57,720 --> 00:05:00,900 +trái của chúng tôi trượt, chúng tôi nhận được một điểm ở bên phải. + +74 +00:05:01,800 --> 00:05:05,220 +Đó là khá nhiều tất cả của pong. Bây giờ, nếu bạn muốn có + +75 +00:05:05,250 --> 00:05:08,910 +thêm một thử thách cả về cách chơi bóng bàn cũng như mã, + +76 +00:05:09,300 --> 00:05:10,530 +hãy xem liệu + +77 +00:05:10,950 --> 00:05:15,950 +bạn có thể tìm ra cách để đưa quả bóng tăng tốc độ mỗi khi nó chạm + +78 +00:05:16,320 --> 00:05:18,330 +vào mái chèo hay không, bởi vì + +79 +00:05:18,780 --> 00:05:23,780 +điều đó sẽ làm cho trò chơi trở thành thú vị hơn rất nhiều thay vì nó + +80 +00:05:24,150 --> 00:05:27,660 +luôn di chuyển chậm như vậy. Nếu bạn không thể tìm ra nó, thì + +81 +00:05:27,900 --> 00:05:30,630 +hãy tiếp tục xem và tôi sẽ chỉ cho bạn cách giải quyết. + +82 +00:05:33,990 --> 00:05:36,720 +Vì vậy, để tăng tốc độ bóng, điều + +83 +00:05:37,170 --> 00:05:42,170 +quan trọng là chúng ta làm cho vòng lặp trò chơi của mình ngủ trong bao lâu. + +84 +00:05:43,140 --> 00:05:46,440 +Bởi vì giấc ngủ này càng ngắn, hãy giả sử + +85 +00:05:46,470 --> 00:05:48,690 +thay vì 0. 1 giây + +86 +00:05:48,720 --> 00:05:52,050 +hãy làm 0. 01 giây. + +87 +00:05:53,010 --> 00:05:57,000 +Và nếu chúng tôi chạy ngay bây giờ, bạn có thể thấy quả bóng của chúng tôi di chuyển nhanh hơn rất nhiều. + +88 +00:05:57,560 --> 00:06:00,590 +Hãy làm cho nó thậm chí còn cực đoan hơn và thêm một số 0 khác. + +89 +00:06:02,750 --> 00:06:07,130 +Vì vậy, làm thế nào chúng ta có thể giảm con số này đi một chút mỗi + +90 +00:06:07,400 --> 00:06:09,650 +lần, nhưng không bao giờ làm cho nó + +91 +00:06:09,710 --> 00:06:12,140 +trở thành số âm bởi vì nếu nó trở thành + +92 +00:06:12,410 --> 00:06:17,300 +một số âm, thì chúng ta thực sự nhận được một lỗi ở đây cho chúng ta biết rằng thời + +93 +00:06:17,300 --> 00:06:20,240 +lượng ngủ phải không âm. Để làm được điều này, + +94 +00:06:20,300 --> 00:06:24,740 +chúng ta phải tìm ra cách làm cho số này nhỏ hơn một chút + +95 +00:06:24,740 --> 00:06:25,573 +mỗi lần. + +96 +00:06:25,910 --> 00:06:30,860 +Vì vậy, hãy đặt số này thành một thuộc tính trong lớp bóng của chúng ta. + +97 +00:06:31,460 --> 00:06:36,260 +Bây giờ tôi không muốn gọi nó là tốc độ vì điều đó có thể hơi khó + +98 +00:06:36,350 --> 00:06:40,010 +hiểu vì lớp con rùa đã có một phương thức gọi là tốc + +99 +00:06:40,340 --> 00:06:45,290 +độ như bạn có thể thấy ở đây. Vì vậy, thay vào đó, tôi sẽ gọi nó là move_speed và tôi + +100 +00:06:45,860 --> 00:06:47,810 +sẽ đặt nó thành 0. 1. + +101 +00:06:49,100 --> 00:06:53,510 +Vì vậy, bây giờ bên trong chính của chúng tôi. py, thay vì có một số được mã hóa cứng, + +102 +00:06:53,510 --> 00:06:57,470 +tôi sẽ nắm lấy quả bóng của mình. tốc độ di chuyển. + +103 +00:06:58,370 --> 00:07:03,170 +Bây giờ, mỗi khi quả bóng của chúng ta nảy theo trục X, điều đó có nghĩa là + +104 +00:07:03,500 --> 00:07:06,350 +quả bóng đã được chạm vào bởi một mái chèo. + +105 +00:07:06,980 --> 00:07:11,690 +Vì vậy, bên trong phương thức này, ngoài việc làm cho nó đảo ngược hướng của + +106 +00:07:12,110 --> 00:07:17,110 +nó, chúng ta có thể giảm tốc độ di chuyển bằng cách nhân nó với một số thập phân. + +107 +00:07:18,200 --> 00:07:22,940 +Vì vậy, tôi bị mắc kẹt với số 0. 9 bởi vì điều đó dường như hiệu quả với tôi. + +108 +00:07:23,240 --> 00:07:24,320 +Vì vậy, ví dụ, nếu chúng + +109 +00:07:24,350 --> 00:07:29,350 +ta bắt đầu với giá trị là 5 và chúng ta nhân nó với 0. 9, nó trở thành + +110 +00:07:29,870 --> 00:07:31,190 +4. 5. + +111 +00:07:31,550 --> 00:07:35,300 +Và nếu chúng ta nhân nó với 0. 9 trở thành 4. 05. + +112 +00:07:35,720 --> 00:07:39,140 +Vì vậy, về cơ bản mỗi khi quả bóng nảy trên + +113 +00:07:39,410 --> 00:07:43,790 +mái chèo, nó sẽ tăng tốc độ. Nhưng điều này không thể tiếp diễn vô thời hạn. + +114 +00:07:44,060 --> 00:07:47,630 +Khi chúng tôi đặt lại trò chơi khi một người chơi đã thua, chúng + +115 +00:07:47,900 --> 00:07:52,580 +tôi phải đặt move_speed này về 0 ban đầu. 1, chỉ để nó + +116 +00:07:53,030 --> 00:07:57,020 +không tiếp tục tăng tốc độ vô thời hạn. + +117 +00:07:57,740 --> 00:08:01,190 +Vì vậy, bây giờ bạn có thể thấy bất cứ khi nào quả bóng + +118 +00:08:02,510 --> 00:08:07,340 +chạm vào mái chèo, nó sẽ tăng tốc độ của nó lên một chút khiến nó trở nên khó khăn + +119 +00:08:07,340 --> 00:08:09,080 +hơn một chút đối với người chơi. + +120 +00:08:10,130 --> 00:08:14,120 +Bây giờ, tất nhiên bạn có thể điều chỉnh xung quanh bằng số đó thay vì 0. 9, bạn có + +121 +00:08:14,120 --> 00:08:18,110 +thể có 0. 5, về cơ bản mỗi lần đều có tốc độ, nhưng + +122 +00:08:18,560 --> 00:08:22,790 +hãy chơi thử với tốc độ đó và xem bạn thích gì hơn. Một điều cuối cùng cần đề + +123 +00:08:22,790 --> 00:08:27,530 +cập trước khi chúng ta kết thúc ngày hôm nay là khi tôi đang thử nghiệm + +124 +00:08:27,530 --> 00:08:29,690 +chương trình này trên máy tính của mình, + +125 +00:08:30,080 --> 00:08:33,650 +có vẻ như khi tôi giữ phím lên hey hoặc phím xuống, + +126 +00:08:33,679 --> 00:08:36,289 +mái chèo của tôi sẽ liên tục di chuyển. + +127 +00:08:36,740 --> 00:08:41,659 +Nhưng dường như có một lỗi xảy ra với con rùa trong đó nếu tôi giữ phím 'w', nó + +128 +00:08:41,990 --> 00:08:45,230 +chỉ có thể di chuyển một chút tại một thời điểm, nhưng + +129 +00:08:45,710 --> 00:08:48,380 +nó dường như không ảnh hưởng đến phím 's'. + +130 +00:08:49,070 --> 00:08:51,740 +Vì vậy, tôi đã thực hiện một chút tìm hiểu trên mạng và tôi không + +131 +00:08:51,800 --> 00:08:56,610 +thể tìm ra chính xác lý do tại sao lại như vậy. Nếu bạn quản lý để tìm ra nó, thì hãy + +132 +00:08:56,640 --> 00:08:58,980 +thêm nó vào phần Hỏi / Đáp để + +133 +00:08:58,980 --> 00:09:03,870 +các sinh viên khác có thể học hỏi từ nó. Nhưng cho đến nay, tôi đã trở nên trống rỗng. + +134 +00:09:04,320 --> 00:09:05,580 +Nhưng đây chỉ là một cảnh báo + +135 +00:09:05,580 --> 00:09:10,580 +trong trường hợp bạn tìm thấy hành vi này cũng như trên máy tính của mình và bạn bối rối và nghĩ rằng đó là một cái gì + +136 +00:09:10,620 --> 00:09:12,990 +đó sai với mã của bạn. Nó không thể. + +137 +00:09:13,290 --> 00:09:17,520 +Đó là điều gì đó về mô-đun rùa khiến nó hoạt động như thế này. + +138 +00:09:17,850 --> 00:09:19,650 +Vì vậy, đừng lo lắng nếu điều đó xảy ra với bạn. + +139 +00:09:20,130 --> 00:09:22,080 +Và nếu bạn đang chơi bóng bàn với một người + +140 +00:09:22,290 --> 00:09:24,690 +bạn, bạn luôn có thể lừa họ sử dụng người chơi bên trái. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Solution-pong-game-final.zip b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Solution-pong-game-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..559b2452e1911e9e7aa8c62a80e652a5ddf5e367 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/009 Solution-pong-game-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01090a34ab9b12ae71f4a920000ee6b4d735db9ef4cbe1024302dfb90d55e454 +size 1627 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/010 Picturing fears even the worst-case scenario is not so scary.mp4 b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/010 Picturing fears even the worst-case scenario is not so scary.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e8c358610c76ec0b4505235e6aa8b35375ae7432 --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/010 Picturing fears even the worst-case scenario is not so scary.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad15f3a434c5411bdbaa3206bb05f7c6c359085738217e688eb1864fe15d33cf +size 61170999 diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/010 Picturing fears even the worst-case scenario is not so scary_vi.srt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/010 Picturing fears even the worst-case scenario is not so scary_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..36413cece93a3bef37db0cc80b0f6185c05b916e --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/010 Picturing fears even the worst-case scenario is not so scary_vi.srt @@ -0,0 +1,96 @@ +1 +00:00:01,070 --> 00:00:05,460 +Hoàn thành tốt ngày 22. Bây giờ, hôm nay, tôi muốn nói + +2 +00:00:05,670 --> 00:00:15,800 +với tất cả nỗi sợ hãi của bạn bởi vì tôi có rất nhiều nỗi sợ hãi và tôi có những tiếng nói cho tôi biết bạn có thể làm được, nhưng cũng có + +3 +00:00:15,800 --> 00:00:18,610 +những người nói với tôi rằng bạn không thể. + +4 +00:00:19,070 --> 00:00:26,660 +Vì vậy, bạn biết đấy, một trong những điều kìm hãm chúng ta nhiều nhất để trưởng thành, trở thành con người mà chúng ta muốn trở + +5 +00:00:26,660 --> 00:00:28,170 +thành, là nỗi sợ hãi. + +6 +00:00:28,970 --> 00:00:35,450 +Và khi bạn không nhận thức được điều mình sợ hãi, điều đó thường có thể hạn chế bạn và ngăn cản bạn đạt được những điều + +7 +00:00:35,450 --> 00:00:37,310 +mà bạn thực sự, thực sự muốn. + +8 +00:00:38,500 --> 00:00:45,970 +Hãy nhớ rằng nỗi sợ hãi là kẻ giết chết tâm trí, sợ hãi cái chết nhỏ bé, nỗi sợ hãi là điều mà tất cả chúng ta phải + +9 +00:00:45,970 --> 00:00:46,540 +đối phó. + +10 +00:00:47,050 --> 00:00:48,490 +Không ai can đảm. + +11 +00:00:48,490 --> 00:00:50,320 +Không ai chỉ là không cảm thấy nó. + +12 +00:00:50,740 --> 00:00:53,290 +Nhưng chúng tôi cảm thấy nó và chúng tôi làm theo cách nào đó. + +13 +00:00:54,400 --> 00:00:57,640 +Vì vậy, hãy nghĩ xem bạn sợ hãi + +14 +00:00:57,850 --> 00:01:01,870 +điều gì, sợ hãi điều gì mà bạn không thể đạt được. + +15 +00:01:02,050 --> 00:01:07,150 +Bạn có sợ rằng, bạn biết đấy, bạn sẽ không bao giờ trở thành một lập trình viên, có thể bạn sợ rằng, bạn biết đấy, + +16 +00:01:07,150 --> 00:01:09,490 +bạn sẽ không hiểu những gì đang thực sự xảy ra? + +17 +00:01:09,500 --> 00:01:12,080 +Có lẽ bạn sợ rằng bạn không đủ tốt. + +18 +00:01:12,610 --> 00:01:17,030 +Tất cả chúng ta đều có những nghi ngờ này và điều quan trọng là phải kiểm tra chúng. + +19 +00:01:17,680 --> 00:01:21,850 +Hãy nghĩ về những gì bạn đang làm và nghĩ về điều tồi tệ nhất có thể xảy ra nếu tôi + +20 +00:01:21,850 --> 00:01:22,670 +cố gắng hết sức. + +21 +00:01:23,170 --> 00:01:25,120 +Có lẽ không nhiều lắm. + +22 +00:01:25,480 --> 00:01:31,810 +Và bạn sẽ ngạc nhiên về tất cả những điều tuyệt vời xảy ra khi bạn bắt đầu nhìn vào những gì + +23 +00:01:31,810 --> 00:01:39,520 +bạn sợ hãi và chỉ cần gạt chúng sang một bên và tiếp tục cống hiến tất cả năng lượng của bạn cho bất cứ điều gì bạn + +24 +00:01:39,520 --> 00:01:40,240 +muốn làm. + diff --git a/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/external-links.txt b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8d82232602470a1524bd2d87e669227ae554fea --- /dev/null +++ b/part2/22 - Day 22 - Intermediate - Build Pong The Famous Arcade Game/external-links.txt @@ -0,0 +1,3 @@ + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/001 Day 23 Goals what you will make by the end of the day.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/001 Day 23 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..14dd8eac870abaff8adf1df6b1a47dca66c45743 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/001 Day 23 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:220ef90f18d3e61aa0c35419f0e674c1add21f9f34e3f16d91307039a0aaea2d +size 7918726 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/001 Day 23 Goals what you will make by the end of the day_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/001 Day 23 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..78976aa9acc24548294b111815fc218500e399ff --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/001 Day 23 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,88 @@ +1 +00:00:00,330 --> 00:00:05,100 +Xin chào các bạn, chào mừng đến với Ngày 23 của 100 Ngày viết mã. Bây giờ, hôm nay chúng ta + +2 +00:00:05,100 --> 00:00:09,450 +sẽ hướng tới dự án capstone thứ hai của chúng ta, và + +3 +00:00:10,050 --> 00:00:13,170 +đây sẽ là một trò chơi vượt rùa. + +4 +00:00:13,680 --> 00:00:17,190 +Bạn có thể đã chơi Crossy Road. Vì vậy, đây là một khái niệm tương tự. + +5 +00:00:17,280 --> 00:00:22,050 +Chúng ta có cả một đoàn ô tô băng qua đường cao tốc nhiều làn xe siêu nhộn nhịp + +6 +00:00:22,350 --> 00:00:25,890 +và chú rùa của chúng ta là người chơi phải băng qua đường. + +7 +00:00:26,580 --> 00:00:30,990 +Đây là những gì trò chơi trông như thế này. Người chơi điều khiển con rùa chỉ có + +8 +00:00:31,290 --> 00:00:33,240 +thể đi về phía trước và + +9 +00:00:33,900 --> 00:00:36,960 +có một loạt các xe ô tô được tạo ngẫu nhiên + +10 +00:00:37,200 --> 00:00:41,370 +chạy theo chiều ngang trên màn hình. Bây giờ, khi người chơi đến phía bên kia + +11 +00:00:41,370 --> 00:00:44,340 +của màn hình, xe ô tô sẽ tăng tốc, nhưng người chơi sẽ + +12 +00:00:44,550 --> 00:00:46,920 +quay trở lại vị trí xuất phát, sẵn sàng băng qua + +13 +00:00:47,190 --> 00:00:49,980 +màn hình một lần nữa. Bây giờ, tại một + +14 +00:00:50,040 --> 00:00:53,610 +thời điểm nào đó khi rùa của người chơi va vào một chiếc ô + +15 +00:00:54,000 --> 00:00:57,720 +tô, thì trò chơi sẽ kết thúc. Đây là một trò chơi khá + +16 +00:00:57,870 --> 00:01:01,710 +đơn giản, nhưng nó sẽ kiểm tra bạn rất nhiều điều mà bạn đã học + +17 +00:01:02,040 --> 00:01:05,730 +được cho đến nay, bao gồm cách tạo các lớp tuyệt vời, cách kế thừa + +18 +00:01:06,000 --> 00:01:11,000 +các lớp, cách bạn sử dụng các đối tượng được tạo từ các lớp đó và cả kiến thức của + +19 +00:01:11,070 --> 00:01:14,430 +bạn của hệ thống tọa độ rùa và công cụ trò chơi rùa. + +20 +00:01:15,360 --> 00:01:19,050 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo, nơi bạn + +21 +00:01:19,050 --> 00:01:24,030 +sẽ tìm thấy mã bắt đầu cho dự án này và bạn cũng có thể chọn mức độ khó của mình. + +22 +00:01:24,720 --> 00:01:26,670 +Vì vậy, hãy đến đó và bắt đầu ngay bây giờ. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/002 Choose Your Difficulty.html b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/002 Choose Your Difficulty.html new file mode 100644 index 0000000000000000000000000000000000000000..3301595a0eab69911935e1f400406d7f37f0b868 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/002 Choose Your Difficulty.html @@ -0,0 +1 @@ +

In the upcoming lessons, we have created step-by-step instructions to help you complete this project.

Difficulty Normal : Use all Steps to complete the project.

Difficulty Hard : Use only Steps 1 and 2 to complete the project.

Difficulty Expert : Only use Step 1 to complete the project.


START HERE

For all difficulty levels, begin by downloading the turtle-crossing-start.zip from this lesson's resources and opening it in PyCharm. The starting project contains the starting code for the game, we'll walk through the code in the starting project in the next lesson.

Alternatively, you can create the entire project from scratch by creating a blank project inside PyCharm and create a Turtle screen that is 600px by 600px. You'll also need to turn off tracer(0) and use update() to refresh the screen every 0.1s. If you are confused about this, just use the starting project instead.

(If you can't use PyCharm, here's a Repl.it link)

\ No newline at end of file diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/002 turtle-crossing-start.zip b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/002 turtle-crossing-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..db9d22f5e762bf359bf2afcd6eb3793e1fe74ddf --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/002 turtle-crossing-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:193f497890d47849062c2171f5a81c01ddbf67186353bd9a7e8f7a1cfec5d7be +size 921 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/003 How to use the Starter Code.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/003 How to use the Starter Code.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6c26ed0f898f0f2e99a7697718ac586cfd7ee00d --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/003 How to use the Starter Code.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65d9c05b3358cb49305a56b56e445a4cb784f87b87b8d01fcc87ac963127ff5b +size 15169392 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/003 How to use the Starter Code_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/003 How to use the Starter Code_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b0cb556bf6297a5e8551c04c210d8d5581a63f4b --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/003 How to use the Starter Code_vi.srt @@ -0,0 +1,224 @@ +1 +00:00:00,270 --> 00:00:03,480 +Bây giờ, hy vọng bạn đã tải xuống dự án bắt + +2 +00:00:03,840 --> 00:00:07,020 +đầu, vì vậy bạn có thể tiếp tục và nhấp vào + +3 +00:00:07,410 --> 00:00:12,410 +mở trong PyCharm, tìm vị trí bạn đã tải xuống phần bắt đầu vượt rùa và đảm + +4 +00:00:12,510 --> 00:00:14,850 +bảo rằng bạn đã giải nén tệp + +5 +00:00:15,420 --> 00:00:20,100 +zip đó và bạn đã có thư mục thực, chứa tất cả các tệp bắt đầu. + +6 +00:00:20,640 --> 00:00:25,640 +Vì vậy, hãy chọn thư mục và sau đó nhấp vào mở và chúng tôi phải định cấu + +7 +00:00:26,340 --> 00:00:31,340 +hình trình thông dịch Python và đảm bảo rằng trình thông dịch Python của bạn tối thiểu là + +8 +00:00:31,380 --> 00:00:34,680 +Python 3. số 8. Vì vậy, bạn có thể sử dụng 3. 9 trở lên, + +9 +00:00:35,010 --> 00:00:36,930 +nhưng nếu thấp hơn 3. 8, bạn có + +10 +00:00:36,930 --> 00:00:41,930 +thể gặp một số lỗi và một số vấn đề. Hãy quay lại thời điểm chúng tôi bắt đầu sử + +11 +00:00:42,270 --> 00:00:46,590 +dụng PyCharm lần đầu tiên và chúng tôi đã cài đặt Python nếu bạn gặp khó khăn về điều này. + +12 +00:00:47,370 --> 00:00:50,670 +Bây giờ, nếu bạn nhìn vào bên trong thư mục dự án + +13 +00:00:50,970 --> 00:00:54,390 +của chúng tôi, bạn có thể thấy tôi đã tạo bốn tệp cho bạn. + +14 +00:00:54,960 --> 00:00:56,940 +Những tập tin này khá trần trụi, nhưng + +15 +00:00:56,970 --> 00:01:00,420 +nếu bạn nhìn vào phần chính. tệp py là điểm khởi đầu + +16 +00:01:00,630 --> 00:01:03,420 +cho chương trình của bạn, bạn có thể thấy + +17 +00:01:03,720 --> 00:01:07,710 +rằng tôi đã viết một chút mã mà chúng ta đã học trong các + +18 +00:01:07,710 --> 00:01:08,790 +bài học trước. + +19 +00:01:09,090 --> 00:01:14,090 +Vì vậy, chúng tôi đã tạo một đối tượng màn hình và chúng tôi đã thiết lập màn hình có kích thước 600 + +20 +00:01:15,270 --> 00:01:16,103 +x 600 pixel. + +21 +00:01:16,410 --> 00:01:21,030 +Và sau đó, chúng tôi đã tắt trình đánh dấu bằng cách thực hiện trình đánh dấu (0), và thay vào + +22 +00:01:21,480 --> 00:01:26,400 +đó, chúng tôi nhận được màn hình cập nhật mỗi 0. 1 giây. + +23 +00:01:26,850 --> 00:01:31,620 +Vì vậy, trong vòng lặp while, mã sẽ chạy mỗi 0. 1 giây. + +24 +00:01:31,980 --> 00:01:35,100 +Vì vậy, bất cứ điều gì bạn đặt bên trong vòng lặp while này, nó + +25 +00:01:35,460 --> 00:01:38,490 +sẽ được làm mới sau mỗi 0. 1 giây. + +26 +00:01:39,180 --> 00:01:44,180 +Bây giờ, bạn cũng sẽ thấy rằng tôi đã nhập một số lớp từ các tệp này; + +27 +00:01:45,870 --> 00:01:49,170 +player, car_manager và bảng điểm. Bây giờ, bên + +28 +00:01:49,230 --> 00:01:50,970 +trong các tệp này, tôi + +29 +00:01:51,210 --> 00:01:54,360 +đã tạo điểm bắt đầu cho mỗi lớp. + +30 +00:01:54,690 --> 00:01:58,350 +Lớp người chơi sẽ trở thành con rùa mà chúng tôi đang điều khiển để băng + +31 +00:01:58,350 --> 00:01:59,160 +qua đường, + +32 +00:01:59,160 --> 00:02:04,160 +người quản lý ô tô sẽ tạo ra tất cả những chiếc ô tô ngẫu nhiên và di chuyển chúng trên màn + +33 +00:02:04,200 --> 00:02:05,160 +hình, sau đó bảng + +34 +00:02:05,580 --> 00:02:08,729 +điểm sẽ ghi mức độ chúng tôi hiện đang tham gia và cũng + +35 +00:02:08,729 --> 00:02:11,970 +là trò chơi theo một trình tự. Bây giờ, bên trong mỗi + +36 +00:02:12,000 --> 00:02:15,690 +lớp học này, tôi đã viết thẻ ở đây chỉ để người nói + +37 +00:02:15,720 --> 00:02:19,290 +dối ngừng la hét với tôi. Vì vậy, như chúng tôi + +38 +00:02:19,950 --> 00:02:23,430 +đã đề cập trước đây, Python không thích mọi thứ trống rỗng, + +39 +00:02:23,430 --> 00:02:27,630 +vì vậy các hàm trống, các lớp trống và bạn sẽ gặp các lỗi này. + +40 +00:02:28,410 --> 00:02:32,610 +Thay vì nhận được những lỗi này, tất cả những gì tôi đã làm chỉ đơn giản là viết pass + +41 +00:02:32,640 --> 00:02:35,490 +về cơ bản chỉ làm cho nó trở thành một lớp trống. + +42 +00:02:35,910 --> 00:02:37,560 +Vì vậy, khi bạn đang tạo các lớp này, + +43 +00:02:37,620 --> 00:02:41,880 +chỉ cần xóa pass và bạn có thể tạo nó như bình thường. Bây giờ, ngoài ra, chúng ta có tất cả + +44 +00:02:41,910 --> 00:02:45,420 +các hằng số này ở đây. Ví dụ, vị trí xuất + +45 +00:02:45,420 --> 00:02:47,640 +phát của con rùa người chơi, con + +46 +00:02:47,970 --> 00:02:52,320 +rùa phải di chuyển bao nhiêu mỗi lần và vị trí cán đích + +47 +00:02:52,320 --> 00:02:55,380 +trên trục Y. Trong car_manager, chúng tôi + +48 +00:02:55,380 --> 00:02:57,660 +có màu sắc của những chiếc xe, + +49 +00:02:57,960 --> 00:03:02,820 +chúng tôi có khoảng cách di chuyển của từng chiếc xe trong mỗi lần + +50 +00:03:03,150 --> 00:03:08,150 +làm mới và chúng tôi cũng có khoảng cách di chuyển sẽ tăng lên mỗi + +51 +00:03:08,280 --> 00:03:11,880 +khi người dùng lên cấp. Cuối cùng, chúng tôi + +52 +00:03:11,910 --> 00:03:16,050 +đã có bảng điểm chỉ chứa phông chữ mà bạn sẽ + +53 +00:03:16,050 --> 00:03:20,850 +sử dụng để viết bảng điểm. Đó là phần giới thiệu khá nhiều về tệp bắt đầu. + +54 +00:03:21,180 --> 00:03:22,350 +Vì vậy, khi bạn + +55 +00:03:22,410 --> 00:03:27,410 +đã sẵn sàng, hãy chuyển sang bài học tiếp theo và bắt đầu với từng bước của trò + +56 +00:03:28,080 --> 00:03:28,500 +chơi. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/004 Step 1 - Check out how the game play works.html b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/004 Step 1 - Check out how the game play works.html new file mode 100644 index 0000000000000000000000000000000000000000..e0f2c1873b6e1b58c4e359204f1456d15543a810 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/004 Step 1 - Check out how the game play works.html @@ -0,0 +1 @@ +

1. A turtle moves forwards when you press the "Up" key. It can only move forwards, not back, left or right.

2. Cars are randomly generated along the y-axis and will move from the right edge of the screen to the left edge.

3. When the turtle hits the top edge of the screen, it moves back to the original position and the player levels up. On the next level, the car speed increases.

4. When the turtle collides with a car, it's game over and everything stops.

\ No newline at end of file diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/005 Step 2 - Break down the Problem.html b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/005 Step 2 - Break down the Problem.html new file mode 100644 index 0000000000000000000000000000000000000000..5d03c8265a7ada582516dab6539953a050a79a9c --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/005 Step 2 - Break down the Problem.html @@ -0,0 +1 @@ +

If you haven't already, download the starting project here and open it inside PyCharm.

The first step of creating any large project is to breakdown the problem into smaller, bite-sized chunks. Add the following comments to the starting code and try to tackle them one-by-one.


\ No newline at end of file diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/006 Solution to Step 3 - Create the Player Behaviour.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/006 Solution to Step 3 - Create the Player Behaviour.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9f9c069e0409c3a19f984017fb08239134a4963d --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/006 Solution to Step 3 - Create the Player Behaviour.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53cfc422f4fa8ec4d4b0517d3d8e6b07c07247df2a3efb59c381b5495eb3ff48 +size 22418553 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/006 Solution to Step 3 - Create the Player Behaviour_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/006 Solution to Step 3 - Create the Player Behaviour_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..034f0d097fba5bebf5eb63d5db7bf872c6be56c8 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/006 Solution to Step 3 - Create the Player Behaviour_vi.srt @@ -0,0 +1,276 @@ +1 +00:00:00,180 --> 00:00:02,160 +Được rồi. Vì vậy, cũng giống + +2 +00:00:02,220 --> 00:00:07,220 +như trước đây, chúng tôi đã chia vấn đề lớn này là xây dựng trò chơi thành năm phần + +3 +00:00:07,320 --> 00:00:09,090 +phụ nhỏ hơn. Thứ nhất, di + +4 +00:00:09,120 --> 00:00:13,140 +chuyển rùa, điều khiển nó bằng phím bấm, tạo và di chuyển xe + +5 +00:00:13,140 --> 00:00:15,540 +tự động trên màn hình, phát hiện + +6 +00:00:15,810 --> 00:00:19,740 +va chạm với xe và phát hiện khi rùa sang bờ bên + +7 +00:00:19,740 --> 00:00:21,300 +kia. Cuối cùng, chúng + +8 +00:00:21,300 --> 00:00:24,510 +tôi tạo một bảng điểm theo dõi xem chúng tôi đang ở cấp độ nào + +9 +00:00:24,750 --> 00:00:27,090 +và cũng cho thấy trò chơi kết thúc khi kết thúc. + +10 +00:00:27,810 --> 00:00:31,710 +Vì vậy, bước đầu tiên là di chuyển con rùa bằng cách sử dụng một phím bấm. + +11 +00:00:32,070 --> 00:00:36,480 +Rùa chỉ có thể tiến về phía trước và mỗi khi chúng ta nhấn phím Lên, + +12 +00:00:36,690 --> 00:00:41,580 +con rùa sẽ di chuyển về phía trước một lượng nhất định cho đến khi nó đến phía bên + +13 +00:00:41,580 --> 00:00:45,000 +kia của màn hình. Đây là điều đầu tiên mà chúng tôi sẽ giải quyết. Bây giờ, vì + +14 +00:00:45,030 --> 00:00:48,180 +điều này liên quan đến chức năng của trình phát, hãy + +15 +00:00:48,510 --> 00:00:51,870 +tiếp tục và tạo điều này bên trong lớp trình phát. + +16 +00:00:52,800 --> 00:00:54,420 +Tôi sẽ xóa + +17 +00:00:54,540 --> 00:00:59,340 +thẻ đó và tôi cũng sẽ nhập lớp rùa từ mô-đun rùa. + +18 +00:01:00,090 --> 00:01:04,170 +Bây giờ, người chơi của chúng ta sẽ kế thừa từ lớp rùa này. + +19 +00:01:04,709 --> 00:01:06,720 +Vì vậy, bên trong init của chúng tôi, + +20 +00:01:06,930 --> 00:01:10,830 +chúng tôi sẽ cần thêm siêu phẩm. init hoặc bạn có thể + +21 +00:01:10,860 --> 00:01:13,860 +thêm nó tự động bằng cách sử dụng bóng đèn. + +22 +00:01:14,460 --> 00:01:19,460 +Vì vậy, bây giờ lớp người chơi này có thể làm mọi thứ mà lớp rùa có thể làm và chúng ta có thể làm cho + +23 +00:01:20,490 --> 00:01:21,870 +nó làm được nhiều hơn thế. + +24 +00:01:22,830 --> 00:01:27,630 +Điều đầu tiên chúng tôi sẽ làm là chúng tôi sẽ thiết lập hình dạng của người chơi của chúng tôi và + +25 +00:01:27,960 --> 00:01:30,210 +chúng tôi sẽ đặt nó thành một con rùa. + +26 +00:01:30,810 --> 00:01:34,770 +Điều tiếp theo chúng ta sẽ làm là gọi penup để con rùa này chỉ + +27 +00:01:34,770 --> 00:01:39,330 +là một hình dạng và nó không vẽ. Cuối cùng, chúng ta cần đưa + +28 +00:01:39,360 --> 00:01:43,470 +nó về vị trí bắt đầu và hướng nó về phía Bắc. + +29 +00:01:43,950 --> 00:01:48,950 +Chúng ta có thể làm điều đó bằng cách tự thiết lập. goto và sau đó chúng ta có thể đặt nó đến + +30 +00:01:50,370 --> 00:01:51,660 +vị trí bắt đầu, + +31 +00:01:52,350 --> 00:01:57,350 +mà bạn có thể thấy là một bộ giá trị vì nó được đặt bên trong dấu ngoặc đơn và bạn có + +32 +00:01:59,040 --> 00:02:03,300 +các giá trị được phân tách bằng dấu phẩy. Cuối cùng, chúng ta sẽ đặt + +33 +00:02:03,330 --> 00:02:08,330 +tiêu đề của con rùa của chúng ta sao cho nó quay mặt về + +34 +00:02:09,300 --> 00:02:11,220 +hướng Bắc, là 90 độ. + +35 +00:02:11,880 --> 00:02:16,800 +Vì vậy, bây giờ tất cả những gì chúng ta phải làm là quay trở lại công việc chính của chúng ta. py, sau khi chúng ta thiết lập + +36 +00:02:17,400 --> 00:02:19,410 +xong màn hình, hãy + +37 +00:02:19,650 --> 00:02:23,880 +tiếp tục và tạo một người chơi mới từ lớp người chơi. + +38 +00:02:25,290 --> 00:02:27,360 +Hãy tiếp tục và chạy mã này. + +39 +00:02:30,650 --> 00:02:35,650 +0: Và bạn có thể thấy rằng chúng tôi có chú rùa nhỏ của chúng tôi hiển thị ở đây + +40 +00:02:37,400 --> 00:02:40,850 +ở trung tâm của cuối màn hình và nó hướng về phía Bắc. + +41 +00:02:42,380 --> 00:02:47,270 +Vì vậy, bây giờ việc tiếp theo chúng ta cần làm là làm sao để chú rùa đó di chuyển lên + +42 +00:02:47,540 --> 00:02:49,460 +trên mỗi khi chúng ta nhấn phím Lên. + +43 +00:02:50,060 --> 00:02:53,450 +Điều đó có nghĩa là chúng ta sẽ cần phải có màn hình của mình + +44 +00:02:53,480 --> 00:02:57,620 +để lắng nghe các sự kiện. Sau khi gọi màn hình. nghe này, chúng ta sẽ + +45 +00:02:57,680 --> 00:03:02,680 +nhận được màn hình để nghe một tổ hợp phím. Vì vậy chúng ta có thể sử + +46 +00:03:04,720 --> 00:03:08,080 +dụng onkey để đặt phím Lên làm phím để nghe. + +47 +00:03:08,650 --> 00:03:13,390 +Và khi điều đó xảy ra, chúng ta sẽ gọi người chơi. + +48 +00:03:14,110 --> 00:03:19,110 +đi lên. Và hãy nhớ rằng khi chúng ta đang gọi các phương + +49 +00:03:20,320 --> 00:03:24,970 +thức bên trong trình nghe, chúng ta không muốn thêm dấu ngoặc đơn vì điều này sẽ kích hoạt nó tại + +50 +00:03:25,030 --> 00:03:28,900 +điểm mà nó đánh giá dòng mã này. Thay vào đó, chúng tôi + +51 +00:03:28,930 --> 00:03:33,550 +chỉ muốn kích hoạt chức năng này khi phím Lên này được phát hiện. + +52 +00:03:34,240 --> 00:03:39,240 +Vì vậy, bây giờ tất cả những gì còn lại cần làm là đi vào trình phát của chúng tôi. py và xác định hàm + +53 +00:03:40,000 --> 00:03:41,680 +go_up đó. + +54 +00:03:42,850 --> 00:03:46,630 +Vậy làm thế nào chúng ta có thể di chuyển con rùa của chúng ta lên? Chà, chúng ta có thể khiến + +55 +00:03:46,630 --> 00:03:50,080 +con rùa của chúng ta tự như vậy, và sau đó chúng ta + +56 +00:03:50,410 --> 00:03:53,710 +có thể khiến nó di chuyển về phía trước một khoảng cách xa. + +57 +00:03:54,280 --> 00:03:58,930 +Và khoảng cách sẽ là khoảng cách di chuyển được đặt trong + +58 +00:03:58,930 --> 00:04:03,070 +hằng số này ở đây. Điều này có nghĩa là sau này khi chúng ta + +59 +00:04:03,070 --> 00:04:06,970 +muốn thay đổi khoảng cách di chuyển nếu chúng ta muốn nó đi xa hơn mỗi lần, chúng ta chỉ có + +60 +00:04:06,970 --> 00:04:09,130 +thể chỉnh sửa nó ở đầu tệp thay vì đào qua mã. + +61 +00:04:10,540 --> 00:04:14,350 +Bây giờ chúng ta hãy chạy lại mã của chúng ta và hãy đảm bảo rằng nó hoạt động. + +62 +00:04:14,830 --> 00:04:16,660 +Vì vậy, bây giờ mỗi khi tôi nhấn + +63 +00:04:16,690 --> 00:04:21,690 +phím Lên, con rùa của tôi sẽ di chuyển lên và nó tiếp tục diễn ra cho đến khi chạm đến + +64 +00:04:21,730 --> 00:04:26,500 +phía bên kia của màn hình. Vậy là bước đầu tiên đã hoàn thành. Bây giờ, nếu bạn nghĩ rằng + +65 +00:04:26,530 --> 00:04:28,990 +bạn có thể tự mình hoàn thành bước tiếp theo, + +66 +00:04:29,290 --> 00:04:34,290 +thì hãy quay lại danh sách các vấn đề được chia nhỏ đó và xem liệu bạn có thể tự + +67 +00:04:34,390 --> 00:04:39,010 +mình giải quyết vấn đề tiếp theo hay không. Nếu bạn không thể hoặc nếu bạn cần thêm trợ + +68 +00:04:39,130 --> 00:04:42,460 +giúp, bạn luôn có thể quay lại video và tôi sẽ hướng dẫn bạn từng + +69 +00:04:42,490 --> 00:04:43,120 +bước một. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/007 Solution to Step 4 - Create the Car Behaviour.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/007 Solution to Step 4 - Create the Car Behaviour.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e243d912d2821ca1e114c7fc4f9c9cdded30fb49 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/007 Solution to Step 4 - Create the Car Behaviour.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb77c14bd8a6262c0f2b6a4c9af0984b3f1b77c8ec128c7ff44949042c3b2af0 +size 48687445 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/007 Solution to Step 4 - Create the Car Behaviour_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/007 Solution to Step 4 - Create the Car Behaviour_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1fdb18a4ce525c0a9dfe68d4d8b0fc0aa1a02f84 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/007 Solution to Step 4 - Create the Car Behaviour_vi.srt @@ -0,0 +1,528 @@ +1 +00:00:00,330 --> 00:00:03,570 +Trong bài học trước, chúng ta đã tìm ra cách để con + +2 +00:00:03,780 --> 00:00:08,340 +rùa di chuyển bằng một lần nhấn phím và đó là mỗi lần nhấn phím Lên, con + +3 +00:00:08,610 --> 00:00:11,040 +rùa sẽ di chuyển xa hơn về phía Bắc. + +4 +00:00:11,730 --> 00:00:15,300 +Bây giờ nhiệm vụ tiếp theo là tạo và di chuyển những chiếc xe. + +5 +00:00:15,930 --> 00:00:20,930 +Các ô tô cần chuyển động từ phải sang trái và chúng cần được tạo ngẫu + +6 +00:00:21,060 --> 00:00:23,460 +nhiên dọc theo trục Y ở đây. + +7 +00:00:23,970 --> 00:00:28,970 +Vì vậy, chúng cần được tạo ngay cạnh phải của màn hình và chúng có thể xuất hiện ở + +8 +00:00:29,460 --> 00:00:31,920 +bất kỳ đâu dọc theo đường này, và + +9 +00:00:32,220 --> 00:00:36,840 +sau đó chúng sẽ tự động di chuyển sang bên trái theo một tốc độ cố định. + +10 +00:00:37,530 --> 00:00:38,160 +Bạn + +11 +00:00:38,160 --> 00:00:43,160 +có thể thấy, mỗi chiếc xe này sẽ là những con rùa và chúng sẽ có kích + +12 +00:00:43,740 --> 00:00:46,770 +thước 20 x 40 pixel. Vì vậy, chúng tôi đã đề + +13 +00:00:46,860 --> 00:00:50,490 +cập rằng theo mặc định, mỗi con rùa mà chúng tôi tạo là 20 x 20 pixel. + +14 +00:00:50,940 --> 00:00:54,480 +Vì vậy, chúng ta sẽ cần kéo dài con rùa để biến nó thành hình dạng này. + +15 +00:00:55,500 --> 00:01:00,150 +Bây giờ chúng ta đang quan tâm đến ô tô, hãy tạo mã của chúng tôi bên trong trình quản + +16 +00:01:00,150 --> 00:01:00,983 +lý ô tô. + +17 +00:01:01,680 --> 00:01:06,680 +Điều đầu tiên chúng ta cần làm là nhập lớp con rùa từ mô-đun con rùa và + +18 +00:01:06,900 --> 00:01:11,900 +trình quản lý ô tô của chúng tôi sẽ có một init nơi chúng tôi tạo tất + +19 +00:01:14,790 --> 00:01:18,780 +cả các ô tô của mình. Vì vậy, tôi sẽ tạo một danh sách có tên là all_cars, + +20 +00:01:19,320 --> 00:01:23,280 +và nó sẽ bắt đầu là một danh sách trống. Bây giờ, tại một + +21 +00:01:23,310 --> 00:01:24,420 +số + +22 +00:01:24,810 --> 00:01:29,810 +điểm, chính của chúng tôi. py sẽ gọi một hàm từ car_manager được gọi là + +23 +00:01:30,570 --> 00:01:31,403 +create_ ô tô. + +24 +00:01:31,740 --> 00:01:36,740 +Và phương pháp này sẽ tạo ra một chiếc ô tô ngẫu nhiên ở đâu đó dọc theo trục + +25 +00:01:38,670 --> 00:01:42,780 +Y với một kích thước nhất định. Mỗi chiếc xe này, chúng ta hãy + +26 +00:01:42,900 --> 00:01:47,900 +gọi nó là new_car, sẽ là một đối tượng con rùa và nó sẽ được tạo + +27 +00:01:48,630 --> 00:01:52,680 +ra trong một hình vuông. Ngoài ra, bây giờ chúng ta sẽ + +28 +00:01:52,710 --> 00:01:56,370 +phải thay đổi các kích thước của con rùa này và chúng ta sẽ + +29 +00:01:56,730 --> 00:01:59,730 +sử dụng phương pháp mà chúng ta đã sử dụng trước đây + +30 +00:02:00,000 --> 00:02:02,100 +là phương pháp này, định hình kích thước. + +31 +00:02:02,670 --> 00:02:05,940 +Bây giờ, những gì kích thước hình dạng cho phép chúng ta làm, + +32 +00:02:06,030 --> 00:02:11,030 +nếu bạn nhớ, nó cho phép chúng ta kéo dài con rùa của mình theo chiều rộng và dọc theo chiều dài. + +33 +00:02:11,700 --> 00:02:15,150 +Vì vậy, chúng tôi muốn chiều rộng gấp đôi kích thước ban đầu, + +34 +00:02:15,180 --> 00:02:20,180 +vì vậy hai lần 20 pixel là 40 pixel và chiều dài chúng tôi không muốn bị kéo dài chút + +35 +00:02:21,090 --> 00:02:21,510 +nào. + +36 +00:02:21,510 --> 00:02:26,510 +Vì vậy, chúng tôi sẽ nói rằng nó gấp một lần độ dài ban đầu. Ngoài ra, chiếc xe mới của chúng tôi sẽ + +37 +00:02:27,210 --> 00:02:31,050 +không được vẽ, vì vậy chúng tôi sẽ chuẩn bị cho nó hoàn thiện. + +38 +00:02:31,710 --> 00:02:36,710 +Và chiếc xe mới của chúng tôi cũng sẽ có một màu ngẫu nhiên. Vì vậy, chúng tôi có thể đặt màu và sau + +39 +00:02:38,400 --> 00:02:43,400 +đó chúng tôi có thể nhập mô-đun ngẫu nhiên để chúng tôi có thể sử dụng một trong những màu này trong + +40 +00:02:44,520 --> 00:02:45,353 +danh sách này. + +41 +00:02:45,960 --> 00:02:50,960 +Và chúng ta có thể nói là ngẫu nhiên. lựa chọn và sau đó chuyển vào danh sách màu của chúng + +42 +00:02:52,620 --> 00:02:55,680 +tôi từ hằng số COLORS này. Cuối cùng, chúng ta sẽ + +43 +00:02:55,710 --> 00:02:59,980 +xác định vị trí của nó trên màn hình. Để làm điều đó, + +44 +00:03:00,040 --> 00:03:03,820 +chúng ta cần xác định vị trí random_y. + +45 +00:03:04,360 --> 00:03:08,110 +Vì vậy, điều này một lần nữa sẽ được tạo ra từ mô-đun ngẫu nhiên + +46 +00:03:08,110 --> 00:03:13,110 +và chúng ta sẽ sử dụng randint và sau đó chúng ta sẽ xác định một nơi nào đó dọc theo + +47 +00:03:14,050 --> 00:03:18,220 +trục Y này, là trục thẳng đứng, nơi nào đó để lệnh gọi này được tạo ra tại. + +48 +00:03:18,880 --> 00:03:22,630 +Vì vậy, chúng tôi biết rằng màn hình của chúng tôi là + +49 +00:03:23,110 --> 00:03:27,730 +600 x 600, điều đó có nghĩa là trục Y đi từ +300 đến -300. + +50 +00:03:28,090 --> 00:03:31,900 +Nhưng chúng tôi không muốn chiếc xe được tạo ra tất cả các cạnh bởi + +51 +00:03:31,900 --> 00:03:35,800 +vì hãy nhớ rằng con rùa cần một chút không gian bắt đầu và một + +52 +00:03:35,800 --> 00:03:38,830 +chút không gian kết thúc. Vì vậy, bạn có + +53 +00:03:38,860 --> 00:03:43,360 +thể thử với con số này, nhưng tôi đã kết thúc với -250 đến +250. + +54 +00:03:44,140 --> 00:03:49,140 +Điều này có nghĩa là chúng ta nhận được một phạm vi tốt ở giữa màn hình + +55 +00:03:49,300 --> 00:03:53,830 +và con rùa có một chút không gian trống ở đầu và cũng là ở + +56 +00:03:53,830 --> 00:03:58,090 +cuối khi nó cần di chuyển qua. Vì vậy, bây giờ chúng ta + +57 +00:03:58,090 --> 00:04:03,090 +đã xác định random_ y của mình, chúng ta có thể yêu cầu new_car của chúng ta + +58 +00:04:03,670 --> 00:04:07,030 +đi đến vị trí x sẽ là cạnh của màn hình + +59 +00:04:07,300 --> 00:04:10,540 +bên phải, vì vậy đó sẽ là +300, ngay đến cạnh. + +60 +00:04:10,960 --> 00:04:15,960 +Và sau đó vị trí y sẽ là random_y mà chúng ta vừa tạo. + +61 +00:04:17,589 --> 00:04:20,170 +Và cuối cùng, khi chúng tôi đã tạo + +62 +00:04:20,380 --> 00:04:25,380 +new_car của mình, chúng tôi sẽ thêm nó vào danh sách all_cars của chúng tôi, tất nhiên, bởi + +63 +00:04:26,650 --> 00:04:31,090 +vì nó được định nghĩa trong một lớp, nó phải có bản thân đứng trước nó. + +64 +00:04:32,110 --> 00:04:35,830 +Vì vậy, tự. Tất cả ô tô. nối, và sau đó + +65 +00:04:36,160 --> 00:04:39,730 +chúng tôi sẽ nối chiếc xe mới này mà chúng tôi vừa tạo ra. + +66 +00:04:40,780 --> 00:04:43,120 +Bây giờ, trở lại với chính của chúng ta. py, hãy tạo + +67 +00:04:43,450 --> 00:04:48,010 +car_manager của chúng ta từ lớp CarManager, sau đó chúng ta sẽ sử + +68 +00:04:48,490 --> 00:04:51,910 +dụng nó trong vòng lặp trò chơi của chúng ta + +69 +00:04:52,030 --> 00:04:55,150 +ở đây để mỗi lần làm mới màn hình, + +70 +00:04:55,450 --> 00:04:57,070 +cứ 0. 1 giây + +71 +00:04:57,370 --> 00:05:01,330 +nữa, chúng ta sẽ yêu cầu car_manager tạo ra một chiếc xe mới. + +72 +00:05:03,010 --> 00:05:08,010 +Và nghiêm ngặt, điều này có lẽ không nên ở số nhiều vì mỗi lần chúng ta gọi phương + +73 +00:05:08,470 --> 00:05:11,500 +thức này, nó chỉ tạo ra một chiếc xe mới. + +74 +00:05:11,980 --> 00:05:15,670 +Vì vậy, hãy thay đổi phương pháp đó để nó chỉ tạo ra một ô tô, nhưng nó + +75 +00:05:15,880 --> 00:05:18,910 +tạo ra một ô tô cứ 0. 1 giây. + +76 +00:05:19,930 --> 00:05:23,260 +Bây giờ tại thời điểm này nếu chúng tôi chạy mã của mình, + +77 +00:05:23,560 --> 00:05:28,560 +bạn sẽ thực sự thấy không có gì xảy ra vì những chiếc xe đang được tạo ở cạnh bên + +78 +00:05:29,500 --> 00:05:30,640 +phải này và nó + +79 +00:05:30,820 --> 00:05:34,630 +chưa được hiển thị trên màn hình. Để làm cho nó hiển thị, chúng + +80 +00:05:34,630 --> 00:05:37,660 +tôi phải di chuyển ô tô của chúng tôi trên màn hình. + +81 +00:05:38,440 --> 00:05:43,440 +Hãy tạo một phương thức khác mà chúng ta sẽ gọi là move_cars vì phương thức này sẽ + +82 +00:05:43,960 --> 00:05:46,420 +đi qua danh sách các xe của chúng ta, + +83 +00:05:46,690 --> 00:05:50,230 +vì vậy đối với xe hơi. all_cars và đối với mỗi + +84 +00:05:50,770 --> 00:05:55,150 +chiếc xe đó, nó sẽ di chuyển nó về phía bên trái theo khoảng cách + +85 +00:05:55,330 --> 00:05:58,370 +di chuyển mà chúng ta đã xác định ở đây. + +86 +00:05:59,270 --> 00:06:02,240 +Vì vậy, để làm được điều đó, tất cả những gì + +87 +00:06:02,480 --> 00:06:07,460 +chúng ta cần là làm cho ô tô chuyển động lùi lại bằng quãng đường di chuyển ban đầu. + +88 +00:06:08,210 --> 00:06:12,740 +Bây giờ, nó sẽ lặp lại danh sách all_cars của chúng ta đã được tạo và + +89 +00:06:13,190 --> 00:06:14,750 +sau đó đối với mỗi + +90 +00:06:14,780 --> 00:06:18,260 +chiếc xe, nó sẽ di chuyển nó về phía sau năm bước. + +91 +00:06:18,890 --> 00:06:23,890 +Vì vậy, bây giờ ngoài việc yêu cầu người quản lý ô tô tạo một chiếc ô tô mới sau mỗi + +92 +00:06:24,470 --> 00:06:26,030 +lần làm mới vòng chơi, chúng + +93 +00:06:26,360 --> 00:06:31,160 +tôi cũng sẽ yêu cầu người quản lý xe di chuyển tất cả các ô tô thêm năm bước. + +94 +00:06:31,700 --> 00:06:32,540 +Hãy bắt đầu chạy + +95 +00:06:32,540 --> 00:06:37,160 +ngay bây giờ và bạn sẽ thấy rằng chúng tôi đã có những chiếc xe của chúng tôi đang được tạo ra, nhưng hãy + +96 +00:06:37,580 --> 00:06:42,580 +lưu ý cách tôi đã mắc một lỗi nhỏ trong đoạn đường. Thay vì kéo dài nó theo chiều dài, + +97 +00:06:43,160 --> 00:06:46,670 +tôi đã kéo dài nó dọc theo chiều rộng và đây là lý + +98 +00:06:47,060 --> 00:06:50,810 +do tại sao chúng ta có một mảng hình dạng ngẫu nhiên di chuyển. + +99 +00:06:51,320 --> 00:06:56,320 +Vì vậy, hãy quay lại trình quản lý ô tô của chúng tôi và thay đổi chiều rộng để kéo dài + +100 +00:06:56,870 --> 00:07:01,160 +một và kéo dài thành chiều dài hai. Vì vậy, bây giờ nếu chúng tôi chạy lại + +101 +00:07:01,490 --> 00:07:04,070 +mã của mình, bạn có thể thấy những chiếc ô tô bây giờ + +102 +00:07:04,700 --> 00:07:08,600 +là hình dạng bên phải, một hình chữ nhật trông giống như nó đang di chuyển sang bên trái. + +103 +00:07:09,680 --> 00:07:11,690 +Bây giờ hãy để ý xem, trong trường + +104 +00:07:11,750 --> 00:07:15,260 +hợp của tôi, những chiếc xe đang được tạo ra quá thường xuyên như thế nào. + +105 +00:07:15,260 --> 00:07:20,210 +Chúng tôi có quá nhiều cuộc gọi và con rùa của chúng tôi không thể băng + +106 +00:07:20,210 --> 00:07:21,043 +qua đường. + +107 +00:07:21,260 --> 00:07:26,260 +Vì vậy, chúng ta cần phải tìm ra cách làm thế nào chúng ta có thể giảm số lượng ô + +108 +00:07:26,720 --> 00:07:29,780 +tô đang được sản xuất. Thay vì tạo + +109 +00:07:29,960 --> 00:07:34,700 +ra một chiếc xe mỗi 0. 1 giây sau mỗi lần làm mới trò chơi, + +110 +00:07:35,090 --> 00:07:37,280 +chúng ta cần làm chậm lại một chút. + +111 +00:07:37,970 --> 00:07:42,650 +Và một cách chúng ta có thể làm điều này là sử dụng một số ngẫu nhiên. + +112 +00:07:43,310 --> 00:07:47,210 +Giả sử rằng chúng tôi tạo ra một cơ hội ngẫu nhiên sẽ + +113 +00:07:47,780 --> 00:07:51,080 +là một trong sáu cơ hội, vì vậy nó gần giống + +114 +00:07:51,110 --> 00:07:55,250 +như ném một con xúc xắc. Nếu bạn nhận được một viên trên xúc xắc, thì chúng ta sẽ + +115 +00:07:55,580 --> 00:07:56,780 +tạo ra một chiếc ô tô. + +116 +00:07:57,290 --> 00:08:00,740 +Chúng ta có thể làm điều này bằng cách nắm giữ + +117 +00:08:00,950 --> 00:08:04,490 +mô-đun ngẫu nhiên của mình, tạo một số nguyên ngẫu nhiên từ một + +118 +00:08:05,120 --> 00:08:10,120 +đến sáu và sau đó chúng ta có thể nói rằng nếu random_chance bằng một, thì và chỉ + +119 +00:08:12,020 --> 00:08:15,920 +khi đó chúng ta mới thực sự tạo ra một chiếc ô tô mới. + +120 +00:08:16,430 --> 00:08:21,430 +Vì vậy, điều này về cơ bản đảm bảo rằng cứ sau sáu lần vòng lặp while chạy, một chiếc xe mới + +121 +00:08:23,930 --> 00:08:24,980 +sẽ được tạo ra. + +122 +00:08:25,430 --> 00:08:29,900 +Bây giờ nó sẽ không chính xác sáu lần vì có một số mức + +123 +00:08:29,900 --> 00:08:33,500 +độ cơ hội liên quan. Nhưng hãy lưu ý khi chúng tôi chạy + +124 +00:08:33,500 --> 00:08:38,500 +chương trình của mình ngay bây giờ, hãy xem những chiếc xe hiện đang được tạo ra ít thường xuyên hơn như thế nào. + +125 +00:08:39,620 --> 00:08:43,130 +Và chúng tôi thực sự có một số không gian cho con rùa của chúng tôi vượt qua. + +126 +00:08:43,880 --> 00:08:48,880 +Vì vậy, đó là cách chúng tôi tạo và di chuyển ô tô của mình trên màn hình và đảm + +127 +00:08:49,580 --> 00:08:53,450 +bảo rằng chúng không xảy ra thường xuyên đến mức chú rùa của chúng tôi + +128 +00:08:53,450 --> 00:08:57,150 +không có cơ hội băng qua đường. Tôi hy vọng hướng dẫn này hữu ích. + +129 +00:08:57,360 --> 00:09:01,320 +Đừng lo lắng nếu mã của bạn trông không giống mã của tôi, nó không cần thiết. + +130 +00:09:01,770 --> 00:09:06,270 +Điều quan trọng là bạn có thể đạt được chức năng mong muốn của trò chơi hay không. + +131 +00:09:06,660 --> 00:09:09,240 +Có hàng triệu cách khác nhau để bạn có thể giải quyết vấn đề này. + +132 +00:09:09,450 --> 00:09:13,110 +Và miễn là nó hoạt động, bất cứ cách nào bạn chọn sẽ là cách tốt nhất. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/008 Solution to Step 5 - Detect when the Turtle collides with a Car squish.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/008 Solution to Step 5 - Detect when the Turtle collides with a Car squish.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..281a22071eeb340a8b7414bd723192f814687171 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/008 Solution to Step 5 - Detect when the Turtle collides with a Car squish.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5458eec130d089d80404e26c7c8df6a772eadcbd30c8f7b83d9b4c6e7b0d92a5 +size 8826490 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/008 Solution to Step 5 - Detect when the Turtle collides with a Car squish_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/008 Solution to Step 5 - Detect when the Turtle collides with a Car squish_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7965f05b1fa76e7e1eecd496899c8834b59ea7e0 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/008 Solution to Step 5 - Detect when the Turtle collides with a Car squish_vi.srt @@ -0,0 +1,124 @@ +1 +00:00:00,330 --> 00:00:05,330 +Bây giờ trong bài học trước, chúng ta đã tạo ra những chiếc ô tô hình chữ nhật này một cách ngẫu nhiên dọc + +2 +00:00:07,350 --> 00:00:08,183 +theo trục Y. + +3 +00:00:08,400 --> 00:00:12,210 +Và sau đó, chúng tôi cố gắng làm cho chúng di chuyển sang phía bên trái của màn hình. + +4 +00:00:12,930 --> 00:00:17,930 +Bước tiếp theo là phát hiện thời điểm con rùa va chạm với ô tô. + +5 +00:00:18,990 --> 00:00:22,440 +Vì vậy, bằng cách đó, khi con rùa va vào một trong những chiếc xe, chúng ta có + +6 +00:00:22,830 --> 00:00:27,830 +thể dừng trò chơi và ngăn những chiếc xe khác di chuyển. Bên trong vòng lặp trong khi của chúng tôi, + +7 +00:00:30,450 --> 00:00:33,690 +tôi sẽ phát hiện ra vụ va chạm với chiếc xe ở đây. + +8 +00:00:34,200 --> 00:00:39,200 +Vì vậy, tôi sẽ nắm giữ tất cả các ô tô trong đối tượng car_manager và tôi sẽ + +9 +00:00:41,100 --> 00:00:46,100 +sử dụng vòng lặp for để lặp qua từng ô tô trong danh sách ô tô đó. + +10 +00:00:47,400 --> 00:00:52,400 +Và sau đó chúng tôi sẽ phát hiện xem liệu chiếc xe có khoảng cách + +11 +00:00:55,620 --> 00:00:59,700 +đến đối tượng của người chơi nhỏ hơn 20 hay không. + +12 +00:01:00,870 --> 00:01:05,870 +Hãy nhớ rằng ô tô của chúng ta có chiều cao 20 pixel x chiều rộng 40 pixel. + +13 +00:01:09,030 --> 00:01:13,290 +Nếu trình phát cách tâm ô tô dưới 20 pixel, thì có + +14 +00:01:13,620 --> 00:01:16,650 +thể nó đã va chạm với ô tô. + +15 +00:01:17,520 --> 00:01:21,000 +Vì vậy, nếu khoảng cách này nhỏ hơn 20, thì chúng + +16 +00:01:21,570 --> 00:01:23,250 +ta sẽ dừng trò chơi. + +17 +00:01:23,580 --> 00:01:25,740 +Và cách chúng tôi dừng trò + +18 +00:01:25,740 --> 00:01:30,360 +chơi tất nhiên là bằng cách chuyển game_is_on này từ true thành false. + +19 +00:01:31,320 --> 00:01:36,320 +Hãy chạy lại mã của chúng tôi và hãy xem điều này đang hoạt động. Vì vậy, chúng ta có thể di chuyển con rùa của mình, + +20 +00:01:36,990 --> 00:01:41,790 +chúng ta có những chiếc ô tô được tạo ngẫu nhiên di chuyển ngang qua và chúng ta hãy đậu con rùa + +21 +00:01:41,790 --> 00:01:44,850 +của chúng ta ngay tại đây. Khi chiếc xe đó đâm vào con rùa của chúng + +22 +00:01:45,180 --> 00:01:48,000 +tôi, nó ngay lập tức dừng trò chơi. Bây giờ, nếu chúng + +23 +00:01:48,030 --> 00:01:50,460 +ta muốn xem những gì đang xảy + +24 +00:01:50,460 --> 00:01:54,840 +ra để màn hình luôn mở thay vì đóng sau khi quá trình kết + +25 +00:01:54,870 --> 00:01:59,250 +thúc, chúng ta có thể yêu cầu nó thoát ra khỏi nhấp chuột. + +26 +00:01:59,790 --> 00:02:03,000 +Vì vậy, bây giờ chúng ta hãy chạy lại mã của chúng tôi và + +27 +00:02:03,330 --> 00:02:05,460 +lưu ý lần này nếu chúng tôi va + +28 +00:02:07,170 --> 00:02:11,400 +chạm với một trong những chiếc xe mà bạn có thể thấy rằng nó dừng lại và nó + +29 +00:02:11,970 --> 00:02:16,970 +chờ hướng dẫn thêm, cuối cùng sẽ chỉ là trò chơi qua văn bản hiển thị trên màn hình và chúng + +30 +00:02:18,720 --> 00:02:23,670 +tôi cũng mức cuối cùng hiển thị trên màn hình. Đó là nó. + +31 +00:02:24,240 --> 00:02:28,530 +Đó là cách chúng tôi phát hiện va chạm giữa ô tô và người chơi của chúng tôi. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/009 Solution to Step 6 - Detect when the Player has reached the other side.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/009 Solution to Step 6 - Detect when the Player has reached the other side.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..673f910d10805a786978839fbb570d39b0118d17 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/009 Solution to Step 6 - Detect when the Player has reached the other side.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5553d1a31278a97e2fcb731677508f3d4ff906aa03318fb203cdc2f3c4118c44 +size 22569503 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/009 Solution to Step 6 - Detect when the Player has reached the other side_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/009 Solution to Step 6 - Detect when the Player has reached the other side_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b5e38c485715086b7d9ed92c2013fec31035da27 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/009 Solution to Step 6 - Detect when the Player has reached the other side_vi.srt @@ -0,0 +1,252 @@ +1 +00:00:00,150 --> 00:00:01,080 +Trong bước cuối + +2 +00:00:01,110 --> 00:00:06,110 +cùng, chúng tôi đã tìm ra cách phát hiện khi nào con rùa của người chơi va vào một chiếc ô tô và + +3 +00:00:06,150 --> 00:00:08,850 +để dừng vòng lặp while dừng trò chơi tại thời điểm đó. + +4 +00:00:09,870 --> 00:00:14,220 +Bây giờ chúng ta sẽ tìm ra cách chúng ta có thể phát hiện khi con + +5 +00:00:14,220 --> 00:00:19,220 +rùa đến phía bên kia của màn hình để sau khi con rùa của chúng ta vượt qua + +6 +00:00:20,790 --> 00:00:25,470 +thành công, sau đó chúng ta có thể đưa con rùa về vị trí xuất phát và + +7 +00:00:25,470 --> 00:00:29,490 +tăng tốc tất cả các xe. Vì vậy, tôi sẽ làm điều đó + +8 +00:00:29,850 --> 00:00:34,080 +ngay tại đây, và tôi sẽ phát hiện ra một cuộc vượt biên thành công. + +9 +00:00:35,040 --> 00:00:39,630 +Vậy thế nào là vượt cạn thành công? Chà, người chơi rùa đã về + +10 +00:00:39,810 --> 00:00:41,130 +đích đúng không? + +11 +00:00:41,430 --> 00:00:46,430 +Mà chúng tôi đã xác định giá trị Y là 280 ở đây trong hằng số. + +12 +00:00:47,850 --> 00:00:49,710 +Bây giờ bạn có thể làm điều này theo một số cách. + +13 +00:00:50,100 --> 00:00:55,100 +Bạn có thể xác định một phương pháp ở đây hoặc đơn giản chỉ cần nắm giữ vị trí của người chơi và sau đó tìm xem + +14 +00:00:55,830 --> 00:01:00,480 +nó có hơn 280 bên trong chính của chúng tôi hay không. py + +15 +00:01:01,200 --> 00:01:03,870 +Bây giờ tôi sẽ tạo một phương + +16 +00:01:04,500 --> 00:01:09,060 +thức ở đây thay vào đó tôi sẽ gọi phương thức is_at_finish_line. + +17 +00:01:10,680 --> 00:01:13,050 +Phương thức này sẽ trả về true + +18 +00:01:13,380 --> 00:01:17,160 +nếu con rùa đang ở vạch đích và false trong khi nó không. + +19 +00:01:17,760 --> 00:01:19,980 +Vậy làm thế nào để chúng ta phát hiện ra điều này? Chà, chúng ta có + +20 +00:01:19,980 --> 00:01:23,400 +thể có được bản thân của mình. ycor và chúng ta + +21 +00:01:23,940 --> 00:01:28,650 +có thể xem liệu con số đó có lớn hơn 280 hay không, đó + +22 +00:01:28,920 --> 00:01:32,010 +là giá trị Y dòng hoàn chỉnh của chúng ta. + +23 +00:01:32,370 --> 00:01:36,090 +Điều đó có nghĩa là chúng ta đã vượt qua khá nhiều vạch đích, phải không? + +24 +00:01:36,510 --> 00:01:39,570 +Vì vậy, nếu trường hợp này xảy ra, thì chúng ta sẽ trả về true. + +25 +00:01:39,930 --> 00:01:43,650 +Nhưng trong khi không phải như vậy, bất kỳ lúc nào khác khi chúng ta kiểm tra điều + +26 +00:01:43,890 --> 00:01:45,540 +này, chúng ta sẽ trả về false. + +27 +00:01:46,170 --> 00:01:49,200 +Vì vậy, bây giờ trở lại chính của chúng tôi. py, chúng ta + +28 +00:01:49,530 --> 00:01:54,240 +có thể gọi người chơi của mình. is_at_finish_line và chúng tôi có thể nói, + +29 +00:01:54,270 --> 00:01:57,660 +nếu điều này là đúng, thì trong trường hợp đó, chúng tôi + +30 +00:01:58,050 --> 00:02:01,260 +sẽ đưa người chơi quay trở lại vị trí ban đầu. + +31 +00:02:01,920 --> 00:02:06,660 +Vì vậy, bên trong lớp trình phát của chúng ta, hãy tạo một phương thức + +32 +00:02:06,660 --> 00:02:09,060 +khác mà tôi sẽ gọi là go_to_start. + +33 +00:02:09,900 --> 00:02:14,900 +Và điều này chỉ liên quan đến việc đưa người chơi của chúng tôi đến vị trí xuất phát mà + +34 +00:02:17,430 --> 00:02:20,190 +chúng tôi đã xác định ở đây trong một hằng số. + +35 +00:02:20,820 --> 00:02:23,640 +Vì vậy, hãy chú ý cách chúng tôi có một chút + +36 +00:02:23,640 --> 00:02:28,640 +lặp lại ở đây, vì vậy chúng tôi thực sự có thể xóa dòng này và chỉ cần gọi chính nó. + +37 +00:02:29,010 --> 00:02:32,460 +go_to_start. Trở lại chính của chúng tôi. py một + +38 +00:02:32,520 --> 00:02:37,230 +khi người chơi về đích, chúng tôi sẽ đưa người + +39 +00:02:37,230 --> 00:02:41,640 +chơi đi đến chỉ số. Và nếu chúng ta tiếp tục + +40 +00:02:41,700 --> 00:02:42,930 +và chạy + +41 +00:02:43,200 --> 00:02:47,550 +mã của mình như hiện tại, bạn có thể thấy rằng + +42 +00:02:47,630 --> 00:02:52,630 +sau khi con rùa băng qua đường, 1: [không nghe được] nó quay + +43 +00:02:56,930 --> 00:02:59,240 +trở lại vị trí ban đầu. + +44 +00:03:00,220 --> 00:03:05,220 +Bây giờ, điều cuối cùng chúng ta cần làm là tăng tốc độ của những chiếc xe khi người + +45 +00:03:06,310 --> 00:03:08,050 +chơi đến phía bên kia, bởi + +46 +00:03:08,260 --> 00:03:11,380 +vì hiệu quả là họ vừa đi đến cấp độ tiếp theo. + +47 +00:03:12,130 --> 00:03:17,130 +Những gì chúng ta có thể làm là khi người chơi về đích, chúng ta + +48 +00:03:17,710 --> 00:03:21,970 +có thể lấy car_manager để tăng tốc độ của những chiếc xe. + +49 +00:03:22,420 --> 00:03:25,660 +Hãy tạo một phương thức bên trong lớp CarManager mà + +50 +00:03:25,690 --> 00:03:30,160 +chúng ta sẽ gọi là level_up. Và trong phương pháp này, chúng + +51 +00:03:30,280 --> 00:03:35,280 +ta sẽ làm cho tốc độ của ô tô tăng lên 10 mỗi lần. + +52 +00:03:35,950 --> 00:03:40,950 +Vì vậy, nếu chúng ta có một thuộc tính gọi là car_speed và ban đầu chúng ta đặt + +53 +00:03:43,510 --> 00:03:45,130 +nó làm khoảng cách di chuyển + +54 +00:03:45,730 --> 00:03:50,730 +bắt đầu, sau đó chúng ta sử dụng car_speed này để xác định xem nó sẽ lùi lại + +55 +00:03:51,250 --> 00:03:53,950 +bao xa mỗi lần. Vậy thì khi + +56 +00:03:53,980 --> 00:03:58,980 +lên cấp, chúng ta có thể tự nói. car_speed bây giờ tăng theo mức tăng mà chúng tôi + +57 +00:03:59,890 --> 00:04:02,560 +đã xác định ở đây, đó là mức tăng di chuyển. + +58 +00:04:03,760 --> 00:04:08,410 +Vì vậy, bây giờ khi người chơi của chúng ta đến phía bên kia ở + +59 +00:04:08,680 --> 00:04:11,320 +vạch đích, thì ngoài việc yêu cầu người + +60 +00:04:11,590 --> 00:04:16,329 +chơi bắt đầu, chúng ta cũng sẽ nhờ car_manager để nâng cấp xe của chúng ta. + +61 +00:04:16,959 --> 00:04:21,010 +Vì vậy, bây giờ khi con rùa của tôi đến phía bên kia của màn + +62 +00:04:21,339 --> 00:04:24,550 +hình, con rùa không chỉ quay trở lại vị trí ban đầu + +63 +00:04:24,790 --> 00:04:27,280 +mà xe ô tô cũng tăng tốc độ. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Course-Fixes-Report-an-Issue.url b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution to Step 7 - Add the Scoreboard and Game Over sequence.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution to Step 7 - Add the Scoreboard and Game Over sequence.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2d58937e07c2865f6fbe75f399a0bae79c643e8c --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution to Step 7 - Add the Scoreboard and Game Over sequence.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcf7504e360fef6fd4b63d6b040367c06e0180162a96ed3be654722999f3e4cf +size 35966291 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution to Step 7 - Add the Scoreboard and Game Over sequence_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution to Step 7 - Add the Scoreboard and Game Over sequence_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a5aef2b2dbfd5f938a2f9956b25105c50eb73f32 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution to Step 7 - Add the Scoreboard and Game Over sequence_vi.srt @@ -0,0 +1,476 @@ +1 +00:00:00,330 --> 00:00:01,200 +Trong bài học + +2 +00:00:01,260 --> 00:00:05,640 +trước, chúng ta đã tìm ra cách phát hiện khi nào con rùa của chúng ta đến phía + +3 +00:00:05,640 --> 00:00:08,340 +bên kia của màn hình. Và khi điều này + +4 +00:00:08,370 --> 00:00:12,480 +xảy ra, chúng tôi đưa người chơi rùa trở lại vị trí ban đầu + +5 +00:00:12,990 --> 00:00:17,990 +và chúng tôi cũng tăng tốc độ của ô tô bằng mức tăng di chuyển mà chúng tôi + +6 +00:00:18,690 --> 00:00:22,500 +đã xác định là một hằng số. Vì vậy, trong bài học + +7 +00:00:22,560 --> 00:00:24,720 +này, bước cuối cùng chúng ta sẽ + +8 +00:00:24,750 --> 00:00:29,750 +làm, đó là tạo một bảng điểm theo dõi xem người chơi rùa đang ở cấp + +9 +00:00:30,690 --> 00:00:35,190 +độ nào và cả khi rùa đánh vào một trong những chiếc ô tô + +10 +00:00:35,190 --> 00:00:36,720 +để hiển thị chữ + +11 +00:00:36,750 --> 00:00:40,680 +trò chơi. ở giữa màn hình. Để làm được điều đó, tất + +12 +00:00:40,710 --> 00:00:45,210 +nhiên chúng ta sẽ vào bên trong lớp bảng điểm của mình và một lần nữa + +13 +00:00:45,240 --> 00:00:48,240 +chúng ta sẽ cần đến sự trợ giúp của lớp rùa. + +14 +00:00:48,660 --> 00:00:53,660 +Vì vậy, hãy nhập nó từ mô-đun rùa và tôi sẽ biến bảng điểm của + +15 +00:00:54,210 --> 00:00:57,300 +mình thành một lớp con của lớp rùa. + +16 +00:00:57,600 --> 00:01:00,270 +Vì vậy, bây giờ nó kế thừa từ lớp rùa. + +17 +00:01:00,720 --> 00:01:04,950 +Và một khi chúng tôi đã xác định init của mình và quản lý để nó + +18 +00:01:04,950 --> 00:01:07,470 +kế thừa mọi thứ từ lớp cha, thì bảng + +19 +00:01:07,860 --> 00:01:12,720 +điểm của chúng tôi giờ đây có thể làm mọi thứ mà một lớp rùa có thể làm. + +20 +00:01:13,710 --> 00:01:15,510 +Chúng ta muốn nó làm gì? Vâng, chúng ta + +21 +00:01:15,570 --> 00:01:19,950 +phải khởi tạo nó bằng một vài thứ trước tiên. Ví dụ, chúng tôi có thể muốn bắt đầu + +22 +00:01:19,950 --> 00:01:22,650 +bằng cách giấu con rùa, chúng tôi chỉ muốn sử dụng + +23 +00:01:22,680 --> 00:01:27,000 +nó như một cây bút để vẽ. Và thêm vào đó, chúng tôi + +24 +00:01:27,030 --> 00:01:31,590 +không muốn nó di chuyển và vẽ. Vì vậy, chúng tôi sẽ kéo cây bút lên. + +25 +00:01:32,040 --> 00:01:35,250 +Thay vào đó, chúng tôi sẽ sử dụng phương thức ghi. + +26 +00:01:35,880 --> 00:01:38,940 +Và những gì chúng ta muốn viết là mức độ, phải không? + +27 +00:01:39,300 --> 00:01:43,620 +Vì vậy, cấp độ hiện tại mà người chơi đang ở. Để làm được điều đó, + +28 +00:01:43,620 --> 00:01:46,230 +chúng tôi cũng phải theo dõi mức độ. + +29 +00:01:46,650 --> 00:01:49,440 +Vì vậy, hãy tiếp tục và tạo một thuộc tính mới + +30 +00:01:49,710 --> 00:01:52,980 +mà tôi sẽ gọi là cấp độ và hãy bắt đầu ở cấp độ 1. + +31 +00:01:53,700 --> 00:01:58,320 +Vì vậy, sau đó chúng ta có thể chèn cái này ngay tại đây với self. và ngoài việc viết văn + +32 +00:01:59,010 --> 00:02:01,710 +bản này, chúng tôi có thể xác + +33 +00:02:01,950 --> 00:02:04,950 +định những gì chúng tôi muốn căn chỉnh. + +34 +00:02:05,370 --> 00:02:10,370 +Vì vậy, tôi muốn cái này ở bên trái và cũng là phông chữ. + +35 +00:02:10,919 --> 00:02:15,920 +Vì vậy, tôi sẽ sử dụng phông chữ này đã được khai báo ở đây như một hằng số. Bây giờ, bên trong + +36 +00:02:17,070 --> 00:02:22,070 +chính của chúng tôi. py bên cạnh nơi chúng tôi đã xác định cầu + +37 +00:02:22,070 --> 00:02:22,903 +thủ của + +38 +00:02:22,920 --> 00:02:27,920 +mình và người quản lý car_ của chúng tôi, tôi sẽ tạo đối tượng bảng điểm mới này và đối + +39 +00:02:29,040 --> 00:02:33,870 +tượng đó sẽ được tạo từ lớp bảng điểm. Bây giờ hãy để ý khi tôi chạy mã như + +40 +00:02:34,230 --> 00:02:37,890 +vậy, bạn có thể thấy rằng cấp độ của chúng ta được căn trái, nó có + +41 +00:02:38,280 --> 00:02:42,300 +phông chữ mà chúng ta đã xác định và nó đang viết văn bản mà chúng ta + +42 +00:02:42,630 --> 00:02:46,800 +muốn, nhưng nó không ở đúng vị trí. Để xác định vị trí, chúng + +43 +00:02:46,830 --> 00:02:51,750 +tôi phải làm điều đó ngay trước khi chúng tôi yêu cầu bảng ghi điểm, vì + +44 +00:02:52,110 --> 00:02:55,950 +vậy ngay tại đây, nhưng sau khi chúng tôi có bút của mình. + +45 +00:02:56,580 --> 00:02:59,830 +Vì vậy, theo cách này, chúng ta không vẽ ra một con đường dẫn đến nơi chúng ta sẽ đến. + +46 +00:03:00,400 --> 00:03:03,220 +Vì vậy, bây giờ chúng ta sẽ xác định bản thân. goto, và tôi + +47 +00:03:03,730 --> 00:03:07,870 +sẽ làm cho nó đi đến góc trên cùng bên trái. + +48 +00:03:08,200 --> 00:03:13,200 +Vì vậy, đó có thể là -280 và sau đó sẽ + +49 +00:03:14,560 --> 00:03:18,640 +là +280 trên Y. Bây giờ, nếu chúng ta chỉ kiểm + +50 +00:03:18,910 --> 00:03:22,630 +tra vị trí, bạn có thể thấy rằng nó hơi quá xa trên trục Y. + +51 +00:03:22,990 --> 00:03:27,940 +Vì vậy, nó cho phép di chuyển nó xuống một chút và bạn có thể điều chỉnh những thứ này + +52 +00:03:27,940 --> 00:03:30,670 +cho đến khi bạn hài lòng với vị trí của nó. + +53 +00:03:31,300 --> 00:03:34,900 +Vì vậy, tôi nghĩ rằng điều này trông khá tốt. Bây giờ, ngoài việc + +54 +00:03:34,930 --> 00:03:37,540 +ghi cấp độ, chúng tôi thực sự + +55 +00:03:37,570 --> 00:03:41,710 +phải cập nhật nó mỗi khi người chơi lên cấp, phải không? + +56 +00:03:42,220 --> 00:03:45,340 +Và họ làm điều đó khi có một cuộc vượt biên thành công. + +57 +00:03:45,850 --> 00:03:47,500 +Vì vậy, tại một số + +58 +00:03:47,500 --> 00:03:51,550 +điểm ở đây, chúng ta sẽ có thể gọi bảng điểm và chúng ta sẽ + +59 +00:03:51,610 --> 00:03:53,830 +có thể lấy bảng điểm để tăng cấp độ. + +60 +00:03:54,550 --> 00:03:59,440 +Vì vậy, chúng ta hãy đi vào bảng điểm và hãy xác định chức năng đó, + +61 +00:04:01,000 --> 00:04:01,833 +tăng_ cấp. + +62 +00:04:02,410 --> 00:04:07,410 +Và điều đầu tiên cần làm khi chúng ta đang tăng cấp độ tất nhiên + +63 +00:04:07,420 --> 00:04:12,420 +là nắm bắt được bản thân này. cấp và sau đó thêm một vào nó mỗi lần. + +64 +00:04:13,420 --> 00:04:17,529 +Ngoài ra, chúng tôi sẽ cần cấp độ được viết lại một lần nữa. + +65 +00:04:17,980 --> 00:04:22,980 +Vì vậy, hãy cắt điều này ra khỏi init và thay vào đó hãy xác định một phương thức + +66 +00:04:23,260 --> 00:04:25,750 +tùy chỉnh mà chúng ta sẽ gọi là update_scoreboard. + +67 +00:04:28,140 --> 00:04:28,410 +1: Vâng. + +68 +00:04:28,410 --> 00:04:33,300 +0: Bên trong bảng update_scoreboard này, chúng ta có thể viết cấp độ hiện tại. + +69 +00:04:33,930 --> 00:04:35,460 +Vì vậy, bây giờ bên trong + +70 +00:04:35,490 --> 00:04:39,180 +init chúng ta có thể gọi là self. update_scoreboard và khi chúng ta + +71 +00:04:39,570 --> 00:04:41,820 +tăng cấp độ, chúng ta có + +72 +00:04:41,850 --> 00:04:45,030 +thể gọi là self. update_scoreboard. + +73 +00:04:45,780 --> 00:04:47,790 +Hiện tại, như hiện tại, + +74 +00:04:47,940 --> 00:04:52,140 +nó sẽ ghi đè lên những gì đã từng có trên bảng điểm. + +75 +00:04:52,620 --> 00:04:55,110 +Vì vậy, hiện tại nó đang ở cấp + +76 +00:04:56,130 --> 00:04:58,800 +độ 1, nhưng khi tôi vượt qua thành công, bạn + +77 +00:04:59,070 --> 00:05:03,240 +có thể thấy rằng cấp độ 2 sẽ bị ghi đè lên cấp độ 1. + +78 +00:05:03,870 --> 00:05:06,510 +Để tránh điều đó xảy ra khi chúng tôi cập nhật bảng điểm, + +79 +00:05:06,780 --> 00:05:09,600 +chúng tôi phải làm cho bảng điểm tự xóa để nó xóa tất cả + +80 +00:05:09,840 --> 00:05:13,740 +những thứ trước đó mà nó đã viết. Bằng cách này khi chúng tôi thực + +81 +00:05:13,830 --> 00:05:15,690 +sự chạy mã của mình, bạn có + +82 +00:05:15,720 --> 00:05:20,720 +thể thấy rằng bảng điểm của chúng tôi sẽ làm mới và xóa văn bản trước đó và + +83 +00:05:22,890 --> 00:05:24,690 +viết văn bản mới mỗi lần. + +84 +00:05:25,500 --> 00:05:30,500 +Vì vậy, bây giờ điều cuối cùng cần làm là viết các từ trò chơi ở giữa + +85 +00:05:30,510 --> 00:05:35,430 +màn hình khi trò chơi kết thúc. Để làm điều đó, tôi sẽ tạo một + +86 +00:05:35,440 --> 00:05:36,900 +phương thức khác ở + +87 +00:05:36,930 --> 00:05:41,460 +đây mà tôi sẽ gọi là game_over. Và bên trong phương pháp này, chúng + +88 +00:05:41,790 --> 00:05:45,300 +ta sẽ đưa con rùa của chúng ta vào trung tâm. + +89 +00:05:45,360 --> 00:05:50,360 +Vì vậy, chúng ta sẽ nói về bản thân. goto và trung tâm, tất nhiên, ở (0, 0), + +90 +00:05:51,120 --> 00:05:54,900 +và sau đó chúng ta sẽ bắt nó để viết, nhưng lần này chúng + +91 +00:05:55,320 --> 00:06:00,140 +ta sẽ không viết cấp độ nữa. Thay vào đó, chúng + +92 +00:06:00,170 --> 00:06:04,370 +ta sẽ chỉ viết hoa các từ GAME OVER. + +93 +00:06:04,820 --> 00:06:09,820 +Và tôi muốn căn chỉnh được căn giữa và tôi muốn phông chữ + +94 +00:06:09,890 --> 00:06:14,690 +là phông chữ mặc định. Bây giờ, khi chúng tôi thực sự phát + +95 +00:06:14,780 --> 00:06:17,300 +hiện ra một vụ va chạm, không chỉ game_is_on sẽ + +96 +00:06:17,570 --> 00:06:21,950 +là sai, mà chúng tôi sẽ lấy bảng điểm để hiển thị trò chơi theo trình tự. + +97 +00:06:22,670 --> 00:06:27,670 +Vì vậy, bây giờ chúng ta có thể chạy mã của mình và bạn có thể thấy rằng khi con rùa của tôi va + +98 +00:06:28,730 --> 00:06:29,563 +chạm với một + +99 +00:06:31,010 --> 00:06:33,740 +chiếc ô tô, thì nó sẽ kết thúc trò chơi ở trung tâm. + +100 +00:06:34,220 --> 00:06:39,050 +Và bởi vì khi chúng tôi viết trò chơi kết thúc, chúng tôi không xóa bất kỳ văn bản nào trước đó, người + +101 +00:06:39,350 --> 00:06:42,650 +dùng có thể thấy ở cấp độ cao nhất mà họ có thể đạt được. + +102 +00:06:43,730 --> 00:06:45,830 +Đó là nó. Đó là toàn bộ trò chơi. + +103 +00:06:46,370 --> 00:06:50,870 +Hy vọng rằng bạn đã quản lý để xây dựng toàn bộ trò chơi này và bạn chỉ ở + +104 +00:06:50,870 --> 00:06:55,610 +đây để kiểm tra một số vấn đề khó khăn. Nhưng nếu bạn gặp khó khăn với mã này, thì + +105 +00:06:55,850 --> 00:07:00,290 +tôi thực sự khuyên bạn nên xem lại các bài học trước khi chúng tôi tạo trò chơi rắn + +106 +00:07:00,290 --> 00:07:03,110 +hoặc khi chúng tôi tạo trò chơi vượt rùa này và thử + +107 +00:07:03,440 --> 00:07:07,310 +xem liệu bạn có thể tự mình tạo hai trò chơi này từ đầu hay không + +108 +00:07:07,670 --> 00:07:11,870 +bằng cách xem cách trò chơi hoạt động. Bởi vì nếu bạn tiếp tục về phía + +109 +00:07:11,930 --> 00:07:14,120 +trước, mọi thứ sẽ trở nên phức tạp hơn. + +110 +00:07:14,420 --> 00:07:18,860 +Và tôi giả định rằng bạn sẽ dành thời gian để xem xét và sửa đổi trước + +111 +00:07:18,860 --> 00:07:19,693 +khi tiếp tục. + +112 +00:07:20,900 --> 00:07:24,590 +Vì vậy, hãy chơi vui vẻ với trò chơi vượt rùa và hãy nhớ cho tôi + +113 +00:07:24,590 --> 00:07:29,590 +biết trong phần Hỏi / A cấp độ cao nhất của bạn mà bạn đạt được là gì và cũng nhớ đính + +114 +00:07:29,810 --> 00:07:32,780 +kèm một bức ảnh nếu không điều đó sẽ không xảy ra. + +115 +00:07:33,740 --> 00:07:36,590 +Và đây là một dự án tuyệt vời để bạn tùy chỉnh. + +116 +00:07:36,620 --> 00:07:39,110 +Vì vậy, hãy suy nghĩ về những gì bạn có thể + +117 +00:07:39,140 --> 00:07:44,140 +muốn thay đổi như màu sắc hoặc hình dạng và biến trò chơi thực sự là của riêng bạn, sau đó chụp ảnh + +118 +00:07:44,780 --> 00:07:48,830 +màn hình và chia sẻ nó với chúng tôi trong phần Hỏi / Đáp để tất cả chúng tôi + +119 +00:07:48,830 --> 00:07:51,500 +có thể đánh giá cao và chúc mừng bạn về công việc. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution-turtle-crossing-final.zip b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution-turtle-crossing-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..ad0805962fb22c306082830480c3eea7100589f4 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/010 Solution-turtle-crossing-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:961138149cb8759c96932554041a05f6cad9210846cde61344cb0a360d1dccf2 +size 1813 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/011 This course is not about typing out code.mp4 b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/011 This course is not about typing out code.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..13d69603c543b508adce9befe184a1bcd03e05b4 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/011 This course is not about typing out code.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7179378687a5669badf56ec128892e60c8072b048804bdaaa210ade1f106faf +size 62747687 diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/011 This course is not about typing out code_vi.srt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/011 This course is not about typing out code_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e2ea508177df25d99e3374d0a1a1f903d46dcdd --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/011 This course is not about typing out code_vi.srt @@ -0,0 +1,88 @@ +1 +00:00:01,430 --> 00:00:04,850 +Này, hoàn thành tốt ngày 23. + +2 +00:00:05,770 --> 00:00:12,100 +Bây giờ, hôm nay, tôi muốn nói với các bạn một chút về khóa học, bởi vì khi tôi thiết kế khóa học này, khi tôi nghĩ về + +3 +00:00:12,100 --> 00:00:16,900 +những gì sẽ diễn ra trong đó, tôi sẽ ghi lại nó như thế nào, tôi sẽ cấu trúc chương + +4 +00:00:16,900 --> 00:00:22,150 +trình học như thế nào, một điều mà tôi thực sự rõ ràng là đây không nên là một khóa học lập trình. + +5 +00:00:22,150 --> 00:00:26,670 +Nó không nên chỉ dạy bạn cú pháp hoặc, bạn biết đấy, một cái gì đó mà bạn có thể đọc trong một cuốn sách. + +6 +00:00:27,100 --> 00:00:34,990 +Tôi muốn đây là một khóa học về tư duy và đó là lý do tại sao trong suốt khóa học, có rất + +7 +00:00:34,990 --> 00:00:42,430 +nhiều nơi tôi yêu cầu bạn tạm dừng video để hoàn thành thử thách, hoàn thành bài tập viết mã hoặc xây + +8 +00:00:42,430 --> 00:00:43,690 +dựng dự án. + +9 +00:00:44,590 --> 00:00:48,760 +Đó là vì phần khó của lập trình là không viết ra mã. + +10 +00:00:49,120 --> 00:00:49,930 +Rất thường xuyên + +11 +00:00:49,930 --> 00:00:52,180 +bạn chỉ gõ ra 10 dòng mã, phải không? + +12 +00:00:52,210 --> 00:00:55,270 +Và một khi bạn nhìn thấy giải pháp, bất kỳ ai cũng có thể viết ra. + +13 +00:00:56,140 --> 00:00:58,510 +Phần khó là tư duy. + +14 +00:00:58,750 --> 00:01:04,269 +Đó là chia nhỏ vấn đề thành những phần nhỏ hơn mà bạn có thể giải quyết từng vấn đề một. + +15 +00:01:04,510 --> 00:01:10,390 +Nó đưa ra sơ đồ luồng của chương trình, nó sẽ hoạt động như thế nào, logic sẽ diễn ra như thế + +16 +00:01:10,390 --> 00:01:10,780 +nào. + +17 +00:01:11,350 --> 00:01:17,970 +Và làm điều đó và lặp đi lặp lại việc làm đó thực sự là cách bạn sẽ thành công với tư cách là một lập trình viên. + +18 +00:01:18,400 --> 00:01:26,530 +Vì vậy, tôi muốn bạn đảm bảo rằng mọi cơ hội đến để thực hành, bạn đều nắm lấy nó. Và bạn tận dụng cơ hội đó để suy + +19 +00:01:26,530 --> 00:01:33,240 +nghĩ thấu đáo vấn đề, chia nhỏ vấn đề, hiểu nó và viết mã của riêng bạn. + +20 +00:01:34,120 --> 00:01:37,890 +Hãy nhớ rằng phần viết mã, phần viết, không quan trọng. + +21 +00:01:38,170 --> 00:01:40,270 +Phần quan trọng là tư duy. + +22 +00:01:40,540 --> 00:01:43,420 +Và bạn sẽ đi trước những người khác hàng dặm. + diff --git a/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/external-links.txt b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8d33c5f0ecc7ffc4c9635ee159e5ef9cec076690 --- /dev/null +++ b/part2/23 - Day 23 - Intermediate - The Turtle Crossing Capstone Project/external-links.txt @@ -0,0 +1,3 @@ + +010 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/001 Day 24 Goals what you will make by the end of the day.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/001 Day 24 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d5c2c333b65c99e23062a98a903d997c8da1dd39 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/001 Day 24 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2ab3acf7141a0f8591a7b880c773eed00074dd8431c346626236a7e660d369c +size 16806682 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/001 Day 24 Goals what you will make by the end of the day_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/001 Day 24 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..57f4985bf35e590c1cde1b3af9564be97fc8a211 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/001 Day 24 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,124 @@ +1 +00:00:00,300 --> 00:00:05,070 +Xin chào các bạn, chào mừng đến với Ngày 24 của 100 Ngày viết mã. Hôm nay chúng ta sẽ tìm hiểu về + +2 +00:00:05,070 --> 00:00:09,000 +cách làm việc với hệ thống tệp cục bộ và cũng hiểu cách + +3 +00:00:09,060 --> 00:00:13,320 +hoạt động của các thư mục. Và vào cuối ngày, chúng tôi sẽ cải + +4 +00:00:13,380 --> 00:00:18,380 +thiện trò chơi rắn trước đây của mình, trước đây hoặc hiện tại, cách thức hoạt động của nó là + +5 +00:00:19,350 --> 00:00:24,350 +nó chỉ là trò chơi sau khi chúng tôi va vào tường hoặc một khi chúng tôi đâm vào đuôi, + +6 +00:00:24,600 --> 00:00:27,510 +điều đó thật thú vị, nhưng nó có thể tốt hơn. + +7 +00:00:28,080 --> 00:00:31,980 +Hãy tưởng tượng nếu chúng ta cũng có thể theo dõi điểm số cao. + +8 +00:00:32,130 --> 00:00:36,930 +Vì vậy, nếu một người dùng nhận được điểm cao hơn điểm cao trước đó, thì + +9 +00:00:37,530 --> 00:00:42,530 +nếu họ kết thúc trận đấu, điểm cao sẽ được cập nhật để chúng tôi có thể + +10 +00:00:42,960 --> 00:00:45,570 +tiếp tục cố gắng cải thiện bản thân. + +11 +00:00:46,440 --> 00:00:50,400 +Và khi chúng ta đã học được tất cả các kỹ năng thao tác hệ thống + +12 +00:00:50,400 --> 00:00:54,150 +tệp, đọc và ghi vào tệp, thì chúng ta sẽ tạo một dự án sẽ + +13 +00:00:54,510 --> 00:00:59,220 +giúp chúng ta tiết kiệm rất nhiều rắc rối và tự động hóa cuộc sống của chúng ta một + +14 +00:00:59,220 --> 00:01:02,430 +chút bằng cách sử dụng Python. Vì vậy, tình hình là giả + +15 +00:01:02,430 --> 00:01:06,510 +sử bạn cần phải viết rất nhiều thư. Có thể bạn tổ chức một bữa tiệc sinh nhật, có + +16 +00:01:06,510 --> 00:01:09,420 +thể bạn cần viết lời mời đám cưới, hoặc có thể bạn chỉ cần gửi + +17 +00:01:09,420 --> 00:01:12,720 +email cho tất cả khách hàng của mình. Giả sử bạn + +18 +00:01:12,720 --> 00:01:17,280 +muốn cá nhân hóa một phần của tệp đó, chẳng hạn như phần + +19 +00:01:17,670 --> 00:01:21,840 +mà bạn nói tên thân yêu. Chà, nếu bạn có một danh sách các + +20 +00:01:21,900 --> 00:01:26,900 +tên và bạn muốn tạo các chữ cái riêng biệt bằng cách sử dụng từng cái tên đó, thì có thể + +21 +00:01:27,570 --> 00:01:32,220 +một chữ cái có nội dung 'Dear James', một chữ có nội dung 'Dear Emily' và sau đó chúng tôi + +22 +00:01:32,220 --> 00:01:33,150 +chỉ làm việc + +23 +00:01:33,420 --> 00:01:37,500 +với danh sách và tiếp tục thay thế các phần của lá thư của chúng tôi với + +24 +00:01:37,770 --> 00:01:39,450 +tên trong danh sách của chúng tôi. + +25 +00:01:40,260 --> 00:01:44,010 +Vì vậy, chúng tôi kết thúc với một loạt các bức thư đã sẵn sàng để gửi đi. + +26 +00:01:45,360 --> 00:01:47,490 +Tùy thuộc vào loại công việc bạn có + +27 +00:01:47,520 --> 00:01:52,410 +thể có, đây là thứ có thể thực sự hữu ích như một phần công việc của bạn hoặc có + +28 +00:01:52,470 --> 00:01:54,660 +thể chỉ trong cuộc sống hàng ngày của bạn. + +29 +00:01:55,110 --> 00:02:00,000 +Và chúng ta sẽ bắt đầu sử dụng Python để tự động hóa các phần trong cuộc sống của chúng ta và + +30 +00:02:00,060 --> 00:02:04,110 +giúp Python thực hiện nhiều tác vụ lặp đi lặp lại mà chúng ta không muốn làm. + +31 +00:02:04,650 --> 00:02:08,190 +Và vì vậy chúng tôi có thể dành nhiều thời gian hơn để xem Netflix và chơi trò chơi điện tử. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Add a High Score to the Snake Game.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Add a High Score to the Snake Game.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e686efbadc81845e0197e5dd9290c1472a25fc73 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Add a High Score to the Snake Game.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:234898ea48ee9d079ad5d6077ae561c3f49872416c8bffa269738cbe686dd55b +size 54478578 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Add a High Score to the Snake Game_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Add a High Score to the Snake Game_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..06f3fd9c0377dd9d4cd3590e05578c1bfcad4d5e --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Add a High Score to the Snake Game_vi.srt @@ -0,0 +1,636 @@ +1 +00:00:00,420 --> 00:00:04,110 +Đầu tiên, hãy bắt đầu bằng cách cải thiện trò chơi rắn của chúng + +2 +00:00:04,650 --> 00:00:09,150 +tôi, để nó có thể theo dõi điểm cao mà chúng tôi đạt được mỗi khi chơi + +3 +00:00:09,150 --> 00:00:14,150 +trò chơi để chúng tôi có thể biết điểm cao của mình là bao nhiêu và tiếp tục phấn đấu + +4 +00:00:14,310 --> 00:00:15,150 +để tốt hơn. + +5 +00:00:16,200 --> 00:00:21,180 +Mở trò chơi rắn trong PyCharm mà bạn đã tạo vài ngày trước. Bây giờ, nếu bạn không thể tìm thấy dự + +6 +00:00:21,180 --> 00:00:23,430 +án trò chơi rắn của mình hoặc + +7 +00:00:23,820 --> 00:00:28,170 +nếu bạn đã thực hiện một số thay đổi quan trọng đối với nó mà có + +8 +00:00:28,170 --> 00:00:32,490 +thể gây nhầm lẫn khi làm theo hướng dẫn, thì chỉ cần truy cập URL này + +9 +00:00:32,670 --> 00:00:34,770 +trong tài nguyên khóa học và + +10 +00:00:35,220 --> 00:00:39,980 +sau đó bạn có thể tiếp tục và nhấn tải xuống dưới dạng zip, giải nén tệp + +11 +00:00:39,980 --> 00:00:43,470 +đã tải xuống, sau đó mở nó bên trong PyCharm và bạn sẽ + +12 +00:00:43,860 --> 00:00:47,190 +kết thúc với cùng một dự án như tôi có ở đây. + +13 +00:00:47,940 --> 00:00:49,260 +Và khi bạn đã + +14 +00:00:49,410 --> 00:00:53,880 +hoàn thành điều đó, thì chúng ta có thể bắt đầu thêm chức năng để + +15 +00:00:53,880 --> 00:00:57,060 +theo dõi điểm số cao. Đầu tiên, tôi sẽ thêm + +16 +00:00:57,060 --> 00:01:01,410 +một thuộc tính khác vào bảng điểm của mình, thuộc tính này sẽ được gọi là high_score. + +17 +00:01:01,920 --> 00:01:06,060 +Và một lần nữa, nó sẽ bắt đầu bằng không. Bây giờ, điều tiếp theo + +18 +00:01:06,090 --> 00:01:11,090 +tôi sẽ làm là tôi sẽ thay thế trò chơi này qua phương + +19 +00:01:11,910 --> 00:01:16,680 +thức bằng một phương pháp mới. Chúng tôi sẽ không dừng trò chơi và viết tiếp trò chơi nữa. + +20 +00:01:17,130 --> 00:01:19,770 +Thay vào đó, chúng tôi sẽ đặt lại bảng điểm. + +21 +00:01:20,430 --> 00:01:23,730 +Vậy điều gì sẽ xảy ra khi chúng ta đặt lại bảng điểm? Chà, chúng ta cần tìm + +22 +00:01:23,730 --> 00:01:28,730 +hiểu xem điểm số hiện tại mà người dùng đạt được có lớn hơn điểm số + +23 +00:01:29,640 --> 00:01:34,170 +cao nhất mọi thời đại hay không. Và nếu đúng như vậy, thì chúng + +24 +00:01:34,260 --> 00:01:38,850 +ta sẽ cập nhật điểm số cao với giá trị của điểm số hiện tại. + +25 +00:01:39,420 --> 00:01:42,150 +Vì vậy, mã cho điều đó sẽ giống như thế này. + +26 +00:01:42,540 --> 00:01:47,250 +Nếu tự. điểm số lớn hơn bản thân. high_score, tốt trong + +27 +00:01:47,670 --> 00:01:52,670 +trường hợp đó thì tự. high_score sẽ bằng chính nó. ghi bàn. + +28 +00:01:53,910 --> 00:01:56,400 +Lúc đầu, điều này có vẻ hơi khó hiểu, nhưng nếu bạn + +29 +00:01:56,730 --> 00:02:00,780 +chỉ cần xem qua logic và suy nghĩ về cách bạn sẽ tạo ra một cơ chế tiết kiệm + +30 +00:02:00,780 --> 00:02:02,250 +điểm cao, thì bạn sẽ khá + +31 +00:02:02,700 --> 00:02:07,290 +nhanh chóng hiểu những gì đang xảy ra ở đây. Bây giờ, khi chúng tôi đã + +32 +00:02:07,290 --> 00:02:12,270 +cập nhật điểm số cao, việc tiếp theo cần làm là đặt lại điểm số. + +33 +00:02:12,690 --> 00:02:17,340 +Vì vậy, tôi sẽ đặt lại nó xuống 0. Bây giờ, hãy nhớ thứ tự mã + +34 +00:02:17,340 --> 00:02:21,780 +của bạn rất quan trọng vì nếu lần đầu tiên bạn đặt điểm bằng 0, + +35 +00:02:22,050 --> 00:02:25,350 +thì nó sẽ không bao giờ lớn hơn điểm cao hiện tại. + +36 +00:02:25,560 --> 00:02:27,450 +Vì vậy, điều này sẽ không bao giờ được kích hoạt. + +37 +00:02:27,870 --> 00:02:32,550 +Vì vậy, như mọi khi, hãy cẩn thận nơi bạn đang viết mã của mình. Bây giờ, sau khi chúng tôi + +38 +00:02:32,640 --> 00:02:36,990 +đã thiết lập điểm số, chúng tôi cần cập nhật bảng điểm. + +39 +00:02:37,740 --> 00:02:42,870 +Bây giờ, một điều mà tôi đã thay đổi về bảng điểm là trước đây khi chúng tôi + +40 +00:02:42,930 --> 00:02:43,950 +tăng điểm, tôi + +41 +00:02:44,340 --> 00:02:48,780 +đã sử dụng bản thân. rõ ràng và sau đó tự. update_scoreboard. + +42 +00:02:49,230 --> 00:02:52,350 +Nhưng nó thực sự có ý nghĩa hơn khi điều này rõ ràng + +43 +00:02:52,380 --> 00:02:54,780 +xảy ra mỗi khi chúng tôi cập nhật bảng điểm. + +44 +00:02:55,230 --> 00:02:59,010 +Vì vậy, tôi đã thêm lệnh gọi phương thức này ở đây trước khi chúng tôi thực sự ghi điểm. + +45 +00:03:00,160 --> 00:03:04,330 +Lý do tại sao tôi không thể làm điều này trước đây là vì khi + +46 +00:03:04,330 --> 00:03:05,200 +chúng tôi + +47 +00:03:05,620 --> 00:03:10,000 +muốn hiển thị trò chơi kết thúc, chúng tôi muốn giữ điểm số trên màn hình + +48 +00:03:10,000 --> 00:03:15,000 +và sau đó để con rùa bảng điểm đi vào giữa và viết trò chơi để cả hai + +49 +00:03:15,280 --> 00:03:17,080 +mọi thứ hiển thị trên màn hình. + +50 +00:03:17,740 --> 00:03:20,680 +Nhưng bây giờ chúng tôi đang loại bỏ trò chơi của mình + +51 +00:03:21,130 --> 00:03:26,130 +theo phương pháp, sau đó chúng tôi có thể tiếp tục và di chuyển rõ ràng đó để cập nhật bảng điểm + +52 +00:03:26,590 --> 00:03:30,400 +và sau đó chúng tôi không phải gọi nó hai lần, cả trong đặt lại và tăng_score. + +53 +00:03:31,390 --> 00:03:34,600 +Bây giờ, ngoài việc viết điểm, bây giờ tôi cũng sẽ + +54 +00:03:34,900 --> 00:03:37,330 +viết điểm cao, và điều này sẽ sử + +55 +00:03:37,960 --> 00:03:42,490 +dụng một chuỗi f để chèn tự. điểm cao. + +56 +00:03:43,420 --> 00:03:45,910 +Bây giờ, nếu chúng tôi chạy trò chơi này như + +57 +00:03:45,970 --> 00:03:48,580 +hiện tại, bạn có thể thấy nó cho biết điểm 0, + +58 +00:03:48,580 --> 00:03:51,430 +điểm cao 0 bằng cách sử dụng các giá trị ban đầu này. + +59 +00:03:52,180 --> 00:03:54,550 +Nhưng ngay sau khi nó chạm vào bức tường, nó kết thúc + +60 +00:03:54,580 --> 00:03:57,430 +bởi vì trong chính của chúng tôi. py, chúng tôi thay + +61 +00:03:57,760 --> 00:04:02,760 +đổi game_is_on này thành false và điều đó kết thúc vòng lặp while của chúng tôi. + +62 +00:04:04,060 --> 00:04:04,840 +Thay vào + +63 +00:04:04,840 --> 00:04:09,840 +đó, những gì tôi sẽ làm là tôi sẽ xóa game_is_on này bằng false và cũng + +64 +00:04:10,660 --> 00:04:13,390 +xóa nó khi chúng tôi va chạm với đuôi. + +65 +00:04:14,020 --> 00:04:18,250 +Và tôi cũng sẽ xóa phần mà chúng ta gọi trò chơi + +66 +00:04:18,250 --> 00:04:23,020 +kết thúc khỏi bảng tỷ số. Thay vào đó, tôi sẽ lấy bảng điểm để tự thiết lập lại. + +67 +00:04:24,490 --> 00:04:29,490 +Vì vậy, bằng cách đó, điểm số được đặt lại về 0 và chúng tôi đã sẵn sàng với vòng tiếp theo. + +68 +00:04:30,730 --> 00:04:35,080 +Vì vậy, bây giờ nếu tôi chạy lại trò chơi này, bạn có thể thấy nó nói + +69 +00:04:35,380 --> 00:04:40,000 +rằng, điểm là 0, và sau đó ngay khi chúng ta đạt được điểm cao hơn và chúng + +70 +00:04:40,000 --> 00:04:43,930 +ta sẽ chết, như vậy, thì điểm cao của chúng ta sẽ là 2. + +71 +00:04:44,560 --> 00:04:49,560 +Nhưng loại rắn của chúng ta chỉ biến mất bởi vì nó tiếp tục di chuyển theo cùng một hướng và + +72 +00:04:50,560 --> 00:04:54,850 +bây giờ có lẽ nó đang ở đâu đó, tất cả các con đường xuống bên trái. + +73 +00:04:55,420 --> 00:05:00,100 +Thay vào đó chúng ta làm gì? Chà, con rắn của chúng ta cũng cần được thiết lập lại. + +74 +00:05:00,610 --> 00:05:04,990 +Vì vậy, hãy tạo một phương thức đặt lại bên trong lớp solid. + +75 +00:05:05,680 --> 00:05:10,680 +Và tất cả những gì chúng tôi cần làm là làm cho tất cả các phân đoạn rõ ràng. + +76 +00:05:11,770 --> 00:05:13,510 +Và khi tôi di chuột qua + +77 +00:05:13,510 --> 00:05:18,510 +mục này, bạn có thể thấy những gì nó làm là xóa tất cả các mục khỏi danh + +78 +00:05:18,760 --> 00:05:19,360 +sách đó. + +79 +00:05:19,360 --> 00:05:24,360 +Vì vậy, tất cả các phân đoạn mà chúng tôi đã thêm vào danh sách + +80 +00:05:24,490 --> 00:05:28,780 +các phân đoạn sẽ bị xóa. Và sau đó khi chúng tôi đã loại bỏ tất cả các phân + +81 +00:05:28,810 --> 00:05:31,540 +đoạn, chúng tôi sẽ tự gọi mình. create_snake một lần nữa, + +82 +00:05:31,810 --> 00:05:36,490 +để chúng tôi tạo một con rắn ba đoạn khác ở vị trí bắt đầu. + +83 +00:05:37,660 --> 00:05:38,650 +Bây giờ, ngoài + +84 +00:05:38,680 --> 00:05:43,680 +ra, tôi cũng sẽ thiết lập bản thân. đứng đầu là phần tử thứ 0 từ danh sách các + +85 +00:05:44,920 --> 00:05:45,753 +phân đoạn đó. + +86 +00:05:46,150 --> 00:05:50,620 +Vì vậy, về cơ bản chúng tôi đang làm mọi thứ trong init bởi vì chúng tôi + +87 +00:05:50,620 --> 00:05:53,620 +sẽ khởi tạo lại con rắn, trở lại trung tâm. + +88 +00:05:54,220 --> 00:05:59,120 +Vì vậy, bây giờ nếu tôi quay trở lại chính. py, và ngoài việc đặt lại bảng điểm, tôi + +89 +00:05:59,450 --> 00:06:02,000 +cũng yêu cầu con rắn của mình đặt lại, 1: + +90 +00:06:02,770 --> 00:06:03,603 +Đúng không? + +91 +00:06:06,160 --> 00:06:07,930 +0: Tại thời điểm này, khi tôi chạy mã, + +92 +00:06:07,990 --> 00:06:12,990 +bạn sẽ nhận thấy rằng nó không hoạt động theo cách bạn mong đợi. Vì vậy, tôi có thể tiếp tục + +93 +00:06:13,990 --> 00:06:17,830 +và ghi bàn, và khi tôi chết, tôi sẽ nhận được điểm số + +94 +00:06:18,250 --> 00:06:22,060 +cao, nhưng con rắn già của tôi vẫn còn nằm trên màn hình. + +95 +00:06:22,480 --> 00:06:25,480 +Vì vậy, mặc dù chúng tôi đã xóa các phân + +96 +00:06:25,690 --> 00:06:30,400 +đoạn, chúng tôi không thực sự loại bỏ những con rùa vẫn còn trên màn hình. + +97 +00:06:31,030 --> 00:06:32,710 +Và để loại bỏ chúng, chúng + +98 +00:06:32,740 --> 00:06:37,740 +tôi thực sự phải gửi chúng đến một vị trí khác. Trong phương pháp đặt lại rắn của chúng tôi, ngay trước + +99 +00:06:40,000 --> 00:06:42,610 +khi chúng tôi xóa các phân đoạn của mình, vì vậy + +100 +00:06:42,940 --> 00:06:45,340 +mặc dù chúng tôi vẫn có quyền truy cập + +101 +00:06:45,850 --> 00:06:50,850 +vào tất cả chúng, chúng tôi sẽ sử dụng vòng lặp for để lặp qua tất cả các phân đoạn trong + +102 +00:06:51,100 --> 00:06:56,100 +danh sách các phân đoạn và cho từng phân đoạn đó biết để đi đến một nơi không có màn hình. + +103 +00:06:57,940 --> 00:07:01,420 +Vì vậy, màn hình của chúng ta chỉ có 600 x + +104 +00:07:01,840 --> 00:07:05,590 +600 và tôi sẽ nói với nó là 1000 X, 1000 Y. + +105 +00:07:05,950 --> 00:07:10,420 +Vì vậy, nó sẽ biến mất khỏi màn hình. Vì vậy, theo cách này, hãy chú + +106 +00:07:10,450 --> 00:07:11,283 +ý xem + +107 +00:07:11,470 --> 00:07:16,470 +khi con rắn chạm vào một trong các bức tường hoặc khi nó đập vào + +108 +00:07:16,930 --> 00:07:18,940 +đuôi, thay vì chỉ ở lại + +109 +00:07:18,970 --> 00:07:23,230 +đó, nó thực sự biến mất vào một vị trí ngoài màn hình. + +110 +00:07:23,890 --> 00:07:26,890 +Vì vậy, bằng cách đó chúng ta có thể theo dõi điểm + +111 +00:07:27,190 --> 00:07:29,680 +số cao của mình, chúng ta có thể tiếp + +112 +00:07:30,100 --> 00:07:34,000 +tục đạt được điểm số cao hơn, và nếu chúng ta nhận được điểm không cao + +113 +00:07:34,480 --> 00:07:39,220 +bằng điểm cao và chúng ta cuối cùng chết, thì điểm cao vẫn như giá trị trước đó . + +114 +00:07:40,180 --> 00:07:44,560 +Bây giờ, điều duy nhất của trò chơi này là để kết thúc nó, chúng + +115 +00:07:44,710 --> 00:07:49,570 +ta phải nhấn nút dừng ở đây. Nhưng một khi chúng tôi đã làm điều đó, + +116 +00:07:49,750 --> 00:07:53,140 +nó cũng tiết lộ lỗ hổng quan trọng trong mã của chúng tôi. + +117 +00:07:53,500 --> 00:07:57,580 +Bởi vì nếu tôi chạy lại chương trình của chúng tôi, bạn có thể thấy rằng, khoan đã, điều gì đã + +118 +00:07:57,610 --> 00:07:59,410 +xảy ra với điểm số cao, phải không? + +119 +00:07:59,620 --> 00:08:03,910 +Chúng tôi đã đạt điểm cao là 3 trước đó. Vậy hả? + +120 +00:08:04,300 --> 00:08:08,470 +Chính xác thì điều gì đang xảy ra? Chà, lý do thực sự khá đơn giản. + +121 +00:08:09,010 --> 00:08:13,450 +Chúng ta biết rằng nếu chúng ta tạo một biến, giả sử chúng ta tạo một biến + +122 +00:08:13,480 --> 00:08:15,070 +được gọi là tập hợp + +123 +00:08:15,550 --> 00:08:20,320 +nó bằng ba, và sau đó tại một thời điểm nào đó chúng ta đặt a từ đầu vào. + +124 +00:08:20,710 --> 00:08:22,540 +Vì vậy, bây giờ khi tôi chạy mã + +125 +00:08:22,570 --> 00:08:25,780 +này, bạn có thể thấy rằng ban đầu a bằng ba, nhưng sau đó dòng + +126 +00:08:26,200 --> 00:08:31,030 +tiếp theo tôi hỏi người dùng, 'bạn muốn a bằng gì? 'Tôi sẽ làm cho nó + +127 +00:08:31,030 --> 00:08:34,419 +bằng 12. Bây giờ tại thời điểm này, + +128 +00:08:34,419 --> 00:08:38,500 +nếu tôi tiếp tục và truy cập biến này a bên trong bảng điều khiển + +129 +00:08:38,530 --> 00:08:42,880 +chỉ bằng cách nhập a và sau đó nhấn enter, bạn có thể thấy nó bằng 12. + +130 +00:08:43,480 --> 00:08:46,630 +Bây giờ, tương tự, tôi có thể thêm một số câu lệnh in ở đây. + +131 +00:08:46,660 --> 00:08:48,370 +Tôi có thể in giá trị của a và sau + +132 +00:08:48,700 --> 00:08:53,350 +đó cũng in giá trị của a sau khi chúng tôi sửa đổi nó. Vì vậy, một lần nữa, bạn có thể + +133 +00:08:53,530 --> 00:08:57,810 +thấy ban đầu nó bằng 3, nhưng sau đó tôi quyết định thay đổi nó thành 12. + +134 +00:08:58,020 --> 00:08:59,460 +Vì vậy, bây giờ nó bằng 12. + +135 +00:09:00,300 --> 00:09:06,300 +Bây giờ điều gì sẽ xảy ra nếu tôi chạy lại mã. A bằng ba aain. + +136 +00:09:06,300 --> 00:09:11,300 +Nó tự đặt lại vì mã đang được chạy lại và trạng thái + +137 +00:09:13,680 --> 00:09:18,450 +trước đó không được ghi nhớ. Trong trường hợp của chúng tôi, chúng tôi + +138 +00:09:18,840 --> 00:09:21,570 +có biến điểm cao này ban đầu bắt đầu bằng 0. + +139 +00:09:22,170 --> 00:09:26,580 +Và tại một số thời điểm trong quá trình trò chơi diễn ra, chúng + +140 +00:09:26,820 --> 00:09:31,820 +tôi sửa đổi biến số điểm cao này để bằng một giá trị mới, giả sử + +141 +00:09:31,920 --> 00:09:32,850 +là ba. + +142 +00:09:33,480 --> 00:09:37,140 +Vì vậy, bây giờ nếu tôi tiếp tục và in điểm cao của tôi, + +143 +00:09:37,620 --> 00:09:39,720 +bạn có thể thấy rằng nó bằng 3. + +144 +00:09:40,290 --> 00:09:44,130 +Nhưng ngay sau khi tôi chạy lại mã và quá trình này diễn ra, thì + +145 +00:09:44,430 --> 00:09:46,980 +tất cả tiến trình đó sẽ được đặt lại. + +146 +00:09:47,280 --> 00:09:51,900 +Và bây giờ nếu tôi in giá trị của điểm cao, bạn có thể thấy + +147 +00:09:51,990 --> 00:09:56,340 +nó một lần nữa, bằng không. Vì vậy, đây là những gì đang xảy ra trong chương trình của chúng tôi. + +148 +00:09:57,180 --> 00:10:02,180 +Vì vậy, làm thế nào bạn có thể theo dõi điểm số nếu bạn không sử dụng Python? + +149 +00:10:03,150 --> 00:10:03,450 +Chà, + +150 +00:10:03,450 --> 00:10:08,400 +bạn có thể mở một tài liệu word và sau đó ghi điểm cao của bạn vào tài liệu + +151 +00:10:08,400 --> 00:10:11,970 +đó, đóng nó lại, rồi lần sau khi bạn chơi trò chơi, hãy + +152 +00:10:12,330 --> 00:10:16,170 +mở lại tệp đó và xem điểm cao trước đó của bạn là bao nhiêu. + +153 +00:10:16,710 --> 00:10:18,570 +Chúng tôi sẽ thử và làm + +154 +00:10:18,870 --> 00:10:23,870 +điều tương tự, nhưng sử dụng Python để đọc và ghi vào một tệp để chúng tôi có thể lưu + +155 +00:10:25,800 --> 00:10:29,280 +tiến trình của mình và có thể lấy lại điểm cao trước đó của + +156 +00:10:29,370 --> 00:10:34,370 +chúng tôi mỗi khi chúng tôi chơi trò chơi rắn. Để tìm hiểu cách thực hiện và giải quyết vấn + +157 +00:10:35,100 --> 00:10:37,470 +đề này, hãy chuyển sang bài học tiếp theo + +158 +00:10:37,800 --> 00:10:42,270 +và chúng ta sẽ nói về cách sử dụng Python để mở, đọc, ghi và đóng các + +159 +00:10:42,360 --> 00:10:44,250 +tệp trên hệ thống của bạn. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Snake-Project-Code-from-Day-21.zip b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Snake-Project-Code-from-Day-21.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1f9eb5b683a587e467b2b0dd09e1a981519d9ee --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/002 Snake-Project-Code-from-Day-21.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88f89253c2e1e3a0d00a1cc3c9fd6932679737b502e00e62f269619d29530ade +size 1931 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 How to Open, Read, and Write to Files using the with Keyword.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 How to Open, Read, and Write to Files using the with Keyword.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f25f1cb5a267d178e4c937e0ecd409ae2cec8818 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 How to Open, Read, and Write to Files using the with Keyword.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e6f89f817916f35ac3f2d58c4559918924042d091d68bf4326e2369142f9465 +size 50747650 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 How to Open, Read, and Write to Files using the with Keyword_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 How to Open, Read, and Write to Files using the with Keyword_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e5177cb1137b49de06fc9aeef93609d3990ff65 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 How to Open, Read, and Write to Files using the with Keyword_vi.srt @@ -0,0 +1,552 @@ +1 +00:00:00,270 --> 00:00:01,110 +Trong bài + +2 +00:00:01,140 --> 00:00:06,140 +học này, tôi muốn nói về hệ thống tệp và cách bạn có thể sử dụng + +3 +00:00:06,750 --> 00:00:11,730 +Python để mở tệp, đọc tệp, ghi vào tệp và cũng có thể đóng chúng + +4 +00:00:12,150 --> 00:00:14,370 +lại mà không cần chạm vào chuột. + +5 +00:00:14,580 --> 00:00:18,870 +Vì vậy, theo cách đó, chúng ta có thể bắt đầu lưu điểm số cao của mình vào một tệp và truy xuất nó + +6 +00:00:18,870 --> 00:00:20,880 +vào lần sau khi chúng ta mở chương trình của mình. + +7 +00:00:21,630 --> 00:00:26,070 +Hãy bắt đầu bằng cách cố gắng làm một số việc đơn giản nhất với tệp, + +8 +00:00:26,100 --> 00:00:26,933 +đọc và ghi. + +9 +00:00:28,050 --> 00:00:32,490 +Bây giờ tôi đã tạo một dự án mới bằng cách sử dụng PyCharm có tên là day-24 và + +10 +00:00:33,000 --> 00:00:36,450 +tôi đã tạo chính của mình. py nơi chúng ta sẽ viết mã Python của mình. + +11 +00:00:36,990 --> 00:00:40,890 +Nhưng ngoài ra, tôi cũng sẽ tạo một tệp + +12 +00:00:41,130 --> 00:00:46,130 +mới có tên là my_file. txt. + +13 +00:00:46,950 --> 00:00:51,090 +Vì vậy, đây sẽ là một tệp văn bản. Bây giờ, bên trong tệp văn bản này, tôi + +14 +00:00:51,090 --> 00:00:56,040 +sẽ viết một số văn bản. Xin chào, tôi tên là Angela. Và nếu bạn muốn, bạn thực + +15 +00:00:56,070 --> 00:01:01,070 +sự có thể tìm thấy tệp văn bản này bên trong thư mục dự án của mình và bạn + +16 +00:01:02,280 --> 00:01:06,540 +thực sự có thể mở nó bằng phần mềm chỉnh sửa văn bản gốc của mình. + +17 +00:01:06,540 --> 00:01:10,140 +Vì vậy, TextEdit trên Mac hoặc Notepad trên Windows. + +18 +00:01:10,560 --> 00:01:14,970 +Và bạn có thể thấy nó chỉ là một mớ văn bản. Không có gì thực sự đặc biệt ở đây. + +19 +00:01:16,200 --> 00:01:20,940 +Nhưng những gì chúng ta có thể làm khi sử dụng Python là chúng ta có thể thực sự mở tệp đó. + +20 +00:01:21,510 --> 00:01:26,010 +Vì vậy, hãy chú ý cách phương thức này, mở, là một phương thức có sẵn. + +21 +00:01:26,010 --> 00:01:29,340 +Vì vậy, bạn không phải nhập bất cứ điều gì, bạn có thể sử dụng trực tiếp. + +22 +00:01:29,970 --> 00:01:31,830 +Và nó cần một số đầu + +23 +00:01:31,980 --> 00:01:36,120 +vào; tệp mà bạn muốn mở, chế độ bạn muốn mở tệp đó và một loạt những + +24 +00:01:36,360 --> 00:01:41,360 +thứ tùy chọn khác mà bạn có thể chỉ định. Trong trường hợp của chúng ta, tôi + +25 +00:01:41,520 --> 00:01:44,850 +sẽ chỉ định tên tệp của mình dưới dạng + +26 +00:01:45,150 --> 00:01:48,480 +chuỗi, vì vậy my_file. txt. + +27 +00:01:48,900 --> 00:01:50,550 +Vì vậy, hãy nhớ phần mở rộng đó. + +28 +00:01:51,120 --> 00:01:56,040 +Và sau đó tôi sẽ mở tệp này và tôi sẽ lưu nó bên trong + +29 +00:01:56,040 --> 00:02:00,600 +một biến có tên là tệp. Vì vậy, khi chúng tôi nhấn run ngay bây giờ, sẽ không có gì thực sự xảy ra. + +30 +00:02:00,750 --> 00:02:04,020 +Bạn sẽ không thấy bất cứ điều gì xảy ra, nhưng đằng sau hậu + +31 +00:02:04,290 --> 00:02:08,789 +trường, Python đã mở tệp này và nó sẵn sàng cho hoạt động tiếp theo mà bạn có + +32 +00:02:08,789 --> 00:02:10,770 +thể muốn thực hiện trên tệp đó. + +33 +00:02:11,340 --> 00:02:16,340 +Vì vậy, điều tiếp theo tôi muốn làm là tôi muốn đọc tệp và phương thức đọc + +34 +00:02:16,710 --> 00:02:20,400 +này trả về nội dung của tệp đó dưới dạng một chuỗi. + +35 +00:02:20,790 --> 00:02:25,050 +Vì vậy, bây giờ chúng ta có thể lưu nó bên trong một biến có tên là nội dung + +36 +00:02:25,500 --> 00:02:28,470 +và tôi có thể tiếp tục và in ra nội dung này. + +37 +00:02:28,950 --> 00:02:32,280 +Vì vậy, khi tôi nhấn run ngay bây giờ, bạn có thể thấy những gì được in + +38 +00:02:32,580 --> 00:02:35,490 +ra là nội dung từ my_file. txt. + +39 +00:02:36,870 --> 00:02:41,870 +Và nếu tôi tiếp tục và sửa đổi tệp của mình để thêm một số dòng nữa và tôi nhấn + +40 +00:02:42,180 --> 00:02:45,360 +chạy lại, bạn có thể thấy rằng tất cả các dòng đang được + +41 +00:02:45,480 --> 00:02:49,080 +in sau khi chúng tôi mở tệp, chúng tôi đã đọc tệp và chúng + +42 +00:02:49,440 --> 00:02:54,440 +tôi in nội dung mà chúng tôi đã đọc. Vào cuối tất cả công việc của chúng tôi, những gì + +43 +00:02:56,130 --> 00:03:00,130 +chúng tôi phải làm sau khi chúng tôi hoàn thành với tệp mà chúng tôi đã mở, + +44 +00:03:00,310 --> 00:03:03,760 +chúng tôi cũng phải đóng nó. Nếu có một mở, + +45 +00:03:03,760 --> 00:03:07,900 +có thể sẽ có một đóng. Bây giờ, tại sao chúng ta cần đóng tệp? + +46 +00:03:08,110 --> 00:03:10,930 +Chà, một khi Python mở tệp đó, về cơ + +47 +00:03:11,410 --> 00:03:15,010 +bản, nó sẽ chiếm một số tài nguyên của máy tính của bạn. + +48 +00:03:15,640 --> 00:03:16,990 +Và tại một số thời điểm + +49 +00:03:16,990 --> 00:03:20,860 +sau đó, nó có thể quyết định đóng nó và giải phóng những tài nguyên đó, nhưng chúng tôi không + +50 +00:03:21,070 --> 00:03:24,160 +biết khi nào điều đó xảy ra và liệu nó có xảy ra hay không. + +51 +00:03:24,580 --> 00:03:29,170 +Vì vậy, thay vào đó, chúng tôi sẽ yêu cầu nó đóng tệp theo cách thủ công bằng + +52 +00:03:29,170 --> 00:03:30,003 +dòng mã này. + +53 +00:03:30,880 --> 00:03:35,710 +Đó là một khái niệm tương tự như việc mở rất nhiều tab trong trình duyệt của bạn. + +54 +00:03:36,130 --> 00:03:39,460 +Mặc dù việc mở tất cả các tab này rất tiện + +55 +00:03:40,030 --> 00:03:43,510 +lợi, nhưng nếu bạn thực sự muốn máy tính của mình hoạt + +56 +00:03:43,810 --> 00:03:47,800 +động tốt nhất, bạn thực sự muốn chỉ sử dụng bao nhiêu tab tùy ý. + +57 +00:03:48,400 --> 00:03:52,750 +Mỗi tab bổ sung sẽ tạo thêm một chút gánh nặng cho máy tính của bạn và + +58 +00:03:53,170 --> 00:03:57,280 +đặc biệt nếu bạn đang sử dụng một ứng dụng rất nặng như Chrome, ứng + +59 +00:03:57,520 --> 00:04:01,540 +dụng này muốn chiếm nhiều tài nguyên của CPU và máy tính của bạn. + +60 +00:04:01,930 --> 00:04:04,210 +Nếu bạn có nhiều hơn 20 hoặc + +61 +00:04:04,450 --> 00:04:09,220 +30 tab, bạn sẽ nhận thấy tốc độ máy tính của mình giảm đáng kể. + +62 +00:04:09,730 --> 00:04:12,490 +Vì vậy, đây là mẹo máy tính + +63 +00:04:12,850 --> 00:04:17,850 +cũng như mẹo Lập trình, luôn đóng các tab bạn đã mở và luôn + +64 +00:04:18,399 --> 00:04:23,400 +đóng các tệp bạn đã mở. Bây giờ vì thật khó nhớ để đóng một tệp + +65 +00:04:24,220 --> 00:04:28,060 +vì chúng ta có thể đang làm nhiều việc khác giữa lúc mở và đóng, phải không? + +66 +00:04:28,060 --> 00:04:29,890 +Chúng tôi có thể đang ghi + +67 +00:04:29,890 --> 00:04:34,890 +vào tệp, chúng tôi có thể đang sửa đổi hoặc đọc từng dòng một hoặc làm nhiều + +68 +00:04:35,380 --> 00:04:37,210 +việc khác nhau. Vì vậy, thay + +69 +00:04:37,480 --> 00:04:42,480 +vào đó, điều mà nhiều nhà phát triển Python lựa chọn là một cách khác để mở tệp. + +70 +00:04:43,390 --> 00:04:48,390 +Chúng ta có thể sử dụng từ khóa 'với'. Và 'with' chúng tôi có thể mở tệp này và sau đó chúng tôi có + +71 +00:04:50,620 --> 00:04:55,330 +thể mở nó như bất cứ điều gì chúng tôi quyết định đặt tên. Vì vậy, bạn có thể đặt tên cho bất cứ thứ gì. + +72 +00:04:55,330 --> 00:04:57,820 +Bạn có thể đặt tên là f, bạn có thể đặt tên là tệp. + +73 +00:04:58,030 --> 00:05:02,170 +Về cơ bản, nó tương đương với biến mà chúng ta đã tạo trước + +74 +00:05:02,170 --> 00:05:04,300 +đó để lưu trữ tệp đã mở. + +75 +00:05:04,990 --> 00:05:09,990 +Bây giờ chúng ta có thể thụt lề phần còn lại và tôi có thể xóa tệp này. gần. + +76 +00:05:11,170 --> 00:05:14,080 +Và bạn có thể thấy rằng nó hoạt động giống hệt như + +77 +00:05:14,440 --> 00:05:19,440 +trước đây, nhưng bây giờ chúng ta không còn phải nhớ đóng tệp của mình chỉ bằng cách thêm một số từ + +78 +00:05:20,170 --> 00:05:21,040 +khóa ở đây. + +79 +00:05:21,760 --> 00:05:25,810 +Từ khóa 'with' này sẽ quản lý trực tiếp tệp đó. + +80 +00:05:26,050 --> 00:05:30,520 +Vì vậy, ngay sau khi nó thông báo rằng chúng tôi đã hoàn tất, nó sẽ đóng tệp. + +81 +00:05:31,120 --> 00:05:34,870 +Nó khiến tôi ước rằng có một cái gì đó tương tự cho các tab tồn tại, nhưng + +82 +00:05:35,230 --> 00:05:37,540 +chúng ta hãy quay lại mã Python của chúng ta. + +83 +00:05:38,110 --> 00:05:41,350 +Vì vậy, bây giờ chúng tôi đã mở my_file. txt, chúng tôi đã lưu + +84 +00:05:41,530 --> 00:05:43,780 +vào một biến có tên là tệp, chúng tôi + +85 +00:05:44,080 --> 00:05:49,080 +đã đọc tệp đó và lưu nội dung mà chúng tôi đọc vào một biến được gọi là nội + +86 +00:05:49,330 --> 00:05:54,190 +dung, và sau đó chúng tôi đã in nó. Bây giờ, điều gì sẽ xảy ra nếu thay vì đọc + +87 +00:05:54,220 --> 00:05:57,160 +tệp, tôi muốn ghi vào nó? Vâng, nó + +88 +00:05:57,200 --> 00:06:02,200 +chỉ đơn giản như vậy. Vì vậy, chúng tôi có thể nắm giữ tệp của mình và sau + +89 +00:06:02,900 --> 00:06:03,733 +đó gọi ghi. + +90 +00:06:04,160 --> 00:06:09,160 +Và chúng ta có thể đặt bất kỳ loại chuỗi nào bên trong phương thức ghi này để đưa vào tệp của mình. + +91 +00:06:11,810 --> 00:06:14,840 +Vì vậy, chúng ta hãy đặt một số văn bản, hãy gọi nó là văn bản mới. + +92 +00:06:15,290 --> 00:06:19,640 +Và tôi muốn văn bản mới này được viết vào my_file. txt. + +93 +00:06:20,420 --> 00:06:24,320 +Và nếu chúng tôi chạy mã như vậy, bạn sẽ nhận thấy rằng nó + +94 +00:06:24,650 --> 00:06:27,860 +không hoạt động vì nó nói rằng hoạt động không được hỗ + +95 +00:06:28,100 --> 00:06:30,410 +trợ, tệp này không thể ghi được. + +96 +00:06:30,830 --> 00:06:34,760 +Và điều này là do chúng tôi đã mở tệp ở chế độ chỉ đọc. + +97 +00:06:35,210 --> 00:06:39,590 +Vì vậy, hãy nhớ khi chúng ta xem xét một số tham số cho phương + +98 +00:06:39,980 --> 00:06:44,980 +thức này đang mở, một trong số chúng được gọi là mode và theo mặc định, nó + +99 +00:06:45,230 --> 00:06:50,030 +được đặt thành chỉ đọc, vì vậy 'r. 'Bây giờ nếu chúng tôi muốn ghi vào nó, vì vậy hãy làm cho + +100 +00:06:50,060 --> 00:06:53,030 +nó có thể chỉnh sửa được, chúng tôi có sự thay đổi, chế độ thành' w 'để viết. + +101 +00:06:53,540 --> 00:06:55,640 +Vì vậy, bây giờ nếu tôi chạy lại mã, bạn + +102 +00:06:55,850 --> 00:06:58,460 +có thể thấy quá trình đó đã kết thúc với mã thoát số + +103 +00:06:58,460 --> 00:07:01,040 +0 mà chúng tôi biết có nghĩa là mọi thứ đã thành công. + +104 +00:07:01,430 --> 00:07:05,330 +Và nếu tôi xem xét bên trong my_file. txt, tất cả văn bản trước đó + +105 +00:07:05,330 --> 00:07:10,330 +đã bị xóa một cách kỳ diệu và được thay thế bằng văn bản mới mà tôi muốn viết. + +106 +00:07:11,240 --> 00:07:14,690 +Bây giờ, nếu bạn không muốn xóa mọi thứ có trong tệp + +107 +00:07:14,930 --> 00:07:17,060 +mà chỉ muốn thêm vào, thì bạn + +108 +00:07:17,390 --> 00:07:22,390 +có thể thay đổi chế độ này từ 'w' thành 'a' và 'a' là viết tắt của append. + +109 +00:07:22,910 --> 00:07:26,390 +Vì vậy, cũng như chúng ta muốn sử dụng danh sách. chắp thêm và sau đó chúng + +110 +00:07:26,420 --> 00:07:29,870 +ta có thể thêm một cái gì đó vào cuối danh sách, điều + +111 +00:07:29,870 --> 00:07:34,870 +tương tự cũng xảy ra với thêm và viết. Vì vậy, tôi có thể viết văn bản mới của + +112 +00:07:36,380 --> 00:07:41,360 +mình và tôi có thể thêm một dòng mới, hãy nhớ rằng chúng ta có thể sử dụng \ n + +113 +00:07:41,360 --> 00:07:44,090 +để thêm một dòng mới, sau đó thêm văn bản mới. + +114 +00:07:44,660 --> 00:07:49,660 +Và bây giờ hãy xem phiên bản sau khi tôi nhấn run và chúng tôi viết dòng mới + +115 +00:07:50,090 --> 00:07:54,050 +này và văn bản mới bằng cách thêm nó vào tệp của tôi. + +116 +00:07:54,350 --> 00:07:58,910 +Nó đã biến mất ở cuối tệp ở đây. Bây giờ, một trong những điều + +117 +00:07:58,910 --> 00:08:03,200 +quan trọng bạn cần biết khi viết tệp là khi bạn cố + +118 +00:08:03,200 --> 00:08:08,200 +gắng mở tệp ở chế độ ghi và tệp đó không tồn tại, thì + +119 +00:08:08,750 --> 00:08:12,260 +nó sẽ thực sự tạo nó cho bạn từ đầu. + +120 +00:08:12,620 --> 00:08:14,990 +Vì vậy, hãy tiếp tục và tạo một tệp + +121 +00:08:15,080 --> 00:08:19,160 +mà tôi sẽ gọi là new_file. txt, hãy đảm bảo rằng bạn có tiện + +122 +00:08:19,520 --> 00:08:21,260 +ích mở rộng trong đó. + +123 +00:08:21,620 --> 00:08:26,620 +Và chúng tôi có chế độ là bộ ghi. Vì new_file này. txt không tồn tại trong + +124 +00:08:27,680 --> 00:08:31,640 +thư mục này, sau đó nó thực sự sẽ tạo nó cho chúng ta. + +125 +00:08:32,030 --> 00:08:36,590 +Vì vậy, bây giờ khi tôi nhấn run, bạn có thể thấy rằng khi điều + +126 +00:08:36,830 --> 00:08:41,690 +này diễn ra, tệp mới đó sẽ được tạo và văn bản mới đã được viết bên trong. + +127 +00:08:42,020 --> 00:08:46,550 +Bây giờ, hãy nhớ điều này chỉ hoạt động khi bạn đang ở chế độ ghi và khi tệp + +128 +00:08:46,580 --> 00:08:47,930 +đó hiện không tồn tại. + +129 +00:08:48,580 --> 00:08:50,380 +Vì vậy, đó là một số + +130 +00:08:50,380 --> 00:08:55,380 +cách cơ bản để làm việc với hệ thống tệp. Chúng ta có thể mở và đọc, chúng + +131 +00:08:56,640 --> 00:09:00,990 +ta có thể mở và viết. Và bằng cách sử dụng các chế độ khác nhau này, + +132 +00:09:01,110 --> 00:09:01,943 +thêm, đọc hoặc + +133 +00:09:02,130 --> 00:09:06,150 +ghi, chúng ta có thể xác định những gì chúng ta muốn thực hiện với tệp mà chúng ta đã mở. + +134 +00:09:07,110 --> 00:09:11,430 +Bây giờ chúng ta đã học cách làm việc với hệ thống tệp, trong bài học tiếp + +135 +00:09:11,490 --> 00:09:16,490 +theo, tôi muốn chỉ cho bạn cách chúng ta có thể sửa trò chơi rắn để chúng ta có thể + +136 +00:09:16,650 --> 00:09:21,600 +ghi vào tệp văn bản với điểm số cao. Và mỗi khi chúng tôi mở và chạy trò chơi + +137 +00:09:21,870 --> 00:09:26,850 +của mình, chúng tôi tìm nạp tệp đó và xem điểm cao trước đó là bao nhiêu để chúng tôi + +138 +00:09:26,850 --> 00:09:31,470 +có thể tải nó vào trò chơi của mình. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 The-open-method.url b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 The-open-method.url new file mode 100644 index 0000000000000000000000000000000000000000..2563f585604dccf4eb2007adfc91fa1b713af4ed --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/003 The-open-method.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files \ No newline at end of file diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Challenge Read and Write the High Score to a File in Snake.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Challenge Read and Write the High Score to a File in Snake.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..82fb779c2e7af46469aee3debd56d10324eed989 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Challenge Read and Write the High Score to a File in Snake.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e7c9aa6091f2ef6b9effe0bd1e632a2b1829ddc4c783f7e6e212be89c2f6bde +size 35000932 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Challenge Read and Write the High Score to a File in Snake_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Challenge Read and Write the High Score to a File in Snake_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d1fe4bd494709d9959dd14ad32ab19fd87282d16 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Challenge Read and Write the High Score to a File in Snake_vi.srt @@ -0,0 +1,364 @@ +1 +00:00:00,300 --> 00:00:02,520 +Đã đến lúc cho thử thách của bạn. + +2 +00:00:02,969 --> 00:00:05,760 +Bạn đã thấy cách chúng tôi quản lý trò + +3 +00:00:05,939 --> 00:00:08,160 +chơi rắn để theo dõi điểm cao. + +4 +00:00:08,760 --> 00:00:13,320 +Và khi người dùng đạt điểm số lớn hơn điểm số cao, thì chúng tôi sẽ thay thế + +5 +00:00:13,620 --> 00:00:18,090 +điểm số cao đó bằng giá trị mới. Nhưng thật không may như bạn đã + +6 +00:00:18,180 --> 00:00:23,180 +thấy trước đây, tại thời điểm chúng tôi chạy trò chơi này và chúng tôi đạt được + +7 +00:00:23,580 --> 00:00:27,780 +điểm số cao mới, lần tiếp theo chúng tôi chạy lại trò chơi đó + +8 +00:00:27,840 --> 00:00:29,490 +là hoàn toàn bị mất. + +9 +00:00:30,090 --> 00:00:34,290 +Vì vậy, điều đầu tiên tôi muốn bạn làm là nhấp chuột phải vào dự án của bạn, tạo một + +10 +00:00:34,380 --> 00:00:38,280 +tệp mới và gọi nó là dữ liệu. txt. + +11 +00:00:38,340 --> 00:00:41,280 +Vì vậy, chúng ta sẽ tạo một tệp văn bản dữ liệu. + +12 +00:00:41,880 --> 00:00:46,680 +Bây giờ tệp văn bản dữ liệu này sẽ chỉ chứa một số duy nhất, + +13 +00:00:47,100 --> 00:00:47,933 +số không. + +14 +00:00:48,240 --> 00:00:53,240 +Và chúng tôi sẽ sử dụng dữ liệu có trong dữ liệu này. tệp txt để theo dõi điểm + +15 +00:00:54,030 --> 00:00:54,863 +cao. + +16 +00:00:55,440 --> 00:01:00,240 +Và công việc của bạn là tìm ra cách bạn có thể chuyển đổi thuộc tính đơn giản này ở + +17 +00:01:00,240 --> 00:01:05,239 +đây, điểm cao, thành thay vì sử dụng một số mà chúng tôi vừa tạo trong mã, tôi muốn bạn + +18 +00:01:06,630 --> 00:01:10,530 +sử dụng số bên trong dữ liệu. txt. + +19 +00:01:10,770 --> 00:01:14,040 +Vì vậy, bạn sẽ cần phải đọc nó ở đây và sau + +20 +00:01:14,070 --> 00:01:18,450 +đó, bạn sẽ cần phải viết nó khi chúng tôi đặt lại trò chơi và kiểm tra + +21 +00:01:18,480 --> 00:01:22,800 +xem có điểm cao mới hay không. Mọi thứ diễn ra tốt đẹp, bạn + +22 +00:01:22,800 --> 00:01:24,330 +sẽ có thể chạy + +23 +00:01:24,360 --> 00:01:29,360 +trò chơi, đạt được điểm cao mới và sau đó dừng lại và chạy lại trò chơi + +24 +00:01:29,520 --> 00:01:33,870 +và vẫn thấy điểm cao đó hiển thị. Hãy nghĩ về những gì bạn đã học được trong + +25 +00:01:34,110 --> 00:01:39,110 +bài học trước, suy nghĩ về cách bạn có thể chuyển đổi văn bản ở đây thành một số bằng cách sử dụng + +26 +00:01:40,080 --> 00:01:43,890 +những gì bạn đã học trong các bài học trước và tạm dừng video và thực hiện + +27 +00:01:43,890 --> 00:01:44,723 +thử thách này. + +28 +00:01:48,680 --> 00:01:49,100 +Được rồi. + +29 +00:01:49,100 --> 00:01:53,990 +Vì vậy, chúng tôi biết rằng chúng tôi đã có tệp dữ liệu này. txt, và nó đã + +30 +00:01:53,990 --> 00:01:58,850 +chứa số 0. Vì vậy, thay vì sử dụng dòng mã này, + +31 +00:01:59,180 --> 00:02:02,600 +chúng tôi sẽ đọc từ tệp đó để nhận được số 0 đó. + +32 +00:02:03,110 --> 00:02:06,050 +Hãy xóa dòng mã này. Và thay vào + +33 +00:02:06,380 --> 00:02:09,889 +đó, tôi sẽ mở tệp của mình với tên + +34 +00:02:09,889 --> 00:02:14,600 +tệp là dữ liệu. txt. Và tên tệp, tất nhiên, là một + +35 +00:02:14,630 --> 00:02:17,510 +chuỗi như bạn thấy ở đây được bao bọc trong dấu ngoặc kép, + +36 +00:02:18,080 --> 00:02:21,650 +và chúng tôi sẽ sử dụng với từ khóa để chúng tôi không phải bận tâm + +37 +00:02:21,860 --> 00:02:23,240 +về việc đóng tệp lại. + +38 +00:02:23,450 --> 00:02:28,040 +Chúng tôi có thể nhờ Python để quản lý nó cho chúng tôi. bằng cách mở tệp này và tôi + +39 +00:02:28,100 --> 00:02:32,000 +sẽ lưu tệp đó vào một biến được gọi là dữ liệu. + +40 +00:02:32,750 --> 00:02:37,700 +Bây giờ tôi sẽ sử dụng dữ liệu đó và đọc từ nó. Bây giờ, khi tôi đã đọc từ + +41 +00:02:37,730 --> 00:02:39,110 +nó, tôi sẽ + +42 +00:02:39,200 --> 00:02:44,200 +kết thúc với một số loại chuỗi sẽ đại diện cho nội dung của + +43 +00:02:44,810 --> 00:02:45,740 +tệp này. + +44 +00:02:46,370 --> 00:02:50,270 +Vì vậy, chuỗi đó sẽ cần được chuyển đổi thành một số nguyên nếu chúng ta + +45 +00:02:50,360 --> 00:02:52,460 +muốn sử dụng nó như một số mà + +46 +00:02:52,730 --> 00:02:55,850 +chúng ta có thể tăng và thay đổi trong trò chơi của mình. + +47 +00:02:56,240 --> 00:03:01,060 +Vì vậy, tôi sẽ nhập chuyển đổi nó thành một số nguyên. Và cuối cùng, tôi sẽ lưu + +48 +00:03:01,090 --> 00:03:05,320 +điều đó làm giá trị cho thuộc tính mới của chúng + +49 +00:03:05,380 --> 00:03:09,940 +tôi, bản thân. điểm cao. Đó là phần đọc + +50 +00:03:10,000 --> 00:03:12,190 +xong và nếu chúng tôi chạy mã + +51 +00:03:12,250 --> 00:03:15,130 +của mình như cũ, nó sẽ hoạt động như + +52 +00:03:15,460 --> 00:03:17,560 +trước đây, nhưng nó sẽ không có + +53 +00:03:17,560 --> 00:03:21,340 +tính năng mà chúng tôi muốn, đó là có thể thoát khỏi trò + +54 +00:03:21,700 --> 00:03:23,620 +chơi, dừng và chạy lại . + +55 +00:03:23,920 --> 00:03:28,780 +Vì vậy, nó vẫn không lưu điểm cao mới nhất vào dữ liệu đó. txt. + +56 +00:03:28,780 --> 00:03:33,220 +Bạn có thể thấy nó vẫn là con số không. Vậy chúng ta muốn lưu nó vào đâu? Chà, điều đó phải + +57 +00:03:33,220 --> 00:03:36,610 +xảy ra mỗi khi chúng tôi điều chỉnh điểm số cao. + +58 +00:03:37,060 --> 00:03:40,450 +Khi điểm lớn hơn điểm cao hiện tại, chúng tôi + +59 +00:03:40,690 --> 00:03:44,950 +đặt điểm cao thành điểm mới. Nhưng ngoài ra, chúng ta sẽ đọc từ + +60 +00:03:44,980 --> 00:03:47,830 +một dữ liệu tệp. txt. + +61 +00:03:48,130 --> 00:03:50,020 +Vì vậy, chúng ta hãy sử dụng cú pháp của chúng ta + +62 +00:03:50,260 --> 00:03:55,260 +với, sau đó mở lại, và chuyển vào tên của tệp, dữ liệu của chúng ta. txt. + +63 +00:03:56,320 --> 00:04:01,000 +Và hãy nhớ rằng chúng ta cũng cần thay đổi chế độ thành 'w' để ghi vì nếu không, nó + +64 +00:04:01,000 --> 00:04:05,830 +sẽ không cho phép chúng ta ghi vào tệp đó. Bây giờ, khi chúng tôi đã mở nó và chúng + +65 +00:04:05,860 --> 00:04:10,390 +tôi đã lưu nó dưới dạng một biến được gọi là dữ liệu, thì chúng tôi có thể ghi vào + +66 +00:04:10,720 --> 00:04:15,340 +dữ liệu đó bằng cách sử dụng dữ liệu. viết. + +67 +00:04:15,850 --> 00:04:19,600 +Và chúng ta sẽ viết gì cho nó? Chà, chúng ta phải viết một chuỗi. + +68 +00:04:19,630 --> 00:04:24,630 +Vì vậy, hãy sử dụng một chuỗi f để chuyển đổi bản thân hiện tại của chúng ta. high_score thành một chuỗi, và sau đó ghi nó + +69 +00:04:26,260 --> 00:04:31,240 +vào tệp, dữ liệu của chúng tôi. txt. + +70 +00:04:32,770 --> 00:04:36,490 +Bây giờ hãy chú ý những gì sẽ xảy ra khi tôi chạy mã của mình. + +71 +00:04:36,490 --> 00:04:41,350 +Vì vậy, tôi sẽ đạt được điểm số cao mới, ừm, 2, điều + +72 +00:04:41,560 --> 00:04:45,670 +mà tôi rất tự hào. Và bây giờ nếu tôi nhấn dừng, hãy + +73 +00:04:45,700 --> 00:04:48,490 +xem dữ liệu. txt. Nó đã được + +74 +00:04:48,490 --> 00:04:51,880 +cập nhật, nó được viết lại bằng hai dòng mã này. + +75 +00:04:52,240 --> 00:04:54,760 +Vì vậy, bây giờ nếu tôi chạy lại chương + +76 +00:04:55,000 --> 00:05:00,000 +trình của mình, bạn có thể thấy nó đã hiển thị điểm cao trước đó của tôi là 2 và + +77 +00:05:00,460 --> 00:05:03,880 +tôi có thể tiếp tục chơi trò chơi này và tích lũy điểm + +78 +00:05:04,150 --> 00:05:07,570 +cao của mình và tất cả dữ liệu đó sẽ được lưu vào + +79 +00:05:07,630 --> 00:05:10,450 +dữ liệu tệp của tôi. txt, như vậy. + +80 +00:05:11,230 --> 00:05:14,080 +Vì vậy, bạn đã quản lý để làm cho điều này đúng? Và nhân tiện, nếu bạn + +81 +00:05:14,080 --> 00:05:16,420 +thấy bàn phím này bị gián đoạn, đừng lo lắng. + +82 +00:05:16,420 --> 00:05:21,070 +Đó chỉ là vì chúng tôi đã nhấp vào nút dừng để dừng chương trình của mình + +83 +00:05:21,070 --> 00:05:25,330 +vì nó muốn tiếp tục diễn ra mãi mãi cho đến khi chúng tôi đạt + +84 +00:05:25,330 --> 00:05:30,330 +được số điểm cao nhất trong số đó. Mục đích của bài tập này là giúp + +85 +00:05:30,790 --> 00:05:34,810 +bạn xem lại những gì chúng ta đã học trong bài trước, đó là mở + +86 +00:05:35,020 --> 00:05:39,760 +một tệp, đọc tệp, ghi vào tệp và ghi nhớ chế độ mà chúng ta phải thay đổi. + +87 +00:05:40,360 --> 00:05:45,360 +Và hy vọng, bạn sẽ bắt đầu thấy điều này có thể thực sự hữu ích như thế nào + +88 +00:05:45,700 --> 00:05:50,650 +trong việc cải thiện khả năng sử dụng của các chương trình trong trò chơi của chúng tôi. + +89 +00:05:51,850 --> 00:05:55,330 +Bây giờ trong bài học tiếp theo, chúng ta sẽ nói nhiều hơn không chỉ về tệp. + +90 +00:05:55,360 --> 00:05:58,810 +Chúng ta sẽ nói về đường dẫn tệp và thư mục. + +91 +00:05:59,260 --> 00:06:01,810 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Solution-snake-game-high-score-final.zip b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Solution-snake-game-high-score-final.zip new file mode 100644 index 0000000000000000000000000000000000000000..7ac6a7da493c4d2a0b89322f5a8ad53aa728b1ce --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/004 Solution-snake-game-high-score-final.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6d06d4817049f23acefc6ac8cb0e434acb863a8c5c47aca70c5c568ca7b7800 +size 2123 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Day-24-Ending-Code.url b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Day-24-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..73e9f5fbe5d2211406e221eea9df930dc5d34ad7 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Day-24-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-24-end \ No newline at end of file diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Understand Relative and Absolute File Paths.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Understand Relative and Absolute File Paths.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f5ef446262a1fc06ab6a44c783c8f7e5195539c0 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Understand Relative and Absolute File Paths.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab5643876a1693f84611823727c26719f4cecaa97d1fbaabeb4d8008b67f8ec9 +size 108975290 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Understand Relative and Absolute File Paths_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Understand Relative and Absolute File Paths_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5db390d89872f5bd7c26b84a4eab9fe33e01df9e --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/005 Understand Relative and Absolute File Paths_vi.srt @@ -0,0 +1,876 @@ +1 +00:00:00,690 --> 00:00:01,020 +Được rồi. + +2 +00:00:01,020 --> 00:00:06,020 +Vì vậy, chúng tôi đã thấy cách chúng tôi có thể mở và đóng các tệp cũng như + +3 +00:00:07,680 --> 00:00:11,670 +đọc và ghi chúng vào chúng. Nhưng các tệp không chỉ có một cái tên. + +4 +00:00:11,700 --> 00:00:16,140 +Họ cũng có một con đường hoặc một cách để đến với họ. + +5 +00:00:16,680 --> 00:00:18,870 +Ví dụ, trong bản đồ này, nếu chúng + +6 +00:00:19,110 --> 00:00:21,990 +ta muốn con khủng long này đến được quả trứng vàng, + +7 +00:00:22,320 --> 00:00:24,690 +có nhiều con đường mà nó có thể đi. + +8 +00:00:24,900 --> 00:00:29,900 +Nhưng nếu chúng tôi muốn cung cấp cho nó một số hướng dẫn về cách nó có thể đến trên con đường này, thì + +9 +00:00:30,180 --> 00:00:35,100 +chúng tôi có thể nói, bạn biết đấy, hãy tiếp tục đi về phía trước ở khúc quanh núi lửa, phải không. + +10 +00:00:35,490 --> 00:00:38,340 +Và sau đó khi bạn nhìn thấy một con rắn, hãy + +11 +00:00:38,700 --> 00:00:42,900 +rẽ phải một lần nữa, và khi bạn nhìn thấy cây dừa, hãy rẽ trái và + +12 +00:00:42,900 --> 00:00:47,100 +bạn sẽ đến hang với quả trứng. Bây giờ trên máy tính, nó hoạt động + +13 +00:00:47,400 --> 00:00:52,380 +khá giống nhau, nhưng chúng ta phải nhớ rằng trên máy tính có các tệp và có các thư mục. + +14 +00:00:52,890 --> 00:00:57,890 +Vì vậy, các tệp có thể nằm trong các thư mục và bạn có thể điều hướng qua một số + +15 +00:00:58,050 --> 00:01:00,420 +thư mục sâu để đến một tệp cụ thể. + +16 +00:01:01,260 --> 00:01:06,260 +Vì vậy, chúng ta hãy nghĩ về những gì các đường dẫn tệp có thể dành cho một máy tính có cấu + +17 +00:01:08,160 --> 00:01:09,570 +trúc giống như thế này. + +18 +00:01:10,020 --> 00:01:15,020 +Vì vậy, điều đầu tiên cần lưu ý là ở gốc của tất cả các tệp và các thư + +19 +00:01:16,170 --> 00:01:20,940 +mục về cơ bản là nguồn gốc, phải không? Đây là thư mục gốc. + +20 +00:01:21,420 --> 00:01:22,800 +Và trên máy Mac, bạn + +21 +00:01:22,830 --> 00:01:27,830 +có thể thấy rằng các dự án PyCharm của chúng tôi nằm trong thư mục người dùng của tôi, bên trong + +22 +00:01:30,120 --> 00:01:33,990 +một thư mục được gọi là người dùng bên trong một thư mục có tên Macintosh HD. + +23 +00:01:34,410 --> 00:01:38,250 +Vì vậy, nếu tôi đã chọn thư mục này ngay tại đây, tôi có thể + +24 +00:01:38,280 --> 00:01:41,880 +nói rằng hãy chuyển đến thư mục bao gồm, chính là thư mục này. + +25 +00:01:42,270 --> 00:01:43,860 +Và sau đó nếu tôi tiếp tục + +26 +00:01:43,860 --> 00:01:48,270 +làm điều này, bạn có thể thấy nó tiếp tục nhảy lên cho đến khi nó không thể đi xa hơn. + +27 +00:01:48,810 --> 00:01:53,790 +Vì vậy, gốc trên máy Mac là Macintosh HD, ổ cứng. + +28 +00:01:54,330 --> 00:01:59,330 +Và điều đó về đường dẫn được thể hiện bằng một dấu gạch chéo về phía trước. + +29 +00:02:01,500 --> 00:02:04,260 +Tuy nhiên, bây giờ khi bạn đang sử + +30 +00:02:04,860 --> 00:02:08,759 +dụng máy tính Windows, thư mục gốc thường là ổ C của bạn. + +31 +00:02:09,449 --> 00:02:14,160 +Vì vậy, đó sẽ trở thành thư mục gốc của bạn. Bên trong thư mục gốc của chúng tôi, Macintosh + +32 +00:02:14,440 --> 00:02:16,950 +HD hoặc ổ C, chúng tôi có một thư mục + +33 +00:02:17,190 --> 00:02:20,670 +được gọi là công việc. Bên trong thư mục đó, + +34 +00:02:20,790 --> 00:02:25,650 +tôi có một tài liệu Word báo cáo cũng như một thư mục dự án. + +35 +00:02:25,710 --> 00:02:30,120 +Và bên trong thư mục dự án đó, có một PowerPoint có tên là talk. + +36 +00:02:30,660 --> 00:02:34,380 +Bây giờ, nếu chúng ta nghĩ về các đường dẫn tệp cho từng thứ này, đây là những + +37 +00:02:34,650 --> 00:02:36,450 +gì chúng có thể trông như thế nào. + +38 +00:02:36,510 --> 00:02:41,510 +Lộ trình rõ ràng chỉ là một /, thư mục công việc sẽ là / làm việc, báo + +39 +00:02:41,700 --> 00:02:46,700 +cáo sẽ là / làm việc / báo cáo. doc, project sẽ là + +40 +00:02:48,240 --> 00:02:51,840 +/ work / project, và cuối + +41 +00:02:51,840 --> 00:02:56,840 +cùng, talk sẽ là / work / project / talk. + +42 +00:02:57,000 --> 00:02:57,833 +ppt. + +43 +00:02:58,140 --> 00:03:02,230 +Vì vậy, con đường này giống như hướng mà chúng ta đã nói + +44 +00:03:02,230 --> 00:03:03,063 +trước đây. + +45 +00:03:03,370 --> 00:03:07,690 +Đó là một cách để máy tính điều hướng đến tệp quan tâm mà trong trường hợp này + +46 +00:03:07,990 --> 00:03:10,930 +có thể là cuộc thảo luận. ppt. + +47 +00:03:11,590 --> 00:03:15,790 +Và chúng tôi phải cung cấp cho nó hướng dẫn đi vào thư mục nào và sau đó là thư mục + +48 +00:03:15,790 --> 00:03:20,440 +nào, sau đó bạn sẽ tìm thấy tệp có tên này. Bây giờ, đây được + +49 +00:03:20,470 --> 00:03:23,740 +gọi là đường dẫn tệp tuyệt đối. + +50 +00:03:23,830 --> 00:03:28,830 +Đường dẫn tệp tuyệt đối luôn bắt đầu từ gốc. + +51 +00:03:29,290 --> 00:03:32,590 +Vì vậy, bạn luôn thấy một dấu gạch chéo để bắt đầu và + +52 +00:03:32,590 --> 00:03:34,720 +đôi khi bạn sẽ thấy C: hoặc trên + +53 +00:03:34,720 --> 00:03:38,680 +máy Mac, bạn sẽ chỉ thấy /. Đường dẫn tệp tuyệt đối này + +54 +00:03:38,680 --> 00:03:42,010 +về cơ bản là một đường dẫn bắt đầu từ điểm gốc, + +55 +00:03:42,040 --> 00:03:44,680 +tuyến đường của hệ thống lưu trữ máy tính. + +56 +00:03:45,370 --> 00:03:49,630 +Bây giờ cũng có một cái gì đó được gọi là đường dẫn tệp tương đối. + +57 +00:03:49,960 --> 00:03:52,180 +Đang nói chuyện này. ppt, chúng tôi + +58 +00:03:52,270 --> 00:03:57,270 +biết rằng đường dẫn tệp tuyệt đối là / work / project / + +59 +00:03:57,640 --> 00:03:59,860 +talk. ppt. Nhưng điều + +60 +00:04:00,000 --> 00:04:04,980 +gì sẽ xảy ra nếu chúng ta thực sự ở bên trong thư mục dự án này? + +61 +00:04:05,460 --> 00:04:10,140 +Vì vậy, hãy nói điều đó vào thời điểm chúng tôi đang cố gắng tiến tới buổi nói chuyện này. ppt chúng tôi thực sự + +62 +00:04:10,440 --> 00:04:12,450 +đang ở đây. + +63 +00:04:13,350 --> 00:04:18,089 +Bây giờ, điều này, trong máy tính nói, được gọi là thư mục làm việc. + +64 +00:04:18,450 --> 00:04:23,100 +Về cơ bản nó là thư mục hoặc thư mục mà chúng tôi hiện đang làm việc. + +65 +00:04:23,700 --> 00:04:27,210 +Và khi chúng tôi đã thiết lập một thư mục làm việc, hãy nói + +66 +00:04:27,390 --> 00:04:29,310 +rằng chúng tôi đang ở ngay + +67 +00:04:29,670 --> 00:04:34,380 +đây, sau đó chúng tôi có thể sử dụng cái được gọi là đường dẫn tệp tương đối để + +68 +00:04:34,380 --> 00:04:38,430 +truy cập tệp mà chúng tôi quan tâm. Vì vậy, cho rằng chúng tôi đang ở đây và chúng tôi đang cố gắng + +69 +00:04:38,790 --> 00:04:43,790 +đến được đây, đường dẫn tệp tương đối chỉ đơn giản là. /nói chuyện. ppt. + +70 +00:04:45,780 --> 00:04:47,730 +Các . / biểu + +71 +00:04:47,970 --> 00:04:51,780 +thị tìm kiếm trong thư mục hiện tại cho tệp này. + +72 +00:04:52,350 --> 00:04:57,350 +Nếu chúng ta chuyển đổi thư mục làm việc của mình và giả sử bây giờ chúng ta đang làm việc từ thư mục công việc, thì làm thế nào để + +73 +00:04:58,350 --> 00:05:02,820 +chúng ta đến được cuộc nói chuyện này. ppt? Chà, đường dẫn tệp tuyệt + +74 +00:05:02,850 --> 00:05:05,820 +đối sẽ không thay đổi đối với tệp này, nhưng đường dẫn + +75 +00:05:06,150 --> 00:05:11,150 +tệp tương đối bây giờ sẽ là. / project / talk. ppt. + +76 +00:05:13,530 --> 00:05:17,310 +Vì vậy, chúng tôi đang đi bộ từ đây đến đây đến đây. + +77 +00:05:18,030 --> 00:05:22,260 +Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn đi lên trong cây thư mục? + +78 +00:05:22,620 --> 00:05:26,220 +Giả sử chúng tôi muốn xem báo cáo này. doc, nhưng tất cả + +79 +00:05:26,520 --> 00:05:31,200 +chúng tôi hiện đang làm việc bên trong thư mục dự án này. + +80 +00:05:31,500 --> 00:05:36,360 +Làm thế nào để chúng ta đi lên một bước? Chà, chúng tôi sẽ đúng .. vì vậy hai dấu chấm bây giờ, / báo cáo. doc. + +81 +00:05:36,420 --> 00:05:40,620 +Vì vậy, chúng tôi đang ở bên trong thư mục dự + +82 +00:05:40,860 --> 00:05:45,600 +án này, chúng tôi sẽ thoát ra khỏi nó đến thư mục mẹ là thư mục công việc và sau đó chúng tôi sẽ nắm giữ tệp này. + +83 +00:05:45,600 --> 00:05:49,800 +Vì vậy, hai dấu chấm đó đại diện cho việc đi lên một bước + +84 +00:05:50,130 --> 00:05:55,130 +trong cấu trúc phân cấp đến thư mục mẹ, trong trường hợp này là thư mục công việc. + +85 +00:05:56,160 --> 00:05:58,700 +Bây giờ những gì chúng tôi đang làm là viết mã bên trong chính của chúng tôi. py + +86 +00:05:59,480 --> 00:06:04,480 +Và chính đó. py thường ở bên trong một số loại thư mục dự án. Khi chúng tôi cố gắng nắm giữ một tệp, về cơ bản + +87 +00:06:05,360 --> 00:06:10,250 +đây là nơi chúng tôi đang ở. + +88 +00:06:10,250 --> 00:06:14,780 +Vì vậy, thư mục làm việc của chúng tôi là thư mục công việc. + +89 +00:06:14,810 --> 00:06:18,260 +Vì vậy, điều đó có nghĩa là nếu chúng tôi muốn có quyền truy cập vào báo cáo này. tệp doc từ chính của + +90 +00:06:18,980 --> 00:06:23,980 +chúng tôi. py, tất cả những gì chúng ta cần làm là + +91 +00:06:24,590 --> 00:06:25,580 +viết. /báo cáo. doc bởi vì chúng + +92 +00:06:25,910 --> 00:06:30,910 +tôi đang làm việc trong cùng một thư mục và chúng tôi chỉ nắm giữ tệp này. + +93 +00:06:32,240 --> 00:06:36,230 +Bây giờ, khi bạn đang sử dụng đường dẫn tệp tương đối, bạn có thể sử dụng đường dẫn này. / nhưng bạn cũng có thể rút ngắn nó + +94 +00:06:36,860 --> 00:06:41,510 +và loại bỏ nó. + +95 +00:06:41,750 --> 00:06:44,870 +Đây là lý do tại sao chúng tôi có thể mở my_file này. txt nằm trong cùng thư mục với + +96 +00:06:45,560 --> 00:06:50,560 +tệp chính của tôi. py và để ý xem hai tệp này + +97 +00:06:50,930 --> 00:06:55,930 +ở cùng cấp phân cấp như thế nào. Vì vậy, chúng ta hãy thực hiện một thử thách nhanh chóng. + +98 +00:06:57,710 --> 00:07:02,060 +Tôi sẽ xóa phần nơi chúng tôi + +99 +00:07:02,090 --> 00:07:06,050 +ghi vào tệp và tôi sẽ thay đổi tệp của mình để nó chỉ + +100 +00:07:06,050 --> 00:07:06,560 +có + +101 +00:07:06,560 --> 00:07:11,560 +một câu và tôi sẽ định vị tệp này bằng cách sử dụng 'Reveal in Finder' và + +102 +00:07:14,120 --> 00:07:17,990 +trên Windows điều đó sẽ nhấp chuột phải và Hiển thị trong Explorer. + +103 +00:07:17,990 --> 00:07:20,390 +Và nó sẽ hiển thị cho bạn vị trí của tệp đó trong hệ thống máy tính của bạn. + +104 +00:07:21,350 --> 00:07:26,350 +Bây giờ, những gì chúng ta sẽ làm là chúng ta sẽ di chuyển tệp này sang màn hình nền. + +105 +00:07:27,740 --> 00:07:32,090 +1: Đúng không? + +106 +00:07:32,380 --> 00:07:33,213 +0: Và điều + +107 +00:07:37,330 --> 00:07:41,320 +tôi muốn bạn làm là tôi muốn bạn truy cập vào màn hình nền, nhấp chuột phải vào tệp đó. Và nếu bạn muốn có máy Mac, tôi muốn bạn nhấp vào để nhận thông tin. + +108 +00:07:41,320 --> 00:07:45,820 +Và nếu bạn đang sử dụng Windows, tôi muốn bạn nhấp chuột + +109 +00:07:46,360 --> 00:07:47,710 +phải và chuyển đến thuộc tính. + +110 +00:07:47,740 --> 00:07:51,400 +Bây giờ những gì bạn đang tìm kiếm là vị trí này ở đây. + +111 +00:07:52,000 --> 00:07:55,510 +Bây giờ bạn có thể thấy rằng + +112 +00:07:56,350 --> 00:07:58,930 +tệp hiện tại này, new_file, + +113 +00:07:58,960 --> 00:08:03,340 +nằm trong thư mục gốc, trong trường hợp này + +114 +00:08:03,370 --> 00:08:08,370 +là C: \ Users \ London AppBrewery \ Desktop \ new_file. txt. Trên máy Mac, bạn có thể thấy nó nằm dưới thư mục gốc, đó là Macintosh + +115 +00:08:09,220 --> 00:08:14,220 +HD chém người dùng + +116 +00:08:15,640 --> 00:08:18,880 +gạch chéo Angela máy tính để bàn gạch chéo my_file. + +117 +00:08:18,910 --> 00:08:23,910 +txt. Đây là thách thức của bạn. + +118 +00:08:26,290 --> 00:08:29,470 +Bây giờ chúng tôi + +119 +00:08:29,590 --> 00:08:33,010 +đã di chuyển tệp khỏi dự án của mình, tôi muốn + +120 +00:08:33,490 --> 00:08:37,120 +bạn sửa mã này để khi bạn chạy nó, nó sẽ không + +121 +00:08:37,299 --> 00:08:42,299 +cung cấp cho bạn lỗi không tìm thấy tệp này vì hiện tại không có tệp my_. txt trong cùng thư mục làm việc với thư mục chính của chúng tôi. py + +122 +00:08:43,419 --> 00:08:48,220 +Nó không tồn tại bên trong thư mục này. + +123 +00:08:48,280 --> 00:08:50,350 +Hãy suy nghĩ về những gì bạn đã học cho + +124 +00:08:51,010 --> 00:08:55,620 +đến nay và xem liệu bạn có thể thay đổi đường dẫn này để mã của chúng ta hoạt động trở lại hay không. + +125 +00:08:55,620 --> 00:08:58,740 +Và trên Windows cũng vậy. + +126 +00:08:59,310 --> 00:09:00,990 +Sử dụng vị trí của tệp + +127 +00:09:01,380 --> 00:09:05,760 +trên máy tính của bạn và sử dụng đường dẫn tuyệt đối trong mã để tệp hoạt động. Tạm dừng video ngay bây giờ. + +128 +00:09:05,760 --> 00:09:08,430 +1: Được rồi 0: + +129 +00:09:08,630 --> 00:09:09,463 +Được rồi. Đây là cách bạn sẽ sử dụng đường dẫn tuyệt đối. Vì vậy, chúng + +130 +00:09:12,020 --> 00:09:16,250 +tôi biết rằng my_file của chúng tôi. txt nằm trong thư mục gốc + +131 +00:09:16,280 --> 00:09:21,280 +và sau đó là người dùng, angela, máy tính để bàn. Vì vậy, hãy tiếp tục và thay đổi chuỗi này. + +132 +00:09:21,470 --> 00:09:25,670 +Hãy bắt đầu từ thư mục + +133 +00:09:25,700 --> 00:09:29,750 +gốc và sau đó thêm thư mục tiếp theo, đó là người dùng. + +134 +00:09:29,780 --> 00:09:31,640 +Và sau đó chúng ta hãy thêm một + +135 +00:09:32,180 --> 00:09:36,200 +dấu gạch chéo nữa và sau đó chúng ta đi đến thư mục tiếp theo, đó là Angela. Tất nhiên, điều này sẽ khác đối với bạn, nhưng + +136 +00:09:36,230 --> 00:09:41,090 +cuối cùng chúng ta vào màn + +137 +00:09:41,630 --> 00:09:46,630 +hình và sau đó chúng ta có thể truy cập my_file của chúng ta. txt. + +138 +00:09:48,320 --> 00:09:49,670 +Vì vậy, đây là đường dẫn đầy đủ để đến tệp này. + +139 +00:09:49,940 --> 00:09:53,420 +Vì vậy, bây giờ nếu tôi chạy lại mã này, bạn có thể + +140 +00:09:53,930 --> 00:09:58,370 +thấy nó có thể đọc tệp, không có lỗi và nó đang nắm giữ nội dung của tệp. + +141 +00:09:58,370 --> 00:10:02,090 +Bây giờ trên Windows, đó là một câu chuyện tương tự. + +142 +00:10:02,810 --> 00:10:05,480 +Vì vậy, chúng tôi biết rằng vị trí của tệp là gốc, + +143 +00:10:05,720 --> 00:10:08,930 +sau đó là người dùng, sau đó đến LondonAppBrewery, sau đó là máy tính để bàn. Một lần nữa, điều này tất nhiên sẽ khác đối với bạn + +144 +00:10:09,320 --> 00:10:12,650 +tùy thuộc vào tên người + +145 +00:10:12,710 --> 00:10:15,980 +dùng của bạn, nhưng bạn sẽ thấy nó ở vị trí của + +146 +00:10:16,280 --> 00:10:18,260 +mình khi bạn xem các thuộc tính tệp. Vì vậy, chúng ta hãy thay đổi điều này. + +147 +00:10:18,290 --> 00:10:22,100 +Hãy bắt đầu từ thư mục + +148 +00:10:22,280 --> 00:10:25,040 +gốc, đó là ổ C, sau đó đến người dùng. + +149 +00:10:25,550 --> 00:10:27,770 +Và sau đó chúng tôi truy cập tên người dùng của chúng + +150 +00:10:30,590 --> 00:10:34,670 +tôi là LondonAppBrewery, sau đó chúng tôi đi đến màn hình của chúng tôi và đó là nơi nó sẽ tìm thấy new_file này. + +151 +00:10:38,690 --> 00:10:43,690 +txt. Vì vậy, bây giờ khi tôi nhấn run, bạn có thể thấy rằng nó + +152 +00:10:45,410 --> 00:10:48,140 +có thể tìm + +153 +00:10:48,200 --> 00:10:53,200 +nạp tệp đó và in nội dung mà không có bất kỳ lỗi nào. Bây giờ, một trong những điểm đặc biệt của đường dẫn tệp trong + +154 +00:10:54,170 --> 00:10:55,760 +Windows + +155 +00:10:55,760 --> 00:11:00,760 +và Mac là trong máy Mac, đường dẫn, mỗi thư mục được phân + +156 +00:11:02,780 --> 00:11:03,740 +tách bằng dấu + +157 +00:11:03,890 --> 00:11:08,390 +/ trong khi trên Windows, chúng được phân tách bằng dấu \. Nhưng như bạn đã nhận thấy, khi chúng tôi viết mã Python, chúng tôi + +158 +00:11:08,420 --> 00:11:12,710 +không quan tâm đến điều đó. + +159 +00:11:12,770 --> 00:11:16,070 +Chúng ta chỉ có thể viết nó là / và + +160 +00:11:16,100 --> 00:11:21,100 +đảm bảo rằng chúng ta có gốc, đại diện cho ổ C, vì vậy toàn bộ phần + +161 +00:11:21,350 --> 00:11:25,010 +này, và sau đó chúng ta có thư mục của chúng ta, + +162 +00:11:25,430 --> 00:11:29,150 +thư mục tiếp theo, thư mục tiếp theo, thư mục tiếp theo, v.v. Vì vậy, bây giờ đến thử thách tiếp theo. + +163 +00:11:29,150 --> 00:11:33,650 +Bạn có thể thấy rằng + +164 +00:11:34,110 --> 00:11:38,570 +đường dẫn này đi từ thư mục gốc, là ổ C + +165 +00:11:38,570 --> 00:11:41,810 +và trên Mac, nó cũng từ Macintosh HD. + +166 +00:11:42,050 --> 00:11:44,420 +Vì vậy, điều gì sẽ xảy ra nếu chúng tôi muốn thay đổi điều này để nó tương đối với chính hiện tại của chúng tôi. py? Chính của chúng tôi. py nếu chúng ta đi tới 'Show + +167 +00:11:44,840 --> 00:11:49,840 +in Explorer', bạn có thể thấy rằng đường dẫn cho tệp này như + +168 +00:11:50,570 --> 00:11:52,790 +sau. + +169 +00:11:53,350 --> 00:11:55,960 +Nó nằm trong + +170 +00:11:56,290 --> 00:12:01,030 +Users / LondonAppBrewery / PyCharmProjects / WindowsDemo. + +171 +00:12:01,120 --> 00:12:01,720 +Vì vậy, đó là tên của dự án của tôi. + +172 +00:12:01,720 --> 00:12:06,720 +Và sau đó, nó là chính của tôi. py Vì vậy, đây là một câu hỏi hơi khó. + +173 +00:12:07,780 --> 00:12:12,280 +Giả sử rằng tệp này nằm bên trong thư mục hiện tại này + +174 +00:12:12,340 --> 00:12:17,050 +hoặc bất cứ thứ gì mà bạn có làm + +175 +00:12:17,470 --> 00:12:22,470 +thư mục chứa tệp này, làm cách nào bạn có thể làm cho nó sử dụng đường dẫn tệp tương đối để nó nhảy trở lại hai thư mục vào + +176 +00:12:23,170 --> 00:12:26,290 +thư mục LondonAppBrewery và sau đó đi đến Máy tính để bàn và sau đó đến tệp mới? + +177 +00:12:26,890 --> 00:12:31,890 +Trên máy Mac của chúng tôi, đó là một câu chuyện tương tự. Vì vậy, chúng tôi đi đến 'Reveal in Finder'. + +178 +00:12:33,790 --> 00:12:38,790 +Chúng ta có thể thấy đây là nơi chúng ta đang ở hiện tại. + +179 +00:12:40,150 --> 00:12:44,590 +Vì vậy, thư mục làm việc hiện tại của chúng tôi là thư mục dự án ngày-24 này. + +180 +00:12:44,620 --> 00:12:47,260 +Vì vậy, nếu chúng ta tăng một cấp + +181 +00:12:47,530 --> 00:12:52,530 +và phím tắt là command + up, chúng ta sẽ chuyển đến thư mục day-24 của chúng ta. Vì vậy, đây là thư mục làm việc của chúng tôi. + +182 +00:12:53,080 --> 00:12:57,040 +Bây giờ, nếu chúng ta muốn tăng một cấp độ, chúng ta có thể đi tới, và sau đó chuyển + +183 +00:12:57,370 --> 00:13:02,260 +đến thư mục bao gồm, vì vậy một cấp độ tăng cấp + +184 +00:13:02,740 --> 00:13:04,810 +độ sẽ đưa chúng ta đến các dự án PyCharm. + +185 +00:13:04,810 --> 00:13:08,620 +Và sau đó nếu chúng ta tăng thêm một cấp nữa, chúng ta sẽ đến thư mục Angela của mình, + +186 +00:13:08,860 --> 00:13:11,800 +tại thời điểm đó, chúng ta có thể điều hướng xuống Desktop / my_file. txt. + +187 +00:13:12,160 --> 00:13:16,690 +Đây là thách thức của bạn. + +188 +00:13:17,080 --> 00:13:21,760 +Tìm ra đường dẫn liên quan đến tệp văn bản trên màn hình của bạn, sau đó + +189 +00:13:22,450 --> 00:13:23,770 +sửa đổi mã và làm cho nó hoạt động. Tạm dừng video ngay bây giờ. + +190 +00:13:23,980 --> 00:13:28,120 +Cách mà chúng tôi sẽ sửa đổi điều này là để đến được thư mục Angela này, + +191 +00:13:28,390 --> 00:13:31,600 +nơi chúng tôi có thể tiếp + +192 +00:13:34,600 --> 00:13:39,460 +tục đến Máy tính để bàn và sau đó đến tệp của tôi, chúng tôi phải đi lên hai cấp. + +193 +00:13:39,460 --> 00:13:42,940 +Vì vậy, điều đó được dịch thành .. / .. / và bây giờ chúng ta đang ở + +194 +00:13:43,240 --> 00:13:45,130 +trong thư mục Angela. + +195 +00:13:45,190 --> 00:13:48,850 +Vì vậy, chúng tôi có thể bắt đầu đi xuống. Và PyCharm đủ thông minh để + +196 +00:13:48,940 --> 00:13:50,770 +biết cấu trúc thư mục của bạn trông như thế nào. + +197 +00:13:50,950 --> 00:13:55,750 +Vì vậy, nó sẽ bắt đầu cung cấp cho bạn các gợi ý về những thư mục + +198 +00:13:55,780 --> 00:13:57,220 +nào có thể truy cập được ở cấp độ này. + +199 +00:13:57,520 --> 00:14:01,960 +Vì vậy, tôi có thể truy cập Desktop và sau đó tôi có thể truy cập my_file. txt. + +200 +00:14:01,960 --> 00:14:02,793 +Và nếu tôi tiếp tục và + +201 +00:14:02,890 --> 00:14:07,420 +chạy mã của mình, bạn có thể thấy nó có thể đọc và in nội dung của tệp đó. + +202 +00:14:07,840 --> 00:14:10,060 +Sự khác biệt chính giữa đường dẫn tệp tuyệt đối + +203 +00:14:10,150 --> 00:14:15,070 +và đường dẫn tệp tương đối là đường dẫn tệp tuyệt đối luôn liên quan đến thư mục gốc của máy tính của bạn. Trên Windows, đó là ổ C, thường + +204 +00:14:15,940 --> 00:14:20,650 +là ổ C trừ khi bạn đã + +205 +00:14:20,650 --> 00:14:25,650 +thay đổi nó. Và trên máy + +206 +00:14:26,710 --> 00:14:29,740 +Mac, đó là Macintosh HD. + +207 +00:14:29,740 --> 00:14:32,290 +Bây giờ đường dẫn tệp tương đối là liên quan đến thư mục làm việc hiện tại của bạn. + +208 +00:14:32,380 --> 00:14:34,780 +Vì vậy, nó phụ thuộc vào vị trí của bạn và nơi bạn đang cố gắng đến. Bây giờ, tùy thuộc vào tình huống và vị + +209 +00:14:35,620 --> 00:14:40,210 +trí đặt tệp mà bạn quan tâm, bạn có thể quyết định sử dụng đường dẫn tệp tuyệt + +210 +00:14:40,210 --> 00:14:44,380 +đối hoặc đường dẫn tệp tương đối. + +211 +00:14:44,410 --> 00:14:49,360 +Và bạn có thể thấy rằng trong trường hợp này, nó không + +212 +00:14:49,630 --> 00:14:53,870 +nhất thiết phải ngắn hơn hoặc dễ hiểu hơn nhiều. + +213 +00:14:54,550 --> 00:14:56,200 +Vì vậy, nếu bạn + +214 +00:14:56,200 --> 00:15:01,200 +biết cách làm cả hai, thì bạn có thể thích ứng với tình huống và tìm + +215 +00:15:01,840 --> 00:15:04,090 +ra cách nào là thích hợp nhất. Bây giờ tôi biết rằng các con đường có thể khó hiểu. + +216 +00:15:04,480 --> 00:15:08,050 +Vì vậy, đó là lý do tại sao tôi sẽ đưa ra một loạt các bài tập đố + +217 +00:15:08,050 --> 00:15:12,130 +vui cho bạn trong bài học tiếp theo để + +218 +00:15:12,430 --> 00:15:16,330 +bạn có thêm thực hành với đường dẫn tệp để bạn có thể tự tin rời khỏi bài học này. + +219 +00:15:16,330 --> 00:15:20,530 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/006 File Paths Quiz.html b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/006 File Paths Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..ac0847bf339f478387b2ff81b48d125414197d64 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/006 File Paths Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-1.url b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-1.url new file mode 100644 index 0000000000000000000000000000000000000000..87aa06aa3c6095900739bc4fa1d006f7776ebcce --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-1.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/ref_file_readlines.asp \ No newline at end of file diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-2.url b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-2.url new file mode 100644 index 0000000000000000000000000000000000000000..63bba8176cb3476c21efe76c716cbd65be96cf8b --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-2.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/ref_string_replace.asp \ No newline at end of file diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-3.url b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-3.url new file mode 100644 index 0000000000000000000000000000000000000000..b6de9ada64a0027f7d5cdd2e71304c44c94f2e59 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Hint-3.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/ref_string_strip.asp \ No newline at end of file diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Introducing the Mail Merge Challenge.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Introducing the Mail Merge Challenge.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..736da7b67e2a781441032a7e9ae54cbaba3b2d11 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Introducing the Mail Merge Challenge.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e1858d3ea1ae38f64370983e739e151d434f7cb1715a6c2f0683cae4a9f1320 +size 27589324 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Introducing the Mail Merge Challenge_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Introducing the Mail Merge Challenge_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..06958357368b9aa467f91b9a9d5a773ebfc06a38 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Introducing the Mail Merge Challenge_vi.srt @@ -0,0 +1,228 @@ +1 +00:00:00,180 --> 00:00:05,550 +Được rồi, các bạn, đã đến lúc đưa những gì bạn đã học được vào bài kiểm tra. Bây giờ trong dự án này, chúng ta sẽ + +2 +00:00:05,550 --> 00:00:08,220 +thực hiện một chút kết hợp thư. + +3 +00:00:08,550 --> 00:00:12,630 +Vì vậy, kết hợp thư là nơi bạn lấy một cái gì + +4 +00:00:12,630 --> 00:00:20,210 +đó giống như những gì chúng tôi có một danh sách tên, và chúng tôi muốn chèn từng tên này vào một chữ cái. + +5 +00:00:20,490 --> 00:00:26,040 +Vì vậy, thay vì nói [tên] thân mến, bạn được mời đến dự sinh nhật của tôi vào thứ Bảy, nó nên nói thân yêu và sau + +6 +00:00:26,040 --> 00:00:29,240 +đó nó sẽ thay thế điều đó bằng bất cứ điều gì ở đây. + +7 +00:00:29,580 --> 00:00:31,710 +Hãy xem tệp ví dụ này. + +8 +00:00:32,040 --> 00:00:38,550 +Bạn có thể thấy rằng nó đã thay thế trình giữ chỗ tên bằng tên đầu tiên trong tên_được mời. tệp txt. + +9 +00:00:39,060 --> 00:00:42,930 +Mục tiêu của bạn là viết một số mã python để tự động hóa quá trình. + +10 +00:00:43,950 --> 00:00:50,940 +Vì vậy, những gì bạn sẽ nhận được là một loạt các chữ cái, mỗi chữ cái + +11 +00:00:50,940 --> 00:00:58,590 +cho mỗi tên bên trong tên_ được mời. txt và các chữ cái sẽ được đặt tên như sau: letter_for_ và sau + +12 +00:00:58,590 --> 00:01:00,120 +đó là tên của người. + +13 +00:01:00,360 --> 00:01:07,770 +Và chúng sẽ được lưu ở định dạng txt, bạn có thể mở trong Google Documents hoặc Microsoft + +14 +00:01:07,770 --> 00:01:08,190 +Word. + +15 +00:01:08,670 --> 00:01:10,950 +Và về cơ bản nó đã sẵn sàng để in. + +16 +00:01:11,530 --> 00:01:16,770 +Vì vậy, tôi đã làm cho nó khó hơn một chút cho bạn bằng cách thêm vào một loạt các thư mục. + +17 +00:01:16,980 --> 00:01:21,330 +Và mỗi tệp này được lồng vào bên trong một loạt các thư mục. + +18 +00:01:21,330 --> 00:01:25,230 +Vì vậy, ví dụ, ký tự bắt đầu là các ký tự bên trong, là đầu vào bên trong. + +19 +00:01:25,770 --> 00:01:31,500 +Và sau đó các ký tự mà bạn sắp tạo sẽ cần phải đi vào thư mục này có tên là + +20 +00:01:31,500 --> 00:01:35,430 +Ready ToSend, nằm bên trong đầu ra. Và không gian lận. + +21 +00:01:35,430 --> 00:01:38,010 +Tôi không muốn bạn di chuyển xung quanh bất kỳ tệp nào trong số này. + +22 +00:01:38,160 --> 00:01:44,730 +Bạn sẽ sử dụng những gì bạn đã học về thư mục và đường dẫn tệp để thực hiện mọi thứ mà không cần kéo và + +23 +00:01:44,730 --> 00:01:47,850 +thả hoặc di chuyển bất cứ thứ gì theo cách thủ công. + +24 +00:01:48,750 --> 00:01:50,340 +Tôi có một số tệp bắt đầu cho bạn. + +25 +00:01:50,430 --> 00:01:56,520 +Vì vậy, điều đầu tiên tôi muốn bạn làm là truy cập tài nguyên của khóa học và tải xuống tệp zip, đó sẽ là mã + +26 +00:01:56,520 --> 00:01:58,140 +dự án bắt đầu của bạn. + +27 +00:01:58,740 --> 00:02:05,130 +Khi bạn mở nó trong PyCharm, nó sẽ yêu cầu bạn định cấu hình trình thông dịch. Vì vậy, bạn có thể tiếp tục và nhấp vào cửa sổ + +28 +00:02:05,130 --> 00:02:10,229 +bật lên đó hoặc nếu nó biến mất, thì chỉ cần nhấp vào nhật ký sự kiện, sau đó nhấp vào + +29 +00:02:10,229 --> 00:02:15,330 +Định cấu hình Trình thông dịch Python và sau đó chọn trình thông dịch mới nhất mà bạn đã cài đặt. + +30 +00:02:15,660 --> 00:02:19,200 +Vì vậy, trong trường hợp của tôi, đó là 3. 8, nhưng vào thời điểm bạn đang xem, có lẽ + +31 +00:02:19,200 --> 00:02:21,120 +nó sẽ là 3. 9 hoặc thậm chí muộn hơn. + +32 +00:02:21,660 --> 00:02:27,290 +Và khi đã hoàn tất, bạn có thể tiếp tục và xem bên trong main. py + +33 +00:02:27,840 --> 00:02:30,030 +Vì vậy, ở đây tôi có một số hướng dẫn cho bạn. + +34 +00:02:30,540 --> 00:02:36,750 +Đầu tiên, bạn sẽ tạo một bức thư bằng cách sử dụng started_letter. txt, ở ngay đây lồng hai thư + +35 +00:02:36,750 --> 00:02:43,130 +mục vào sâu, và sau đó bạn sẽ sử dụng từng tên bên trong tên_được mời. + +36 +00:02:43,140 --> 00:02:52,320 +txt để thay thế phần có tên bằng tên thực mà bạn thấy trong tên_được mời. txt. + +37 +00:02:53,190 --> 00:02:58,200 +Và sau đó bạn sẽ lưu từng chữ cái mà bạn đã tạo bên trong thư mục ReadyTo + +38 +00:02:58,200 --> 00:02:58,620 +Send. + +39 +00:02:59,310 --> 00:03:05,250 +Và bạn có thể xem ví dụ này nếu bạn muốn xem kết quả cuối cùng như thế nào. + +40 +00:03:05,260 --> 00:03:10,030 +Vì vậy, nó sẽ là cái tên không có bất kỳ dấu cách nào sau đó, chỉ có một dấu phẩy. + +41 +00:03:10,770 --> 00:03:14,850 +Bây giờ sẽ có một số điều sẽ giúp bạn phát triển trong suốt chặng đường. + +42 +00:03:15,000 --> 00:03:21,240 +Và tôi hy vọng rằng bạn sẽ sử dụng kiến thức của mình về cách nhận trợ giúp từ Google và Stack tràn, cũng như một + +43 +00:03:21,600 --> 00:03:24,690 +số gợi ý mà tôi đã để lại ở đây cho bạn. + +44 +00:03:25,260 --> 00:03:32,520 +Vì vậy, các gợi ý sẽ đưa bạn đến ba trang tài liệu Python và chúng được chọn bởi vì các phương pháp có trong + +45 +00:03:32,550 --> 00:03:36,200 +chúng chắc chắn sẽ giúp ích cho bạn trong dự án này. + +46 +00:03:36,450 --> 00:03:41,670 +Trên thực tế, một số điều bạn định làm sẽ không thể thực hiện được trừ khi bạn + +47 +00:03:41,670 --> 00:03:46,920 +xem qua từng trang tài liệu này, đọc qua nó và hiểu những gì các phương pháp thực hiện. + +48 +00:03:47,520 --> 00:03:53,490 +Bây giờ, như mọi khi, với rất nhiều hướng dẫn, không thể dạy bạn từng phương pháp. + +49 +00:03:53,490 --> 00:03:58,800 +Và sẽ thực sự rất, thực sự tẻ nhạt nếu tôi chỉ xem qua tất cả các phương pháp có sẵn trong + +50 +00:03:59,070 --> 00:04:01,050 +Python và hiển thị chúng cho từng bạn. + +51 +00:04:01,530 --> 00:04:08,190 +Vì vậy, thay vào đó, bạn phải làm việc giống như một nhà phát triển chuyên nghiệp, đó là tìm hiểu thông tin khi + +52 +00:04:08,190 --> 00:04:14,940 +bạn cần và nhanh chóng hiểu điều gì đang xảy ra cũng như cách sử dụng thông tin bạn tìm thấy một cách nhanh chóng. + +53 +00:04:15,480 --> 00:04:21,750 +Đừng lo lắng nếu bạn chưa thấy tôi sử dụng những phương pháp này trước đây. Bạn sẽ được thực hành nhiều hơn bằng cách sử + +54 +00:04:21,750 --> 00:04:27,200 +dụng tài liệu, tự tìm hiểu mọi thứ và thực hiện những điều mà bạn chưa từng thấy trước đây. + +55 +00:04:28,080 --> 00:04:35,490 +Khi bạn đã sẵn sàng, hãy tiếp tục và xem từng liên kết này, xem từng phương pháp mà tôi đã liên kết + +56 +00:04:35,490 --> 00:04:40,830 +có tác dụng gì, sau đó tiếp tục và cố gắng giải quyết thử thách này. + +57 +00:04:41,250 --> 00:04:44,100 +Vì vậy, hãy tạm dừng video và tôi sẽ gặp lại bạn ở phía bên kia. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Mail-Merge-Project-Start.zip b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Mail-Merge-Project-Start.zip new file mode 100644 index 0000000000000000000000000000000000000000..17c39331b2db23c0987777c46099457c8f816446 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/007 Mail-Merge-Project-Start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:476cbc813baab7b82a1485a63c2dae50fc581c9754c57a31027d4bd6109eadea +size 9055 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Course-Fixes-Report-an-Issue.url b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Mail-Merge-Project-Completed.zip b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Mail-Merge-Project-Completed.zip new file mode 100644 index 0000000000000000000000000000000000000000..7a83600b6b0254a3ea5722d10ad89ba777ce37ab --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Mail-Merge-Project-Completed.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:703fa969590350237562395e3f1943853aa5a21491b3cbb4b64dec630f1ff89d +size 15099 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Solution & Walkthrough for the Mail Merge Project.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Solution & Walkthrough for the Mail Merge Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..55f25e4a04c779dc9bc6c3e1d721333669f647ce --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Solution & Walkthrough for the Mail Merge Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e576ff90d74dcd9e97247c0da01127c49689dc54db6d0981b1a0d7de7b3f1c64 +size 93745684 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Solution & Walkthrough for the Mail Merge Project_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Solution & Walkthrough for the Mail Merge Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7467d8b2faafe9e1f02fa12ba12060cc895a7e16 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/008 Solution & Walkthrough for the Mail Merge Project_vi.srt @@ -0,0 +1,532 @@ +1 +00:00:00,210 --> 00:00:05,890 +Tôi hy vọng bạn đã làm tốt điều đó và bây giờ tôi sẽ cùng bạn tìm hiểu giải pháp. Ở đây, tôi đã mở ba liên kết + +2 +00:00:05,910 --> 00:00:12,660 +đó và tất cả chúng đều là tài liệu trên W3schools cho các phương pháp khác nhau bằng + +3 +00:00:12,660 --> 00:00:13,470 +Python. + +4 +00:00:13,980 --> 00:00:17,010 +Phương thức đầu tiên là một phương thức được gọi là đường đọc. + +5 +00:00:17,340 --> 00:00:19,050 +Điều thực sự quan trọng là bạn + +6 +00:00:19,050 --> 00:00:23,250 +phải có 's' đó vì còn có một phương pháp khác được gọi là readline, dạng số ít. + +7 +00:00:23,760 --> 00:00:31,770 +Những gì các dòng đọc thực hiện là nó trả về tất cả các dòng trong tệp dưới dạng danh sách trong đó mỗi dòng là một mục trong đối + +8 +00:00:31,770 --> 00:00:32,700 +tượng danh sách. + +9 +00:00:33,150 --> 00:00:40,680 +Ví dụ: chúng ta có thể chạy ví dụ này và bạn có thể thấy rằng bên trong tệp demo này, các dòng đọc, + +10 +00:00:40,680 --> 00:00:49,800 +có một số dòng trong tệp đó và mỗi dòng sau khi chạy phương pháp này, sẽ được thêm vào dưới dạng một mục bên trong một danh sách + +11 +00:00:50,190 --> 00:00:51,210 +như thế này. + +12 +00:00:52,170 --> 00:00:57,450 +Bây giờ, phương pháp tiếp theo mà tôi đã chỉ cho bạn là phương pháp thay thế chuỗi python. + +13 +00:00:58,050 --> 00:01:04,080 +Và những gì phương pháp này làm là nó sẽ thay thế một cụm từ được chỉ định bằng một cụm từ được chỉ định khác. + +14 +00:01:04,500 --> 00:01:10,410 +Nếu văn bản bắt đầu là 'Tôi thích chuối' và bạn làm txt. thay thế, bạn có thể thay thế phần mà + +15 +00:01:10,410 --> 00:01:12,180 +nó nói chuối bằng táo. + +16 +00:01:12,480 --> 00:01:18,150 +Và khi bạn in, bạn có thể thấy kết quả cuối cùng thay đổi văn bản đó thành Tôi thích táo. + +17 +00:01:18,930 --> 00:01:23,430 +Bây giờ, phương pháp cuối cùng mà tôi đã chỉ cho bạn là phương pháp dải chuỗi. + +18 +00:01:23,760 --> 00:01:29,720 +Và điều này làm là nó sẽ loại bỏ các khoảng trắng ở đầu và cuối chuỗi. + +19 +00:01:30,030 --> 00:01:35,340 +Vì vậy, nếu văn bản bắt đầu của chúng ta có nhiều khoảng trắng ở đầu và cuối, thì chúng ta làm txt. + +20 +00:01:35,490 --> 00:01:41,440 +dải, nó sẽ loại bỏ tất cả không gian thừa đó và nó kết thúc với chỉ từ. + +21 +00:01:41,940 --> 00:01:45,360 +Bây giờ, nếu bạn có một khoảng trắng ở giữa, một từ + +22 +00:01:47,850 --> 00:01:54,420 +khác như thế này, nếu chúng ta nhấn run, thì bạn có thể thấy rằng nó giữ khoảng cách giữa các từ, nhưng nó + +23 +00:01:54,420 --> 00:01:59,280 +sẽ loại bỏ bất kỳ khoảng trắng nào ở hai bên, điều này thực sự rất tiện dụng. + +24 +00:01:59,730 --> 00:02:03,370 +Và bạn sẽ thấy hy vọng tại sao nó thực sự, thực sự hữu ích. + +25 +00:02:03,960 --> 00:02:10,710 +Vì vậy, bây giờ chúng tôi đã xem xét ba phương pháp này mà chúng tôi chưa từng thấy trước đây và thông thường bạn có thể sẽ tìm thấy những + +26 +00:02:10,710 --> 00:02:14,670 +phương pháp này khi bạn thực sự gặp khó khăn và khi bạn đang tìm kiếm Stack Overflow. + +27 +00:02:15,480 --> 00:02:22,150 +Nhưng bây giờ bạn đã biết về những phương pháp đó, hãy tiếp tục và tạo một bức thư bằng cách sử dụng ký tự bắt đầu của chúng tôi. + +28 +00:02:22,440 --> 00:02:25,170 +Vì vậy, tôi sẽ tiếp tục và xóa mọi thứ ở đây. + +29 +00:02:25,560 --> 00:02:28,880 +Và bây giờ chúng ta hãy tiếp tục và giải quyết thử thách này. + +30 +00:02:29,220 --> 00:02:33,720 +Vì vậy, điều đầu tiên tôi muốn làm là nắm được tất cả những cái tên được mời và tôi muốn + +31 +00:02:33,930 --> 00:02:36,780 +chuyển chúng thành một danh sách. Tất nhiên, bây giờ tôi + +32 +00:02:36,780 --> 00:02:43,590 +có thể đi và thêm một số dấu ngoặc vuông, thêm một số dấu ngoặc kép xung quanh nó, và sau đó thêm nó + +33 +00:02:43,590 --> 00:02:46,400 +vào chính của tôi. py + +34 +00:02:46,830 --> 00:02:48,120 +Nhưng tôi không muốn làm điều đó. + +35 +00:02:48,460 --> 00:02:51,320 +Thay vào đó, tôi sẽ lấy Python để đọc tệp. + +36 +00:02:51,690 --> 00:02:57,210 +Vì vậy, sử dụng cú pháp cổ điển của chúng tôi với open, tôi sẽ mở tệp đó. + +37 +00:02:57,690 --> 00:03:03,870 +Nhưng để mở nó ra, tôi cần chỉ định một chuỗi sẽ là đường dẫn + +38 +00:03:04,020 --> 00:03:06,160 +tôi từ đây đến đây. + +39 +00:03:06,660 --> 00:03:08,880 +Vì vậy, chúng ta hãy nghĩ về cách chúng ta có thể đạt được điều đó. + +40 +00:03:09,210 --> 00:03:16,350 +Bây giờ, thư mục đầu ra đầu vào này ở cùng cấp phân cấp với tệp hiện tại của chúng tôi, nơi chúng tôi đang viết mã + +41 +00:03:16,350 --> 00:03:16,980 +của mình. + +42 +00:03:17,550 --> 00:03:24,240 +Nếu chúng ta muốn sử dụng một đường dẫn tệp tương đối, chúng ta có thể nói đơn giản là đi vào thư mục hiện + +43 +00:03:24,240 --> 00:03:28,410 +tại là mail- merge-project-start và sau đó tìm một thư mục có tên là Input. + +44 +00:03:29,730 --> 00:03:31,700 +Bên trong thư mục có tên Input + +45 +00:03:31,740 --> 00:03:35,430 +này, chúng ta sẽ chuyển đến một thư mục khác có tên là Names. + +46 +00:03:36,120 --> 00:03:41,640 +Và sau đó bên trong thư mục tên đó, chúng ta sẽ nhận được một tệp được gọi là tên_được mời. txt. + +47 +00:03:41,640 --> 00:03:42,360 +Và PyCharm siêu thông minh và nó giúp bạn rất nhiều thao tác nhập. + +48 +00:03:42,780 --> 00:03:46,980 +Vì vậy, nó cũng giúp bạn tiết kiệm thời gian. + +49 +00:03:47,250 --> 00:03:48,810 +Và sau đó tôi sẽ lưu nó dưới dạng tên_tệp. + +50 +00:03:49,380 --> 00:03:52,260 +Bây giờ tôi đã mở tệp này, tôi sẽ + +51 +00:03:53,390 --> 00:03:55,350 +tiếp tục và đọc nó. + +52 +00:03:55,350 --> 00:03:57,800 +Vì vậy, tên_tệp. đọc. Và khi tôi đã đọc nó, tôi sẽ lưu nó vào một biến + +53 +00:03:57,810 --> 00:04:05,520 +có tên là tên và sau đó tôi sẽ in ra tên của mình. + +54 +00:04:05,520 --> 00:04:07,410 +Vì vậy, bây giờ nếu tôi tiếp tục và nhấn chạy chính của tôi. py, bạn có thể thấy rằng nó in ra tất + +55 +00:04:08,010 --> 00:04:15,960 +cả những cái tên này riêng lẻ bởi vì nó đang nắm giữ mọi thứ ở đây và chỉ cần in nó ra. + +56 +00:04:16,200 --> 00:04:19,690 +Bây giờ, tại thời điểm này, tôi thực sự muốn những cái tên này ở định dạng danh sách. + +57 +00:04:20,370 --> 00:04:25,650 +Vì vậy, nếu bạn nhớ, đó là nơi mà phương thức readlines này sẽ thực sự + +58 +00:04:25,980 --> 00:04:32,400 +hữu ích vì nó trả về một danh sách chứa mỗi dòng bên trong tệp dưới dạng một mục danh sách. + +59 +00:04:32,400 --> 00:04:36,290 +Bây giờ, thay vì nói tên_tệp. đọc, hãy thay thế nó bằng các dòng đọc. + +60 +00:04:37,380 --> 00:04:42,330 +Bây giờ, khi tôi nhấn run, bạn có thể thấy nó in ra tên và tên giờ đây được chuyển thành danh sách một cách kỳ diệu. + +61 +00:04:43,080 --> 00:04:50,760 +Vì vậy, bây giờ chúng tôi có danh sách các tên mà chúng tôi đã trích xuất từ tên_được mời của chúng tôi. txt, sau đó chúng ta có thể tiếp tục và tiến hành bước tiếp theo, nơi + +62 +00:04:51,180 --> 00:04:59,340 +chúng ta sẽ thay thế trình giữ chỗ + +63 +00:04:59,340 --> 00:05:06,480 +này trong chữ cái bắt đầu của chúng ta bằng mỗi tên trong số này. + +64 +00:05:06,480 --> 00:05:09,160 +Hãy tiếp tục và tạo một hằng + +65 +00:05:09,690 --> 00:05:15,840 +số ở trên cùng mà tôi sẽ gọi là PLACEHOLDER và tôi sẽ đặt nó làm chuỗi là + +66 +00:05:15,840 --> 00:05:23,790 +dấu ngoặc vuông và sau đó là tên từ vì đây là chuỗi mà chúng tôi muốn thay thế từ chữ cái bắt đầu. + +67 +00:05:23,790 --> 00:05:27,200 +Bước tiếp theo là mở chữ cái bắt đầu của chúng ta. + +68 +00:05:27,900 --> 00:05:31,300 +Vì vậy, một lần nữa, tôi sẽ sử dụng open và sau đó tôi sẽ chỉ định đường dẫn. + +69 +00:05:31,320 --> 00:05:35,400 +Vì vậy, từ đây, tôi sẽ đi đến + +70 +00:05:35,680 --> 00:05:40,820 +thư mục ở cùng cấp với tệp này, vì vậy sử dụng. / và sau đó tôi sẽ chuyển sang nhập liệu một lần nữa và sau đó tôi sẽ + +71 +00:05:41,160 --> 00:05:48,510 +đi vào thay vì tên, tôi sẽ chuyển đến các chữ cái. + +72 +00:05:48,510 --> 00:05:50,340 +Và tôi sẽ nắm giữ chữ cái bắt đầu của mình và tôi sẽ mở nó dưới dạng letter_file. Với letter_file, tôi chỉ + +73 +00:05:52,320 --> 00:06:00,210 +đơn giản là sẽ nắm được letter_contents bằng cách nói + +74 +00:06:00,210 --> 00:06:00,970 +letter_file. đọc. + +75 +00:06:00,990 --> 00:06:08,430 +Và đây sẽ là một bài đọc bình thường bởi vì tôi muốn tất + +76 +00:06:08,580 --> 00:06:14,640 +cả nội dung bên trong bức thư đó và bây giờ nó sẽ được lưu dưới dạng một chuỗi bên trong letter_contents của tôi. + +77 +00:06:14,640 --> 00:06:18,390 +Bước tiếp theo là xem qua nội dung thư + +78 +00:06:19,290 --> 00:06:27,120 +và thay thế chỗ dành sẵn đó bằng tên thực mà chúng ta có trong danh sách của mình. + +79 +00:06:27,120 --> 00:06:28,590 +Để làm điều đó, chúng tôi sẽ cần phương pháp thứ hai mà tôi đã chỉ cho bạn, đó là phương pháp thay thế. Vì vậy, chúng + +80 +00:06:29,130 --> 00:06:35,940 +ta có thể nắm giữ cuộc gọi văn bản, + +81 +00:06:35,940 --> 00:06:38,640 +thay thế, và sau đó đầu ra + +82 +00:06:38,880 --> 00:06:44,310 +của phương thức này sẽ là một chuỗi mới đã sửa đổi tex này. Tôi trong trường hợp của chúng tôi, chúng tôi sẽ cần một vòng lặp. Vì vậy, chúng ta có thể nói về tên trong danh sách tên của chúng ta, hãy + +83 +00:06:44,310 --> 00:06:52,620 +xem qua từng tên trong danh sách đó + +84 +00:06:52,620 --> 00:07:00,390 +và sau đó chúng ta hãy lấy letter_contents và thay thế trình giữ chỗ, vì vậy chuỗi cũ, bằng một chuỗi mới sẽ là tên. + +85 +00:07:00,390 --> 00:07:05,400 +Và một khi chúng tôi đã thay thế nó, sau đó chúng tôi sẽ lưu nó vào một new_letter. + +86 +00:07:06,120 --> 00:07:11,130 +Bây giờ chúng ta đã có bức thư mới của mình, hãy tiếp tục và in nó ra và xem nó trông như thế nào. + +87 +00:07:12,610 --> 00:07:18,220 +Vì vậy, bạn có thể thấy tất cả nội dung của mỗi chữ cái được in, nhưng + +88 +00:07:21,520 --> 00:07:27,460 +ngoài chữ cái cuối cùng trông khá bình thường, mọi chữ cái khác đều có một dòng mới sau tên. + +89 +00:07:27,460 --> 00:07:33,550 +Vì vậy, hãy nhớ khi chúng tôi in ra từng tên trong số này, bạn có + +90 +00:07:34,120 --> 00:07:40,630 +thể thấy rằng sau mỗi tên mà họ đã trích xuất từ danh sách các tên được mời này, + +91 +00:07:40,630 --> 00:07:46,930 +có một dòng mới đang được thêm vào và bạn có thể thấy điều đó với \ n. + +92 +00:07:47,140 --> 00:07:49,440 +Cái duy nhất không có dòng mới là dòng cuối cùng. + +93 +00:07:49,450 --> 00:07:53,950 +Những gì chúng ta cần làm là tách dòng mới. Điều đó có nhắc nhở bạn về điều gì đó không? + +94 +00:07:54,670 --> 00:08:00,200 +Chà, chúng tôi có một phương thức mà chúng + +95 +00:08:00,220 --> 00:08:06,550 +tôi đã thấy được gọi là dải có thể lấy đi bất kỳ khoảng trắng nào ở đầu và cuối chuỗi. + +96 +00:08:06,550 --> 00:08:07,870 +Và sau đó chúng + +97 +00:08:08,350 --> 00:08:14,980 +ta có thể kết thúc với một đầu ra là chuỗi mà không có bất kỳ khoảng trống nào ở đầu và cuối đó. + +98 +00:08:14,980 --> 00:08:15,580 +Chúng ta + +99 +00:08:16,300 --> 00:08:21,370 +sẽ lặp lại từng cái tên và sau đó chúng ta sẽ lấy tên và chúng ta sẽ gọi dải trên mỗi cái tên đó. + +100 +00:08:21,370 --> 00:08:23,830 +Và sau đó chúng ta có thể lưu nó vào một biến có tên là stripe_name. + +101 +00:08:24,250 --> 00:08:28,420 +Và bây giờ chúng ta có thể sử dụng stripe_name đó thay cho tên. + +102 +00:08:29,800 --> 00:08:33,580 +Bây giờ nếu tôi tiếp tục và in new_letter của chúng tôi, + +103 +00:08:34,780 --> 00:08:39,370 +bạn có thể thấy rằng mỗi chữ cái trông giống hệt như cách chúng ta muốn. Tất cả những gì chúng ta cần làm bây giờ + +104 +00:08:41,820 --> 00:08:48,390 +là ghi chúng vào một tệp mới. Trong các bài học trước, tôi đã + +105 +00:08:48,420 --> 00:08:53,650 +đề cập rằng khi + +106 +00:08:53,670 --> 00:09:01,290 +bạn mở một tệp không tồn tại, Python sẽ thực sự tạo tệp đó cho bạn. + +107 +00:09:01,290 --> 00:09:01,580 +Một lần nữa, bằng cách sử dụng với open của chúng tôi, tôi sẽ điều hướng đến thư mục ReadyToSend này. + +108 +00:09:02,190 --> 00:09:09,180 +Đi từ nơi chúng tôi đang ở chính. py, chúng ta sẽ đi đến thư mục đầu ra và sau đó chúng ta sẽ chuyển đến + +109 +00:09:09,180 --> 00:09:10,390 +thư mục ReadyToSend. + +110 +00:09:10,440 --> 00:09:15,950 +Và bên trong thư mục ReadyToSend là nơi chúng ta sẽ tạo tệp mới của mình. + +111 +00:09:16,380 --> 00:09:21,430 +Vì vậy, hãy nghĩ xem chúng ta muốn tên tệp của mình trông như thế nào. Trong phần giới thiệu, tôi đã cho bạn thấy đây là định + +112 +00:09:21,960 --> 00:09:27,150 +dạng cho mỗi tệp; letter_for_Aang. txt. + +113 +00:09:27,150 --> 00:09:33,400 +Và sau đó phần này được thay thế bằng từng cái tên. + +114 +00:09:33,540 --> 00:09:36,270 +Vì vậy, chúng ta hãy viết ký tự_cho_ tên và sau đó. txt. + +115 +00:09:36,930 --> 00:09:45,620 +Chúng ta có thể sử dụng một fstring để thay thế phần này bằng stripe_name. + +116 +00:09:45,990 --> 00:09:50,600 +Vì vậy, bây giờ chúng ta nên tạo một chữ cái mới cho mỗi cái tên trong danh sách tên của chúng ta. + +117 +00:09:51,030 --> 00:09:57,240 +Vì vậy, bây giờ chúng ta hãy tham khảo tệp này như là bản tin hoàn thành. + +118 +00:09:57,930 --> 00:10:03,090 +Chúng tôi muốn làm gì với bản tin hoàn + +119 +00:10:05,100 --> 00:10:10,500 +thành này, hiện đang trống, chúng tôi muốn ghi vào nó. + +120 +00:10:10,500 --> 00:10:18,150 +Vì vậy, để làm điều đó, chúng ta phải thay đổi chế độ mở từ mặc định là 'r' để đọc thành 'w' để ghi. + +121 +00:10:18,150 --> 00:10:18,610 +Và điều này sẽ cho phép chúng tôi nhận được bức thư đã hoàn thành của mình và viết vào nó. + +122 +00:10:19,110 --> 00:10:24,150 +Chúng ta muốn viết gì trong đó? + +123 +00:10:24,690 --> 00:10:25,980 +Tất nhiên, chúng tôi muốn viết một bức thư mới mà chúng tôi đã tạo. + +124 +00:10:26,010 --> 00:10:30,120 +Đó là phần cuối của mã của chúng tôi, và tất cả những gì chúng tôi phải làm là tiếp tục và nhấn chạy. Và sau khi tôi nhấn run, bạn có thể thấy có một loạt + +125 +00:10:31,780 --> 00:10:40,300 +các chữ cái đã được tạo ở đây và nếu tôi nhấp vào từng + +126 +00:10:40,300 --> 00:10:45,460 +chữ cái trong số chúng, bạn có thể thấy rằng trình giữ chỗ tên hiện đã được thay + +127 +00:10:45,740 --> 00:10:51,610 +thế và tôi đã sẵn sàng để bắt đầu đến máy in và in tất cả những thứ này ra. + +128 +00:10:51,880 --> 00:10:56,050 +Vậy bạn đã tìm ra cách để hoàn thành dự án này chưa? + +129 +00:10:57,160 --> 00:11:01,570 +Nếu không, hãy nhớ xem lại các phần liên quan của bài học ngày + +130 +00:11:02,080 --> 00:11:08,050 +hôm nay để bạn thực sự tự tin với những gì đang diễn ra và bạn hiểu tất cả mã này. + +131 +00:11:08,050 --> 00:11:11,080 +Nếu bạn muốn xem giải pháp đã hoàn thành, hãy truy cập vào tài + +132 +00:11:11,920 --> 00:11:16,990 +nguyên của khóa học và bạn sẽ tìm thấy một liên kết đến mã dự án cuối cùng thực sự hoạt động ngay cả trong repl. nó. + +133 +00:11:16,990 --> 00:11:22,810 +Vì vậy, bạn có thể xóa tất cả các tệp này và bạn có thể thấy nó tạo chúng từ đầu. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/009 What's the correct solution What's the best answer What's the right way.mp4 b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/009 What's the correct solution What's the best answer What's the right way.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7e14f9834f57ea775cf36c6da5167a3bf1d480ab --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/009 What's the correct solution What's the best answer What's the right way.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42844846e06f4ac9f757ab721e694182f33b766640bffb293690ab232675cbc8 +size 71720206 diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/009 What's the correct solution What's the best answer What's the right way_vi.srt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/009 What's the correct solution What's the best answer What's the right way_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..167b9ce35386751b67ad31b4066ab30aa8d83447 --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/009 What's the correct solution What's the best answer What's the right way_vi.srt @@ -0,0 +1,140 @@ +1 +00:00:01,320 --> 00:00:05,340 +Rất tốt vì đã hoàn thành khóa học và thử thách ngày hôm nay. + +2 +00:00:05,970 --> 00:00:14,430 +Bây giờ, một trong những câu hỏi mà tôi thường thấy sinh viên hỏi trong phần Hỏi & Đáp là, “Được rồi, tôi đã viết đoạn mã này, đây là giải pháp của tôi, + +3 +00:00:14,430 --> 00:00:18,120 +nhưng đâu là giải pháp phù hợp? "Và đây là + +4 +00:00:18,750 --> 00:00:21,750 +điều mà tôi muốn nói hôm nay. + +5 +00:00:22,700 --> 00:00:28,500 +Và điều thực sự quan trọng để bạn hiểu là không có giải pháp đúng. + +6 +00:00:28,850 --> 00:00:30,310 +Nó là giải pháp của bạn. + +7 +00:00:30,320 --> 00:00:34,220 +Đó là về quá trình suy nghĩ của bạn và cách bạn đạt được điều đó. + +8 +00:00:35,180 --> 00:00:41,390 +Và khi bạn đang xem xét giải pháp, khi bạn đang xem mã của mình, điều quan trọng nhất + +9 +00:00:41,390 --> 00:00:46,910 +không phải là nó chạy nhanh như thế nào, hoặc bạn sử dụng mấy dòng mã, mã + +10 +00:00:47,090 --> 00:00:48,530 +hiệu quả ra sao. + +11 +00:00:49,310 --> 00:00:55,940 +Để trích dẫn lời cha đỡ đầu của lập trình máy tính, Donald Knuth, người đã viết Nghệ thuật của Khoa + +12 +00:00:55,940 --> 00:01:04,129 +học Máy tính và nhiều cuốn sách khác có sức ảnh hưởng siêu lớn, siêu khó hiểu, nhưng những gì ông ấy nói là tối + +13 +00:01:04,700 --> 00:01:05,510 +ưu hóa + +14 +00:01:05,510 --> 00:01:08,670 +quá sớm không phải là một điều tuyệt vời. + +15 +00:01:09,140 --> 00:01:13,320 +Đừng cố gắng làm cho mã của bạn hiệu quả nhất có thể. + +16 +00:01:13,790 --> 00:01:17,080 +Thay vào đó, điều bạn nên hướng tới là khả năng đọc được. + +17 +00:01:17,630 --> 00:01:23,750 +Vì vậy, nếu một lập trình viên khác đi cùng, nếu một sinh viên khác xem mã của bạn, họ có thể hiểu ngay lập tức + +18 +00:01:23,750 --> 00:01:26,870 +những gì bạn đã làm mà không cần nỗ lực nhiều không? + +19 +00:01:27,290 --> 00:01:30,070 +Chà, nếu đúng thì bạn đã thành công. + +20 +00:01:30,470 --> 00:01:31,670 +Đó là mục tiêu. + +21 +00:01:31,680 --> 00:01:36,000 +Đó là thanh mà bạn nên đo mã của mình. Bây giờ, khi tôi đang + +22 +00:01:36,020 --> 00:01:42,470 +học đại học và tôi phải viết rất nhiều bài luận, đặc biệt là trong năm tôi + +23 +00:01:42,470 --> 00:01:51,230 +đang làm bằng cấp về khoa học thần kinh, và khi tôi mới bắt đầu viết luận, tôi đã nghĩ, “Bạn biết không? + +24 +00:01:51,590 --> 00:01:54,380 +Những bài luận hay là những bài có từ ngữ lớn. + +25 +00:01:54,380 --> 00:01:59,120 +Bạn biết đấy, chúng là những từ có like, bạn biết đấy, những từ like mà không ai sử dụng bao giờ. "Và chúng phải thực + +26 +00:01:59,660 --> 00:02:01,870 +sự phức tạp. + +27 +00:02:01,880 --> 00:02:03,620 +Nó làm cho tôi nghe có vẻ siêu thông minh. + +28 +00:02:04,460 --> 00:02:12,290 +Nhưng sau đó tôi có một giáo sư, một người thực sự rất có ảnh hưởng đến cuộc đời tôi. + +29 +00:02:12,290 --> 00:02:14,780 +Và anh ấy đã xem qua bài luận của + +30 +00:02:15,880 --> 00:02:23,740 +tôi và nói, "Đây không phải là cách bạn viết. Bạn viết để người khác hiểu bạn đang muốn nói gì. "Và nó thực + +31 +00:02:25,070 --> 00:02:31,490 +sự tương tự với mã. Nó không phải là viết những từ lớn, nó + +32 +00:02:31,490 --> 00:02:40,700 +không phải là để rút ngắn mã của bạn xuống số dòng ngắn nhất. Đó là làm cho mã của bạn diễn đạt, dễ đọc và càng dễ hiểu + +33 +00:02:40,700 --> 00:02:43,370 +càng tốt cho nhiều người nhất có thể. + +34 +00:02:44,420 --> 00:02:49,550 +Khi bạn đã đến đó, cuối cùng, bạn biết đấy, một khi bạn trở thành một nhà phát triển cấp cao, + +35 +00:02:49,550 --> 00:02:57,350 +bạn sẽ có những ý tưởng của riêng mình về phong cách và cú pháp. Nhưng ở giai đoạn này, hãy tối ưu hóa để dễ đọc. + diff --git a/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/external-links.txt b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..f84c9789fcbe49cb9dc9a256a9c35d6a0eb19c7a --- /dev/null +++ b/part2/24 - Day 24 - Intermediate - Files, Directories and Paths/external-links.txt @@ -0,0 +1,18 @@ + +003 The-open-method +https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files + +005 Day-24-Ending-Code +https://repl.it/@appbrewery/day-24-end + +007 Hint-1 +https://www.w3schools.com/python/ref_file_readlines.asp + +007 Hint-2 +https://www.w3schools.com/python/ref_string_replace.asp + +007 Hint-3 +https://www.w3schools.com/python/ref_string_strip.asp + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/001 Day 25 Goals what we will make by the end of the day.mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/001 Day 25 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..092340ec2fbf2680def85d41da1c4cdc1aaea047 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/001 Day 25 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff3efbcc2056c331cba5915907b04aa93fd40eba911beffde93e640979dcd32f +size 18976188 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/001 Day 25 Goals what we will make by the end of the day_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/001 Day 25 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..622b22b15778262844946de27462b26631788c71 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/001 Day 25 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,116 @@ +1 +00:00:00,480 --> 00:00:04,530 +Xin chào các bạn, chào mừng đến với Ngày 25 của 100 Ngày viết mã. + +2 +00:00:04,980 --> 00:00:09,690 +Vì vậy, hôm nay chúng ta sẽ tìm hiểu về cách làm việc với tệp CSV, không chỉ là tệp + +3 +00:00:09,960 --> 00:00:13,620 +văn bản như chúng ta đã thấy trong các bài học ngày hôm qua. + +4 +00:00:13,950 --> 00:00:17,460 +Nhưng chúng tôi sẽ làm việc với các tệp dữ liệu và chúng tôi sẽ phân + +5 +00:00:17,460 --> 00:00:20,400 +tích dữ liệu đó với một thư viện có tên là Pandas. + +6 +00:00:20,790 --> 00:00:24,000 +Đây là một trong những thư viện phân tích dữ liệu Python phổ biến nhất và chúng ta + +7 +00:00:24,390 --> 00:00:27,960 +sẽ tìm hiểu kỹ về cách chúng ta có thể sử dụng nó để bắt đầu có được một số + +8 +00:00:27,960 --> 00:00:31,680 +thông tin chi tiết về dữ liệu của mình. Vào cuối ngày, bạn sẽ + +9 +00:00:31,710 --> 00:00:35,790 +xây dựng một trò chơi giáo dục và thú vị, giúp bạn đoán và + +10 +00:00:35,880 --> 00:00:40,880 +tìm hiểu tất cả các Bang ở Hoa Kỳ. Và nguồn cảm hứng đến từ một bài kiểm + +11 +00:00:40,950 --> 00:00:43,800 +tra trên Sporcle, nơi nó có bản đồ của tất cả + +12 +00:00:44,130 --> 00:00:46,710 +các Bang, tất cả đều trống cho đến khi bạn + +13 +00:00:46,740 --> 00:00:49,590 +bắt đầu đoán một số Bang, và sau đó bạn tiếp + +14 +00:00:49,890 --> 00:00:54,420 +tục cho đến khi bạn có đủ 50. Hoặc giống như tôi, bạn gặp khó + +15 +00:00:54,420 --> 00:00:56,400 +khăn ở tuổi 30 trên 50. + +16 +00:00:56,730 --> 00:01:01,730 +Trò chơi này kiểm tra kiến thức của bạn về tên của 50 Bang ở Hoa Kỳ. + +17 +00:01:02,370 --> 00:01:06,930 +Vì vậy, ví dụ: nếu tôi đi và thêm một tiểu bang khác và tôi nhấn + +18 +00:01:06,930 --> 00:01:07,763 +OK, thì + +19 +00:01:07,890 --> 00:01:12,120 +tên đó sẽ xuất hiện trên bản đồ tại vị trí của tiểu bang. + +20 +00:01:12,720 --> 00:01:17,720 +Mục đích của trò chơi là ghi nhớ tất cả tên của các bang và đặt + +21 +00:01:20,010 --> 00:01:21,600 +tên càng nhiều càng tốt. + +22 +00:01:22,140 --> 00:01:25,980 +Vì vậy, tôi chỉ đạt được khoảng 30, ừm, nhưng tôi chưa bao giờ sống + +23 +00:01:26,070 --> 00:01:29,760 +ở Mỹ nên kiến thức của tôi chỉ đến từ việc xem các chương + +24 +00:01:29,760 --> 00:01:33,030 +trình truyền hình và kiến thức chung, nhưng nếu bạn đến từ + +25 +00:01:33,390 --> 00:01:36,000 +Mỹ thì có lẽ bạn sẽ làm tốt hơn tôi + +26 +00:01:36,000 --> 00:01:36,660 +rất nhiều. + +27 +00:01:36,660 --> 00:01:41,580 +Vì vậy, đây là một trò chơi tương tác và giáo dục mà tôi nghĩ + +28 +00:01:41,580 --> 00:01:45,600 +rằng bạn sẽ thích chơi. Vì vậy, khi bạn đã sẵn sàng, hãy chuyển + +29 +00:01:45,720 --> 00:01:50,070 +sang bài học tiếp theo và chúng ta hãy bắt đầu tìm hiểu về cách làm việc với tệp dữ liệu. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Pandas-API-Reference.url b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Pandas-API-Reference.url new file mode 100644 index 0000000000000000000000000000000000000000..c5d96347e3b68c497b8d2fdc15bab520e6fea652 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Pandas-API-Reference.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pandas.pydata.org/docs/reference/index.html \ No newline at end of file diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Pandas-Documentation.url b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Pandas-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..a63ff14ee16b5da3b49fc348580f3dc1e09eca82 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Pandas-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pandas.pydata.org/docs/ \ No newline at end of file diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Reading CSV Data in Python.mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Reading CSV Data in Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a3340fa87913cf92e05eb7e4f74b0267d5688eb8 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Reading CSV Data in Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5edeacfc37016ff2641c761c8301b5f5b2d18212d2e47d2881d74d620b0a7535 +size 99368434 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Reading CSV Data in Python_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Reading CSV Data in Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2473c39afe0971ad6f6330f5fcce2db8d9130804 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 Reading CSV Data in Python_vi.srt @@ -0,0 +1,796 @@ +1 +00:00:00,180 --> 00:00:02,340 +Khi tôi còn nhỏ, tôi + +2 +00:00:02,370 --> 00:00:06,420 +nhớ một bài tập về môn Địa lý ở trường. + +3 +00:00:06,510 --> 00:00:11,340 +Và giáo viên yêu cầu chúng tôi về cơ bản xem bản tin thời tiết mỗi ngày + +4 +00:00:11,400 --> 00:00:14,550 +trên bản tin và ghi lại nhiệt độ, điều kiện thời + +5 +00:00:14,880 --> 00:00:17,280 +tiết của ngày hôm đó như thế nào. + +6 +00:00:17,640 --> 00:00:20,910 +Và sau đó chúng tôi sẽ kết thúc với điều kiện thời tiết và + +7 +00:00:20,910 --> 00:00:23,460 +nhiệt độ của tuần trước. Vào thời điểm + +8 +00:00:23,460 --> 00:00:27,930 +đó, đó là thời điểm mà rất nhiều giáo viên không thực sự + +9 +00:00:27,930 --> 00:00:30,510 +biết Internet làm gì. Vì vậy, ừm, + +10 +00:00:30,810 --> 00:00:35,550 +tôi nhận ra rằng tôi thực sự có thể chỉ cần đợi cho đến ngày trước khi + +11 +00:00:35,550 --> 00:00:37,920 +phải trả bài tập về nhà, truy cập + +12 +00:00:37,980 --> 00:00:40,380 +internet, tìm điều kiện thời tiết của bảy ngày + +13 +00:00:40,500 --> 00:00:43,980 +trước đó và sau đó viết ra thay vì phải xem thời + +14 +00:00:43,980 --> 00:00:46,770 +tiết. dự báo mỗi ngày. Vì vậy, tôi không biết + +15 +00:00:46,800 --> 00:00:51,800 +điều đó nói gì về tôi, nhưng nếu bạn là người thích đi những con đường tắt trong cuộc sống và + +16 +00:00:52,410 --> 00:00:56,760 +từ chối làm công việc mà máy tính có thể làm được, thì bạn đã đến đúng chỗ. + +17 +00:00:56,910 --> 00:00:59,310 +Học Python chắc chắn là con đường để đi. + +18 +00:01:00,510 --> 00:01:02,730 +Vì vậy, bên trong Google trang tính mà bạn có thể truy cập + +19 +00:01:02,760 --> 00:01:06,420 +bằng cách chuyển đến trang tính. Google. com, Tôi đã + +20 +00:01:06,930 --> 00:01:11,930 +tạo một bảng tính mới về các ngày trong tuần và nhiệt độ của từng + +21 +00:01:13,140 --> 00:01:18,120 +ngày đó theo độ C và cả điều kiện thời tiết vào những ngày đó. + +22 +00:01:18,630 --> 00:01:22,560 +Đây là bản sao của bài tập về nhà đó từ rất nhiều tuần trước, nhưng chúng tôi + +23 +00:01:23,040 --> 00:01:28,040 +sẽ làm việc với dữ liệu này để tìm hiểu cách chúng tôi có thể đọc các tệp dữ liệu và sau đó + +24 +00:01:28,290 --> 00:01:31,350 +phân tích chúng và cách chúng tôi có thể làm nhiều việc với nó. + +25 +00:01:31,860 --> 00:01:36,330 +Vì vậy, điều đầu tiên tôi muốn bạn làm là truy cập vào liên kết trong tài + +26 +00:01:36,330 --> 00:01:39,090 +nguyên khóa học sẽ đưa bạn đến bảng tính này. + +27 +00:01:39,570 --> 00:01:43,320 +Và sau đó khi bạn đã mở nó, hãy chuyển đến tải xuống tệp + +28 +00:01:43,410 --> 00:01:48,410 +và tôi muốn bạn tải xuống ở định dạng các giá trị được phân tách bằng dấu phẩy hoặc CSV. + +29 +00:01:51,210 --> 00:01:53,970 +Và bạn sẽ kết thúc với một tệp như thế này. + +30 +00:01:54,540 --> 00:01:59,540 +Bây giờ tôi muốn bạn đổi tên tệp này để nó chỉ là dữ liệu thời tiết. csv, và sau đó tôi muốn bạn + +31 +00:01:59,700 --> 00:02:04,260 +tạo một dự án PyCharm mới mà bạn có thể gọi bất cứ + +32 +00:02:04,410 --> 00:02:06,120 +thứ gì bạn muốn. + +33 +00:02:06,180 --> 00:02:10,169 +Tôi đã gọi nó là ngày 25. Và cũng tạo chính của bạn. py + +34 +00:02:10,860 --> 00:02:15,860 +Bây giờ tôi sẽ kéo dữ liệu thời tiết của mình. csv vào thư mục của tôi ngày-25 và nhấp vào refactor để + +35 +00:02:16,980 --> 00:02:21,570 +di chuyển tệp đó vào thư mục dự án của tôi. Bây giờ, tại thời điểm này, PyCharm nhận + +36 +00:02:21,600 --> 00:02:22,433 +ra rằng + +37 +00:02:22,440 --> 00:02:27,440 +đây là tệp CSV và nó hỏi bạn xem bạn có muốn cài đặt một số plugin để + +38 +00:02:27,750 --> 00:02:32,550 +giúp xem tệp này dễ dàng hơn hay không. Bây giờ, tại thời điểm này, bạn + +39 +00:02:32,550 --> 00:02:33,060 +có + +40 +00:02:33,060 --> 00:02:38,060 +thể nhấp vào hủy vì chúng tôi muốn xem dữ liệu dưới dạng dữ liệu thô, + +41 +00:02:38,700 --> 00:02:41,880 +ở định dạng CSV này. Giờ đây, CSV là + +42 +00:02:41,910 --> 00:02:46,710 +một cách rất phổ biến để biểu diễn dữ liệu tabula, vì vậy dữ liệu + +43 +00:02:46,710 --> 00:02:51,710 +phù hợp với các bảng như bảng tính. Và CSV, như bạn đã thấy là viết + +44 +00:02:51,900 --> 00:02:55,260 +tắt của các giá trị được phân tách bằng dấu phẩy. + +45 +00:02:56,250 --> 00:02:58,050 +Vì vậy, đó là lý do tại + +46 +00:02:58,080 --> 00:03:03,080 +sao khi bạn nhìn vào dữ liệu, bạn có thể thấy mỗi hàng ở đây là một tập dữ liệu duy nhất và mỗi + +47 +00:03:06,100 --> 00:03:08,830 +phần dữ liệu được phân tách bằng dấu phẩy không có khoảng trắng. + +48 +00:03:09,610 --> 00:03:13,060 +Vì vậy, chúng tôi đã thấy cách chúng tôi có thể mở tệp, đọc + +49 +00:03:13,060 --> 00:03:15,070 +tệp, ghi vào tệp. Như một thách thức, + +50 +00:03:15,100 --> 00:03:20,100 +tôi muốn bạn tiếp tục và mở dữ liệu thời tiết này. tệp csv bên trong + +51 +00:03:20,560 --> 00:03:25,560 +tệp chính của bạn. py và thêm từng dòng dữ liệu vào một danh sách mà chúng tôi sẽ gọi là dữ liệu. + +52 +00:03:28,870 --> 00:03:30,580 +Tạm dừng video và tiếp tục. + +53 +00:03:30,630 --> 00:03:31,463 +1: Được rồi. + +54 +00:03:33,390 --> 00:03:36,360 +0: Được rồi. Vì vậy, chúng tôi biết rằng chúng tôi sẽ cần mở tệp. + +55 +00:03:36,660 --> 00:03:40,710 +Vì vậy, nó được lưu trữ bên trong cùng một thư mục với ngày-25 của chúng tôi. + +56 +00:03:40,770 --> 00:03:45,770 +Vì vậy, chúng tôi chỉ có thể sử dụng một đường dẫn tệp tương đối để khai thác vào dữ liệu thời tiết này. csv. + +57 +00:03:46,890 --> 00:03:50,070 +Và chúng tôi sẽ lưu dữ liệu này dưới dạng data_file. + +58 +00:03:51,600 --> 00:03:55,290 +Và sau đó chúng ta sẽ lấy dữ liệu bằng cách đọc tệp dữ liệu này. + +59 +00:03:55,620 --> 00:03:58,830 +Vì vậy, data = data_file. đọc. + +60 +00:03:59,280 --> 00:04:02,850 +Và chúng ta không chỉ đọc nó, chúng ta sẽ sử dụng + +61 +00:04:02,880 --> 00:04:07,880 +các dòng đọc mà chúng ta biết sẽ lấy từng dòng trong tệp này và biến nó thành + +62 +00:04:09,150 --> 00:04:12,450 +một mục trong danh sách. Bây giờ, nếu tôi tiếp tục và in + +63 +00:04:16,170 --> 00:04:21,170 +dữ liệu của mình, thì bạn có thể thấy tôi đã có danh sách này ngay bây giờ, nơi mỗi mục là một hàng trong danh sách đó. + +64 +00:04:23,130 --> 00:04:27,030 +Nhưng như bạn có thể tưởng tượng, sẽ khá khó khăn khi làm việc với dữ + +65 +00:04:27,300 --> 00:04:29,400 +liệu, tất cả đều ở định dạng chuỗi. + +66 +00:04:29,460 --> 00:04:32,400 +Và chúng vẫn cách nhau bằng dấu phẩy. + +67 +00:04:32,730 --> 00:04:36,930 +Sẽ mất rất nhiều công sức dọn dẹp để thực sự có thể trích xuất + +68 +00:04:36,930 --> 00:04:41,760 +từng cột và từng hàng. Vậy thay vào đó chúng ta có thể làm gì? Chà, thực sự có + +69 +00:04:41,760 --> 00:04:46,760 +một thư viện có sẵn giúp chúng ta với CSV vì Python là một ngôn ngữ + +70 +00:04:48,000 --> 00:04:52,290 +được sử dụng rất nhiều để xử lý dữ liệu, phân tích dữ liệu. + +71 +00:04:52,590 --> 00:04:56,700 +Có rất nhiều công cụ tuyệt vời để làm việc với dữ liệu tabula, chẳng hạn + +72 +00:04:56,910 --> 00:05:01,320 +như dữ liệu thời tiết của chúng tôi. Đầu tiên, chúng ta sẽ nhập thư + +73 +00:05:01,740 --> 00:05:04,440 +viện CSV, sau đó chúng ta sẽ mở + +74 +00:05:04,530 --> 00:05:07,740 +lại một tệp, weather_data. csv dưới dạng tệp dữ liệu của + +75 +00:05:08,550 --> 00:05:11,670 +chúng tôi và sau đó chúng tôi sẽ sử dụng thư viện CSV này. + +76 +00:05:12,210 --> 00:05:14,850 +Và nó có một phương thức được gọi + +77 +00:05:15,450 --> 00:05:19,380 +là trình đọc, lấy tệp được đề cập, tệp này đã được mở + +78 +00:05:19,410 --> 00:05:24,410 +nên đây sẽ là tất cả data_file và nó có thể đọc nó một đầu ra + +79 +00:05:24,480 --> 00:05:25,313 +dữ liệu. + +80 +00:05:25,710 --> 00:05:29,550 +Vì vậy, bây giờ chúng ta hãy tiếp tục và in dữ liệu này và hãy xem những gì chúng ta có. + +81 +00:05:30,420 --> 00:05:33,720 +Bạn có thể thấy rằng nó đã được tạo một + +82 +00:05:33,750 --> 00:05:37,560 +đối tượng trình đọc CSV. Đối tượng này có thể được lặp lại. + +83 +00:05:37,920 --> 00:05:42,120 +Vì vậy, nếu chúng ta muốn lấy từng hàng bên trong dữ liệu này, chúng + +84 +00:05:42,120 --> 00:05:44,790 +ta có thể nói đối với hàng trong dữ + +85 +00:05:45,090 --> 00:05:49,860 +liệu, hãy tiếp tục và in từng hàng. Và khi bạn đã làm điều đó, bạn có thể thấy nó được + +86 +00:05:49,890 --> 00:05:54,540 +lấy từng hàng bên trong dữ liệu thời tiết của chúng tôi. csv và tách + +87 +00:05:55,050 --> 00:06:00,050 +từng mục thành một giá trị duy nhất. + +88 +00:06:00,770 --> 00:06:03,980 +Vì vậy, ví dụ, trên hàng thứ Hai, chúng ta + +89 +00:06:04,010 --> 00:06:06,740 +có Thứ Hai là một chuỗi, chúng ta + +90 +00:06:06,740 --> 00:06:10,850 +có nhiệt độ là một chuỗi và cũng có điều kiện là một chuỗi. + +91 +00:06:11,150 --> 00:06:14,660 +Vì vậy, bây giờ chúng tôi dễ dàng làm việc với dữ liệu này hơn nhiều. + +92 +00:06:15,680 --> 00:06:18,320 +Sử dụng những gì bạn biết về danh + +93 +00:06:18,590 --> 00:06:22,790 +sách Python, tôi muốn bạn tạo một danh sách mới có tên là + +94 +00:06:23,360 --> 00:06:28,360 +nhiệt độ và danh sách này sẽ chứa tất cả các nhiệt độ bên trong + +95 +00:06:29,060 --> 00:06:32,990 +dữ liệu thời tiết này. csv, như thế này 12 độ, + +96 +00:06:33,350 --> 00:06:36,140 +14, 15, và nó sẽ ở định dạng số nguyên. + +97 +00:06:36,200 --> 00:06:40,040 +Tôi không muốn xem nó như một chuỗi với dấu ngoặc kép xung quanh. + +98 +00:06:40,370 --> 00:06:43,460 +Nó phải là một số thuần túy để chúng ta có thể làm việc với nó dễ dàng hơn. + +99 +00:06:44,090 --> 00:06:45,890 +Vì vậy, đây là thách thức của bạn. + +100 +00:06:46,190 --> 00:06:50,390 +Tạm dừng video và xem liệu bạn có thể trích xuất tất cả các nhiệt độ từ tệp + +101 +00:06:50,390 --> 00:06:52,430 +này vào danh sách mới này hay không. + +102 +00:06:52,630 --> 00:06:53,463 +2: Được rồi. + +103 +00:06:55,600 --> 00:06:58,660 +0: Được rồi. Vì vậy, khi chúng tôi in + +104 +00:06:58,720 --> 00:07:03,720 +ra từng hàng, chúng tôi có thể thấy rằng chúng tôi đã tạo một số danh sách trong đó mỗi danh sách chứa toàn + +105 +00:07:04,840 --> 00:07:07,600 +bộ hàng dữ liệu từ CSV dữ liệu thời tiết của chúng tôi. + +106 +00:07:08,260 --> 00:07:10,840 +Nếu chúng ta muốn lấy nhiệt độ, thì nó sẽ là + +107 +00:07:10,930 --> 00:07:15,730 +mục ở chỉ mục một trong danh sách đó. Ví dụ: nếu chúng ta muốn có + +108 +00:07:15,730 --> 00:07:18,970 +nhiệt độ thứ Hai, thì tất cả những gì + +109 +00:07:19,300 --> 00:07:24,300 +chúng ta phải làm là nhấn vào từng hàng này và nhận được mục + +110 +00:07:24,520 --> 00:07:27,670 +ở chỉ số 1. Nếu tôi tiếp tục và + +111 +00:07:27,700 --> 00:07:30,730 +in cái này, thì bạn có thể thấy chúng tôi nhận được + +112 +00:07:31,090 --> 00:07:33,550 +tất cả nhiệt độ, cũng như nhãn cho cột đó. + +113 +00:07:34,090 --> 00:07:36,730 +Vì vậy, nếu chúng ta muốn loại trừ nhãn + +114 +00:07:36,760 --> 00:07:41,760 +đó, thì tất cả những gì chúng ta phải làm là sử dụng câu lệnh if và kiểm + +115 +00:07:43,090 --> 00:07:47,320 +tra xem hàng ở chỉ mục một có không bằng tạm thời, đó là tên + +116 +00:07:47,740 --> 00:07:52,740 +của nhãn cột đó, sau đó chúng ta sẽ khai thác danh sách nhiệt độ và thêm hàng + +117 +00:07:53,410 --> 00:07:56,410 +này ở chỉ mục một, sẽ là một số nhiệt độ. + +118 +00:07:57,040 --> 00:07:59,980 +Vì vậy, bây giờ sau khi chúng ta đã thực hiện toàn bộ vòng lặp for, sau đó + +119 +00:08:00,010 --> 00:08:04,480 +chúng ta có thể in ra danh sách nhiệt độ của mình. Và nếu bạn để ý, bạn có thể + +120 +00:08:04,510 --> 00:08:07,030 +thấy bây giờ chúng ta đã có một danh sách + +121 +00:08:07,300 --> 00:08:12,130 +tất cả các nhiệt độ ngoại trừ tiêu đề cột đó, nhưng tất cả chúng đều ở định dạng chuỗi. + +122 +00:08:12,550 --> 00:08:15,130 +Vì vậy, nếu chúng ta muốn chuyển nó thành một số nguyên, + +123 +00:08:15,370 --> 00:08:18,580 +thì tất cả những gì chúng ta phải làm là quấn nó xung quanh một số nguyên. + +124 +00:08:19,900 --> 00:08:23,530 +Vì vậy, đó là mục tiêu của thử thách. Tất nhiên, bây giờ bạn có thể + +125 +00:08:23,530 --> 00:08:26,320 +tách dòng này thành nhiều dòng khác, nhưng tôi nghĩ điều này sẽ + +126 +00:08:26,620 --> 00:08:31,620 +có đủ ý nghĩa đối với bạn ở giai đoạn này. Mặc dù CSV là thư + +127 +00:08:32,710 --> 00:08:36,580 +viện đọc và ghi CSV có sẵn, hãy + +128 +00:08:37,210 --> 00:08:42,210 +lưu ý mức độ ảnh hưởng của việc chỉ lấy + +129 +00:08:43,059 --> 00:08:47,500 +một cột dữ liệu. Chúng ta sẽ làm gì nếu chúng ta có nhiều + +130 +00:08:47,500 --> 00:08:50,920 +dữ liệu hơn, dữ liệu phức tạp hơn với nhiều cột hơn, nhiều hàng hơn và + +131 +00:08:51,140 --> 00:08:53,440 +chúng ta muốn làm nhiều điều thú vị hơn với nó? + +132 +00:08:53,920 --> 00:08:56,460 +Điều này sẽ khá khó khăn để làm việc với. + +133 +00:08:57,060 --> 00:09:00,840 +Đây là điểm mà chúng tôi muốn nhận được sự giúp đỡ của một số con gấu trúc. + +134 +00:09:01,170 --> 00:09:03,750 +Không phải những loại gấu trúc. Dễ thương như vậy nhưng + +135 +00:09:03,750 --> 00:09:06,300 +chúng sẽ không giúp chúng ta phân tích dữ liệu. + +136 +00:09:06,630 --> 00:09:11,630 +Nhưng thay vào đó, tôi đang nói về thư viện Pandas và đây là thư viện phân + +137 +00:09:12,780 --> 00:09:14,190 +tích dữ liệu Python + +138 +00:09:14,520 --> 00:09:19,520 +siêu hữu ích và siêu mạnh để thực hiện phân tích dữ liệu trên dữ liệu tabula + +139 +00:09:21,090 --> 00:09:25,410 +giống như thư viện mà chúng tôi có. Để làm việc với nó, + +140 +00:09:25,440 --> 00:09:30,000 +chúng tôi phải nhập thư viện này. Nhưng vì nó không được tích hợp sẵn, + +141 +00:09:30,060 --> 00:09:32,700 +bạn sẽ cần cài đặt nó vào dự án của mình. + +142 +00:09:33,090 --> 00:09:36,870 +Vì vậy, cách tắt của điều này chỉ đơn giản là nhập khẩu gấu trúc và sau đó + +143 +00:09:36,960 --> 00:09:38,400 +khi bạn nhìn thấy dòng màu + +144 +00:09:38,700 --> 00:09:42,840 +đỏ, hãy tiếp tục và di chuột qua nó, sau đó nhấp vào cài đặt gói gấu trúc và sau + +145 +00:09:43,020 --> 00:09:47,250 +đó bạn có thể xem tiến trình ở đây. Bây giờ, trong khi cài đặt, tôi + +146 +00:09:47,310 --> 00:09:50,940 +muốn giới thiệu nhanh với bạn về tài liệu cho thư viện này. + +147 +00:09:51,240 --> 00:09:54,690 +Nó thực sự được ghi chép đầy đủ và nó thực sự mạnh mẽ, vì vậy + +148 +00:09:54,690 --> 00:09:58,470 +nó có rất nhiều thứ trong tài liệu. Nếu bạn đi đến + +149 +00:09:58,470 --> 00:10:02,970 +gấu trúc. pydata. org và sau đó nhấp vào tài liệu, + +150 +00:10:03,300 --> 00:10:06,360 +sau đó bạn sẽ có thể xem tất cả những điều bạn có thể làm với nó. + +151 +00:10:06,780 --> 00:10:08,730 +Vì vậy, có tài liệu + +152 +00:10:08,730 --> 00:10:13,730 +tham khảo về API, có hướng dẫn bắt đầu nhanh cũng như hướng dẫn người dùng + +153 +00:10:13,770 --> 00:10:18,770 +về các khái niệm chính của gấu trúc. Khi bạn đang sử dụng một thư viện mới thuộc bất + +154 +00:10:20,490 --> 00:10:23,700 +kỳ loại nào, bạn nên xem hướng dẫn bắt đầu của họ nếu họ + +155 +00:10:24,060 --> 00:10:28,530 +có, bởi vì nó cho bạn biết cách bạn có thể cài đặt nó và một số câu hỏi mà + +156 +00:10:28,530 --> 00:10:29,790 +bạn có thể có, ví + +157 +00:10:29,790 --> 00:10:34,790 +dụ, gấu trúc xử lý loại dữ liệu nào hoặc tôi có thể đọc và ghi dữ liệu tabula như thế nào. + +158 +00:10:35,100 --> 00:10:38,100 +Và nó thực sự được thực hiện rất, rất tốt. Vì vậy, nếu bạn có + +159 +00:10:38,220 --> 00:10:43,080 +một chút thời gian, hãy xem nhanh trang này. Và khi bạn quay lại PyCharm, các gói của bạn + +160 +00:10:43,140 --> 00:10:46,800 +đã được cài đặt thành công. Bây giờ, khi chúng tôi đã cài + +161 +00:10:46,800 --> 00:10:48,840 +đặt gấu trúc của mình, bạn sẽ thấy + +162 +00:10:48,930 --> 00:10:51,960 +rằng nó vẫn còn màu xám vì chúng tôi chưa sử dụng nó. + +163 +00:10:52,470 --> 00:10:57,150 +Nếu chúng ta muốn sử dụng gấu trúc, tất cả những gì chúng ta phải làm là nói gấu trúc. + +164 +00:10:57,900 --> 00:11:00,840 +và trong trường hợp của chúng tôi, chúng tôi thực sự muốn đọc CSV của mình. + +165 +00:11:01,320 --> 00:11:03,480 +Vì vậy, chúng ta có thể nói + +166 +00:11:04,050 --> 00:11:08,550 +read_csv và bên trong phương thức này, bạn có thể làm rất nhiều thứ, như bạn có + +167 +00:11:08,610 --> 00:11:13,140 +thể thấy bằng tất cả các tên thuộc tính. Nhưng hầu hết trong số này là tùy chọn. + +168 +00:11:13,560 --> 00:11:18,270 +Đường duy nhất không phải là tùy chọn là đường dẫn dẫn đến tệp CSV. + +169 +00:11:18,750 --> 00:11:22,440 +Vì vậy, nếu chúng ta nắm được dữ liệu thời tiết của mình. csv, sau đó chúng tôi có + +170 +00:11:22,800 --> 00:11:25,860 +thể đọc CSV đó bằng cách sử dụng gấu trúc. + +171 +00:11:26,160 --> 00:11:29,940 +Vì vậy, hãy lưu ý cách chúng tôi không phải mở tệp dưới dạng tệp + +172 +00:11:30,150 --> 00:11:34,350 +dữ liệu hoặc bạn sử dụng trình đọc CSV, chỉ một bước là bạn đã hoàn tất. + +173 +00:11:34,800 --> 00:11:39,060 +Vì vậy, bây giờ chúng tôi đã nắm giữ dữ liệu của mình và nếu tôi in dữ + +174 +00:11:39,090 --> 00:11:42,570 +liệu ra, bạn có thể thấy nó được định dạng đẹp như thế nào. + +175 +00:11:43,110 --> 00:11:45,930 +Nó được in ra dưới dạng một bảng thực tế, + +176 +00:11:45,960 --> 00:11:50,790 +nó có các tiêu đề cột ở đầu mỗi cột và mỗi hàng được cung cấp một chỉ + +177 +00:11:50,790 --> 00:11:55,600 +mục để chúng ta có thể dễ dàng xác định có bao nhiêu bản ghi và vị trí + +178 +00:11:55,900 --> 00:11:57,220 +của mỗi bản ghi. + +179 +00:11:58,390 --> 00:12:01,840 +Nếu chúng ta muốn nghĩ về nhiệm vụ trước đó mà chúng ta + +180 +00:12:01,840 --> 00:12:06,840 +đã cố gắng thực hiện trong đó chúng ta chỉ cố gắng nắm giữ một cột dữ liệu từ + +181 +00:12:08,830 --> 00:12:10,240 +bảng này, thì khi + +182 +00:12:10,330 --> 00:12:14,950 +sử dụng pandas, nó thực sự dễ dàng như nói dữ liệu và sau đó là dấu + +183 +00:12:15,070 --> 00:12:19,750 +ngoặc vuông, và sau đó tên của cột đó. Vì vậy, trong trường hợp của chúng tôi, đó là tạm thời. + +184 +00:12:20,860 --> 00:12:23,620 +Và bây giờ nếu tôi tiếp tục và in nó ra, + +185 +00:12:24,640 --> 00:12:29,640 +bạn có thể thấy về cơ bản nó đã được xác định cột và nó được in ra tất + +186 +00:12:29,890 --> 00:12:31,720 +cả dữ liệu trong cột đó. + +187 +00:12:32,140 --> 00:12:34,720 +Vì vậy, điều thực sự thông minh + +188 +00:12:34,760 --> 00:12:39,700 +mà Panda đang làm ở đây là lấy hàng đầu tiên đó là tên của mỗi + +189 +00:12:40,120 --> 00:12:43,480 +cột và nó tự động biết cách tìm dữ liệu khi + +190 +00:12:43,750 --> 00:12:47,380 +bạn chỉ cần chỉ định tên của cột như thế này. + +191 +00:12:48,280 --> 00:12:51,220 +Vì vậy, ba dòng so với tám dòng và chúng + +192 +00:12:51,730 --> 00:12:56,110 +tôi có được định dạng tốt hơn. Không có gì ngạc nhiên khi hầu hết các nhà + +193 +00:12:56,170 --> 00:12:58,240 +phát triển Python, ngay khi họ gặp lỗi CSV, + +194 +00:12:58,270 --> 00:13:00,910 +họ sẽ bắt đầu sử dụng gấu trúc để làm việc với + +195 +00:13:01,210 --> 00:13:03,970 +nó bất kể nhiệm vụ hoặc dự án đơn giản đến mức nào. + +196 +00:13:04,300 --> 00:13:07,660 +Đó là phần giới thiệu nhanh về dữ liệu CSV, cách làm việc với dữ + +197 +00:13:08,020 --> 00:13:13,020 +liệu CSV và cách bắt đầu sử dụng gấu trúc. Trong bài học tiếp theo, chúng ta sẽ đi sâu hơn + +198 +00:13:14,080 --> 00:13:18,100 +vào thư viện này và xem tất cả những điều phổ biến mà chúng ta có thể + +199 +00:13:18,100 --> 00:13:19,300 +làm với gấu trúc. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 day-25-start.zip b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 day-25-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..082ae86dea0cf792c8a740fbf8785f4e9585fc01 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 day-25-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b694f1c7f03a88dd8df04e12ff5bdd0e91cd159853903b9502ec48411a6856a2 +size 315 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 weather-data.csv b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 weather-data.csv new file mode 100644 index 0000000000000000000000000000000000000000..80e8abb8c398f4dda57069f27e2989f7b4fd9c86 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/002 weather-data.csv @@ -0,0 +1,8 @@ +day,temp,condition +Monday,12,Sunny +Tuesday,14,Rain +Wednesday,15,Rain +Thursday,14,Cloudy +Friday,21,Sunny +Saturday,22,Sunny +Sunday,24,Sunny \ No newline at end of file diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/003 DataFrames & Series Working with Rows & Columns.mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/003 DataFrames & Series Working with Rows & Columns.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7f7fae8587e0cfab84cb7896af05d971256c45f8 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/003 DataFrames & Series Working with Rows & Columns.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db8b7bee68546574590675184b9c7e91ad947cfd0c4c516572ac8bd8da8f82de +size 139589430 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/003 DataFrames & Series Working with Rows & Columns_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/003 DataFrames & Series Working with Rows & Columns_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d209378e6c8a536b8dc58579be00134f8fbb3615 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/003 DataFrames & Series Working with Rows & Columns_vi.srt @@ -0,0 +1,840 @@ +1 +00:00:00,320 --> 00:00:03,370 +Trong bài học trước chúng ta đã bắt đầu sử dụng gấu trúc. + +2 +00:00:03,380 --> 00:00:08,090 +Chúng tôi đã cài đặt thư viện và nhập nó để đọc tệp CSV. + +3 +00:00:08,090 --> 00:00:14,930 +Sau đó, chúng tôi sử dụng tệp đó để giữ một cột đã được xác định tự động ngay khi đọc + +4 +00:00:14,930 --> 00:00:16,400 +dữ liệu CSV này. + +5 +00:00:16,850 --> 00:00:19,910 +Vậy chính xác thì chúng ta đang giải quyết vấn đề gì ở đây? + +6 +00:00:19,940 --> 00:00:26,630 +Chà, một trong những điều hữu ích nhất mà tôi thấy là kiểm tra kiểu trên bất kỳ đối tượng nào mà tôi đang + +7 +00:00:26,630 --> 00:00:33,680 +làm việc từ một thư viện tiểu thuyết mới, ví dụ: chúng ta có thể sử dụng phương thức type để kiểm tra chính xác + +8 +00:00:33,680 --> 00:00:37,820 +kiểu dữ liệu của dữ liệu này chúng tôi đang lấy lại từ gấu trúc. + +9 +00:00:37,820 --> 00:00:45,230 +Vì vậy, nếu tôi tiếp tục in cái này và nhận xét dòng thứ hai này, thì bạn có thể thấy những gì chúng ta đang + +10 +00:00:45,230 --> 00:00:49,130 +nhận được gọi là đối tượng khung dữ liệu Pandas. + +11 +00:00:49,130 --> 00:00:56,870 +Trong phần tổng quan về gói, họ nói về hai cấu trúc dữ liệu chính của chuỗi Pandas và khung dữ + +12 +00:00:56,870 --> 00:00:57,500 +liệu. + +13 +00:00:57,680 --> 00:01:02,250 +Khung dữ liệu tương đương với toàn bộ bảng của bạn ở đây. + +14 +00:01:02,250 --> 00:01:08,700 +Vì vậy, mỗi trang tính bên trong tệp Excel hoặc bên trong tệp trang tính Google sẽ được coi là khung + +15 +00:01:08,700 --> 00:01:10,290 +dữ liệu trong Pandas. + +16 +00:01:10,770 --> 00:01:17,370 +Bây giờ, còn phần thứ hai ở đây, nơi chúng ta nắm giữ một trong các cột trong khung dữ liệu thì sao? + +17 +00:01:17,370 --> 00:01:26,190 +Nếu tôi thực hiện kiểm tra kiểu đối tượng này và nhấn chạy, thì bạn có thể thấy đây là đối tượng chuỗi Pandas. + +18 +00:01:26,370 --> 00:01:35,010 +Chuỗi này là khái niệm cực kỳ quan trọng khác trong Pandas và về cơ bản, chuỗi này tương đương với một danh + +19 +00:01:35,010 --> 00:01:35,790 +sách. + +20 +00:01:35,790 --> 00:01:39,870 +Nó giống như một cột trong bảng của bạn. + +21 +00:01:39,870 --> 00:01:46,350 +Vì vậy, cột nhiệt độ sẽ là một chuỗi, cột điều kiện sẽ là một chuỗi và cột ngày cũng + +22 +00:01:46,350 --> 00:01:48,060 +sẽ là một chuỗi. + +23 +00:01:48,060 --> 00:01:55,200 +Vì vậy, khi bạn đã hiểu được ý tưởng rằng toàn bộ bảng về cơ bản là một khung dữ liệu trong Pandas và mỗi cột là + +24 +00:01:55,200 --> 00:02:01,710 +một chuỗi, giống như một danh sách trong pandas, thì bạn đã đi được gần nửa chặng đường để hiểu cách + +25 +00:02:01,710 --> 00:02:04,560 +thực hiện điều này. thư viện hoạt động. + +26 +00:02:04,950 --> 00:02:12,060 +Bây giờ, nếu chúng ta chuyển sang phần tham khảo API, bạn có thể thấy rằng về cơ bản đây là danh sách tất cả + +27 +00:02:12,060 --> 00:02:19,950 +những điều bạn có thể làm với Pandas và đó là một danh sách dài những thứ, nhưng chúng ta hãy xem xét hai điều cốt lõi + +28 +00:02:19,950 --> 00:02:22,530 +đó các lớp, khung dữ liệu và chuỗi. + +29 +00:02:22,530 --> 00:02:28,560 +Vì vậy, nếu chúng ta đi đến khung dữ liệu, bạn có thể thấy rằng nó có những thứ về cách xây dựng + +30 +00:02:28,560 --> 00:02:32,370 +khung dữ liệu mới, cách lấy chỉ mục, cách lấy nhãn cột. + +31 +00:02:32,370 --> 00:02:38,670 +Và có rất nhiều thuộc tính mà bạn có thể khai thác cũng như nhiều phương pháp. + +32 +00:02:38,880 --> 00:02:45,090 +Ví dụ: nếu chúng ta xem phần này về chuyển đổi IO tuần tự hóa, bạn có thể thấy rằng bạn thực + +33 +00:02:45,090 --> 00:02:49,680 +sự có thể chuyển đổi khung dữ liệu sang nhiều loại tệp khác nhau. + +34 +00:02:49,680 --> 00:02:54,000 +Bạn có thể chuyển đổi nó thành tệp Excel, bạn có thể chuyển đổi nó sang HTML. + +35 +00:02:54,030 --> 00:02:56,850 +Bạn cũng có thể chuyển đổi nó thành một từ điển. + +36 +00:02:56,850 --> 00:03:03,540 +Vì vậy, nếu chúng ta nhấp vào đây, chúng ta sẽ đến tài liệu thực tế về cách bạn sẽ sử dụng phương pháp này. + +37 +00:03:03,540 --> 00:03:09,660 +Và nếu bạn xem tài liệu Python cơ bản so với tài liệu Pandas, bạn sẽ thấy tại sao tài liệu này lại + +38 +00:03:09,660 --> 00:03:10,830 +tốt hơn nhiều. + +39 +00:03:10,830 --> 00:03:14,520 +Nó liệt kê tất cả các tham số có thể. + +40 +00:03:14,550 --> 00:03:20,700 +Nó cung cấp cho bạn các ví dụ về cách bạn có thể sử dụng từng phương pháp và nó cũng có một số phương pháp liên + +41 +00:03:20,700 --> 00:03:23,370 +quan mà nó cho rằng bạn có thể muốn xem qua. + +42 +00:03:24,120 --> 00:03:26,760 +Vì vậy, hãy sử dụng phương pháp này. + +43 +00:03:26,760 --> 00:03:33,390 +Và điều chúng ta sắp làm là lấy dữ liệu của mình và gọi tới DICT, nơi sẽ chuyển + +44 +00:03:33,390 --> 00:03:35,400 +nó thành từ điển. + +45 +00:03:35,400 --> 00:03:39,120 +Vì vậy, hãy gọi dữ liệu đó là dict bằng dữ liệu thành dict. + +46 +00:03:39,120 --> 00:03:47,010 +Và sau đó nếu chúng tôi in từ điển dữ liệu mới của mình ra, bạn có thể thấy rằng Pandas đã lấy bảng + +47 +00:03:47,010 --> 00:03:53,520 +của chúng tôi và lấy từng cột trong bảng để tạo một từ điển riêng cho từng cột. + +48 +00:03:53,520 --> 00:04:01,170 +Vậy là chúng ta đã có nhiệt độ và điều kiện ban ngày và bây giờ chúng ta có thể làm việc với nó như thể nó là một cuốn từ điển thực sự. + +49 +00:04:01,740 --> 00:04:10,260 +Bây giờ, nếu chúng ta xem xét kiểu dữ liệu chuỗi và xem phần chuyển đổi của loại dữ liệu này thì bạn có thể thấy rằng bạn + +50 +00:04:10,260 --> 00:04:16,890 +thực sự có thể chuyển đổi từng chuỗi thành một danh sách nếu bạn muốn. làm việc với nó, giống + +51 +00:04:16,890 --> 00:04:20,459 +như bạn làm với bất kỳ danh sách nào khác. + +52 +00:04:21,149 --> 00:04:28,530 +Vì vậy, chúng tôi thấy rằng chúng tôi có thể lấy dữ liệu của mình và sau đó lấy cột nhiệt độ và khi chúng tôi + +53 +00:04:28,530 --> 00:04:37,530 +in nó ra, loại này là một chuỗi để chúng tôi có thể lấy chuỗi và sau đó gọi vào danh sách và điều này sẽ biến chuỗi dữ liệu này thành + +54 +00:04:37,530 --> 00:04:39,150 +một danh sách Python . + +55 +00:04:39,150 --> 00:04:44,190 +Vì vậy, hãy gọi danh sách tạm thời đó và tiếp tục in nó ra. + +56 +00:04:46,740 --> 00:04:49,500 +Đây sẽ là danh sách tất cả nhiệt độ. + +57 +00:04:49,500 --> 00:04:54,240 +Và điều này hiện đã được chuyển đổi thành kiểu dữ liệu Python thô. + +58 +00:04:54,240 --> 00:04:57,780 +Vì vậy, chúng ta có thể thực hiện tất cả những điều có thể làm với danh sách Python. + +59 +00:04:57,810 --> 00:05:00,450 +Ví dụ như chúng ta có thể kiểm tra độ dài của nó. + +60 +00:05:00,960 --> 00:05:03,570 +Vì vậy, đây là một thách thức khác dành cho bạn. + +61 +00:05:03,600 --> 00:05:10,050 +Với những gì chúng ta đã nói cho đến nay, bạn có thể tính được liệu bạn có thể tính được nhiệt độ trung bình trong + +62 +00:05:10,050 --> 00:05:12,390 +cột nhiệt độ của chúng ta không? + +63 +00:05:12,390 --> 00:05:17,850 +Vì vậy, hãy nhớ rằng, bạn luôn có thể Google nếu bạn không nhớ cách tính trung bình cộng của một thứ gì đó. + +64 +00:05:17,850 --> 00:05:20,220 +Vì vậy, hãy tạm dừng video và thử xem. + +65 +00:05:22,290 --> 00:05:22,710 +Được rồi. + +66 +00:05:22,710 --> 00:05:28,320 +Vì vậy, chúng tôi biết rằng chúng tôi có thể nhận được danh sách tất cả các nhiệt độ trong danh sách đó. + +67 +00:05:28,320 --> 00:05:32,360 +Và chúng ta biết rằng Python có một phương thức tích hợp được gọi là sum. + +68 +00:05:32,370 --> 00:05:38,460 +Vì vậy, chúng ta có thể lấy tổng của tất cả các nhiệt độ trong danh sách nhiệt độ của mình và sau đó + +69 +00:05:38,460 --> 00:05:42,210 +chúng ta có thể chia nó cho độ dài của danh sách tạm thời. + +70 +00:05:42,780 --> 00:05:48,930 +Tổng của tất cả các giá trị chia cho số giá trị sẽ cho chúng ta giá trị trung bình, còn được gọi là giá trị + +71 +00:05:48,930 --> 00:05:49,860 +trung bình. + +72 +00:05:49,860 --> 00:05:58,320 +Và nếu chúng ta in cái này ra, bạn có thể thấy nhiệt độ trung bình trong tuần là 17. 4. + +73 +00:05:58,620 --> 00:06:06,360 +Bây giờ, một cách khác để giải quyết thử thách này là có thể bạn đã xem qua danh sách các phương pháp này và bạn + +74 +00:06:06,360 --> 00:06:12,690 +có thể đã tìm thấy một số tính toán và thống kê mà bạn có thể thực hiện với chuỗi của mình trong + +75 +00:06:12,690 --> 00:06:14,010 +Pandas. + +76 +00:06:14,040 --> 00:06:16,620 +Bây giờ, một trong những phương pháp đó là giá trị trung bình. + +77 +00:06:16,620 --> 00:06:22,750 +Vì vậy, bạn thực sự có thể loại bỏ tất cả công việc dư thừa này và lấy chuỗi dữ liệu của + +78 +00:06:22,750 --> 00:06:29,290 +chúng tôi, về cơ bản là cột dữ liệu dưới tiêu đề temp và chỉ cần gọi dấu chấm trên đó. + +79 +00:06:29,290 --> 00:06:31,720 +Và bây giờ nếu tôi in cái này ra. + +80 +00:06:32,460 --> 00:06:37,800 +Bạn sẽ thấy kết quả vẫn như trước mà không cần phải làm thêm gì nhiều. + +81 +00:06:38,400 --> 00:06:44,400 +Ngoài giá trị trung bình, bạn có thể nhận được những thứ khác như số trung vị hoặc mốt và rất nhiều + +82 +00:06:44,400 --> 00:06:48,420 +thứ khác chỉ bằng cách gọi đúng phương thức trên chuỗi dữ liệu. + +83 +00:06:48,930 --> 00:06:50,990 +Vì vậy, đây là một thách thức dành cho bạn. + +84 +00:06:51,000 --> 00:06:57,630 +Tôi muốn bạn nắm được giá trị tối đa từ cột nhiệt độ này bằng cách sử dụng một trong các phương pháp + +85 +00:06:57,630 --> 00:06:58,870 +chuỗi dữ liệu. + +86 +00:06:58,890 --> 00:07:03,870 +Hãy tạm dừng video, xem tài liệu và xem liệu bạn có thể hoàn thành thử thách này không. + +87 +00:07:06,030 --> 00:07:06,420 +Được rồi. + +88 +00:07:06,420 --> 00:07:10,890 +Để có được giá trị tối đa, có lẽ chúng ta sẽ cần phương thức max này. + +89 +00:07:10,890 --> 00:07:17,520 +Vì vậy, chúng tôi gọi phương thức này giống như cách chúng tôi đã làm trước đây, đó là lấy chuỗi dữ liệu. + +90 +00:07:17,520 --> 00:07:24,690 +Vì vậy, toàn bộ bảng của chúng tôi được lưu trữ trong dữ liệu và sau đó chúng tôi có thể lấy cột ở nhiệt độ tiêu đề. + +91 +00:07:24,690 --> 00:07:30,000 +Vì vậy, bây giờ đây là một chuỗi dữ liệu và sau đó chúng ta có thể gọi phương thức đó là Max trên đó. + +92 +00:07:30,000 --> 00:07:35,400 +Và nếu chúng ta in nó ra, bạn có thể thấy kết quả chúng ta nhận được là 24. + +93 +00:07:35,400 --> 00:07:38,220 +Vậy nhiệt độ cao nhất là 24. + +94 +00:07:39,500 --> 00:07:40,670 +Vậy là bạn đã thấy điều đó. + +95 +00:07:40,670 --> 00:07:46,410 +Khi chúng ta làm việc với gấu trúc, việc lấy dữ liệu vào một cột cụ thể thực sự rất dễ dàng. + +96 +00:07:46,430 --> 00:07:52,070 +Tất cả những gì chúng ta phải làm chỉ là lấy khung dữ liệu, sử dụng một bộ dấu ngoặc vuông + +97 +00:07:52,070 --> 00:07:58,350 +và sau đó chỉ định tên của cột, cột này được lấy theo mặc định làm hàng đầu tiên của dữ liệu. + +98 +00:07:58,370 --> 00:08:02,270 +Vì vậy, cột ngày, nhiệt độ, điều kiện. + +99 +00:08:02,270 --> 00:08:08,270 +Vì vậy, nếu tôi muốn nắm bắt tất cả các điều kiện thì tôi sẽ nói điều kiện dữ liệu. + +100 +00:08:08,270 --> 00:08:15,560 +Và nếu tôi tiếp tục in cái này ra, bạn có thể thấy nó chứa tất cả các điều kiện thời tiết + +101 +00:08:15,560 --> 00:08:17,780 +và chọn cột đó để in ra. + +102 +00:08:18,350 --> 00:08:25,550 +Bây giờ là một cách khác để sử dụng ký hiệu dấu ngoặc vuông trong đó bạn phải cẩn thận với chuỗi bạn sử dụng + +103 +00:08:25,550 --> 00:08:26,210 +ở đây. + +104 +00:08:26,210 --> 00:08:28,820 +Nó phải khớp với tên của cột. + +105 +00:08:28,820 --> 00:08:29,870 +Chính xác. + +106 +00:08:30,260 --> 00:08:38,419 +Một cách khác mà bạn có thể làm việc với các cột chỉ đơn giản là gọi điều kiện dấu chấm dữ liệu. Và thực tế là mã này + +107 +00:08:38,419 --> 00:08:46,070 +hoàn toàn hợp lệ có nghĩa là Pandas đằng sau hậu trường đã lấy từng cột và từng tiêu đề này rồi chuyển đổi + +108 +00:08:46,070 --> 00:08:52,130 +các tiêu đề đó thành thuộc tính để chúng ta có thể nói dữ liệu, điều kiện điểm hoặc + +109 +00:08:52,130 --> 00:08:53,450 +ngày dữ liệu. + +110 +00:08:53,450 --> 00:09:01,310 +Và nếu tôi in nó ra, bạn có thể thấy nó thực sự giống hệt như làm như thế này. + +111 +00:09:02,000 --> 00:09:06,920 +Vì vậy, bạn muốn sử dụng phương pháp nào để chọn các cột là tùy thuộc vào bạn. + +112 +00:09:06,920 --> 00:09:15,350 +Nhưng hãy lưu ý rằng nếu tên cột của bạn có chữ C viết hoa chẳng hạn ở đây thì khóa của bạn phải là chữ C viết + +113 +00:09:15,350 --> 00:09:19,640 +hoa và thuộc tính của bạn cũng phải là chữ C viết hoa. + +114 +00:09:20,150 --> 00:09:26,360 +Vì vậy, rất hiệu quả khi bạn sử dụng khung dữ liệu như thế này, gần giống như bạn đang coi nó như một + +115 +00:09:26,360 --> 00:09:29,190 +từ điển và bạn đang kéo từng cột bằng phím. + +116 +00:09:29,270 --> 00:09:33,950 +Bây giờ, khi bạn đang sử dụng khung dữ liệu như thế này, thì bạn đang coi nó giống một đối tượng hơn. + +117 +00:09:33,950 --> 00:09:39,200 +Bạn đang nói thuộc tính dấu chấm dữ liệu và bạn nắm giữ dữ liệu trong cột đó. + +118 +00:09:39,320 --> 00:09:45,200 +Vì vậy, tôi sẽ khôi phục mọi thứ về chữ thường vì tôi thấy việc đọc mã dễ dàng hơn. + +119 +00:09:45,290 --> 00:09:50,570 +Nhưng điều tiếp theo tôi muốn cho bạn thấy khó hơn một chút, đó là làm cách nào để bạn có được dữ liệu nằm trong + +120 +00:09:50,570 --> 00:09:52,870 +các hàng trong khung dữ liệu của chúng tôi? + +121 +00:09:52,880 --> 00:10:01,550 +Nếu tôi muốn giữ toàn bộ hàng dữ liệu trong đó ngày bằng Thứ Hai, thì cách tôi làm điều đó trong Pandas + +122 +00:10:01,550 --> 00:10:08,220 +trước tiên là lấy toàn bộ bảng dữ liệu của mình rồi bên trong bảng dữ liệu đó, + +123 +00:10:08,220 --> 00:10:11,870 +hãy giữ cột mà tôi muốn tìm kiếm. + +124 +00:10:11,880 --> 00:10:19,440 +Vì vậy, tôi sẽ tìm kiếm trong cột ngày để có thể sử dụng dữ liệu ngày dấu chấm hoặc ngày dữ liệu trong ngoặc vuông. + +125 +00:10:19,440 --> 00:10:26,970 +Cả hai sẽ hoạt động giống nhau, nhưng khi tôi đã có cột, thì tôi có thể nói, Chà, bên + +126 +00:10:26,970 --> 00:10:33,180 +trong cột đó tôi muốn kiểm tra hàng có giá trị bằng Thứ Hai ở đâu. + +127 +00:10:33,450 --> 00:10:37,200 +Về cơ bản, điều này sẽ trả về hàng mà tôi muốn. + +128 +00:10:37,230 --> 00:10:43,590 +Vì vậy, tôi sẽ in cái này ra và tôi sẽ nhận xét tất cả mã trước đó ngoại trừ nơi chúng tôi đã + +129 +00:10:43,590 --> 00:10:45,720 +tạo khung dữ liệu của mình. + +130 +00:10:45,720 --> 00:10:53,460 +Và sau đó tôi sẽ chạy mã của mình và bạn có thể thấy nó được kéo ra đúng hàng nơi ngày bằng + +131 +00:10:53,460 --> 00:10:54,570 +Thứ Hai. + +132 +00:10:54,570 --> 00:10:57,960 +Và nó cung cấp cho tôi tất cả dữ liệu còn lại của hàng đó. + +133 +00:10:58,740 --> 00:11:00,540 +Vì vậy, đây là một thách thức dành cho bạn. + +134 +00:11:00,570 --> 00:11:08,070 +Bạn có thể tìm ra cách lấy hàng dữ liệu từ dữ liệu thời tiết của chúng tôi nơi nhiệt độ ở mức tối + +135 +00:11:08,070 --> 00:11:09,000 +đa không? + +136 +00:11:09,000 --> 00:11:12,690 +Vậy dòng dữ liệu nào có nhiệt độ cao nhất trong tuần? + +137 +00:11:12,720 --> 00:11:14,820 +Hãy tạm dừng video và thử xem. + +138 +00:11:15,960 --> 00:11:22,620 +Vì vậy, chúng tôi biết rằng chúng tôi có thể nhận được nhiệt độ tối đa trong cột nhiệt độ chỉ bằng cách sử dụng mã này. + +139 +00:11:22,650 --> 00:11:28,830 +Bây giờ, bạn có thể sử dụng phương pháp này trong đó bạn nói tạm thời dấu ngoặc vuông dữ liệu hoặc bạn có thể sử dụng thuộc + +140 +00:11:29,070 --> 00:11:31,140 +tính tạm thời, đây là mã mà tôi thích. + +141 +00:11:31,170 --> 00:11:34,020 +Tôi không thích viết nhiều chuỗi nếu tôi có thể tránh được. + +142 +00:11:34,140 --> 00:11:44,010 +Trong trường hợp này, chúng ta đang kiểm tra xem hàng nào trong cột nhiệt độ bằng nhiệt độ + +143 +00:11:44,040 --> 00:11:44,880 +tối đa. + +144 +00:11:45,150 --> 00:11:51,630 +Chúng tôi sẽ nói rằng dữ liệu dot temp gấp đôi bằng dữ liệu dot temp dot max. + +145 +00:11:51,630 --> 00:11:57,930 +Và sau đó chúng ta sẽ lấy dữ liệu của mình và truy cập vào hàng phù hợp với tiêu chí đó. + +146 +00:11:58,080 --> 00:12:04,950 +Bây giờ, nếu tôi in ra hàng này, thì bạn có thể thấy đó là hàng dành cho Chủ nhật với + +147 +00:12:04,950 --> 00:12:07,470 +nhiệt độ là 24 và trời nắng. + +148 +00:12:07,890 --> 00:12:13,950 +Về cơ bản, khi chúng tôi lấy khung dữ liệu và sau đó chúng tôi sử dụng một số dấu ngoặc vuông và bên trong các + +149 +00:12:13,950 --> 00:12:19,990 +dấu ngoặc vuông đó, nếu chúng tôi chỉ đặt tên của cột nhiệt độ hoặc điều kiện thì chúng tôi sẽ nhận được toàn + +150 +00:12:19,990 --> 00:12:20,710 +bộ cột. + +151 +00:12:20,770 --> 00:12:28,360 +Nhưng nếu chúng ta lọc cột đó theo một điều kiện, chẳng hạn như khi một cột cụ thể bằng một giá trị cụ + +152 +00:12:28,360 --> 00:12:32,320 +thể, thì thay vào đó chúng ta thực sự giữ được hàng. + +153 +00:12:32,350 --> 00:12:38,260 +Bây giờ, khi bạn đã nắm được dữ liệu trong hàng, bạn thực sự có thể tiến thêm một bước nữa vì chúng ta biết + +154 +00:12:38,260 --> 00:12:41,300 +rằng hàng đó chứa rất nhiều dữ liệu, phải không? + +155 +00:12:41,320 --> 00:12:47,650 +Điều gì sẽ xảy ra nếu chúng ta muốn nhiệt độ của hàng cụ thể đó hoặc tình trạng của hàng cụ thể đó? + +156 +00:12:47,680 --> 00:12:53,620 +Vâng, giả sử chúng ta tạo một biến có tên Thứ Hai, bằng với khung dữ liệu của chúng + +157 +00:12:53,620 --> 00:13:00,100 +ta, sau đó tìm kiếm trong khung dữ liệu đó trong đó ngày chấm dữ liệu bằng Thứ Hai. + +158 +00:13:00,280 --> 00:13:08,920 +Vì vậy, bây giờ với hàng Thứ Hai này, chúng ta có thể khai thác các giá trị dưới các cột khác nhau bằng cách sử dụng cùng + +159 +00:13:08,920 --> 00:13:12,970 +một cách mà chúng ta lấy dữ liệu trong toàn bộ cột ở đây. + +160 +00:13:12,970 --> 00:13:18,250 +Vì vậy, chúng ta có thể nói điều kiện chấm thứ hai và nếu tôi in nó ra. + +161 +00:13:18,790 --> 00:13:21,490 +Và chỉ cần bình luận những bit khác. + +162 +00:13:23,720 --> 00:13:30,170 +Sau đó, bạn có thể thấy rằng tôi có được điều kiện thực tế cho ngày cụ thể đó, trời nắng. + +163 +00:13:30,200 --> 00:13:31,760 +Bây giờ, đây là một thử thách. + +164 +00:13:31,760 --> 00:13:38,540 +Tôi muốn bạn biết nhiệt độ của ngày thứ Hai, nhưng vì nhiệt độ của tôi tính bằng độ C nên tôi muốn + +165 +00:13:38,540 --> 00:13:40,390 +bạn chuyển nó thành độ F. + +166 +00:13:40,400 --> 00:13:44,000 +Vì vậy hãy tạm dừng video và xem liệu bạn có thể hoàn thành thử thách đó hay không. + +167 +00:13:46,440 --> 00:13:46,800 +Được rồi. + +168 +00:13:46,800 --> 00:13:55,260 +Chúng ta biết rằng chúng ta có thể biết được nhiệt độ của ngày Thứ Hai bằng cách nói dấu chấm Thứ Hai và sau đó là + +169 +00:13:55,260 --> 00:13:58,650 +tên của cột đó trong hàng, tức là nhiệt độ. + +170 +00:13:58,680 --> 00:13:59,730 +Nhiệt độ. + +171 +00:14:00,390 --> 00:14:03,720 +Và sau đó chúng ta nhận được giá trị đầu tiên trong chuỗi ở chỉ số 0. + +172 +00:14:04,970 --> 00:14:11,840 +Và sau đó nếu chúng ta muốn đổi độ C sang độ F, tất cả những gì chúng ta phải làm + +173 +00:14:11,840 --> 00:14:15,230 +là nhân độ C với 9 trên 5 rồi cộng 32. + +174 +00:14:15,680 --> 00:14:24,380 +Vì vậy, nó sẽ là nhiệt độ thứ hai nhân với chín chia cho năm rồi cộng 32. + +175 +00:14:30,910 --> 00:14:35,140 +Vì vậy, thứ hai nhiệt độ F, và sau đó chúng ta có thể in giá trị này ra. + +176 +00:14:37,190 --> 00:14:40,670 +Vì vậy bây giờ khi tôi chạy nó, chúng tôi nhận được 53. 6. + +177 +00:14:40,790 --> 00:14:46,520 +Và nếu tôi đặt nhiệt độ ngày thứ Hai là 12 vào công cụ chuyển đổi Google này, tôi sẽ nhận được giá trị tương tự. + +178 +00:14:46,520 --> 00:14:48,170 +53. 6. + +179 +00:14:49,160 --> 00:14:55,910 +Bây giờ, điều cuối cùng tôi muốn chỉ cho bạn là cách bạn tạo khung dữ liệu từ đầu. + +180 +00:14:56,510 --> 00:15:01,730 +Vì vậy, trong trường hợp của chúng tôi, chúng tôi đã tạo khung dữ liệu bằng cách đọc từ tệp CSV của mình. + +181 +00:15:01,760 --> 00:15:07,790 +Nhưng điều gì sẽ xảy ra nếu bạn muốn tạo khung dữ liệu chỉ từ một số dữ liệu bạn đang tạo bằng Python? + +182 +00:15:08,060 --> 00:15:10,940 +Giả sử tôi có từ điển giá trị này. + +183 +00:15:10,940 --> 00:15:17,270 +Tôi có một số học sinh và đây là tên của họ được liệt kê trong một danh sách, sau đó mỗi người trong số họ có một điểm + +184 +00:15:17,270 --> 00:15:19,490 +và điểm tương ứng với các học sinh đó. + +185 +00:15:19,490 --> 00:15:21,650 +Vậy 76 là số điểm của Amy. + +186 +00:15:21,680 --> 00:15:24,950 +James ghi được 56 và Angela ghi được 65. + +187 +00:15:24,980 --> 00:15:29,330 +Bây giờ, làm cách nào để tạo khung dữ liệu từ từ điển này? + +188 +00:15:29,450 --> 00:15:30,860 +Nó thực sự đơn giản. + +189 +00:15:30,890 --> 00:15:38,240 +Chúng tôi gọi thư viện Pandas của mình và lấy lớp khung dữ liệu, sau đó chúng tôi khởi tạo lớp đó với + +190 +00:15:38,240 --> 00:15:39,650 +một số dữ liệu. + +191 +00:15:39,650 --> 00:15:44,230 +Và dữ liệu trong trường hợp của chúng tôi sẽ là từ điển dữ liệu của chúng tôi. + +192 +00:15:44,240 --> 00:15:51,000 +Và bây giờ nếu tôi tiếp tục và lưu dữ liệu này làm dữ liệu của mình, tôi sẽ nhận xét những gì chúng tôi có + +193 +00:15:51,000 --> 00:15:53,460 +trước đó và sau đó in ra dữ liệu này. + +194 +00:15:54,120 --> 00:15:59,220 +Sau đó, bạn có thể thấy tôi đã tạo một bảng bằng cách sử dụng các giá trị từ từ điển đó. + +195 +00:15:59,250 --> 00:16:01,830 +Bây giờ chúng ta có thể đi xa hơn thế này. + +196 +00:16:01,950 --> 00:16:09,690 +Khi chúng tôi đã tạo khung dữ liệu, chúng tôi thực sự có thể chuyển đổi khung dữ liệu đó thành tệp CSV. + +197 +00:16:09,690 --> 00:16:17,760 +Và phương thức chuyển sang CSV này chỉ yêu cầu một đầu vào bắt buộc, đó là đường dẫn mà bạn muốn lưu tệp + +198 +00:16:17,760 --> 00:16:18,270 +này. + +199 +00:16:18,270 --> 00:16:24,750 +Vì vậy, hãy tạo một tệp mới mà chúng tôi sẽ gọi là CSV chấm dữ liệu mới. + +200 +00:16:25,170 --> 00:16:33,060 +Và khi tôi chạy mã này thì hãy xem ở đây, bạn sẽ thấy một tệp CSV mới được tạo từ không khí và tất cả dữ liệu + +201 +00:16:33,060 --> 00:16:36,600 +của chúng tôi đã được thêm vào tệp CSV đó. + +202 +00:16:37,650 --> 00:16:43,530 +Vì vậy chúng ta chỉ mới biết được sức mạnh của thư viện gấu trúc này. + +203 +00:16:43,530 --> 00:16:52,020 +Và chúng tôi thực sự chỉ sử dụng nó để đọc dữ liệu CSV và ghi dữ liệu CSV, đây là một định dạng phổ biến mà bạn sẽ thấy + +204 +00:16:52,020 --> 00:16:56,100 +khi thao tác bằng Python trong các bài học sau. + +205 +00:16:56,100 --> 00:17:00,780 +Chúng ta sẽ đi sâu hơn vào phân tích dữ liệu và chúng ta sẽ không chỉ xem + +206 +00:17:00,780 --> 00:17:06,810 +xét Pandas mà còn xem xét NumPy, Matplotlib và các thư viện khác giúp chúng ta làm việc với + +207 +00:17:06,810 --> 00:17:09,150 +khối lớn dễ dàng hơn Dữ liệu. + +208 +00:17:09,630 --> 00:17:15,119 +Trong bài học tiếp theo, chúng ta sẽ áp dụng những gì đã học vào việc phân tích một số dữ liệu về + +209 +00:17:15,119 --> 00:17:16,859 +sóc từ Công viên Trung tâm. + +210 +00:17:16,859 --> 00:17:20,160 +Vì vậy, với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 2018-Central-Park-Squirrel-Census-Squirrel-Data.csv b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 2018-Central-Park-Squirrel-Census-Squirrel-Data.csv new file mode 100644 index 0000000000000000000000000000000000000000..e4c826f7a01c85a5c64d296dcfd837c01dec37f4 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 2018-Central-Park-Squirrel-Census-Squirrel-Data.csv @@ -0,0 +1,3024 @@ +X,Y,Unique Squirrel ID,Hectare,Shift,Date,Hectare Squirrel Number,Age,Primary Fur Color,Highlight Fur Color,Combination of Primary and Highlight Color,Color notes,Location,Above Ground Sighter Measurement,Specific Location,Running,Chasing,Climbing,Eating,Foraging,Other Activities,Kuks,Quaas,Moans,Tail flags,Tail twitches,Approaches,Indifferent,Runs from,Other Interactions,Lat/Long +-73.9561344937861,40.7940823884086,37F-PM-1014-03,37F,PM,10142018,3,,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9561344937861 40.7940823884086) +-73.9570437717691,40.7948509408039,37E-PM-1006-03,37E,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,me,POINT (-73.9570437717691 40.794850940803904) +-73.9768311751004,40.7667178072558,2E-AM-1010-03,02E,AM,10102018,3,Adult,Cinnamon,,Cinnamon+,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9768311751004 40.76671780725581) +-73.9757249834141,40.7697032606755,5D-PM-1018-05,05D,PM,10182018,5,Juvenile,Gray,,Gray+,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9757249834141 40.7697032606755) +-73.9593126695714,40.797533370163,39B-AM-1018-01,39B,AM,10182018,1,,,,+,,Above Ground,,,false,false,false,false,false,unknown,true,false,false,false,false,false,false,false,,POINT (-73.9593126695714 40.797533370163) +-73.9565700386162,40.7902561000937,33H-AM-1019-02,33H,AM,10192018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,wrestling with mother,false,false,false,false,false,false,false,false,,POINT (-73.9565700386162 40.7902561000937) +-73.9719735582476,40.7693045133578,6G-PM-1020-02,06G,PM,10202018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9719735582476 40.7693045133578) +-73.9602609920814,40.7942883045566,35C-PM-1013-03,35C,PM,10132018,3,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9602609920814 40.79428830455661) +-73.9770718586754,40.7729752391435,7B-AM-1008-09,07B,AM,10082018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9770718586754 40.7729752391435) +-73.9596413903948,40.7903128889029,32E-PM-1017-14,32E,PM,10172018,14,Adult,Gray,,Gray+,Nothing selected as Primary. Gray selected as Highlights. Made executive adjustments.,,,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9596413903948 40.7903128889029) +-73.9702676472613,40.7762126854894,13E-AM-1017-05,13E,AM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,on tree stump,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9702676472613 40.7762126854894) +-73.9683613516225,40.7725908847499,11H-AM-1010-03,11H,AM,10102018,3,Adult,Cinnamon,White,Cinnamon+White,,,,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9683613516225 40.7725908847499) +-73.9541201789795,40.7931811701082,36H-AM-1010-02,36H,AM,10102018,2,Adult,Gray,,Gray+,just outside hectare,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9541201789795 40.7931811701082) +-73.9582694312289,40.7917367820255,33F-AM-1008-02,33F,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9582694312289 40.7917367820255) +-73.9674285955293,40.7829723919744,21C-PM-1006-01,21C,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,true,true,false,false,false,,POINT (-73.9674285955293 40.7829723919744) +-73.9722500196844,40.7742879599026,11D-AM-1010-03,11D,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,30,,false,false,true,false,false,grooming,false,false,false,false,false,false,true,false,,POINT (-73.9722500196844 40.7742879599026) +-73.9695063535333,40.7823507678183,20B-PM-1013-05,20B,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9695063535333 40.7823507678183) +-73.9532170504865,40.7919669739962,36I-PM-1007-01,36I,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9532170504865 40.7919669739962) +-73.9768603630674,40.7702795904962,5C-PM-1010-09,05C,PM,10102018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9768603630674 40.7702795904962) +-73.9706105896967,40.7698124821507,7H-AM-1006-05,07H,AM,10062018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9706105896967 40.7698124821507) +-73.9703781726172,40.7787526130321,16C-PM-1018-03,16C,PM,10182018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,6,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9703781726172 40.7787526130321) +-73.9703925210471,40.7765032004992,14E-AM-1008-23,14E,AM,10082018,23,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,false,false,true,false,,POINT (-73.9703925210471 40.7765032004992) +-73.9638179439747,40.7924173263904,32A-PM-1013-03,32A,PM,10132018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9638179439747 40.7924173263904) +-73.9584070974734,40.7913812490557,33F-AM-1008-01,33F,AM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,moving slowly,false,false,false,false,false,false,true,false,,POINT (-73.9584070974734 40.7913812490557) +-73.9671130680114,40.7784859700171,17F-AM-1007-07,17F,AM,10072018,7,Adult,Gray,White,Gray+White,,Above Ground,24,,true,false,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9671130680114 40.7784859700171) +-73.9649866016038,40.7764929694457,16I-AM-1008-01,16I,AM,10082018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9649866016038 40.7764929694457) +-73.9670628558161,40.7734991420941,12I-AM-1013-01,12I,AM,10132018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,on tree roots,false,false,false,false,false,sitting,false,false,false,false,true,false,false,true,,POINT (-73.9670628558161 40.77349914209411) +-73.958736593111,40.7908524370626,32F-PM-1008-07,32F,PM,10082018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.958736593111 40.7908524370626) +-73.9671786715256,40.7867352791232,25A-AM-1013-04,25A,AM,10132018,4,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9671786715256 40.7867352791232) +-73.9692943291611,40.7769536102488,15E-AM-1013-01,15E,AM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9692943291611 40.7769536102488) +-73.9540054100539,40.7952445999836,39G-PM-1013-06,39G,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9540054100539 40.7952445999836) +-73.9576530157255,40.7868659490397,29I-PM-1007-01,29I,PM,10072018,1,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9576530157255 40.7868659490397) +-73.9738033257473,40.7711846894166,7E-AM-1006-02,07E,AM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,under a tree,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9738033257473 40.7711846894166) +-73.9704402681017,40.7798965621203,17C-PM-1013-05,17C,PM,10132018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,eating (ate upside down on a tree — #jealous),false,false,false,false,false,false,true,false,,POINT (-73.9704402681017 40.77989656212031) +-73.9756976076707,40.7753897331918,10A-PM-1014-01,10A,PM,10142018,1,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",Gray & White selected as Primary. Black & Cinnamon selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,in b/w trees,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9756976076707 40.7753897331918) +-73.9662438996681,40.7890381809441,28A-PM-1007-05,28A,PM,10072018,5,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9662438996681 40.7890381809441) +-73.9643153920428,40.7820818516957,22F-PM-1014-05,22F,PM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9643153920428 40.7820818516957) +-73.9742073452913,40.7757957380463,12B-AM-1007-01,12B,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9742073452913 40.7757957380463) +-73.9716147061553,40.7813911036179,18A-PM-1018-01,18A,PM,10182018,1,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9716147061553 40.7813911036179) +-73.9535410657077,40.7928711760061,36H-PM-1008-02,36H,PM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9535410657077 40.79287117600611) +-73.9639159298446,40.7891774637988,29C-AM-1007-06,29C,AM,10072018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9639159298446 40.7891774637988) +-73.9579564338627,40.7959337795027,38C-PM-1014-09,38C,PM,10142018,9,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9579564338627 40.7959337795027) +-73.9574648097543,40.7892508428622,31H-PM-1008-02,31H,PM,10082018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,,true,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9574648097543 40.78925084286221) +-73.970252675331,40.7705999588222,8H-AM-1017-06,08H,AM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,,false,true,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.970252675331 40.77059995882221) +-73.9579645940414,40.7918613498407,34F-AM-1007-01,34F,AM,10072018,1,Adult,Gray,White,Gray+White,,Above Ground,25,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9579645940414 40.7918613498407) +-73.9673253417305,40.7749505252981,13H-PM-1010-02,13H,PM,10102018,2,Adult,Gray,,Gray+,,Above Ground,5,tree,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9673253417305 40.7749505252981) +-73.9640032826529,40.7820309825448,22F-PM-1014-06,22F,PM,10142018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9640032826529 40.7820309825448) +-73.9595933195409,40.7905847332369,32E-AM-1007-13,32E,AM,10072018,13,Adult,Gray,,Gray+,,Above Ground,50,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9595933195409 40.7905847332369) +-73.9602222116708,40.793779699421,35C-AM-1007-05,35C,AM,10072018,5,Adult,Gray,,Gray+,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9602222116708 40.793779699421) +-73.9680635070949,40.779249873647,17E-AM-1017-05,17E,AM,10172018,5,Adult,Black,,Black+,,Above Ground,10,Branch,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9680635070949 40.779249873647) +-73.9801666435401,40.7686905339212,2B-PM-1013-01,02B,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,running (with nut),false,false,false,false,false,false,false,false,,POINT (-73.9801666435401 40.7686905339212) +-73.9675634326877,40.7813477352507,19D-AM-1007-01,19D,AM,10072018,1,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,false,false,fenced off area can't approach,POINT (-73.9675634326877 40.7813477352507) +-73.9584970643213,40.7982886348696,40B-AM-1019-03,40B,AM,10192018,3,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,true,true,false,false,,POINT (-73.9584970643213 40.7982886348696) +-73.9760298241178,40.7681954366911,3E-PM-1008-07,03E,PM,10082018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9760298241178 40.7681954366911) +-73.9568802149818,40.7972399133816,39C-PM-1006-01,39C,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9568802149818 40.7972399133816) +-73.9724642436394,40.7690526441109,6G-AM-1008-02,06G,AM,10082018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,bush,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9724642436394 40.7690526441109) +-73.9690175838534,40.7760432720017,14F-AM-1007-05,14F,AM,10072018,5,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9690175838534 40.7760432720017) +-73.9704082821356,40.7690280985956,6I-PM-1013-06,06I,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,playing with #5,false,false,false,false,true,false,false,false,,POINT (-73.9704082821356 40.7690280985956) +-73.9684910712272,40.7768811640021,15F-PM-1010-05,15F,PM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9684910712272 40.7768811640021) +-73.9768674812942,40.7735232648872,8B-PM-1012-02,08B,PM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,hiding in bushes,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9768674812942 40.7735232648872) +-73.9797084866613,40.7698885241349,3A-PM-1017-06,03A,PM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9797084866613 40.7698885241349) +-73.952819267977,40.7923130402793,36I-AM-1017-02,36I,AM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon stripe on back,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.952819267977 40.7923130402793) +-73.9745630038492,40.7692602628745,5E-AM-1008-06,05E,AM,10082018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9745630038492 40.7692602628745) +-73.9595002339508,40.7903365788694,32E-PM-1017-13,32E,PM,10172018,13,Adult,Gray,,Gray+,Nothing selected as Primary. Gray selected as Highlights. Made executive adjustments.,,,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9595002339508 40.7903365788694) +-73.9741824992294,40.7689486657963,5F-PM-1007-03,05F,PM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,hiding nut,false,false,false,false,true,false,true,false,,POINT (-73.9741824992294 40.7689486657963) +-73.9749243901189,40.7761393551781,11B-PM-1014-05,11B,PM,10142018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9749243901189 40.7761393551781) +-73.968381325559,40.7780143443779,16E-PM-1018-06,16E,PM,10182018,6,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,On a rock,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.968381325559 40.7780143443779) +-73.9694240327509,40.7755898126674,13F-AM-1007-02,13F,AM,10072018,2,Adult,Cinnamon,White,Cinnamon+White,,,,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.96942403275091 40.7755898126674) +-73.9689000978955,40.7828364735236,20B-PM-1013-10,20B,PM,10132018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,drank from a pond of rain water,false,false,false,false,false,false,true,false,,POINT (-73.9689000978955 40.7828364735236) +-73.9804528867547,40.7696753655986,3A-PM-1017-05,03A,PM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9804528867547 40.76967536559861) +-73.9576245992455,40.7873862510001,29H-PM-1006-01,29H,PM,10062018,1,Adult,Gray,,Gray+,,Above Ground,50,,false,false,true,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9576245992455 40.7873862510001) +-73.9666007935638,40.7845098131567,23C-PM-1014-03,23C,PM,10142018,3,Adult,Gray,,Gray+,,Above Ground,8,,false,true,false,false,false,chasing (#4 across trees),false,false,false,false,false,false,false,false,,POINT (-73.9666007935638 40.7845098131567) +-73.96148483609,40.7922645521905,33C-PM-1007-03,33C,PM,10072018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.96148483609 40.7922645521905) +-73.9546654184146,40.7947639241491,38G-PM-1020-09,38G,PM,10202018,9,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,true,false,false,true,false,,POINT (-73.9546654184146 40.7947639241491) +-73.9667114027214,40.7768804702473,16G-PM-1017-01,16G,PM,10172018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9667114027214 40.7768804702473) +-73.9530035564643,40.7921822457613,36I-PM-1007-07,36I,PM,10072018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9530035564643 40.7921822457613) +-73.9615696577673,40.7951278622399,35A-AM-1014-03,35A,AM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9615696577673 40.7951278622399) +-73.964474836001,40.7883840104749,28C-PM-1006-01,28C,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,gathering acorns,false,false,false,true,false,false,false,true,gnd to tree,POINT (-73.964474836001 40.7883840104749) +-73.9610705592868,40.7914829661051,32D-AM-1013-06,32D,AM,10132018,6,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,true,true,"eating (a mushroom),circles around us,really fat,scratching himself,grooming activity",false,false,false,false,true,true,false,false,,POINT (-73.9610705592868 40.7914829661051) +-73.9688454483585,40.7845301288163,22A-AM-1008-05,22A,AM,10082018,5,Adult,Gray,White,Gray+White,,Above Ground,3,trash can,false,false,false,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.9688454483585 40.7845301288163) +-73.9578237168359,40.7980959471034,40B-PM-1014-06,40B,PM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9578237168359 40.7980959471034) +-73.9688271202401,40.7809719445309,19C-PM-1018-01,19C,PM,10182018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9688271202401 40.7809719445309) +-73.9617088749928,40.7944585082367,35A-PM-1013-06,35A,PM,10132018,6,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9617088749928 40.7944585082367) +-73.9701824825872,40.7766530579293,14E-AM-1008-09,14E,AM,10082018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,true,false,false,false,false,false,false,true,,POINT (-73.9701824825872 40.7766530579293) +-73.9676410497481,40.7766043512974,15G-PM-1019-05,15G,PM,10192018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9676410497481 40.7766043512974) +-73.9708726050721,40.7723572030236,10F-AM-1007-02,10F,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,70,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9708726050721 40.7723572030236) +-73.9541453465817,40.7982162223764,42E-PM-1012-06,42E,PM,10122018,6,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9541453465817 40.79821622237641) +-73.9683608295976,40.7842927405327,22B-AM-1013-04,22B,AM,10132018,4,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,Under bench,false,false,false,false,true,,false,false,false,false,false,false,false,true,ran from dog-walker,POINT (-73.9683608295976 40.7842927405327) +-73.968052057989,40.777338666528,15F-PM-1010-06,15F,PM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.968052057989 40.777338666528) +-73.9787180870736,40.7715877863274,5A-AM-1006-05,05A,AM,10062018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,near 65th St arch,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9787180870736 40.7715877863274) +-73.9565905868276,40.7895654068546,32H-PM-1006-01,32H,PM,10062018,1,,Gray,,Gray+,,Above Ground,,in the European Beech,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9565905868276 40.7895654068546) +-73.9565759733611,40.7992461674802,42C-AM-1007-02,42C,AM,10072018,2,,,,+,,,,,false,false,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9565759733611 40.7992461674802) +-73.9551539498306,40.7987384656256,41D-AM-1014-01,41D,AM,10142018,1,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9551539498306 40.7987384656256) +-73.9641971813967,40.7813537959435,21G-PM-1007-01,21G,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.9641971813967 40.7813537959435) +-73.9692883970928,40.7768553703082,14E-AM-1008-02,14E,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,walking,false,false,false,false,false,false,false,true,,POINT (-73.9692883970928 40.7768553703082) +-73.9708549670788,40.7699587019058,7H-PM-1006-04,07H,PM,10062018,4,Adult,Gray,,Gray+,,Above Ground,12,on tree knob,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9708549670788 40.7699587019058) +-73.9639744005647,40.7825111950764,22F-AM-1007-01,22F,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9639744005647 40.7825111950764) +-73.9730277911422,40.7712145488828,7F-AM-1008-16,07F,AM,10082018,16,Juvenile,Gray,,Gray+,,Above Ground,2,tree,false,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9730277911422 40.7712145488828) +-73.9710541405708,40.7724691605718,10F-PM-1019-05,10F,PM,10192018,5,Adult,Black,,Black+,,Above Ground,10,"Behind fence, tree",false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9710541405708 40.7724691605718) +-73.9761592532482,40.7747213585387,10A-AM-1006-04,10A,AM,10062018,4,Juvenile,Gray,,Gray+,,Above Ground,10,tree near large rock on Bridle Path,false,false,false,false,false,walking on branch,false,false,false,false,true,false,false,false,,POINT (-73.9761592532482 40.7747213585387) +-73.9544007658685,40.7950689723135,38F-PM-1013-05,38F,PM,10132018,5,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,"being chased,was pushed by other squirrel",true,true,false,false,false,false,false,false,,POINT (-73.9544007658685 40.7950689723135) +-73.9575986161364,40.799368134968,41B-PM-1014-01,41B,PM,10142018,1,Adult,Gray,White,Gray+White,,Above Ground,25,Climbing tree,false,false,true,false,false,climbing (tree),false,false,false,false,false,false,false,true,,POINT (-73.9575986161364 40.799368134968) +-73.9607701370443,40.7955418990855,36A-PM-1013-07,36A,PM,10132018,7,,Gray,,Gray+,,Ground Plane,FALSE,"""FIELD""",false,true,false,false,false,chasing #8,false,false,false,false,false,false,false,true,,POINT (-73.9607701370443 40.7955418990855) +-73.9764036522984,40.7705846185121,5C-AM-1006-05,05C,AM,10062018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9764036522984 40.7705846185121) +-73.9589249555235,40.7908193284981,32E-PM-1017-03,32E,PM,10172018,3,Adult,Gray,,Gray+,,Above Ground,2,bottom of tree,false,false,false,true,false,still,false,false,false,false,false,false,true,false,,POINT (-73.9589249555235 40.7908193284981) +-73.9634623418761,40.7917685404482,31A-PM-1017-04,31A,PM,10172018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9634623418761 40.7917685404482) +-73.9521110154872,40.7978449143313,42G-AM-1018-03,42G,AM,10182018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,stop to look at me—then ran,false,false,false,false,false,false,false,true,,POINT (-73.9521110154872 40.7978449143313) +-73.9574809028248,40.7950013620207,37D-PM-1014-04,37D,PM,10142018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,true,chasing (a chipmunk),false,false,false,false,false,false,false,true,,POINT (-73.9574809028248 40.7950013620207) +-73.967097592707,40.7854119342538,24B-AM-1013-01,24B,AM,10132018,1,,Gray,,Gray+,,Above Ground,50,,true,false,false,true,false,took nut to bury,false,false,false,false,true,false,false,true,,POINT (-73.967097592707 40.7854119342538) +-73.9711318790279,40.7701941550273,7G-AM-1010-02,07G,AM,10102018,2,Adult,Gray,,Gray+,,Above Ground,3,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9711318790279 40.7701941550273) +-73.9763243383771,40.7705409315703,5C-PM-1010-13,05C,PM,10102018,13,Adult,Gray,White,Gray+White,,Above Ground,20,way up a tree!,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9763243383771 40.7705409315703) +-73.9651754464439,40.7755181941559,15I-AM-1008-01,15I,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,7,tree,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9651754464439 40.7755181941559) +-73.9700100617602,40.7815739959357,19B-PM-1018-01,19B,PM,10182018,1,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Above Ground,20,,true,false,false,false,false,flying,false,false,false,false,false,false,false,false,,POINT (-73.9700100617602 40.7815739959357) +-73.971905618214,40.776238547063,13D-PM-1018-10,13D,PM,10182018,10,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.971905618214 40.776238547063) +-73.9530040923555,40.7922896176936,36I-PM-1007-10,36I,PM,10072018,10,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,stole (found?) an entire sandwich,false,false,false,false,false,false,true,false,,POINT (-73.9530040923555 40.7922896176936) +-73.9572093760529,40.7988487300216,41B-AM-1010-06,41B,AM,10102018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,6,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9572093760529 40.7988487300216) +-73.9607746337979,40.7939581069382,35B-AM-1010-01,35B,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,lawn,false,false,false,false,false,walking w/ something in mouth,false,false,false,false,false,false,true,false,,POINT (-73.9607746337979 40.793958106938206) +-73.9566346046453,40.7973923396512,40D-PM-1013-01,40D,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9566346046453 40.7973923396512) +-73.9592038887673,40.796382675378,38B-PM-1018-02,38B,PM,10182018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,burying nut,false,false,false,false,false,false,false,false,,POINT (-73.9592038887673 40.796382675378) +-73.9511118711108,40.7950813345902,40I-AM-1018-01,40I,AM,10182018,1,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,begging,false,false,false,false,false,false,false,false,,POINT (-73.9511118711108 40.7950813345902) +-73.9769939796382,40.7729537573035,7B-AM-1008-10,07B,AM,10082018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9769939796382 40.7729537573035) +-73.9712527809516,40.7763310392591,13D-AM-1014-08,13D,AM,10142018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Cinnamon selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9712527809516 40.7763310392591) +-73.9671147090087,40.7772624641112,16G-AM-1010-03,16G,AM,10102018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,was hanging out w/ #2 until i showed up,true,false,false,false,false,false,false,true,,POINT (-73.9671147090087 40.7772624641112) +-73.9588660250232,40.7982597947515,40A-AM-1010-03,40A,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,bottom of great hill,false,false,false,true,true,,false,false,false,true,false,false,true,true,dog chased,POINT (-73.9588660250232 40.7982597947515) +-73.9651601541795,40.7761841788025,15I-PM-1012-07,15I,PM,10122018,7,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9651601541795 40.7761841788025) +-73.9792155473689,40.7693711799946,3B-PM-1007-11,03B,PM,10072018,11,Adult,Gray,,Gray+,,Above Ground,5,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9792155473689 40.7693711799946) +-73.9664100504436,40.7828778892276,21D-AM-1008-02,21D,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9664100504436 40.7828778892276) +-73.9746229094643,40.7748467061969,10B-PM-1014-05,10B,PM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,false,avoided people,POINT (-73.9746229094643 40.7748467061969) +-73.9705092958892,40.7761092972965,13E-PM-1008-07,13E,PM,10082018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9705092958892 40.7761092972965) +-73.9581655949437,40.7997708190022,41A-PM-1007-06,41A,PM,10072018,6,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9581655949437 40.7997708190022) +-73.9755560786227,40.7662992317575,2F-AM-1006-05,02F,AM,10062018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,curious but shy,POINT (-73.9755560786227 40.7662992317575) +-73.9696433533986,40.7828208083804,20B-AM-1007-01,20B,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,quietly,false,false,false,false,false,false,true,false,,POINT (-73.9696433533986 40.7828208083804) +-73.9664711607022,40.787896428768,26A-PM-1006-06,26A,PM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Tree 90th left 90th & 89,false,false,true,false,false,,false,false,false,true,false,false,false,false,studying us looking for food,POINT (-73.9664711607022 40.787896428768) +-73.9575943815564,40.7933755266787,35E-PM-1006-07,35E,PM,10062018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,true,,POINT (-73.9575943815564 40.7933755266787) +-73.9694168118643,40.7728877377977,11G-PM-1013-01,11G,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,In the Woods/Brush,false,false,true,false,true,,false,false,false,false,false,false,false,true,watching me,POINT (-73.9694168118643 40.7728877377977) +-73.9528682507794,40.7925807808307,36I-PM-1007-13,36I,PM,10072018,13,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,true,false,false,,POINT (-73.9528682507794 40.7925807808307) +-73.9782417115139,40.7724665036447,7A-AM-1006-01,07A,AM,10062018,1,Adult,Gray,White,Gray+White,,Above Ground,10,in tree,false,false,false,false,true,,false,true,false,false,true,false,false,false,looked at us,POINT (-73.9782417115139 40.7724665036447) +-73.9721442939797,40.7700750802317,7G-PM-1018-03,07G,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9721442939797 40.7700750802317) +-73.969847380865,40.7769884612305,14E-AM-1008-05,14E,AM,10082018,5,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,false,nest building,false,false,false,false,false,false,true,false,,POINT (-73.969847380865 40.7769884612305) +-73.9768652785664,40.7684838168207,3D-PM-1010-03,03D,PM,10102018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.97686527856641 40.7684838168207) +-73.9590992841423,40.793758098573,35D-PM-1013-09,35D,PM,10132018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9590992841423 40.793758098573) +-73.9724063986771,40.7705711897977,7F-PM-1012-01,07F,PM,10122018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9724063986771 40.7705711897977) +-73.9661361310677,40.7787872561177,18G-PM-1013-01,18G,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,burying,false,false,false,false,false,false,false,true,,POINT (-73.9661361310677 40.7787872561177) +-73.9730750601212,40.7701304211944,6F-PM-1008-01,06F,PM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9730750601212 40.7701304211944) +-73.971970670614,40.7720868124544,9F-AM-1013-04,09F,AM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.971970670614 40.7720868124544) +-73.95621174551,40.7951044378207,38E-AM-1010-09,38E,AM,10102018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.95621174551 40.7951044378207) +-73.9564023626619,40.7905423546155,33G-AM-1013-02,33G,AM,10132018,2,Adult,Gray,,Gray+,,Above Ground,13,shelter in hole in tree,false,false,true,false,false,,false,false,false,false,false,false,true,true,,POINT (-73.9564023626619 40.7905423546155) +-73.9532620128307,40.7952475548048,39G-AM-1018-01,39G,AM,10182018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,dead (something ran over it),false,false,false,false,false,false,false,false,,POINT (-73.9532620128307 40.7952475548048) +-73.9576349321357,40.7904409912437,32G-PM-1013-03,32G,PM,10132018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,Cinnamon belly,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9576349321357 40.7904409912437) +-73.9763430829342,40.7686351097159,4D-PM-1008-11,04D,PM,10082018,11,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,3,on tree facing downward,false,true,false,false,false,chased #12,true,false,false,true,false,false,false,true,,POINT (-73.9763430829342 40.7686351097159) +-73.9714789136757,40.7694886645194,6H-AM-1008-01,06H,AM,10082018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9714789136757 40.7694886645194) +-73.9755133710665,40.7697883435981,5E-AM-1008-08,05E,AM,10082018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9755133710665 40.7697883435981) +-73.9702348982803,40.7773295419104,15D-PM-1017-01,15D,PM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9702348982803 40.7773295419104) +-73.9686056085297,40.7781658424866,16E-AM-1014-03,16E,AM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9686056085297 40.7781658424866) +-73.9522142360388,40.7949598486683,39H-PM-1013-02,39H,PM,10132018,2,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9522142360388 40.7949598486683) +-73.9576589997493,40.7972751877447,39C-PM-1006-02,39C,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,50,,false,false,true,false,false,,false,false,false,false,false,false,false,false,unaware of,POINT (-73.95765899974931 40.7972751877447) +-73.9637946878735,40.7915700446878,31A-AM-1010-04,31A,AM,10102018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9637946878735 40.7915700446878) +-73.9710991123992,40.7723889726647,9F-PM-1014-02,09F,PM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9710991123992 40.7723889726647) +-73.9638270331336,40.7810450065235,21G-PM-1007-02,21G,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.9638270331336 40.7810450065235) +-73.9756015005821,40.7670090327736,2F-AM-1006-01,02F,AM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,walking along path,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.97560150058212 40.7670090327736) +-73.9649632550828,40.7809187761995,20F-PM-1007-01,20F,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,cinnamon tail,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9649632550828 40.7809187761995) +-73.957219204335,40.7931529059779,35E-PM-1006-01,35E,PM,10062018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,looking/begging for food,POINT (-73.957219204335 40.7931529059779) +-73.9712308864394,40.7714534847379,9G-AM-1007-04,09G,AM,10072018,4,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,false,false,false,grooming,false,false,false,false,false,false,true,false,,POINT (-73.9712308864394 40.7714534847379) +-73.9758676144255,40.7701671581939,5D-PM-1018-03,05D,PM,10182018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9758676144255 40.7701671581939) +-73.969058856545,40.7766356226979,14F-PM-1012-06,14F,PM,10122018,6,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.969058856545 40.7766356226979) +-73.963846339804,40.7834051716226,23F-AM-1018-01,23F,AM,10182018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.963846339804 40.7834051716226) +-73.9597642778427,40.7976368003915,39A-PM-1014-02,39A,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9597642778427 40.7976368003915) +-73.9745691353018,40.7771035589298,13A-PM-1014-03,13A,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,,false,false,true,false,false,,false,false,false,false,false,false,false,true,child chasing,POINT (-73.9745691353018 40.7771035589298) +-73.9748706415584,40.7744174965072,10B-AM-1006-02,10B,AM,10062018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,High in a tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9748706415584 40.7744174965072) +-73.9597205966324,40.7969409510133,38B-AM-1019-01,38B,AM,10192018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9597205966324 40.7969409510133) +-73.971086588091,40.7719703235178,9G-PM-1007-06,09G,PM,10072018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.971086588091 40.7719703235178) +-73.958535640774,40.7982737896998,40B-AM-1019-02,40B,AM,10192018,2,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.958535640774 40.7982737896998) +-73.958770180151,40.7934123941528,35D-PM-1013-04,35D,PM,10132018,4,Juvenile,Gray,White,Gray+White,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.958770180151 40.7934123941528) +-73.9707274055755,40.7723889080377,10G-PM-1017-10,10G,PM,10172018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,playing (with #9),false,false,false,false,false,false,true,false,,POINT (-73.9707274055755 40.7723889080377) +-73.9720065066618,40.7764043782924,13C-AM-1010-04,13C,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9720065066618 40.7764043782924) +-73.9618064639153,40.792158440043,32C-PM-1013-12,32C,PM,10132018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,true,false,false,,POINT (-73.9618064639153 40.792158440043) +-73.9554432393295,40.7945669054449,37F-PM-1014-01,37F,PM,10142018,1,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9554432393295 40.7945669054449) +-73.9613780522542,40.790786197111,31D-PM-1006-04,31D,PM,10062018,4,Adult,Gray,,Gray+,,Above Ground,30,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9613780522542 40.790786197111) +-73.9646901432328,40.775995869679,15I-PM-1012-03,15I,PM,10122018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9646901432328 40.775995869679) +-73.9690828325179,40.7818038172275,19C-PM-1018-04,19C,PM,10182018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9690828325179 40.7818038172275) +-73.9708775864433,40.772473633538,10F-PM-1019-12,10F,PM,10192018,12,Adult,Black,White,Black+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9708775864433 40.772473633538) +-73.9691050656013,40.7808139538222,18C-PM-1018-01,18C,PM,10182018,1,,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9691050656013 40.7808139538222) +-73.9768434635084,40.7728494038744,7B-AM-1008-11,07B,AM,10082018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9768434635084 40.7728494038744) +-73.9553811810434,40.7970895007931,40E-AM-1014-02,40E,AM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9553811810434 40.7970895007931) +-73.9588468413094,40.7963852299012,38B-AM-1019-05,38B,AM,10192018,5,Adult,Gray,,Gray+,,Above Ground,28,,false,false,true,false,false,sitting still,false,true,false,false,false,false,false,false,,POINT (-73.9588468413094 40.7963852299012) +-73.9788138172962,40.7693001754769,3B-AM-1010-09,03B,AM,10102018,9,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9788138172962 40.7693001754769) +-73.9700162034073,40.7815277479588,19B-AM-1019-02,19B,AM,10192018,2,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,false,posing,false,false,false,false,false,false,true,true,indifferent then runs from,POINT (-73.9700162034073 40.7815277479588) +-73.9570528770427,40.7990973804149,41B-AM-1010-07,41B,AM,10102018,7,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,10,,false,false,false,false,false,,true,false,false,true,false,true,false,false,mad!,POINT (-73.9570528770427 40.7990973804149) +-73.9735489537928,40.7681257911523,4G-AM-1006-02,04G,AM,10062018,2,,Gray,White,Gray+White,,Above Ground,12,tree,false,false,false,false,false,sitting in tree,false,false,false,false,false,false,true,false,,POINT (-73.9735489537928 40.7681257911523) +-73.9695507965155,40.7743070423435,12F-PM-1007-04,12F,PM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,stared,POINT (-73.96955079651552 40.7743070423435) +-73.9787105069657,40.7693708133873,3B-AM-1010-08,03B,AM,10102018,8,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,together w/ #7,false,false,false,false,false,false,true,false,,POINT (-73.9787105069657 40.7693708133873) +-73.9651654887991,40.7777806006951,17H-PM-1007-02,17H,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9651654887991 40.7777806006951) +-73.9537691298752,40.7941272599797,38G-PM-1020-01,38G,PM,10202018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9537691298752 40.7941272599797) +-73.9764839973068,40.7691725326976,4D-PM-1008-06,04D,PM,10082018,6,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9764839973068 40.7691725326976) +-73.9737773613311,40.7673662611015,3G-PM-1013-01,03G,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9737773613311 40.7673662611015) +-73.965796978969,40.7760402842845,15H-PM-1008-03,15H,PM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,lawn moving east over Park path,false,false,false,false,false,not sure walk-pause-walk,false,false,false,false,false,false,true,false,,POINT (-73.96579697896901 40.7760402842845) +-73.9679336341793,40.7754186579647,14G-PM-1013-01,14G,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,watching,POINT (-73.9679336341793 40.7754186579647) +-73.9761107065353,40.769642060286,5D-AM-1020-01,05D,AM,10202018,1,Adult,,,+,Too far & cloudy to tell,Above Ground,30,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9761107065353 40.769642060286) +-73.9771614686616,40.7709677983247,5C-AM-1006-02,05C,AM,10062018,2,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,10,,true,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9771614686616 40.7709677983247) +-73.9510747586301,40.7973106833951,42H-AM-1019-02,42H,AM,10192018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9510747586301 40.7973106833951) +-73.9598015842806,40.7973522744237,38A-PM-1013-03,38A,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9598015842806 40.7973522744237) +-73.9718729101676,40.7703692621371,7G-PM-1018-05,07G,PM,10182018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9718729101676 40.7703692621371) +-73.9638774579549,40.7913532129148,31A-AM-1010-05,31A,AM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,jumping,false,false,false,true,true,false,true,false,eventually ran from lawnmower (tail flag),POINT (-73.9638774579549 40.7913532129148) +-73.9679538163341,40.7837103696906,22C-AM-1013-03,22C,AM,10132018,3,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,eating (mushroom),false,false,false,false,false,false,false,true,,POINT (-73.9679538163341 40.7837103696906) +-73.9564724104048,40.7936055508162,36F-PM-1012-04,36F,PM,10122018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9564724104048 40.7936055508162) +-73.9613643418025,40.7892431934209,30D-AM-1017-02,30D,AM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9613643418025 40.7892431934209) +-73.9770824412252,40.7709961309457,5C-AM-1006-03,05C,AM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97708244122522 40.7709961309457) +-73.9677646187171,40.7746492806333,13H-PM-1010-05,13H,PM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9677646187171 40.7746492806333) +-73.9710760196868,40.7725506006789,10F-PM-1019-02,10F,PM,10192018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,Cinnamon head & stripe,Ground Plane,FALSE,"Behind fence, grass",true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9710760196868 40.7725506006789) +-73.9711298491132,40.7676902603543,5I-PM-1008-01,05I,PM,10082018,1,Adult,Black,Cinnamon,Black+Cinnamon,,Above Ground,15,in tree by arsenal - climbing,false,false,true,true,false,,false,false,false,true,false,false,false,false,,POINT (-73.9711298491132 40.7676902603543) +-73.9702755805141,40.7783547795222,16D-PM-1010-13,16D,PM,10102018,13,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9702755805141 40.7783547795222) +-73.9638837160341,40.7809747900833,21G-AM-1014-07,21G,AM,10142018,7,Adult,Gray,White,Gray+White,,Above Ground,5,,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9638837160341 40.7809747900833) +-73.968367485157,40.7838472644815,22B-PM-1014-05,22B,PM,10142018,5,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,eating (eats with head tilted far to the right (tooth issue?)),false,false,false,false,false,false,false,false,,POINT (-73.968367485157 40.7838472644815) +-73.9772576561244,40.7679895093963,3D-AM-1006-08,03D,AM,10062018,8,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,approaches (food stand),POINT (-73.9772576561244 40.7679895093963) +-73.9519639918804,40.7949911702392,39H-AM-1007-01,39H,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9519639918804 40.7949911702392) +-73.9754270368984,40.7702411502308,6D-PM-1020-01,06D,PM,10202018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,Baseball field,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9754270368984 40.7702411502308) +-73.9712327308512,40.7748702909218,12E-PM-1018-06,12E,PM,10182018,6,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9712327308512 40.7748702909218) +-73.9712318712643,40.7773053099657,14D-PM-1019-04,14D,PM,10192018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9712318712643 40.7773053099657) +-73.9761209945419,40.7682404528903,3E-PM-1008-03,03E,PM,10082018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9761209945419 40.7682404528903) +-73.967181612203,40.7787752287055,17F-PM-1020-03,17F,PM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,35,,false,false,true,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.967181612203 40.7787752287055) +-73.9665709146738,40.7839384318554,22D-PM-1012-04,22D,PM,10122018,4,Adult,Gray,"Black, White","Gray+Black, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9665709146738 40.7839384318554) +-73.9770273553525,40.7732399463626,8A-AM-1013-03,08A,AM,10132018,3,Juvenile,,,+,,Above Ground,3,fence,true,true,true,true,false,playing tag together,false,false,false,false,false,true,false,false,,POINT (-73.9770273553525 40.7732399463626) +-73.9737091707831,40.7713732567512,7E-AM-1006-03,07E,AM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,under a tree,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9737091707831 40.7713732567512) +-73.9520592496349,40.7975076299811,42G-PM-1014-03,42G,PM,10142018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,4,on fence,true,false,false,false,false,prancing,false,false,false,false,false,false,false,true,,POINT (-73.9520592496349 40.7975076299811) +-73.963842266151,40.7887340867773,28C-PM-1006-02,28C,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,Near rock,true,false,false,false,false,,false,false,false,false,false,false,false,true,dog,POINT (-73.963842266151 40.7887340867773) +-73.9775681731459,40.7676421190309,2D-AM-1007-03,02D,AM,10072018,3,Adult,Gray,,Gray+,,Above Ground,100,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9775681731459 40.7676421190309) +-73.9598155300913,40.7905887826983,32E-AM-1007-10,32E,AM,10072018,10,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9598155300913 40.7905887826983) +-73.9728660779622,40.7753294525644,12C-AM-1013-03,12C,AM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.9728660779622 40.7753294525644) +-73.972416242971,40.7714260236636,8F-PM-1012-04,08F,PM,10122018,4,Adult,Gray,,Gray+,,Above Ground,6,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.972416242971 40.7714260236636) +-73.9731498064872,40.7659963196581,2H-AM-1006-02,02H,AM,10062018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,true,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9731498064872 40.7659963196581) +-73.9527808174534,40.7924167234441,36I-AM-1017-05,36I,AM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,runs from (me),POINT (-73.9527808174534 40.7924167234441) +-73.9624184586031,40.7921524868211,32B-AM-1017-03,32B,AM,10172018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,true,true,"approaches (primarily),runs from (initially),follows",POINT (-73.9624184586031 40.7921524868211) +-73.9568343093228,40.7949401350882,37E-PM-1006-04,37E,PM,10062018,4,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,doesn't see me,POINT (-73.9568343093228 40.7949401350882) +-73.9741401377844,40.7758134257881,12B-AM-1007-02,12B,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9741401377844 40.7758134257881) +-73.9753574279936,40.7683211694257,4E-PM-1008-08,04E,PM,10082018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9753574279936 40.7683211694257) +-73.9737266070919,40.7786338379896,14A-PM-1014-01,14A,PM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9737266070919 40.7786338379896) +-73.967895656898,40.7767409597341,15F-PM-1010-07,15F,PM,10102018,7,Adult,Gray,,Gray+,,Above Ground,3,on fence,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.967895656898 40.7767409597341) +-73.9760942252437,40.7742035674209,9B-PM-1013-07,09B,PM,10132018,7,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.97609422524371 40.7742035674209) +-73.9758464905133,40.7725957408841,8C-PM-1013-05,08C,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9758464905133 40.7725957408841) +-73.9767080512177,40.7717708794221,6B-PM-1017-04,06B,PM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9767080512177 40.7717708794221) +-73.9760256477558,40.7703573131398,5D-AM-1020-02,05D,AM,10202018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,true,small jumps,false,false,false,false,false,false,false,false,,POINT (-73.9760256477558 40.7703573131398) +-73.9590236602085,40.7982632456866,40A-AM-1010-04,40A,AM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,bottom great hill,false,false,false,false,true,,false,false,false,true,false,false,true,true,dog chased,POINT (-73.9590236602085 40.7982632456866) +-73.9754778808471,40.7685619029765,4E-AM-1020-01,04E,AM,10202018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",White selected as Primary. Cinnamon selected as Highlights. Made executive adjustments.,Above Ground,7,,false,false,true,false,false,sitting very still,false,false,false,false,false,false,true,false,,POINT (-73.9754778808471 40.7685619029765) +-73.9597648775789,40.7903443029725,32E-AM-1007-01,32E,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9597648775789 40.7903443029725) +-73.9589414339242,40.7907073888277,32E-PM-1017-04,32E,PM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,treed area,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9589414339242 40.7907073888277) +-73.9779805668091,40.7680931566797,2D-PM-1012-02,02D,PM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9779805668091 40.7680931566797) +-73.9733117663541,40.7694584620114,6F-PM-1008-05,06F,PM,10082018,5,Adult,Cinnamon,White,Cinnamon+White,white patch,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97331176635412 40.7694584620114) +-73.9751729403694,40.7743284123118,10B-PM-1014-02,10B,PM,10142018,2,Adult,Gray,White,Gray+White,,Above Ground,,gingko tree by traffic light in front of Strawberry Fields,false,false,false,false,true,,false,false,false,false,true,false,false,false,came over on tree to see me then disappeared,POINT (-73.9751729403694 40.7743284123118) +-73.9786339295735,40.7684918638639,3C-PM-1008-02,03C,PM,10082018,2,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9786339295735 40.7684918638639) +-73.9726747666002,40.7703022669308,7F-AM-1008-02,07F,AM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,see stories and locations,POINT (-73.9726747666002 40.7703022669308) +-73.9570817579092,40.7964221087879,38D-AM-1017-02,38D,AM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,hiding in log,false,false,false,false,false,false,true,false,,POINT (-73.9570817579092 40.7964221087879) +-73.974420668782,40.7749628597465,10C-PM-1013-04,10C,PM,10132018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.974420668782 40.7749628597465) +-73.9589627056561,40.7847591558491,26I-PM-1010-02,26I,PM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,hiding food,false,false,false,false,true,false,true,false,,POINT (-73.9589627056561 40.7847591558491) +-73.9762246600197,40.775164077652,10A-AM-1006-03,10A,AM,10062018,3,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,Bridle Path lawn,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9762246600197 40.775164077652) +-73.9800669115792,40.7676825134384,1B-AM-1012-07,01B,AM,10122018,7,Adult,Cinnamon,,Cinnamon+,,Above Ground,2,on tree trunk,false,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9800669115792 40.7676825134384) +-73.976798124308,40.7741316574113,9A-PM-1010-04,09A,PM,10102018,4,,Cinnamon,,Cinnamon+,,Above Ground,20,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97679812430802 40.7741316574113) +-73.9773317054464,40.7684035996758,3D-AM-1006-03,03D,AM,10062018,3,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,on top [of] a big rock/boulder in the area,true,false,true,false,false,climbing (rock),false,false,false,false,false,true,false,false,"approaches (slightly),wary of humans",POINT (-73.9773317054464 40.76840359967581) +-73.9534333425633,40.7932564163328,37H-AM-1018-03,37H,AM,10182018,3,Adult,Gray,White,Gray+White,,Above Ground,10,in a tree with red berries,false,false,false,true,false,,false,true,false,false,false,false,false,true,,POINT (-73.9534333425633 40.7932564163328) +-73.9726958070536,40.7706096126328,7F-AM-1008-09,07F,AM,10082018,9,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,playing w/ #8,false,false,false,false,false,false,true,false,,POINT (-73.9726958070536 40.7706096126328) +-73.978436117932,40.7724769242403,6A-AM-1006-06,06A,AM,10062018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,15,tree,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.978436117932 40.7724769242403) +-73.9552861155228,40.788973931872,32I-AM-1013-05,32I,AM,10132018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,3,In and below shrub,false,false,true,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9552861155228 40.788973931872) +-73.9712876234172,40.7695885530701,7H-PM-1006-02,07H,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,25,tree,true,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9712876234172 40.7695885530701) +-73.9771069181511,40.7670538214988,2E-PM-1014-05,02E,PM,10142018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9771069181511 40.7670538214988) +-73.9698714743386,40.7743814661685,12F-AM-1020-02,12F,AM,10202018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9698714743386 40.7743814661685) +-73.9691094942294,40.776760392858,14E-AM-1008-01,14E,AM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,walking,false,false,false,false,false,false,false,true,,POINT (-73.9691094942294 40.776760392858) +-73.9786481009499,40.7697372811949,4B-PM-1018-03,04B,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9786481009499 40.7697372811949) +-73.9754742295091,40.7696998327247,5E-PM-1012-02,05E,PM,10122018,2,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9754742295091 40.7696998327247) +-73.968107276769,40.7768612676036,15F-AM-1007-09,15F,AM,10072018,9,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,20,,false,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.968107276769 40.7768612676036) +-73.9591400366159,40.7891708599318,31F-PM-1007-01,31F,PM,10072018,1,Adult,Gray,White,Gray+White,white neck and belly,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9591400366159 40.7891708599318) +-73.9767191629692,40.7730786298701,8B-PM-1012-03,08B,PM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9767191629692 40.7730786298701) +-73.9661262885099,40.7844085550945,23D-AM-1013-01,23D,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,true,false,false,"approaches (he saw me,came towards,then darted up)",POINT (-73.9661262885099 40.7844085550945) +-73.9521950056404,40.794937340845,39H-PM-1013-01,39H,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,ran away when a human approached with a dog,POINT (-73.9521950056404 40.794937340845) +-73.9579218587172,40.7960605028848,38C-AM-1019-04,38C,AM,10192018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,true,true,false,false,false,false,true,false,,POINT (-73.9579218587172 40.79606050288481) +-73.9639832886071,40.7909532437095,30B-PM-1019-08,30B,PM,10192018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9639832886071 40.7909532437095) +-73.974467903723,40.7686520352868,4F-PM-1013-04,04F,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.974467903723 40.7686520352868) +-73.9758579666874,40.7679326548845,3E-PM-1008-05,03E,PM,10082018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,jump,false,false,false,false,false,false,true,false,,POINT (-73.9758579666874 40.7679326548845) +-73.9619070229674,40.79525566925,35A-AM-1014-05,35A,AM,10142018,5,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9619070229674 40.79525566925) +-73.9787796921165,40.7707526535381,5A-PM-1010-01,05A,PM,10102018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9787796921165 40.7707526535381) +-73.9550082056509,40.7894521543449,33I-AM-1008-03,33I,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,2,98th @ edge of park,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9550082056509 40.7894521543449) +-73.9587401274261,40.7960322222949,37C-PM-1013-03,37C,PM,10132018,3,Adult,Gray,White,Gray+White,,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9587401274261 40.7960322222949) +-73.9619411917909,40.7923536640283,33B-PM-1010-11,33B,PM,10102018,11,Adult,Gray,,Gray+,,Above Ground,10,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9619411917909 40.7923536640283) +-73.9701575891098,40.7730973282423,10G-PM-1017-06,10G,PM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701575891098 40.7730973282423) +-73.9529060669193,40.7927909735388,37I-AM-1010-01,37I,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9529060669193 40.7927909735388) +-73.9547336666137,40.7938937756332,37G-PM-1007-07,37G,PM,10072018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9547336666137 40.7938937756332) +-73.9691433356733,40.7731708333242,11G-AM-1012-01,11G,AM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9691433356733 40.77317083332421) +-73.9720907384613,40.7762987836055,13C-PM-1019-01,13C,PM,10192018,1,Adult,Gray,,Gray+,,Above Ground,7,,false,false,true,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9720907384613 40.7762987836055) +-73.9709281471442,40.7828097939777,20A-AM-1010-02,20A,AM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9709281471442 40.7828097939777) +-73.9731113265165,40.7786640676355,15A-PM-1017-01,15A,PM,10172018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,10,,false,false,true,true,false,eating in tree,false,false,false,false,false,false,true,false,,POINT (-73.9731113265165 40.7786640676355) +-73.9684254196866,40.77809016436,16E-AM-1014-02,16E,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9684254196866 40.77809016436) +-73.9560679864426,40.7947887062326,37E-PM-1006-06,37E,PM,10062018,6,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9560679864426 40.7947887062326) +-73.9679661308374,40.7837388390673,22C-AM-1013-01,22C,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,false,false,false,"sitting still,tail over back",false,false,false,false,false,false,false,false,,POINT (-73.9679661308374 40.7837388390673) +-73.9674069524601,40.7772529662424,16F-PM-1013-02,16F,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Woods,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9674069524601 40.7772529662424) +-73.9696173677837,40.7705202790525,8H-AM-1017-04,08H,AM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9696173677837 40.7705202790525) +-73.9756573579063,40.7656644063024,1G-PM-1010-01,01G,PM,10102018,1,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,true,true,false,,false,false,false,true,false,false,true,false,too busy eating in his tree,POINT (-73.9756573579063 40.7656644063024) +-73.9700691629574,40.7828893645197,20A-PM-1017-01,20A,PM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97006916295742 40.7828893645197) +-73.9596964641652,40.7957753591585,37B-AM-1018-03,37B,AM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9596964641652 40.7957753591585) +-73.9685604013735,40.7773439909065,15F-PM-1010-03,15F,PM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9685604013735 40.7773439909065) +-73.957342596188,40.7944359654227,37E-PM-1006-09,37E,PM,10062018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,false,moseying,false,false,false,false,true,true,false,false,,POINT (-73.957342596188 40.7944359654227) +-73.9586214081667,40.7937473968735,35D-PM-1013-03,35D,PM,10132018,3,Juvenile,Gray,White,Gray+White,No Tail!,Above Ground,2,bench,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9586214081667 40.7937473968735) +-73.9528149779809,40.7924984810637,36I-AM-1017-06,36I,AM,10172018,6,Adult,Gray,Black,Gray+Black,Darker than others,Above Ground,10,Running down tree,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9528149779809 40.7924984810637) +-73.9717425494287,40.7664227676653,3I-PM-1013-07,03I,PM,10132018,7,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9717425494287 40.7664227676653) +-73.9695176417703,40.7741725190048,12G-PM-1007-04,12G,PM,10072018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9695176417703 40.7741725190048) +-73.9762348224648,40.7694522315322,4D-PM-1008-08,04D,PM,10082018,8,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,true,true,true,climbed fence staring at me - went up tree,false,false,false,false,false,false,false,true,,POINT (-73.97623482246482 40.7694522315322) +-73.9523001834395,40.7949231000186,39H-AM-1007-02,39H,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9523001834395 40.7949231000186) +-73.9750283794865,40.7724101927821,8C-PM-1013-08,08C,PM,10132018,8,,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9750283794865 40.7724101927821) +-73.9689700100267,40.7775169562765,15E-PM-1008-05,15E,PM,10082018,5,Adult,Gray,,Gray+,,Above Ground,20,,false,false,false,false,false,sitting,false,true,false,false,false,false,false,false,,POINT (-73.9689700100267 40.7775169562765) +-73.9683965841952,40.7718679848978,10I-AM-1010-03,10I,AM,10102018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9683965841952 40.7718679848978) +-73.9554095823557,40.7887305802044,32I-AM-1013-01,32I,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9554095823557 40.7887305802044) +-73.9696001184129,40.7820810673532,19B-PM-1018-05,19B,PM,10182018,5,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White","Gray, Cinnamon & White selected as Primary. Gray & White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9696001184129 40.7820810673532) +-73.9795081274695,40.7691431548544,3B-PM-1007-03,03B,PM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9795081274695 40.7691431548544) +-73.9578779556574,40.7934116539732,35E-PM-1006-06,35E,PM,10062018,6,Adult,Gray,,Gray+,,Above Ground,,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9578779556574 40.7934116539732) +-73.958356112357,40.796014459571,38C-AM-1019-07,38C,AM,10192018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Nothing selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.958356112357 40.796014459571) +-73.9646610347972,40.7790583544252,19H-AM-1010-05,19H,AM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,near a brush,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9646610347972 40.7790583544252) +-73.960601067176,40.7917243850136,32D-PM-1006-09,32D,PM,10062018,9,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,true,false,false,,POINT (-73.960601067176 40.7917243850136) +-73.9539734770934,40.7956055442,39G-PM-1013-04,39G,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9539734770934 40.7956055442) +-73.9540616660191,40.7951556603245,38G-PM-1020-10,38G,PM,10202018,10,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9540616660191 40.7951556603245) +-73.9545799024508,40.7908084039886,34I-PM-1010-01,34I,PM,10102018,1,Adult,Gray,,Gray+,,Above Ground,15,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9545799024508 40.7908084039886) +-73.9743990576746,40.7768690723163,12A-PM-1013-04,12A,PM,10132018,4,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,,false,true,false,false,false,chasing #3,false,false,false,false,false,false,true,false,,POINT (-73.9743990576746 40.7768690723163) +-73.9659034359706,40.7797516688844,19F-AM-1007-02,19F,AM,10072018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,8,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9659034359706 40.77975166888441) +-73.9684376038582,40.7824275067237,20C-PM-1018-09,20C,PM,10182018,9,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9684376038582 40.7824275067237) +-73.9694288806212,40.7842952265291,22A-PM-1017-01,22A,PM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9694288806212 40.7842952265291) +-73.9546042927016,40.7898133734952,33I-PM-1006-07,33I,PM,10062018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9546042927016 40.7898133734952) +-73.9573469787503,40.7944044592573,36E-AM-1013-03,36E,AM,10132018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,indifferent (moving very fast),POINT (-73.9573469787503 40.7944044592573) +-73.9587879699956,40.7908135158551,32F-AM-1012-01,32F,AM,10122018,1,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,made a back-door escape from dog off-leash,false,false,false,false,false,false,false,true,,POINT (-73.9587879699956 40.7908135158551) +-73.9630990823243,40.7885764284016,28D-AM-1012-02,28D,AM,10122018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9630990823243 40.7885764284016) +-73.9699843570636,40.7729480440312,10G-AM-1006-01,10G,AM,10062018,1,Adult,Gray,,Gray+,,Above Ground,80,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.96998435706361 40.7729480440312) +-73.9534306291679,40.7959052073753,39G-PM-1013-07,39G,PM,10132018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9534306291679 40.7959052073753) +-73.9652357279671,40.7819296887147,21E-PM-1012-02,21E,PM,10122018,2,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9652357279671 40.7819296887147) +-73.967832992543,40.7783669913408,17E-PM-1018-03,17E,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.967832992543 40.7783669913408) +-73.9708969246276,40.7767695507462,14D-AM-1014-03,14D,AM,10142018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9708969246276 40.7767695507462) +-73.95448101115,40.7954469678857,39F-PM-1006-03,39F,PM,10062018,3,Adult,Gray,White,Gray+White,,Above Ground,15,lower branch of tree,false,false,false,true,false,,false,false,false,false,false,false,false,true,ran up tree when approached,POINT (-73.95448101115 40.7954469678857) +-73.9705123624953,40.7731723757869,10F-PM-1019-11,10F,PM,10192018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Grassy area,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9705123624953 40.7731723757869) +-73.9667560049684,40.7882333830729,27A-PM-1006-01,27A,PM,10062018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,on a tree,false,false,false,true,true,walking up & down branches,false,false,false,false,false,false,true,false,,POINT (-73.9667560049684 40.7882333830729) +-73.9687395228846,40.7807364481385,18D-AM-1018-02,18D,AM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9687395228846 40.7807364481385) +-73.9782351435852,40.7715896672335,6A-AM-1006-03,06A,AM,10062018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,30,tree,false,true,false,true,false,,false,false,false,true,true,false,false,false,,POINT (-73.9782351435852 40.7715896672335) +-73.9757413215621,40.7692582758978,4E-PM-1008-04,04E,PM,10082018,4,Adult,Gray,,Gray+,,Above Ground,10,,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9757413215621 40.7692582758978) +-73.9583101927652,40.7852649316039,27I-PM-1020-05,27I,PM,10202018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,In tree,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (us),POINT (-73.9583101927652 40.7852649316039) +-73.9765595553183,40.7748455340432,10A-PM-1014-04,10A,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9765595553183 40.7748455340432) +-73.965509576403,40.7752456763263,14I-PM-1018-05,14I,PM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,,false,false,true,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.96550957640301 40.7752456763263) +-73.9744960829844,40.7652585501959,1H-AM-1012-01,01H,AM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,true,first approaches then runs from - he was less than 1 yd. away from me.,POINT (-73.9744960829844 40.7652585501959) +-73.9703161745884,40.7702610461336,8H-PM-1014-05,08H,PM,10142018,5,Juvenile,Gray,,Gray+,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9703161745884 40.7702610461336) +-73.9605966636226,40.7889849108637,30E-AM-1008-01,30E,AM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,scurried into bushes when jogger ran by,POINT (-73.9605966636226 40.7889849108637) +-73.9730224561601,40.7796833353894,16A-PM-1019-04,16A,PM,10192018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9730224561601 40.7796833353894) +-73.9759432151552,40.7733240612552,8B-PM-1012-06,08B,PM,10122018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,2,on a bench,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9759432151552 40.7733240612552) +-73.9724452296309,40.7715792113505,8F-PM-1012-03,08F,PM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,buried an acorn,false,false,false,false,false,false,true,false,,POINT (-73.9724452296309 40.7715792113505) +-73.9712971568288,40.7745520717065,11E-AM-1013-02,11E,AM,10132018,2,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9712971568288 40.7745520717065) +-73.9611696144784,40.7816692895155,22I-AM-1007-03,22I,AM,10072018,3,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9611696144784 40.7816692895155) +-73.9542990150586,40.7940915300678,37G-PM-1007-09,37G,PM,10072018,9,Adult,Cinnamon,White,Cinnamon+White,,,,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9542990150586 40.7940915300678) +-73.9689657039917,40.7767834276767,15F-AM-1007-04,15F,AM,10072018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9689657039917 40.7767834276767) +-73.9707471099503,40.7759255131734,13E-AM-1017-08,13E,AM,10172018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9707471099503 40.7759255131734) +-73.9713330594434,40.7771924214236,14D-AM-1014-10,14D,AM,10142018,10,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9713330594434 40.7771924214236) +-73.970540988328,40.7698103067062,7H-AM-1006-06,07H,AM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,12,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.970540988328 40.7698103067062) +-73.9740007759509,40.7650077086539,1H-PM-1013-01,01H,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9740007759509 40.7650077086539) +-73.9566751022336,40.799035789744,41C-PM-1007-04,41C,PM,10072018,4,Adult,Gray,White,Gray+White,,Above Ground,65,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9566751022336 40.799035789744) +-73.9639635134738,40.7900337598704,29B-PM-1010-05,29B,PM,10102018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9639635134738 40.7900337598704) +-73.9761036400144,40.7705482684594,6D-PM-1020-03,06D,PM,10202018,3,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9761036400144 40.7705482684594) +-73.9724801784201,40.7790131966689,15B-PM-1017-05,15B,PM,10172018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9724801784201 40.7790131966689) +-73.9635658786416,40.7777291777901,18I-AM-1017-03,18I,AM,10172018,3,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9635658786416 40.77772917779011) +-73.9716404781264,40.7753181851766,12D-PM-1014-02,12D,PM,10142018,2,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,true,false,false,seems to be grinding teeth on a piece of material (sounds from grinding),false,false,false,false,false,false,true,false,,POINT (-73.9716404781264 40.7753181851766) +-73.9672054610151,40.7876519923501,26A-PM-1006-05,26A,PM,10062018,5,Adult,Gray,,Gray+,,Above Ground,40,,false,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9672054610151 40.7876519923501) +-73.9614824437251,40.7912929799884,32C-PM-1013-03,32C,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9614824437251 40.7912929799884) +-73.9571407991577,40.7931917396406,35E-PM-1006-02,35E,PM,10062018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,begging for food,POINT (-73.9571407991577 40.7931917396406) +-73.9707197274481,40.7773956803431,14D-PM-1019-12,14D,PM,10192018,12,Adult,Gray,,Gray+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9707197274481 40.7773956803431) +-73.9623696148045,40.792184861375,32B-AM-1017-04,32B,AM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,13,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9623696148045 40.792184861375) +-73.9576035072364,40.7966120824816,38C-AM-1019-01,38C,AM,10192018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (lawnmower),POINT (-73.9576035072364 40.7966120824816) +-73.9673548527075,40.7765669058396,15G-PM-1019-11,15G,PM,10192018,11,Adult,Gray,,Gray+,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,false,stared,POINT (-73.9673548527075 40.7765669058396) +-73.9704862864304,40.7739583111676,11F-PM-1006-02,11F,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9704862864304 40.7739583111676) +-73.970315671921,40.7720905395472,10G-PM-1017-02,10G,PM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.970315671921 40.7720905395472) +-73.9596398997228,40.7933386953847,34D-PM-1007-02,34D,PM,10072018,2,Adult,Black,,Black+,,Above Ground,25,,true,false,true,false,false,,false,false,false,false,false,false,false,false,cautiously aware,POINT (-73.9596398997228 40.7933386953847) +-73.9548957862084,40.7944844464619,37G-AM-1014-05,37G,AM,10142018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9548957862084 40.7944844464619) +-73.964080104186,40.7907898627287,30B-AM-1007-02,30B,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,15,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.964080104186 40.7907898627287) +-73.9781303869038,40.7725000348875,7A-AM-1006-02,07A,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9781303869038 40.7725000348875) +-73.9672127283283,40.7810666805133,20D-AM-1007-01,20D,AM,10072018,1,Adult,Gray,,Gray+,too far to note 30',Ground Plane,FALSE,,true,false,true,true,false,a lot of activity,false,false,false,true,false,false,false,false,,POINT (-73.9672127283283 40.7810666805133) +-73.9556817958407,40.788852000621,32I-AM-1013-02,32I,AM,10132018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,false,watching me from tree - curious,POINT (-73.9556817958407 40.788852000621) +-73.9752000129992,40.7732918122239,8C-PM-1013-04,08C,PM,10132018,4,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9752000129992 40.7732918122239) +-73.9698817079185,40.7758322627711,13E-PM-1008-10,13E,PM,10082018,10,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,true,,POINT (-73.9698817079185 40.7758322627711) +-73.9757001944781,40.769499790547,5E-AM-1008-09,05E,AM,10082018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,2,went up tree,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9757001944781 40.769499790547) +-73.9584835416846,40.7978213396921,39B-PM-1014-06,39B,PM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9584835416846 40.7978213396921) +-73.9606817053484,40.7917320450401,32D-PM-1006-07,32D,PM,10062018,7,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.9606817053484 40.7917320450401) +-73.9649590119935,40.7822107920769,21F-AM-1018-01,21F,AM,10182018,1,Adult,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9649590119935 40.7822107920769) +-73.959709414696,40.7919745085986,33D-PM-1006-03,33D,PM,10062018,3,,Black,,Black+,,Above Ground,15,,true,false,false,true,false,,false,false,false,false,true,false,false,true,ran up tree,POINT (-73.959709414696 40.7919745085986) +-73.9735946835545,40.7724155751282,8E-PM-1008-01,08E,PM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,by tree trunk base,false,false,false,true,false,,false,false,false,false,false,true,false,false,eating food being thrown at it by a mom & baby,POINT (-73.9735946835545 40.7724155751282) +-73.9588358879692,40.7912631913057,33E-PM-1012-01,33E,PM,10122018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9588358879692 40.7912631913057) +-73.968045072743,40.7836626717225,22C-AM-1013-02,22C,AM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,4,,false,false,true,false,true,,true,false,false,true,false,false,false,true,,POINT (-73.968045072743 40.7836626717225) +-73.979316275899,40.7692134727555,3B-PM-1007-01,03B,PM,10072018,1,Adult,Gray,White,Gray+White,,Above Ground,,in tree,false,false,false,false,false,chased by dog,false,false,false,false,false,false,false,false,,POINT (-73.979316275899 40.7692134727555) +-73.9550351380957,40.7974681522214,40E-AM-1014-01,40E,AM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9550351380957 40.7974681522214) +-73.9578316525492,40.7890102959629,31G-PM-1007-01,31G,PM,10072018,1,Adult,Gray,,Gray+,,Above Ground,15,,false,false,false,false,false,hiding,false,false,false,false,true,false,false,false,"froze,sight of dogs",POINT (-73.9578316525492 40.7890102959629) +-73.9592537496995,40.7919271821316,33E-AM-1014-03,33E,AM,10142018,3,Adult,Black,,Black+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9592537496995 40.7919271821316) +-73.9733966282316,40.7717179627127,8E-PM-1008-08,08E,PM,10082018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9733966282316 40.7717179627127) +-73.970720187655,40.7774564799983,14D-PM-1019-11,14D,PM,10192018,11,Adult,Gray,,Gray+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.970720187655 40.7774564799983) +-73.9790875480358,40.7676104780657,2C-AM-1010-03,02C,AM,10102018,3,Adult,Black,Gray,Black+Gray,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9790875480358 40.7676104780657) +-73.9802376131034,40.7680707516627,1B-AM-1012-12,01B,AM,10122018,12,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9802376131034 40.7680707516627) +-73.9577212629651,40.7965525296722,38C-PM-1014-06,38C,PM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9577212629651 40.7965525296722) +-73.9719888241794,40.7667681685356,4I-PM-1007-03,04I,PM,10072018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,3,ran to tree,false,false,false,false,false,being chased,false,false,false,false,false,false,false,false,,POINT (-73.9719888241794 40.7667681685356) +-73.9565686300382,40.797592846003,40C-PM-1006-03,40C,PM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9565686300382 40.797592846003) +-73.9669206605745,40.7748155701122,13H-PM-1010-03,13H,PM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,in glen,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9669206605745 40.7748155701122) +-73.9690416961886,40.7716618670996,10H-AM-1014-05,10H,AM,10142018,5,,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9690416961886 40.7716618670996) +-73.9686737866872,40.7739714023732,12G-PM-1007-06,12G,PM,10072018,6,,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9686737866872 40.7739714023732) +-73.9763433202401,40.7738473490681,9B-PM-1013-10,09B,PM,10132018,10,Juvenile,Cinnamon,Gray,Cinnamon+Gray,"""Brown"" written in as Primary",Above Ground,12,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9763433202401 40.7738473490681) +-73.9590502257662,40.794290363687,36C-PM-1013-06,36C,PM,10132018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,Running across wide street,true,false,false,false,true,carrying food in mouth,false,false,false,false,false,false,false,false,,POINT (-73.9590502257662 40.794290363687) +-73.965862100991,40.7825926896917,22D-PM-1012-01,22D,PM,10122018,1,Adult,Gray,"Black, White","Gray+Black, White",,Above Ground,5,,false,false,true,false,false,,true,false,false,false,false,false,false,false,climbing tree,POINT (-73.965862100991 40.7825926896917) +-73.9681917366128,40.7723298813768,11I-PM-1012-03,11I,PM,10122018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,true,,false,false,false,false,false,false,false,true,runs from the dog,POINT (-73.9681917366128 40.7723298813768) +-73.9597470659927,40.7973215935416,38A-PM-1013-01,38A,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9597470659927 40.7973215935416) +-73.9680774548516,40.7762491903691,14F-PM-1012-01,14F,PM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9680774548516 40.7762491903691) +-73.9786603147149,40.7671937837017,1D-AM-1006-09,01D,AM,10062018,9,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9786603147149 40.7671937837017) +-73.9766354967197,40.7734575166319,8B-AM-1007-09,08B,AM,10072018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,"shelling and eating a nut then a dog chased it up a tree & squirrel carried its nut up the tree,settled in a branch & resumed eating",false,false,false,false,false,false,true,false,,POINT (-73.9766354967197 40.7734575166319) +-73.9787658435198,40.7689419765393,3B-PM-1007-07,03B,PM,10072018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,eating loudly <- peanuts w/ shells,false,false,false,false,false,false,true,false,,POINT (-73.9787658435198 40.7689419765393) +-73.9633760173635,40.7818422357619,22G-PM-1018-03,22G,PM,10182018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,chilling,false,false,false,false,false,false,true,false,observed,POINT (-73.96337601736352 40.7818422357619) +-73.9530809650496,40.7959176317705,40G-PM-1013-02,40G,PM,10132018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,hiding from dog,false,false,false,false,false,false,false,true,runs from (dog),POINT (-73.9530809650496 40.79591763177051) +-73.9584024936392,40.7851491701944,27I-PM-1020-01,27I,PM,10202018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,true,runs from (us),POINT (-73.9584024936392 40.7851491701944) +-73.9669366401071,40.7836023897982,22C-PM-1006-09,22C,PM,10062018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.96693664010711 40.7836023897982) +-73.9785675798034,40.7672992405289,1C-PM-1013-05,01C,PM,10132018,5,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9785675798034 40.7672992405289) +-73.9698934182612,40.7708211633861,8H-PM-1014-03,08H,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9698934182612 40.7708211633861) +-73.9721899838568,40.7761519045651,13C-AM-1010-03,13C,AM,10102018,3,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9721899838568 40.7761519045651) +-73.9570131890379,40.7991786736124,41B-PM-1014-05,41B,PM,10142018,5,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,false,,true,false,false,false,false,false,true,true,,POINT (-73.9570131890379 40.7991786736124) +-73.9702788578386,40.7694484997295,7I-PM-1013-05,07I,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Rock,false,false,false,true,false,,false,false,false,true,false,false,false,false,,POINT (-73.9702788578386 40.7694484997295) +-73.9639888092327,40.791449395909,31A-AM-1010-01,31A,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9639888092327 40.791449395909005) +-73.9573604880421,40.7930844158021,35E-PM-1006-03,35E,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9573604880421 40.7930844158021) +-73.9777328709928,40.7669087724668,1D-AM-1006-02,01D,AM,10062018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9777328709928 40.7669087724668) +-73.9671851611243,40.7750878657618,14H-PM-1012-01,14H,PM,10122018,1,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,true,false,false,approaches (came very close to me),POINT (-73.9671851611243 40.7750878657618) +-73.9664630067791,40.7756361515825,14H-AM-1007-04,14H,AM,10072018,4,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9664630067791 40.7756361515825) +-73.9694630409125,40.769737659647,8I-PM-1013-01,08I,PM,10132018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694630409125 40.769737659647) +-73.9756754297747,40.7738518843446,9B-PM-1013-02,09B,PM,10132018,2,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9756754297747 40.7738518843446) +-73.9756557086441,40.773296289824,8B-PM-1012-08,08B,PM,10122018,8,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9756557086441 40.773296289824) +-73.9704485231855,40.7717290560806,9G-AM-1007-02,09G,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,false,,false,false,false,false,false,false,false,true,kids were trying to poke it with a stick,POINT (-73.9704485231855 40.7717290560806) +-73.9741944367138,40.7769889953596,13B-PM-1008-01,13B,PM,10082018,1,Adult,Gray,White,Gray+White,,Above Ground,2,on railing,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9741944367138 40.7769889953596) +-73.9589367709165,40.7896465303483,31F-PM-1007-04,31F,PM,10072018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9589367709165 40.7896465303483) +-73.96362827608,40.7807994595242,21G-AM-1014-02,21G,AM,10142018,2,Adult,Gray,White,Gray+White,,Above Ground,3,fence,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.96362827608 40.7807994595242) +-73.9694784056618,40.7787735291442,16D-PM-1010-01,16D,PM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694784056618 40.7787735291442) +-73.9710116801402,40.7723689301989,10G-PM-1017-08,10G,PM,10172018,8,Adult,Black,Cinnamon,Black+Cinnamon,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9710116801402 40.7723689301989) +-73.9757436019432,40.7746064363227,10B-PM-1014-01,10B,PM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,on lawn in front of a tree,false,false,false,false,true,,false,false,false,false,true,false,false,false,stay on ground but went to other side of tree to hide from a dog,POINT (-73.9757436019432 40.7746064363227) +-73.9757787135906,40.7737231427345,9B-PM-1013-03,09B,PM,10132018,3,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9757787135906 40.7737231427345) +-73.9558474701153,40.7913335515534,34H-AM-1007-01,34H,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,40,tree,false,false,false,false,false,,true,true,false,false,false,false,false,false,,POINT (-73.9558474701153 40.7913335515534) +-73.9676639740486,40.7745369616499,13H-PM-1010-07,13H,PM,10102018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9676639740486 40.7745369616499) +-73.9702963056917,40.7697928730791,7H-AM-1006-11,07H,AM,10062018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9702963056917 40.7697928730791) +-73.9734695768004,40.7716297491384,8E-PM-1008-05,08E,PM,10082018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,"5, 6, 7 all at same tree trunk base",false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9734695768004 40.7716297491384) +-73.9793952066038,40.7707837657859,4A-PM-1007-03,04A,PM,10072018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,by rock,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9793952066038 40.77078376578591) +-73.9525747516914,40.7977257435263,42F-PM-1017-02,42F,PM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,playing,false,false,false,false,false,false,true,false,,POINT (-73.95257475169142 40.7977257435263) +-73.9589770206691,40.791240542172,33E-AM-1014-05,33E,AM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9589770206691 40.791240542172) +-73.9642717435966,40.782087049693,22F-AM-1007-05,22F,AM,10072018,5,Adult,Gray,White,Gray+White,,Above Ground,10,tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9642717435966 40.782087049693) +-73.9742973420446,40.7691801644292,5F-AM-1007-04,05F,AM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,rocks,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9742973420446 40.7691801644292) +-73.9502466289084,40.7959228779883,41I-AM-1018-02,41I,AM,10182018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,runs off,POINT (-73.9502466289084 40.7959228779883) +-73.9720887275538,40.7760799537976,13D-PM-1018-08,13D,PM,10182018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9720887275538 40.7760799537976) +-73.9641462360541,40.7778316005464,18I-PM-1007-09,18I,PM,10072018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,canoodling w/ 8,false,false,false,false,false,false,true,false,,POINT (-73.9641462360541 40.7778316005464) +-73.9714057327159,40.7720375135272,9F-PM-1014-04,09F,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714057327159 40.7720375135272) +-73.9678774314725,40.7738535171265,12H-PM-1007-04,12H,PM,10072018,4,,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,true,false,mushroom,false,false,false,false,false,false,true,false,,POINT (-73.9678774314725 40.7738535171265) +-73.9725906016474,40.7713889729739,8F-PM-1012-05,08F,PM,10122018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9725906016474 40.7713889729739) +-73.9706929341294,40.7760473872395,13E-PM-1008-06,13E,PM,10082018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9706929341294 40.77604738723951) +-73.9701335162984,40.7722051011357,10G-AM-1006-10,10G,AM,10062018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9701335162984 40.7722051011357) +-73.9644293195773,40.7813829172072,21F-AM-1018-02,21F,AM,10182018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9644293195773 40.7813829172072) +-73.9753140640445,40.7734037805101,9C-AM-1006-02,09C,AM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9753140640445 40.7734037805101) +-73.960300330029,40.7953475871869,36B-AM-1013-03,36B,AM,10132018,3,,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.960300330029 40.7953475871869) +-73.959514034869,40.789911786416,31E-PM-1006-02,31E,PM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,under bushes,false,false,false,true,true,,false,true,false,false,false,false,true,false,,POINT (-73.959514034869 40.789911786416) +-73.9752793195744,40.7733960128931,9C-AM-1006-03,09C,AM,10062018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9752793195744 40.7733960128931) +-73.9688574691102,40.7837825208444,21B-AM-1019-04,21B,AM,10192018,4,,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9688574691102 40.7837825208444) +-73.9547878025303,40.7899151873467,33I-PM-1006-05,33I,PM,10062018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9547878025303 40.7899151873467) +-73.965848283831,40.7797243033057,19F-PM-1017-01,19F,PM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.965848283831 40.7797243033057) +-73.9735750352959,40.7694500333777,6F-PM-1008-06,06F,PM,10082018,6,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",White patches. Almost looks like fox squirrel,,,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9735750352959 40.7694500333777) +-73.9624546917649,40.7888234959792,29D-AM-1014-04,29D,AM,10142018,4,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,Rock a,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9624546917649 40.78882349597921) +-73.9549135206961,40.798525897229,42D-PM-1013-03,42D,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,in tree,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9549135206961 40.798525897229) +-73.9648195433192,40.7796399955868,19G-PM-1017-03,19G,PM,10172018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,true,true,false,staring,false,false,false,false,true,false,false,false,,POINT (-73.9648195433192 40.7796399955868) +-73.9661785940531,40.7742569936186,13I-PM-1008-01,13I,PM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,climbed tree,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9661785940531 40.7742569936186) +-73.9592103064327,40.7904390691553,32E-PM-1017-10,32E,PM,10172018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9592103064327 40.7904390691553) +-73.9664450399121,40.7887844904695,27A-AM-1008-02,27A,AM,10082018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9664450399121 40.7887844904695) +-73.9683041099256,40.7862652300082,24A-AM-1014-01,24A,AM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,freezes,POINT (-73.9683041099256 40.7862652300082) +-73.970308716071,40.7763985667344,14E-AM-1008-20,14E,AM,10082018,20,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,false,false,true,false,,POINT (-73.970308716071 40.7763985667344) +-73.9579724119943,40.7948709900016,37D-AM-1018-01,37D,AM,10182018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9579724119943 40.7948709900016) +-73.9780659679557,40.7672382282781,1D-PM-1007-06,01D,PM,10072018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9780659679557 40.7672382282781) +-73.9717201378775,40.776120280884,13D-PM-1018-02,13D,PM,10182018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9717201378775 40.776120280884) +-73.9581243021722,40.794431473386,36D-AM-1007-01,36D,AM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,true,avoiding a dog,POINT (-73.95812430217221 40.794431473386) +-73.9707215394887,40.7727508149058,10G-AM-1006-05,10G,AM,10062018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,chasing (#6),true,false,false,false,false,false,false,false,,POINT (-73.9707215394887 40.7727508149058) +-73.9702721244652,40.7701011774207,7H-AM-1006-15,07H,AM,10062018,15,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9702721244652 40.7701011774207) +-73.9570130017159,40.7996027428625,42B-AM-1014-02,42B,AM,10142018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9570130017159 40.7996027428625) +-73.9540652304705,40.7955226178199,39G-PM-1013-05,39G,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9540652304705 40.7955226178199) +-73.9697855573137,40.7742186391935,12F-PM-1007-05,12F,PM,10072018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9697855573137 40.7742186391935) +-73.9690968160819,40.769923269444,8I-AM-1006-08,08I,AM,10062018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,tree,false,false,false,false,false,,true,true,false,false,false,false,false,false,not backing down,POINT (-73.9690968160819 40.769923269444) +-73.9701481200298,40.7751110354034,12F-AM-1020-06,12F,AM,10202018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9701481200298 40.7751110354034) +-73.954482814186,40.7987031768001,42D-PM-1013-01,42D,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Drawing included.,Ground Plane,FALSE,,false,false,false,false,true,watching passers-by,false,false,false,false,false,true,true,false,,POINT (-73.954482814186 40.7987031768001) +-73.9569403365847,40.7956599608798,38D-PM-1006-01,38D,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,didn't see me or others,POINT (-73.9569403365847 40.7956599608798) +-73.9641293283734,40.7907654006019,30B-AM-1007-03,30B,AM,10072018,3,Adult,Gray,,Gray+,,Above Ground,30,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9641293283734 40.7907654006019) +-73.9714303315699,40.7745934947706,11E-AM-1013-04,11E,AM,10132018,4,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.9714303315699 40.7745934947706) +-73.9721797824576,40.7801213843628,16A-PM-1019-07,16A,PM,10192018,7,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,false,false,approaches (very friendly),POINT (-73.9721797824576 40.7801213843628) +-73.9789952029637,40.7697758333099,4B-AM-1010-03,04B,AM,10102018,3,Juvenile,Gray,White,Gray+White,,Above Ground,25,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9789952029637 40.7697758333099) +-73.9666526554772,40.7756111718355,14H-AM-1007-02,14H,AM,10072018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9666526554772 40.77561117183551) +-73.9677423154682,40.7728813350245,11I-AM-1012-02,11I,AM,10122018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9677423154682 40.77288133502451) +-73.971213385696,40.769872094337,7H-AM-1006-04,07H,AM,10062018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97121338569602 40.769872094337) +-73.9666521094255,40.7842753517648,23C-PM-1014-02,23C,PM,10142018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,"in bushes, then ran across path",true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9666521094255 40.7842753517648) +-73.9615751148595,40.7954551238146,36A-AM-1018-01,36A,AM,10182018,1,Juvenile,Gray,White,Gray+White,,Above Ground,15,,false,false,false,true,false,eating (red berries),false,false,false,false,false,false,true,false,,POINT (-73.9615751148595 40.7954551238146) +-73.97780296909,40.7676321060669,2D-AM-1007-06,02D,AM,10072018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.97780296909002 40.767632106066905) +-73.978426472499,40.771904101844,6A-PM-1012-04,06A,PM,10122018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.978426472499 40.771904101844) +-73.9688470831269,40.7844651946415,22A-AM-1008-03,22A,AM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9688470831269 40.7844651946415) +-73.9703010856224,40.7701983575511,8H-PM-1014-06,08H,PM,10142018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9703010856224 40.7701983575511) +-73.9776854797916,40.7683102295663,3D-AM-1006-04,03D,AM,10062018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (boy on bike),POINT (-73.9776854797916 40.7683102295663) +-73.958837574505,40.7985003987784,40A-PM-1014-06,40A,PM,10142018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.958837574505 40.7985003987784) +-73.9801007327506,40.7677455633932,1B-PM-1019-06,01B,PM,10192018,6,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9801007327506 40.7677455633932) +-73.9548430741605,40.798207350942,41E-AM-1007-06,41E,AM,10072018,6,Adult,Gray,,Gray+,,Above Ground,30,tree,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9548430741605 40.798207350942) +-73.9602166876979,40.7953811003986,36B-AM-1013-04,36B,AM,10132018,4,,Black,,Black+,,Above Ground,20,Moved 20+ feet high above top of tree limb,false,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9602166876979 40.7953811003986) +-73.9669432929573,40.779136518298,18F-AM-1014-01,18F,AM,10142018,1,Adult,Gray,White,Gray+White,,Above Ground,,Low tree,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9669432929573 40.779136518298) +-73.9657288055011,40.7764580036287,16H-PM-1014-04,16H,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9657288055011 40.7764580036287) +-73.9568305513017,40.7974086631267,40C-PM-1006-05,40C,PM,10062018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9568305513017 40.7974086631267) +-73.9708798496132,40.7761532088521,13D-AM-1014-06,13D,AM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9708798496132 40.7761532088521) +-73.9683312453011,40.7801661685712,18D-PM-1017-01,18D,PM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9683312453011 40.7801661685712) +-73.9598340783572,40.7915857030295,33D-PM-1006-02,33D,PM,10062018,2,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.95983407835722 40.7915857030295) +-73.9533476020736,40.7933003544685,37H-PM-1006-02,37H,PM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,tree,true,false,true,false,true,,true,false,false,false,false,false,false,true,dogs,POINT (-73.9533476020736 40.7933003544685) +-73.9677387336667,40.7742695912,12H-PM-1007-02,12H,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,in tree,false,false,true,true,false,peanuts,false,false,false,false,false,false,true,false,,POINT (-73.9677387336667 40.7742695912) +-73.9649611089685,40.7814371834837,21F-AM-1018-05,21F,AM,10182018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9649611089685 40.7814371834837) +-73.9744835563086,40.7729521433235,9D-AM-1008-01,09D,AM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9744835563086 40.7729521433235) +-73.9746918762076,40.7655231883678,1G-AM-1006-02,01G,AM,10062018,2,Juvenile,Gray,White,Gray+White,,Above Ground,30,,false,false,true,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9746918762076 40.7655231883678) +-73.9714289592392,40.7750670702093,12E-PM-1018-04,12E,PM,10182018,4,Adult,Cinnamon,,Cinnamon+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9714289592392 40.7750670702093) +-73.9638590768396,40.7776782114981,18I-AM-1017-02,18I,AM,10172018,2,Adult,Gray,Black,Gray+Black,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9638590768396 40.7776782114981) +-73.9653142636891,40.7760015129298,15I-AM-1008-04,15I,AM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9653142636891 40.7760015129298) +-73.9586098170241,40.7939653733898,35D-AM-1019-01,35D,AM,10192018,1,,,,+,,Above Ground,,"on tree, blue jays gathering nearby",false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9586098170241 40.7939653733898) +-73.963100689807,40.7920255189467,32B-AM-1017-02,32B,AM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon on its head,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.963100689807 40.79202551894671) +-73.9768357173861,40.7683813358343,3D-PM-1010-12,03D,PM,10102018,12,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,true,false,false,true,,false,true,false,false,false,false,false,false,,POINT (-73.9768357173861 40.7683813358343) +-73.9601486483164,40.7943724108626,35C-PM-1013-02,35C,PM,10132018,2,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,approaches (when i crouched down),POINT (-73.9601486483164 40.7943724108626) +-73.9597418366664,40.7964417084985,37B-PM-1013-05,37B,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9597418366664 40.7964417084985) +-73.954959868822,40.7985404965582,41D-PM-1014-03,41D,PM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.954959868822 40.7985404965582) +-73.9687847410656,40.778185700305,16E-AM-1014-09,16E,AM,10142018,9,Adult,Gray,,Gray+,,Above Ground,25,In tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9687847410656 40.778185700305) +-73.9659010238417,40.7791683666215,18G-PM-1013-02,18G,PM,10132018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9659010238417 40.779168366621505) +-73.9749446629706,40.7720659696067,7D-PM-1010-01,07D,PM,10102018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,outside fenced hectare,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9749446629706 40.7720659696067) +-73.971322876671,40.7714145086361,8G-PM-1017-01,08G,PM,10172018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.971322876671 40.7714145086361) +-73.9773821135611,40.7690453494383,4C-PM-1010-06,04C,PM,10102018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,behind playground benches,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9773821135611 40.7690453494383) +-73.9793103340869,40.7678201535968,1C-PM-1013-06,01C,PM,10132018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9793103340869 40.76782015359681) +-73.970173142921,40.7762349924081,14E-AM-1008-19,14E,AM,10082018,19,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.970173142921 40.7762349924081) +-73.952526164386,40.7963759240504,40G-AM-1007-02,40G,AM,10072018,2,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,18,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.952526164386 40.7963759240504) +-73.9680833729772,40.7741871025115,12H-PM-1007-08,12H,PM,10072018,8,,,,+,,Above Ground,7,in tree,false,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9680833729772 40.7741871025115) +-73.9632646049622,40.7817401292083,22G-AM-1018-05,22G,AM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9632646049622 40.7817401292083) +-73.9647284206644,40.7839611840884,23E-PM-1006-01,23E,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,on a tree,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9647284206644 40.7839611840884) +-73.9635290751183,40.7820936628202,22G-AM-1018-02,22G,AM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,false,,true,false,false,false,false,false,false,true,,POINT (-73.9635290751183 40.7820936628202) +-73.9696360756453,40.7786545659072,16D-PM-1010-03,16D,PM,10102018,3,Adult,Gray,,Gray+,,Above Ground,18,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9696360756453 40.7786545659072) +-73.9709104380323,40.7769096957616,14D-AM-1014-16,14D,AM,10142018,16,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9709104380323 40.7769096957616) +-73.9685429060839,40.7724786961619,11H-AM-1010-05,11H,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9685429060839 40.7724786961619) +-73.9652584749758,40.7803011124382,19F-PM-1017-04,19F,PM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9652584749758 40.7803011124382) +-73.9650499507011,40.7908191782173,30A-AM-1010-01,30A,AM,10102018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,10,,true,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9650499507011 40.7908191782173) +-73.9772396728545,40.7668696411765,2E-AM-1010-02,02E,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,totally indifferent,POINT (-73.9772396728545 40.7668696411765) +-73.9561141662309,40.7976258458604,40D-PM-1013-05,40D,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9561141662309 40.7976258458604) +-73.9682803241007,40.7724510558327,11H-AM-1010-04,11H,AM,10102018,4,,Gray,White,Gray+White,,,,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9682803241007 40.7724510558327) +-73.9553113771098,40.7978431980204,41D-AM-1014-05,41D,AM,10142018,5,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9553113771098 40.7978431980204) +-73.9761440627966,40.7706035301542,6D-PM-1020-04,06D,PM,10202018,4,,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9761440627966 40.7706035301542) +-73.9746802194012,40.7731347452245,9C-PM-1006-01,09C,PM,10062018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9746802194012 40.7731347452245) +-73.9617612388703,40.7952875954297,35A-AM-1014-04,35A,AM,10142018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9617612388703 40.7952875954297) +-73.9713487591577,40.7784353043714,15C-PM-1017-03,15C,PM,10172018,3,Adult,Black,,Black+,,Above Ground,17,running across overpass,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9713487591577 40.7784353043714) +-73.9701310753277,40.7768001008083,14E-AM-1008-06,14E,AM,10082018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701310753277 40.7768001008083) +-73.9718474480919,40.7794963354254,16B-AM-1014-01,16B,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9718474480919 40.7794963354254) +-73.9756810453606,40.7756257458036,11A-PM-1013-01,11A,PM,10132018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,"Off-white, decorator's white?",Ground Plane,FALSE,,false,false,false,true,false,eating (osage orange),false,false,false,false,false,false,true,false,,POINT (-73.9756810453606 40.7756257458036) +-73.9547423290276,40.7899702628835,33I-PM-1006-09,33I,PM,10062018,9,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9547423290276 40.7899702628835) +-73.9559677963727,40.7951124076946,38E-AM-1010-07,38E,AM,10102018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,branches,true,true,false,false,false,chasing and being chased by #6,false,false,false,false,true,false,false,true,,POINT (-73.9559677963727 40.7951124076946) +-73.9584696083284,40.7980121226635,39B-PM-1014-03,39B,PM,10142018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9584696083284 40.7980121226635) +-73.9549082481152,40.7933537584624,36G-PM-1012-01,36G,PM,10122018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,crossing east drive,false,false,false,false,false,false,false,false,,POINT (-73.9549082481152 40.7933537584624) +-73.9714465493257,40.7772135587308,14C-PM-1006-02,14C,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9714465493257 40.7772135587308) +-73.9643825381614,40.7815445841195,21F-PM-1018-03,21F,PM,10182018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9643825381614 40.7815445841195) +-73.9625416200877,40.7811302397912,21H-AM-1017-02,21H,AM,10172018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,1,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9625416200877 40.78113023979121) +-73.9638526062093,40.782693848993,22F-AM-1007-02,22F,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,standing,false,false,false,false,false,false,true,false,,POINT (-73.9638526062093 40.782693848993) +-73.973351945818,40.768814796037,5G-PM-1010-03,05G,PM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.973351945818 40.768814796037) +-73.9685227310735,40.776599466588,15F-AM-1007-02,15F,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,"Listed as primary white with cinnamon highlights, I changed to Gray/cinnamon - JO",Above Ground,20,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9685227310735 40.776599466588) +-73.9721670042434,40.776085913838,13D-PM-1018-09,13D,PM,10182018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9721670042434 40.776085913838) +-73.9792153893146,40.7688272492961,3B-AM-1010-01,03B,AM,10102018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9792153893146 40.7688272492961) +-73.9579335275486,40.7953080673706,37D-PM-1014-05,37D,PM,10142018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9579335275486 40.7953080673706) +-73.9704166194815,40.7766720346576,14E-AM-1008-07,14E,AM,10082018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,false,false,true,false,,POINT (-73.9704166194815 40.7766720346576) +-73.9573057686241,40.7985734105729,40B-PM-1014-01,40B,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9573057686241 40.7985734105729) +-73.9581982486469,40.7992194575293,41A-PM-1007-03,41A,PM,10072018,3,Adult,Gray,White,Gray+White,,Above Ground,55,,true,false,true,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.95819824864691 40.7992194575293) +-73.972467515471,40.7659131865172,3I-PM-1013-05,03I,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.972467515471 40.7659131865172) +-73.9700330712119,40.7782913925727,16D-PM-1010-06,16D,PM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,walking,false,false,false,false,false,false,false,false,checking me out,POINT (-73.9700330712119 40.7782913925727) +-73.9570086212285,40.7946679755816,37E-PM-1006-08,37E,PM,10062018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.95700862122851 40.7946679755816) +-73.9615402629655,40.7924082330328,33C-AM-1012-02,33C,AM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon along back & tail,Above Ground,20,tree branches,false,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9615402629655 40.7924082330328) +-73.9708364583591,40.7723691587433,10F-AM-1007-01,10F,AM,10072018,1,Adult,Gray,,Gray+,,Above Ground,60,,false,false,true,false,false,,false,false,false,true,false,false,false,false,,POINT (-73.9708364583591 40.7723691587433) +-73.9756972647636,40.773624164826,9B-PM-1013-04,09B,PM,10132018,4,Juvenile,Gray,Black,Gray+Black,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9756972647636 40.773624164826) +-73.9799441493404,40.7671499997527,1C-AM-1012-01,01C,AM,10122018,1,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White","Gray, Black, & Cinnamon selected as Primary. Cinnamon & White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9799441493404 40.7671499997527) +-73.9709040623777,40.7701163892686,7H-PM-1006-03,07H,PM,10062018,3,Adult,Gray,,Gray+,,Above Ground,8,tree,true,false,true,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9709040623777 40.7701163892686) +-73.9745227769788,40.7673618284782,3F-AM-1006-09,03F,AM,10062018,9,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,in grass by light post,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9745227769788 40.76736182847821) +-73.9659549963516,40.7833659689194,22D-PM-1012-05,22D,PM,10122018,5,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,,,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9659549963516 40.7833659689194) +-73.9763622269272,40.7704671295941,5C-PM-1010-10,05C,PM,10102018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,fed by woman,POINT (-73.9763622269272 40.7704671295941) +-73.9674688433583,40.7789728381912,17E-AM-1017-06,17E,AM,10172018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9674688433583 40.7789728381912) +-73.9706360005275,40.7717074044466,9G-PM-1007-05,09G,PM,10072018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9706360005275 40.7717074044466) +-73.9783366903829,40.7668300056094,1D-PM-1007-03,01D,PM,10072018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9783366903829 40.7668300056094) +-73.9622047677701,40.7945126358465,35A-AM-1014-06,35A,AM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9622047677701 40.7945126358465) +-73.9497217674555,40.796517007214,42I-PM-1014-03,42I,PM,10142018,3,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9497217674555 40.796517007214) +-73.9671306431211,40.7838870159057,22C-PM-1006-05,22C,PM,10062018,5,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9671306431211 40.783887015905705) +-73.9786714207307,40.7696870806229,4B-PM-1018-01,04B,PM,10182018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9786714207307 40.7696870806229) +-73.9750992564362,40.7743391883762,10B-PM-1014-03,10B,PM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,avoided people,POINT (-73.9750992564362 40.7743391883762) +-73.9556218199258,40.7980460204041,41D-PM-1014-01,41D,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,"digging,drinking",false,false,false,false,false,false,false,true,,POINT (-73.9556218199258 40.7980460204041) +-73.9677779408464,40.7867482211349,25A-AM-1013-02,25A,AM,10132018,2,,Gray,,Gray+,,Above Ground,15,BIG TREE,false,true,false,false,false,chasing #3,false,false,false,true,false,false,true,false,,POINT (-73.9677779408464 40.7867482211349) +-73.9612398509782,40.7950033150385,35A-PM-1013-12,35A,PM,10132018,12,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9612398509782 40.7950033150385) +-73.9720553753548,40.7664488175384,3I-AM-1010-04,03I,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9720553753548 40.7664488175384) +-73.9700148248402,40.7787780193358,16D-PM-1010-04,16D,PM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9700148248402 40.7787780193358) +-73.9789126088606,40.7685079149692,2C-PM-1013-08,02C,PM,10132018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9789126088606 40.7685079149692) +-73.9771843912229,40.7723666382125,7B-AM-1008-01,07B,AM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9771843912229 40.77236663821251) +-73.9646597452128,40.7827698220703,22F-AM-1007-07,22F,AM,10072018,7,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,true,false,false,false,alert & aware,POINT (-73.9646597452128 40.7827698220703) +-73.97826438139,40.7717086090782,6A-AM-1006-04,06A,AM,10062018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,true,false,false,false,curious,POINT (-73.97826438139 40.7717086090782) +-73.9785133301426,40.7718260288338,6A-PM-1012-05,06A,PM,10122018,5,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9785133301426 40.7718260288338) +-73.9543323786888,40.7943086530436,37G-PM-1007-03,37G,PM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,false,true,false,"lying on belly on branch,eating big nut",false,false,false,false,false,false,false,false,,POINT (-73.9543323786888 40.7943086530436) +-73.9712256765283,40.7760942872488,13D-PM-1018-13,13D,PM,10182018,13,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White","Gray, Cinnamon & White selected as Primary. White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9712256765283 40.7760942872488) +-73.9593352806175,40.7918150568046,33E-AM-1014-02,33E,AM,10142018,2,Juvenile,Black,,Black+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9593352806175 40.7918150568046) +-73.9727488640736,40.7781916780621,14B-PM-1014-06,14B,PM,10142018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,watching me,false,false,false,false,false,true,false,false,skittish,POINT (-73.9727488640736 40.7781916780621) +-73.9742804552383,40.7707167671865,7E-PM-1013-05,07E,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,On rocks,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9742804552383 40.7707167671865) +-73.9769319450348,40.7743883576247,9A-AM-1013-11,09A,AM,10132018,11,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,foot of tree,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9769319450348 40.7743883576247) +-73.9718270820347,40.7748300991287,11D-AM-1010-06,11D,AM,10102018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.97182708203471 40.7748300991287) +-73.9698196671161,40.7802972001469,18C-PM-1018-03,18C,PM,10182018,3,Juvenile,Gray,,Gray+,,Above Ground,1,,true,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9698196671161 40.7802972001469) +-73.9530263552489,40.7920949788358,36I-PM-1007-05,36I,PM,10072018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9530263552489 40.7920949788358) +-73.9808202088503,40.7682921842325,1A-PM-1014-02,01A,PM,10142018,2,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,6,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9808202088503 40.7682921842325) +-73.9522291603405,40.7976985385835,42G-PM-1014-01,42G,PM,10142018,1,Adult,Gray,White,Gray+White,,Above Ground,8,,false,false,true,false,true,,false,false,true,false,false,false,false,true,,POINT (-73.9522291603405 40.7976985385835) +-73.9685751595485,40.7709413567859,9I-PM-1010-07,09I,PM,10102018,7,Adult,Gray,White,Gray+White,,Above Ground,1,ran up tree,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9685751595485 40.7709413567859) +-73.9721592378418,40.776034583573,12C-AM-1013-02,12C,AM,10132018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9721592378418 40.776034583573) +-73.9540908513075,40.794201225045,37G-PM-1007-04,37G,PM,10072018,4,,Cinnamon,Gray,Cinnamon+Gray,gray tail,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9540908513075 40.794201225045) +-73.9573930079918,40.7934570294469,35E-AM-1020-03,35E,AM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9573930079918 40.7934570294469) +-73.9717580228664,40.7715726159383,8F-PM-1012-01,08F,PM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.97175802286641 40.7715726159383) +-73.9547711796823,40.7908540751983,34I-PM-1010-06,34I,PM,10102018,6,Adult,Gray,,Gray+,,,,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9547711796823 40.7908540751983) +-73.9589675995517,40.7913119223584,33E-AM-1014-09,33E,AM,10142018,9,Juvenile,Black,,Black+,,Above Ground,15,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9589675995517 40.7913119223584) +-73.9698762023146,40.7782055688113,16D-PM-1010-09,16D,PM,10102018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9698762023146 40.77820556881131) +-73.9671549566066,40.7751342870705,14H-AM-1007-01,14H,AM,10072018,1,Adult,Gray,,Gray+,,Above Ground,180,top of tree,true,false,false,false,false,jumping between branches,false,false,false,false,false,false,true,false,,POINT (-73.9671549566066 40.7751342870705) +-73.9679399097382,40.7742813149957,13H-PM-1010-09,13H,PM,10102018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.96793990973822 40.7742813149957) +-73.9629420113622,40.789133072717,29C-AM-1007-03,29C,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9629420113622 40.789133072717) +-73.9688466874605,40.7737911559867,12G-PM-1007-05,12G,PM,10072018,5,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9688466874605 40.7737911559867) +-73.9642411990432,40.7779692777193,18H-PM-1014-03,18H,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9642411990432 40.7779692777193) +-73.9653279069888,40.7758743113817,15I-AM-1008-02,15I,AM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,Could be same squirrel as #1?,Above Ground,4,on fence,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9653279069888 40.7758743113817) +-73.9556937218252,40.7990928062435,42C-AM-1007-04,42C,AM,10072018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",young adult,Ground Plane,FALSE,,false,false,false,false,false,walking,false,false,false,false,false,false,true,false,,POINT (-73.9556937218252 40.7990928062435) +-73.9558809064648,40.7952765022241,38E-PM-1014-03,38E,PM,10142018,3,,Gray,,Gray+,,Ground Plane,FALSE,THICK UNDERGROWTH,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9558809064648 40.7952765022241) +-73.957976896139,40.797027128241,39C-AM-1017-04,39C,AM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.957976896139 40.797027128241005) +-73.9769887473852,40.7707561532949,5C-PM-1010-04,05C,PM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.97698874738522 40.7707561532949) +-73.9655905300923,40.7752614638023,14I-PM-1018-06,14I,PM,10182018,6,Adult,Cinnamon,Black,Cinnamon+Black,,Above Ground,2,,true,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9655905300923 40.7752614638023) +-73.9588886083793,40.7909991733435,32E-PM-1017-01,32E,PM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9588886083793 40.7909991733435) +-73.9754836796706,40.7738879545412,9B-PM-1013-01,09B,PM,10132018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,playing,false,false,false,false,true,false,true,false,,POINT (-73.9754836796706 40.7738879545412) +-73.9662939630722,40.7878502338031,26B-AM-1010-01,26B,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,running across bridle path,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9662939630722 40.7878502338031) +-73.9613051957306,40.7909351393505,31D-AM-1014-02,31D,AM,10142018,2,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,Undergrowth,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9613051957306 40.7909351393505) +-73.9764235373322,40.770606513989,5C-PM-1010-11,05C,PM,10102018,11,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.97642353733221 40.770606513989) +-73.9705053821577,40.7787503220242,16C-AM-1014-04,16C,AM,10142018,4,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9705053821577 40.7787503220242) +-73.9763791121438,40.770281512254,5D-PM-1018-04,05D,PM,10182018,4,Adult,Gray,White,Gray+White,Partial missing tail,Ground Plane,FALSE,,false,true,false,false,false,chasing (dog chasing),false,false,false,false,false,false,false,true,,POINT (-73.9763791121438 40.770281512254) +-73.9600165785486,40.7952466761832,36B-PM-1013-03,36B,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9600165785486 40.7952466761832) +-73.9573724133264,40.7980080911115,40C-AM-1017-02,40C,AM,10172018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,true,false,chasing (#1),false,false,false,false,false,false,false,true,,POINT (-73.9573724133264 40.7980080911115) +-73.9580109357087,40.7855654405447,28I-AM-1013-01,28I,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Jumped onto path & then back into brush,false,false,false,false,false,stood on fence,false,false,false,false,false,false,false,true,,POINT (-73.9580109357087 40.7855654405447) +-73.9548877830136,40.7950157489103,38F-AM-1018-04,38F,AM,10182018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.95488778301362 40.7950157489103) +-73.9767314435027,40.7661199889431,1F-AM-1010-01,01F,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9767314435027 40.7661199889431) +-73.9673243699918,40.7875392957722,26A-AM-1014-01,26A,AM,10142018,1,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,could not get close due to fences,POINT (-73.9673243699918 40.7875392957722) +-73.9596375907038,40.7907347708353,32E-AM-1007-05,32E,AM,10072018,5,Adult,Black,,Black+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9596375907038 40.79073477083531) +-73.9673235555321,40.7786749596774,17F-PM-1020-04,17F,PM,10202018,4,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9673235555321 40.7786749596774) +-73.9757536187319,40.7755119810678,11A-PM-1013-03,11A,PM,10132018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9757536187319 40.7755119810678) +-73.9675047480308,40.7789234397249,17E-AM-1017-01,17E,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,Pond area,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9675047480308 40.7789234397249) +-73.9562765288004,40.7880617963868,31I-PM-1019-02,31I,PM,10192018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9562765288004 40.7880617963868) +-73.9558589529608,40.7892400394941,32H-PM-1006-02,32H,PM,10062018,2,,Gray,,Gray+,,Above Ground,8,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9558589529608 40.7892400394941) +-73.9785536529136,40.7716184505002,6A-PM-1012-07,06A,PM,10122018,7,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,elevated ground,false,true,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9785536529136 40.771618450500206) +-73.9719036217446,40.7803588122409,17A-AM-1017-01,17A,AM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,3,ground & tree,true,false,true,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9719036217446 40.7803588122409) +-73.9568382279233,40.7975685470963,40C-AM-1017-07,40C,AM,10172018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9568382279233 40.7975685470963) +-73.976730206737,40.773709213914,8A-PM-1014-01,08A,PM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,true,false,,true,false,false,false,false,false,false,true,runs from (goes up a tree),POINT (-73.976730206737 40.773709213914) +-73.972212563004,40.7761311465857,13C-PM-1019-05,13C,PM,10192018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,true,true,false,,POINT (-73.972212563004 40.7761311465857) +-73.9758152322587,40.7692377401467,4E-PM-1008-03,04E,PM,10082018,3,Adult,Gray,,Gray+,,,,,false,true,false,false,false,chasing #4,false,false,false,false,false,false,false,false,,POINT (-73.9758152322587 40.7692377401467) +-73.954092292214,40.7979800395433,41E-PM-1013-05,41E,PM,10132018,5,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",White tail,Above Ground,10,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.954092292214 40.7979800395433) +-73.9734762649298,40.7663703404546,3H-AM-1008-05,03H,AM,10082018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,13,,false,false,true,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9734762649298 40.7663703404546) +-73.9539400028236,40.79800412717,41E-AM-1007-02,41E,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9539400028236 40.79800412717) +-73.9554891003543,40.7968774599654,40E-AM-1014-03,40E,AM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9554891003543 40.79687745996541) +-73.9809610117171,40.7683896665502,2A-AM-1010-02,02A,AM,10102018,2,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,perched on small fence,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9809610117171 40.7683896665502) +-73.9801661903932,40.7697950141751,3A-PM-1017-03,03A,PM,10172018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9801661903932 40.7697950141751) +-73.9570056123953,40.7878756067582,30I-PM-1006-02,30I,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9570056123953 40.7878756067582) +-73.9703401385684,40.7795238784266,17C-PM-1013-01,17C,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,then perched on 2-ft high border fencing,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9703401385684 40.7795238784266) +-73.976769659152,40.7741908010484,9A-AM-1013-04,09A,AM,10132018,4,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.976769659152 40.7741908010484) +-73.9728783802067,40.7731671049246,9E-PM-1014-02,09E,PM,10142018,2,Juvenile,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9728783802067 40.7731671049246) +-73.9553726714504,40.7987578541123,41D-AM-1014-02,41D,AM,10142018,2,Adult,Gray,,Gray+,,Above Ground,20,,false,false,false,false,false,jumping,false,false,false,false,false,false,true,false,,POINT (-73.9553726714504 40.7987578541123) +-73.9679008849677,40.7759013923034,14G-AM-1012-02,14G,AM,10122018,2,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9679008849677 40.7759013923034) +-73.9704575848926,40.7693499326095,7H-PM-1006-09,07H,PM,10062018,9,Adult,Black,,Black+,,Ground Plane,FALSE,by tree,false,false,false,true,true,,false,false,false,true,false,true,false,true,,POINT (-73.9704575848926 40.7693499326095) +-73.9572686979412,40.796268457326,38D-AM-1017-03,38D,AM,10172018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,false,false,,POINT (-73.9572686979412 40.796268457326) +-73.9638298997554,40.7825966332367,22F-AM-1007-03,22F,AM,10072018,3,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",large white highlight,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9638298997554 40.7825966332367) +-73.9700759073973,40.7680560871695,5I-AM-1010-01,05I,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9700759073973 40.7680560871695) +-73.9721854790038,40.7761086352438,12C-AM-1013-01,12C,AM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.9721854790038 40.7761086352438) +-73.9766440589836,40.7682390282581,3E-AM-1006-02,03E,AM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9766440589836 40.7682390282581) +-73.9725174868556,40.7664248283566,3H-PM-1014-07,03H,PM,10142018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9725174868556 40.7664248283566) +-73.9563661256875,40.7966823114508,39D-AM-1008-03,39D,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9563661256875 40.7966823114508) +-73.9687027782726,40.7705162616199,9I-AM-1014-09,09I,AM,10142018,9,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.96870277827261 40.7705162616199) +-73.9624538733037,40.7883829851518,28D-AM-1012-04,28D,AM,10122018,4,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9624538733037 40.7883829851518) +-73.9706903740547,40.7726873760687,10G-AM-1006-07,10G,AM,10062018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9706903740547 40.77268737606871) +-73.9802079259866,40.7678723471007,1B-AM-1012-10,01B,AM,10122018,10,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9802079259866 40.7678723471007) +-73.9602398690946,40.7910157676119,32D-PM-1006-04,32D,PM,10062018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,40,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9602398690946 40.7910157676119) +-73.9709244006956,40.7676942639697,5I-AM-1010-02,05I,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9709244006956 40.7676942639697) +-73.9588708103486,40.7905794078843,32F-PM-1008-05,32F,PM,10082018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9588708103486 40.7905794078843) +-73.958417813526,40.7927301214476,34E-PM-1006-01,34E,PM,10062018,1,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Above Ground,20,,false,false,false,false,false,sitting and watching on a tree,false,false,false,false,false,false,true,false,,POINT (-73.958417813526 40.7927301214476) +-73.9779811967788,40.7675178797546,2D-AM-1007-01,02D,AM,10072018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9779811967788 40.7675178797546) +-73.9759830650957,40.7683034739069,3E-AM-1006-01,03E,AM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9759830650957 40.7683034739069) +-73.9710207438538,40.7682187144432,5I-AM-1010-05,05I,AM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9710207438538 40.7682187144432) +-73.9799155966086,40.7698034314993,3A-PM-1017-08,03A,PM,10172018,8,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9799155966086 40.7698034314993) +-73.977447585355,40.7697167828003,4C-PM-1010-11,04C,PM,10102018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.977447585355 40.7697167828003) +-73.955018489069,40.7971235333699,40E-PM-1017-02,40E,PM,10172018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.955018489069 40.7971235333699) +-73.9564011421122,40.7958097849369,38E-AM-1010-02,38E,AM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,climbs,POINT (-73.95640114211221 40.7958097849369) +-73.9552880892701,40.7889040503316,32I-AM-1013-04,32I,AM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9552880892701 40.7889040503316) +-73.9651828383592,40.7802820943863,19F-PM-1017-06,19F,PM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,true,false,false,,false,false,false,false,true,true,false,false,,POINT (-73.9651828383592 40.7802820943863) +-73.9707683621584,40.7759815566123,13E-AM-1017-11,13E,AM,10172018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,on/in log,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9707683621584 40.77598155661231) +-73.9691057326088,40.7765973509721,14F-PM-1012-07,14F,PM,10122018,7,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,true,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9691057326088 40.7765973509721) +-73.9658181813014,40.7798160637561,19F-AM-1007-01,19F,AM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,bit scared,POINT (-73.9658181813014 40.7798160637561) +-73.9695745672033,40.7791835122147,17D-AM-1008-06,17D,AM,10082018,6,,,,+,,Above Ground,,"high in tree, couldn't see it, only heard it",false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9695745672033 40.7791835122147) +-73.9636971843665,40.7825638537362,22F-AM-1007-04,22F,AM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9636971843665 40.7825638537362) +-73.9580785600617,40.7957981310897,37C-PM-1013-01,37C,PM,10132018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9580785600617 40.7957981310897) +-73.970595381455,40.7762912142457,13E-PM-1008-05,13E,PM,10082018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.970595381455 40.7762912142457) +-73.9767949141123,40.774454583585,9A-PM-1010-01,09A,PM,10102018,1,Adult,,,+,,Ground Plane,FALSE,by large tree in sectioned off area,false,false,true,false,false,i think it climbed the tree when i first saw it.,false,false,false,false,false,false,true,false,,POINT (-73.9767949141123 40.774454583585) +-73.9695964983454,40.7802302192799,18C-PM-1018-08,18C,PM,10182018,8,Juvenile,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9695964983454 40.7802302192799) +-73.9594529310985,40.7840492606552,26I-PM-1010-04,26I,PM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.95945293109851 40.7840492606552) +-73.969353372175,40.7838247422369,21A-AM-1019-06,21A,AM,10192018,6,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.969353372175 40.7838247422369) +-73.9698032734704,40.7782343912417,16D-AM-1007-02,16D,AM,10072018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9698032734704 40.7782343912417) +-73.9685080639873,40.7745309794155,13G-PM-1008-03,13G,PM,10082018,3,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,20,maple tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9685080639873 40.77453097941551) +-73.9656098194149,40.7757643078973,15I-AM-1008-05,15I,AM,10082018,5,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9656098194149 40.7757643078973) +-73.970465600402,40.7701125773248,7H-PM-1006-05,07H,PM,10062018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,"Ran across path to eat behind fence, next to the fence.",true,false,false,true,true,,false,false,false,false,true,false,false,true,,POINT (-73.970465600402 40.7701125773248) +-73.9585537668382,40.7903905787005,32F-AM-1012-03,32F,AM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,bringing green leaves to nest,false,false,false,false,false,false,false,false,,POINT (-73.9585537668382 40.7903905787005) +-73.9504693544225,40.797225436004,42H-AM-1019-01,42H,AM,10192018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9504693544225 40.797225436004) +-73.9691261755936,40.7702929428604,8I-AM-1006-12,08I,AM,10062018,12,Adult,Gray,,Gray+,,Above Ground,50,tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9691261755936 40.7702929428604) +-73.9529230207908,40.7960663442573,40G-PM-1013-06,40G,PM,10132018,6,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,along the road,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9529230207908 40.7960663442573) +-73.963858549251,40.7808999610914,21G-AM-1014-03,21G,AM,10142018,3,Adult,Gray,White,Gray+White,,Above Ground,7,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.963858549251 40.7808999610914) +-73.9576304473722,40.7959810622342,38D-AM-1017-05,38D,AM,10172018,5,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",Black stripe along sides,Ground Plane,FALSE,,true,false,false,true,false,eating (nut),false,false,false,false,false,false,false,true,,POINT (-73.9576304473722 40.7959810622342) +-73.9793565564361,40.7679259390448,2C-AM-1010-09,02C,AM,10102018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,climbed up tree as i neared,POINT (-73.9793565564361 40.7679259390448) +-73.9779228287629,40.7681019683859,3D-PM-1010-01,03D,PM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9779228287629 40.7681019683859) +-73.9570132570934,40.7932014159087,35F-PM-1012-01,35F,PM,10122018,1,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,true,false,false,true,true,,POINT (-73.9570132570934 40.7932014159087) +-73.961547503801,40.7931560668672,33B-AM-1010-06,33B,AM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.961547503801 40.7931560668672) +-73.9592819491968,40.7941062008626,35C-AM-1007-06,35C,AM,10072018,6,Adult,,,+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9592819491968 40.7941062008626) +-73.9519387881692,40.7936273636929,38I-PM-1014-04,38I,PM,10142018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9519387881692 40.7936273636929) +-73.9695569897042,40.7712062147171,9H-PM-1018-01,09H,PM,10182018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.96955698970422 40.7712062147171) +-73.9767980925124,40.774362775678,9A-PM-1010-02,09A,PM,10102018,2,Adult,,,+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9767980925124 40.774362775678) +-73.9736169886655,40.7714942196257,7E-AM-1006-06,07E,AM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9736169886655 40.7714942196257) +-73.956200809768,40.798181446265,40C-AM-1017-06,40C,AM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.956200809768 40.798181446265) +-73.9691585756191,40.776340465695,14F-AM-1007-03,14F,AM,10072018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9691585756191 40.776340465695) +-73.9772026572674,40.7691598773017,4D-PM-1008-14,04D,PM,10082018,14,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9772026572674 40.7691598773017) +-73.9745427984089,40.7691848214817,5E-AM-1008-03,05E,AM,10082018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9745427984089 40.7691848214817) +-73.9574749571848,40.7981898890735,40C-PM-1006-08,40C,PM,10062018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,By the main road,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9574749571848 40.7981898890735) +-73.9661694463488,40.7757530583569,15H-PM-1008-07,15H,PM,10082018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,along bottom of rock outcropping,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9661694463488 40.7757530583569) +-73.9626881234742,40.7905208345549,30C-AM-1014-01,30C,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9626881234742 40.7905208345549) +-73.9669814346326,40.780390919948,19E-PM-1018-01,19E,PM,10182018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9669814346326 40.780390919948) +-73.9718262034469,40.7666771797442,4I-PM-1007-02,04I,PM,10072018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9718262034469 40.7666771797442) +-73.9745953710328,40.7728284025195,8D-AM-1007-07,08D,AM,10072018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9745953710328 40.7728284025195) +-73.9654397484763,40.7798863522904,19F-PM-1017-03,19F,PM,10172018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9654397484763 40.7798863522904) +-73.9532952763106,40.7920074462622,36I-AM-1017-08,36I,AM,10172018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,chasing (#7),false,false,false,false,true,false,false,true,runs from (me),POINT (-73.95329527631061 40.7920074462622) +-73.9689627791,40.776062004359,14F-AM-1007-06,14F,AM,10072018,6,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9689627791 40.776062004359) +-73.973305698325,40.7783823311296,14A-PM-1014-06,14A,PM,10142018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,9,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.973305698325 40.7783823311296) +-73.9634563222926,40.780992836417,21G-PM-1007-04,21G,PM,10072018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.9634563222926 40.780992836417) +-73.9602913105578,40.7910635810038,32D-PM-1006-03,32D,PM,10062018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,40,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9602913105578 40.7910635810038) +-73.9776044578446,40.7697607308033,4C-PM-1010-15,04C,PM,10102018,15,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,on tree,false,true,false,false,false,chasing #14,false,false,false,false,false,false,true,false,,POINT (-73.9776044578446 40.7697607308033) +-73.9607280801601,40.7901506706248,31D-PM-1006-01,31D,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,true,false,false,false,true,,POINT (-73.9607280801601 40.7901506706248) +-73.9733545802515,40.7675056025357,4G-AM-1006-04,04G,AM,10062018,4,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9733545802515 40.7675056025357) +-73.9695041366722,40.7797878809482,17D-AM-1008-02,17D,AM,10082018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9695041366722 40.7797878809482) +-73.9764397550289,40.7737004557104,8B-AM-1007-01,08B,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9764397550289 40.7737004557104) +-73.9714921188372,40.776758371867,14D-AM-1014-11,14D,AM,10142018,11,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714921188372 40.776758371867) +-73.971379936565,40.7721434941226,9F-PM-1014-05,09F,PM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.971379936565 40.7721434941226) +-73.9660110060416,40.7809990098597,20F-AM-1014-01,20F,AM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9660110060416 40.7809990098597) +-73.9711176999471,40.7724278547281,10F-PM-1019-06,10F,PM,10192018,6,Adult,Gray,White,Gray+White,,Above Ground,10,Different tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9711176999471 40.7724278547281) +-73.9725712588741,40.7669101832926,4H-AM-1006-02,04H,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,climbing (over small wire fence then on the ground),false,false,false,false,false,true,false,true,"approaches (saw me & came forward),runs from (startled by another person)",POINT (-73.9725712588741 40.7669101832926) +-73.9620597449066,40.7922465876813,33B-PM-1010-10,33B,PM,10102018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,true,false,false,false,false,false,false,false,,POINT (-73.9620597449066 40.7922465876813) +-73.9583477850634,40.7914073632782,33F-PM-1012-06,33F,PM,10122018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,true,true,,true,false,false,false,true,false,false,false,,POINT (-73.9583477850634 40.7914073632782) +-73.9790214253443,40.7686791169776,3B-PM-1007-10,03B,PM,10072018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,hopping,false,false,false,false,false,false,true,false,,POINT (-73.9790214253443 40.7686791169776) +-73.9767016963397,40.7674012784541,2E-PM-1014-02,02E,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9767016963397 40.7674012784541) +-73.9565035705619,40.7937382705056,36F-AM-1017-04,36F,AM,10172018,4,Juvenile,Gray,White,Gray+White,"White legs, front & back",Ground Plane,FALSE,,true,false,false,true,true,,true,false,false,false,false,true,false,true,"approaches (me),runs from (me)",POINT (-73.9565035705619 40.7937382705056) +-73.9745687653791,40.7776396926997,13A-PM-1014-02,13A,PM,10142018,2,Adult,Gray,,Gray+,,Above Ground,45,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9745687653791 40.7776396926997) +-73.9671640520938,40.7772236833816,16G-AM-1010-02,16G,AM,10102018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9671640520938 40.7772236833816) +-73.9591407691,40.7960846903122,37B-AM-1018-01,37B,AM,10182018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9591407691 40.7960846903122) +-73.9771422625274,40.772361415776,7B-AM-1008-02,07B,AM,10082018,2,Adult,Gray,,Gray+,,Above Ground,5,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9771422625274 40.772361415776) +-73.9756603846107,40.7672531319384,3F-PM-1013-03,03F,PM,10132018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9756603846107 40.7672531319384) +-73.9686304581526,40.7773631337117,15E-PM-1008-01,15E,PM,10082018,1,Adult,Gray,,Gray+,,Above Ground,4,on fallen tree,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9686304581526 40.7773631337117) +-73.9699672074164,40.7774389345748,15D-AM-1007-07,15D,AM,10072018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,true,chasing #8,false,false,false,false,false,false,true,false,,POINT (-73.9699672074164 40.7774389345748) +-73.9683479943823,40.7815827298303,20C-PM-1018-01,20C,PM,10182018,1,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9683479943823 40.7815827298303) +-73.9768617690725,40.7741877060705,9A-PM-1010-03,09A,PM,10102018,3,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,froze - standing on hind legs for ~10 seconds then scampered off,POINT (-73.97686176907251 40.7741877060705) +-73.9729378674198,40.7672407594559,4H-AM-1006-04,04H,AM,10062018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,met #3 while foraging and briefly tussled,false,false,false,false,false,false,true,false,,POINT (-73.9729378674198 40.7672407594559) +-73.9563203089105,40.7906275357726,33G-PM-1006-01,33G,PM,10062018,1,Juvenile,Gray,,Gray+,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9563203089105 40.7906275357726) +-73.9579941847434,40.7991216713328,41B-PM-1014-02,41B,PM,10142018,2,Adult,Black,,Black+,,Above Ground,28,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9579941847434 40.7991216713328) +-73.9773079154219,40.7696506688861,4C-AM-1006-02,04C,AM,10062018,2,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9773079154219 40.7696506688861) +-73.9783185278595,40.7724861675504,7A-AM-1006-03,07A,AM,10062018,3,Adult,Gray,,Gray+,"3/4 length tail, hair loss",Above Ground,20,"in trees, then to ground",true,false,true,false,false,jumping,false,false,false,false,false,false,true,false,,POINT (-73.9783185278595 40.7724861675504) +-73.9703621616472,40.775032271482,12E-AM-1017-08,12E,AM,10172018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,,false,false,false,true,false,chilling,false,false,false,false,false,false,true,false,,POINT (-73.9703621616472 40.775032271482) +-73.969951118124,40.7762756593015,14E-AM-1008-17,14E,AM,10082018,17,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.96995111812402 40.7762756593015) +-73.9718234159557,40.7810842503715,18A-AM-1012-02,18A,AM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,false,true,true,true,burying,false,false,false,true,false,false,false,true,,POINT (-73.9718234159557 40.7810842503715) +-73.975062146111,40.7723417173451,8C-PM-1013-07,08C,PM,10132018,7,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.975062146111 40.7723417173451) +-73.9679291347956,40.7846973096665,23B-PM-1012-02,23B,PM,10122018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,true,2/3 were chasing each other,false,false,false,false,true,false,false,true,,POINT (-73.9679291347956 40.7846973096665) +-73.9767455430709,40.7717866237826,6B-PM-1017-06,06B,PM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9767455430709 40.7717866237826) +-73.9746608786299,40.7776092078254,13A-AM-1017-01,13A,AM,10172018,1,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9746608786299 40.7776092078254) +-73.96797780019,40.7847629473258,23B-PM-1012-05,23B,PM,10122018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,chain link fence,false,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.96797780019 40.7847629473258) +-73.9684463154398,40.7834813319352,21B-AM-1019-02,21B,AM,10192018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9684463154398 40.7834813319352) +-73.9655734633649,40.7805366922231,20F-AM-1014-02,20F,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,30,,false,false,true,false,false,pulling leaves,true,false,false,false,false,false,false,false,,POINT (-73.9655734633649 40.7805366922231) +-73.9729394928432,40.7743256716496,11D-AM-1010-01,11D,AM,10102018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9729394928432 40.7743256716496) +-73.976521916284,40.773784724458,9B-AM-1010-01,09B,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,true,false,false,false,false,false,false,true,,POINT (-73.976521916284 40.773784724458) +-73.9597782762029,40.7920773376757,33D-AM-1017-07,33D,AM,10172018,7,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,true,false,true,false,false,true,false,,POINT (-73.9597782762029 40.7920773376757) +-73.9648626810032,40.7804506112843,20G-AM-1018-02,20G,AM,10182018,2,Adult,Gray,,Gray+,,Above Ground,5,Ran up tree,true,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9648626810032 40.7804506112843) +-73.9584188461059,40.7913241048498,33E-PM-1012-07,33E,PM,10122018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9584188461059 40.7913241048498) +-73.9566189145352,40.7883417969746,31H-PM-1008-01,31H,PM,10082018,1,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9566189145352 40.7883417969746) +-73.9673603655908,40.7876974177782,26A-PM-1006-03,26A,PM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9673603655908 40.7876974177782) +-73.9595757792683,40.7899242643847,31E-PM-1006-01,31E,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,under bushes,false,false,false,false,true,,false,true,false,false,false,false,true,false,,POINT (-73.9595757792683 40.7899242643847) +-73.9686816795392,40.775770422667,14F-PM-1012-02,14F,PM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,3,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9686816795392 40.775770422667) +-73.9654210263521,40.7782529692575,17G-AM-1018-01,17G,AM,10182018,1,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9654210263521 40.77825296925751) +-73.9677054870327,40.778992870166,17E-AM-1017-03,17E,AM,10172018,3,Adult,Gray,,Gray+,,Above Ground,9,Tree trunk,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9677054870327 40.778992870166) +-73.9745305540008,40.7742043234014,10C-PM-1013-02,10C,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,true,,POINT (-73.9745305540008 40.7742043234014) +-73.9675472064204,40.7835947167436,22C-PM-1006-06,22C,PM,10062018,6,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,10,on tree,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9675472064204 40.7835947167436) +-73.955516031113,40.7923188156277,35G-AM-1007-01,35G,AM,10072018,1,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.955516031113 40.7923188156277) +-73.9710559113762,40.7794279914209,16C-PM-1018-01,16C,PM,10182018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,false,false,false,disappeared up other side of tree,POINT (-73.9710559113762 40.7794279914209) +-73.9677654289757,40.786785529449,25A-AM-1013-03,25A,AM,10132018,3,,Gray,,Gray+,,Above Ground,15,BIG TREE,false,false,false,false,false,being chased by #2,false,false,false,false,false,false,true,false,,POINT (-73.9677654289757 40.786785529449) +-73.9649658099293,40.7823262369074,22F-PM-1014-03,22F,PM,10142018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9649658099293 40.7823262369074) +-73.9619417432685,40.7930365939865,33B-PM-1010-12,33B,PM,10102018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9619417432685 40.7930365939865) +-73.953296595236,40.7927644594513,36I-AM-1017-03,36I,AM,10172018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon stripe on back,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.953296595236 40.7927644594513) +-73.9725157534356,40.7658376729234,2I-PM-1006-02,02I,PM,10062018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9725157534356 40.7658376729234) +-73.9687476703117,40.7742856696093,12G-AM-1012-01,12G,AM,10122018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9687476703117 40.7742856696093) +-73.9675023138703,40.7872554700995,25A-PM-1007-01,25A,PM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,40,tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9675023138703 40.7872554700995) +-73.9745040517502,40.77333038538,9C-PM-1006-06,09C,PM,10062018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97450405175022 40.77333038538) +-73.9772635911119,40.7709428872533,6B-PM-1017-03,06B,PM,10172018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9772635911119 40.7709428872533) +-73.9730115687964,40.7741018274312,10D-AM-1008-05,10D,AM,10082018,5,Juvenile,Gray,White,Gray+White,,Above Ground,25,,false,false,true,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9730115687964 40.7741018274312) +-73.9730111650468,40.7782157736204,14B-PM-1014-05,14B,PM,10142018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9730111650468 40.7782157736204) +-73.9790010565108,40.7685732369544,2C-PM-1013-09,02C,PM,10132018,9,Adult,,,+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9790010565108 40.7685732369544) +-73.9582523503306,40.7996897499473,41A-PM-1007-05,41A,PM,10072018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9582523503306 40.7996897499473) +-73.9706641770728,40.7759229213762,13E-AM-1017-12,13E,AM,10172018,12,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9706641770728 40.7759229213762) +-73.969345754447,40.7770429650288,15E-AM-1013-02,15E,AM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,true,false,true,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.969345754447 40.7770429650288) +-73.980854228628,40.7678702158382,1B-AM-1012-17,01B,AM,10122018,17,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.98085422862802 40.7678702158382) +-73.9529413156461,40.7920963446605,36I-PM-1007-06,36I,PM,10072018,6,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9529413156461 40.7920963446605) +-73.9682144039334,40.7773070675393,15F-AM-1007-08,15F,AM,10072018,8,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9682144039334 40.7773070675393) +-73.9743342303548,40.7727742948332,8D-AM-1007-08,08D,AM,10072018,8,Adult,Gray,,Gray+,,Above Ground,15,,false,false,false,false,false,communicating from tree,false,false,false,false,false,false,false,false,,POINT (-73.97433423035481 40.7727742948332) +-73.958494212554,40.7995008636057,41A-AM-1013-01,41A,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,ran across a path,false,false,false,false,false,false,true,false,,POINT (-73.958494212554 40.7995008636057) +-73.9697983725608,40.7700677022205,8I-PM-1013-09,08I,PM,10132018,9,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9697983725608 40.7700677022205) +-73.9697196619878,40.7814068507607,19B-AM-1019-01,19B,AM,10192018,1,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",Side stripes,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,true,indifferent then runs from,POINT (-73.9697196619878 40.7814068507607) +-73.9706851546184,40.7780777016038,15D-PM-1017-04,15D,PM,10172018,4,Adult,Cinnamon,,Cinnamon+,,Above Ground,2,on fence,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9706851546184 40.7780777016038) +-73.970475755546,40.7763348062134,13E-AM-1017-02,13E,AM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,begging (came one yard away from me and stood there),false,false,false,false,false,true,false,false,,POINT (-73.970475755546 40.7763348062134) +-73.9777259022441,40.7682059907903,3D-PM-1010-10,03D,PM,10102018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9777259022441 40.7682059907903) +-73.9716881838671,40.778553537087,15C-PM-1017-02,15C,PM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,0,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9716881838671 40.778553537087) +-73.9633250636501,40.7922155082679,32A-PM-1013-09,32A,PM,10132018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9633250636501 40.7922155082679) +-73.967418114684,40.7764595360054,15G-AM-1008-05,15G,AM,10082018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.967418114684 40.7764595360054) +-73.9771695272048,40.7724277276263,7B-AM-1008-03,07B,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,5,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9771695272048 40.7724277276263) +-73.9699675160516,40.7773012642758,15E-PM-1008-07,15E,PM,10082018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9699675160516 40.7773012642758) +-73.9758959798289,40.7694125671679,4D-PM-1008-01,04D,PM,10082018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9758959798289 40.7694125671679) +-73.9607608482656,40.7954687648248,36A-PM-1013-06,36A,PM,10132018,6,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,EDGE OF WOODS,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9607608482656 40.7954687648248) +-73.9753283783695,40.7733043910649,8C-PM-1013-02,08C,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9753283783695 40.7733043910649) +-73.9785300509908,40.7721127748427,6A-AM-1006-07,06A,AM,10062018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9785300509908 40.7721127748427) +-73.9540022445432,40.7979409854977,41E-AM-1007-01,41E,AM,10072018,1,Adult,Gray,White,Gray+White,white haunches,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9540022445432 40.7979409854977) +-73.9608757424052,40.7906686504657,31D-AM-1014-06,31D,AM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9608757424052 40.7906686504657) +-73.9603620122205,40.7955965755851,36B-AM-1013-02,36B,AM,10132018,2,,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,didn't see me,POINT (-73.9603620122205 40.7955965755851) +-73.9801902133148,40.769557595068,3A-AM-1012-03,03A,AM,10122018,3,Juvenile,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",Gray & Cinnamon selected as Primary. Black selected as Highlights. Made executive adjustments.,Above Ground,1,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9801902133148 40.769557595068) +-73.959077668148,40.7926045823346,34D-AM-1008-02,34D,AM,10082018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.959077668148 40.7926045823346) +-73.9576559099012,40.7992598626483,41B-AM-1010-09,41B,AM,10102018,9,Adult,Gray,,Gray+,,Above Ground,3,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9576559099012 40.7992598626483) +-73.954595058342,40.7956567934304,39F-AM-1014-04,39F,AM,10142018,4,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.954595058342 40.7956567934304) +-73.9606344681252,40.7958337780644,37B-PM-1013-04,37B,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9606344681252 40.795833778064406) +-73.9580105174865,40.7974468322692,39C-PM-1006-03,39C,PM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9580105174865 40.7974468322692) +-73.9557263533489,40.7939505791448,37F-PM-1014-02,37F,PM,10142018,2,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,LAWN,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.95572635334891 40.7939505791448) +-73.97002473509,40.7836929044459,21A-AM-1019-08,21A,AM,10192018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.97002473509 40.7836929044459) +-73.9545101041865,40.7903823616782,34I-PM-1010-03,34I,PM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,in the playground.,true,false,false,false,true,with some nuts in the mouth,false,false,false,false,false,false,false,false,,POINT (-73.9545101041865 40.7903823616782) +-73.9711801122578,40.7786888942214,16C-AM-1014-02,16C,AM,10142018,2,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.97118011225781 40.77868889422141) +-73.9595645962539,40.7899599350145,31E-PM-1006-03,31E,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,under bushes,false,false,false,true,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.9595645962539 40.7899599350145) +-73.9587712679442,40.7944502501428,36D-PM-1007-02,36D,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,true,false,,POINT (-73.9587712679442 40.7944502501428) +-73.9676206022477,40.784594234984,23B-PM-1012-01,23B,PM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9676206022477 40.784594234984) +-73.9741846413977,40.7762518164182,12B-PM-1018-01,12B,PM,10182018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,Climbing up rocks,false,false,true,false,true,climbing (up rocks),false,false,false,false,false,false,false,true,,POINT (-73.9741846413977 40.7762518164182) +-73.9703914126866,40.7722457975176,10G-PM-1017-01,10G,PM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,standing,false,false,false,false,false,false,true,false,,POINT (-73.9703914126866 40.7722457975176) +-73.9707900566519,40.7771670550089,14D-AM-1014-09,14D,AM,10142018,9,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9707900566519 40.7771670550089) +-73.975086415444,40.7671990131313,3F-AM-1006-01,03F,AM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,just to right when enter sanctuary,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.975086415444 40.7671990131313) +-73.9557172336815,40.7921125657722,35G-PM-1006-01,35G,PM,10062018,1,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9557172336815 40.7921125657722) +-73.9691031094688,40.7706693835189,9I-AM-1014-02,09I,AM,10142018,2,Adult,Gray,,Gray+,"Very far, so appx",Above Ground,35,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9691031094688 40.7706693835189) +-73.9615602805554,40.7945662185621,35A-PM-1013-08,35A,PM,10132018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9615602805554 40.7945662185621) +-73.9598084794625,40.7976165434502,39A-PM-1014-01,39A,PM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9598084794625 40.7976165434502) +-73.9746933852572,40.773313866931,9C-PM-1006-05,09C,PM,10062018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,w/ dog,POINT (-73.9746933852572 40.773313866931) +-73.9645147011741,40.7772566833799,17I-AM-1014-04,17I,AM,10142018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,true,false,,POINT (-73.9645147011741 40.7772566833799) +-73.9714089647431,40.7767916587915,14D-AM-1014-12,14D,AM,10142018,12,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9714089647431 40.7767916587915) +-73.9642379942652,40.7774792520738,17I-PM-1017-01,17I,PM,10172018,1,Juvenile,Cinnamon,White,Cinnamon+White,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,false,"was in a tree,so i couldn't really tell",POINT (-73.9642379942652 40.7774792520738) +-73.9582850206205,40.7978975855555,39B-PM-1014-01,39B,PM,10142018,1,Adult,Gray,White,Gray+White,White belly,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9582850206205 40.7978975855555) +-73.9582643954055,40.8000460061272,42A-AM-1019-01,42A,AM,10192018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.95826439540551 40.8000460061272) +-73.9771335416403,40.7668431485224,2E-AM-1010-01,02E,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9771335416403 40.7668431485224) +-73.9692190295442,40.7763366309154,14F-AM-1007-02,14F,AM,10072018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9692190295442 40.7763366309154) +-73.9736165917399,40.7724543901497,8D-AM-1007-04,08D,AM,10072018,4,Adult,Gray,,Gray+,,Above Ground,3,,false,true,false,false,false,chasing squirrel #3,false,false,false,false,false,false,false,false,,POINT (-73.9736165917399 40.7724543901497) +-73.9642288873015,40.7820439983567,22F-AM-1007-06,22F,AM,10072018,6,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9642288873015 40.7820439983567) +-73.9528462779437,40.7923843043685,36I-AM-1017-04,36I,AM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9528462779437 40.7923843043685) +-73.9609704650925,40.7938786854735,34B-AM-1013-03,34B,AM,10132018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,15,,true,false,true,false,false,hopping,false,false,false,false,false,true,false,true,,POINT (-73.9609704650925 40.7938786854735) +-73.9534509627885,40.7921084224711,36I-AM-1017-07,36I,AM,10172018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,"chasing (#8),scratching",true,false,false,false,true,false,true,false,,POINT (-73.9534509627885 40.7921084224711) +-73.9577113026056,40.7904332453456,32G-PM-1013-02,32G,PM,10132018,2,Juvenile,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9577113026056 40.7904332453456) +-73.9808247660048,40.7689408831287,2A-PM-1019-01,02A,PM,10192018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,runs from,false,false,false,true,false,false,false,true,,POINT (-73.9808247660048 40.7689408831287) +-73.9591667162801,40.7937602121568,35D-PM-1013-07,35D,PM,10132018,7,Juvenile,Gray,White,Gray+White,,Above Ground,12,tree,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.95916671628011 40.7937602121568) +-73.9714243547433,40.7713973982359,8G-PM-1017-02,08G,PM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714243547433 40.7713973982359) +-73.9629383420274,40.7889383725489,29C-AM-1007-02,29C,AM,10072018,2,Adult,Black,Gray,Black+Gray,,Above Ground,10,,true,false,true,false,false,,false,true,false,false,false,false,false,true,,POINT (-73.9629383420274 40.7889383725489) +-73.9600964585868,40.7952339524416,36B-PM-1013-02,36B,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,true,true,false,true,,POINT (-73.9600964585868 40.7952339524416) +-73.9713519158027,40.7798470142991,17B-AM-1010-01,17B,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9713519158027 40.7798470142991) +-73.953287300494,40.793520326789,37H-PM-1006-04,37H,PM,10062018,4,,,,+,,Above Ground,43,tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.953287300494 40.793520326789) +-73.9626120417397,40.7905126358626,30C-AM-1014-02,30C,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,on a rock,true,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9626120417397 40.7905126358626) +-73.9764016030666,40.7689894344251,4D-PM-1008-05,04D,PM,10082018,5,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9764016030666 40.7689894344251) +-73.969485639023,40.780519159069,18C-PM-1018-05,18C,PM,10182018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.969485639023 40.780519159069) +-73.9741621946917,40.7752481472025,11C-PM-1018-01,11C,PM,10182018,1,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9741621946917 40.7752481472025) +-73.9792091200122,40.7685845475313,2B-PM-1013-06,02B,PM,10132018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,true,false,false,sat there! in front of us,POINT (-73.9792091200122 40.7685845475313) +-73.9762257701293,40.7744032758323,9A-AM-1013-08,09A,AM,10132018,8,Adult,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9762257701293 40.7744032758323) +-73.9738481771673,40.7706540698938,7E-PM-1013-04,07E,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9738481771673 40.7706540698938) +-73.9629483374528,40.7936809905265,33A-PM-1018-03,33A,PM,10182018,3,Adult,Gray,,Gray+,,Above Ground,6,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9629483374528 40.7936809905265) +-73.9718720403657,40.7702335056337,7G-PM-1018-04,07G,PM,10182018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9718720403657 40.7702335056337) +-73.9583738783348,40.7979302775527,39B-PM-1014-02,39B,PM,10142018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9583738783348 40.7979302775527) +-73.9551524422379,40.7910535596756,34H-PM-1006-01,34H,PM,10062018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9551524422379 40.7910535596756) +-73.9770948563006,40.7724063459185,7B-AM-1008-04,07B,AM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9770948563006 40.7724063459185) +-73.9591957793992,40.7949568873453,36C-PM-1013-01,36C,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,Clearing near bike path (bikes active),false,true,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9591957793992 40.7949568873453) +-73.9700861859051,40.7770639340582,14E-PM-1017-04,14E,PM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9700861859051 40.7770639340582) +-73.9672789573537,40.7874778720268,26A-PM-1006-02,26A,PM,10062018,2,Juvenile,Gray,,Gray+,injured,Ground Plane,FALSE,,false,false,false,false,false,not moving,false,false,false,false,false,false,false,false,,POINT (-73.96727895735371 40.7874778720268) +-73.9710547484029,40.7723589827074,9F-PM-1014-03,09F,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9710547484029 40.7723589827074) +-73.9757215415855,40.7668205976986,2F-PM-1014-03,02F,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9757215415855 40.7668205976986) +-73.9735120882106,40.7715915415169,8E-PM-1008-07,08E,PM,10082018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,"5, 6, 7 all at same tree trunk base",false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9735120882106 40.7715915415169) +-73.9565684577989,40.7936003940413,36F-PM-1012-02,36F,PM,10122018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9565684577989 40.7936003940413) +-73.9737872335563,40.7726586835985,8D-PM-1007-01,08D,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9737872335563 40.77265868359851) +-73.9786805884996,40.7697559231927,4B-PM-1018-02,04B,PM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9786805884996 40.7697559231927) +-73.9565533783499,40.7974368491287,40D-PM-1013-02,40D,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9565533783499 40.7974368491287) +-73.9678937289837,40.7782808361645,16E-PM-1018-01,16E,PM,10182018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9678937289837 40.7782808361645) +-73.9750463844984,40.7666871742836,2F-PM-1014-08,02F,PM,10142018,8,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9750463844984 40.7666871742836) +-73.9696517826558,40.7769658302844,14E-AM-1008-04,14E,AM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9696517826558 40.7769658302844) +-73.9635028497015,40.7928207574906,32A-PM-1013-05,32A,PM,10132018,5,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9635028497015 40.7928207574906) +-73.9674177504573,40.7769569731993,15G-PM-1019-03,15G,PM,10192018,3,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9674177504573 40.7769569731993) +-73.9681042612938,40.772331431865,11I-PM-1012-04,11I,PM,10122018,4,Adult,Gray,,Gray+,,Above Ground,2,,true,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9681042612938 40.772331431865) +-73.9667755678511,40.7760256836088,15H-PM-1008-02,15H,PM,10082018,2,Adult,Gray,,Gray+,,Above Ground,10,oak tree,false,true,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9667755678511 40.7760256836088) +-73.9613351649026,40.7909866851357,31D-AM-1014-03,31D,AM,10142018,3,,Gray,White,Gray+White,,Ground Plane,FALSE,Undergrowth,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9613351649026 40.7909866851357) +-73.9611368390233,40.7815619053395,22I-AM-1007-02,22I,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9611368390233 40.7815619053395) +-73.9799311173259,40.7685576997559,2B-AM-1010-03,02B,AM,10102018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9799311173259 40.7685576997559) +-73.9675198230918,40.778631094685,17F-AM-1007-02,17F,AM,10072018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9675198230918 40.778631094685) +-73.9786898656279,40.7720833097065,6A-AM-1006-08,06A,AM,10062018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9786898656279 40.77208330970651) +-73.9755055978764,40.7707438681742,6D-AM-1008-02,06D,AM,10082018,2,Juvenile,Gray,,Gray+,,Above Ground,10,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9755055978764 40.7707438681742) +-73.9734687538064,40.7694308959222,6F-PM-1008-04,06F,PM,10082018,4,Adult,Cinnamon,White,Cinnamon+White,patches of white on haunches,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9734687538064 40.7694308959222) +-73.9542828053256,40.7941797320355,37G-AM-1014-03,37G,AM,10142018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9542828053256 40.7941797320355) +-73.9792754037291,40.7679690700399,2C-AM-1010-08,02C,AM,10102018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,3,stay on side of trunk,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9792754037291 40.7679690700399) +-73.9626527908786,40.7912472380247,31B-AM-1017-03,31B,AM,10172018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9626527908786 40.7912472380247) +-73.9702228131711,40.7742131587983,12F-PM-1007-12,12F,PM,10072018,12,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,5,,false,false,false,false,true,going down tree,false,false,false,false,false,false,true,false,,POINT (-73.9702228131711 40.7742131587983) +-73.969105907,40.7820474909192,20B-PM-1013-08,20B,PM,10132018,8,Adult,Gray,White,Gray+White,(very brown),Ground Plane,FALSE,,true,false,false,false,false,being chased by dog,false,false,false,false,false,false,false,true,,POINT (-73.969105907 40.7820474909192) +-73.9719941577406,40.77037129313,7G-AM-1010-04,07G,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9719941577406 40.77037129313) +-73.9531013359625,40.7921223556535,36I-PM-1007-04,36I,PM,10072018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9531013359625 40.7921223556535) +-73.9757216124349,40.7754310239649,11A-PM-1013-05,11A,PM,10132018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,true,digging,false,false,false,false,true,false,false,false,,POINT (-73.9757216124349 40.7754310239649) +-73.9664120826015,40.7888022709721,27A-AM-1008-01,27A,AM,10082018,1,Adult,Gray,,Gray+,,Above Ground,3,,false,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.96641208260151 40.7888022709721) +-73.958060992131,40.7907158878729,32F-AM-1012-06,32F,AM,10122018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.958060992131 40.7907158878729) +-73.9594120573719,40.7841945750598,26I-PM-1010-05,26I,PM,10102018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,10,tree,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9594120573719 40.7841945750598) +-73.9665705456197,40.7823552871044,21D-PM-1008-05,21D,PM,10082018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9665705456197 40.7823552871044) +-73.9796383715206,40.7682477738244,2B-AM-1010-07,02B,AM,10102018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9796383715206 40.7682477738244) +-73.9697277998257,40.7705198722028,8H-AM-1017-01,08H,AM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9697277998257 40.7705198722028) +-73.958024711869,40.7938724278575,36D-PM-1007-01,36D,PM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.958024711869 40.7938724278575) +-73.9514111329059,40.7975085872897,42G-AM-1018-01,42G,AM,10182018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,true,,POINT (-73.9514111329059 40.797508587289705) +-73.9760801742337,40.7674218954729,3E-AM-1006-04,03E,AM,10062018,4,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9760801742337 40.7674218954729) +-73.9770235090023,40.774135208066,9A-AM-1013-02,09A,AM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9770235090023 40.774135208066) +-73.9561887624471,40.7958187455815,38E-AM-1010-04,38E,AM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,true,false,false,false,true,me,POINT (-73.95618876244711 40.7958187455815) +-73.9676514056678,40.7730853732876,11H-AM-1010-01,11H,AM,10102018,1,Adult,Gray,White,Gray+White,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,true,false,false,started climbing down to me,POINT (-73.9676514056678 40.7730853732876) +-73.9681093100008,40.7731753915361,11H-PM-1013-01,11H,PM,10132018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,false,nut in mouth,false,false,false,false,false,false,true,false,,POINT (-73.9681093100008 40.7731753915361) +-73.9637279711853,40.7905198502307,30B-AM-1007-09,30B,AM,10072018,9,Adult,Gray,,Gray+,,Above Ground,50,,false,false,true,false,false,jumping b/w trees,false,false,false,false,false,false,false,false,,POINT (-73.9637279711853 40.7905198502307) +-73.9571233640232,40.7992458980266,41B-PM-1014-04,41B,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,40,,false,false,true,false,false,,false,false,false,false,false,false,false,false,climbing,POINT (-73.9571233640232 40.7992458980266) +-73.9698959071826,40.7716763799299,9H-AM-1006-05,09H,AM,10062018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9698959071826 40.7716763799299) +-73.9708002461415,40.7726685284831,10F-PM-1019-10,10F,PM,10192018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Arbor path & hill w/ bushes,true,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9708002461415 40.7726685284831) +-73.9578924882613,40.789806297824,32G-AM-1010-02,32G,AM,10102018,2,Adult,Gray,,Gray+,,Above Ground,13,,false,false,true,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9578924882613 40.789806297824) +-73.9591695545875,40.7938116360767,35D-PM-1013-08,35D,PM,10132018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9591695545875 40.7938116360767) +-73.9763116425885,40.7688839576487,4D-PM-1008-03,04D,PM,10082018,3,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,ran two feet up tree trunk,POINT (-73.9763116425885 40.7688839576487) +-73.9596006938677,40.7834706440535,25I-PM-1007-07,25I,PM,10072018,7,Adult,Gray,,Gray+,,Above Ground,,playing very high in tree w/ #8,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9596006938677 40.7834706440535) +-73.9609885686834,40.7961108640319,37A-PM-1013-01,37A,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.96098856868342 40.7961108640319) +-73.967042958599,40.7784370719371,17F-AM-1007-05,17F,AM,10072018,5,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.967042958599 40.7784370719371) +-73.9738611257716,40.7737246779587,10D-AM-1008-01,10D,AM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,true,false,false,false,true,false,false,true,,POINT (-73.9738611257716 40.7737246779587) +-73.9622030085794,40.7917723228749,32B-AM-1017-01,32B,AM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,ran up a tree,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9622030085794 40.7917723228749) +-73.9785948413883,40.7718908026758,6A-PM-1012-01,06A,PM,10122018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9785948413883 40.7718908026758) +-73.9718597156773,40.7765858763313,13C-PM-1019-04,13C,PM,10192018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9718597156773 40.7765858763313) +-73.9616204569548,40.7926188605509,33B-PM-1010-01,33B,PM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9616204569548 40.7926188605509) +-73.9772053786965,40.7663906573332,1E-PM-1007-02,01E,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9772053786965 40.7663906573332) +-73.9666195118963,40.7839216739357,22C-PM-1006-10,22C,PM,10062018,10,Adult,Gray,,Gray+,,Above Ground,13,,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9666195118963 40.78392167393571) +-73.9684758245091,40.7858531619022,24A-PM-1007-02,24A,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9684758245091 40.7858531619022) +-73.9706323458769,40.7713196034265,9G-PM-1007-03,09G,PM,10072018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9706323458769 40.771319603426505) +-73.9699451196396,40.7710409982701,9H-PM-1018-02,09H,PM,10182018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9699451196396 40.7710409982701) +-73.9761447791484,40.7690147873986,4D-PM-1008-02,04D,PM,10082018,2,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9761447791484 40.7690147873986) +-73.9700879096644,40.7765899724756,14E-PM-1017-05,14E,PM,10172018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9700879096644 40.7765899724756) +-73.9717920322306,40.7763095393715,13D-AM-1014-10,13D,AM,10142018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9717920322306 40.7763095393715) +-73.9533923917973,40.7961701874769,40G-AM-1007-01,40G,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,large tree,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9533923917973 40.7961701874769) +-73.9773096718574,40.7738053862489,8A-AM-1013-06,08A,AM,10132018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9773096718574 40.7738053862489) +-73.9738817388158,40.7712709366093,7E-AM-1006-01,07E,AM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,under a tree,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9738817388158 40.7712709366093) +-73.9532838338416,40.7931112674583,37H-AM-1018-01,37H,AM,10182018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,Right behind fence of the conservatory,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9532838338416 40.7931112674583) +-73.9654093844049,40.7806896368469,20F-PM-1007-09,20F,PM,10072018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9654093844049 40.7806896368469) +-73.9736543790582,40.7651444188432,1H-AM-1012-02,01H,AM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9736543790582 40.7651444188432) +-73.9568143871234,40.7899001700041,32G-AM-1010-01,32G,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9568143871234 40.7899001700041) +-73.9701596268736,40.7702106607329,8H-PM-1014-09,08H,PM,10142018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701596268736 40.7702106607329) +-73.9637415893182,40.7898140363534,29B-AM-1007-01,29B,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9637415893182 40.7898140363534) +-73.971791854883,40.7802971729784,17B-PM-1012-01,17B,PM,10122018,1,Adult,Gray,,Gray+,,Above Ground,2,climbed a fence,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.971791854883 40.7802971729784) +-73.9699763667769,40.7757060731026,13E-PM-1008-11,13E,PM,10082018,11,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9699763667769 40.775706073102604) +-73.9547959269955,40.7925162926273,36H-PM-1008-01,36H,PM,10082018,1,Adult,Gray,White,Gray+White,white belly,Above Ground,20,,true,false,true,false,true,,true,true,false,false,false,false,true,false,,POINT (-73.9547959269955 40.7925162926273) +-73.9658443548822,40.7796704898979,19F-AM-1007-03,19F,AM,10072018,3,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,scared,POINT (-73.9658443548822 40.7796704898979) +-73.960657061561,40.7956150744102,36A-PM-1013-08,36A,PM,10132018,8,,Gray,,Gray+,,Ground Plane,FALSE,"""FIELD""",true,false,false,false,false,running from #7,false,false,false,false,false,false,false,true,,POINT (-73.960657061561 40.7956150744102) +-73.9581173730857,40.7954772170549,37D-PM-1014-08,37D,PM,10142018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9581173730857 40.7954772170549) +-73.9586527721822,40.7908831110561,32F-PM-1008-08,32F,PM,10082018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9586527721822 40.7908831110561) +-73.9613862251332,40.791282169715,32C-AM-1014-03,32C,AM,10142018,3,Adult,Gray,,Gray+,,Above Ground,3,,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9613862251332 40.791282169715) +-73.9746133058077,40.7760646554109,11B-PM-1014-04,11B,PM,10142018,4,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,jumping,false,false,false,false,false,false,false,false,,POINT (-73.9746133058077 40.776064655410906) +-73.9623922773932,40.7814944428327,22H-PM-1007-04,22H,PM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9623922773932 40.7814944428327) +-73.9731457102903,40.7660255393205,2H-AM-1006-03,02H,AM,10062018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9731457102903 40.7660255393205) +-73.9715466850324,40.7695584933538,6H-PM-1020-03,06H,PM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Nothing selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,runs from (kids kicking the fence),POINT (-73.9715466850324 40.7695584933538) +-73.9621066718851,40.7942427079733,34A-AM-1012-03,34A,AM,10122018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9621066718851 40.7942427079733) +-73.9631045499811,40.7906180969472,30B-PM-1019-04,30B,PM,10192018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9631045499811 40.7906180969472) +-73.9708301070924,40.7820200927465,19A-PM-1013-01,19A,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,planting acorns,false,false,false,false,false,false,true,false,,POINT (-73.9708301070924 40.7820200927465) +-73.958317581802,40.7916566683158,33E-AM-1014-12,33E,AM,10142018,12,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,false,false,false,sleeping,false,false,false,false,false,false,false,false,asleep,POINT (-73.958317581802 40.7916566683158) +-73.9683994064731,40.7710765500799,9I-AM-1014-06,09I,AM,10142018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.96839940647311 40.7710765500799) +-73.9689781843873,40.7709333833783,9I-PM-1010-04,09I,PM,10102018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9689781843873 40.7709333833783) +-73.9773529368499,40.7728750685699,7B-AM-1008-12,07B,AM,10082018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9773529368499 40.7728750685699) +-73.97035767623,40.7714036487747,9H-PM-1018-09,09H,PM,10182018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.97035767623 40.7714036487747) +-73.978392591149,40.7668993398193,1D-PM-1007-04,01D,PM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.978392591149 40.7668993398193) +-73.9704591091677,40.7729175143429,10G-AM-1006-02,10G,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,notch on tail,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9704591091677 40.7729175143429) +-73.9705977059862,40.7760413182276,13E-AM-1017-09,13E,AM,10172018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9705977059862 40.776041318227605) +-73.9753744539307,40.7671162211032,2F-PM-1014-12,02F,PM,10142018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.97537445393071 40.7671162211032) +-73.956869086031,40.7988858771114,41C-AM-1017-05,41C,AM,10172018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.956869086031 40.7988858771114) +-73.9740381194088,40.7675912588173,4G-PM-1007-01,04G,PM,10072018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9740381194088 40.7675912588173) +-73.9764601882854,40.766070446642,1F-AM-1010-05,01F,AM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9764601882854 40.766070446642) +-73.9676692772518,40.7764726688908,15G-AM-1008-03,15G,AM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9676692772518 40.7764726688908) +-73.9612349421547,40.7959586475744,36A-PM-1013-09,36A,PM,10132018,9,,Gray,,Gray+,,Ground Plane,FALSE,THICK UNDERGROWTH,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9612349421547 40.7959586475744) +-73.9709817796369,40.7773554311586,14D-PM-1019-07,14D,PM,10192018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9709817796369 40.7773554311586) +-73.9673160165357,40.7766158001202,15G-PM-1019-12,15G,PM,10192018,12,Adult,Gray,,Gray+,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,false,stared,POINT (-73.9673160165357 40.7766158001202) +-73.9676424599715,40.7777766106807,16F-AM-1008-01,16F,AM,10082018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,near fence,false,false,false,false,true,,false,false,false,false,true,true,false,false,,POINT (-73.9676424599715 40.7777766106807) +-73.9641552070803,40.7908479527923,30B-AM-1007-05,30B,AM,10072018,5,Adult,Gray,,Gray+,,Above Ground,10,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9641552070803 40.7908479527923) +-73.9672950266018,40.7782477517567,17F-PM-1020-01,17F,PM,10202018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,7,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9672950266018 40.7782477517567) +-73.9681722244801,40.783559826281,22B-PM-1014-07,22B,PM,10142018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9681722244801 40.783559826281) +-73.978400938697,40.7677411911854,2C-PM-1013-03,02C,PM,10132018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.978400938697 40.7677411911854) +-73.9649827807341,40.7817322832767,21F-AM-1018-06,21F,AM,10182018,6,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9649827807341 40.7817322832767) +-73.9787040192473,40.7679010247281,2C-AM-1010-06,02C,AM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,stood still & watched me then jumped on a fence and ran away,false,false,false,false,false,false,true,true,,POINT (-73.9787040192473 40.7679010247281) +-73.9603031059614,40.7943667735668,35C-PM-1013-05,35C,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9603031059614 40.7943667735668) +-73.9629615594409,40.7924176425827,32B-PM-1010-06,32B,PM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9629615594409 40.7924176425827) +-73.9635689059841,40.790163434915,30B-PM-1019-03,30B,PM,10192018,3,Adult,Gray,Black,Gray+Black,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9635689059841 40.790163434915) +-73.9708083587471,40.7825429441583,19A-PM-1013-03,19A,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9708083587471 40.7825429441583) +-73.9772422664657,40.773436329163,8A-AM-1013-02,08A,AM,10132018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,playground,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9772422664657 40.773436329163) +-73.9718553361982,40.7748584798761,11D-AM-1010-05,11D,AM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9718553361982 40.7748584798761) +-73.9698843507358,40.7803754187581,18C-PM-1018-02,18C,PM,10182018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9698843507358 40.7803754187581) +-73.9703149829421,40.7785583630323,16D-AM-1007-01,16D,AM,10072018,1,Adult,Gray,White,Gray+White,,Above Ground,3,,false,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9703149829421 40.7785583630323) +-73.9790896775237,40.7688048644871,3B-AM-1010-10,03B,AM,10102018,10,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9790896775237 40.7688048644871) +-73.9600546294497,40.7914969165757,33D-AM-1017-03,33D,AM,10172018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,true,false,,POINT (-73.9600546294497 40.7914969165757) +-73.980948293606,40.7685688850628,2A-PM-1019-04,02A,PM,10192018,4,Juvenile,Gray,White,Gray+White,,Above Ground,15,in tree!,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.980948293606 40.7685688850628) +-73.9805137046778,40.769275143797,2A-AM-1010-08,02A,AM,10102018,8,Adult,Gray,,Gray+,Nothing selected as Primary. Gray selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9805137046778 40.769275143797) +-73.9801985977846,40.7680159511705,1B-AM-1012-11,01B,AM,10122018,11,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,fighting w/ pigeons,false,false,false,false,false,false,true,false,,POINT (-73.9801985977846 40.7680159511705) +-73.9672070423666,40.783337354891,22C-PM-1006-02,22C,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9672070423666 40.783337354891) +-73.9645547556826,40.776877007081,16I-AM-1008-04,16I,AM,10082018,4,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,9,tree hollow,false,false,false,false,false,in hollow,false,false,false,false,false,false,false,false,curious,POINT (-73.9645547556826 40.776877007081) +-73.9670850805619,40.7833747810387,22C-PM-1006-01,22C,PM,10062018,1,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,for food,false,true,false,false,false,false,false,false,,POINT (-73.9670850805619 40.7833747810387) +-73.9558268731771,40.7952074193788,38E-PM-1014-04,38E,PM,10142018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,THICK UNDERGROWTH,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9558268731771 40.7952074193788) +-73.9686296217893,40.771812308875,10H-AM-1014-02,10H,AM,10142018,2,Juvenile,Cinnamon,,Cinnamon+,,Above Ground,6,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9686296217893 40.771812308875) +-73.9635317822977,40.7821352080233,22G-AM-1018-01,22G,AM,10182018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,true,false,false,true,false,false,true,false,,POINT (-73.9635317822977 40.7821352080233) +-73.9553038162633,40.7909367783223,34H-PM-1006-04,34H,PM,10062018,4,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,Elm tree,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9553038162633 40.790936778322305) +-73.9636551433178,40.7901572818776,30B-PM-1019-02,30B,PM,10192018,2,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,true,false,true,true,,false,false,false,false,true,false,false,true,,POINT (-73.9636551433178 40.7901572818776) +-73.9689723590015,40.7756860990338,13F-AM-1007-01,13F,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9689723590015 40.7756860990338) +-73.9719111470164,40.7758789855474,12D-AM-1013-02,12D,AM,10132018,2,Adult,Gray,,Gray+,,Above Ground,7,Was on top of the edge of Bow Bridge,false,false,false,false,false,jumped off,false,false,false,true,false,false,false,true,,POINT (-73.9719111470164 40.7758789855474) +-73.9755569170561,40.7668006977526,2F-AM-1006-03,02F,AM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9755569170561 40.7668006977526) +-73.969553896295,40.7709884929277,9H-PM-1018-04,09H,PM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.969553896295 40.7709884929277) +-73.9694468044483,40.770360886038,8I-PM-1013-05,08I,PM,10132018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694468044483 40.770360886038) +-73.9720347089273,40.7727750272024,9E-PM-1014-01,09E,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Gathering/digging in grassy area b/w trees,false,false,false,false,true,looked like it was smelling/digging in the ground,false,false,false,false,true,false,true,false,indifferent (was in a grassy area with no humans nearby),POINT (-73.9720347089273 40.7727750272024) +-73.9691293546408,40.7703219076549,8I-AM-1006-11,08I,AM,10062018,11,Adult,Gray,,Gray+,,Above Ground,50,tree,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9691293546408 40.77032190765491) +-73.9552035011902,40.7889851896334,32I-AM-1013-06,32I,AM,10132018,6,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,3,In and below shrub,false,false,true,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9552035011902 40.7889851896334) +-73.9695305555392,40.7757541971012,13F-PM-1008-03,13F,PM,10082018,3,Adult,Gray,,Gray+,,Above Ground,15,tree,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9695305555392 40.7757541971012) +-73.9704269630964,40.7722964640257,10G-AM-1006-09,10G,AM,10062018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9704269630964 40.7722964640257) +-73.97016933635,40.7705452529783,8H-AM-1017-05,08H,AM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.97016933635001 40.7705452529783) +-73.97186968288,40.778926988884,15B-AM-1014-03,15B,AM,10142018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,running (from a dog),false,false,false,false,false,false,true,false,,POINT (-73.97186968288 40.778926988884) +-73.9548853492712,40.7984783584388,41D-PM-1014-04,41D,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,30,,false,false,true,false,false,jumping tree to tree,false,false,false,false,false,false,false,false,,POINT (-73.9548853492712 40.7984783584388) +-73.9760880070186,40.7711057827923,6C-PM-1020-04,06C,PM,10202018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9760880070186 40.7711057827923) +-73.9521514669041,40.7949515182825,39H-PM-1013-03,39H,PM,10132018,3,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,true,true,,POINT (-73.9521514669041 40.7949515182825) +-73.9763506612375,40.771611393182,7C-PM-1020-05,07C,PM,10202018,5,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9763506612375 40.771611393182) +-73.9710951149579,40.772501245008,10F-PM-1019-04,10F,PM,10192018,4,Adult,Black,,Black+,,Ground Plane,FALSE,"Behind fence, grass",false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9710951149579 40.772501245008) +-73.9640016324897,40.7921759097124,32A-PM-1013-01,32A,PM,10132018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9640016324897 40.7921759097124) +-73.9707012345661,40.7758938984066,13E-PM-1008-03,13E,PM,10082018,3,Juvenile,Gray,White,Gray+White,,Above Ground,10,hanging upside down to get a nut,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9707012345661 40.7758938984066) +-73.9601259189134,40.7955350609057,36B-PM-1013-04,36B,PM,10132018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9601259189134 40.7955350609057) +-73.9697526733133,40.7759529849808,13E-PM-1008-09,13E,PM,10082018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9697526733133 40.7759529849808) +-73.9766593636657,40.7735708178842,8B-PM-1012-04,08B,PM,10122018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9766593636657 40.7735708178842) +-73.9632868561794,40.7907806312915,30B-AM-1007-06,30B,AM,10072018,6,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9632868561794 40.7907806312915) +-73.975673607467,40.7699044294204,5D-PM-1018-01,05D,PM,10182018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.975673607467 40.7699044294204) +-73.9553163829551,40.7988610926249,42D-PM-1013-04,42D,PM,10132018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,Light Cinnamon,Ground Plane,FALSE,,false,false,false,false,false,carrying nut away,false,false,false,false,false,false,true,false,,POINT (-73.9553163829551 40.7988610926249) +-73.9772569909673,40.7664804797448,1E-AM-1006-02,01E,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9772569909673 40.7664804797448) +-73.9709207551033,40.7767932008037,14D-AM-1014-04,14D,AM,10142018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9709207551033 40.7767932008037) +-73.9677409841969,40.7763579140639,15G-PM-1019-08,15G,PM,10192018,8,Adult,,,+,,Above Ground,5,,false,true,false,false,false,,false,true,true,false,false,false,false,false,,POINT (-73.9677409841969 40.7763579140639) +-73.9563311167069,40.7950901563337,38E-AM-1010-12,38E,AM,10102018,12,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,running on rocks,false,true,false,false,false,,false,false,false,true,false,false,false,false,runs toward something,POINT (-73.9563311167069 40.7950901563337) +-73.9584646000078,40.7983984665955,40B-PM-1014-07,40B,PM,10142018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9584646000078 40.7983984665955) +-73.9702588981432,40.776610754288,14E-AM-1008-08,14E,AM,10082018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9702588981432 40.776610754288) +-73.9643236505425,40.7887854771596,28C-AM-1014-02,28C,AM,10142018,2,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9643236505425 40.7887854771596) +-73.9593374341938,40.797258337802,38B-PM-1018-01,38B,PM,10182018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9593374341938 40.797258337802) +-73.9758564394842,40.7674758942811,3E-AM-1006-05,03E,AM,10062018,5,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9758564394842 40.7674758942811) +-73.9693254080548,40.7761600327118,14F-AM-1007-01,14F,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9693254080548 40.7761600327118) +-73.9730420696993,40.7786151019726,15B-AM-1014-01,15B,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,40,,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9730420696993 40.7786151019726) +-73.9647891228606,40.789853066039,29B-AM-1007-02,29B,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,30,,true,false,false,false,false,,false,false,false,true,false,false,false,false,,POINT (-73.9647891228606 40.789853066039) +-73.9580111056675,40.7854339401483,27I-PM-1020-02,27I,PM,10202018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9580111056675 40.7854339401483) +-73.9782120139407,40.7717154468791,6A-AM-1006-05,06A,AM,10062018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,4,tree,false,false,true,false,false,,false,false,false,true,true,false,false,false,curious,POINT (-73.9782120139407 40.7717154468791) +-73.9564606426367,40.7880546572608,30I-PM-1006-06,30I,PM,10062018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,true,ran up tree,POINT (-73.9564606426367 40.7880546572608) +-73.9562642076935,40.7983338763074,41C-AM-1017-02,41C,AM,10172018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9562642076935 40.7983338763074) +-73.9613747032702,40.7920483852431,33C-PM-1007-01,33C,PM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9613747032702 40.792048385243106) +-73.9773858189627,40.770807701562,5B-PM-1013-01,05B,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9773858189627 40.770807701562) +-73.9685859705486,40.7848805065322,23A-AM-1018-04,23A,AM,10182018,4,Adult,Gray,,Gray+,,Above Ground,3,Tree,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9685859705486 40.7848805065322) +-73.9570050460867,40.7985192250745,40C-AM-1017-05,40C,AM,10172018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9570050460867 40.7985192250745) +-73.9632337134707,40.7914682370734,31B-PM-1007-01,31B,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,true,true,false,false,chasing #2 and climbing tree w/ #2,false,false,false,false,false,false,false,true,,POINT (-73.9632337134707 40.7914682370734) +-73.9811078442462,40.767515940567,1A-AM-1007-04,01A,AM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9811078442462 40.767515940567) +-73.9594406225891,40.7918533707789,33D-AM-1017-02,33D,AM,10172018,2,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,false,false,,POINT (-73.9594406225891 40.7918533707789) +-73.9737100743183,40.7708360121735,7E-PM-1013-03,07E,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,Ground & Tree Base,false,false,false,false,true,,false,false,false,true,true,false,true,false,,POINT (-73.9737100743183 40.7708360121735) +-73.9749457516921,40.7676712372245,3F-PM-1013-07,03F,PM,10132018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9749457516921 40.7676712372245) +-73.9728871061191,40.7712983658944,8F-PM-1012-08,08F,PM,10122018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9728871061191 40.7712983658944) +-73.9532657715601,40.7949046809422,39G-AM-1018-02,39G,AM,10182018,2,Juvenile,Gray,,Gray+,,Above Ground,25,Tree,false,false,false,false,false,sitting & watching,false,false,false,false,false,false,true,false,,POINT (-73.9532657715601 40.7949046809422) +-73.957259673402,40.7974442913898,39C-AM-1017-02,39C,AM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.957259673402 40.7974442913898) +-73.9750346778281,40.7665404404824,2G-PM-1007-01,02G,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9750346778281 40.7665404404824) +-73.9540257319561,40.798408619116,42E-PM-1012-02,42E,PM,10122018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,,,,true,false,true,false,false,,false,false,false,false,false,false,true,true,,POINT (-73.9540257319561 40.798408619116) +-73.9769700777377,40.7728489574967,7B-AM-1008-08,07B,AM,10082018,8,Adult,Gray,,Gray+,,Above Ground,5,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9769700777377 40.7728489574967) +-73.9720174997123,40.7748894266027,11D-AM-1010-07,11D,AM,10102018,7,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9720174997123 40.7748894266027) +-73.9695305996721,40.7745386896959,12F-PM-1007-02,12F,PM,10072018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9695305996721 40.7745386896959) +-73.96660639702,40.7756655031741,14H-AM-1007-03,14H,AM,10072018,3,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.96660639702002 40.7756655031741) +-73.9595485734618,40.7835326425693,25I-PM-1007-08,25I,PM,10072018,8,Adult,Gray,,Gray+,,Above Ground,,playing very high in tree w/ #7,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9595485734618 40.7835326425693) +-73.9674631254594,40.7790076357696,17E-AM-1017-10,17E,AM,10172018,10,Juvenile,Gray,,Gray+,,Above Ground,2,Fence,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9674631254594 40.7790076357696) +-73.9703774000082,40.7717607551555,9G-AM-1007-01,09G,AM,10072018,1,Adult,Gray,,Gray+,,Above Ground,50,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9703774000082 40.7717607551555) +-73.9566571713254,40.7989855775435,41C-AM-1017-04,41C,AM,10172018,4,,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9566571713254 40.7989855775435) +-73.9769742179824,40.7727484521829,7B-AM-1008-07,07B,AM,10082018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9769742179824 40.7727484521829) +-73.9724657562746,40.7658015504376,3I-PM-1013-06,03I,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9724657562746 40.7658015504376) +-73.9640534906634,40.7777383899836,17I-AM-1014-02,17I,AM,10142018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,standing upright,false,false,false,false,false,true,false,true,runs from (only ran away when a grandpa chased it off),POINT (-73.9640534906634 40.7777383899836) +-73.9627904328402,40.7939375305761,34A-PM-1013-04,34A,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,digging & burying,false,false,false,false,false,false,false,false,,POINT (-73.9627904328402 40.7939375305761) +-73.9541837143178,40.7944340477396,38G-PM-1020-06,38G,PM,10202018,6,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,true,false,false,false,false,false,true,,POINT (-73.9541837143178 40.7944340477396) +-73.9586591455169,40.7906243901309,32F-PM-1008-06,32F,PM,10082018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9586591455169 40.7906243901309) +-73.9722737593623,40.768963018754,6G-AM-1008-04,06G,AM,10082018,4,Juvenile,Gray,Cinnamon,Gray+Cinnamon,very long tail,Above Ground,20,tree,true,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9722737593623 40.768963018754) +-73.9690211935346,40.773038298158,11H-AM-1010-07,11H,AM,10102018,7,Adult,Gray,White,Gray+White,,Above Ground,4,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9690211935346 40.773038298158) +-73.9680855277775,40.7769251965381,15F-AM-1007-10,15F,AM,10072018,10,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,20,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9680855277775 40.7769251965381) +-73.9617490680298,40.7921537849244,32C-PM-1013-06,32C,PM,10132018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9617490680298 40.7921537849244) +-73.9788117755401,40.7707347137469,5B-PM-1013-04,05B,PM,10132018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.97881177554011 40.7707347137469) +-73.9698839750249,40.7781433076692,16D-PM-1010-08,16D,PM,10102018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9698839750249 40.7781433076692) +-73.9722265046794,40.7700916895929,7G-PM-1018-02,07G,PM,10182018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9722265046794 40.7700916895929) +-73.9713399316534,40.7750678026757,12E-PM-1018-02,12E,PM,10182018,2,Adult,Black,"Cinnamon, White","Black+Cinnamon, White",Black & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Above Ground,3,,false,false,true,false,false,lounging on tree upside down,false,false,false,false,true,false,true,false,,POINT (-73.9713399316534 40.7750678026757) +-73.9679955831115,40.7818431607916,20C-PM-1018-04,20C,PM,10182018,4,Adult,Gray,,Gray+,,Above Ground,8,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9679955831115 40.7818431607916) +-73.9770985425092,40.7665926744505,1E-AM-1006-04,01E,AM,10062018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9770985425092 40.7665926744505) +-73.9655955841325,40.7762063860571,15H-PM-1008-04,15H,PM,10082018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,edge of landscape,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9655955841325 40.7762063860571) +-73.967767372181,40.784702631615,23B-PM-1012-07,23B,PM,10122018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.967767372181 40.784702631615) +-73.97055600791,40.7698499183436,7H-AM-1006-07,07H,AM,10062018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.97055600791 40.7698499183436) +-73.9711319254625,40.7760324859879,13D-PM-1018-12,13D,PM,10182018,12,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9711319254625 40.776032485987905) +-73.9584106786233,40.7902777556926,32F-PM-1008-02,32F,PM,10082018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9584106786233 40.7902777556926) +-73.9773898301093,40.7708581562057,5B-AM-1008-01,05B,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,"running across ball field 5,near home plate",false,false,false,false,false,false,true,false,,POINT (-73.9773898301093 40.7708581562057) +-73.9735547926323,40.7723420076108,8D-AM-1007-02,08D,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,12,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9735547926323 40.7723420076108) +-73.9568300899773,40.7935855743354,36E-AM-1013-01,36E,AM,10132018,1,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (ran into treebrush),POINT (-73.9568300899773 40.7935855743354) +-73.9761579527932,40.7755877312075,10A-PM-1014-02,10A,PM,10142018,2,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",,Ground Plane,FALSE,in the bushes beneath a tree,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9761579527932 40.7755877312075) +-73.9604954276129,40.7965682182001,37A-AM-1012-01,37A,AM,10122018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,Drawing included on tally sheet,Ground Plane,FALSE,,false,false,false,false,true,scanning (drawing included),false,false,false,false,false,false,false,true,,POINT (-73.9604954276129 40.7965682182001) +-73.9761527947483,40.7709607002539,6C-AM-1007-06,06C,AM,10072018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,7,,false,false,true,false,false,,false,false,false,false,false,false,false,false,disappeared when jogger ran by,POINT (-73.9761527947483 40.7709607002539) +-73.980542388615,40.7682048804794,1B-AM-1012-14,01B,AM,10122018,14,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.980542388615 40.7682048804794) +-73.95912925497,40.7925530280455,34D-AM-1008-01,34D,AM,10082018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,staring at us,POINT (-73.95912925497001 40.7925530280455) +-73.9688173465755,40.7782009764626,16E-AM-1014-08,16E,AM,10142018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (dog),POINT (-73.9688173465755 40.7782009764626) +-73.9541500874008,40.7920329989756,35H-AM-1013-02,35H,AM,10132018,2,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,10,Sitting on tree limb,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,"watching me from tree,but calm",POINT (-73.9541500874008 40.7920329989756) +-73.9589852989486,40.7912720015917,33E-AM-1014-07,33E,AM,10142018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9589852989486 40.7912720015917) +-73.9811218801005,40.7684406206185,1A-PM-1014-07,01A,PM,10142018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9811218801005 40.7684406206185) +-73.9702970919317,40.7696883113413,7H-PM-1006-08,07H,PM,10062018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,in grass,false,false,false,false,true,,false,false,false,false,true,true,false,true,,POINT (-73.9702970919317 40.7696883113413) +-73.9530739562131,40.7932034409546,37H-PM-1006-01,37H,PM,10062018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,from voice,POINT (-73.95307395621312 40.7932034409546) +-73.9638397790384,40.7828950272904,23F-PM-1013-02,23F,PM,10132018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,true,false,false,true,false,true,false,"indifferent (mostly,did notice me,busy eating,foraging)",POINT (-73.9638397790384 40.7828950272904) +-73.9678154033099,40.7742783484486,12H-PM-1007-01,12H,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,in tree,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9678154033099 40.7742783484486) +-73.9676434256976,40.7862336624448,24A-PM-1007-04,24A,PM,10072018,4,Adult,Gray,,Gray+,,Above Ground,50,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9676434256976 40.7862336624448) +-73.9632799339872,40.7808316436308,21H-PM-1018-01,21H,PM,10182018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,staring,false,false,false,false,true,true,false,false,,POINT (-73.9632799339872 40.7808316436308) +-73.9583934264026,40.7854742185504,27I-AM-1007-02,27I,AM,10072018,2,,,,+,,,,,false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9583934264026 40.785474218550405) +-73.9679309130266,40.7792437838039,17E-AM-1017-04,17E,AM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,Shore,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9679309130266 40.779243783803906) +-73.9596505138955,40.7940367734988,35C-PM-1013-06,35C,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9596505138955 40.7940367734988) +-73.9545214613307,40.7943801121036,37G-PM-1007-01,37G,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9545214613307 40.7943801121036) +-73.9729847109778,40.7740709049602,10D-AM-1008-03,10D,AM,10082018,3,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9729847109778 40.7740709049602) +-73.9693465383617,40.7744996336934,12F-PM-1007-01,12F,PM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9693465383617 40.7744996336934) +-73.9719460335398,40.7810508156287,18A-AM-1012-01,18A,AM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",White tail,Above Ground,3,tree,true,false,true,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9719460335398 40.7810508156287) +-73.9597557819449,40.7949918204459,36C-AM-1014-01,36C,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Cinnamon selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9597557819449 40.7949918204459) +-73.9564079273261,40.7939340053805,36F-AM-1017-02,36F,AM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon on shoulders,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9564079273261 40.7939340053805) +-73.9645060433292,40.7768322057794,16I-AM-1008-03,16I,AM,10082018,3,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9645060433292 40.7768322057794) +-73.9728700359494,40.7659842666881,3H-PM-1014-05,03H,PM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9728700359494 40.7659842666881) +-73.9670858934045,40.7753505024976,14H-PM-1012-02,14H,PM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,20,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9670858934045 40.7753505024976) +-73.959516757215,40.7952545908471,36C-PM-1013-04,36C,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,On rock,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.959516757215 40.7952545908471) +-73.9775735077285,40.7692872082165,4C-PM-1010-08,04C,PM,10102018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,10,on stone arch,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9775735077285 40.7692872082165) +-73.9700186001049,40.7826052184658,20B-AM-1007-03,20B,AM,10072018,3,Adult,Gray,White,Gray+White,,Above Ground,,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9700186001049 40.7826052184658) +-73.9776445567926,40.768119107973,3D-PM-1010-07,03D,PM,10102018,7,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9776445567926 40.768119107973) +-73.9638599044346,40.7809288795308,21G-AM-1014-06,21G,AM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9638599044346 40.7809288795308) +-73.9744906832678,40.7699948746776,6E-PM-1010-05,06E,PM,10102018,5,Adult,Cinnamon,White,Cinnamon+White,white back legs,Ground Plane,FALSE,,false,false,false,true,false,could this squirrel be eating a white mushroom?,false,false,false,false,false,false,true,false,,POINT (-73.9744906832678 40.76999487467761) +-73.9519081627768,40.7973148719421,41G-AM-1013-02,41G,AM,10132018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9519081627768 40.7973148719421) +-73.9793082679745,40.7679930598805,2C-PM-1013-11,02C,PM,10132018,11,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9793082679745 40.7679930598805) +-73.9798390387307,40.7700761090896,3A-PM-1017-07,03A,PM,10172018,7,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9798390387307 40.7700761090896) +-73.9712550584322,40.7764273475386,13D-PM-1018-06,13D,PM,10182018,6,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,cleaning,false,false,false,false,false,false,true,false,,POINT (-73.9712550584322 40.7764273475386) +-73.9716995507598,40.7797671327739,16B-AM-1014-02,16B,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9716995507598 40.7797671327739) +-73.9667474482967,40.7760643720793,15H-PM-1008-01,15H,PM,10082018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,10,Oak tree,false,true,false,false,false,watching me,false,true,false,true,false,false,false,false,observant,POINT (-73.9667474482967 40.7760643720793) +-73.9515907796216,40.7952684235477,40H-AM-1017-02,40H,AM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.95159077962161 40.7952684235477) +-73.9520280004414,40.7946345014466,39I-PM-1013-03,39I,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,playing,false,false,false,false,false,true,false,false,,POINT (-73.9520280004414 40.7946345014466) +-73.9594357049738,40.7840678890949,25I-AM-1012-01,25I,AM,10122018,1,Adult,Cinnamon,,Cinnamon+,,Above Ground,4,on bar,false,false,false,true,false,,false,false,false,true,true,true,false,false,,POINT (-73.9594357049738 40.7840678890949) +-73.9716271494641,40.7796462634184,16B-PM-1017-02,16B,PM,10172018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9716271494641 40.7796462634184) +-73.9615817859213,40.7945839663845,35A-AM-1014-08,35A,AM,10142018,8,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9615817859213 40.79458396638451) +-73.9664669369583,40.7774085361976,16G-AM-1010-05,16G,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9664669369583 40.7774085361976) +-73.9765805609072,40.7692807820935,4D-PM-1008-07,04D,PM,10082018,7,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,hopped over fence and chased # 6 around tree & ran it to end of lawn,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9765805609072 40.7692807820935) +-73.9628349778362,40.793887005206,34A-PM-1013-03,34A,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9628349778362 40.793887005206) +-73.9743184653765,40.7667932997,3G-AM-1008-01,03G,AM,10082018,1,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9743184653765 40.7667932997) +-73.9611446263364,40.7911003407299,32D-AM-1013-03,32D,AM,10132018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9611446263364 40.7911003407299) +-73.9794367096274,40.7672720598482,1C-PM-1013-04,01C,PM,10132018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9794367096274 40.7672720598482) +-73.9631818528816,40.7925332194132,32A-AM-1018-01,32A,AM,10182018,1,Adult,Gray,,Gray+,,Above Ground,15,,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9631818528816 40.7925332194132) +-73.9707339200738,40.7796333355689,17C-PM-1013-03,17C,PM,10132018,3,Adult,Gray,,Gray+,,Above Ground,20,in a tree,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9707339200738 40.7796333355689) +-73.960237785199,40.7907831607574,32E-PM-1017-16,32E,PM,10172018,16,Adult,Black,,Black+,,Ground Plane,FALSE,rocky outcrop,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.960237785199 40.7907831607574) +-73.9744726434743,40.776729630785,12A-PM-1013-03,12A,PM,10132018,3,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,3,,true,false,false,false,false,chased up a tree by #4,false,false,false,false,false,false,true,false,,POINT (-73.9744726434743 40.776729630785) +-73.9557602499712,40.7956452424385,38E-PM-1014-01,38E,PM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9557602499712 40.7956452424385) +-73.9608399003798,40.7817704502248,23I-AM-1019-01,23I,AM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,18,on a tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,"eyed me warily,then went up the tree",POINT (-73.9608399003798 40.7817704502248) +-73.9688523924488,40.7844018035948,22A-AM-1008-02,22A,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9688523924488 40.7844018035948) +-73.9786936992465,40.7713943674666,5A-PM-1010-02,05A,PM,10102018,2,Adult,Gray,White,Gray+White,,Above Ground,50,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9786936992465 40.7713943674666) +-73.964572179093,40.7811208719018,21F-PM-1018-01,21F,PM,10182018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.964572179093 40.7811208719018) +-73.9688929282726,40.7768899536946,15F-PM-1010-01,15F,PM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9688929282726 40.7768899536946) +-73.9704449096084,40.7689970778303,6I-PM-1013-05,06I,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,playing with #6,false,false,false,false,true,false,false,false,,POINT (-73.9704449096084 40.7689970778303) +-73.9763894759543,40.7705523372364,5C-PM-1010-12,05C,PM,10102018,12,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9763894759543 40.7705523372364) +-73.9682129261841,40.7754232358118,14G-AM-1012-03,14G,AM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9682129261841 40.7754232358118) +-73.9777256989362,40.766623699564,1E-AM-1006-03,01E,AM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9777256989362 40.766623699564) +-73.9694066600156,40.7805662180672,18C-PM-1018-06,18C,PM,10182018,6,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,1,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694066600156 40.7805662180672) +-73.9568544270881,40.7972517274475,39D-AM-1008-06,39D,AM,10082018,6,Adult,Gray,,Gray+,,Above Ground,3,on rock,false,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9568544270881 40.7972517274475) +-73.9677096985223,40.7825358361204,21C-AM-1014-02,21C,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,50,,true,true,true,false,true,,false,true,false,false,false,false,false,false,looked at us from tree,POINT (-73.9677096985223 40.7825358361204) +-73.9790226400629,40.7698997653792,4B-AM-1010-01,04B,AM,10102018,1,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",,Above Ground,2,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9790226400629 40.7698997653792) +-73.9689504114652,40.7766770153764,14F-PM-1012-05,14F,PM,10122018,5,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,2,on a fallen branch,true,false,false,true,false,sitting,false,false,false,false,false,false,false,false,looking at me,POINT (-73.9689504114652 40.7766770153764) +-73.980048119915,40.7676638655026,1B-AM-1012-06,01B,AM,10122018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.980048119915 40.7676638655026) +-73.9593244415072,40.794964729747,36C-PM-1013-03,36C,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,Clearing near bike path (bikes active),false,true,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9593244415072 40.794964729747) +-73.9779874405715,40.7730765377366,7A-PM-1007-02,07A,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9779874405715 40.7730765377366) +-73.9570391901515,40.7930697207834,35F-AM-1007-01,35F,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9570391901515 40.7930697207834) +-73.9647904085226,40.7911589002217,30A-PM-1020-02,30A,PM,10202018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Cinnamon back. Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,Rock,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9647904085226 40.7911589002217) +-73.9573477643797,40.7971734060509,39C-AM-1017-01,39C,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9573477643797 40.7971734060509) +-73.9706929270645,40.7727841119424,10G-AM-1006-06,10G,AM,10062018,6,Juvenile,Gray,,Gray+,skinny tail,Ground Plane,FALSE,,false,true,false,false,false,chasing (#5),true,false,false,false,false,false,false,false,,POINT (-73.9706929270645 40.7727841119424) +-73.959070754026,40.7906675143413,32E-PM-1017-07,32E,PM,10172018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,treed area,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.959070754026 40.7906675143413) +-73.9682067129876,40.7779911208015,16E-PM-1018-05,16E,PM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,staring,false,false,false,true,false,true,false,false,approaches (very close),POINT (-73.9682067129876 40.7779911208015) +-73.9803282698463,40.7680809889384,1B-PM-1019-09,01B,PM,10192018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,Tree to ground,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9803282698463 40.7680809889384) +-73.9553263156025,40.7975592060572,40D-PM-1013-04,40D,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9553263156025 40.7975592060572) +-73.9807898224726,40.768215817511,1A-PM-1014-04,01A,PM,10142018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9807898224726 40.768215817511) +-73.9507772992986,40.7949188960194,40I-PM-1013-01,40I,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,7,,false,false,false,true,false,eating (berries),false,false,false,false,false,false,true,false,,POINT (-73.9507772992986 40.7949188960194) +-73.9696762034757,40.7704883494264,8H-AM-1017-02,08H,AM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,7,root bed of tree,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9696762034757 40.7704883494264) +-73.9639726817977,40.7829083461049,23F-PM-1013-01,23F,PM,10132018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,"runs from (dove into some bushes/undergrowth,only saw briefly! → not because of humans tho.)",POINT (-73.9639726817977 40.7829083461049) +-73.9690395363594,40.771128205027,9I-PM-1010-01,09I,PM,10102018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",standard coloration,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9690395363594 40.771128205027) +-73.9667206046912,40.7779993565098,17G-PM-1017-04,17G,PM,10172018,4,Adult,Gray,White,Gray+White,,Above Ground,10,tree & ground,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9667206046912 40.7779993565098) +-73.9525699067954,40.7937125788106,38I-PM-1014-01,38I,PM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,on the lawn East of the fountain,false,false,false,false,false,scampering thru the grass!,false,false,false,false,true,false,false,true,,POINT (-73.9525699067954 40.7937125788106) +-73.9807982742225,40.7678795985389,1B-PM-1019-01,01B,PM,10192018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9807982742225 40.7678795985389) +-73.958230674366,40.7989268396525,40B-AM-1019-08,40B,AM,10192018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,true,true,,POINT (-73.958230674366 40.7989268396525) +-73.9674033125834,40.7769132902037,15G-PM-1019-02,15G,PM,10192018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9674033125834 40.7769132902037) +-73.9793334416378,40.7674142089209,1C-PM-1013-02,01C,PM,10132018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,false,false,,POINT (-73.9793334416378 40.7674142089209) +-73.9669529835992,40.7871864151365,25A-AM-1013-05,25A,AM,10132018,5,,Gray,,Gray+,,Ground Plane,FALSE,CROSS BRIDLE - INTO TREE TO AVOID DOGGO,true,false,true,false,false,d.p.t.,false,false,false,true,true,false,true,false,calm,POINT (-73.96695298359921 40.7871864151365) +-73.9577629744539,40.7897460758298,32G-PM-1013-01,32G,PM,10132018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,Cinnamon belly,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,allowed me to approach within 10 ft,POINT (-73.9577629744539 40.789746075829804) +-73.9728069355821,40.7794458131748,15A-AM-1007-01,15A,AM,10072018,1,Adult,Gray,,Gray+,tbd,Ground Plane,FALSE,,false,false,false,false,true,hopping,false,false,false,false,false,false,true,false,in fenced in lawn (chill),POINT (-73.9728069355821 40.7794458131748) +-73.9634835346077,40.7918244310746,31A-PM-1017-03,31A,PM,10172018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9634835346077 40.7918244310746) +-73.9634811495245,40.790705585077,30B-AM-1007-10,30B,AM,10072018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9634811495245 40.790705585077) +-73.9731880656287,40.7660026186155,2H-AM-1006-01,02H,AM,10062018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9731880656287 40.7660026186155) +-73.9687462566073,40.783898987005,22B-PM-1014-06,22B,PM,10142018,6,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,false,false,false,digging,false,false,false,false,false,false,false,false,,POINT (-73.9687462566073 40.783898987005) +-73.9801698909399,40.7683721553321,2B-AM-1010-04,02B,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9801698909399 40.7683721553321) +-73.9580111496275,40.7985365971474,40B-AM-1019-05,40B,AM,10192018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,true,false,,POINT (-73.9580111496275 40.7985365971474) +-73.9590868748584,40.7906047630418,32E-PM-1017-09,32E,PM,10172018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,treed area,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9590868748584 40.7906047630418) +-73.9762187733662,40.7739282973004,9B-PM-1013-08,09B,PM,10132018,8,Juvenile,Cinnamon,"Black, White","Cinnamon+Black, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9762187733662 40.7739282973004) +-73.9756993198381,40.7681956641913,3E-PM-1008-08,03E,PM,10082018,8,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9756993198381 40.7681956641913) +-73.9657721715305,40.778534830257,18G-PM-1013-03,18G,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9657721715305 40.778534830257) +-73.9782813538421,40.7715730368712,6A-AM-1006-02,06A,AM,10062018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,30,tree,false,true,true,false,false,,false,false,false,true,false,false,false,false,,POINT (-73.9782813538421 40.7715730368712) +-73.9694979297007,40.7694667408721,7I-PM-1013-02,07I,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,Construction materials,true,false,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9694979297007 40.7694667408721) +-73.9616999731028,40.7954126939561,36A-AM-1018-02,36A,AM,10182018,2,Juvenile,Gray,White,Gray+White,,Above Ground,15,,false,false,false,true,false,eating (red berries),false,false,false,false,false,false,true,false,,POINT (-73.9616999731028 40.7954126939561) +-73.9762965341309,40.775112516678,10A-AM-1006-02,10A,AM,10062018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,Bridle Path lawn,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9762965341309 40.775112516678) +-73.9611118778753,40.7952007875354,36A-PM-1013-01,36A,PM,10132018,1,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,burying,false,false,false,false,false,true,false,false,,POINT (-73.9611118778753 40.7952007875354) +-73.9748709206354,40.77608025411,11B-PM-1014-01,11B,PM,10142018,1,Adult,Gray,,Gray+,Fat!,Above Ground,10,,false,false,true,false,false,,true,false,false,false,false,false,false,true,,POINT (-73.9748709206354 40.77608025411) +-73.9594708328732,40.791192982895,32E-AM-1007-07,32E,AM,10072018,7,Adult,Gray,,Gray+,,Above Ground,,on tennis club house roof,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9594708328732 40.791192982895) +-73.9662804925774,40.7890284642399,28A-PM-1007-01,28A,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9662804925774 40.7890284642399) +-73.9763159153138,40.7705785330431,5C-AM-1006-07,05C,AM,10062018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9763159153138 40.7705785330431) +-73.9707937464541,40.7725282708448,10G-PM-1017-07,10G,PM,10172018,7,Adult,Black,White,Black+White,,Ground Plane,FALSE,,false,false,false,false,false,traveling,false,false,false,false,false,false,true,false,,POINT (-73.9707937464541 40.7725282708448) +-73.9549337398033,40.7946552731628,38F-PM-1013-01,38F,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon tail & belly,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9549337398033 40.7946552731628) +-73.9761792189352,40.7745745517215,9A-AM-1013-09,09A,AM,10132018,9,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9761792189352 40.7745745517215) +-73.9693202078293,40.771043472925,9H-AM-1006-01,09H,AM,10062018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9693202078293 40.771043472925) +-73.9699517492486,40.7753169595373,13F-PM-1008-01,13F,PM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,true,false,false,,POINT (-73.9699517492486 40.7753169595373) +-73.9728895595977,40.7699378332299,6F-AM-1006-01,06F,AM,10062018,1,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9728895595977 40.7699378332299) +-73.9707245013626,40.7780656588337,15D-AM-1007-06,15D,AM,10072018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9707245013626 40.7780656588337) +-73.9764850086767,40.7737340720562,8B-AM-1007-07,08B,AM,10072018,7,Juvenile,Gray,Black,Gray+Black,,Above Ground,8,,false,false,false,true,false,holding nut,false,false,false,false,false,false,true,false,,POINT (-73.9764850086767 40.7737340720562) +-73.953375642605,40.7947144477885,38G-PM-1020-02,38G,PM,10202018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.953375642605 40.7947144477885) +-73.9661892200474,40.7836798072777,22D-PM-1012-06,22D,PM,10122018,6,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9661892200474 40.7836798072777) +-73.9779983794849,40.7675452099173,2D-AM-1007-02,02D,AM,10072018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,6,up tree,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9779983794849 40.7675452099173) +-73.9796409671481,40.7679049871186,1C-PM-1013-09,01C,PM,10132018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9796409671481 40.7679049871186) +-73.9691420412059,40.7773492582138,15E-PM-1008-03,15E,PM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,false,false,true,false,,POINT (-73.9691420412059 40.7773492582138) +-73.9591298551111,40.7919612446005,33E-AM-1014-04,33E,AM,10142018,4,Adult,Black,"Cinnamon, White","Black+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9591298551111 40.7919612446005) +-73.9572530843479,40.7987460430546,41B-AM-1010-05,41B,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9572530843479 40.7987460430546) +-73.9584803513939,40.7933802077327,35D-PM-1013-01,35D,PM,10132018,1,Adult,Gray,White,Gray+White,,Above Ground,12,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9584803513939 40.7933802077327) +-73.97684509717,40.7709430375069,5C-PM-1010-07,05C,PM,10102018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,13,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.97684509717 40.7709430375069) +-73.9527924755398,40.7934366260533,37I-AM-1010-04,37I,AM,10102018,4,Adult,Gray,,Gray+,,Above Ground,50,in tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9527924755398 40.7934366260533) +-73.9729090336637,40.7794340052503,15A-AM-1007-02,15A,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,in fenced in lawn (chill),POINT (-73.9729090336637 40.7794340052503) +-73.9677751507448,40.7790990066658,17E-AM-1017-11,17E,AM,10172018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,Shore,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9677751507448 40.7790990066658) +-73.9790822606486,40.7714466633386,5A-AM-1006-03,05A,AM,10062018,3,Juvenile,Cinnamon,,Cinnamon+,,Above Ground,8,,false,false,true,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.9790822606486 40.7714466633386) +-73.9555583724966,40.7932879745739,36F-PM-1012-07,36F,PM,10122018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9555583724966 40.7932879745739) +-73.9589254878322,40.7914467650712,33E-PM-1012-09,33E,PM,10122018,9,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9589254878322 40.7914467650712) +-73.9722281263634,40.7704083288013,7G-AM-1010-06,07G,AM,10102018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9722281263634 40.7704083288013) +-73.9701412231078,40.7714534088899,9H-PM-1018-08,09H,PM,10182018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9701412231078 40.7714534088899) +-73.9679686793869,40.7825993867876,21C-AM-1014-01,21C,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,3,,true,false,false,false,false,jumping back & forth on tree,false,false,false,true,true,false,true,false,,POINT (-73.9679686793869 40.7825993867876) +-73.9792039071114,40.7678749471267,2C-AM-1010-07,02C,AM,10102018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,true,false,false,false,#7 & #8 chased each other up diff tree,false,false,false,false,false,false,false,true,,POINT (-73.9792039071114 40.76787494712671) +-73.9705370795538,40.7761725434851,13E-PM-1008-04,13E,PM,10082018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Gray selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,he took 2 steps then turned and stared at me,POINT (-73.9705370795538 40.7761725434851) +-73.9773692131441,40.7679771150149,3D-PM-1010-02,03D,PM,10102018,2,Adult,Gray,,Gray+,,Above Ground,8,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9773692131441 40.7679771150149) +-73.9725897240269,40.7691342079294,6G-AM-1008-01,06G,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,in tree,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9725897240269 40.7691342079294) +-73.9696119179789,40.7802926111865,18C-PM-1018-09,18C,PM,10182018,9,Juvenile,Gray,,Gray+,,Above Ground,5,,false,false,true,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9696119179789 40.7802926111865) +-73.9651817987035,40.7819082838334,21E-AM-1017-01,21E,AM,10172018,1,Adult,Gray,White,Gray+White,,Above Ground,3,Climbs small tree,false,false,false,true,true,,false,false,false,false,true,false,false,false,walks from,POINT (-73.9651817987035 40.7819082838334) +-73.9714512125212,40.7760275250114,13D-PM-1018-03,13D,PM,10182018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714512125212 40.7760275250114) +-73.9745556229855,40.7672921040998,3F-AM-1006-07,03F,AM,10062018,7,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,close to tall tree & light post,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9745556229855 40.7672921040998) +-73.9565260889843,40.7991807924337,42C-AM-1007-03,42C,AM,10072018,3,,,,+,,,,,false,false,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9565260889843 40.79918079243371) +-73.9739326393775,40.7779105370473,14A-PM-1014-07,14A,PM,10142018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9739326393775 40.7779105370473) +-73.9543044385367,40.7984498571338,41E-AM-1007-04,41E,AM,10072018,4,Adult,Cinnamon,White,Cinnamon+White,white haunches/tail,Ground Plane,FALSE,rubbing belly on ground,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9543044385367 40.798449857133804) +-73.9670904869871,40.7832091658006,21D-PM-1008-06,21D,PM,10082018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9670904869871 40.7832091658006) +-73.9719729323923,40.7668318394546,4I-AM-1006-03,04I,AM,10062018,3,Adult,,,+,Can't tell :(,Above Ground,28,Tree,false,false,true,false,false,building nest!,false,false,false,false,false,false,false,false,,POINT (-73.9719729323923 40.7668318394546) +-73.9590132705889,40.7952248279764,37C-AM-1012-03,37C,AM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon flanks,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9590132705889 40.7952248279764) +-73.9585133340331,40.7963721679474,38C-PM-1014-03,38C,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,true,false,false,false,false,false,false,true,,POINT (-73.9585133340331 40.7963721679474) +-73.9748247677824,40.7667893867839,2G-AM-1010-01,02G,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9748247677824 40.7667893867839) +-73.9777998932399,40.7709815865334,5B-PM-1013-02,05B,PM,10132018,2,Adult,Gray,White,Gray+White,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9777998932399 40.7709815865334) +-73.9527227282134,40.7935061484064,37I-AM-1010-03,37I,AM,10102018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,4,in tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9527227282134 40.7935061484064) +-73.9764013589865,40.7663063499207,1F-PM-1019-03,01F,PM,10192018,3,Juvenile,Gray,,Gray+,,Above Ground,1,,false,false,false,false,false,hiding,false,false,false,false,false,false,false,false,,POINT (-73.9764013589865 40.7663063499207) +-73.9717469822209,40.7753731930704,12D-PM-1014-03,12D,PM,10142018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9717469822209 40.7753731930704) +-73.9679457364586,40.7717350221981,10I-AM-1010-02,10I,AM,10102018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9679457364586 40.7717350221981) +-73.9767247593654,40.7726200054197,7B-AM-1008-15,07B,AM,10082018,15,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9767247593654 40.7726200054197) +-73.9789385196073,40.7675202157155,2C-AM-1010-02,02C,AM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9789385196073 40.7675202157155) +-73.976864402584,40.7705663751959,5C-PM-1010-05,05C,PM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.976864402584 40.7705663751959) +-73.9811585807616,40.768706748732,2A-AM-1010-06,02A,AM,10102018,6,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,true,false,false,false,chasing #5,false,false,false,false,false,false,false,false,,POINT (-73.9811585807616 40.768706748732) +-73.9719109949232,40.7723138521327,9F-AM-1013-01,09F,AM,10132018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9719109949232 40.7723138521327) +-73.9683345414813,40.7779016280345,16E-PM-1018-07,16E,PM,10182018,7,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9683345414813 40.7779016280345) +-73.9770873939997,40.7710379662106,6C-PM-1020-02,06C,PM,10202018,2,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9770873939997 40.7710379662106) +-73.9785353775382,40.7674923683184,2C-PM-1013-01,02C,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9785353775382 40.7674923683184) +-73.9603597117619,40.7824399298414,23I-PM-1019-02,23I,PM,10192018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9603597117619 40.7824399298414) +-73.9709897849823,40.768627964006,6H-AM-1008-02,06H,AM,10082018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9709897849823 40.768627964006) +-73.9701010964667,40.7688919314508,6I-PM-1013-02,06I,PM,10132018,2,Adult,Black,,Black+,,Ground Plane,FALSE,Bushes,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9701010964667 40.76889193145081) +-73.9623984262936,40.7913900453449,31C-PM-1010-03,31C,PM,10102018,3,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9623984262936 40.7913900453449) +-73.9652921233647,40.790440565854,29A-PM-1019-01,29A,PM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9652921233647 40.790440565854) +-73.967762162893,40.7823359027165,20C-PM-1018-08,20C,PM,10182018,8,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,true,runs from (dog),POINT (-73.967762162893 40.7823359027165) +-73.9656750232596,40.7833002587016,22E-PM-1014-01,22E,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9656750232596 40.7833002587016) +-73.9595717225279,40.7829872498299,25I-PM-1007-03,25I,PM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9595717225279 40.7829872498299) +-73.9558943880051,40.7971535141896,40D-PM-1013-06,40D,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9558943880051 40.7971535141896) +-73.9745859998733,40.7671634885616,3G-AM-1008-02,03G,AM,10082018,2,Adult,Gray,,Gray+,Big one! Beautiful tail,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9745859998733 40.7671634885616) +-73.9702541471417,40.7698584231797,7H-AM-1006-12,07H,AM,10062018,12,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9702541471417 40.7698584231797) +-73.9798005188704,40.7691868791734,3A-PM-1017-01,03A,PM,10172018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.97980051887042 40.7691868791734) +-73.9619609976132,40.7922824443528,33B-PM-1010-09,33B,PM,10102018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9619609976132 40.7922824443528) +-73.9729848996456,40.7707143294261,7F-AM-1008-11,07F,AM,10082018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9729848996456 40.7707143294261) +-73.9512120949478,40.7947945266515,39I-PM-1013-01,39I,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,along the road,false,false,false,true,false,digging,false,false,false,false,false,false,false,false,,POINT (-73.9512120949478 40.7947945266515) +-73.9562469727195,40.79685907654,39D-AM-1008-04,39D,AM,10082018,4,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9562469727195 40.79685907654) +-73.9795728289645,40.7678669804787,1C-PM-1013-07,01C,PM,10132018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9795728289645 40.7678669804787) +-73.974451175321,40.7701294635264,6E-PM-1010-04,06E,PM,10102018,4,Adult,Cinnamon,White,Cinnamon+White,white back legs,Ground Plane,FALSE,small open area but w/ 7 large oak trees,false,true,false,true,false,chasing #3,false,false,false,false,false,false,true,false,,POINT (-73.974451175321 40.7701294635264) +-73.9566785136491,40.7963368332834,39D-PM-1012-02,39D,PM,10122018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9566785136491 40.7963368332834) +-73.9570891696776,40.7935448802241,36E-PM-1012-01,36E,PM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9570891696776 40.7935448802241) +-73.9705115189429,40.7698395577068,7H-AM-1006-08,07H,AM,10062018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9705115189429 40.7698395577068) +-73.9589096782789,40.7939698757903,35D-AM-1019-02,35D,AM,10192018,2,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White","Black tail & edge, Cinnamon mid, While tail edge",Ground Plane,FALSE,,false,false,false,false,true,very quietly searching in long grass,false,false,false,false,false,false,false,false,,POINT (-73.9589096782789 40.7939698757903) +-73.9763236949008,40.7686815615335,4D-PM-1008-12,04D,PM,10082018,12,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,3,,true,false,false,false,false,was chased by # 11,true,false,false,false,false,false,false,true,,POINT (-73.9763236949008 40.7686815615335) +-73.9730454295997,40.7702909454392,7F-AM-1008-05,07F,AM,10082018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,bush,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9730454295997 40.7702909454392) +-73.9724681269526,40.7743474675821,11D-PM-1006-03,11D,PM,10062018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9724681269526 40.7743474675821) +-73.9668140804066,40.7768100147333,15G-AM-1008-06,15G,AM,10082018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9668140804066 40.7768100147333) +-73.96859351775,40.7735537139641,11H-PM-1013-03,11H,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,planting nut,false,false,false,false,false,false,true,false,,POINT (-73.96859351775 40.7735537139641) +-73.959019987128,40.7912546691805,33E-PM-1012-05,33E,PM,10122018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,playing,false,false,false,false,false,false,false,false,,POINT (-73.959019987128 40.7912546691805) +-73.9775465365348,40.7681943707876,3D-PM-1010-09,03D,PM,10102018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9775465365348 40.7681943707876) +-73.9604089940153,40.7910028063138,32D-AM-1013-04,32D,AM,10132018,4,Adult,Cinnamon,,Cinnamon+,Brown legs,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,true,false,true,,POINT (-73.9604089940153 40.7910028063138) +-73.9709534894049,40.7765964740768,14D-AM-1014-15,14D,AM,10142018,15,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9709534894049 40.7765964740768) +-73.9705509170542,40.7689416540228,6I-PM-1013-04,06I,PM,10132018,4,Adult,Black,Gray,Black+Gray,,Ground Plane,FALSE,Grass,false,false,false,true,false,,false,false,false,false,true,false,false,false,,POINT (-73.9705509170542 40.7689416540228) +-73.9802831706033,40.7692763295564,3A-AM-1012-02,03A,AM,10122018,2,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",Gray & Cinnamon selected as Primary. Black & Cinnamon selected as Highlights. Made executive adjustments.,Above Ground,1,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9802831706033 40.7692763295564) +-73.9612900553755,40.7912917391867,32C-AM-1014-01,32C,AM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9612900553755 40.7912917391867) +-73.9766653663947,40.7688767713012,4D-AM-1012-01,04D,AM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9766653663947 40.7688767713012) +-73.964280573021,40.777830911491,18I-PM-1007-08,18I,PM,10072018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,true,true,false,false,canoodling w/ #9,false,false,false,false,false,false,true,false,,POINT (-73.964280573021 40.777830911491) +-73.9552146665714,40.7892909102377,32I-PM-1007-03,32I,PM,10072018,3,Adult,Gray,,Gray+,small adult,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9552146665714 40.7892909102377) +-73.9704024529864,40.7729256063889,10G-AM-1006-04,10G,AM,10062018,4,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,chasing (#3),true,false,false,false,false,false,false,false,,POINT (-73.9704024529864 40.7729256063889) +-73.9603302382958,40.7910100435196,32D-PM-1006-01,32D,PM,10062018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9603302382958 40.7910100435196) +-73.9533319519277,40.7933647909449,37H-AM-1018-02,37H,AM,10182018,2,Adult,Gray,,Gray+,,Above Ground,,Large tree by (fence of the conservatory) about to climb up,false,false,true,false,false,,false,false,false,false,false,false,false,false,"busy,ready to climb",POINT (-73.9533319519277 40.7933647909449) +-73.9569324958684,40.7877748374259,30I-PM-1006-01,30I,PM,10062018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,sitting there,false,false,false,false,false,false,false,true,,POINT (-73.9569324958684 40.78777483742591) +-73.9755974646331,40.7673435798289,3F-PM-1013-01,03F,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9755974646331 40.7673435798289) +-73.9565197137317,40.7986011403785,41C-PM-1007-01,41C,PM,10072018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9565197137317 40.7986011403785) +-73.9560396440844,40.7945080361909,37E-AM-1013-01,37E,AM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9560396440844 40.7945080361909) +-73.9545841828392,40.7926924268376,36H-AM-1010-01,36H,AM,10102018,1,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9545841828392 40.7926924268376) +-73.9546201403481,40.7989423768656,42D-AM-1014-03,42D,AM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9546201403481 40.7989423768656) +-73.9694169352433,40.7744408293858,12G-PM-1007-03,12G,PM,10072018,3,,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,bushes,false,false,false,false,true,,false,false,false,false,false,false,false,false,friendly,POINT (-73.9694169352433 40.7744408293858) +-73.9712034320741,40.7764415506669,13D-PM-1018-05,13D,PM,10182018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,true,false,,POINT (-73.9712034320741 40.7764415506669) +-73.9671813866177,40.7838640032038,22C-PM-1006-04,22C,PM,10062018,4,Juvenile,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9671813866177 40.7838640032038) +-73.980919134781,40.7683772453336,1A-PM-1014-06,01A,PM,10142018,6,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,true,false,false,false,false,false,false,true,,POINT (-73.980919134781 40.7683772453336) +-73.9595955824812,40.7933047943534,34D-PM-1007-01,34D,PM,10072018,1,Adult,Gray,White,Gray+White,,Above Ground,25,,false,false,true,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9595955824812 40.7933047943534) +-73.9674724790652,40.7768771349868,15G-PM-1019-01,15G,PM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9674724790652 40.7768771349868) +-73.9680522379372,40.772389813511,11I-PM-1012-06,11I,PM,10122018,6,Adult,Gray,,Gray+,,Above Ground,2,,true,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9680522379372 40.772389813511) +-73.9714907235676,40.774058386152,11E-PM-1012-01,11E,PM,10122018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714907235676 40.774058386152) +-73.9562105506291,40.7966991197909,39D-AM-1008-02,39D,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9562105506291 40.7966991197909) +-73.9554327683595,40.7953846381499,38E-AM-1010-05,38E,AM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,interested in my presence,POINT (-73.9554327683595 40.7953846381499) +-73.9699285688296,40.7774474015189,15D-AM-1007-08,15D,AM,10072018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,true,chasing #7,false,false,false,false,false,false,true,false,,POINT (-73.9699285688296 40.7774474015189) +-73.9701824376506,40.7763703306736,14E-AM-1008-21,14E,AM,10082018,21,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,false,true,false,false,"curious,but not expecting food",POINT (-73.9701824376506 40.7763703306736) +-73.9744387347626,40.7776953143835,13A-AM-1017-03,13A,AM,10172018,3,Adult,Cinnamon,,Cinnamon+,,,,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9744387347626 40.7776953143835) +-73.954554245377,40.7983935730557,41E-AM-1007-05,41E,AM,10072018,5,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,man/pit bull mix wandered,POINT (-73.954554245377 40.7983935730557) +-73.9775278847897,40.7687881061059,3C-AM-1007-02,03C,AM,10072018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9775278847897 40.7687881061059) +-73.9747288122551,40.7659918747507,2G-PM-1007-03,02G,PM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9747288122551 40.7659918747507) +-73.9689939368647,40.7740824773353,12G-AM-1012-03,12G,AM,10122018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.96899393686472 40.7740824773353) +-73.9765758043111,40.7713803154032,6C-AM-1007-03,06C,AM,10072018,3,Adult,Gray,White,Gray+White,,Above Ground,8,another tree,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9765758043111 40.7713803154032) +-73.9772164524209,40.7688399538756,3D-AM-1006-06,03D,AM,10062018,6,,Gray,,Gray+,,Above Ground,10,tree,true,false,true,false,false,,false,false,false,false,false,false,false,false,"did not run from humans,but ran straight to tree & climbed up",POINT (-73.9772164524209 40.7688399538756) +-73.9643032554205,40.7794514526463,19H-AM-1010-02,19H,AM,10102018,2,,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,near base of small tree,true,false,false,true,true,,false,false,false,true,false,true,false,false,ran from human with dog,POINT (-73.9643032554205 40.7794514526463) +-73.9588809150045,40.7847231576181,26I-PM-1010-01,26I,PM,10102018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,4,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9588809150045 40.7847231576181) +-73.9774928245781,40.7720464606979,6B-AM-1012-02,06B,AM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,by bike racks at Tavern on the Green,false,false,false,false,true,"walking,exploring - digging in flower bed",false,false,false,false,false,false,false,true,,POINT (-73.9774928245781 40.7720464606979) +-73.9754527701832,40.7656088463928,1G-PM-1010-02,01G,PM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,false,false,false,laying on tree branch,false,false,false,true,true,false,false,false,,POINT (-73.9754527701832 40.7656088463928) +-73.957134662576,40.7872395604122,30I-PM-1006-07,30I,PM,10062018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.957134662576 40.7872395604122) +-73.969560591279,40.7705619840715,8I-AM-1006-09,08I,AM,10062018,9,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,"very curious,looked like it expected food",POINT (-73.969560591279 40.7705619840715) +-73.9733820053679,40.7687330473562,5G-PM-1010-05,05G,PM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9733820053679 40.7687330473562) +-73.9750986553543,40.7740671171292,10C-AM-1018-03,10C,AM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9750986553543 40.7740671171292) +-73.9716624574422,40.7762037110101,13D-PM-1018-07,13D,PM,10182018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,true,false,true,false,false,scratching,false,false,false,false,false,false,true,false,,POINT (-73.9716624574422 40.7762037110101) +-73.9686413326172,40.7817423907284,19C-PM-1018-08,19C,PM,10182018,8,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White","Gray, Cinnamon & White selected as Primary. Gray & White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9686413326172 40.7817423907284) +-73.9773083616259,40.7710535931636,6B-PM-1017-01,06B,PM,10172018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,true,false,false,,POINT (-73.9773083616259 40.7710535931636) +-73.9611300905602,40.7918743735665,32C-PM-1013-07,32C,PM,10132018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9611300905602 40.7918743735665) +-73.9662063642345,40.7890778665307,28A-PM-1007-04,28A,PM,10072018,4,Adult,Gray,White,Gray+White,,,,,false,false,false,false,false,looking at me & #5,true,false,false,false,true,false,false,false,freezes,POINT (-73.9662063642345 40.7890778665307) +-73.9563662963703,40.7991952101949,42C-PM-1013-01,42C,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9563662963703 40.7991952101949) +-73.9618591510932,40.7921343738001,32C-PM-1013-11,32C,PM,10132018,11,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9618591510932 40.7921343738001) +-73.9581326554206,40.7918074743129,34E-PM-1006-02,34E,PM,10062018,2,Juvenile,Black,"Gray, White","Black+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9581326554206 40.7918074743129) +-73.9735655529245,40.7716072681474,7E-PM-1013-02,07E,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Ground & Tree Base,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9735655529245 40.7716072681474) +-73.9616693665254,40.792971019627,33B-AM-1010-05,33B,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9616693665254 40.792971019627) +-73.9599197612389,40.7954836456006,36B-PM-1013-05,36B,PM,10132018,5,Adult,Gray,,Gray+,,Above Ground,4,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9599197612389 40.7954836456006) +-73.9806805581636,40.7681537966505,1B-AM-1012-16,01B,AM,10122018,16,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9806805581636 40.7681537966505) +-73.9727698663722,40.7714335285174,8F-PM-1012-06,08F,PM,10122018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9727698663722 40.7714335285174) +-73.9610985171525,40.7913867116989,32D-AM-1013-01,32D,AM,10132018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9610985171525 40.7913867116989) +-73.9616770335086,40.7921648631096,32C-PM-1013-13,32C,PM,10132018,13,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,buried nut,false,false,false,false,true,false,false,false,,POINT (-73.9616770335086 40.7921648631096) +-73.9636476467218,40.7775556986702,18I-AM-1017-01,18I,AM,10172018,1,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9636476467218 40.7775556986702) +-73.9765269282059,40.7746876635248,9A-AM-1013-10,09A,AM,10132018,10,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9765269282059 40.7746876635248) +-73.9655277320465,40.7806120529369,20F-AM-1014-03,20F,AM,10142018,3,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9655277320465 40.7806120529369) +-73.9534910562766,40.7935774443789,37H-AM-1018-04,37H,AM,10182018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,was with a lot of robins,POINT (-73.9534910562766 40.7935774443789) +-73.9631350020634,40.791907210332,32B-PM-1010-01,32B,PM,10102018,1,Juvenile,Gray,,Gray+,,Above Ground,25,in tree,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9631350020634 40.791907210332) +-73.9693772461788,40.7706875892901,8I-AM-1006-03,08I,AM,10062018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9693772461788 40.7706875892901) +-73.9708782966369,40.776946866963,14D-AM-1014-08,14D,AM,10142018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9708782966369 40.77694686696301) +-73.9674930668431,40.781351011968,20D-PM-1014-01,20D,PM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.96749306684312 40.781351011968) +-73.961934398055,40.7924789548522,33B-PM-1010-07,33B,PM,10102018,7,Adult,,,+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.961934398055 40.7924789548522) +-73.9629184712372,40.7921410511633,32B-PM-1010-04,32B,PM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9629184712372 40.7921410511633) +-73.972112497276,40.7702759037428,7G-AM-1010-08,07G,AM,10102018,8,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.972112497276 40.7702759037428) +-73.9726090882487,40.7710199108849,7F-AM-1008-14,07F,AM,10082018,14,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9726090882487 40.7710199108849) +-73.9791648157033,40.767625444347,2C-AM-1010-04,02C,AM,10102018,4,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9791648157033 40.767625444347) +-73.9711582199102,40.7783674409485,15C-PM-1017-05,15C,PM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,true,false,false,false,true,true,false,false,,POINT (-73.9711582199102 40.7783674409485) +-73.9542684235907,40.7944237164092,38G-PM-1020-05,38G,PM,10202018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,true,false,true,false,false,true,false,,POINT (-73.9542684235907 40.7944237164092) +-73.9542770888881,40.7943610366853,38G-PM-1020-04,38G,PM,10202018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,true,false,true,false,false,true,false,,POINT (-73.9542770888881 40.79436103668531) +-73.9702717260829,40.768951107763,6I-PM-1013-03,06I,PM,10132018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,"Flowers, grass",false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9702717260829 40.768951107763) +-73.9681627331154,40.7785099665602,17E-PM-1018-02,17E,PM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,On the rock,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9681627331154 40.7785099665602) +-73.9542733797804,40.795578653743,39F-PM-1006-02,39F,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,20,tree,false,false,false,false,false,,false,false,false,false,false,false,false,true,ran up tree when approached,POINT (-73.9542733797804 40.795578653743) +-73.9528353702209,40.7976456178263,41F-PM-1019-02,41F,PM,10192018,2,,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9528353702209 40.7976456178263) +-73.956737220098,40.797580989255,40C-PM-1006-01,40C,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.95673722009802 40.797580989255) +-73.9653739273979,40.7889762096967,28B-PM-1010-02,28B,PM,10102018,2,Adult,Gray,White,Gray+White,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9653739273979 40.7889762096967) +-73.9564741038174,40.7938845572816,36F-AM-1017-03,36F,AM,10172018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon on shoulders,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,runs from (me),POINT (-73.9564741038174 40.7938845572816) +-73.9773361580792,40.7729478226715,7B-AM-1008-13,07B,AM,10082018,13,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9773361580792 40.7729478226715) +-73.9752263564287,40.772084917017,7C-PM-1020-02,07C,PM,10202018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9752263564287 40.772084917017) +-73.9669762657479,40.7835913293646,22C-PM-1006-08,22C,PM,10062018,8,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9669762657479 40.7835913293646) +-73.9796470494747,40.7678370925485,1C-PM-1013-08,01C,PM,10132018,8,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9796470494747 40.7678370925485) +-73.9806959248152,40.7684820679479,2A-AM-1010-01,02A,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9806959248152 40.7684820679479) +-73.9586077039567,40.7961896477077,38C-AM-1019-10,38C,AM,10192018,10,Adult,Gray,White,Gray+White,,Above Ground,20,,true,false,true,true,false,,true,false,false,false,true,false,false,true,,POINT (-73.9586077039567 40.7961896477077) +-73.9611274898661,40.7915250069086,32C-AM-1014-05,32C,AM,10142018,5,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9611274898661 40.7915250069086) +-73.9676732725672,40.7763194425467,15G-PM-1019-09,15G,PM,10192018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9676732725672 40.7763194425467) +-73.9787608762005,40.7686062296462,3C-PM-1008-01,03C,PM,10082018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,3,,false,false,false,false,false,walked between trees,false,false,false,false,false,false,true,false,,POINT (-73.9787608762005 40.7686062296462) +-73.9615649773504,40.7954761311501,36A-PM-1013-02,36A,PM,10132018,2,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9615649773504 40.7954761311501) +-73.9730085729495,40.7708933570327,7F-AM-1008-12,07F,AM,10082018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9730085729495 40.7708933570327) +-73.9697160572446,40.7711445570446,9H-AM-1006-02,09H,AM,10062018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.96971605724461 40.7711445570446) +-73.9685709455958,40.7744877026506,12G-PM-1007-07,12G,PM,10072018,7,Juvenile,,,+,,Above Ground,45,,false,false,false,true,false,acorns,false,false,false,false,false,false,false,false,,POINT (-73.9685709455958 40.7744877026506) +-73.9580021017892,40.7955140102242,37D-PM-1014-07,37D,PM,10142018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9580021017892 40.7955140102242) +-73.9677146741772,40.7788231332337,17E-AM-1017-07,17E,AM,10172018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9677146741772 40.7788231332337) +-73.9578658632957,40.7933712188923,35E-AM-1020-04,35E,AM,10202018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,30,,false,false,false,false,false,"hunkered down,tail over body; sitting perfectly still",false,false,false,false,false,false,true,false,,POINT (-73.9578658632957 40.7933712188923) +-73.9648090698176,40.7903882097837,29A-PM-1019-03,29A,PM,10192018,3,Juvenile,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,true,false,true,"ran from,but now approaching. kind of weirding me out.",POINT (-73.9648090698176 40.7903882097837) +-73.9687134137786,40.7812207913391,19C-PM-1018-03,19C,PM,10182018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9687134137786 40.7812207913391) +-73.95488263914,40.7959474571251,39F-AM-1014-05,39F,AM,10142018,5,Juvenile,Cinnamon,,Cinnamon+,,Above Ground,2,up/down tree,true,false,true,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.95488263914 40.7959474571251) +-73.9710801547498,40.7760872452093,13D-AM-1014-03,13D,AM,10142018,3,Juvenile,Gray,White,Gray+White,,Above Ground,2,,false,true,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9710801547498 40.7760872452093) +-73.9704677007779,40.7786860108302,16C-PM-1018-02,16C,PM,10182018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,6,,false,true,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9704677007779 40.7786860108302) +-73.9655233748105,40.7792737287734,18G-AM-1014-01,18G,AM,10142018,1,Juvenile,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,true,false,false,false,false,false,true,false,looking,POINT (-73.9655233748105 40.7792737287734) +-73.9602808042376,40.7906130788763,32E-AM-1007-14,32E,AM,10072018,14,Adult,Gray,,Gray+,,Above Ground,50,literally fell to ground from 50 feet up,false,false,false,false,false,falling,false,false,false,false,false,false,false,true,,POINT (-73.9602808042376 40.7906130788763) +-73.970442878377,40.7763755560359,14E-AM-1008-22,14E,AM,10082018,22,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.970442878377 40.7763755560359) +-73.9773495807135,40.7664559937331,1E-AM-1006-05,01E,AM,10062018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9773495807135 40.7664559937331) +-73.9681202146851,40.7743979416812,13G-PM-1008-04,13G,PM,10082018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,lawn @ edge of landscaped area,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9681202146851 40.7743979416812) +-73.9745009906157,40.7741574075364,10C-AM-1018-01,10C,AM,10182018,1,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9745009906157 40.7741574075364) +-73.9761632586697,40.7741085606149,9B-PM-1013-05,09B,PM,10132018,5,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9761632586697 40.7741085606149) +-73.9700666654946,40.7742857042581,12F-PM-1007-08,12F,PM,10072018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,stared,POINT (-73.9700666654946 40.7742857042581) +-73.9589371550945,40.7959812504467,37C-PM-1013-04,37C,PM,10132018,4,Adult,Gray,White,Gray+White,,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9589371550945 40.7959812504467) +-73.9746204802221,40.7699294840733,6E-PM-1010-01,06E,PM,10102018,1,Juvenile,,,+,,Ground Plane,FALSE,along dirt path by cross-town car road. saw movement in a shrub/then caught sight a little fluffy tail,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9746204802221 40.7699294840733) +-73.9704778551644,40.7783119113627,15D-AM-1007-05,15D,AM,10072018,5,Adult,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9704778551644 40.7783119113627) +-73.973230162241,40.7689824531444,5F-AM-1007-01,05F,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,fence,true,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.973230162241 40.7689824531444) +-73.9581544682422,40.7958081306449,37C-PM-1013-02,37C,PM,10132018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9581544682422 40.7958081306449) +-73.9587913289229,40.7961707624534,38C-AM-1019-11,38C,AM,10192018,11,Adult,Gray,White,Gray+White,,Above Ground,20,,true,false,true,true,false,,true,false,false,false,true,false,false,true,,POINT (-73.9587913289229 40.7961707624534) +-73.9802840031759,40.7678599069819,1B-PM-1019-04,01B,PM,10192018,4,Juvenile,Gray,White,Gray+White,,Above Ground,25,in tree,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9802840031759 40.7678599069819) +-73.9594676326588,40.7984457363388,39A-AM-1013-01,39A,AM,10132018,1,Juvenile,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9594676326588 40.7984457363388) +-73.9810032206428,40.7681625634979,1A-AM-1007-01,01A,AM,10072018,1,Adult,Gray,White,Gray+White,,Above Ground,7,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9810032206428 40.7681625634979) +-73.9580513096783,40.79909641532,41B-AM-1010-02,41B,AM,10102018,2,Adult,Gray,White,Gray+White,,Above Ground,16,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9580513096783 40.79909641532) +-73.9678561384348,40.7782877397822,16E-PM-1018-02,16E,PM,10182018,2,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,false,false,gets distance from people but then continues to chase #1,POINT (-73.9678561384348 40.7782877397822) +-73.9757313481982,40.7754704051391,11A-PM-1013-04,11A,PM,10132018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9757313481982 40.7754704051391) +-73.974828939898,40.7668886121909,2F-PM-1014-11,02F,PM,10142018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.974828939898 40.7668886121909) +-73.9673924060436,40.7788781851716,17F-AM-1007-03,17F,AM,10072018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9673924060436 40.7788781851716) +-73.9756017589251,40.7680335996527,3E-PM-1008-06,03E,PM,10082018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9756017589251 40.7680335996527) +-73.9647605121306,40.7803961531517,20G-AM-1018-03,20G,AM,10182018,3,Adult,Gray,,Gray+,,Above Ground,12,in tree,true,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9647605121306 40.7803961531517) +-73.9595022290348,40.7831151330074,25I-PM-1007-02,25I,PM,10072018,2,Adult,Gray,White,Gray+White,white belly,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,true,false,false,true,,POINT (-73.9595022290348 40.783115133007406) +-73.9537356145842,40.7917273773486,35I-PM-1006-02,35I,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9537356145842 40.7917273773486) +-73.9600204328201,40.782877291358,24I-AM-1019-01,24I,AM,10192018,1,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9600204328201 40.782877291358) +-73.9709722223794,40.7767329646325,14D-AM-1014-06,14D,AM,10142018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9709722223794 40.7767329646325) +-73.9586252875856,40.7852027586217,27I-AM-1007-03,27I,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,had .5 of a tail,Above Ground,20,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9586252875856 40.7852027586217) +-73.9664986446294,40.778308334318,17G-PM-1017-02,17G,PM,10172018,2,Adult,Gray,,Gray+,,Above Ground,15,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9664986446294 40.778308334318) +-73.9755321998542,40.7668311576007,2F-PM-1014-01,02F,PM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97553219985421 40.7668311576007) +-73.9666113598566,40.7752662550312,14H-PM-1012-05,14H,PM,10122018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,approaches (someone was feeding it),POINT (-73.9666113598566 40.7752662550312) +-73.9706533131129,40.768902033819,6I-AM-1006-01,06I,AM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,,true,false,true,true,true,,false,false,false,false,false,false,false,true,runs from (someone sneezed),POINT (-73.9706533131129 40.768902033819) +-73.970804709441,40.7758611111219,13E-PM-1008-01,13E,PM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.970804709441 40.7758611111219) +-73.9601918930677,40.7944134683406,35C-AM-1007-01,35C,AM,10072018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,(white oak),false,false,false,false,false,sitting still,false,false,false,false,false,false,false,false,,POINT (-73.9601918930677 40.7944134683406) +-73.9632577850183,40.793112839016,33A-AM-1008-01,33A,AM,10082018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,acknowledged,POINT (-73.9632577850183 40.793112839016) +-73.9574077497624,40.8001185184892,42B-AM-1014-01,42B,AM,10142018,1,Adult,Gray,,Gray+,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9574077497624 40.8001185184892) +-73.9760749752948,40.7703284894392,5D-PM-1018-02,05D,PM,10182018,2,Adult,Gray,,Gray+,,Above Ground,2,On low fence,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9760749752948 40.7703284894392) +-73.9582534432858,40.7917772296796,34F-PM-1012-01,34F,PM,10122018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9582534432858 40.7917772296796) +-73.9766779585686,40.7669673778105,2E-AM-1010-04,02E,AM,10102018,4,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,true,false,false,false,false,false,true,false,,POINT (-73.9766779585686 40.7669673778105) +-73.9721279808683,40.7661158663901,3I-PM-1013-02,03I,PM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9721279808683 40.7661158663901) +-73.971685475224,40.7706668465923,7G-PM-1018-07,07G,PM,10182018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.971685475224 40.7706668465923) +-73.9729645190377,40.7723310150843,9E-AM-1008-02,09E,AM,10082018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9729645190377 40.7723310150843) +-73.9748669205206,40.7743879232016,10B-AM-1006-01,10B,AM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9748669205206 40.7743879232016) +-73.961335649743,40.7818876867842,23H-PM-1019-01,23H,PM,10192018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.961335649743 40.7818876867842) +-73.961241953418,40.7941677113011,35B-PM-1013-07,35B,PM,10132018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,true,false,"got fed twice by grandpa,grabbed from grass and ate in tree",false,false,false,false,false,true,true,true,"approaches (grandpa with food),runs from (kid),kid was slowly creeping up on it; it eventually climbed up.",POINT (-73.961241953418 40.7941677113011) +-73.9728511531484,40.7782654840595,14B-PM-1014-03,14B,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9728511531484 40.7782654840595) +-73.9763852372393,40.768876248561,4D-AM-1012-02,04D,AM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9763852372393 40.768876248561) +-73.9696196840065,40.7836431098335,21A-AM-1019-09,21A,AM,10192018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9696196840065 40.7836431098335) +-73.9775238847836,40.7675792683587,2D-AM-1007-05,02D,AM,10072018,5,Adult,Gray,,Gray+,,Above Ground,100,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9775238847836 40.7675792683587) +-73.9601968065017,40.7935831836482,34C-PM-1012-03,34C,PM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9601968065017 40.79358318364821) +-73.9772810073685,40.7693577540392,4C-PM-1010-03,04C,PM,10102018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9772810073685 40.7693577540392) +-73.9561124892063,40.7949440648632,37E-AM-1013-04,37E,AM,10132018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,8,,false,false,true,true,false,,true,false,false,false,false,false,false,true,,POINT (-73.9561124892063 40.7949440648632) +-73.9580813119325,40.7905538237042,32F-PM-1008-04,32F,PM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9580813119325 40.7905538237042) +-73.9645365195454,40.7781531021263,18H-AM-1018-02,18H,AM,10182018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,Tree,true,true,false,false,false,playing?,false,false,false,false,false,false,false,false,,POINT (-73.9645365195454 40.7781531021263) +-73.9641989914569,40.789081044511,28B-AM-1007-01,28B,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,wresting w/ branch,false,false,false,false,false,false,false,false,,POINT (-73.9641989914569 40.789081044511) +-73.9555856074105,40.7969457685677,40E-AM-1014-04,40E,AM,10142018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,on rocks/bushy rocks,true,false,false,false,false,hiding from bird,false,true,false,false,true,false,true,false,,POINT (-73.9555856074105 40.79694576856771) +-73.9753818829907,40.7697840986163,5D-PM-1018-06,05D,PM,10182018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9753818829907 40.7697840986163) +-73.9715621134573,40.7695918717513,7H-AM-1006-02,07H,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,"running (along ground,up tree)",false,false,false,false,false,false,true,false,,POINT (-73.9715621134573 40.76959187175131) +-73.9714242426496,40.7744535798123,11E-PM-1012-05,11E,PM,10122018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,true,"foraging (foraged,ran to tree root,munched)",false,false,false,false,false,false,true,false,,POINT (-73.9714242426496 40.7744535798123) +-73.9697744662785,40.7755950428973,13F-AM-1007-04,13F,AM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9697744662785 40.7755950428973) +-73.9545037193355,40.7900225055417,33I-PM-1006-04,33I,PM,10062018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9545037193355 40.7900225055417) +-73.9563847867316,40.7906012261163,33G-AM-1013-03,33G,AM,10132018,3,?,,,+,Only peeked head out,Above Ground,13,,false,false,false,false,false,"peeking out of tree,did *not* come out",false,false,false,false,false,false,false,false,,POINT (-73.9563847867316 40.7906012261163) +-73.9714329979305,40.7741873388945,11E-PM-1012-04,11E,PM,10122018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714329979305 40.7741873388945) +-73.956926909344,40.7965323262487,39D-PM-1012-03,39D,PM,10122018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.956926909344 40.7965323262487) +-73.9584064203778,40.7912272455454,33F-PM-1012-04,33F,PM,10122018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,false,true,,POINT (-73.9584064203778 40.7912272455454) +-73.9630097276366,40.7936658446251,33A-PM-1018-04,33A,PM,10182018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9630097276366 40.79366584462511) +-73.9532074573139,40.7934669464908,37H-PM-1006-06,37H,PM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,40,tree,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9532074573139 40.7934669464908) +-73.9720289863666,40.7763749561607,13C-PM-1019-03,13C,PM,10192018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.97202898636661 40.7763749561607) +-73.9651177657676,40.7812408103825,20F-PM-1007-05,20F,PM,10072018,5,Juvenile,Gray,White,Gray+White,white tail,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9651177657676 40.781240810382506) +-73.9684657285532,40.7840113573723,22B-AM-1013-05,22B,AM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,looked down on me like her imperial subject,POINT (-73.9684657285532 40.7840113573723) +-73.9640588919446,40.790044098464,29B-PM-1010-04,29B,PM,10102018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9640588919446 40.790044098464) +-73.9704831177035,40.7699878995692,7H-AM-1006-10,07H,AM,10062018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9704831177035 40.7699878995692) +-73.9724806580638,40.7710077206132,7F-AM-1008-15,07F,AM,10082018,15,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9724806580638 40.7710077206132) +-73.9614902429282,40.7891282017625,30D-AM-1017-01,30D,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9614902429282 40.7891282017625) +-73.9698611971209,40.7753915552001,13F-PM-1008-02,13F,PM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9698611971209 40.7753915552001) +-73.9584064190878,40.7912992852442,33F-PM-1012-03,33F,PM,10122018,3,Adult,Black,Gray,Black+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9584064190878 40.7912992852442) +-73.9801971465604,40.7697081749827,3A-PM-1017-04,03A,PM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9801971465604 40.7697081749827) +-73.9686778167484,40.7765625256946,14F-PM-1012-04,14F,PM,10122018,4,,,,+,,,,,false,false,false,false,false,,true,true,false,false,false,false,false,false,,POINT (-73.96867781674841 40.7765625256946) +-73.976609486498,40.7717832922535,7C-PM-1020-04,07C,PM,10202018,4,Adult,Gray,,Gray+,,Above Ground,1,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.976609486498 40.7717832922535) +-73.9589635326362,40.7951748673846,37C-AM-1012-02,37C,AM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,"Cinnamon flanks, light band across nose",Ground Plane,FALSE,,false,false,false,false,true,caching,false,false,false,false,false,false,true,false,,POINT (-73.9589635326362 40.7951748673846) +-73.9676370985166,40.7869888639434,25A-AM-1013-01,25A,AM,10132018,1,,Gray,White,Gray+White,White Belly,Ground Plane,FALSE,,false,false,false,true,false,staring at me,false,false,false,false,false,false,true,false,,POINT (-73.96763709851662 40.7869888639434) +-73.9707498430394,40.7723724480959,10G-PM-1017-09,10G,PM,10172018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9707498430394 40.7723724480959) +-73.9628525533831,40.7938449345017,34A-PM-1013-02,34A,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,true,true,eating upside down on tree trunk,false,false,false,false,false,false,false,false,,POINT (-73.9628525533831 40.7938449345017) +-73.9538867186376,40.7941409434007,38G-PM-1020-03,38G,PM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9538867186376 40.7941409434007) +-73.9588610195699,40.7945269936639,36C-AM-1014-02,36C,AM,10142018,2,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,Crossing path,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9588610195699 40.7945269936639) +-73.9545773579075,40.7898684635744,33I-AM-1008-05,33I,AM,10082018,5,Adult,,,+,,Above Ground,100,,false,false,true,false,true,,false,false,false,false,false,false,true,false,nearly dropped shell on my head!,POINT (-73.9545773579075 40.7898684635744) +-73.9716736557408,40.7749333494336,12E-AM-1017-07,12E,AM,10172018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9716736557408 40.7749333494336) +-73.9791085350047,40.7677025342633,2C-PM-1013-12,02C,PM,10132018,12,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9791085350047 40.7677025342633) +-73.9545807749923,40.7900507537649,33I-PM-1006-02,33I,PM,10062018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9545807749923 40.7900507537649) +-73.965394655961,40.7763136791661,15I-PM-1012-05,15I,PM,10122018,5,Adult,Gray,,Gray+,,Above Ground,2,,true,false,true,false,true,burying the food on ground,false,false,false,false,false,false,false,false,look at us and continue hiding the food,POINT (-73.965394655961 40.7763136791661) +-73.9690072647093,40.7737712267463,12G-AM-1012-02,12G,AM,10122018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9690072647093 40.7737712267463) +-73.9501762527462,40.7975534086077,42H-PM-1014-05,42H,PM,10142018,5,Adult,Gray,White,Gray+White,,Above Ground,15,,true,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9501762527462 40.7975534086077) +-73.9727405679487,40.7782677554482,14B-PM-1014-01,14B,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9727405679487 40.7782677554482) +-73.9713070217071,40.7753795014815,12E-AM-1017-05,12E,AM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9713070217071 40.7753795014815) +-73.9807078515193,40.7683335292642,2A-AM-1010-04,02A,AM,10102018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9807078515193 40.7683335292642) +-73.9684790657851,40.7838818717863,22B-AM-1013-01,22B,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,"looked at me,standing on back feet",POINT (-73.9684790657851 40.7838818717863) +-73.9525752408169,40.7954915417553,39H-AM-1007-03,39H,AM,10072018,3,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9525752408169 40.7954915417553) +-73.9735137178369,40.769109895294,5F-AM-1007-06,05F,AM,10072018,6,Adult,Gray,,Gray+,,Above Ground,2,branch,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9735137178369 40.769109895294) +-73.9615500510038,40.7920799263699,32C-PM-1013-05,32C,PM,10132018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9615500510038 40.7920799263699) +-73.9722261495647,40.7690542072646,6G-PM-1020-03,06G,PM,10202018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9722261495647 40.7690542072646) +-73.9765064169087,40.7737211426714,8B-AM-1007-06,08B,AM,10072018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9765064169087 40.7737211426714) +-73.9625205538171,40.7810785055136,21H-AM-1017-01,21H,AM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9625205538171 40.7810785055136) +-73.9769969548024,40.7710711265211,6C-AM-1007-01,06C,AM,10072018,1,Adult,Gray,White,Gray+White,vid!,Above Ground,15,,false,false,true,false,false,,false,false,false,false,true,false,false,false,"curious,but wary",POINT (-73.97699695480242 40.7710711265211) +-73.9608167300104,40.7954348688268,36A-PM-1013-05,36A,PM,10132018,5,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,EDGE OF WOODS,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9608167300104 40.7954348688268) +-73.9705254801,40.7763606494306,13E-AM-1017-03,13E,AM,10172018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,true,false,false,false,false,false,false,true,acknowledges,POINT (-73.9705254801 40.7763606494306) +-73.9732193290631,40.7748791447746,11D-PM-1006-01,11D,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9732193290631 40.7748791447746) +-73.9706586108006,40.7796357444471,17C-PM-1013-02,17C,PM,10132018,2,Adult,Gray,,Gray+,,Above Ground,20,in a tree,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9706586108006 40.7796357444471) +-73.9733461334967,40.7684314285151,5G-PM-1010-01,05G,PM,10102018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9733461334967 40.7684314285151) +-73.9728339757306,40.7782891207966,14B-PM-1014-04,14B,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,running up and down,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9728339757306 40.7782891207966) +-73.9699799501516,40.7736576286234,11F-AM-1013-02,11F,AM,10132018,2,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9699799501516 40.7736576286234) +-73.9693894305786,40.7756906748026,13F-PM-1008-04,13F,PM,10082018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9693894305786 40.7756906748026) +-73.9556450015702,40.7967188058002,39E-AM-1018-04,39E,AM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9556450015702 40.7967188058002) +-73.9655670884957,40.7763728890554,16H-PM-1014-03,16H,PM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,followed man across bridge,POINT (-73.9655670884957 40.7763728890554) +-73.9721642509914,40.7701179390078,7G-AM-1010-01,07G,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9721642509914 40.7701179390078) +-73.9733882364574,40.7683078706597,5G-AM-1006-01,05G,AM,10062018,1,Adult,Gray,Black,Gray+Black,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,false,made eye contact with me,POINT (-73.9733882364574 40.7683078706597) +-73.9662409997642,40.7891042935432,28A-PM-1007-03,28A,PM,10072018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,true,false,true,true,chasing #2 took #2 food wrapper and is foraging through it,false,false,false,false,false,false,true,false,,POINT (-73.9662409997642 40.7891042935432) +-73.9548006161673,40.7945503341011,38G-PM-1020-08,38G,PM,10202018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,true,false,false,true,false,false,true,false,,POINT (-73.9548006161673 40.7945503341011) +-73.9530326577312,40.7956922386395,39G-PM-1013-02,39G,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9530326577312 40.795692238639504) +-73.9625383795297,40.7883862331728,28D-AM-1012-03,28D,AM,10122018,3,Adult,Black,,Black+,,Above Ground,30,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9625383795297 40.7883862331728) +-73.970041085185,40.7834427580313,21A-AM-1019-07,21A,AM,10192018,7,Adult,Gray,,Gray+,,Above Ground,25,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.970041085185 40.783442758031306) +-73.9632265832593,40.7816914475461,22G-AM-1018-04,22G,AM,10182018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9632265832593 40.78169144754611) +-73.971730277301,40.7748805439381,11D-PM-1006-05,11D,PM,10062018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.971730277301 40.7748805439381) +-73.968021326951,40.7778807692445,16F-PM-1013-06,16F,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Big rock in meadow,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.968021326951 40.7778807692445) +-73.9723922904119,40.7729164833027,9E-AM-1008-01,09E,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9723922904119 40.7729164833027) +-73.9538970554532,40.7955196793479,39G-PM-1013-03,39G,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9538970554532 40.7955196793479) +-73.9673103881521,40.7874267409618,26A-PM-1006-01,26A,PM,10062018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9673103881521 40.7874267409618) +-73.9725961508316,40.7795720444974,16A-PM-1019-06,16A,PM,10192018,6,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9725961508316 40.7795720444974) +-73.9727115915422,40.7782929320632,14B-PM-1014-02,14B,PM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9727115915422 40.7782929320632) +-73.9620964576469,40.7917332001738,32C-PM-1013-01,32C,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9620964576469 40.7917332001738) +-73.970216605149,40.7702960667277,8H-PM-1014-08,08H,PM,10142018,8,Adult,Gray,,Gray+,,Above Ground,5,,false,true,false,false,false,"chasing (#7),playing?",false,false,false,false,false,false,true,false,,POINT (-73.970216605149 40.7702960667277) +-73.9690104245067,40.7853358193723,23A-AM-1018-02,23A,AM,10182018,2,Juvenile,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9690104245067 40.7853358193723) +-73.9692401421068,40.7707128895661,8I-AM-1006-04,08I,AM,10062018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9692401421068 40.7707128895661) +-73.9689305978751,40.7818152496266,19C-PM-1018-06,19C,PM,10182018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,Climbed fence,true,false,true,false,false,climbing (fence),false,false,false,false,false,false,true,false,,POINT (-73.9689305978751 40.7818152496266) +-73.9630381400083,40.7807571827321,21H-PM-1018-02,21H,PM,10182018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9630381400083 40.7807571827321) +-73.9779263114572,40.7682681855369,3D-PM-1010-08,03D,PM,10102018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9779263114572 40.7682681855369) +-73.9520024654602,40.7947329828155,39I-PM-1013-04,39I,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as both Primary and Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,true,false,playing,false,false,false,false,false,true,false,false,,POINT (-73.95200246546021 40.7947329828155) +-73.9695226023739,40.7797527775804,17D-AM-1008-01,17D,AM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9695226023739 40.7797527775804) +-73.9703921271418,40.7700276115314,7H-PM-1006-06,07H,PM,10062018,6,Adult,Gray,,Gray+,,Above Ground,15,,false,true,true,false,false,playing w/ #7,false,false,false,false,false,false,true,false,,POINT (-73.9703921271418 40.770027611531404) +-73.9746128451271,40.7700957046709,6E-PM-1010-02,06E,PM,10102018,2,Adult,Cinnamon,White,Cinnamon+White,white back legs,Ground Plane,FALSE,small open area but w/ 7 large oak trees,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9746128451271 40.7700957046709) +-73.9767220179725,40.7753262103123,10A-PM-1014-03,10A,PM,10142018,3,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Above Ground,,above my head in tree,false,false,false,true,false,eating (in a tree),false,false,false,false,false,false,true,false,"indifferent (lots of people taking its picture,didn't bother it)",POINT (-73.9767220179725 40.7753262103123) +-73.9698083598887,40.7720099392886,10H-AM-1014-01,10H,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9698083598887 40.7720099392886) +-73.9681874036914,40.7817948690964,20C-PM-1018-02,20C,PM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9681874036914 40.7817948690964) +-73.957710975899,40.7984055614047,40B-AM-1019-06,40B,AM,10192018,6,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.957710975899 40.7984055614047) +-73.9711617997772,40.7761212878075,13D-PM-1018-04,13D,PM,10182018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9711617997772 40.7761212878075) +-73.960876728048,40.79035724537,31D-PM-1006-03,31D,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.960876728048 40.79035724537) +-73.9713906492842,40.7750061310143,12E-PM-1018-03,12E,PM,10182018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9713906492842 40.7750061310143) +-73.9642111283068,40.7777713985327,18I-PM-1007-07,18I,PM,10072018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9642111283068 40.7777713985327) +-73.9669207809051,40.7792767850126,18F-PM-1008-01,18F,PM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9669207809051 40.7792767850126) +-73.976422624924,40.7735818387346,8B-AM-1007-08,08B,AM,10072018,8,Adult,Gray,,Gray+,,Above Ground,6,,false,false,false,true,false,holding nut,false,false,false,false,false,false,true,false,,POINT (-73.976422624924 40.7735818387346) +-73.958939037549,40.7913193931203,33E-PM-1012-04,33E,PM,10122018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,playing,false,false,false,false,false,false,false,false,,POINT (-73.958939037549 40.7913193931203) +-73.9790044506465,40.7689469479245,3B-AM-1010-03,03B,AM,10102018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,chasing #2,false,false,false,false,false,false,false,true,,POINT (-73.9790044506465 40.7689469479245) +-73.9777978497894,40.7668620784309,1D-AM-1006-01,01D,AM,10062018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,true,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9777978497894 40.7668620784309) +-73.9698642668906,40.7784669316504,16D-PM-1010-10,16D,PM,10102018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9698642668906 40.7784669316504) +-73.9785114291288,40.7719779589449,6A-PM-1012-03,06A,PM,10122018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9785114291288 40.7719779589449) +-73.9695655231393,40.7698324659513,8I-PM-1013-02,08I,PM,10132018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9695655231393 40.7698324659513) +-73.9690645326017,40.7773822116124,15E-AM-1013-03,15E,AM,10132018,3,Adult,Gray,,Gray+,,Above Ground,2,on fallen log,false,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9690645326017 40.7773822116124) +-73.9597462612063,40.7832801145306,25I-PM-1007-06,25I,PM,10072018,6,,,,+,"Didn't see squirrel size, or colors",Above Ground,20,up in tree,false,false,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9597462612063 40.7832801145306) +-73.9784942525972,40.7672600003683,1D-AM-1006-06,01D,AM,10062018,6,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,true,false,false,false,false,tumbling,false,false,false,false,false,false,false,false,,POINT (-73.9784942525972 40.7672600003683) +-73.9746238280116,40.7671491962844,3F-AM-1006-06,03F,AM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Nothing selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9746238280116 40.7671491962844) +-73.9705331808443,40.7699943571296,7H-AM-1006-09,07H,AM,10062018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9705331808443 40.7699943571296) +-73.968200390984,40.7837095769482,22B-AM-1013-02,22B,AM,10132018,2,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,climbed tree,false,false,false,false,false,false,true,false,,POINT (-73.968200390984 40.7837095769482) +-73.9631648674122,40.7926529617419,32A-PM-1013-08,32A,PM,10132018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9631648674122 40.7926529617419) +-73.9587072763996,40.7850256219415,27I-AM-1007-01,27I,AM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,20,,false,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9587072763996 40.7850256219415) +-73.9642397829547,40.7918992406575,31A-PM-1017-02,31A,PM,10172018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.96423978295472 40.7918992406575) +-73.974084681071,40.7728197139621,8D-AM-1007-06,08D,AM,10072018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.974084681071 40.7728197139621) +-73.9676270670996,40.776391443152,15G-AM-1008-04,15G,AM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9676270670996 40.776391443152) +-73.9703816112358,40.7773846065919,15D-PM-1017-02,15D,PM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9703816112358 40.7773846065919) +-73.9803895322385,40.7680730789944,1B-AM-1012-13,01B,AM,10122018,13,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9803895322385 40.7680730789944) +-73.9695133370801,40.7765009796853,14E-AM-1008-16,14E,AM,10082018,16,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9695133370801 40.7765009796853) +-73.9774407362587,40.7698056129554,4C-PM-1010-12,04C,PM,10102018,12,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9774407362587 40.7698056129554) +-73.9681079869821,40.7723494081345,11I-PM-1012-05,11I,PM,10122018,5,Adult,Gray,,Gray+,,Above Ground,2,,true,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9681079869821 40.7723494081345) +-73.973047824163,40.7700873791211,7F-AM-1008-03,07F,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.973047824163 40.7700873791211) +-73.9662864884789,40.7891062338302,28A-PM-1007-02,28A,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,running from #3,false,false,false,false,false,false,true,false,,POINT (-73.9662864884789 40.7891062338302) +-73.9673129010312,40.7778169845999,16F-PM-1013-05,16F,PM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Pine tree near utility shed,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9673129010312 40.7778169845999) +-73.9540197079615,40.798039260983,41E-PM-1013-03,41E,PM,10132018,3,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",Gray on legs,Above Ground,20,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9540197079615 40.798039260983) +-73.9595613548804,40.7838057527338,25I-PM-1007-04,25I,PM,10072018,4,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9595613548804 40.7838057527338) +-73.9561840935803,40.7992037821497,42C-PM-1013-05,42C,PM,10132018,5,Adult,Gray,,Gray+,,Above Ground,20,,false,false,false,true,false,,true,false,false,false,false,false,true,false,,POINT (-73.9561840935803 40.7992037821497) +-73.9703169373939,40.7700658823854,7H-AM-1006-13,07H,AM,10062018,13,Adult,Gray,,Gray+,,Above Ground,10,,true,false,false,false,false,running (up tree),false,false,false,false,false,false,true,false,,POINT (-73.9703169373939 40.7700658823854) +-73.9619985187616,40.7943277743532,34A-AM-1012-02,34A,AM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,10,chasing from tree to ground,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9619985187616 40.7943277743532) +-73.965390623703,40.7807731363782,20F-PM-1007-08,20F,PM,10072018,8,Adult,Cinnamon,White,Cinnamon+White,white tail/belly,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.965390623703 40.7807731363782) +-73.9735298943321,40.7714939993589,8E-AM-1013-02,08E,AM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9735298943321 40.7714939993589) +-73.9768309556127,40.7717803706095,6B-AM-1012-01,06B,AM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,"Started in field, crossed busy street, ran up tree",true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97683095561271 40.7717803706095) +-73.9775079672882,40.7691500357424,4C-PM-1010-07,04C,PM,10102018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9775079672882 40.7691500357424) +-73.97157754108,40.7776249963967,14C-PM-1006-01,14C,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,,false,true,false,false,false,false,false,true,,POINT (-73.97157754108 40.7776249963967) +-73.9804065254162,40.7681481183296,1B-PM-1019-08,01B,PM,10192018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9804065254162 40.7681481183296) +-73.9701030393506,40.7838953063625,21A-AM-1019-04,21A,AM,10192018,4,Juvenile,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701030393506 40.7838953063625) +-73.9581310602492,40.7960214726964,38C-PM-1014-05,38C,PM,10142018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,chasing (#4),false,false,false,false,false,false,false,true,,POINT (-73.9581310602492 40.7960214726964) +-73.9611312355348,40.7950130863913,36A-PM-1013-04,36A,PM,10132018,4,,Gray,White,Gray+White,,Ground Plane,FALSE,ON ROCK NEAR POND,false,false,false,false,false,sitting,false,false,false,false,true,false,true,false,,POINT (-73.9611312355348 40.7950130863913) +-73.9714150090362,40.7774976423922,14C-PM-1006-03,14C,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9714150090362 40.7774976423922) +-73.9805517765469,40.7683044693163,2B-PM-1013-05,02B,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,true,false,false,climbing fence!,false,false,false,false,false,false,false,false,snuck into bike cart!,POINT (-73.9805517765469 40.7683044693163) +-73.9693209851947,40.7707450042769,8I-AM-1006-01,08I,AM,10062018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9693209851947 40.7707450042769) +-73.9567062023419,40.797482865196,40C-PM-1006-02,40C,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9567062023419 40.797482865196) +-73.9610388059192,40.79395293584,34B-PM-1007-01,34B,PM,10072018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9610388059192 40.79395293584) +-73.9576223390082,40.7979746639647,40B-AM-1019-04,40B,AM,10192018,4,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,true,true,false,,POINT (-73.9576223390082 40.79797466396471) +-73.9575517912392,40.7889158268192,31H-PM-1008-05,31H,PM,10082018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9575517912392 40.7889158268192) +-73.9676539688726,40.7777229934129,16F-AM-1008-02,16F,AM,10082018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,near fence,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9676539688726 40.7777229934129) +-73.9778730762957,40.770827251547,5B-PM-1013-05,05B,PM,10132018,5,Adult,Gray,,Gray+,,Above Ground,3,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9778730762957 40.770827251547) +-73.9754696312232,40.768191647092,4E-AM-1020-02,04E,AM,10202018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",White selected as Primary. Cinnamon selected as Highlights. Made executive adjustments.,Above Ground,15,,false,false,true,false,true,foraging (on the tree itself),false,false,false,false,false,false,true,false,,POINT (-73.9754696312232 40.768191647092) +-73.9666945123922,40.7839956493194,22C-PM-1006-11,22C,PM,10062018,11,Juvenile,Gray,,Gray+,,Above Ground,13,,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9666945123922 40.7839956493194) +-73.9789401448556,40.7697373141498,4B-AM-1010-04,04B,AM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9789401448556 40.7697373141498) +-73.9726828460055,40.7705707694822,7F-AM-1008-08,07F,AM,10082018,8,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,playing w/ #9,false,false,false,false,false,false,true,false,,POINT (-73.9726828460055 40.7705707694822) +-73.9782603348665,40.7705790257951,5B-PM-1013-06,05B,PM,10132018,6,Adult,Gray,,Gray+,,Above Ground,5,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9782603348665 40.7705790257951) +-73.9753093777,40.7666673897583,2F-AM-1006-04,02F,AM,10062018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Beautiful white puff at the end of its tail,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.97530937770001 40.7666673897583) +-73.9544278270221,40.7987827316512,42D-PM-1013-02,42D,PM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,"Gray tail, Cinnamon feet",Ground Plane,FALSE,,false,true,false,false,true,"chasing (chased by #1),found a nut,buried it",false,false,false,false,false,false,true,false,,POINT (-73.9544278270221 40.7987827316512) +-73.9728836727349,40.770815850599,7F-AM-1008-10,07F,AM,10082018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9728836727349 40.770815850599) +-73.9545929242174,40.7986940168685,42D-AM-1014-02,42D,AM,10142018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9545929242174 40.7986940168685) +-73.9734644470766,40.7782766486921,14A-PM-1014-05,14A,PM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97346444707661 40.7782766486921) +-73.9690362384597,40.7767162824413,14F-PM-1012-09,14F,PM,10122018,9,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9690362384597 40.7767162824413) +-73.9628932797886,40.7923116396365,32B-PM-1010-05,32B,PM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9628932797886 40.7923116396365) +-73.9770508584979,40.7710769301257,6C-AM-1007-02,06C,AM,10072018,2,Adult,,,+,,Above Ground,15,,false,false,true,false,false,pulling things off branches,false,false,false,false,false,false,false,false,,POINT (-73.9770508584979 40.7710769301257) +-73.9545425520879,40.7956853415959,39F-PM-1006-04,39F,PM,10062018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,35,in tree,false,false,true,false,false,climbing down,false,false,false,false,false,false,false,true,ran when saw me,POINT (-73.9545425520879 40.7956853415959) +-73.9639024988123,40.7776953065849,18I-PM-1007-01,18I,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,,false,false,true,true,true,hanging upside down,false,false,false,false,false,false,true,false,,POINT (-73.9639024988123 40.7776953065849) +-73.9607056611532,40.7889786103871,30E-AM-1008-03,30E,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9607056611532 40.7889786103871) +-73.9655238539833,40.7815633947684,21E-AM-1017-03,21E,AM,10172018,3,Adult,Gray,,Gray+,,Above Ground,7,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9655238539833 40.7815633947684) +-73.9746049088475,40.7728776887397,8C-AM-1007-01,08C,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,"behind fence, safe",true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9746049088475 40.7728776887397) +-73.9599202233536,40.7972599930224,38A-AM-1019-02,38A,AM,10192018,2,Adult,Gray,,Gray+,,Above Ground,3,,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9599202233536 40.7972599930224) +-73.9806718258385,40.7692776896995,2A-AM-1010-07,02A,AM,10102018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,false,couldn't get near,POINT (-73.9806718258385 40.76927768969951) +-73.9564215689843,40.7957539444068,38E-AM-1010-01,38E,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9564215689843 40.7957539444068) +-73.9642666013207,40.7810384867375,21G-PM-1007-03,21G,PM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.96426660132072 40.7810384867375) +-73.9752029513644,40.7671734667361,3F-AM-1006-04,03F,AM,10062018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,on a rock,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9752029513644 40.7671734667361) +-73.9755836827968,40.7670239327996,2F-PM-1014-02,02F,PM,10142018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9755836827968 40.7670239327996) +-73.9744555348544,40.7728498106357,8D-PM-1007-03,08D,PM,10072018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,,,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9744555348544 40.7728498106357) +-73.9635606199784,40.782206970617,22G-AM-1018-03,22G,AM,10182018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9635606199784 40.782206970617) +-73.9734969320943,40.7722754599865,8E-AM-1013-01,08E,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9734969320943 40.7722754599865) +-73.9615090149261,40.7945150173918,35A-PM-1013-09,35A,PM,10132018,9,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9615090149261 40.7945150173918) +-73.9770119133023,40.7732949090005,8A-AM-1013-04,08A,AM,10132018,4,Juvenile,,,+,,Above Ground,4,fence,true,true,false,true,true,playing tag together,false,false,false,false,false,true,false,false,,POINT (-73.9770119133023 40.7732949090005) +-73.9737060043988,40.7725660224983,8D-AM-1007-05,08D,AM,10072018,5,Adult,Gray,,Gray+,,Above Ground,15,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9737060043988 40.7725660224983) +-73.9736873018042,40.7649106677138,1I-PM-1012-02,01I,PM,10122018,2,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White","Gray, Black, & Cinnamon selected as Primary. Gray, Cinnamon, & White selected as Highlights. Made executive adjustments.",Above Ground,1,tree,false,false,true,false,false,,true,false,false,false,false,false,false,true,,POINT (-73.9736873018042 40.7649106677138) +-73.9617519095277,40.7947179071388,35A-PM-1013-04,35A,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,In the weeds by the pool,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9617519095277 40.7947179071388) +-73.9594391759139,40.784115697669,26I-PM-1010-03,26I,PM,10102018,3,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",black in tail,Above Ground,15,tree,false,false,true,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9594391759139 40.784115697669) +-73.9713665249614,40.7697178648002,7H-AM-1006-01,07H,AM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,nut in mouth,false,false,false,false,false,false,true,false,,POINT (-73.9713665249614 40.7697178648002) +-73.9759428006237,40.7715081817329,7C-PM-1020-06,07C,PM,10202018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9759428006237 40.7715081817329) +-73.9710025484537,40.7792529489016,16C-AM-1014-01,16C,AM,10142018,1,Juvenile,Gray,,Gray+,,Above Ground,40,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9710025484537 40.7792529489016) +-73.9527196716568,40.792363826828,36I-PM-1007-11,36I,PM,10072018,11,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,false,false,true,me!,POINT (-73.9527196716568 40.792363826828) +-73.9592392692535,40.7961869951798,37B-AM-1018-02,37B,AM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9592392692535 40.7961869951798) +-73.9747060143742,40.7728528164878,8C-AM-1007-02,08C,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,peeps out from behind tree at cooing tourists,POINT (-73.9747060143742 40.7728528164878) +-73.9726459773995,40.7656357433691,2I-AM-1006-02,02I,AM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9726459773995 40.7656357433691) +-73.9560731738677,40.7980336018554,41D-PM-1014-02,41D,PM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9560731738677 40.7980336018554) +-73.9701408623121,40.7695511718541,7I-PM-1013-04,07I,PM,10132018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,Grass,true,false,false,true,false,,false,false,false,true,false,false,false,false,,POINT (-73.9701408623121 40.7695511718541) +-73.9699513151755,40.7722062991044,10G-PM-1017-05,10G,PM,10172018,5,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9699513151755 40.7722062991044) +-73.9770628333002,40.7728567364852,7B-AM-1008-06,07B,AM,10082018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9770628333002 40.7728567364852) +-73.9736800575584,40.7783069735758,14A-PM-1014-04,14A,PM,10142018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,chasing (#3),false,false,false,false,true,false,true,false,,POINT (-73.9736800575584 40.7783069735758) +-73.9564632239432,40.7904807427954,33G-AM-1013-01,33G,AM,10132018,1,Adult,Cinnamon,,Cinnamon+,,Above Ground,13,shelter in hole in tree,false,false,true,false,false,,false,false,false,false,false,false,true,true,,POINT (-73.9564632239432 40.7904807427954) +-73.9653135277149,40.7817434070169,21E-PM-1012-01,21E,PM,10122018,1,Adult,Gray,,Gray+,,Above Ground,20,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9653135277149 40.7817434070169) +-73.9708860879459,40.7768376656119,14D-PM-1019-15,14D,PM,10192018,15,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9708860879459 40.7768376656119) +-73.9530535624781,40.7929809144271,37I-AM-1010-02,37I,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9530535624781 40.7929809144271) +-73.9734654671008,40.7715988711659,8E-PM-1008-06,08E,PM,10082018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,"5, 6, 7 all at same tree trunk base",false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9734654671008 40.7715988711659) +-73.9619673317128,40.7924176673037,33B-PM-1010-08,33B,PM,10102018,8,Juvenile,Gray,,Gray+,,Above Ground,,running up tree,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9619673317128 40.7924176673037) +-73.9669782832746,40.7841166727168,22C-PM-1006-13,22C,PM,10062018,13,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9669782832746 40.7841166727168) +-73.9795585338537,40.768895893226,3B-PM-1007-08,03B,PM,10072018,8,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9795585338537 40.768895893226) +-73.9790263372004,40.7683513714892,2C-PM-1013-07,02C,PM,10132018,7,Adult,Gray,White,Gray+White,,,,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9790263372004 40.7683513714892) +-73.969347812694,40.7744098063421,12G-PM-1007-02,12G,PM,10072018,2,,Gray,,Gray+,,Above Ground,,in tree,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.969347812694 40.7744098063421) +-73.9762494239719,40.7750175306716,10A-AM-1006-01,10A,AM,10062018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,near Strawberry Fields,false,false,false,true,false,eating (a peanut),false,false,false,false,false,true,false,false,,POINT (-73.9762494239719 40.7750175306716) +-73.9763373510536,40.7741168933928,9B-PM-1013-09,09B,PM,10132018,9,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,runs from (people),POINT (-73.9763373510536 40.7741168933928) +-73.9498421746221,40.7969397424182,42I-PM-1014-02,42I,PM,10142018,2,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,8,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9498421746221 40.7969397424182) +-73.9695881075086,40.7842441291991,21A-AM-1019-01,21A,AM,10192018,1,Juvenile,Gray,Black,Gray+Black,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,false,false,false,false,"keeps to tree,drops down on side away from people",POINT (-73.9695881075086 40.7842441291991) +-73.9766342125035,40.7715437147052,6C-AM-1007-08,06C,AM,10072018,8,Adult,,,+,,Above Ground,35,,false,false,true,false,false,dropping acorns,false,false,false,false,false,false,false,false,,POINT (-73.9766342125035 40.7715437147052) +-73.969570012716,40.7816501516863,19B-PM-1018-04,19B,PM,10182018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. Gray & White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.969570012716 40.7816501516863) +-73.9557399927792,40.7971563708988,40D-PM-1013-07,40D,PM,10132018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9557399927792 40.7971563708988) +-73.9768254058709,40.7716757945251,6C-PM-1020-03,06C,PM,10202018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9768254058709 40.7716757945251) +-73.9736016229655,40.7723781376714,8D-AM-1007-03,08D,AM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,ran up tree when approached,POINT (-73.9736016229655 40.77237813767141) +-73.9690498876944,40.7700011818847,8I-AM-1006-07,08I,AM,10062018,7,Adult,Gray,White,Gray+White,White ring on short tail,Above Ground,20,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9690498876944 40.7700011818847) +-73.9800499498034,40.7702181099573,4A-PM-1007-05,04A,PM,10072018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,At rock,false,false,false,false,true,,false,false,false,true,true,false,true,false,,POINT (-73.9800499498034 40.770218109957305) +-73.974519308015,40.7691228794395,5E-AM-1008-02,05E,AM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,trellis,true,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.974519308015 40.7691228794395) +-73.9561600237284,40.7953143196705,38E-AM-1010-10,38E,AM,10102018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,over a log across stream,false,false,false,false,false,chillin',false,false,false,false,false,false,false,true,runs from leaf blower,POINT (-73.9561600237284 40.7953143196705) +-73.9696720362627,40.7791851598197,17D-AM-1008-04,17D,AM,10082018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9696720362627 40.7791851598197) +-73.9729142912203,40.7724091146678,9E-AM-1008-03,09E,AM,10082018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9729142912203 40.7724091146678) +-73.9583944353352,40.7979689846815,39B-PM-1014-04,39B,PM,10142018,4,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,true,runs from (me—when i approached),POINT (-73.9583944353352 40.7979689846815) +-73.9649465476871,40.7822708362663,22F-PM-1014-07,22F,PM,10142018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9649465476871 40.7822708362663) +-73.9645989003589,40.7782157459155,18H-PM-1014-01,18H,PM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9645989003589 40.7782157459155) +-73.9746934810667,40.7659431884158,2G-PM-1007-02,02G,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,burying nut,false,false,false,false,true,false,true,false,,POINT (-73.9746934810667 40.7659431884158) +-73.9691821206863,40.7763203164339,14F-PM-1012-03,14F,PM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9691821206863 40.7763203164339) +-73.9682688752331,40.7711934835539,9I-PM-1010-06,09I,PM,10102018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9682688752331 40.7711934835539) +-73.9611399573659,40.781130706026,22I-AM-1007-01,22I,AM,10072018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9611399573659 40.781130706026005) +-73.9640989602986,40.7899295439265,29B-PM-1010-03,29B,PM,10102018,3,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9640989602986 40.7899295439265) +-73.9746940851342,40.7760966488186,11B-PM-1014-02,11B,PM,10142018,2,Juvenile,Gray,,Gray+,,Above Ground,10,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9746940851342 40.7760966488186) +-73.9589698681439,40.7906520520417,32E-PM-1017-06,32E,PM,10172018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,treed area,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9589698681439 40.7906520520417) +-73.9777497645834,40.7677344709178,2D-AM-1007-04,02D,AM,10072018,4,Adult,Gray,,Gray+,,Above Ground,100,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9777497645834 40.7677344709178) +-73.9566686940197,40.794924397955,37E-PM-1006-05,37E,PM,10062018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9566686940197 40.794924397955) +-73.9594332600733,40.7960622445291,37B-PM-1013-02,37B,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9594332600733 40.7960622445291) +-73.9568726508546,40.7878795081255,30I-PM-1006-03,30I,PM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,up tree,POINT (-73.9568726508546 40.7878795081255) +-73.9545399102352,40.7898646267709,33I-PM-1006-06,33I,PM,10062018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9545399102352 40.7898646267709) +-73.9638167248251,40.7776485679354,18I-PM-1007-03,18I,PM,10072018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,25,,false,false,true,false,false,,false,false,false,false,false,false,false,false,stared at me,POINT (-73.9638167248251 40.77764856793541) +-73.9638141923763,40.7829225326288,23F-PM-1013-03,23F,PM,10132018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,"indifferent (noticed me,busy eating,foraging)",POINT (-73.9638141923763 40.7829225326288) +-73.9759258407288,40.7667622711142,2F-PM-1014-05,02F,PM,10142018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9759258407288 40.7667622711142) +-73.9790889008147,40.7676402781925,1C-PM-1013-01,01C,PM,10132018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9790889008147 40.7676402781925) +-73.9637824756607,40.7904737110761,30B-AM-1007-08,30B,AM,10072018,8,Adult,Gray,,Gray+,,Above Ground,40,,true,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9637824756607 40.7904737110761) +-73.9678822983274,40.7802960985637,18E-PM-1006-01,18E,PM,10062018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9678822983274 40.7802960985637) +-73.9593373093799,40.7982428507976,39A-PM-1014-03,39A,PM,10142018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Higlights. Made executive adjustments.,Above Ground,6,Jumped from ground onto branch,false,false,false,false,true,digging?,false,false,false,false,true,false,true,false,,POINT (-73.95933730937992 40.7982428507976) +-73.9754790964561,40.768336388516,4E-PM-1008-07,04E,PM,10082018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9754790964561 40.768336388516) +-73.9677593344667,40.7763054313195,15G-PM-1019-07,15G,PM,10192018,7,Adult,,,+,,Above Ground,5,,false,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9677593344667 40.7763054313195) +-73.9547031549299,40.7978867539322,41E-PM-1013-01,41E,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9547031549299 40.7978867539322) +-73.96052295327,40.7934359372871,34C-PM-1012-04,34C,PM,10122018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.96052295327 40.7934359372871) +-73.9703705008688,40.7818586173755,19B-PM-1018-02,19B,PM,10182018,2,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",Gray & Cinnamon selected as Primary. Black selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9703705008688 40.7818586173755) +-73.973268329435,40.7708296517073,7E-AM-1006-05,07E,AM,10062018,5,Adult,Gray,,Gray+,,Above Ground,25,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.973268329435 40.7708296517073) +-73.9593781427412,40.7841519912635,26I-AM-1010-02,26I,AM,10102018,2,Adult,Gray,,Gray+,,Above Ground,40,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.95937814274122 40.7841519912635) +-73.9730196342874,40.766022437401,3H-PM-1014-06,03H,PM,10142018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9730196342874 40.766022437401) +-73.9604083891356,40.7910284106931,32D-AM-1013-05,32D,AM,10132018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9604083891356 40.7910284106931) +-73.9694591667705,40.7766518221998,14E-AM-1008-12,14E,AM,10082018,12,Adult,Gray,,Gray+,,Above Ground,2,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694591667705 40.7766518221998) +-73.9568610943394,40.7935959584643,36E-PM-1012-02,36E,PM,10122018,2,Adult,Gray,,Gray+,,Above Ground,28,on tree branch,false,false,true,false,true,picking acorns off oak tree,false,false,false,false,false,false,true,false,,POINT (-73.95686109433942 40.7935959584643) +-73.9631392113757,40.7914635635784,31B-PM-1007-02,31B,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,true,true,false,false,chasing #1 and climbing tree w/ #1,false,false,false,false,false,false,false,true,,POINT (-73.9631392113757 40.7914635635784) +-73.9706968708903,40.7821499135828,19A-PM-1013-06,19A,PM,10132018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9706968708903 40.7821499135828) +-73.965675791028,40.7887310058451,27B-PM-1006-02,27B,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,By large tree chasing #1,false,true,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.965675791028 40.7887310058451) +-73.9701634768603,40.7778691433218,15D-AM-1007-03,15D,AM,10072018,3,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9701634768603 40.7778691433218) +-73.9752699507508,40.7688069184057,4E-PM-1008-02,04E,PM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9752699507508 40.76880691840571) +-73.956998502609,40.7948117428147,37E-PM-1006-01,37E,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.956998502609 40.7948117428147) +-73.9624052832372,40.7809656348254,21H-PM-1018-04,21H,PM,10182018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,false,false,,POINT (-73.9624052832372 40.7809656348254) +-73.9765417282001,40.7740994735325,9A-AM-1013-05,09A,AM,10132018,5,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9765417282001 40.7740994735325) +-73.965215665278,40.7761309082202,15I-PM-1012-02,15I,PM,10122018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.965215665278 40.7761309082202) +-73.9604524271167,40.7956624328733,36B-AM-1013-01,36B,AM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9604524271167 40.7956624328733) +-73.9618486459307,40.7946365810826,35A-AM-1014-02,35A,AM,10142018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9618486459307 40.7946365810826) +-73.9771696835698,40.7697011100487,4C-AM-1006-04,04C,AM,10062018,4,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9771696835698 40.7697011100487) +-73.9545438656122,40.7902168635009,34I-AM-1012-04,34I,AM,10122018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9545438656122 40.7902168635009) +-73.975836799137,40.7691593428471,4E-PM-1008-05,04E,PM,10082018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.975836799137 40.769159342847104) +-73.9801899519657,40.7695777009264,3A-PM-1017-02,03A,PM,10172018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9801899519657 40.7695777009264) +-73.97977158132,40.7706273151066,4A-AM-1007-01,04A,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.97977158132 40.7706273151066) +-73.9763542780331,40.7736531303622,9B-AM-1010-02,09B,AM,10102018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,in bush,false,false,true,false,true,,false,false,false,false,true,false,false,true,froze,POINT (-73.9763542780331 40.773653130362206) +-73.9745709109056,40.7672225695415,3G-AM-1008-03,03G,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,40,,true,false,true,false,false,in tree,false,false,false,false,false,false,true,false,,POINT (-73.9745709109056 40.7672225695415) +-73.9797425262459,40.7679120246352,1B-AM-1012-02,01B,AM,10122018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9797425262459 40.7679120246352) +-73.9714952092767,40.7748063281815,12E-AM-1017-02,12E,AM,10172018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714952092767 40.7748063281815) +-73.9682676237703,40.7772653590224,15F-PM-1010-04,15F,PM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,on path,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9682676237703 40.7772653590224) +-73.955429970986,40.7978168629875,40D-AM-1013-02,40D,AM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.955429970986 40.7978168629875) +-73.9725844658514,40.7701092834201,7F-PM-1012-02,07F,PM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,observes,POINT (-73.9725844658514 40.7701092834201) +-73.9587330707463,40.7907682009641,32F-AM-1012-02,32F,AM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray patches on back legs,Ground Plane,FALSE,,false,false,false,false,false,curious about me,false,false,false,false,false,true,false,true,,POINT (-73.9587330707463 40.7907682009641) +-73.9802564685265,40.7681759098199,2B-AM-1010-05,02B,AM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9802564685265 40.7681759098199) +-73.9747959143543,40.7768078174366,12A-AM-1008-01,12A,AM,10082018,1,Adult,Gray,,Gray+,,Above Ground,1,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9747959143543 40.7768078174366) +-73.9795492724533,40.7709497471738,4A-AM-1007-02,04A,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9795492724533 40.7709497471738) +-73.9657480066074,40.7753465489231,14I-PM-1018-04,14I,PM,10182018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,true,false,false,,POINT (-73.9657480066074 40.7753465489231) +-73.9686479277215,40.7705815354769,9I-AM-1014-08,09I,AM,10142018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9686479277215 40.7705815354769) +-73.9692472299565,40.7722592187215,10H-PM-1007-01,10H,PM,10072018,1,Adult,Gray,White,Gray+White,dark gray,Above Ground,15,in tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9692472299565 40.7722592187215) +-73.9787846880249,40.7682545903488,2C-PM-1013-05,02C,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9787846880249 40.7682545903488) +-73.9765046109019,40.7736674124746,8B-AM-1007-04,08B,AM,10072018,4,Adult,Gray,,Gray+,,Above Ground,2,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9765046109019 40.7736674124746) +-73.9796142848349,40.7702117898305,4A-PM-1007-04,04A,PM,10072018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9796142848349 40.7702117898305) +-73.9692846326638,40.7841049008492,22A-PM-1017-02,22A,PM,10172018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9692846326638 40.7841049008492) +-73.9767141407274,40.7737313251559,8A-PM-1014-02,08A,PM,10142018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,false,true,runs from (goes up a tree),POINT (-73.9767141407274 40.7737313251559) +-73.9756345867747,40.7675540517649,3E-PM-1008-09,03E,PM,10082018,9,Adult,Gray,,Gray+,,Above Ground,5,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9756345867747 40.7675540517649) +-73.9524132295658,40.7933777553406,37I-AM-1010-05,37I,AM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.95241322956582 40.7933777553406) +-73.9563652303243,40.7955127873968,38E-PM-1014-05,38E,PM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,on log,false,false,false,false,false,statue,false,false,false,false,false,false,true,false,,POINT (-73.9563652303243 40.7955127873968) +-73.9743873549635,40.7745426051392,10C-AM-1018-04,10C,AM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9743873549635 40.7745426051392) +-73.9640741640547,40.7807274581426,20G-AM-1018-01,20G,AM,10182018,1,Juvenile,Gray,,Gray+,,Above Ground,7,Tree limb,false,false,false,false,false,sitting still on limb,false,false,false,false,false,false,true,false,,POINT (-73.9640741640547 40.7807274581426) +-73.967975586222,40.7735683044313,12H-PM-1007-07,12H,PM,10072018,7,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,grass field,false,false,false,false,true,,false,false,false,false,false,false,false,true,humans,POINT (-73.967975586222 40.7735683044313) +-73.9639700434449,40.7775003050028,17I-AM-1014-01,17I,AM,10142018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,Running across fence between statue & swings,true,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9639700434449 40.7775003050028) +-73.9577758125518,40.799384716477,41B-AM-1010-10,41B,AM,10102018,10,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9577758125518 40.799384716477) +-73.9736995552241,40.7722712518637,8E-PM-1008-02,08E,PM,10082018,2,Adult,Black,Cinnamon,Black+Cinnamon,,Above Ground,10,in tree,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9736995552241 40.7722712518637) +-73.9701023478746,40.7803527061859,17C-PM-1013-04,17C,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9701023478746 40.7803527061859) +-73.9635412640983,40.7902529354639,30B-AM-1007-11,30B,AM,10072018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9635412640983 40.7902529354639) +-73.9584661589182,40.7912068380845,33F-PM-1012-01,33F,PM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9584661589182 40.7912068380845) +-73.9688438058715,40.7703014325728,8I-AM-1006-05,08I,AM,10062018,5,Adult,Gray,White,Gray+White,,Above Ground,20,tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9688438058715 40.7703014325728) +-73.9603471161869,40.7906003311747,32E-PM-1017-15,32E,PM,10172018,15,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9603471161869 40.7906003311747) +-73.9665763797607,40.7761316400012,15H-AM-1013-03,15H,AM,10132018,3,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9665763797607 40.7761316400012) +-73.955710327539,40.7974510797567,40D-AM-1013-03,40D,AM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.955710327539 40.7974510797567) +-73.9756825338299,40.7755542506699,11A-PM-1013-02,11A,PM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9756825338299 40.7755542506699) +-73.9684806250183,40.7858776210151,24A-PM-1007-03,24A,PM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9684806250183 40.7858776210151) +-73.9594045885402,40.7840886870652,26I-AM-1010-01,26I,AM,10102018,1,Adult,Gray,,Gray+,,Above Ground,40,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9594045885402 40.7840886870652) +-73.9561091686663,40.7981463047425,41D-AM-1014-04,41D,AM,10142018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9561091686663 40.7981463047425) +-73.9733437449715,40.7782401548362,14B-PM-1014-07,14B,PM,10142018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9733437449715 40.7782401548362) +-73.9652134469963,40.7803438278765,19F-PM-1017-05,19F,PM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9652134469963 40.7803438278765) +-73.9714798196777,40.7695231949631,6H-PM-1020-02,06H,PM,10202018,2,Adult,,,+,,Above Ground,,Fence pole,false,false,true,false,false,,false,false,false,false,false,false,false,true,runs from (me),POINT (-73.9714798196777 40.7695231949631) +-73.9755041276839,40.7678213857557,3F-AM-1006-13,03F,AM,10062018,13,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9755041276839 40.7678213857557) +-73.9601561064548,40.7900513933531,31E-PM-1006-08,31E,PM,10062018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9601561064548 40.7900513933531) +-73.9581241870185,40.7961057536141,38C-AM-1019-05,38C,AM,10192018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9581241870185 40.7961057536141) +-73.9576219570858,40.7963351225672,38C-AM-1019-03,38C,AM,10192018,3,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9576219570858 40.7963351225672) +-73.9597072533787,40.7905581853786,32E-AM-1007-12,32E,AM,10072018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9597072533787 40.79055818537861) +-73.9575307970434,40.7983176419483,40B-PM-1014-08,40B,PM,10142018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9575307970434 40.7983176419483) +-73.9769106838192,40.7674414870702,2E-AM-1010-05,02E,AM,10102018,5,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,33,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9769106838192 40.7674414870702) +-73.9768286349595,40.7687012827059,3D-PM-1010-05,03D,PM,10102018,5,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9768286349595 40.7687012827059) +-73.9534878316472,40.7978951981698,41F-PM-1019-01,41F,PM,10192018,1,,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9534878316472 40.7978951981698) +-73.9689041600147,40.7781788966185,16E-AM-1014-07,16E,AM,10142018,7,Adult,Gray,,Gray+,,Above Ground,,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (dog),POINT (-73.9689041600147 40.7781788966185) +-73.972757765574,40.7654285510067,2I-AM-1006-01,02I,AM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.972757765574 40.7654285510067) +-73.958719099962,40.7947587726617,36C-AM-1014-04,36C,AM,10142018,4,,Gray,White,Gray+White,,Above Ground,15,Ground then tree to eat,true,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.958719099962 40.7947587726617) +-73.9773696455031,40.7687241866704,3D-PM-1010-14,03D,PM,10102018,14,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,false,false,false,crying out,true,true,false,false,false,false,false,false,,POINT (-73.9773696455031 40.7687241866704) +-73.9721086069437,40.7698172190404,6G-AM-1008-06,06G,AM,10082018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",white at end of tail,Ground Plane,FALSE,grass,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9721086069437 40.7698172190404) +-73.9728170980779,40.7703557830437,7F-AM-1008-06,07F,AM,10082018,6,Adult,Gray,,Gray+,,Above Ground,28,in hole in tree,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9728170980779 40.770355783043705) +-73.9750688083336,40.7665584681025,2F-PM-1014-07,02F,PM,10142018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9750688083336 40.7665584681025) +-73.9690540696008,40.7766014124609,14F-PM-1012-08,14F,PM,10122018,8,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,true,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9690540696008 40.7766014124609) +-73.9611126813593,40.7943113021522,35B-AM-1010-03,35B,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9611126813593 40.7943113021522) +-73.9668909481942,40.7841298584027,22C-PM-1006-12,22C,PM,10062018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,true,false,false,false,false,false,false,false,human friendly,POINT (-73.9668909481942 40.7841298584027) +-73.951965247933,40.7938167628067,38I-PM-1014-03,38I,PM,10142018,3,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,true,,POINT (-73.951965247933 40.7938167628067) +-73.9562350820255,40.7913464147989,34G-PM-1006-02,34G,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,true,true,eating bread it found on ground,false,false,false,false,false,false,false,true,,POINT (-73.9562350820255 40.7913464147989) +-73.9711751356843,40.7752422758202,12E-AM-1017-06,12E,AM,10172018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9711751356843 40.7752422758202) +-73.9685598106128,40.7807054868066,19D-PM-1008-02,19D,PM,10082018,2,,,,+,"unknown - cannot see, only hear",Above Ground,,,false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9685598106128 40.7807054868066) +-73.9695560376915,40.7708835103516,9H-AM-1006-03,09H,AM,10062018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.96955603769152 40.7708835103516) +-73.9640945609381,40.7910513041359,30A-PM-1020-04,30A,PM,10202018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Cinnamon back. Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,Rock,true,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9640945609381 40.7910513041359) +-73.96005650463,40.7934048502983,34C-PM-1012-02,34C,PM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.96005650463 40.7934048502983) +-73.9549133872427,40.7946871036949,38F-PM-1013-02,38F,PM,10132018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9549133872427 40.7946871036949) +-73.9730001080547,40.7678719218983,4G-AM-1006-05,04G,AM,10062018,5,Juvenile,Gray,White,Gray+White,,Above Ground,20,,false,false,true,false,false,climbing (tree),false,false,false,false,false,false,true,false,indifferent—was in front of my face (we were on a bridge)!,POINT (-73.9730001080547 40.7678719218983) +-73.9748318777506,40.7771821378056,13A-AM-1017-05,13A,AM,10172018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9748318777506 40.7771821378056) +-73.9550627447399,40.7910104700332,34H-PM-1006-02,34H,PM,10062018,2,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9550627447399 40.7910104700332) +-73.9709407456459,40.776423522087,14D-AM-1014-13,14D,AM,10142018,13,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9709407456459 40.776423522087) +-73.9720365327715,40.7762329714016,13D-PM-1018-11,13D,PM,10182018,11,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,true,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9720365327715 40.7762329714016) +-73.9685567075413,40.7703797723105,8I-AM-1006-10,08I,AM,10062018,10,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,3,bush,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.96855670754131 40.7703797723105) +-73.9596271142953,40.7906612313673,32E-PM-1017-12,32E,PM,10172018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,true,false,false,false,false,false,false,,POINT (-73.9596271142953 40.7906612313673) +-73.9730592548116,40.7740879251541,10D-AM-1008-04,10D,AM,10082018,4,Juvenile,Gray,,Gray+,,Above Ground,25,,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9730592548116 40.7740879251541) +-73.9710907175834,40.77637391082,13D-AM-1014-07,13D,AM,10142018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9710907175834 40.77637391082) +-73.9705704527481,40.7762853012151,13E-AM-1017-06,13E,AM,10172018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9705704527481 40.7762853012151) +-73.9771575249322,40.7673873716547,2E-AM-1010-07,02E,AM,10102018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9771575249322 40.7673873716547) +-73.9757912350482,40.7747598621451,10B-AM-1006-04,10B,AM,10062018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9757912350482 40.7747598621451) +-73.968004352343,40.7726669278308,11I-PM-1012-01,11I,PM,10122018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,true,true,false,false,false,look at humans determining,POINT (-73.968004352343 40.7726669278308) +-73.9765355395622,40.7735653237366,8B-AM-1007-03,08B,AM,10072018,3,Adult,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97653553956222 40.7735653237366) +-73.9697178096275,40.7697036696301,7I-PM-1013-07,07I,PM,10132018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,Under the tree,false,true,false,false,false,"playing,interacting with #6",false,false,false,false,true,false,false,false,,POINT (-73.9697178096275 40.769703669630104) +-73.9558180952889,40.7886810505944,31I-PM-1019-03,31I,PM,10192018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9558180952889 40.7886810505944) +-73.978844141973,40.7696046074378,4B-AM-1010-05,04B,AM,10102018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,10,,false,true,false,false,false,chasing squirrel #6,true,true,false,false,true,false,false,false,,POINT (-73.978844141973 40.7696046074378) +-73.970962498391,40.7766899040856,14D-AM-1014-05,14D,AM,10142018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.970962498391 40.7766899040856) +-73.9587072373474,40.7985209579925,40B-AM-1019-01,40B,AM,10192018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9587072373474 40.7985209579925) +-73.9736418085696,40.7716931127716,8E-PM-1008-04,08E,PM,10082018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,in grass by a grove of tall maples,false,false,false,true,true,,false,false,false,false,false,false,true,false,there's a family playing soccer,POINT (-73.9736418085696 40.7716931127716) +-73.9588076804698,40.7912942607296,33E-AM-1014-06,33E,AM,10142018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9588076804698 40.7912942607296) +-73.980777106431,40.7681635726316,1A-AM-1007-02,01A,AM,10072018,2,Adult,Gray,White,Gray+White,,Above Ground,11,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.980777106431 40.7681635726316) +-73.9590328527128,40.7912214417577,33E-PM-1012-06,33E,PM,10122018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,playing,false,false,false,false,false,false,false,false,,POINT (-73.9590328527128 40.7912214417577) +-73.9657504643585,40.7831210813592,22D-PM-1012-02,22D,PM,10122018,2,Adult,Gray,"Black, White","Gray+Black, White",No Primary Fur Color selected. Made executive adjustment based on other squirrels.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9657504643585 40.7831210813592) +-73.9581366214863,40.7988964092722,40B-PM-1014-02,40B,PM,10142018,2,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,,true,true,false,false,false,false,false,true,,POINT (-73.9581366214863 40.7988964092722) +-73.9698870647042,40.7826510985538,20B-AM-1007-02,20B,AM,10072018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,true,true,false,false,,POINT (-73.9698870647042 40.7826510985538) +-73.9690168673844,40.7777612043914,15E-AM-1013-04,15E,AM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9690168673844 40.7777612043914) +-73.9579506263361,40.7936973555953,35E-AM-1020-01,35E,AM,10202018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9579506263361 40.7936973555953) +-73.9788088165392,40.7690153025878,3B-AM-1010-04,03B,AM,10102018,4,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9788088165392 40.7690153025878) +-73.9590074024938,40.7907059424675,32E-PM-1017-05,32E,PM,10172018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,treed area,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9590074024938 40.7907059424675) +-73.9706988226435,40.7696684566926,7H-AM-1006-16,07H,AM,10062018,16,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9706988226435 40.7696684566926) +-73.9722359401242,40.7702891474555,7G-AM-1010-07,07G,AM,10102018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9722359401242 40.7702891474555) +-73.9603268255317,40.7900154505092,31E-PM-1006-06,31E,PM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9603268255317 40.7900154505092) +-73.9710187505339,40.7797265666746,17B-AM-1010-02,17B,AM,10102018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9710187505339 40.7797265666746) +-73.9703076450783,40.770158422629,8H-PM-1014-07,08H,PM,10142018,7,Adult,Gray,,Gray+,,Above Ground,5,,false,true,false,false,false,"chasing (#8),playing?",false,false,false,false,false,false,true,false,,POINT (-73.9703076450783 40.770158422629) +-73.956863563379,40.7986418851147,41C-AM-1017-01,41C,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.95686356337902 40.7986418851147) +-73.9711378905748,40.7696218346333,7H-AM-1006-03,07H,AM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,on rock (large),false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9711378905748 40.769621834633305) +-73.9546337446865,40.7898772579576,33I-PM-1006-08,33I,PM,10062018,8,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9546337446865 40.7898772579576) +-73.9676314068477,40.7788030406918,17E-AM-1017-08,17E,AM,10172018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9676314068477 40.7788030406918) +-73.9775099290913,40.7697609063137,4C-PM-1010-14,04C,PM,10102018,14,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,true,false,false,false,chasing #15,false,false,false,false,false,false,false,false,,POINT (-73.9775099290913 40.7697609063137) +-73.9612854506075,40.7920830673571,32C-PM-1013-04,32C,PM,10132018,4,Juvenile,Gray,,Gray+,,Above Ground,,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9612854506075 40.7920830673571) +-73.9617250054003,40.7925390432044,33B-PM-1010-03,33B,PM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9617250054003 40.7925390432044) +-73.9624209799704,40.7910200972752,31C-PM-1010-01,31C,PM,10102018,1,Adult,Gray,White,Gray+White,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9624209799704 40.7910200972752) +-73.9707542189896,40.7717032986885,9G-PM-1007-04,09G,PM,10072018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9707542189896 40.77170329868851) +-73.9779760874355,40.7698230936583,4C-PM-1010-16,04C,PM,10102018,16,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9779760874355 40.7698230936583) +-73.9682965197661,40.7805378963883,18D-AM-1018-04,18D,AM,10182018,4,Adult,Gray,,Gray+,,Above Ground,2,,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9682965197661 40.7805378963883) +-73.9746965894947,40.7664351724309,2G-AM-1010-03,02G,AM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9746965894947 40.7664351724309) +-73.9518008149564,40.7953738093588,40H-AM-1017-01,40H,AM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,base of tree,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9518008149564 40.7953738093588) +-73.9746877519291,40.7761402808083,11B-PM-1014-03,11B,PM,10142018,3,,Gray,,Gray+,,Above Ground,10,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9746877519291 40.7761402808083) +-73.9693159934697,40.7831212338295,21B-PM-1017-03,21B,PM,10172018,3,Juvenile,Cinnamon,White,Cinnamon+White,,Above Ground,1,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9693159934697 40.7831212338295) +-73.962516494651,40.7884768989902,28D-PM-1019-02,28D,PM,10192018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.962516494651 40.7884768989902) +-73.9739038832156,40.7730354890554,9D-AM-1008-03,09D,AM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9739038832156 40.7730354890554) +-73.9562068537632,40.7967332853238,39D-AM-1008-01,39D,AM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9562068537632 40.7967332853238) +-73.9751056714758,40.7732060035215,8C-PM-1013-03,08C,PM,10132018,3,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.9751056714758 40.7732060035215) +-73.9710288101006,40.7715777109992,9G-PM-1007-01,09G,PM,10072018,1,Adult,Gray,,Gray+,,Above Ground,2,,false,false,true,false,false,climbing (down tree),false,false,false,false,false,false,false,false,,POINT (-73.9710288101006 40.7715777109992) +-73.9686622009739,40.7767294380502,15F-PM-1010-02,15F,PM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9686622009739 40.7767294380502) +-73.9655925527354,40.7760049171097,15H-PM-1008-05,15H,PM,10082018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,lawn,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9655925527354 40.7760049171097) +-73.9733222531339,40.7649975371546,1I-PM-1012-01,01I,PM,10122018,1,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White","Gray, Black, & Cinnamon selected as Primary. Gray, Cinnamon, & White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9733222531339 40.7649975371546) +-73.9806377967573,40.7681097168268,1B-AM-1012-15,01B,AM,10122018,15,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9806377967573 40.7681097168268) +-73.9532804650089,40.7934579333341,37H-PM-1006-05,37H,PM,10062018,5,,,,+,,Above Ground,,tree,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9532804650089 40.7934579333341) +-73.9685940262068,40.776932102013,15F-AM-1007-07,15F,AM,10072018,7,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9685940262068 40.776932102013) +-73.9682062012675,40.786498436192,24A-AM-1014-02,24A,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,Blonde? in Highlights,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9682062012675 40.786498436192) +-73.9626560807032,40.7884633049896,28D-AM-1012-05,28D,AM,10122018,5,Juvenile,Black,,Black+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9626560807032 40.7884633049896) +-73.9653311136561,40.780193490343,19F-PM-1017-07,19F,PM,10172018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9653311136561 40.78019349034301) +-73.9782283921819,40.7667932602077,1D-PM-1007-02,01D,PM,10072018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9782283921819 40.7667932602077) +-73.9604094481336,40.7951451478793,36B-PM-1013-01,36B,PM,10132018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9604094481336 40.7951451478793) +-73.9788436368415,40.7691104998969,3B-AM-1010-05,03B,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9788436368415 40.7691104998969) +-73.975809362521,40.7734702737835,8B-PM-1012-09,08B,PM,10122018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,tree,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.975809362521 40.7734702737835) +-73.9623621412501,40.7814673556041,22H-PM-1007-03,22H,PM,10072018,3,Adult,Gray,White,Gray+White,,Above Ground,4,chased squirrel #2 away,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9623621412501 40.7814673556041) +-73.9792161469158,40.7679285436253,2C-PM-1013-10,02C,PM,10132018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9792161469158 40.7679285436253) +-73.9721210372896,40.7667971476099,4I-AM-1006-02,04I,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9721210372896 40.7667971476099) +-73.9618076359384,40.7947808718203,35A-PM-1013-05,35A,PM,10132018,5,Adult,Gray,,Gray+,,Above Ground,3,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9618076359384 40.7947808718203) +-73.9791826197108,40.768577844752,2B-AM-1010-08,02B,AM,10102018,8,Juvenile,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9791826197108 40.768577844752) +-73.9782940231149,40.7694236097224,4B-PM-1018-05,04B,PM,10182018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9782940231149 40.7694236097224) +-73.9728797531377,40.7786733148687,15B-PM-1017-01,15B,PM,10172018,1,,Gray,,Gray+,,Above Ground,20,in tree,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9728797531377 40.7786733148687) +-73.9742010726136,40.769150169929,5F-AM-1007-03,05F,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9742010726136 40.769150169929006) +-73.9681146830162,40.7736772279412,12H-PM-1007-06,12H,PM,10072018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9681146830162 40.7736772279412) +-73.9767100101318,40.7675779951996,2E-PM-1014-03,02E,PM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9767100101318 40.7675779951996) +-73.9755562526811,40.7678821029525,3E-AM-1006-07,03E,AM,10062018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,burying nuts,false,false,false,false,false,false,false,false,,POINT (-73.9755562526811 40.7678821029525) +-73.9764851231754,40.7715736862861,6C-AM-1007-07,06C,AM,10072018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,ambling,false,false,false,false,false,true,false,true,trucks,POINT (-73.9764851231754 40.7715736862861) +-73.9682830510954,40.7810151087286,19D-PM-1008-03,19D,PM,10082018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",may be same squirrel as #1 - male,Above Ground,5,on branch of dead tree,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9682830510954 40.7810151087286) +-73.9694344956258,40.7742869276902,12G-PM-1007-01,12G,PM,10072018,1,,Gray,,Gray+,,Above Ground,40,in tree,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9694344956258 40.7742869276902) +-73.9558118887106,40.796885713436,39E-PM-1013-01,39E,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon head,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9558118887106 40.796885713436005) +-73.9636027664439,40.790075966587,30B-PM-1019-01,30B,PM,10192018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,false,true,,POINT (-73.9636027664439 40.790075966587) +-73.9745204169071,40.7736282868469,9C-AM-1006-01,09C,AM,10062018,1,Adult,Gray,,Gray+,,Above Ground,40,Tree,true,false,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9745204169071 40.7736282868469) +-73.9712265022781,40.7783790991192,15C-PM-1017-04,15C,PM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9712265022781 40.7783790991192) +-73.9718248273522,40.7801998970029,17A-PM-1013-01,17A,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,crossing path,false,false,false,false,false,false,true,false,,POINT (-73.9718248273522 40.78019989700291) +-73.9542118614769,40.7939171395463,37G-AM-1014-06,37G,AM,10142018,6,Adult,Gray,White,Gray+White,White tail,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.95421186147692 40.7939171395463) +-73.9748367344424,40.7693513000034,5E-PM-1012-06,05E,PM,10122018,6,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,10,oak tree at end of ramp from Chess House,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9748367344424 40.7693513000034) +-73.9613998967903,40.7912437235667,32C-PM-1013-02,32C,PM,10132018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9613998967903 40.7912437235667) +-73.955754300682,40.79568139974,38E-PM-1014-02,38E,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.955754300682 40.79568139974) +-73.9657327332849,40.7747554568985,14I-PM-1018-03,14I,PM,10182018,3,Juvenile,Gray,Black,Gray+Black,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9657327332849 40.7747554568985) +-73.9527430510248,40.7924807950552,36I-PM-1007-12,36I,PM,10072018,12,Juvenile,Gray,Cinnamon,Gray+Cinnamon,Tiny! So tiny!,Above Ground,2,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9527430510248 40.7924807950552) +-73.973598991549,40.7783020016983,14A-PM-1014-03,14A,PM,10142018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,chasing (#4),false,false,false,false,false,false,true,false,,POINT (-73.973598991549 40.7783020016983) +-73.9524490779105,40.7936003219524,38I-AM-1019-01,38I,AM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9524490779105 40.7936003219524) +-73.9761223919286,40.7685998275864,4E-PM-1008-06,04E,PM,10082018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9761223919286 40.7685998275864) +-73.9701926736281,40.7778587687376,15D-AM-1007-02,15D,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9701926736281 40.7778587687376) +-73.9562362816756,40.7950457218996,38E-AM-1010-08,38E,AM,10102018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9562362816756 40.7950457218996) +-73.9674984567017,40.7745938268705,13H-PM-1010-04,13H,PM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9674984567017 40.7745938268705) +-73.9541601469123,40.7907832744689,34I-PM-1010-04,34I,PM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,across the lawn and climb up a small tree,true,false,true,false,false,grooming,false,false,false,false,false,false,false,false,,POINT (-73.9541601469123 40.79078327446891) +-73.9568108465086,40.7971727026108,39D-AM-1008-05,39D,AM,10082018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.95681084650862 40.7971727026108) +-73.9733898487296,40.7666975131518,3H-PM-1014-02,03H,PM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9733898487296 40.7666975131518) +-73.9594174605642,40.7973128653773,38B-AM-1019-02,38B,AM,10192018,2,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9594174605642 40.7973128653773) +-73.956806913988,40.7987736900857,41C-AM-1017-06,41C,AM,10172018,6,Adult,Gray,,Gray+,,Above Ground,4,,false,false,true,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.956806913988 40.7987736900857) +-73.9586184232889,40.7993153832942,41A-PM-1007-02,41A,PM,10072018,2,Adult,Black,,Black+,,Above Ground,15,,false,false,true,false,false,jumping,false,false,false,false,false,false,false,false,stared at me,POINT (-73.9586184232889 40.7993153832942) +-73.9673919075839,40.7786845769177,17F-PM-1020-05,17F,PM,10202018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9673919075839 40.7786845769177) +-73.9679319758284,40.7821154802399,20C-PM-1018-07,20C,PM,10182018,7,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9679319758284 40.7821154802399) +-73.9787723082807,40.7713655754004,5A-PM-1010-03,05A,PM,10102018,3,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9787723082807 40.7713655754004) +-73.9749641575871,40.7673305056277,3F-AM-1006-05,03F,AM,10062018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,3,,false,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9749641575871 40.7673305056277) +-73.9745908987975,40.7655191512308,1G-AM-1006-03,01G,AM,10062018,3,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9745908987975 40.7655191512308) +-73.9708108312271,40.7773975776146,14D-PM-1019-09,14D,PM,10192018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9708108312271 40.7773975776146) +-73.9699780857298,40.7688706046944,6I-PM-1013-01,06I,PM,10132018,1,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9699780857298 40.7688706046944) +-73.954699659637,40.7951308856929,38F-AM-1018-02,38F,AM,10182018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.954699659637 40.7951308856929) +-73.973998077367,40.7739029133911,10C-PM-1013-01,10C,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.973998077367 40.7739029133911) +-73.97107389601,40.7723265810536,10F-PM-1019-07,10F,PM,10192018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,Same tree (as #6),false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97107389601 40.7723265810536) +-73.9721263050502,40.7698763846186,7G-PM-1018-01,07G,PM,10182018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9721263050502 40.7698763846186) +-73.9764314091366,40.7736458057952,8B-AM-1007-02,08B,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9764314091366 40.773645805795205) +-73.9529224802393,40.7961895763649,40G-PM-1013-05,40G,PM,10132018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (to the tree),POINT (-73.9529224802393 40.7961895763649) +-73.9680237209555,40.7717022208225,10I-AM-1010-04,10I,AM,10102018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9680237209555 40.7717022208225) +-73.9703314162405,40.778584776139,16D-PM-1010-12,16D,PM,10102018,12,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9703314162405 40.778584776139) +-73.9701379806066,40.7785234812393,16D-PM-1010-11,16D,PM,10102018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701379806066 40.7785234812393) +-73.9684058476942,40.7753959833776,13G-PM-1008-02,13G,PM,10082018,2,Juvenile,Gray,,Gray+,,Above Ground,15,willow oak tree,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9684058476942 40.7753959833776) +-73.9691968748482,40.7765862996192,14E-AM-1008-14,14E,AM,10082018,14,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9691968748482 40.7765862996192) +-73.9700066659086,40.7744028820163,12F-PM-1007-13,12F,PM,10072018,13,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9700066659086 40.7744028820163) +-73.9689227467959,40.7837541607494,21B-AM-1019-03,21B,AM,10192018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9689227467959 40.7837541607494) +-73.9588345546879,40.7991830272008,40A-PM-1014-02,40A,PM,10142018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (ran from base of tree into bushes),POINT (-73.9588345546879 40.7991830272008) +-73.9772070122251,40.7694343352509,4C-PM-1010-02,04C,PM,10102018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97720701222511 40.7694343352509) +-73.9699876501742,40.7742482676758,12F-PM-1007-06,12F,PM,10072018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9699876501742 40.77424826767581) +-73.9528937660465,40.7922919074537,36I-AM-1017-01,36I,AM,10172018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,false,true,runs from (me!)—from a pretty big distance,POINT (-73.9528937660465 40.7922919074537) +-73.9698064901149,40.7842538115839,21A-AM-1019-03,21A,AM,10192018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,Tree & ground,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9698064901149 40.78425381158391) +-73.9774630821854,40.7680626674086,3D-PM-1010-11,03D,PM,10102018,11,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9774630821854 40.76806266740861) +-73.9588714413332,40.7895787115444,31F-PM-1007-03,31F,PM,10072018,3,Adult,Gray,White,Gray+White,white belly,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9588714413332 40.7895787115444) +-73.9797112925048,40.7688046778472,2B-PM-1013-09,02B,PM,10132018,9,Adult,Gray,White,Gray+White,,Above Ground,30,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9797112925048 40.7688046778472) +-73.9693504617353,40.7830678709405,21B-PM-1017-02,21B,PM,10172018,2,Juvenile,Cinnamon,White,Cinnamon+White,,Above Ground,1,,false,true,false,false,false,,false,true,false,false,false,false,false,false,stood on hind legs with front legs on the chest,POINT (-73.9693504617353 40.7830678709405) +-73.9627819112681,40.7886877360376,29D-AM-1014-02,29D,AM,10142018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9627819112681 40.7886877360376) +-73.9632866142841,40.7890043294436,29C-PM-1006-01,29C,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,false,not too shy,POINT (-73.96328661428412 40.78900432944361) +-73.9637440847107,40.7891427419372,29C-AM-1007-04,29C,AM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9637440847107 40.7891427419372) +-73.9545383719188,40.7899711263765,33I-PM-1006-03,33I,PM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.95453837191882 40.7899711263765) +-73.9756278240233,40.7669523701372,2F-AM-1006-02,02F,AM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,in tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9756278240233 40.7669523701372) +-73.9602197762862,40.7936850570022,35C-PM-1013-07,35C,PM,10132018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9602197762862 40.7936850570022) +-73.9743795190073,40.7692030411004,5E-AM-1008-05,05E,AM,10082018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9743795190073 40.7692030411004) +-73.9542332505231,40.7933475171434,37G-AM-1014-01,37G,AM,10142018,1,Adult,Gray,White,Gray+White,White tail,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9542332505231 40.7933475171434) +-73.9581389870644,40.7993081122523,41A-PM-1007-04,41A,PM,10072018,4,Adult,Gray,,Gray+,,Above Ground,20,,true,false,true,false,false,laid down on the branch,false,false,false,false,false,false,false,true,,POINT (-73.9581389870644 40.799308112252305) +-73.9742811484852,40.775533619083,11B-PM-1014-08,11B,PM,10142018,8,,Gray,,Gray+,,Above Ground,10,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.97428114848522 40.775533619083) +-73.9544372297722,40.7942113164104,37G-PM-1007-02,37G,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,ran under dumpster w/ nut,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9544372297722 40.7942113164104) +-73.9725669210177,40.7681496989029,5H-AM-1007-01,05H,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9725669210177 40.7681496989029) +-73.9646023053207,40.7810680044024,20F-PM-1007-14,20F,PM,10072018,14,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9646023053207 40.78106800440241) +-73.9744279648953,40.7777760612191,13A-PM-1014-01,13A,PM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9744279648953 40.7777760612191) +-73.9533085932603,40.7934877861075,37H-PM-1006-03,37H,PM,10062018,3,,,,+,,Above Ground,43,tree,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9533085932603 40.7934877861075) +-73.9616972557304,40.7953872829374,36A-PM-1013-03,36A,PM,10132018,3,Juvenile,Cinnamon,,Cinnamon+,"COULD HAVE BEEN CHIPPY, DEEP BROWN",Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9616972557304 40.7953872829374) +-73.9584824361655,40.7934247634031,35D-PM-1013-02,35D,PM,10132018,2,Adult,Gray,White,Gray+White,,Above Ground,24,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9584824361655 40.7934247634031) +-73.969756965598,40.7786455091699,16D-PM-1010-02,16D,PM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.969756965598 40.7786455091699) +-73.9675268877392,40.7750409681718,13H-AM-1013-01,13H,AM,10132018,1,Adult,Gray,White,Gray+White,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9675268877392 40.7750409681718) +-73.9667911565238,40.779321901098,18F-AM-1014-02,18F,AM,10142018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,In small tree by water,false,false,false,true,true,,false,true,false,false,false,false,true,false,,POINT (-73.9667911565238 40.77932190109801) +-73.9565549485301,40.7989823714955,41C-AM-1017-03,41C,AM,10172018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9565549485301 40.7989823714955) +-73.9719879697272,40.7725625124591,9F-AM-1013-02,09F,AM,10132018,2,Adult,Black,,Black+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9719879697272 40.7725625124591) +-73.9540151828782,40.7920066170587,35H-AM-1013-01,35H,AM,10132018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,15,Climbing up tree,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9540151828782 40.7920066170587) +-73.9696445614055,40.7791486203627,17D-AM-1008-05,17D,AM,10082018,5,Juvenile,Gray,,Gray+,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9696445614055 40.7791486203627) +-73.9704790263224,40.7762270645666,13E-AM-1017-01,13E,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,in middle of path,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9704790263224 40.7762270645666) +-73.96249054313,40.7935389038787,33A-PM-1018-01,33A,PM,10182018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,stopped to see what i would do 1st,POINT (-73.96249054313 40.7935389038787) +-73.9690447463294,40.783913304529,21B-AM-1019-06,21B,AM,10192018,6,Juvenile,Gray,,Gray+,,Above Ground,7,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9690447463294 40.78391330452901) +-73.9743292066413,40.7756090404121,11B-AM-1007-05,11B,AM,10072018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,true,false,true,false,false,,POINT (-73.9743292066413 40.7756090404121) +-73.9530257401736,40.795139740737,39G-PM-1013-01,39G,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9530257401736 40.79513974073701) +-73.9692925815903,40.7774506065008,15E-PM-1008-11,15E,PM,10082018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9692925815903 40.7774506065008) +-73.9747175419546,40.7692820030878,5E-PM-1012-05,05E,PM,10122018,5,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,true,false,false,begging,POINT (-73.9747175419546 40.7692820030878) +-73.9738410069766,40.7691686156505,5F-PM-1007-06,05F,PM,10072018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,jumping on fence,false,false,false,false,true,false,true,false,,POINT (-73.9738410069766 40.7691686156505) +-73.9605362268777,40.7939470599346,35C-AM-1007-02,35C,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,13,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9605362268777 40.7939470599346) +-73.9643016116839,40.7904796216068,30B-PM-1019-05,30B,PM,10192018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,hiding a nut,false,false,false,false,true,false,false,true,,POINT (-73.9643016116839 40.7904796216068) +-73.9548431601579,40.7906346271566,34I-PM-1010-02,34I,PM,10102018,2,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9548431601579 40.7906346271566) +-73.9681810466693,40.7720638449419,10I-PM-1013-01,10I,PM,10132018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9681810466693 40.7720638449419) +-73.9644974196807,40.7810020292593,20G-PM-1013-02,20G,PM,10132018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.96449741968071 40.7810020292593) +-73.9794840520702,40.7709595369804,4A-PM-1007-02,04A,PM,10072018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9794840520702 40.770959536980406) +-73.9606559309874,40.7889527629826,30E-AM-1008-02,30E,AM,10082018,2,Adult,Gray,,Gray+,,Above Ground,5,,false,true,false,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9606559309874 40.7889527629826) +-73.980897497712,40.7690578709841,2A-PM-1019-02,02A,PM,10192018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,false,,POINT (-73.980897497712 40.7690578709841) +-73.9684187207423,40.780592789876,18D-AM-1018-01,18D,AM,10182018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,cleaning,false,false,false,false,false,false,false,false,,POINT (-73.9684187207423 40.780592789876) +-73.9693120090055,40.771096102012,9H-PM-1018-07,09H,PM,10182018,7,Adult,Gray,,Gray+,,,,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9693120090055 40.771096102012) +-73.9707737073771,40.7800373465838,17B-PM-1012-02,17B,PM,10122018,2,Adult,Black,,Black+,,Ground Plane,FALSE,,true,true,false,false,true,2/3 chasing each other,true,true,false,true,true,false,true,false,,POINT (-73.9707737073771 40.7800373465838) +-73.9730158913661,40.7701310707272,6F-PM-1008-02,06F,PM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,true,true,false,false,false,chasing #2,false,false,false,false,false,false,false,false,,POINT (-73.9730158913661 40.7701310707272) +-73.953664715831,40.7981256393159,41E-PM-1013-04,41E,PM,10132018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.953664715831 40.7981256393159) +-73.9647318357023,40.7760936175332,15I-PM-1012-04,15I,PM,10122018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9647318357023 40.7760936175332) +-73.9651591861399,40.781183828857,20F-PM-1007-06,20F,PM,10072018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9651591861399 40.781183828857) +-73.9622859117854,40.7886169186966,29D-AM-1014-06,29D,AM,10142018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9622859117854 40.7886169186966) +-73.9719359643975,40.772699885583,9F-PM-1014-01,09F,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,"he is fed every day by a woman who calls him ""chiquita""! he ran right up to her.",POINT (-73.9719359643975 40.772699885583) +-73.9750911996499,40.7722445210179,8C-PM-1013-06,08C,PM,10132018,6,,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9750911996499 40.7722445210179) +-73.9647247254127,40.7806136565784,20G-PM-1013-03,20G,PM,10132018,3,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,true,false,false,false,true,,POINT (-73.9647247254127 40.7806136565784) +-73.9699088881236,40.7752778351626,13F-AM-1007-03,13F,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9699088881236 40.7752778351626) +-73.9689051473072,40.7764511282884,14F-AM-1007-04,14F,AM,10072018,4,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9689051473072 40.7764511282884) +-73.9631464693769,40.793415656751,33A-PM-1018-02,33A,PM,10182018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,Tree cavity [of] London Plane tree,false,false,false,false,false,"hanging out,watching world",false,false,false,false,false,false,false,false,watching,POINT (-73.9631464693769 40.793415656751) +-73.9591880400132,40.7950071252836,36C-PM-1013-02,36C,PM,10132018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,Clearing near bike path (bikes active),false,true,false,true,true,,true,true,false,false,true,false,true,false,,POINT (-73.95918804001322 40.7950071252836) +-73.9558370309765,40.7921977208472,35G-AM-1007-02,35G,AM,10072018,2,Adult,Gray,White,Gray+White,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9558370309765 40.7921977208472) +-73.957138759793,40.7955926035055,38D-PM-1006-02,38D,PM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.957138759793 40.7955926035055) +-73.9772420734509,40.7730025191407,7A-PM-1007-01,07A,PM,10072018,1,Adult,Gray,,Gray+,,Above Ground,8,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9772420734509 40.7730025191407) +-73.9753291616796,40.7687376032936,4E-PM-1008-01,04E,PM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9753291616796 40.7687376032936) +-73.9770920860805,40.7694698040083,4C-PM-1010-01,04C,PM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,,false,false,true,false,false,,false,true,false,false,false,false,true,false,,POINT (-73.9770920860805 40.7694698040083) +-73.9586570546871,40.796349417475,38C-AM-1019-09,38C,AM,10192018,9,Adult,Gray,White,Gray+White,Gray & White selected as Primary & Highlights. Made executive adjustments.,Above Ground,3,Between ground & tree,false,false,false,true,true,,false,false,false,false,true,false,false,true,,POINT (-73.9586570546871 40.796349417475) +-73.9579689996645,40.7949338489917,37D-AM-1018-02,37D,AM,10182018,2,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9579689996645 40.7949338489917) +-73.9612759291399,40.7930468323219,33B-AM-1010-03,33B,AM,10102018,3,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9612759291399 40.7930468323219) +-73.9686635017966,40.7843176732828,22B-PM-1014-01,22B,PM,10142018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.96866350179661 40.7843176732828) +-73.972154069981,40.7690128009722,6G-AM-1008-03,06G,AM,10082018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,grass,false,false,false,true,true,,false,false,false,true,false,false,true,false,,POINT (-73.972154069981 40.7690128009722) +-73.9729979174723,40.7742904356698,10D-PM-1008-01,10D,PM,10082018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9729979174723 40.7742904356698) +-73.9784144867639,40.7718177667511,6A-AM-1006-01,06A,AM,10062018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9784144867639 40.7718177667511) +-73.9739249209875,40.7768528386853,13B-PM-1008-02,13B,PM,10082018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9739249209875 40.7768528386853) +-73.9530791622513,40.7959885603967,40G-PM-1013-03,40G,PM,10132018,3,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9530791622513 40.7959885603967) +-73.958247706428,40.7989079136796,40B-AM-1019-07,40B,AM,10192018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,true,,POINT (-73.958247706428 40.7989079136796) +-73.9573692542155,40.7989252908321,41B-PM-1014-03,41B,PM,10142018,3,Adult,Gray,White,Gray+White,,Above Ground,28,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9573692542155 40.7989252908321) +-73.957138794884,40.7985389822719,40C-AM-1017-03,40C,AM,10172018,3,Adult,Gray,White,Gray+White,,,,,true,true,true,false,false,"chasing (#4),digging",false,false,false,false,true,false,true,false,,POINT (-73.957138794884 40.7985389822719) +-73.9631646754647,40.7925716810884,32A-AM-1018-02,32A,AM,10182018,2,Adult,Gray,,Gray+,,Above Ground,15,,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9631646754647 40.7925716810884) +-73.9774584305147,40.7708133986192,5B-AM-1008-02,05B,AM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9774584305147 40.7708133986192) +-73.965059909327,40.7762131886797,15I-PM-1012-06,15I,PM,10122018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.965059909327 40.7762131886797) +-73.9586085843149,40.7946617684536,36C-AM-1014-03,36C,AM,10142018,3,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9586085843149 40.7946617684536) +-73.9546367558712,40.789840987798,33I-AM-1008-04,33I,AM,10082018,4,Adult,,,+,,Above Ground,100,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9546367558712 40.789840987798) +-73.9598463837775,40.7834524724254,25I-PM-1007-05,25I,PM,10072018,5,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9598463837775 40.7834524724254) +-73.9603366992925,40.7899612889539,31E-PM-1006-05,31E,PM,10062018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9603366992925 40.789961288953904) +-73.977641787698,40.7695830265784,4C-PM-1010-10,04C,PM,10102018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.977641787698 40.7695830265784) +-73.9714637683084,40.7768984561563,14D-PM-1019-01,14D,PM,10192018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9714637683084 40.7768984561563) +-73.9595686513629,40.7906859748696,32E-AM-1007-06,32E,AM,10072018,6,Adult,Gray,,Gray+,,Above Ground,40,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9595686513629 40.7906859748696) +-73.9549860947234,40.7911550328309,34H-PM-1006-07,34H,PM,10062018,7,Juvenile,Gray,White,Gray+White,white belly,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9549860947234 40.7911550328309) +-73.9591070579246,40.7896776771157,31F-PM-1007-05,31F,PM,10072018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9591070579246 40.7896776771157) +-73.9521655419974,40.7948785497717,39H-AM-1007-04,39H,AM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9521655419974 40.7948785497717) +-73.9581706950566,40.7906321397269,32F-AM-1012-05,32F,AM,10122018,5,Adult,Gray,White,Gray+White,,Above Ground,10,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9581706950566 40.7906321397269) +-73.9640526358598,40.7907411574825,30B-AM-1007-01,30B,AM,10072018,1,Adult,Gray,,Gray+,,Above Ground,35,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9640526358598 40.7907411574825) +-73.9635838951472,40.7917524619792,31B-AM-1017-02,31B,AM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9635838951472 40.7917524619792) +-73.9755259087781,40.7707256124181,6D-AM-1008-01,06D,AM,10082018,1,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,10,,false,false,true,true,false,,true,false,false,false,false,true,false,false,,POINT (-73.9755259087781 40.7707256124181) +-73.9695641121727,40.7769562886685,14E-AM-1008-03,14E,AM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,false,false,true,false,unaware of,POINT (-73.9695641121727 40.7769562886685) +-73.9684834138222,40.7724289120211,11H-AM-1010-06,11H,AM,10102018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9684834138222 40.7724289120211) +-73.9524364087437,40.792846505434,37I-PM-1006-01,37I,PM,10062018,1,Adult,Cinnamon,"Gray, Black","Cinnamon+Gray, Black",,Above Ground,5,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9524364087437 40.792846505434) +-73.9639505810228,40.789573183584,29B-PM-1010-01,29B,PM,10102018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,4,climbing trees,false,false,true,true,true,scratching self,false,false,false,false,true,false,true,false,,POINT (-73.9639505810228 40.789573183584) +-73.9673821557469,40.7786375267659,17F-PM-1020-06,17F,PM,10202018,6,Adult,Gray,,Gray+,,Above Ground,20,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.96738215574692 40.7786375267659) +-73.9603245806655,40.7942712477697,35C-PM-1013-04,35C,PM,10132018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9603245806655 40.7942712477697) +-73.9587464852561,40.793496354083,35D-PM-1013-05,35D,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9587464852561 40.793496354083) +-73.9695348385828,40.7703657361802,8I-PM-1013-07,08I,PM,10132018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9695348385828 40.7703657361802) +-73.9786474809514,40.7679715341109,2C-PM-1013-04,02C,PM,10132018,4,Adult,Gray,White,Gray+White,,,,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9786474809514 40.7679715341109) +-73.9574365550758,40.7886924675052,31H-PM-1008-03,31H,PM,10082018,3,Adult,Gray,,Gray+,,Above Ground,,"no clue, way up a tree!",false,false,true,false,true,throwing down acorns,false,false,false,false,false,false,false,false,,POINT (-73.9574365550758 40.7886924675052) +-73.9589492240754,40.798901118974,40A-PM-1014-01,40A,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,true,false,true,false,stared & then went back up tree—then ran to different tree,POINT (-73.9589492240754 40.798901118974) +-73.9775067398903,40.7726566142401,7B-AM-1008-14,07B,AM,10082018,14,Adult,Gray,,Gray+,,Above Ground,,on fence,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9775067398903 40.7726566142401) +-73.9697924026634,40.7803611152023,18C-PM-1018-04,18C,PM,10182018,4,Juvenile,Gray,,Gray+,,Above Ground,1,,true,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9697924026634 40.7803611152023) +-73.9566705412766,40.7935560645735,36F-PM-1012-01,36F,PM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,Near rock,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9566705412766 40.7935560645735) +-73.9691453885964,40.7770524089712,15E-PM-1008-02,15E,PM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9691453885964 40.7770524089712) +-73.9582800305509,40.7989473712974,40B-PM-1014-03,40B,PM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9582800305509 40.7989473712974) +-73.9719583492187,40.7763434967164,13D-AM-1014-11,13D,AM,10142018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9719583492187 40.7763434967164) +-73.9663977261879,40.775645134229,14H-PM-1012-08,14H,PM,10122018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9663977261879 40.775645134229) +-73.9722472286151,40.7699550476176,6G-PM-1020-04,06G,PM,10202018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9722472286151 40.7699550476176) +-73.9766541879006,40.7674077265375,2E-AM-1010-06,02E,AM,10102018,6,Adult,Cinnamon,,Cinnamon+,,Above Ground,35,,false,false,false,false,false,leaping branch to branch,false,false,false,false,false,false,true,false,,POINT (-73.9766541879006 40.7674077265375) +-73.9622752768962,40.7814921913101,22H-PM-1007-02,22H,PM,10072018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,4,low branch,false,false,false,false,false,watching me scratching,true,false,false,true,false,false,true,false,,POINT (-73.9622752768962 40.7814921913101) +-73.964449990389,40.7830023160643,22F-PM-1014-04,22F,PM,10142018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.964449990389 40.7830023160643) +-73.9687347731861,40.7718955594385,10H-AM-1014-03,10H,AM,10142018,3,Juvenile,,,+,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9687347731861 40.7718955594385) +-73.9687213827744,40.7843586374648,22B-PM-1014-02,22B,PM,10142018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9687213827744 40.7843586374648) +-73.9749251267433,40.7679111971294,4F-PM-1013-01,04F,PM,10132018,1,Adult,Cinnamon,"Gray, Black","Cinnamon+Gray, Black",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,true,false,false,,POINT (-73.9749251267433 40.7679111971294) +-73.9795454787631,40.7688026892741,3B-PM-1007-09,03B,PM,10072018,9,Adult,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9795454787631 40.7688026892741) +-73.9590157104896,40.7956884493421,37C-PM-1013-05,37C,PM,10132018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9590157104896 40.7956884493421) +-73.9500167570283,40.7966185836685,41I-AM-1018-01,41I,AM,10182018,1,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,false,"cautious,observant,runs off",POINT (-73.9500167570283 40.7966185836685) +-73.9699135187297,40.7782354186163,16D-AM-1007-03,16D,AM,10072018,3,Adult,,,+,ran away before I could take a good look,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9699135187297 40.7782354186163) +-73.9527184914182,40.7926785904847,37I-PM-1006-02,37I,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9527184914182 40.7926785904847) +-73.9610266708075,40.7817512107392,23I-PM-1019-03,23I,PM,10192018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9610266708075 40.7817512107392) +-73.9683370417551,40.78135983505,19D-AM-1007-02,19D,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,,false,false,true,false,true,,false,false,false,false,true,false,false,false,fenced area,POINT (-73.9683370417551 40.78135983505) +-73.9803562137049,40.7685780990634,2B-AM-1010-02,02B,AM,10102018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9803562137049 40.7685780990634) +-73.9708371806429,40.7764813666684,14D-AM-1014-14,14D,AM,10142018,14,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9708371806429 40.7764813666684) +-73.9648167334089,40.7811164976329,20F-PM-1007-02,20F,PM,10072018,2,Adult,Gray,White,Gray+White,white on tail,Ground Plane,FALSE,,false,false,false,true,true,digging one hole w/ determination,false,false,false,false,true,false,false,true,,POINT (-73.96481673340891 40.7811164976329) +-73.9651796685091,40.7785578267586,18G-AM-1014-03,18G,AM,10142018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9651796685091 40.7785578267586) +-73.9800896621713,40.7684379810317,2B-PM-1013-03,02B,PM,10132018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9800896621713 40.7684379810317) +-73.9643223016635,40.781431908715,21F-AM-1018-03,21F,AM,10182018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,false,dead,false,false,false,false,false,false,false,true,,POINT (-73.9643223016635 40.781431908715) +-73.9771552326199,40.7706917595308,5C-AM-1006-01,05C,AM,10062018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,true,false,true,false,false,,POINT (-73.9771552326199 40.7706917595308) +-73.9564173149092,40.7991558544827,42C-PM-1013-02,42C,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.95641731490922 40.7991558544827) +-73.9706414863639,40.7732754837144,11F-PM-1006-01,11F,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9706414863639 40.7732754837144) +-73.9721656413591,40.7722869065638,9F-PM-1014-08,09F,PM,10142018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,turned to face me while eating,POINT (-73.9721656413591 40.7722869065638) +-73.9627661465376,40.7819356810575,22G-PM-1018-02,22G,PM,10182018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9627661465376 40.7819356810575) +-73.9692650850957,40.7713793846002,9H-PM-1018-03,09H,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9692650850957 40.7713793846002) +-73.9555255950648,40.7977720808005,40D-AM-1013-04,40D,AM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,Gray & Cinnamon selected as Primary. Nothing selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9555255950648 40.7977720808005) +-73.9544808708211,40.7906575852286,34I-AM-1012-02,34I,AM,10122018,2,Adult,Gray,White,Gray+White,Short tail,Ground Plane,FALSE,,false,false,false,false,false,hiding,false,false,false,false,false,false,false,true,,POINT (-73.9544808708211 40.7906575852286) +-73.9746493441414,40.7750478734868,11B-PM-1014-06,11B,PM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,false,false,false,cleaning,false,false,false,false,false,false,true,false,,POINT (-73.9746493441414 40.7750478734868) +-73.9711810222421,40.7773445611969,14D-PM-1019-05,14D,PM,10192018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9711810222421 40.7773445611969) +-73.9726381234747,40.7752694815985,12D-PM-1014-01,12D,PM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9726381234747 40.7752694815985) +-73.9806928007664,40.768255422025,1A-PM-1014-03,01A,PM,10142018,3,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9806928007664 40.768255422025) +-73.9589600626433,40.7913690265064,33E-AM-1014-08,33E,AM,10142018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,5,,false,false,true,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.9589600626433 40.7913690265064) +-73.9579659543224,40.7905646887034,32F-AM-1012-07,32F,AM,10122018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9579659543224 40.7905646887034) +-73.9669017345324,40.7766928987073,15G-AM-1008-01,15G,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9669017345324 40.7766928987073) +-73.9710026704697,40.7761052764621,13D-AM-1014-04,13D,AM,10142018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9710026704697 40.7761052764621) +-73.9575798004084,40.795701403549,38D-PM-1006-04,38D,PM,10062018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,near drive -runners -cyclists,POINT (-73.95757980040841 40.795701403549) +-73.9608834102446,40.790624710005,31D-AM-1014-05,31D,AM,10142018,5,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9608834102446 40.790624710005) +-73.9618173092433,40.7925800181543,33B-PM-1010-04,33B,PM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9618173092433 40.7925800181543) +-73.9544763281886,40.7969645476349,40F-PM-1006-03,40F,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9544763281886 40.7969645476349) +-73.970260899173,40.783651724865,21A-AM-1019-05,21A,AM,10192018,5,Adult,Gray,,Gray+,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.970260899173 40.783651724865) +-73.9768411547701,40.7741377018895,9A-AM-1013-03,09A,AM,10132018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9768411547701 40.7741377018895) +-73.9784610031588,40.7668839966177,1D-AM-1006-07,01D,AM,10062018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9784610031588 40.7668839966177) +-73.9725077933574,40.7654562710325,2I-PM-1006-01,02I,PM,10062018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,2,Sitting on back of bench with food hanging from mouth,false,false,false,false,false,staring at me,false,false,false,false,false,false,false,true,,POINT (-73.9725077933574 40.7654562710325) +-73.9735587560787,40.7672346255151,3G-PM-1013-02,03G,PM,10132018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,false,"wandering,interacting with tourists",false,false,false,false,false,true,false,false,"approaches (father - son taking photos,talking about giving him planters peanuts)",POINT (-73.9735587560787 40.7672346255151) +-73.9538377039825,40.7980605334961,42E-PM-1012-03,42E,PM,10122018,3,Adult,Gray,White,Gray+White,,Above Ground,20,in tree,false,false,true,false,true,,true,false,false,false,false,false,true,false,,POINT (-73.9538377039825 40.7980605334961) +-73.9725700261894,40.7668793330427,3H-PM-1014-01,03H,PM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,under a parked car,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9725700261894 40.7668793330427) +-73.9667694439895,40.7779501809095,17G-PM-1017-03,17G,PM,10172018,3,Adult,Gray,White,Gray+White,,Above Ground,10,tree & ground,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9667694439895 40.7779501809095) +-73.9618709589382,40.7944969066792,35A-PM-1013-02,35A,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9618709589382 40.7944969066792) +-73.9661108248377,40.7891945123815,28A-AM-1014-01,28A,AM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9661108248377 40.7891945123815) +-73.9676246014119,40.786355136088,24A-PM-1007-05,24A,PM,10072018,5,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,45,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9676246014119 40.786355136088) +-73.9636234953334,40.7775138547689,18I-PM-1007-06,18I,PM,10072018,6,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9636234953334 40.7775138547689) +-73.9712636931964,40.77998098773,17B-AM-1010-03,17B,AM,10102018,3,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9712636931964 40.77998098773) +-73.9562733511031,40.7993142101839,42C-PM-1013-03,42C,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,Crossing street,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9562733511031 40.7993142101839) +-73.9706041173545,40.7780152784804,15D-PM-1017-05,15D,PM,10172018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9706041173545 40.7780152784804) +-73.9643025171914,40.790570391517,30B-PM-1019-06,30B,PM,10192018,6,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9643025171914 40.790570391517) +-73.954530253849,40.7910247489879,34I-PM-1010-07,34I,PM,10102018,7,Adult,Gray,,Gray+,,,,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.954530253849 40.7910247489879) +-73.9675718059539,40.7786049141486,17F-AM-1007-06,17F,AM,10072018,6,Juvenile,Cinnamon,White,Cinnamon+White,,Above Ground,8,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9675718059539 40.7786049141486) +-73.9696802053043,40.7816057406125,19B-PM-1018-03,19B,PM,10182018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. Gray & White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9696802053043 40.7816057406125) +-73.9702382274798,40.7721754848905,10G-PM-1017-03,10G,PM,10172018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9702382274798 40.7721754848905) +-73.9567255763265,40.7936331899263,36F-AM-1017-05,36F,AM,10172018,5,Adult,Gray,White,Gray+White,,Above Ground,8,,false,false,false,false,false,staying very still to avoid two very curious dogs on the ground,false,false,false,false,false,false,false,false,"petrified,frozen (tail over its back,frozen)",POINT (-73.9567255763265 40.7936331899263) +-73.9690551477139,40.7823685663196,20B-PM-1013-07,20B,PM,10132018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9690551477139 40.7823685663196) +-73.9525627119429,40.7938602867464,38I-PM-1014-02,38I,PM,10142018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,hanging out w/ Squirrel #1,false,false,false,false,false,scampering w/ squirrel #1,false,false,false,false,true,false,false,true,,POINT (-73.9525627119429 40.7938602867464) +-73.956502663005,40.788160908881,30I-PM-1006-05,30I,PM,10062018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.956502663005 40.788160908881) +-73.9651155880346,40.790694632578,30A-PM-1020-01,30A,PM,10202018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9651155880346 40.790694632578) +-73.9535980341677,40.7981186822179,42E-PM-1012-01,42E,PM,10122018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9535980341677 40.7981186822179) +-73.9569759970802,40.7931497452294,35F-PM-1012-03,35F,PM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,7,,false,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9569759970802 40.79314974522941) +-73.9676112864286,40.7772792086081,16F-AM-1008-03,16F,AM,10082018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,road,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9676112864286 40.7772792086081) +-73.9698231469857,40.7702048311133,8I-PM-1013-04,08I,PM,10132018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9698231469857 40.7702048311133) +-73.9597994674082,40.797298837759,38A-PM-1013-02,38A,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9597994674082 40.797298837759) +-73.9701630539326,40.7779553961101,15D-AM-1007-04,15D,AM,10072018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.97016305393261 40.7779553961101) +-73.9747762992858,40.7768579078578,12A-AM-1008-02,12A,AM,10082018,2,Adult,Gray,,Gray+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9747762992858 40.7768579078578) +-73.9708903862176,40.7787370674642,16C-AM-1014-03,16C,AM,10142018,3,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9708903862176 40.7787370674642) +-73.9773486521595,40.7708454902113,5C-PM-1010-02,05C,PM,10102018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9773486521595 40.7708454902113) +-73.9700779726297,40.7722086251085,10G-AM-1006-11,10G,AM,10062018,11,Juvenile,Gray,,Gray+,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9700779726297 40.7722086251085) +-73.9685612289881,40.7778488829217,16E-PM-1018-08,16E,PM,10182018,8,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9685612289881 40.7778488829217) +-73.9638312025305,40.7903826659569,30B-AM-1007-07,30B,AM,10072018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9638312025305 40.7903826659569) +-73.957600085245,40.7936111607879,35E-PM-1006-04,35E,PM,10062018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.957600085245 40.7936111607879) +-73.9593909381748,40.7961036981921,37B-PM-1013-03,37B,PM,10132018,3,Adult,Cinnamon,White,Cinnamon+White,White back left leg,,,,false,false,false,true,true,watching,false,false,false,false,false,false,false,true,,POINT (-73.9593909381748 40.7961036981921) +-73.9782983634755,40.7668314364263,1D-AM-1006-04,01D,AM,10062018,4,Adult,Gray,White,Gray+White,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9782983634755 40.7668314364263) +-73.9622419917579,40.794579797904,35A-AM-1014-07,35A,AM,10142018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9622419917579 40.794579797904) +-73.9738723117119,40.7786845612246,14A-AM-1014-01,14A,AM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,"foraging?,crossing road",false,false,false,false,false,false,true,true,runs from (dogs),POINT (-73.9738723117119 40.7786845612246) +-73.9801651470389,40.7677698656935,1B-AM-1012-05,01B,AM,10122018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9801651470389 40.7677698656935) +-73.9772624834791,40.7692821918543,4C-PM-1010-05,04C,PM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9772624834791 40.7692821918543) +-73.9702420100291,40.7772720889907,14D-AM-1014-02,14D,AM,10142018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9702420100291 40.7772720889907) +-73.9744488584414,40.7741627220859,10C-PM-1013-03,10C,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9744488584414 40.7741627220859) +-73.9647151303629,40.7912681060756,30A-PM-1020-03,30A,PM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Rock,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9647151303629 40.7912681060756) +-73.968446056806,40.785824818871,24A-PM-1007-01,24A,PM,10072018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.96844605680602 40.785824818871) +-73.9655206571055,40.7764851568746,16H-PM-1014-02,16H,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9655206571055 40.7764851568746) +-73.9582904814652,40.7905915749564,32F-AM-1012-04,32F,AM,10122018,4,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9582904814652 40.7905915749564) +-73.9651541395415,40.7798283208748,19G-PM-1017-01,19G,PM,10172018,1,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,12,,false,false,false,false,false,watching,false,false,false,false,false,true,false,false,,POINT (-73.9651541395415 40.7798283208748) +-73.9658203999388,40.7775874026824,17G-PM-1017-01,17G,PM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,base of tree,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9658203999388 40.7775874026824) +-73.9801562527339,40.7687267327113,2B-AM-1010-01,02B,AM,10102018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9801562527339 40.7687267327113) +-73.9597192455543,40.7973316178661,38A-AM-1019-03,38A,AM,10192018,3,Adult,Gray,White,Gray+White,White belly,Ground Plane,FALSE,,false,false,false,false,true,stood on back legs,false,false,false,false,false,true,true,true,,POINT (-73.9597192455543 40.7973316178661) +-73.958369699409,40.7902456668332,32F-PM-1008-01,32F,PM,10082018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.958369699409 40.7902456668332) +-73.9641584395299,40.7816571644072,21G-AM-1014-01,21G,AM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9641584395299 40.7816571644072) +-73.9733905460282,40.7656337147768,2H-PM-1006-03,02H,PM,10062018,3,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9733905460282 40.7656337147768) +-73.9693462354257,40.7764444385452,14E-PM-1017-01,14E,PM,10172018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9693462354257 40.7764444385452) +-73.9692946938852,40.7767389791452,14E-AM-1008-13,14E,AM,10082018,13,Adult,Gray,,Gray+,,Above Ground,1,,false,false,true,true,true,,false,false,false,false,false,false,true,false,curious,POINT (-73.9692946938852 40.7767389791452) +-73.959874668294,40.7907004233491,32E-AM-1007-09,32E,AM,10072018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.959874668294 40.7907004233491) +-73.9730039581521,40.7730688398468,9E-PM-1014-03,09E,PM,10142018,3,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,underneath a tree,false,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9730039581521 40.7730688398468) +-73.9687933229572,40.7788600242549,17E-PM-1018-01,17E,PM,10182018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9687933229572 40.7788600242549) +-73.9612623577548,40.7911558714527,32D-AM-1013-02,32D,AM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9612623577548 40.7911558714527) +-73.9562442622553,40.7957285542564,38E-AM-1010-03,38E,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9562442622553 40.7957285542564) +-73.9757673193743,40.7669614322613,2F-PM-1014-04,02F,PM,10142018,4,Adult,Gray,,Gray+,,Above Ground,20,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9757673193743 40.766961432261304) +-73.9701182454818,40.7772805500871,15D-PM-1017-03,15D,PM,10172018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701182454818 40.7772805500871) +-73.9695572903383,40.780822981713,18C-AM-1018-01,18C,AM,10182018,1,Adult,Gray,Black,Gray+Black,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9695572903383 40.780822981713) +-73.9752225195115,40.7703747669865,6D-PM-1020-05,06D,PM,10202018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9752225195115 40.7703747669865) +-73.967472660349,40.7772125619715,16F-PM-1013-03,16F,PM,10132018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,Woods,false,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.96747266034902 40.7772125619715) +-73.9736164871197,40.7725695048569,8D-PM-1007-04,08D,PM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9736164871197 40.7725695048569) +-73.9614373639552,40.7945051962914,35B-PM-1013-01,35B,PM,10132018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,did not notice dog sitting a few yards away (10-20 ft),false,false,false,true,false,false,true,false,,POINT (-73.9614373639552 40.7945051962914) +-73.9596251284566,40.7916254797561,33D-AM-1017-05,33D,AM,10172018,5,Adult,Black,,Black+,,Above Ground,5,,false,false,true,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9596251284566 40.7916254797561) +-73.9721897915211,40.7660434203132,3I-AM-1010-02,03I,AM,10102018,2,Adult,Gray,,Gray+,,Above Ground,40,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9721897915211 40.76604342031321) +-73.9648831611629,40.7801326414973,19G-PM-1017-02,19G,PM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,patting ground,false,false,false,false,true,false,false,true,,POINT (-73.9648831611629 40.7801326414973) +-73.9791536183194,40.7672705931866,1C-PM-1013-03,01C,PM,10132018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9791536183194 40.7672705931866) +-73.9697471123497,40.7773163388327,15E-PM-1008-10,15E,PM,10082018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9697471123497 40.777316338832705) +-73.9598875541307,40.7973415580717,38A-AM-1019-04,38A,AM,10192018,4,Adult,Gray,,Gray+,,Above Ground,2,,false,false,false,false,false,walking,false,false,false,false,false,false,true,false,,POINT (-73.9598875541307 40.7973415580717) +-73.9787015184662,40.7690114585688,3B-PM-1007-06,03B,PM,10072018,6,Juvenile,,,+,,,,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9787015184662 40.7690114585688) +-73.9598535425706,40.7915589343685,33D-PM-1006-01,33D,PM,10062018,1,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,true,false,false,false,hanging on fence,true,false,false,true,false,false,false,true,,POINT (-73.9598535425706 40.7915589343685) +-73.9596232170232,40.7959550843229,37B-PM-1013-01,37B,PM,10132018,1,Adult,Gray,,Gray+,Sighting was far away,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9596232170232 40.795955084322905) +-73.975198284551,40.7740343763399,9B-AM-1010-06,09B,AM,10102018,6,Juvenile,Gray,White,Gray+White,,Above Ground,16,tree,false,false,true,false,false,cleaning,false,false,false,false,false,false,true,false,,POINT (-73.975198284551 40.7740343763399) +-73.9651250402583,40.7812884929069,20F-PM-1007-04,20F,PM,10072018,4,Juvenile,Gray,White,Gray+White,white on tail,Above Ground,20,climbed tree,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9651250402583 40.7812884929069) +-73.9547398684817,40.7896483795302,33I-AM-1008-01,33I,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,edge of park @ 98th (north),false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9547398684817 40.7896483795302) +-73.9651217998407,40.7761115392738,15I-PM-1012-01,15I,PM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9651217998407 40.7761115392738) +-73.9767317539505,40.7717600450632,6B-PM-1017-05,06B,PM,10172018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9767317539505 40.7717600450632) +-73.9691845420174,40.7707749899254,9I-AM-1014-03,09I,AM,10142018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9691845420174 40.7707749899254) +-73.9557710118271,40.7919161185557,34G-PM-1006-01,34G,PM,10062018,1,Adult,Black,,Black+,"Skinny, thin tail",Ground Plane,FALSE,,false,false,false,false,false,digging,false,false,false,false,false,false,false,false,,POINT (-73.9557710118271 40.7919161185557) +-73.9697178769788,40.7791544102422,17D-AM-1008-03,17D,AM,10082018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.96971787697882 40.7791544102422) +-73.9686925781295,40.7705688673142,9I-PM-1010-05,09I,PM,10102018,5,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9686925781295 40.7705688673142) +-73.9797122322834,40.7678347587435,1B-PM-1019-10,01B,PM,10192018,10,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,,Dog chased up tree,false,false,true,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.97971223228342 40.7678347587435) +-73.976716425804,40.7736889979965,8A-PM-1014-03,08A,PM,10142018,3,Juvenile,Gray,,Gray+,,Above Ground,23,,false,false,true,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.976716425804 40.7736889979965) +-73.9538938706987,40.7981150065974,42E-PM-1012-05,42E,PM,10122018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9538938706987 40.7981150065974) +-73.9650387848001,40.7814134438394,21F-AM-1018-04,21F,AM,10182018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9650387848001 40.7814134438394) +-73.9657171357842,40.7773277532224,16H-PM-1014-05,16H,PM,10142018,5,Adult,Gray,White,Gray+White,,Above Ground,5,tree,true,false,true,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9657171357842 40.7773277532224) +-73.9597593485091,40.7937528403249,35C-AM-1007-04,35C,AM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9597593485091 40.7937528403249) +-73.9696688162449,40.7741422177187,12F-AM-1020-05,12F,AM,10202018,5,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,false,,POINT (-73.9696688162449 40.7741422177187) +-73.975028559002,40.7667307335544,2F-PM-1014-09,02F,PM,10142018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.975028559002 40.7667307335544) +-73.9715375915057,40.7751212088827,12D-AM-1013-01,12D,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9715375915057 40.7751212088827) +-73.9583300280173,40.7853495002675,27I-PM-1020-04,27I,PM,10202018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9583300280173 40.7853495002675) +-73.9643664403785,40.7793670703727,19H-AM-1010-01,19H,AM,10102018,1,,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,near base of small tree,true,false,false,true,true,,false,false,false,false,false,false,true,false,run from human w/ dog,POINT (-73.9643664403785 40.7793670703727) +-73.955013129397,40.7954024311542,38F-AM-1018-05,38F,AM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,ran up tree,false,false,false,false,false,false,false,true,,POINT (-73.955013129397 40.7954024311542) +-73.9794371709817,40.768387910254,2B-PM-1013-07,02B,PM,10132018,7,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9794371709817 40.768387910254) +-73.9711178122133,40.7672642958437,4I-PM-1007-01,04I,PM,10072018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9711178122133 40.76726429584371) +-73.9799594281222,40.7701978146968,4A-AM-1007-05,04A,AM,10072018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9799594281222 40.7701978146968) +-73.9582363437135,40.7987752300505,40B-AM-1019-06,40B,AM,10192018,6,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9582363437135 40.7987752300505) +-73.9787736280005,40.7676126748454,2C-AM-1010-01,02C,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9787736280005 40.7676126748454) +-73.9678923667678,40.7819675626236,20C-PM-1018-05,20C,PM,10182018,5,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9678923667678 40.781967562623606) +-73.9686370726471,40.7780382348833,16E-PM-1018-09,16E,PM,10182018,9,Juvenile,Cinnamon,White,Cinnamon+White,,Above Ground,3,On trunk,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9686370726471 40.7780382348833) +-73.9642900903774,40.7917017168842,31A-AM-1010-03,31A,AM,10102018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9642900903774 40.7917017168842) +-73.9546123259441,40.7941434862099,37G-PM-1007-05,37G,PM,10072018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,jumping around!,false,false,false,false,false,false,false,false,,POINT (-73.9546123259441 40.7941434862099) +-73.9684092812839,40.7711445841928,9I-AM-1014-07,09I,AM,10142018,7,Adult,Cinnamon,,Cinnamon+,"No real highlight, White tail?",Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9684092812839 40.7711445841928) +-73.9657487923637,40.7786823090663,18G-PM-1013-04,18G,PM,10132018,4,Adult,Gray,,Gray+,,Above Ground,3,,false,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9657487923637 40.7786823090663) +-73.9583201789615,40.7913938722521,33F-PM-1012-05,33F,PM,10122018,5,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,true,,true,false,false,true,true,false,false,true,,POINT (-73.95832017896151 40.7913938722521) +-73.9758211560957,40.7693422860766,5E-AM-1008-10,05E,AM,10082018,10,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,6,up a tree,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9758211560957 40.7693422860766) +-73.9557918001972,40.7979228878042,40D-PM-1013-03,40D,PM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9557918001972 40.7979228878042) +-73.9559663949511,40.7974497269789,40D-AM-1013-07,40D,AM,10132018,7,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,false,true,,false,false,false,false,false,false,false,true,curious,POINT (-73.9559663949511 40.7974497269789) +-73.960864328605,40.7902122634639,31D-PM-1006-02,31D,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.960864328605 40.7902122634639) +-73.9702530172652,40.7736241205021,11F-AM-1013-01,11F,AM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9702530172652 40.7736241205021) +-73.9573656523498,40.7979754563974,40C-AM-1017-01,40C,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,chasing (#2),false,false,false,false,false,false,false,true,,POINT (-73.9573656523498 40.7979754563974) +-73.967334936601,40.7773289724189,16F-PM-1013-01,16F,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Woods,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.967334936601 40.7773289724189) +-73.9694938608335,40.7745700102115,12F-PM-1007-03,12F,PM,10072018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694938608335 40.7745700102115) +-73.9707571364399,40.7758859812524,13E-PM-1008-02,13E,PM,10082018,2,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9707571364399 40.7758859812524) +-73.9561103688639,40.794914085004,37E-AM-1013-03,37E,AM,10132018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9561103688639 40.794914085004) +-73.9699134052609,40.774446589038,12F-PM-1007-14,12F,PM,10072018,14,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,true,true,false,,POINT (-73.9699134052609 40.774446589038) +-73.9676113345824,40.7803482448467,19E-PM-1018-03,19E,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,Baseball field #3,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9676113345824 40.7803482448467) +-73.9761776424664,40.7695941843825,5D-PM-1018-07,05D,PM,10182018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9761776424664 40.7695941843825) +-73.9657040391563,40.7755567428199,15I-AM-1008-06,15I,AM,10082018,6,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,12,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9657040391563 40.7755567428199) +-73.9734108731087,40.7676051392697,4G-AM-1006-03,04G,AM,10062018,3,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9734108731087 40.7676051392697) +-73.9593410965431,40.7923134010383,33D-AM-1017-08,33D,AM,10172018,8,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9593410965431 40.7923134010383) +-73.9569318105253,40.7973442139041,40C-PM-1006-07,40C,PM,10062018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9569318105253 40.7973442139041) +-73.960898739757,40.7961393097144,37A-PM-1013-02,37A,PM,10132018,2,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.960898739757 40.7961393097144) +-73.955352152771,40.7988549523022,42D-AM-1014-01,42D,AM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,20,,false,false,true,true,false,,true,false,false,false,false,false,true,false,,POINT (-73.955352152771 40.7988549523022) +-73.9623356369432,40.7888693815168,29D-AM-1014-05,29D,AM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Rocky area,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9623356369432 40.7888693815168) +-73.9672413354558,40.7838116138235,22C-PM-1006-03,22C,PM,10062018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9672413354558 40.7838116138235) +-73.9709738166531,40.7774102689734,14D-PM-1019-08,14D,PM,10192018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9709738166531 40.7774102689734) +-73.9677500862135,40.7726060987821,11I-AM-1012-01,11I,AM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9677500862135 40.7726060987821) +-73.9698080328304,40.7842252948542,21A-AM-1019-02,21A,AM,10192018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,Tree & ground,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9698080328304 40.7842252948542) +-73.9717135461165,40.7761780680083,13D-PM-1018-01,13D,PM,10182018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9717135461165 40.776178068008306) +-73.9556039997621,40.7977549157287,40D-AM-1013-05,40D,AM,10132018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9556039997621 40.7977549157287) +-73.9710531485298,40.7773757069445,14D-PM-1019-06,14D,PM,10192018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.97105314852982 40.777375706944504) +-73.9532427699097,40.7962643767092,40G-PM-1013-04,40G,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9532427699097 40.7962643767092) +-73.9594986107981,40.7840083040604,25I-AM-1012-03,25I,AM,10122018,3,Adult,Cinnamon,,Cinnamon+,,Above Ground,8,"on turn, see map",true,true,false,true,false,,false,false,false,false,true,true,false,false,,POINT (-73.9594986107981 40.7840083040604) +-73.9594446018346,40.7917800352042,33D-AM-1017-06,33D,AM,10172018,6,Adult,Black,,Black+,,Above Ground,10,,false,false,true,false,false,,true,true,false,false,false,false,false,true,runs from (ran into hole in tree trunk),POINT (-73.9594446018346 40.7917800352042) +-73.9748943397482,40.7703992564272,6E-AM-1014-01,06E,AM,10142018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9748943397482 40.7703992564272) +-73.9614972757332,40.7921404951324,33C-PM-1007-02,33C,PM,10072018,2,Adult,Gray,"Black, White","Gray+Black, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9614972757332 40.7921404951324) +-73.9697583235533,40.7787320391004,16D-AM-1007-05,16D,AM,10072018,5,Adult,Gray,,Gray+,didn't get a good look,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.96975832355331 40.7787320391004) +-73.9699124811406,40.7743016981538,12F-PM-1007-07,12F,PM,10072018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,true,true,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9699124811406 40.7743016981538) +-73.9799250782277,40.7676106598889,1B-AM-1012-03,01B,AM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97992507822771 40.7676106598889) +-73.9801138983722,40.7685721515635,2B-PM-1013-02,02B,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9801138983722 40.7685721515635) +-73.9707487237344,40.7800822831001,17B-PM-1012-03,17B,PM,10122018,3,Adult,Gray,White,Gray+White,,Above Ground,10,,true,true,false,false,false,2/3 chasing each other,false,false,false,false,true,false,true,false,,POINT (-73.9707487237344 40.7800822831001) +-73.9583688637255,40.791388958496,33E-PM-1012-08,33E,PM,10122018,8,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9583688637255 40.791388958496) +-73.9674978826751,40.776288410765,15G-PM-1019-10,15G,PM,10192018,10,Adult,Gray,,Gray+,,Above Ground,1,on a log,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9674978826751 40.776288410765) +-73.9735195018446,40.7787147279715,14A-AM-1014-02,14A,AM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9735195018446 40.7787147279715) +-73.9652746477521,40.7809326848536,20F-PM-1007-07,20F,PM,10072018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,cinnamon tail,Ground Plane,FALSE,,true,false,false,false,false,watching,false,false,false,true,false,false,false,true,,POINT (-73.96527464775211 40.7809326848536) +-73.9694382427984,40.7846350692923,22A-AM-1008-04,22A,AM,10082018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9694382427984 40.7846350692923) +-73.9709242364673,40.7684217215595,5I-AM-1010-04,05I,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9709242364673 40.7684217215595) +-73.963716747038,40.7892160137944,29C-AM-1007-01,29C,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.96371674703802 40.7892160137944) +-73.9771847728747,40.7695971164981,4C-AM-1006-01,04C,AM,10062018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9771847728747 40.7695971164981) +-73.9639048209454,40.7777373345558,18I-PM-1007-02,18I,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,12,,false,false,true,true,true,hanging upside down,false,false,false,false,false,false,true,false,,POINT (-73.9639048209454 40.7777373345558) +-73.9784863123685,40.7669225020831,1D-AM-1006-08,01D,AM,10062018,8,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,45,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9784863123685 40.7669225020831) +-73.9662310606968,40.7747758221226,14I-AM-1013-01,14I,AM,10132018,1,Adult,Gray,White,Gray+White,,Above Ground,10,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9662310606968 40.7747758221226) +-73.9562323455674,40.7946180656349,37E-AM-1013-02,37E,AM,10132018,2,,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9562323455674 40.79461806563491) +-73.9624296435843,40.791320813687,31C-PM-1010-02,31C,PM,10102018,2,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9624296435843 40.791320813687) +-73.9792814244424,40.770503194056,4A-AM-1007-04,04A,AM,10072018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9792814244424 40.770503194056) +-73.9714045891597,40.7715418333976,9G-AM-1007-03,09G,AM,10072018,3,Adult,Gray,Black,Gray+Black,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.97140458915972 40.7715418333976) +-73.9620719414292,40.788637452988,29D-PM-1010-02,29D,PM,10102018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9620719414292 40.788637452988) +-73.9730813162152,40.7779315720879,14B-AM-1007-02,14B,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9730813162152 40.7779315720879) +-73.9545427611477,40.7930353817441,36G-PM-1012-02,36G,PM,10122018,2,Adult,Gray,White,Gray+White,,Above Ground,10,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9545427611477 40.7930353817441) +-73.9566277721581,40.7966674587803,39D-PM-1012-04,39D,PM,10122018,4,Juvenile,Gray,White,Gray+White,,Above Ground,10,on tree trunk (descending from height of ~10 ft),false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.95662777215811 40.7966674587803) +-73.9754709117681,40.7681421869407,3E-AM-1006-08,03E,AM,10062018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9754709117681 40.7681421869407) +-73.9734741818047,40.766328451425,3H-PM-1014-03,03H,PM,10142018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9734741818047 40.766328451425) +-73.9748522796455,40.7719586621003,7D-PM-1010-01,07D,PM,10102018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,outside fenced hectare,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9748522796455 40.7719586621003) +-73.9597845469964,40.7906179303448,32E-AM-1007-11,32E,AM,10072018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9597845469964 40.7906179303448) +-73.9708225719705,40.7772497804149,14D-PM-1019-13,14D,PM,10192018,13,Adult,Gray,,Gray+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9708225719705 40.7772497804149) +-73.9536198726174,40.7980135102228,41E-AM-1007-03,41E,AM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9536198726174 40.7980135102228) +-73.9668922014699,40.7823535653774,21D-AM-1008-06,21D,AM,10082018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9668922014699 40.7823535653774) +-73.9697787673802,40.7781746195436,16D-PM-1010-05,16D,PM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9697787673802 40.7781746195436) +-73.9575258627966,40.787715550749,30H-AM-1007-03,30H,AM,10072018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9575258627966 40.787715550749) +-73.9565824187667,40.797312050952,40D-AM-1013-06,40D,AM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,true,false,true,false,true,,true,false,false,false,true,false,false,true,,POINT (-73.9565824187667 40.797312050952) +-73.9579967047318,40.7948682042252,37D-PM-1014-02,37D,PM,10142018,2,Adult,Gray,,Gray+,,Above Ground,40,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.95799670473181 40.7948682042252) +-73.9509628195532,40.7977775674178,42H-PM-1014-01,42H,PM,10142018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,2,,false,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9509628195532 40.7977775674178) +-73.9774228454023,40.7686399839016,3D-AM-1006-05,03D,AM,10062018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,"runs from (chased by boy),wary of humans in playground",POINT (-73.9774228454023 40.7686399839016) +-73.9711607544742,40.774988247642,12E-AM-1017-04,12E,AM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9711607544742 40.774988247642) +-73.9559520137172,40.7950536287174,38E-AM-1010-06,38E,AM,10102018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,branches,true,true,false,false,false,chasing and being chased by #7,false,false,false,false,true,false,true,false,,POINT (-73.95595201371721 40.7950536287174) +-73.9766477027266,40.7712737417779,6C-AM-1007-04,06C,AM,10072018,4,Adult,Gray,,Gray+,,Above Ground,20,,false,true,true,false,false,chasing #5,false,false,false,false,false,false,true,false,,POINT (-73.9766477027266 40.7712737417779) +-73.9785709201168,40.7674391934208,2C-PM-1013-02,02C,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9785709201168 40.7674391934208) +-73.9589016385889,40.7911727679625,33E-PM-1012-03,33E,PM,10122018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9589016385889 40.7911727679625) +-73.9587678566254,40.7962656030995,38C-PM-1014-01,38C,PM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,20,,false,false,true,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9587678566254 40.7962656030995) +-73.9537703231359,40.7915959393814,35I-AM-1013-01,35I,AM,10132018,1,Adult,Cinnamon,White,Cinnamon+White,White underbelly,Above Ground,18,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9537703231359 40.7915959393814) +-73.973394428186,40.7722933513053,8E-PM-1008-03,08E,PM,10082018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,in between 2 trees,false,false,false,true,true,,false,false,false,false,false,true,false,false,also being lured by mom & baby w/ food,POINT (-73.973394428186 40.7722933513053) +-73.9709991016317,40.7725756707748,10F-PM-1019-03,10F,PM,10192018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,Cinnamon head,Ground Plane,FALSE,"Behind fence, grass",false,false,false,true,false,eating (nuts),false,false,false,false,false,true,false,false,approaches (bad tourists w/ nuts),POINT (-73.9709991016317 40.772575670774806) +-73.9642967875857,40.7815652353937,21F-AM-1018-08,21F,AM,10182018,8,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9642967875857 40.7815652353937) +-73.9720050204318,40.7699419094168,7G-AM-1010-03,07G,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9720050204318 40.7699419094168) +-73.95431338448,40.7940537582585,37G-PM-1007-08,37G,PM,10072018,8,Adult,Gray,,Gray+,,,,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.95431338448 40.7940537582585) +-73.9547785081171,40.789612183711,33I-AM-1008-02,33I,AM,10082018,2,Adult,Gray,,Gray+,,Above Ground,3,edge of park @ 98th,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9547785081171 40.789612183711) +-73.975565603566,40.7738462518304,9B-AM-1010-03,09B,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,true,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.975565603566 40.7738462518304) +-73.9784685928652,40.7669924015341,1D-PM-1007-05,01D,PM,10072018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9784685928652 40.7669924015341) +-73.9609692861012,40.790502891247,31D-AM-1014-07,31D,AM,10142018,7,,Gray,,Gray+,,Ground Plane,FALSE,Crossing path to tree,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9609692861012 40.790502891247) +-73.9556177490335,40.7888569161537,32I-AM-1013-03,32I,AM,10132018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,false,watching me from tree - curious,POINT (-73.9556177490335 40.7888569161537) +-73.9569375355884,40.7935398008612,36E-AM-1013-02,36E,AM,10132018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9569375355884 40.7935398008612) +-73.9773520582734,40.7708198505781,5B-AM-1008-04,05B,AM,10082018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9773520582734 40.7708198505781) +-73.9705260103239,40.7826333686599,19A-PM-1013-04,19A,PM,10132018,4,Adult,Gray,"Black, White","Gray+Black, White",Also looks quite brown - minimal body highlight coloring - black edges,Above Ground,2,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9705260103239 40.78263336865991) +-73.9716402454355,40.7665133780672,3I-PM-1013-08,03I,PM,10132018,8,Adult,Black,,Black+,,Above Ground,2,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9716402454355 40.7665133780672) +-73.9727926335397,40.77037055775,7F-AM-1008-07,07F,AM,10082018,7,Adult,Gray,,Gray+,,Above Ground,28,next to the hole of #6,false,false,false,false,false,standing,false,false,false,false,false,false,true,false,,POINT (-73.9727926335397 40.77037055775) +-73.9590191655172,40.7926139425111,34D-AM-1008-03,34D,AM,10082018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9590191655172 40.7926139425111) +-73.9695518341907,40.7762145993937,14E-AM-1008-15,14E,AM,10082018,15,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,walking,false,false,false,false,false,false,true,false,,POINT (-73.9695518341907 40.7762145993937) +-73.9703732649257,40.7701979377103,8H-PM-1014-04,08H,PM,10142018,4,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.97037326492571 40.7701979377103) +-73.9673949458096,40.7826218539496,21D-AM-1008-04,21D,AM,10082018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9673949458096 40.78262185394961) +-73.9569670900695,40.7948792856813,37E-PM-1006-03,37E,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,me,POINT (-73.9569670900695 40.794879285681304) +-73.9671534029191,40.7810849804467,20D-AM-1007-02,20D,AM,10072018,2,Adult,Gray,,Gray+,too far to note 30',Ground Plane,FALSE,,false,false,false,false,true,quieter,false,false,false,false,true,false,false,false,,POINT (-73.9671534029191 40.7810849804467) +-73.9698044218476,40.7697007833531,7I-PM-1013-06,07I,PM,10132018,6,Adult,Cinnamon,,Cinnamon+,"""Brown"" written in as Primary",Ground Plane,FALSE,Under the tree,false,false,false,true,false,"playing,interacting with #7",false,false,false,false,true,false,false,true,,POINT (-73.9698044218476 40.7697007833531) +-73.9614218413356,40.7938945058793,34B-AM-1013-01,34B,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,hopping,false,false,false,false,true,true,false,false,,POINT (-73.9614218413356 40.7938945058793) +-73.9611985783336,40.791604823372,32C-AM-1014-06,32C,AM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9611985783336 40.791604823372) +-73.95385121459,40.7981257651433,42E-PM-1012-04,42E,PM,10122018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.95385121459 40.7981257651433) +-73.964539031099,40.7809916310012,20G-PM-1013-01,20G,PM,10132018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.964539031099 40.7809916310012) +-73.9586085858962,40.7990326758282,40A-PM-1014-04,40A,PM,10142018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (ran from path to bushes),POINT (-73.9586085858962 40.7990326758282) +-73.9767143644151,40.7684756941321,3D-AM-1006-02,03D,AM,10062018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,25,tree,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9767143644151 40.7684756941321) +-73.9691520826028,40.7717104037783,10H-AM-1014-06,10H,AM,10142018,6,,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9691520826028 40.7717104037783) +-73.9722056538718,40.7805111762703,17A-PM-1013-03,17A,PM,10132018,3,Adult,Gray,,Gray+,,Above Ground,15,tree,false,false,false,false,false,grooming! & scratching,false,false,false,false,false,false,true,false,,POINT (-73.9722056538718 40.7805111762703) +-73.9628982772673,40.7884304803386,28D-PM-1019-01,28D,PM,10192018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9628982772673 40.7884304803386) +-73.9730181306326,40.7794601322427,16A-AM-1013-02,16A,AM,10132018,2,Adult,Black,,Black+,,Above Ground,,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9730181306326 40.7794601322427) +-73.9576325087936,40.7988448745116,41B-AM-1010-04,41B,AM,10102018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9576325087936 40.7988448745116) +-73.9554415665082,40.7984201416018,41D-AM-1014-03,41D,AM,10142018,3,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9554415665082 40.7984201416018) +-73.9768173303165,40.7661261813557,1F-PM-1019-01,01F,PM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9768173303165 40.7661261813557) +-73.9577009571427,40.796126044521,38C-PM-1014-10,38C,PM,10142018,10,Juvenile,Gray,White,Gray+White,,Above Ground,10,,false,false,true,true,true,climbing (down from ~10'),false,false,false,false,false,false,false,true,,POINT (-73.9577009571427 40.796126044521) +-73.9745800592393,40.767356541975,3F-AM-1006-08,03F,AM,10062018,8,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,close to tall tree & light post,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9745800592393 40.767356541975) +-73.9565645716564,40.7959039949577,38D-PM-1006-03,38D,PM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9565645716564 40.795903994957705) +-73.9756894776708,40.7681638218212,4E-AM-1020-03,04E,AM,10202018,3,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9756894776708 40.7681638218212) +-73.9669891940463,40.7835635162331,22C-PM-1006-07,22C,PM,10062018,7,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9669891940463 40.7835635162331) +-73.9675309175947,40.7788649926486,17E-AM-1017-09,17E,AM,10172018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9675309175947 40.7788649926486) +-73.9630820577441,40.7821632293136,22G-PM-1018-01,22G,PM,10182018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.9630820577441 40.7821632293136) +-73.9590632051055,40.7963146584827,38B-AM-1019-04,38B,AM,10192018,4,Adult,Gray,,Gray+,,Above Ground,20,,false,false,false,false,false,sitting in tree,true,true,false,true,false,false,true,false,observant,POINT (-73.9590632051055 40.7963146584827) +-73.965596981561,40.7797738845824,19F-PM-1017-02,19F,PM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.965596981561 40.7797738845824) +-73.9787771053108,40.769356212275,3B-AM-1010-07,03B,AM,10102018,7,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,together w/ #8,false,false,false,true,false,false,true,false,,POINT (-73.9787771053108 40.76935621227501) +-73.9755371849972,40.7733561233828,9C-PM-1006-02,09C,PM,10062018,2,Adult,Gray,White,Gray+White,,Above Ground,15,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9755371849972 40.7733561233828) +-73.9605554843228,40.7901473714024,31E-PM-1006-09,31E,PM,10062018,9,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9605554843228 40.7901473714024) +-73.9789251806378,40.7699558513225,4B-AM-1010-02,04B,AM,10102018,2,Juvenile,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,30,,false,false,true,true,true,,true,false,false,false,false,false,true,false,,POINT (-73.9789251806378 40.7699558513225) +-73.968906907671,40.7816278267843,19C-PM-1018-07,19C,PM,10182018,7,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. Gray & White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.968906907671 40.7816278267843) +-73.9754333866435,40.7732390916138,8C-PM-1013-01,08C,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9754333866435 40.7732390916138) +-73.9589470461357,40.7912817646361,33E-AM-1014-10,33E,AM,10142018,10,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,15,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9589470461357 40.7912817646361) +-73.9715251156965,40.774621784862,11E-PM-1012-07,11E,PM,10122018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9715251156965 40.774621784862) +-73.9679833225379,40.7738547093402,12H-PM-1007-05,12H,PM,10072018,5,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9679833225379 40.7738547093402) +-73.956453902485,40.7936584431012,36F-PM-1012-05,36F,PM,10122018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.956453902485 40.7936584431012) +-73.9736997033862,40.778497952406,14A-PM-1014-02,14A,PM,10142018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9736997033862 40.778497952406) +-73.9688574856542,40.7780770207023,16E-AM-1014-10,16E,AM,10142018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9688574856542 40.7780770207023) +-73.966824257293,40.7753405377869,14H-PM-1012-04,14H,PM,10122018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.966824257293 40.7753405377869) +-73.9712863172608,40.774698758184,12E-AM-1017-01,12E,AM,10172018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9712863172608 40.774698758184) +-73.9680171894351,40.7724644426313,11I-PM-1012-07,11I,PM,10122018,7,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,burying its food into the ground,false,false,false,false,false,false,false,false,,POINT (-73.96801718943512 40.7724644426313) +-73.9765867029226,40.7674304266107,2E-PM-1014-01,02E,PM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,true,false,false,,POINT (-73.9765867029226 40.7674304266107) +-73.9646174034945,40.7781287528262,18H-AM-1018-01,18H,AM,10182018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Running from one tree to the other,true,true,false,false,false,playing?,false,false,false,false,false,false,false,false,,POINT (-73.9646174034945 40.7781287528262) +-73.9663961415789,40.7750691120996,14H-PM-1012-06,14H,PM,10122018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White","Gray & Cinnamon selected as Primary with a note that it was ""hard to tell"".",Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9663961415789 40.7750691120996) +-73.9767849679735,40.768566516928,3D-PM-1010-04,03D,PM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9767849679735 40.768566516928) +-73.957697363244,40.7997576909042,42A-PM-1014-01,42A,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,up on hind legs looking around,false,false,false,false,false,false,false,false,came to about 10' away then ran off,POINT (-73.957697363244 40.7997576909042) +-73.9767369686171,40.7735074437085,8B-PM-1012-05,08B,PM,10122018,5,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9767369686171 40.7735074437085) +-73.967458693983,40.7769922522105,15G-AM-1008-02,15G,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.967458693983 40.7769922522105) +-73.9756870789187,40.7733646782679,9B-AM-1010-09,09B,AM,10102018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,food in mouth,false,false,false,false,false,false,false,false,,POINT (-73.9756870789187 40.7733646782679) +-73.9576897478787,40.7964695328457,38C-AM-1019-02,38C,AM,10192018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9576897478787 40.7964695328457) +-73.9743060404813,40.7687901781431,5F-PM-1007-02,05F,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9743060404813 40.7687901781431) +-73.9723677854798,40.7667315410871,3H-AM-1008-04,03H,AM,10082018,4,Adult,Black,,Black+,,Above Ground,50,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9723677854798 40.7667315410871) +-73.9715921982161,40.7746153066601,11E-PM-1012-06,11E,PM,10122018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. White selected as Highlights. Made executive adjustments.,Above Ground,5,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9715921982161 40.7746153066601) +-73.9737247632185,40.7759469280872,12C-PM-1017-01,12C,PM,10172018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,"digging/burying,drinking from lake",false,false,false,false,true,false,true,false,,POINT (-73.9737247632185 40.7759469280872) +-73.9728360875598,40.7660637295671,3H-PM-1014-04,03H,PM,10142018,4,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9728360875598 40.7660637295671) +-73.9691692160865,40.7725330502929,10H-PM-1007-02,10H,PM,10072018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9691692160865 40.7725330502929) +-73.9567801028221,40.7960096659564,38D-AM-1017-01,38D,AM,10172018,1,,,,+,,Above Ground,30,,false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9567801028221 40.7960096659564) +-73.9678620840741,40.784719027304,23B-PM-1012-03,23B,PM,10122018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,true,2/3 were chasing each other,false,false,false,false,true,false,false,true,,POINT (-73.96786208407411 40.784719027304) +-73.9717515173863,40.7747999274418,11D-PM-1006-04,11D,PM,10062018,4,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9717515173863 40.7747999274418) +-73.9724618533895,40.7745021602455,11D-AM-1010-02,11D,AM,10102018,2,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,walking,false,false,false,false,true,false,false,true,,POINT (-73.9724618533895 40.7745021602455) +-73.9694681803635,40.770585795359,8I-AM-1006-06,08I,AM,10062018,6,Adult,Gray,White,Gray+White,,Above Ground,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694681803635 40.770585795359) +-73.9709797467807,40.7769095710679,14D-AM-1014-07,14D,AM,10142018,7,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9709797467807 40.7769095710679) +-73.9771924901559,40.7666722729471,1E-PM-1007-01,01E,PM,10072018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,people feeding squirrel,POINT (-73.9771924901559 40.7666722729471) +-73.9754922970511,40.7707686392991,6D-AM-1008-03,06D,AM,10082018,3,Juvenile,Gray,,Gray+,,Above Ground,10,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9754922970511 40.7707686392991) +-73.9704679459444,40.7773384236212,14D-PM-1019-10,14D,PM,10192018,10,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9704679459444 40.7773384236212) +-73.9531263214136,40.7965675089932,40F-PM-1006-01,40F,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9531263214136 40.7965675089932) +-73.9673490137465,40.7782728130401,17F-PM-1020-02,17F,PM,10202018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9673490137465 40.7782728130401) +-73.9716621112698,40.7742862219469,11E-AM-1013-01,11E,AM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9716621112698 40.7742862219469) +-73.9695117797648,40.7802675743233,18C-PM-1018-07,18C,PM,10182018,7,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9695117797648 40.780267574323304) +-73.9730284815849,40.7702462529502,7F-AM-1008-04,07F,AM,10082018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,bush,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9730284815849 40.7702462529502) +-73.9665363265054,40.7844967881001,23C-PM-1014-04,23C,PM,10142018,4,Adult,Gray,,Gray+,,Above Ground,8,,false,false,false,false,false,being chased by #3 across trees,false,false,false,false,false,false,false,false,,POINT (-73.9665363265054 40.7844967881001) +-73.9533645762606,40.7983709215535,42F-AM-1019-01,42F,AM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,true,false,false,true,runs from (me),POINT (-73.9533645762606 40.7983709215535) +-73.9719194877439,40.7748000962909,11D-AM-1010-04,11D,AM,10102018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9719194877439 40.7748000962909) +-73.9786310308892,40.7669349368183,1D-AM-1006-05,01D,AM,10062018,5,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,false,,POINT (-73.9786310308892 40.7669349368183) +-73.965738547469,40.7886962740167,27B-PM-1006-01,27B,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,By large tree,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.965738547469 40.7886962740167) +-73.9562177305881,40.7983413276331,41C-PM-1007-03,41C,PM,10072018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9562177305881 40.7983413276331) +-73.9663124560664,40.779544003786,18F-PM-1008-02,18F,PM,10082018,2,Adult,Gray,,Gray+,,,,,false,false,false,false,false,hopping around,false,false,false,false,false,false,false,true,,POINT (-73.9663124560664 40.779544003786) +-73.9531965469704,40.7947437983977,38G-PM-1020-11,38G,PM,10202018,11,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,true,true,false,,POINT (-73.9531965469704 40.7947437983977) +-73.980033740004,40.7683608292333,2B-PM-1013-04,02B,PM,10132018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.980033740004 40.7683608292333) +-73.9564777440695,40.7993068355401,42C-AM-1007-01,42C,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,nut in mouth,false,false,false,false,false,false,false,true,,POINT (-73.9564777440695 40.7993068355401) +-73.9745818450109,40.7654498873627,1G-AM-1006-01,01G,AM,10062018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9745818450109 40.7654498873627) +-73.9727310397798,40.7787016773517,15B-PM-1017-02,15B,PM,10172018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,tree,false,false,true,true,true,"digging,chewing on tree—has nut in mouth!",false,false,false,false,false,false,false,true,,POINT (-73.97273103977982 40.7787016773517) +-73.963623175585,40.7927451068919,32A-PM-1013-04,32A,PM,10132018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.963623175585 40.7927451068919) +-73.9636740170308,40.7903538224977,30B-AM-1007-12,30B,AM,10072018,12,Adult,Gray,,Gray+,,Above Ground,4,,false,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.96367401703081 40.79035382249771) +-73.9728654439465,40.7724853142211,9E-AM-1008-04,09E,AM,10082018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9728654439465 40.7724853142211) +-73.9611355303487,40.793069353224,34C-AM-1007-02,34C,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,40,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9611355303487 40.793069353224) +-73.9632301034883,40.7925707244111,32A-PM-1013-06,32A,PM,10132018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9632301034883 40.7925707244111) +-73.9788379085607,40.7683896583055,2C-PM-1013-06,02C,PM,10132018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,cleaning face & tail,false,false,false,false,true,true,false,false,,POINT (-73.9788379085607 40.7683896583055) +-73.9700785314537,40.777714111862,15D-AM-1007-01,15D,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9700785314537 40.777714111862) +-73.9573325001041,40.7874662104558,30H-AM-1007-01,30H,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9573325001041 40.7874662104558) +-73.9708032298419,40.7784265674544,15C-AM-1010-02,15C,AM,10102018,2,Adult,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,nest building,false,false,false,false,false,false,true,false,,POINT (-73.9708032298419 40.77842656745441) +-73.9700263936574,40.7699335098581,7H-PM-1006-07,07H,PM,10062018,7,Adult,Gray,,Gray+,,Above Ground,15,,false,true,true,false,false,playing w/ #6,false,false,false,false,false,false,true,false,,POINT (-73.9700263936574 40.7699335098581) +-73.9690638424196,40.7713869295685,9H-AM-1006-06,09H,AM,10062018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,true,false,true,false,,POINT (-73.9690638424196 40.7713869295685) +-73.9587183039085,40.7909209137969,32E-PM-1017-02,32E,PM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9587183039085 40.7909209137969) +-73.9688773306324,40.7766669852358,15F-AM-1007-05,15F,AM,10072018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9688773306324 40.7766669852358) +-73.9676191846985,40.777641740817,16F-PM-1013-04,16F,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9676191846985 40.777641740817) +-73.9681671864047,40.7753770538635,14G-AM-1012-04,14G,AM,10122018,4,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9681671864047 40.7753770538635) +-73.9731925179247,40.7748962746181,11D-PM-1006-02,11D,PM,10062018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9731925179247 40.7748962746181) +-73.9801956082236,40.767836440957,1B-AM-1012-08,01B,AM,10122018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9801956082236 40.767836440957) +-73.9573119777312,40.7875347862766,30H-AM-1007-02,30H,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,following #1,false,false,false,false,true,false,false,false,,POINT (-73.9573119777312 40.7875347862766) +-73.9769520212123,40.774006725863,9A-AM-1013-01,09A,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9769520212123 40.774006725863) +-73.9724879969884,40.771098202397,8F-PM-1012-07,08F,PM,10122018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,17,,false,false,true,false,false,gathering,false,false,false,false,false,false,false,false,,POINT (-73.9724879969884 40.771098202397) +-73.9613276802049,40.7943813964442,35B-PM-1013-03,35B,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,threatened by approaching dog (dog #1),false,false,false,false,false,false,false,true,runs from (dog),POINT (-73.96132768020492 40.7943813964442) +-73.9551370586201,40.7946465469021,38F-AM-1018-06,38F,AM,10182018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,hopped away,false,false,false,false,false,false,false,true,,POINT (-73.95513705862011 40.7946465469021) +-73.9563720614251,40.7879453306251,31I-PM-1019-01,31I,PM,10192018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9563720614251 40.7879453306251) +-73.9594204646985,40.7905923765213,32E-PM-1017-11,32E,PM,10172018,11,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9594204646985 40.7905923765213) +-73.9704328573603,40.7739347247552,11F-AM-1013-03,11F,AM,10132018,3,Adult,Gray,,Gray+,,Above Ground,30,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9704328573603 40.7739347247552) +-73.9747592855901,40.7763762870413,12A-PM-1013-01,12A,PM,10132018,1,Adult,Gray,,Gray+,But it was kind of dark?,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9747592855901 40.7763762870413) +-73.9711865134364,40.7785039981892,15C-AM-1010-03,15C,AM,10102018,3,Adult,Gray,,Gray+,,Above Ground,6,,false,false,false,true,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9711865134364 40.7785039981892) +-73.9761375729505,40.7662231892125,1F-PM-1019-02,01F,PM,10192018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,,false,false,true,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9761375729505 40.7662231892125) +-73.9588414980489,40.7953525481367,37C-AM-1012-01,37C,AM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,caching,false,false,false,false,false,false,false,true,,POINT (-73.9588414980489 40.7953525481367) +-73.9743970455533,40.7687880243986,5F-PM-1007-01,05F,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9743970455533 40.7687880243986) +-73.9686551213305,40.7728617837174,11H-PM-1013-04,11H,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,true,false,,POINT (-73.9686551213305 40.7728617837174) +-73.9708564226824,40.7726219968014,10F-PM-1019-09,10F,PM,10192018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Across Arbor path into hill w/ bushes,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9708564226824 40.7726219968014) +-73.9787552947847,40.7690779628762,3B-AM-1010-06,03B,AM,10102018,6,Adult,Gray,,Gray+,,Above Ground,20,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9787552947847 40.7690779628762) +-73.9565738895972,40.7900160952624,32H-AM-1010-01,32H,AM,10102018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,not sure; walking-stop-walking-stop,false,false,false,false,false,false,true,false,did seem to observe me for a moment,POINT (-73.9565738895972 40.7900160952624) +-73.9808517324721,40.7683154647217,1A-PM-1014-01,01A,PM,10142018,1,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,6,,false,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9808517324721 40.7683154647217) +-73.9604476047877,40.7938014328732,35C-AM-1007-03,35C,AM,10072018,3,Adult,,,+,,Above Ground,40,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9604476047877 40.7938014328732) +-73.9801343393329,40.7691512453402,3A-AM-1012-01,03A,AM,10122018,1,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. Cinnamon & White selected as Highlights. Made executive adjustments.,Above Ground,1,,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9801343393329 40.7691512453402) +-73.9680741975294,40.7847036778165,23B-PM-1012-04,23B,PM,10122018,4,Adult,Gray,White,Gray+White,,Above Ground,20,,false,false,false,false,false,watching me - didn't move,false,false,false,false,true,false,false,true,,POINT (-73.9680741975294 40.7847036778165) +-73.9721497679014,40.7716160199386,8F-PM-1012-02,08F,PM,10122018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9721497679014 40.7716160199386) +-73.9578981223015,40.7989967754358,41B-AM-1010-03,41B,AM,10102018,3,Adult,,,+,,Above Ground,60,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9578981223015 40.7989967754358) +-73.9729190572117,40.770018150905,6F-PM-1008-03,06F,PM,10082018,3,Adult,Gray,,Gray+,,Above Ground,50,top of tree,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9729190572117 40.770018150905) +-73.9785829546046,40.7719652299132,6A-PM-1012-02,06A,PM,10122018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9785829546046 40.7719652299132) +-73.9729603550254,40.7660215710657,3H-AM-1008-06,03H,AM,10082018,6,Adult,Black,,Black+,beauty!,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,true,,POINT (-73.9729603550254 40.7660215710657) +-73.9704339422613,40.7740149529644,11F-PM-1006-03,11F,PM,10062018,3,Adult,Gray,,Gray+,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9704339422613 40.7740149529644) +-73.9704592500888,40.772962887933,10G-AM-1006-03,10G,AM,10062018,3,Juvenile,Gray,White,Gray+White,tuft on butt,Above Ground,10,,false,false,true,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9704592500888 40.772962887933) +-73.958713848373,40.7963918051751,38C-PM-1014-02,38C,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.958713848373 40.7963918051751) +-73.9583762071264,40.7852226065643,27I-PM-1020-03,27I,PM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,true,false,false,begging for food; on hind legs,POINT (-73.9583762071264 40.7852226065643) +-73.9768268467857,40.7714608041933,6B-PM-1017-02,06B,PM,10172018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9768268467857 40.7714608041933) +-73.972010921173,40.7701626919216,7G-AM-1010-09,07G,AM,10102018,9,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.972010921173 40.7701626919216) +-73.9777206733344,40.7668595585487,1D-PM-1007-07,01D,PM,10072018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,lying down,false,false,false,false,false,false,true,false,,POINT (-73.9777206733344 40.7668595585487) +-73.9777879635216,40.769359455673,4C-AM-1006-03,04C,AM,10062018,3,Juvenile,Gray,,Gray+,,Above Ground,10,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9777879635216 40.769359455673) +-73.9665309689616,40.7775271020244,16G-AM-1010-04,16G,AM,10102018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9665309689616 40.7775271020244) +-73.9588361742943,40.791115225155,33E-PM-1012-02,33E,PM,10122018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9588361742943 40.791115225155) +-73.9668964315686,40.7777577990886,16G-AM-1010-01,16G,AM,10102018,1,Adult,Gray,White,Gray+White,,Above Ground,3,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9668964315686 40.7777577990886) +-73.9555724351776,40.7967602498249,39E-AM-1018-03,39E,AM,10182018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9555724351776 40.7967602498249) +-73.9596949258862,40.7900079479217,31E-PM-1006-04,31E,PM,10062018,4,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9596949258862 40.7900079479217) +-73.9725947179952,40.7794481577234,16A-AM-1013-01,16A,AM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9725947179952 40.7794481577234) +-73.9755192076934,40.7664413570796,2F-PM-1014-06,02F,PM,10142018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9755192076934 40.7664413570796) +-73.9686907918759,40.7839462261858,22B-AM-1013-03,22B,AM,10132018,3,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9686907918759 40.7839462261858) +-73.9809446489564,40.7685032165879,2A-PM-1019-03,02A,PM,10192018,3,Juvenile,Gray,White,Gray+White,,Above Ground,15,in tree!,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9809446489564 40.7685032165879) +-73.959701727877,40.790660026971,32E-AM-1007-03,32E,AM,10072018,3,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.959701727877 40.790660026971) +-73.9708175461804,40.7759228565501,13E-AM-1017-10,13E,AM,10172018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9708175461804 40.7759228565501) +-73.9683598086625,40.7811150451315,19D-PM-1008-01,19D,PM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9683598086625 40.7811150451315) +-73.9588689820908,40.7992384137972,40A-PM-1014-03,40A,PM,10142018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (ran from base of tree into bushes),POINT (-73.9588689820908 40.799238413797205) +-73.9720323148189,40.7729703459618,10E-PM-1007-01,10E,PM,10072018,1,Adult,Gray,,Gray+,,Above Ground,35,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9720323148189 40.7729703459618) +-73.9683653449966,40.7719661592206,10I-AM-1010-01,10I,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9683653449966 40.7719661592206) +-73.9590551473416,40.7891607060794,31F-PM-1007-02,31F,PM,10072018,2,Adult,Gray,,Gray+,,Above Ground,2,tree trunk,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.95905514734162 40.7891607060794) +-73.9587787592751,40.7981699014259,40A-AM-1010-01,40A,AM,10102018,1,Juvenile,Gray,,Gray+,,Above Ground,30,bottom of great hill,false,false,true,false,false,,false,false,false,false,false,false,false,false,climbing up a tree,POINT (-73.9587787592751 40.7981699014259) +-73.9682278905989,40.7733027508057,11H-PM-1013-02,11H,PM,10132018,2,Adult,Gray,Black,Gray+Black,,Above Ground,10,,false,false,false,false,false,digging,false,false,false,false,false,false,true,false,,POINT (-73.9682278905989 40.7733027508057) +-73.9683066605832,40.7781213930544,16E-PM-1018-03,16E,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9683066605832 40.7781213930544) +-73.973552877209,40.7715638228207,7E-PM-1013-01,07E,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Ground & Tree Base,true,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.973552877209 40.7715638228207) +-73.9684752839242,40.7765816261518,15F-AM-1007-01,15F,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,"Listed as primary white with cinnamon highlights, I changed to Gray/cinnamon - JO",Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,true,,POINT (-73.9684752839242 40.7765816261518) +-73.9791141532217,40.7714888835416,5A-AM-1006-04,05A,AM,10062018,4,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9791141532217 40.77148888354161) +-73.9790203973636,40.7688837114832,3B-AM-1010-02,03B,AM,10102018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,together w/ #3,false,false,false,false,false,false,false,true,,POINT (-73.9790203973636 40.7688837114832) +-73.9729297485331,40.7673278541438,4H-AM-1006-03,04H,AM,10062018,3,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,met #4 while foraging and briefly tussled,false,false,false,false,false,false,true,false,,POINT (-73.9729297485331 40.7673278541438) +-73.9755643404768,40.7697569149388,5E-PM-1012-03,05E,PM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9755643404768 40.7697569149388) +-73.9726699686943,40.7701123791223,7F-AM-1008-01,07F,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,under bench,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9726699686943 40.7701123791223) +-73.9569811285656,40.793091234605,35F-PM-1012-02,35F,PM,10122018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9569811285656 40.793091234605) +-73.9630054996358,40.7905225147022,30C-PM-1008-01,30C,PM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9630054996358 40.7905225147022) +-73.9657203199746,40.775173008911,14I-PM-1018-02,14I,PM,10182018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9657203199746 40.775173008911) +-73.9706949930717,40.772362045852,10G-AM-1006-08,10G,AM,10062018,8,Adult,Black,Cinnamon,Black+Cinnamon,,Above Ground,3,,false,false,false,true,false,,false,false,false,true,true,false,true,false,,POINT (-73.9706949930717 40.772362045852) +-73.9545912098958,40.7948301813102,38F-PM-1013-06,38F,PM,10132018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9545912098958 40.7948301813102) +-73.972087127535,40.776237268628,13C-AM-1010-01,13C,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.972087127535 40.776237268628) +-73.95827701417,40.7856610238891,28I-PM-1007-01,28I,PM,10072018,1,Adult,Gray,,Gray+,,Above Ground,20,,true,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.95827701417 40.7856610238891) +-73.9619856085821,40.7919516520091,32C-PM-1013-08,32C,PM,10132018,8,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9619856085821 40.7919516520091) +-73.969532160039,40.7822616641357,20B-PM-1013-01,20B,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.969532160039 40.7822616641357) +-73.9587459136391,40.7982497351812,40B-PM-1014-05,40B,PM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9587459136391 40.7982497351812) +-73.9673803508629,40.7785245025508,17F-AM-1007-01,17F,AM,10072018,1,Adult,Gray,,Gray+,,Above Ground,18,,false,false,true,true,false,,false,false,false,true,false,false,true,false,,POINT (-73.9673803508629 40.7785245025508) +-73.9579865329778,40.794906535675,37D-PM-1014-03,37D,PM,10142018,3,Adult,Gray,,Gray+,,Above Ground,40,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9579865329778 40.794906535675) +-73.9699369796844,40.7720350191273,10G-PM-1017-04,10G,PM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9699369796844 40.7720350191273) +-73.9667073186959,40.7840581361598,23C-PM-1014-01,23C,PM,10142018,1,Adult,Gray,,Gray+,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.96670731869591 40.7840581361598) +-73.966590487009,40.7802469052891,19E-PM-1018-02,19E,PM,10182018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,true,false,false,false,false,,POINT (-73.96659048700901 40.7802469052891) +-73.96193040894,40.792045169318,32C-PM-1013-10,32C,PM,10132018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.96193040894 40.792045169318) +-73.9522704511969,40.7965668878961,41G-AM-1013-01,41G,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9522704511969 40.7965668878961) +-73.9589670987899,40.7952127039287,37C-AM-1012-04,37C,AM,10122018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon flanks,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9589670987899 40.7952127039287) +-73.9668230576555,40.7870637233327,25B-PM-1007-02,25B,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9668230576555 40.7870637233327) +-73.9599911537509,40.7914452542845,33D-AM-1017-04,33D,AM,10172018,4,Adult,Black,,Black+,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9599911537509 40.7914452542845) +-73.9756273257684,40.7706539186221,6D-AM-1008-04,06D,AM,10082018,4,Adult,Gray,,Gray+,,Above Ground,,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9756273257684 40.7706539186221) +-73.9775865217038,40.7704928300008,5C-PM-1010-01,05C,PM,10102018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9775865217038 40.7704928300008) +-73.9727323797981,40.7669035463955,3H-AM-1008-03,03H,AM,10082018,3,Adult,Gray,,Gray+,,Above Ground,40,building nest,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9727323797981 40.7669035463955) +-73.9756105226696,40.7696531972655,5D-AM-1020-03,05D,AM,10202018,3,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9756105226696 40.7696531972655) +-73.9565151662506,40.7946647987447,37E-PM-1006-07,37E,PM,10062018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,me,POINT (-73.9565151662506 40.7946647987447) +-73.9577297187155,40.799225295679,41B-AM-1010-08,41B,AM,10102018,8,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,20,,false,false,true,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9577297187155 40.799225295679) +-73.9698446365683,40.7842607168578,22A-AM-1008-01,22A,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,on fence,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9698446365683 40.7842607168578) +-73.9569896638974,40.7911914507504,33G-PM-1006-02,33G,PM,10062018,2,Adult,Gray,,Gray+,my favorite,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,engaged w/ me,POINT (-73.9569896638974 40.7911914507504) +-73.969517504176,40.7820741344297,20B-PM-1013-02,20B,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.969517504176 40.7820741344297) +-73.9679156307975,40.7745269360259,13H-PM-1010-06,13H,PM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9679156307975 40.7745269360259) +-73.9526681107152,40.7977012009146,42F-PM-1017-01,42F,PM,10172018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,playing,false,false,false,false,false,false,true,false,,POINT (-73.9526681107152 40.7977012009146) +-73.9605347462123,40.7942075448387,35B-AM-1010-04,35B,AM,10102018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,lawn,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9605347462123 40.7942075448387) +-73.9768544488742,40.7680069500977,3D-AM-1006-07,03D,AM,10062018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,running (with food in mouth),false,false,false,false,false,false,true,false,,POINT (-73.9768544488742 40.7680069500977) +-73.9653343572865,40.7775286924617,17H-PM-1007-01,17H,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,false,true,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.9653343572865 40.7775286924617) +-73.9691318044969,40.7709801974696,9I-AM-1014-05,09I,AM,10142018,5,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9691318044969 40.7709801974696) +-73.9686999860219,40.7844014735136,22B-PM-1014-03,22B,PM,10142018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9686999860219 40.7844014735136) +-73.9599419926299,40.7972774728811,38A-AM-1019-01,38A,AM,10192018,1,Adult,Gray,,Gray+,,Above Ground,3,,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9599419926299 40.7972774728811) +-73.9755923256429,40.7672967972471,3F-PM-1013-02,03F,PM,10132018,2,Adult,Black,Gray,Black+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.97559232564292 40.7672967972471) +-73.9674603784345,40.7749493803168,13H-PM-1010-01,13H,PM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9674603784345 40.774949380316805) +-73.9600963639087,40.7934962325313,34C-AM-1007-01,34C,AM,10072018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,dog,POINT (-73.9600963639087 40.7934962325313) +-73.96388775887,40.7915477304252,31A-AM-1010-02,31A,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,scratching,false,false,false,false,false,false,true,false,,POINT (-73.96388775887 40.7915477304252) +-73.964274290774,40.7795319556023,19H-AM-1010-03,19H,AM,10102018,3,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,false,ran from human w/ dog,POINT (-73.964274290774 40.7795319556023) +-73.9596820155238,40.7932886803231,34D-PM-1007-03,34D,PM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9596820155238 40.7932886803231) +-73.9613347295946,40.7938900965153,34B-AM-1013-02,34B,AM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9613347295946 40.7938900965153) +-73.9721448879766,40.7762112840981,13C-AM-1010-02,13C,AM,10102018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,7,,false,false,true,false,false,burying,false,false,false,false,false,false,true,false,,POINT (-73.9721448879766 40.7762112840981) +-73.9736489041867,40.7712143385426,7E-AM-1006-04,07E,AM,10062018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,under a tree,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9736489041867 40.7712143385426) +-73.9710843362124,40.7679739601336,5I-AM-1010-03,05I,AM,10102018,3,Adult,Gray,,Gray+,,Above Ground,3,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9710843362124 40.7679739601336) +-73.9663297144622,40.7837932023685,22D-PM-1012-03,22D,PM,10122018,3,Adult,Gray,"Black, White","Gray+Black, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9663297144622 40.7837932023685) +-73.9674931070324,40.7783693690954,17F-AM-1007-04,17F,AM,10072018,4,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,4,,false,false,false,true,false,chilling,true,false,false,false,false,false,true,false,,POINT (-73.9674931070324 40.7783693690954) +-73.9657958433575,40.7763496875058,15H-AM-1013-01,15H,AM,10132018,1,Adult,Gray,White,Gray+White,,Above Ground,50,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9657958433575 40.7763496875058) +-73.9546780963388,40.7903216522111,34I-AM-1012-03,34I,AM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,false,nut in mouth,false,false,false,false,false,false,true,false,,POINT (-73.9546780963388 40.7903216522111) +-73.9719068478565,40.7789062312585,15B-AM-1014-02,15B,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,false,false,false,"grooming,scratching",false,false,false,false,false,false,true,false,,POINT (-73.9719068478565 40.7789062312585) +-73.9805927710872,40.7679989116642,1B-PM-1019-07,01B,PM,10192018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9805927710872 40.7679989116642) +-73.9596083366477,40.7949526729608,36C-PM-1013-05,36C,PM,10132018,5,Adult,Cinnamon,,Cinnamon+,"""Warm brown"" written in for Primary.",Ground Plane,FALSE,Ran across path in front of people,true,false,false,true,true,,false,false,false,false,true,false,true,true,,POINT (-73.9596083366477 40.7949526729608) +-73.9619786450142,40.7919876274548,32C-PM-1013-09,32C,PM,10132018,9,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9619786450142 40.7919876274548) +-73.9584950620879,40.7902770710643,32F-PM-1008-03,32F,PM,10082018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,true,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9584950620879 40.7902770710643) +-73.9766317094163,40.7734230472026,8B-AM-1007-05,08B,AM,10072018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9766317094163 40.7734230472026) +-73.9595222999173,40.7833202577782,25I-AM-1012-02,25I,AM,10122018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,31,on tree,true,true,false,false,false,,false,false,false,true,true,false,true,false,,POINT (-73.9595222999173 40.7833202577782) +-73.9726920847792,40.7794117463889,16A-PM-1019-02,16A,PM,10192018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,scared by dog,POINT (-73.9726920847792 40.7794117463889) +-73.9663168490265,40.7825083721362,21D-AM-1008-01,21D,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,true,true,false,true,false,,POINT (-73.9663168490265 40.7825083721362) +-73.9693876553956,40.7707232748402,8I-AM-1006-02,08I,AM,10062018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9693876553956 40.7707232748402) +-73.9806905259671,40.7681152210858,1A-AM-1007-03,01A,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,looking in bush,false,false,false,false,false,false,true,false,,POINT (-73.9806905259671 40.7681152210858) +-73.9801619956135,40.7678576697542,1B-AM-1012-09,01B,AM,10122018,9,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9801619956135 40.7678576697542) +-73.954767265558,40.7973243644491,40E-PM-1017-03,40E,PM,10172018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.954767265558 40.7973243644491) +-73.9713968424625,40.7740390188527,11E-PM-1012-03,11E,PM,10122018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9713968424625 40.7740390188527) +-73.9621253644004,40.7912082086879,31C-AM-1017-01,31C,AM,10172018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,8,,true,false,true,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9621253644004 40.7912082086879) +-73.9696274291417,40.7691980808067,7I-PM-1013-03,07I,PM,10132018,3,Adult,Black,Gray,Black+Gray,,Ground Plane,FALSE,Trash bins,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9696274291417 40.7691980808067) +-73.9622050752008,40.7886373772305,29D-PM-1010-01,29D,PM,10102018,1,Juvenile,Gray,White,Gray+White,,Above Ground,10,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9622050752008 40.7886373772305) +-73.9674556940019,40.7875399402461,26A-AM-1014-02,26A,AM,10142018,2,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,could not get close due to fences,POINT (-73.9674556940019 40.7875399402461) +-73.9690079924094,40.7845473505585,22A-AM-1008-06,22A,AM,10082018,6,Adult,Gray,,Gray+,,Above Ground,30,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9690079924094 40.7845473505585) +-73.9689703880705,40.7712025611298,9I-PM-1010-02,09I,PM,10102018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",standard coloration,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.96897038807052 40.7712025611298) +-73.9616944195776,40.7927250423024,33B-PM-1010-02,33B,PM,10102018,2,Adult,,,+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9616944195776 40.7927250423024) +-73.9758375334287,40.7676793289765,3E-AM-1006-06,03E,AM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,14,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9758375334287 40.7676793289765) +-73.974382557804,40.7674812627373,3F-AM-1006-10,03F,AM,10062018,10,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,6,on fence,false,false,true,false,false,,false,false,false,false,false,false,false,false,clueless,POINT (-73.974382557804 40.7674812627373) +-73.9550131837533,40.7958617258176,39E-PM-1013-02,39E,PM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,Gray tail & butt,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,true,false,,POINT (-73.9550131837533 40.7958617258176) +-73.9762974698771,40.7740076116964,9B-PM-1013-06,09B,PM,10132018,6,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9762974698771 40.7740076116964) +-73.9719038949487,40.7703533492482,7G-AM-1010-05,07G,AM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9719038949487 40.7703533492482) +-73.964868521585,40.7821064183815,22F-PM-1014-01,22F,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.964868521585 40.7821064183815) +-73.979381450452,40.7709033697887,4A-PM-1007-01,04A,PM,10072018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,true,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.979381450452 40.770903369788705) +-73.9714295102249,40.776954371947,14D-PM-1019-02,14D,PM,10192018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9714295102249 40.776954371947) +-73.9748635473782,40.7742591029151,10C-AM-1018-02,10C,AM,10182018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,sitting in the sun,false,false,false,false,false,false,true,false,,POINT (-73.9748635473782 40.7742591029151) +-73.9584561537421,40.7911211164754,33F-PM-1012-02,33F,PM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9584561537421 40.7911211164754) +-73.974275954985,40.7754723879307,11B-AM-1007-02,11B,AM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.974275954985 40.7754723879307) +-73.9767590273554,40.7717561807266,6B-PM-1017-07,06B,PM,10172018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9767590273554 40.7717561807266) +-73.95744422055,40.7961046528557,38D-AM-1017-04,38D,AM,10172018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.95744422055 40.7961046528557) +-73.9693338657183,40.7757055884538,13F-PM-1008-05,13F,PM,10082018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,tree trunk,true,false,false,true,true,,true,false,false,false,true,false,false,false,,POINT (-73.9693338657183 40.77570558845381) +-73.9649823687651,40.7763395359636,16I-AM-1008-02,16I,AM,10082018,2,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,1,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9649823687651 40.7763395359636) +-73.9710221361528,40.7724939691584,10F-PM-1019-01,10F,PM,10192018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon head & stripe,Above Ground,2,"Behind fence, tree trunk",false,false,true,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9710221361528 40.7724939691584) +-73.9647219419257,40.7812084402932,20F-PM-1007-03,20F,PM,10072018,3,Adult,Gray,White,Gray+White,gray on haunches white on tail,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9647219419257 40.7812084402932) +-73.9589475065438,40.7934846881536,35D-PM-1013-06,35D,PM,10132018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9589475065438 40.7934846881536) +-73.9548207106339,40.7946991812402,38F-PM-1013-04,38F,PM,10132018,4,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9548207106339 40.7946991812402) +-73.976869549792,40.7706982454723,5C-AM-1006-04,05C,AM,10062018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,12,thin branch of tree,false,false,false,false,false,relaxing,false,false,false,true,false,false,true,false,,POINT (-73.976869549792 40.7706982454723) +-73.9658747245917,40.7754033737532,14I-PM-1018-01,14I,PM,10182018,1,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,Fallen branch,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9658747245917 40.7754033737532) +-73.9619016393127,40.7925160126921,33B-PM-1010-06,33B,PM,10102018,6,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9619016393127 40.7925160126921) +-73.9743877909071,40.7754706115974,11B-AM-1007-03,11B,AM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9743877909071 40.7754706115974) +-73.9612352611518,40.7944813634744,35B-AM-1010-02,35B,AM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,landscaped area,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9612352611518 40.7944813634744) +-73.9646495450499,40.7791203699027,19H-PM-1008-01,19H,PM,10082018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9646495450499 40.7791203699027) +-73.9675697600155,40.7766797414463,15G-PM-1019-06,15G,PM,10192018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,scratching!,false,false,false,false,false,false,false,false,,POINT (-73.9675697600155 40.7766797414463) +-73.9676529780724,40.7823206990549,21D-PM-1008-03,21D,PM,10082018,3,Adult,Gray,White,Gray+White,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9676529780724 40.7823206990549) +-73.9800271487863,40.7702554167042,4A-PM-1007-06,04A,PM,10072018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,A rock,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9800271487863 40.7702554167042) +-73.9561076824455,40.7981145780509,40D-AM-1013-01,40D,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9561076824455 40.7981145780509) +-73.9599424115626,40.7957472585327,37B-AM-1018-05,37B,AM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9599424115626 40.7957472585327) +-73.9695150319891,40.782613519363,20B-PM-1013-04,20B,PM,10132018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,chased a bird carrying massive wad of grass,false,false,false,false,true,false,false,false,,POINT (-73.9695150319891 40.782613519363) +-73.9766195697096,40.7661907261547,1F-AM-1010-04,01F,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9766195697096 40.7661907261547) +-73.9744368038675,40.7674281958115,3G-PM-1013-03,03G,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,runs from (climbed tree to run from),POINT (-73.97443680386752 40.7674281958115) +-73.9700101107283,40.7696729501144,7I-PM-1013-08,07I,PM,10132018,8,Adult,Black,,Black+,,Above Ground,4,,false,false,true,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9700101107283 40.7696729501144) +-73.9685087288072,40.7779068128051,16E-AM-1014-01,16E,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,burying food,false,false,false,false,false,true,false,false,,POINT (-73.9685087288072 40.7779068128051) +-73.9735533713513,40.7690605609001,5F-PM-1007-05,05F,PM,10072018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9735533713513 40.7690605609001) +-73.9796985410897,40.7678612835067,1B-AM-1012-01,01B,AM,10122018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9796985410897 40.7678612835067) +-73.9781033448468,40.7666724066213,1D-AM-1006-03,01D,AM,10062018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9781033448468 40.7666724066213) +-73.959127912788,40.7921197130403,33E-AM-1014-13,33E,AM,10142018,13,Adult,Black,Cinnamon,Black+Cinnamon,Cinnamon on the tail,Ground Plane,FALSE,,false,false,false,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.959127912788 40.7921197130403) +-73.9579097104326,40.7972273394716,39C-AM-1017-03,39C,AM,10172018,3,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9579097104326 40.7972273394716) +-73.9754802138871,40.773300804412,9C-PM-1006-03,09C,PM,10062018,3,Adult,Gray,White,Gray+White,,Above Ground,15,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9754802138871 40.773300804412) +-73.9691424997919,40.780542852496,18C-AM-1018-02,18C,AM,10182018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9691424997919 40.780542852496) +-73.9713680837672,40.7771661508364,14D-PM-1019-03,14D,PM,10192018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9713680837672 40.77716615083641) +-73.9617594316752,40.7946803725236,35A-AM-1014-01,35A,AM,10142018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9617594316752 40.7946803725236) +-73.9660267365885,40.776444395505,16H-AM-1007-01,16H,AM,10072018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9660267365885 40.776444395505) +-73.9743393747021,40.7676346798325,3F-AM-1006-12,03F,AM,10062018,12,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9743393747021 40.7676346798325) +-73.9703571491616,40.7678515625131,5I-AM-1010-06,05I,AM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9703571491616 40.7678515625131) +-73.972248505758,40.7659043693008,3I-PM-1013-01,03I,PM,10132018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.972248505758 40.765904369300806) +-73.9694805745522,40.7743556902843,12F-AM-1020-01,12F,AM,10202018,1,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,17,Tree,false,false,false,false,false,jumping,false,false,false,false,false,false,false,false,,POINT (-73.9694805745522 40.7743556902843) +-73.970138810251,40.770579297644,8H-PM-1014-02,08H,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,"froze & watched me,then went back to eating",POINT (-73.970138810251 40.770579297644) +-73.9724947710698,40.7696619340886,6G-AM-1008-05,06G,AM,10082018,5,Adult,Gray,,Gray+,,Above Ground,30,branch,false,false,true,false,false,sitting,false,false,false,false,false,false,true,false,,POINT (-73.9724947710698 40.7696619340886) +-73.9714744574918,40.7736266158925,10E-AM-1010-01,10E,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9714744574918 40.7736266158925) +-73.9701505245419,40.768998364571,6I-PM-1013-07,06I,PM,10132018,7,Adult,Cinnamon,,Cinnamon+,,Above Ground,11,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9701505245419 40.768998364571004) +-73.9613127978423,40.7929321504568,33B-AM-1010-04,33B,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9613127978423 40.7929321504568) +-73.9639828431368,40.7910151996207,30B-PM-1019-09,30B,PM,10192018,9,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9639828431368 40.7910151996207) +-73.9712454251679,40.7674262749891,5I-PM-1008-02,05I,PM,10082018,2,Adult,Black,,Black+,,Ground Plane,FALSE,crossing pavement in front of arsenal,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9712454251679 40.7674262749891) +-73.9749469566854,40.7667805367199,2F-PM-1014-10,02F,PM,10142018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9749469566854 40.7667805367199) +-73.9572383478774,40.7876857380722,30H-PM-1006-01,30H,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9572383478774 40.7876857380722) +-73.9755459090534,40.7680866624003,4E-AM-1020-04,04E,AM,10202018,4,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,false,chillin',false,false,false,false,false,false,false,true,,POINT (-73.9755459090534 40.7680866624003) +-73.9591513028486,40.7835978067328,25I-PM-1007-01,25I,PM,10072018,1,Adult,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9591513028486 40.7835978067328) +-73.9615643742864,40.7944678447843,35B-PM-1013-06,35B,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,true,false,false,chased by dog #2,true,false,false,false,false,false,false,true,runs from (dog),POINT (-73.9615643742864 40.7944678447843) +-73.9664536611195,40.7827694131949,21D-AM-1008-03,21D,AM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9664536611195 40.7827694131949) +-73.970996228532,40.7715540712285,9G-PM-1007-02,09G,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.970996228532 40.7715540712285) +-73.9708640291801,40.7781721063527,15C-AM-1010-01,15C,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9708640291801 40.7781721063527) +-73.9744226682925,40.7755625717273,11B-AM-1007-04,11B,AM,10072018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9744226682925 40.7755625717273) +-73.9690241805398,40.7837967580773,21B-AM-1019-07,21B,AM,10192018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9690241805398 40.7837967580773) +-73.9779039082557,40.7675313108314,2D-PM-1012-01,02D,PM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9779039082557 40.7675313108314) +-73.9559663734409,40.7945828261377,37F-AM-1010-01,37F,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,false,true,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9559663734409 40.7945828261377) +-73.9721064150173,40.7667053821991,3I-AM-1010-01,03I,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9721064150173 40.7667053821991) +-73.9695468150218,40.7821142051746,20B-PM-1013-03,20B,PM,10132018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9695468150218 40.7821142051746) +-73.9719901848577,40.7720525965356,9F-PM-1014-07,09F,PM,10142018,7,Adult,Black,,Black+,!!!,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9719901848577 40.7720525965356) +-73.9810149147578,40.7683925377714,2A-AM-1010-03,02A,AM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,on trunk,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9810149147578 40.7683925377714) +-73.978199543688,40.7695660563362,4C-PM-1010-17,04C,PM,10102018,17,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,climbed up tree,true,false,true,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.978199543688 40.7695660563362) +-73.9735753352129,40.7687061447032,5G-PM-1010-04,05G,PM,10102018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9735753352129 40.7687061447032) +-73.9751625910271,40.7671023412885,3F-AM-1006-02,03F,AM,10062018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9751625910271 40.7671023412885) +-73.9597048490102,40.7955846466241,37B-AM-1018-06,37B,AM,10182018,6,Adult,Gray,,Gray+,,Above Ground,1,,false,false,true,false,false,,false,true,false,false,false,false,false,true,,POINT (-73.9597048490102 40.7955846466241) +-73.9765386965371,40.766371971273,1F-AM-1010-02,01F,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9765386965371 40.766371971273) +-73.9698130452581,40.7745000645436,12F-PM-1007-15,12F,PM,10072018,15,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9698130452581 40.7745000645436) +-73.970795746101,40.7704727212299,8H-PM-1014-01,08H,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.970795746101 40.7704727212299) +-73.9635981227569,40.7928169540326,32A-AM-1018-05,32A,AM,10182018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9635981227569 40.7928169540326) +-73.9665004148497,40.7805656411756,19E-PM-1018-05,19E,PM,10182018,5,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9665004148497 40.7805656411756) +-73.9769693140651,40.7684390015166,3D-AM-1006-01,03D,AM,10062018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,9,up a tree,true,false,true,true,true,digging (?),false,false,false,true,false,false,false,true,runs from (man led his dog into the area to chase squirrel),POINT (-73.9769693140651 40.7684390015166) +-73.9727187453699,40.7669595710626,3H-AM-1008-02,03H,AM,10082018,2,Adult,Gray,,Gray+,,Above Ground,,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9727187453699 40.7669595710626) +-73.9771726831497,40.7732320781799,8A-AM-1013-01,08A,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,trail,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9771726831497 40.7732320781799) +-73.9752965316933,40.7752538575789,10B-AM-1006-03,10B,AM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,In tree,false,false,true,false,false,,false,false,false,false,true,true,false,false,,POINT (-73.9752965316933 40.7752538575789) +-73.9789971286844,40.7707024146365,5A-PM-1010-04,05A,PM,10102018,4,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9789971286844 40.7707024146365) +-73.9581007437094,40.7959403112722,38C-AM-1019-06,38C,AM,10192018,6,Adult,Gray,,Gray+,,Above Ground,23,,false,false,true,false,false,,true,false,false,true,false,false,true,false,,POINT (-73.9581007437094 40.7959403112722) +-73.9694166642262,40.7697788641081,8I-PM-1013-03,08I,PM,10132018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694166642262 40.7697788641081) +-73.9568524771058,40.7974664985551,40C-PM-1006-06,40C,PM,10062018,6,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,By The Road,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9568524771058 40.7974664985551) +-73.9786351029146,40.7716114164002,6A-PM-1012-06,06A,PM,10122018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,elevated ground,false,true,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9786351029146 40.771611416400205) +-73.9758128509653,40.7715946097064,7C-PM-1020-03,07C,PM,10202018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9758128509653 40.7715946097064) +-73.9590191812452,40.7906166981409,32E-PM-1017-08,32E,PM,10172018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,treed area,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9590191812452 40.7906166981409) +-73.9638812060405,40.7923714941429,32A-PM-1013-02,32A,PM,10132018,2,?,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9638812060405 40.792371494142905) +-73.9692676659807,40.7700678919108,8I-PM-1013-08,08I,PM,10132018,8,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,1,,false,false,true,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.96926766598071 40.7700678919108) +-73.9729786570879,40.7778238570396,14B-AM-1007-01,14B,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,tail straight,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.97297865708792 40.7778238570396) +-73.97063044051,40.7771060594808,14D-PM-1019-14,14D,PM,10192018,14,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.97063044051 40.7771060594808) +-73.976658503418,40.7686868456917,4D-AM-1012-03,04D,AM,10122018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.976658503418 40.7686868456917) +-73.9689893412693,40.785308737683,23A-AM-1018-03,23A,AM,10182018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,Tree,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9689893412693 40.785308737683) +-73.9544553697736,40.7912866208106,34I-AM-1012-01,34I,AM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9544553697736 40.7912866208106) +-73.979636950073,40.7677999753976,1C-PM-1013-10,01C,PM,10132018,10,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.979636950073 40.7677999753976) +-73.9754822938869,40.7717766893833,7C-PM-1020-01,07C,PM,10202018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9754822938869 40.7717766893833) +-73.9708781504528,40.7724138070355,10F-AM-1007-03,10F,AM,10072018,3,Adult,Gray,,Gray+,,Above Ground,50,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9708781504528 40.7724138070355) +-73.9605163698302,40.7914179994956,32D-PM-1006-05,32D,PM,10062018,5,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,true,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9605163698302 40.7914179994956) +-73.9736896363006,40.7677630862626,4G-AM-1006-01,04G,AM,10062018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9736896363006 40.7677630862626) +-73.96143417385,40.7945464262112,35B-PM-1013-02,35B,PM,10132018,2,Juvenile,,,+,,Ground Plane,FALSE,,false,false,false,true,false,did not notice dog sitting a few yards away (10-20 ft),false,false,false,false,true,false,true,false,,POINT (-73.96143417385 40.7945464262112) +-73.9642988690682,40.7795591281979,19H-AM-1010-04,19H,AM,10102018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,true,true,true,,false,false,false,false,false,false,true,true,runs from human w/ dog,POINT (-73.9642988690682 40.7795591281979) +-73.9522677657659,40.7934034811368,38I-AM-1019-02,38I,AM,10192018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9522677657659 40.7934034811368) +-73.9596865318094,40.7893787188526,31F-AM-1013-01,31F,AM,10132018,1,Adult,Gray,Black,Gray+Black,,Above Ground,25,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9596865318094 40.7893787188526) +-73.9713379914423,40.7696367609606,7H-PM-1006-01,07H,PM,10062018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,middle of grass,false,false,false,true,true,,false,false,false,false,true,true,false,false,,POINT (-73.9713379914423 40.7696367609606) +-73.951448051873,40.7973951649254,42G-AM-1018-02,42G,AM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.951448051873 40.7973951649254) +-73.9711673006524,40.7747979614577,12E-PM-1018-05,12E,PM,10182018,5,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9711673006524 40.7747979614577) +-73.96393252683,40.7808289765857,21G-AM-1014-04,21G,AM,10142018,4,Adult,Gray,White,Gray+White,,Above Ground,6,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.96393252683 40.7808289765857) +-73.9765877920583,40.7660946071574,1F-AM-1010-04,01F,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9765877920583 40.7660946071574) +-73.9734605176646,40.7686218881386,5G-PM-1010-02,05G,PM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9734605176646 40.7686218881386) +-73.9675917702187,40.7789922281625,17E-AM-1017-02,17E,AM,10172018,2,Adult,Gray,,Gray+,,Above Ground,8,Shore,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9675917702187 40.7789922281625) +-73.9564228238736,40.7936908887644,36F-PM-1012-06,36F,PM,10122018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9564228238736 40.7936908887644) +-73.95795157569,40.7961254697958,38C-PM-1014-04,38C,PM,10142018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.95795157569 40.7961254697958) +-73.9739737592602,40.7727130476777,9D-AM-1008-04,09D,AM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9739737592602 40.7727130476777) +-73.9771800098131,40.7708863131336,5C-PM-1010-03,05C,PM,10102018,3,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9771800098131 40.7708863131336) +-73.9596904740342,40.7897200025671,31E-AM-1014-01,31E,AM,10142018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9596904740342 40.7897200025671) +-73.9697159562944,40.7730671417653,11G-PM-1013-02,11G,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Near Summerstage,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9697159562944 40.7730671417653) +-73.9604482901468,40.7898646293603,31E-PM-1006-07,31E,PM,10062018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9604482901468 40.7898646293603) +-73.9706308500637,40.7696174874596,7H-PM-1006-10,07H,PM,10062018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9706308500637 40.7696174874596) +-73.9699188544459,40.7772180370053,15E-PM-1008-09,15E,PM,10082018,9,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9699188544459 40.7772180370053) +-73.9737329655838,40.7726424441344,8D-PM-1007-02,08D,PM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9737329655838 40.7726424441344) +-73.9766348078633,40.7717715634438,7C-AM-1012-01,07C,AM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,hopping around grass,false,false,false,false,false,false,true,false,,POINT (-73.9766348078633 40.7717715634438) +-73.9770439076963,40.7685720141731,3D-PM-1010-13,03D,PM,10102018,13,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9770439076963 40.7685720141731) +-73.9604576237503,40.7818120101394,23I-PM-1019-01,23I,PM,10192018,1,Adult,Gray,,Gray+,,Above Ground,35,,true,false,false,false,false,running (across branches),false,false,false,false,false,false,false,false,,POINT (-73.9604576237503 40.7818120101394) +-73.965019827314,40.7759864291323,15I-AM-1008-03,15I,AM,10082018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.965019827314 40.7759864291323) +-73.9690080105286,40.7710230515054,9I-PM-1010-03,09I,PM,10102018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,,,,false,false,false,false,true,,false,false,false,false,false,false,true,true,,POINT (-73.9690080105286 40.7710230515054) +-73.950827557335,40.797579073666,42H-PM-1014-02,42H,PM,10142018,2,Adult,Gray,White,Gray+White,,Above Ground,,Running along stone ledge,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.950827557335 40.797579073666) +-73.9776151109912,40.7694681558386,4C-PM-1010-09,04C,PM,10102018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9776151109912 40.7694681558386) +-73.9695685186489,40.7788293026327,16D-AM-1007-04,16D,AM,10072018,4,Adult,Gray,,Gray+,,Above Ground,8,,false,false,true,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9695685186489 40.7788293026327) +-73.9763836740342,40.7706121151491,5C-AM-1006-06,05C,AM,10062018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9763836740342 40.7706121151491) +-73.9700264128414,40.7692014637698,7I-PM-1013-01,07I,PM,10132018,1,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,Bench,false,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9700264128414 40.7692014637698) +-73.968891673893,40.7767001471729,15F-AM-1007-06,15F,AM,10072018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,pair with #5,false,false,false,false,false,false,false,true,,POINT (-73.968891673893 40.7767001471729) +-73.9598973337711,40.7933346360478,34C-PM-1012-01,34C,PM,10122018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9598973337711 40.7933346360478) +-73.9543832609857,40.7953550639701,39F-AM-1014-02,39F,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,rocks,true,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9543832609857 40.7953550639701) +-73.9788304714091,40.7696373635315,4B-AM-1010-06,04B,AM,10102018,6,Adult,Gray,,Gray+,,Above Ground,12,,true,false,false,false,false,running from squirrel #5,false,false,false,false,false,false,false,false,,POINT (-73.9788304714091 40.7696373635315) +-73.9615516703494,40.7905219388359,31D-AM-1014-04,31D,AM,10142018,4,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,Open ground,true,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9615516703494 40.7905219388359) +-73.9751454725998,40.770291361572,6D-PM-1020-06,06D,PM,10202018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,by carousel,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9751454725998 40.770291361572006) +-73.9693719015914,40.7768710160557,14E-PM-1017-02,14E,PM,10172018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,staring,false,false,false,false,false,false,false,false,,POINT (-73.9693719015914 40.7768710160557) +-73.9775445441194,40.7697096533728,4C-PM-1010-13,04C,PM,10102018,13,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9775445441194 40.7697096533728) +-73.9584967368893,40.7977320341094,39B-PM-1014-05,39B,PM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,"pretended to bury a nut,stuck a leaf on top to make the spot less conspicuous.",false,false,false,false,false,false,true,false,,POINT (-73.9584967368893 40.7977320341094) +-73.9772239251936,40.7731716665766,8A-AM-1013-05,08A,AM,10132018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,20,,true,false,true,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9772239251936 40.7731716665766) +-73.954499539822,40.7949716693686,38F-AM-1018-01,38F,AM,10182018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.954499539822 40.7949716693686) +-73.9729410488021,40.7709484964577,7F-AM-1008-13,07F,AM,10082018,13,Adult,Gray,,Gray+,,Above Ground,4,to tree,true,false,false,true,true,ran up tree 4 feet and ate leaves,false,false,false,false,false,false,true,false,,POINT (-73.9729410488021 40.7709484964577) +-73.9706428641753,40.7762933936464,13E-AM-1017-07,13E,AM,10172018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9706428641753 40.7762933936464) +-73.9538251716292,40.7919360198175,35I-PM-1006-01,35I,PM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9538251716292 40.7919360198175) +-73.9632993246327,40.7888199519656,29C-AM-1007-05,29C,AM,10072018,5,Adult,Black,Gray,Black+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9632993246327 40.7888199519656) +-73.9620542514749,40.7943731722138,34A-AM-1012-01,34A,AM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,chasing from tree to ground,true,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9620542514749 40.7943731722138) +-73.958932543729,40.7913445531266,33E-AM-1014-11,33E,AM,10142018,11,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,15,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.958932543729 40.7913445531266) +-73.9549261242548,40.7944701994615,37G-AM-1014-04,37G,AM,10142018,4,Adult,Gray,,Gray+,,Above Ground,5,,false,true,false,false,false,playing,false,false,false,false,false,false,true,false,,POINT (-73.9549261242548 40.7944701994615) +-73.9659156108069,40.7810709818696,20E-AM-1014-01,20E,AM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9659156108069 40.7810709818696) +-73.972399596842,40.7788765078432,15B-PM-1017-04,15B,PM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,on hill,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.972399596842 40.7788765078432) +-73.9582150734453,40.7962862794303,38C-AM-1019-08,38C,AM,10192018,8,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,true,false,false,false,false,false,true,false,,POINT (-73.9582150734453 40.7962862794303) +-73.9690212174,40.7834099404107,21B-PM-1017-05,21B,PM,10172018,5,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9690212174 40.7834099404107) +-73.9553603438021,40.7985282963244,41D-PM-1014-05,41D,PM,10142018,5,Adult,Gray,White,Gray+White,,Above Ground,12,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9553603438021 40.7985282963244) +-73.9726056411971,40.7793467904743,16A-PM-1019-03,16A,PM,10192018,3,,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9726056411971 40.7793467904743) +-73.9693841004072,40.7704148658294,8I-PM-1013-06,08I,PM,10132018,6,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9693841004072 40.7704148658294) +-73.9708628933624,40.7725630886784,10F-PM-1019-08,10F,PM,10192018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,"Under ""Grape Arbor"" structure behind Bandshell",true,false,false,false,true,digging,false,false,false,false,false,false,false,true,,POINT (-73.9708628933624 40.7725630886784) +-73.9613429184974,40.7912158057267,32C-AM-1014-02,32C,AM,10142018,2,Adult,Gray,,Gray+,,Above Ground,3,,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9613429184974 40.7912158057267) +-73.9598350385541,40.7973274000224,38A-PM-1013-04,38A,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9598350385541 40.7973274000224) +-73.969784066769,40.7766940405403,14E-AM-1008-11,14E,AM,10082018,11,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,burying,false,false,false,false,false,false,true,false,curious,POINT (-73.969784066769 40.7766940405403) +-73.9763593390732,40.7717297058549,7C-AM-1012-03,07C,AM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,foraging (loving the acorns!),false,false,false,false,false,false,true,false,,POINT (-73.97635933907321 40.7717297058549) +-73.9759510842771,40.769288289111,5D-AM-1020-04,05D,AM,10202018,4,Adult,Gray,"Black, White","Gray+Black, White",White selected as Primary. Black selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9759510842771 40.76928828911101) +-73.9548648518558,40.7946730924872,38F-PM-1013-03,38F,PM,10132018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9548648518558 40.7946730924872) +-73.9615900833886,40.7945431292846,35A-PM-1013-07,35A,PM,10132018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9615900833886 40.7945431292846) +-73.9531041906469,40.7919916819219,36I-PM-1007-02,36I,PM,10072018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,true,,false,false,false,false,true,true,true,false,chased birds (blue jay),POINT (-73.9531041906469 40.7919916819219) +-73.9743369068254,40.7675726965985,3F-AM-1006-11,03F,AM,10062018,11,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9743369068254 40.7675726965985) +-73.9614599022015,40.7945181285991,35A-PM-1013-11,35A,PM,10132018,11,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9614599022015 40.7945181285991) +-73.9768867959365,40.7734803954589,8B-PM-1012-01,08B,PM,10122018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9768867959365 40.7734803954589) +-73.9771009024581,40.7688793288864,3D-PM-1010-06,03D,PM,10102018,6,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9771009024581 40.7688793288864) +-73.9762227323096,40.768453603768,3E-PM-1008-02,03E,PM,10082018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9762227323096 40.768453603768) +-73.9692849074642,40.7708755098145,9H-PM-1018-06,09H,PM,10182018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9692849074642 40.7708755098145) +-73.97348276186,40.7656171832911,2H-PM-1006-02,02H,PM,10062018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.97348276186 40.7656171832911) +-73.9562946873694,40.7938593012595,36F-AM-1017-01,36F,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,runs from (dog),POINT (-73.9562946873694 40.7938593012595) +-73.9794481602391,40.770638572864,4A-AM-1007-03,04A,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9794481602391 40.770638572864) +-73.9721348050673,40.7666920046704,3H-AM-1008-01,03H,AM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,,false,false,false,false,false,teasing barking dog,false,false,false,false,false,false,true,false,indifferent by not caring about dog,POINT (-73.9721348050673 40.7666920046704) +-73.968807163616,40.7812018159499,19C-PM-1018-02,19C,PM,10182018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.968807163616 40.7812018159499) +-73.9711001278389,40.7787466095841,15C-PM-1017-01,15C,PM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9711001278389 40.7787466095841) +-73.972179947936,40.7810042827198,17A-PM-1013-02,17A,PM,10132018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,on a little pedestal-shaped part of a tree,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.972179947936 40.7810042827198) +-73.9809688694074,40.7688535974878,2A-PM-1019-06,02A,PM,10192018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9809688694074 40.7688535974878) +-73.9601851468038,40.7968698151479,38A-AM-1019-05,38A,AM,10192018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White","Cinnamon head, White belly",Ground Plane,FALSE,,false,false,false,false,true,standing on back legs,false,false,false,false,false,true,true,false,,POINT (-73.9601851468038 40.7968698151479) +-73.9775571403892,40.7665316585198,1E-PM-1007-03,01E,PM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9775571403892 40.7665316585198) +-73.9550235589287,40.7951312356844,38F-AM-1018-03,38F,AM,10182018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9550235589287 40.7951312356844) +-73.9799302952205,40.7677207209798,1B-PM-1019-02,01B,PM,10192018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9799302952205 40.7677207209798) +-73.9704121989487,40.7824040236981,19A-PM-1013-02,19A,PM,10132018,2,Adult,Gray,White,Gray+White,"Looks very brown, not like English red squirrels",Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9704121989487 40.7824040236981) +-73.9572840457971,40.7886933371744,31H-PM-1008-04,31H,PM,10082018,4,Adult,Gray,,Gray+,,Above Ground,,Also way up,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.95728404579711 40.7886933371744) +-73.9564599077179,40.7965185098695,39D-PM-1012-01,39D,PM,10122018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9564599077179 40.7965185098695) +-73.9801636400744,40.7690192055926,2A-AM-1010-09,02A,AM,10102018,9,Adult,Gray,White,Gray+White,,Above Ground,,climbing in bush,false,false,true,false,false,hopping & flipping around. this one was very energetic & jumping aorund,false,false,false,false,true,false,false,false,climbed a foot up a tree and watched me,POINT (-73.9801636400744 40.7690192055926) +-73.9561498646036,40.7949288561893,37E-AM-1013-05,37E,AM,10132018,5,?,,,+,,Above Ground,10,"unsure, just heard kuks",false,false,false,false,false,,true,false,false,false,false,false,false,false,,POINT (-73.9561498646036 40.79492885618931) +-73.969628583287,40.7704067797932,8H-AM-1017-03,08H,AM,10172018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,2,fence,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.969628583287 40.7704067797932) +-73.962800448652,40.7915532640139,31B-PM-1007-03,31B,PM,10072018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.962800448652 40.7915532640139) +-73.9501457233643,40.797094356558,42I-PM-1014-01,42I,PM,10142018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9501457233643 40.797094356558) +-73.9710674928906,40.7778757544025,15D-PM-1017-06,15D,PM,10172018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,walking,false,false,false,false,false,false,false,false,stopped and watched me before slowly moving on,POINT (-73.9710674928906 40.7778757544025) +-73.9744917362668,40.77783887377,13A-AM-1017-02,13A,AM,10172018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9744917362668 40.77783887377) +-73.9743509423821,40.7690043677328,5F-AM-1007-02,05F,AM,10072018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,,tree,true,true,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.97435094238212 40.7690043677328) +-73.9601988871514,40.7943473161329,35C-PM-1013-01,35C,PM,10132018,1,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,true,,true,true,false,true,true,false,true,false,,POINT (-73.9601988871514 40.7943473161329) +-73.9791217510656,40.7676583475394,2C-AM-1010-05,02C,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,right at the base of the same tree as #3,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9791217510656 40.7676583475394) +-73.9588339897601,40.7848084865431,26I-PM-1010-06,26I,PM,10102018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,35,tree,false,false,true,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9588339897601 40.7848084865431) +-73.9690174442945,40.7817617696508,19C-PM-1018-05,19C,PM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9690174442945 40.7817617696508) +-73.9657764490284,40.7811923229286,20F-PM-1007-10,20F,PM,10072018,10,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9657764490284 40.7811923229286) +-73.9748962681637,40.76787782717,4F-PM-1013-02,04F,PM,10132018,2,Adult,Gray,"Black, Cinnamon","Gray+Black, Cinnamon",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9748962681637 40.76787782717) +-73.9745141185576,40.7691479781207,5E-AM-1008-01,05E,AM,10082018,1,Adult,Gray,White,Gray+White,,Above Ground,2,on a checker table,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9745141185576 40.7691479781207) +-73.9743165321099,40.7754674678574,11B-PM-1014-07,11B,PM,10142018,7,,Gray,,Gray+,,Above Ground,10,,true,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9743165321099 40.7754674678574) +-73.9528429238071,40.7922651848867,36I-PM-1007-09,36I,PM,10072018,9,Juvenile,Gray,,Gray+,,Above Ground,5,,true,true,false,false,false,burying nut,false,false,false,false,true,false,false,false,,POINT (-73.9528429238071 40.7922651848867) +-73.9775068915715,40.7664424394736,1E-AM-1006-01,01E,AM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9775068915715 40.7664424394736) +-73.9577919365342,40.7960853285059,38C-PM-1014-08,38C,PM,10142018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,true,false,false,false,false,false,false,true,,POINT (-73.9577919365342 40.7960853285059) +-73.9628842960118,40.7938048572403,34A-PM-1013-01,34A,PM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,took a chestnut,false,false,false,false,false,false,false,false,,POINT (-73.9628842960118 40.7938048572403) +-73.9682760864462,40.7780727569417,16E-PM-1018-04,16E,PM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,true,false,false,false,false,false,true,false,,POINT (-73.9682760864462 40.7780727569417) +-73.9687214684206,40.7792841720164,17D-AM-1008-07,17D,AM,10082018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9687214684206 40.7792841720164) +-73.9600738985438,40.7938328798752,35C-PM-1013-08,35C,PM,10132018,8,,,,+,,,,,false,false,false,false,false,,true,false,false,false,false,false,false,false,did not *see*,POINT (-73.9600738985438 40.7938328798752) +-73.9710273070712,40.7766521246153,14D-PM-1019-16,14D,PM,10192018,16,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9710273070712 40.7766521246153) +-73.9618094076328,40.7944097368153,35A-PM-1013-03,35A,PM,10132018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9618094076328 40.7944097368153) +-73.9632238528617,40.7920328991252,32B-PM-1010-02,32B,PM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9632238528617 40.7920328991252) +-73.9530587825442,40.7919087309222,36I-PM-1007-03,36I,PM,10072018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9530587825442 40.7919087309222) +-73.973425927351,40.7781929919344,14B-AM-1007-03,14B,AM,10072018,3,Adult,Gray,,Gray+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.973425927351 40.7781929919344) +-73.9566300789162,40.7993692120774,42C-PM-1013-06,42C,PM,10132018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,Between park and main drag,false,false,true,true,false,,false,false,false,false,false,false,true,true,,POINT (-73.9566300789162 40.7993692120774) +-73.9551923408239,40.7968302661402,40E-PM-1017-01,40E,PM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9551923408239 40.7968302661402) +-73.9692271132136,40.777528508844,15E-PM-1008-04,15E,PM,10082018,4,Adult,Gray,,Gray+,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9692271132136 40.777528508844) +-73.960642602756,40.7917265419842,32D-PM-1006-08,32D,PM,10062018,8,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,false,false,stand on two feet and watching me,POINT (-73.960642602756 40.7917265419842) +-73.9611434082667,40.7893671772846,30E-PM-1008-01,30E,PM,10082018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,40,,false,false,true,false,false,,false,true,false,false,false,false,false,false,,POINT (-73.9611434082667 40.7893671772846) +-73.9658867660358,40.7756523577509,15H-PM-1008-06,15H,PM,10082018,6,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,base of gingko tree,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9658867660358 40.7756523577509) +-73.9734206435334,40.7657854684194,2H-PM-1006-01,02H,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9734206435334 40.7657854684194) +-73.974596903918,40.7765498215674,12A-PM-1013-02,12A,PM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,true,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.974596903918 40.7765498215674) +-73.9507140045973,40.7957700986293,41I-PM-1017-01,41I,PM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon oval on back,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9507140045973 40.7957700986293) +-73.9615429203441,40.7907417648701,31D-AM-1014-01,31D,AM,10142018,1,,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,Ground then up tree,false,false,true,false,false,chased by a doggo,false,false,true,false,false,false,false,true,runs from (dogs!),POINT (-73.9615429203441 40.7907417648701) +-73.9653575758687,40.7805339953372,20F-PM-1007-12,20F,PM,10072018,12,Adult,Gray,White,Gray+White,,Above Ground,20,in tree,false,false,true,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9653575758687 40.7805339953372) +-73.9595886063173,40.7918405182594,33D-AM-1017-09,33D,AM,10172018,9,Adult,Black,Cinnamon,Black+Cinnamon,,Above Ground,7,,false,false,true,false,false,,true,true,false,false,false,false,true,true,,POINT (-73.9595886063173 40.7918405182594) +-73.9694185786221,40.7787189999566,16D-AM-1007-06,16D,AM,10072018,6,Adult,Cinnamon,White,Cinnamon+White,primary color: brown ( I marked cinnamon as closest to brown - JO),Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9694185786221 40.7787189999566) +-73.9690082314914,40.7738993942891,12G-AM-1012-05,12G,AM,10122018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,true,false,false,false,,true,false,false,false,false,false,false,true,,POINT (-73.9690082314914 40.7738993942891) +-73.9763629541474,40.7682321897044,3E-PM-1008-04,03E,PM,10082018,4,Adult,Gray,,Gray+,,Above Ground,6,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9763629541474 40.7682321897044) +-73.9768096953647,40.7708185213129,5C-PM-1010-08,05C,PM,10102018,8,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9768096953647 40.7708185213129) +-73.9593895253501,40.7973085844087,38B-AM-1019-03,38B,AM,10192018,3,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,true,false,,POINT (-73.9593895253501 40.7973085844087) +-73.9703683510176,40.7743975363958,12F-PM-1007-10,12F,PM,10072018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9703683510176 40.7743975363958) +-73.9691801791373,40.7709272353572,9I-AM-1014-04,09I,AM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9691801791373 40.7709272353572) +-73.9681960138614,40.7726867422002,11H-AM-1010-02,11H,AM,10102018,2,,Cinnamon,Gray,Cinnamon+Gray,,,,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9681960138614 40.7726867422002) +-73.9612658688914,40.7912119940469,32C-AM-1014-04,32C,AM,10142018,4,Adult,Gray,,Gray+,,Above Ground,8,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9612658688914 40.7912119940469) +-73.9545877741228,40.7900001210353,33I-PM-1006-01,33I,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9545877741228 40.7900001210353) +-73.9628041577934,40.7884180156055,28D-AM-1012-06,28D,AM,10122018,6,Juvenile,Cinnamon,White,Cinnamon+White,,Above Ground,5,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9628041577934 40.78841801560551) +-73.9587179613803,40.7992119571657,41A-PM-1007-01,41A,PM,10072018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9587179613803 40.7992119571657) +-73.9752915601718,40.7739329570033,9B-AM-1010-04,09B,AM,10102018,4,,,,+,,Above Ground,10,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9752915601718 40.7739329570033) +-73.97296259363,40.7652601851275,1I-PM-1012-04,01I,PM,10122018,4,Juvenile,Cinnamon,White,Cinnamon+White,Cinnamon & White selected as Primary. Cinnamon & White selected as Highlights. Made executive adjustments.,Above Ground,2,on ledge,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.97296259363 40.7652601851275) +-73.9561432836863,40.7982665347234,41C-AM-1017-07,41C,AM,10172018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9561432836863 40.7982665347234) +-73.971314838366,40.774951285041,12E-AM-1017-03,12E,AM,10172018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,8,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.971314838366 40.774951285041) +-73.960094705031,40.7916066137699,33D-AM-1017-01,33D,AM,10172018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,5,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.960094705031 40.7916066137699) +-73.972967003211,40.7711848438157,7F-AM-1008-17,07F,AM,10082018,17,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,scratching self,false,false,false,false,false,false,false,true,,POINT (-73.972967003211 40.7711848438157) +-73.957775998085,40.7932880937406,35E-PM-1006-05,35E,PM,10062018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.957775998085 40.7932880937406) +-73.956289117157,40.7953393993803,38E-AM-1010-11,38E,AM,10102018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,edge of the stream,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.956289117157 40.7953393993803) +-73.972069937746,40.7659402627832,3I-PM-1013-04,03I,PM,10132018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.97206993774601 40.7659402627832) +-73.9681090824978,40.7838275830328,22B-PM-1014-04,22B,PM,10142018,4,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9681090824978 40.7838275830328) +-73.9687025912431,40.7719319822619,10H-AM-1014-04,10H,AM,10142018,4,Juvenile,,,+,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9687025912431 40.7719319822619) +-73.9712022111028,40.7672504368263,4I-AM-1006-01,04I,AM,10062018,1,Adult,Black,,Black+,,Above Ground,3,On top of park lamp,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9712022111028 40.7672504368263) +-73.9787312025627,40.7701071405918,4B-PM-1018-04,04B,PM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9787312025627 40.7701071405918) +-73.9671419119456,40.7758602486862,14G-AM-1012-01,14G,AM,10122018,1,Adult,Cinnamon,Black,Cinnamon+Black,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9671419119456 40.7758602486862) +-73.9542074814296,40.7954322240004,39F-AM-1014-01,39F,AM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9542074814296 40.7954322240004) +-73.9543373703455,40.7943889087123,38G-PM-1020-07,38G,PM,10202018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,true,,false,true,false,true,false,false,true,false,,POINT (-73.9543373703455 40.7943889087123) +-73.9701808122548,40.7744632730919,12F-PM-1007-11,12F,PM,10072018,11,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9701808122548 40.7744632730919) +-73.9689204258063,40.7712540588951,9I-AM-1014-01,09I,AM,10142018,1,Adult,Cinnamon,"Black, White","Cinnamon+Black, White","Black on body, White Belly, White tail",Ground Plane,FALSE,,false,false,false,false,true,digging deeeep,false,false,false,false,false,false,true,false,,POINT (-73.9689204258063 40.7712540588951) +-73.9656324462902,40.7834034753081,22E-PM-1014-02,22E,PM,10142018,2,Adult,Gray,,Gray+,,Above Ground,6,,false,false,true,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9656324462902 40.7834034753081) +-73.9626065672894,40.788722645116,29D-AM-1014-03,29D,AM,10142018,3,Juvenile,Gray,,Gray+,,Above Ground,35,End of tree limb foraging,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9626065672894 40.788722645116) +-73.9692660977515,40.7830532310766,21B-PM-1017-01,21B,PM,10172018,1,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,paused to look at me,POINT (-73.9692660977515 40.7830532310766) +-73.971525123573,40.7703685359842,7G-PM-1018-06,07G,PM,10182018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,grooming,false,false,false,false,false,false,false,false,,POINT (-73.971525123573 40.7703685359842) +-73.9551639847466,40.790858199891,34H-PM-1006-03,34H,PM,10062018,3,,Gray,White,Gray+White,white belly,Ground Plane,FALSE,Under Tupelo Tree,false,false,false,true,false,,false,false,false,false,true,false,false,false,,POINT (-73.9551639847466 40.790858199891) +-73.9751806727197,40.7671940332258,3F-PM-1013-05,03F,PM,10132018,5,Adult,Gray,White,Gray+White,,Above Ground,13,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.97518067271972 40.7671940332258) +-73.9641088172632,40.7886555184212,28C-AM-1014-01,28C,AM,10142018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9641088172632 40.7886555184212) +-73.9769885189342,40.7708936173356,5C-PM-1010-06,05C,PM,10102018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9769885189342 40.7708936173356) +-73.9637983513789,40.7828712516396,23F-PM-1013-04,23F,PM,10132018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White","Gray & Cinnamon selected as Primary: ""much browner, like 1/2 & 1/2"".",Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,indifferent (busy foraging),POINT (-73.9637983513789 40.7828712516396) +-73.9735383602914,40.7723124703937,8D-AM-1007-01,08D,AM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,acknowledged me though,POINT (-73.9735383602914 40.7723124703937) +-73.9677368646039,40.7821550964837,20C-PM-1018-06,20C,PM,10182018,6,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.96773686460392 40.782155096483706) +-73.9625932664956,40.7885379477349,29D-AM-1014-01,29D,AM,10142018,1,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9625932664956 40.7885379477349) +-73.9705409446299,40.7764608087703,14E-PM-1017-03,14E,PM,10172018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9705409446299 40.7764608087703) +-73.9697109398302,40.7776218260789,15E-PM-1008-06,15E,PM,10082018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.9697109398302 40.7776218260789) +-73.9789687905912,40.7692693139328,3B-PM-1007-04,03B,PM,10072018,4,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,4,At fence,true,false,true,true,false,,false,false,false,false,true,false,true,true,,POINT (-73.9789687905912 40.7692693139328) +-73.9810843611086,40.7687905493699,2A-PM-1019-05,02A,PM,10192018,5,?,Gray,,Gray+,,Above Ground,50,in tall planetree,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9810843611086 40.7687905493699) +-73.9761799699276,40.774213409933,9B-AM-1010-07,09B,AM,10102018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9761799699276 40.774213409933) +-73.9767835160078,40.7674030330482,2E-PM-1014-04,02E,PM,10142018,4,Adult,Cinnamon,White,Cinnamon+White,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9767835160078 40.7674030330482) +-73.9700634278,40.7784223722453,16D-PM-1010-07,16D,PM,10102018,7,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9700634278 40.7784223722453) +-73.9752673884392,40.7662642413761,2G-AM-1010-04,02G,AM,10102018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9752673884392 40.7662642413761) +-73.9563473341712,40.7893712398425,32H-PM-1006-03,32H,PM,10062018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,true,false,true,,POINT (-73.9563473341712 40.78937123984251) +-73.9791767156268,40.7714445258765,5A-AM-1006-02,05A,AM,10062018,2,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,12,in tall shrubs near wall next to CPW,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9791767156268 40.7714445258765) +-73.9763722433833,40.7744121430891,9A-AM-1013-07,09A,AM,10132018,7,Adult,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9763722433833 40.7744121430891) +-73.9729105002306,40.7672758037086,4H-PM-1006-02,04H,PM,10062018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9729105002306 40.7672758037086) +-73.9683883750097,40.7754344396847,13G-PM-1008-01,13G,PM,10082018,1,Juvenile,Gray,,Gray+,,Above Ground,20,willow oak tree,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9683883750097 40.7754344396847) +-73.9765306970303,40.7694956875859,4D-PM-1008-09,04D,PM,10082018,9,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,,,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9765306970303 40.7694956875859) +-73.9647845655965,40.7816573808695,21F-AM-1018-07,21F,AM,10182018,7,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9647845655965 40.7816573808695) +-73.9686800784941,40.7766739029138,15F-AM-1007-03,15F,AM,10072018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,"Listed as primary white with cinnamon highlights, I changed to Gray/cinnamon - JO",Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9686800784941 40.7766739029138) +-73.9673554935258,40.7827527249594,21C-AM-1014-04,21C,AM,10142018,4,Adult,,,+,"High in tree, unable to tell",Above Ground,60,,false,false,true,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.96735549352582 40.7827527249594) +-73.9593624259363,40.7905522356793,32E-AM-1007-02,32E,AM,10072018,2,Adult,Gray,,Gray+,,Above Ground,40,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9593624259363 40.7905522356793) +-73.9723736494597,40.7669501343297,4H-AM-1006-01,04H,AM,10062018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9723736494597 40.7669501343297) +-73.9742847552668,40.7731740123046,9D-AM-1008-02,09D,AM,10082018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9742847552668 40.7731740123046) +-73.9712187890707,40.7750640173134,12E-PM-1018-01,12E,PM,10182018,1,Juvenile,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,true,false,false,,true,false,false,true,false,false,false,true,,POINT (-73.9712187890707 40.7750640173134) +-73.9541056052047,40.7939863923231,37G-PM-1007-06,37G,PM,10072018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9541056052047 40.7939863923231) +-73.9631089011412,40.789191946875,29C-PM-1006-02,29C,PM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9631089011412 40.789191946875) +-73.9576913492669,40.7994216061391,41B-AM-1010-11,41B,AM,10102018,11,Adult,Gray,Cinnamon,Gray+Cinnamon,,,,,false,false,false,true,false,eating a mushroom!,false,false,false,false,false,false,true,false,,POINT (-73.9576913492669 40.7994216061391) +-73.9753825640019,40.7671662013861,3F-PM-1013-04,03F,PM,10132018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9753825640019 40.7671662013861) +-73.9682627382073,40.7730766743452,11H-AM-1010-09,11H,AM,10102018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9682627382073 40.7730766743452) +-73.9802983138318,40.7676540772339,1B-PM-1019-05,01B,PM,10192018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9802983138318 40.7676540772339) +-73.9697665830132,40.7759094917104,13E-PM-1008-08,13E,PM,10082018,8,Juvenile,Cinnamon,"Black, White","Cinnamon+Black, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9697665830132 40.7759094917104) +-73.9533101544112,40.7938634280159,38H-AM-1019-01,38H,AM,10192018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9533101544112 40.7938634280159) +-73.9576652087316,40.7875457977801,29H-PM-1006-02,29H,PM,10062018,2,Adult,Gray,,Gray+,,Above Ground,2,,true,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9576652087316 40.7875457977801) +-73.9576094432477,40.7965342664074,38C-PM-1014-07,38C,PM,10142018,7,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9576094432477 40.7965342664074) +-73.9711634340673,40.7760553338671,13D-AM-1014-05,13D,AM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9711634340673 40.7760553338671) +-73.9714298880357,40.77410578689,11E-PM-1012-02,11E,PM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714298880357 40.77410578689) +-73.9618213644671,40.7927648819738,33B-AM-1010-02,33B,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.96182136446711 40.7927648819738) +-73.9765027953575,40.7717327360835,7C-AM-1012-02,07C,AM,10122018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,true,hopping around,false,false,false,false,false,false,true,false,,POINT (-73.9765027953575 40.7717327360835) +-73.9686756254868,40.7777459102651,16E-AM-1014-04,16E,AM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9686756254868 40.7777459102651) +-73.9614659899028,40.7945562907624,35A-PM-1013-10,35A,PM,10132018,10,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9614659899028 40.7945562907624) +-73.9756889766089,40.7676078308589,3F-AM-1006-14,03F,AM,10062018,14,Adult,Gray,White,Gray+White,,Above Ground,12,,true,false,true,false,false,running from dog,false,false,false,false,false,false,false,true,,POINT (-73.9756889766089 40.7676078308589) +-73.963209639301,40.7926138443715,32A-PM-1013-07,32A,PM,10132018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.963209639301 40.7926138443715) +-73.9659118189359,40.7765739928504,15H-AM-1013-02,15H,AM,10132018,2,Adult,Gray,,Gray+,,Above Ground,15,,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9659118189359 40.7765739928504) +-73.9551625272308,40.791193071916,34H-PM-1006-06,34H,PM,10062018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,in grass,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9551625272308 40.791193071916) +-73.9747311312394,40.7677319725044,3F-PM-1013-06,03F,PM,10132018,6,Adult,Gray,White,Gray+White,,Above Ground,19,,false,false,true,false,false,,false,true,false,false,false,false,false,true,,POINT (-73.97473113123941 40.7677319725044) +-73.9809342290598,40.7687265606227,2A-AM-1010-05,02A,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,base of tree with ~ 30 small birds all eating,false,false,false,true,true,,false,false,false,false,true,true,true,false,,POINT (-73.9809342290598 40.7687265606227) +-73.9596445861554,40.7971948679007,38A-PM-1013-05,38A,PM,10132018,5,Adult,Black,,Black+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9596445861554 40.7971948679007) +-73.9681664642028,40.7724669681958,11I-PM-1012-02,11I,PM,10122018,2,Adult,Gray,,Gray+,,Above Ground,4,,true,false,true,false,true,,false,false,false,false,false,false,false,true,runs away from the ball,POINT (-73.9681664642028 40.7724669681958) +-73.9550350096938,40.797694218705,41E-PM-1013-02,41E,PM,10132018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9550350096938 40.797694218705004) +-73.9615926031253,40.7944223235385,35B-PM-1013-05,35B,PM,10132018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,false,chased by dog #2,true,false,false,false,false,false,false,true,runs from (dog),POINT (-73.96159260312531 40.7944223235385) +-73.9754536566013,40.7698604918771,5E-PM-1012-04,05E,PM,10122018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9754536566013 40.7698604918771) +-73.9711120079542,40.7760801911766,13D-PM-1018-14,13D,PM,10182018,14,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,true,false,false,climbing (down),false,false,false,false,false,false,true,false,,POINT (-73.9711120079542 40.7760801911766) +-73.9664054327771,40.7756180893318,14H-PM-1012-07,14H,PM,10122018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9664054327771 40.7756180893318) +-73.9750618008099,40.7737521167094,9B-AM-1010-05,09B,AM,10102018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9750618008099 40.7737521167094) +-73.9643507588008,40.7904324693292,30B-PM-1019-07,30B,PM,10192018,7,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.96435075880082 40.7904324693292) +-73.9600357018376,40.7906539766881,32E-AM-1007-08,32E,AM,10072018,8,Adult,Gray,,Gray+,,Above Ground,65,tree top,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9600357018376 40.7906539766881) +-73.9778578822323,40.7705432705286,5B-PM-1013-03,05B,PM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,grooming,false,false,false,false,false,false,false,false,,POINT (-73.9778578822323 40.7705432705286) +-73.9587439756541,40.7849006107353,27I-AM-1007-04,27I,AM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,true,,POINT (-73.9587439756541 40.7849006107353) +-73.9565230963554,40.798556387711,41C-PM-1007-02,41C,PM,10072018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9565230963554 40.798556387711) +-73.9556083695689,40.7965223709493,39E-AM-1018-02,39E,AM,10182018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9556083695689 40.7965223709493) +-73.9753585157592,40.7698398607941,5E-AM-1008-07,05E,AM,10082018,7,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,1,on fence,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9753585157592 40.7698398607941) +-73.958607566971,40.7983695505584,40B-PM-1014-04,40B,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.958607566971 40.7983695505584) +-73.9552595564798,40.7889533029466,32I-PM-1007-01,32I,PM,10072018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,true,true,chirps,false,false,false,false,true,false,true,false,,POINT (-73.9552595564798 40.7889533029466) +-73.9651132904127,40.7905384124102,29A-PM-1019-02,29A,PM,10192018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9651132904127 40.7905384124102) +-73.9531953594918,40.7960413520131,40G-PM-1013-01,40G,PM,10132018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,true,false,false,,POINT (-73.9531953594918 40.7960413520131) +-73.953092053256,40.7982256930243,42F-PM-1017-03,42F,PM,10172018,3,,Gray,Cinnamon,Gray+Cinnamon,,,,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.953092053256 40.7982256930243) +-73.9772691210241,40.7690960712994,4D-PM-1008-13,04D,PM,10082018,13,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9772691210241 40.7690960712994) +-73.9507699667119,40.7955166039555,40I-AM-1018-02,40I,AM,10182018,2,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9507699667119 40.795516603955505) +-73.9672252136807,40.7876504743212,26A-PM-1006-04,26A,PM,10062018,4,Adult,Gray,,Gray+,,Above Ground,40,,false,true,false,false,false,,false,false,false,false,true,false,false,false,,POINT (-73.9672252136807 40.7876504743212) +-73.9532163535175,40.7982970313067,42F-PM-1017-04,42F,PM,10172018,4,,Gray,,Gray+,,,,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9532163535175 40.7982970313067) +-73.9693262952166,40.783260411082,21B-AM-1019-01,21B,AM,10192018,1,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9693262952166 40.783260411082) +-73.9579292340076,40.7976287835027,39C-PM-1006-04,39C,PM,10062018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9579292340076 40.7976287835027) +-73.9714787178201,40.7798049470745,16B-PM-1017-01,16B,PM,10172018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9714787178201 40.7798049470745) +-73.9578840941242,40.7955586232429,37D-PM-1014-06,37D,PM,10142018,6,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9578840941242 40.7955586232429) +-73.9765016413674,40.7740672862953,9A-AM-1013-06,09A,AM,10132018,6,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9765016413674 40.7740672862953) +-73.9661570478029,40.7807271518813,20E-AM-1014-02,20E,AM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9661570478029 40.7807271518813) +-73.9568378330302,40.7880317802766,30I-PM-1006-04,30I,PM,10062018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9568378330302 40.7880317802766) +-73.9715977170548,40.7742172650622,11E-AM-1013-03,11E,AM,10132018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,burying,false,false,false,false,false,false,true,false,,POINT (-73.9715977170548 40.774217265062205) +-73.9709912560997,40.7758965595198,13D-AM-1014-01,13D,AM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9709912560997 40.7758965595198) +-73.9744847446854,40.76924227444,5E-AM-1008-04,05E,AM,10082018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9744847446854 40.76924227444) +-73.955208233231,40.7890574331084,32I-PM-1007-02,32I,PM,10072018,2,Adult,,,+,,Above Ground,30,,false,false,true,false,false,"different sound - happy,playful chirps",false,false,false,false,true,false,true,false,,POINT (-73.955208233231 40.7890574331084) +-73.9728146482385,40.7652951714745,1I-PM-1012-03,01I,PM,10122018,3,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White","Gray, Black, & Cinnamon selected as Primary. Gray, Black, & White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,true,false,false,false,true,,POINT (-73.97281464823851 40.765295171474506) +-73.9678613185071,40.7822170887526,20C-PM-1018-03,20C,PM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9678613185071 40.7822170887526) +-73.9772908667333,40.7697207404744,4C-AM-1006-05,04C,AM,10062018,5,Juvenile,Gray,White,Gray+White,,Above Ground,20,,false,false,true,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9772908667333 40.7697207404744) +-73.9690832219322,40.782343340986,20B-PM-1013-06,20B,PM,10132018,6,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.96908322193221 40.782343340986) +-73.9751615527833,40.767013871509,3F-AM-1006-03,03F,AM,10062018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. Cinnamon & White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,on the path,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9751615527833 40.767013871509) +-73.9649230271173,40.7821766215675,22F-PM-1014-02,22F,PM,10142018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9649230271173 40.7821766215675) +-73.9728723853967,40.7670816164986,4H-PM-1006-01,04H,PM,10062018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,,POINT (-73.9728723853967 40.7670816164986) +-73.9786940945874,40.7690820276888,3B-PM-1007-05,03B,PM,10072018,5,Juvenile,Gray,,Gray+,,Above Ground,6,on rock,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9786940945874 40.7690820276888) +-73.9565179671319,40.7936663940365,36F-PM-1012-03,36F,PM,10122018,3,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.95651796713192 40.7936663940365) +-73.9720102361126,40.7692143930301,6G-PM-1020-01,06G,PM,10202018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9720102361126 40.7692143930301) +-73.967466716152,40.7824346548278,21D-PM-1008-04,21D,PM,10082018,4,Juvenile,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,4,,false,false,false,true,false,,false,false,false,false,false,false,false,true,i scared it,POINT (-73.967466716152 40.7824346548278) +-73.9698246369929,40.7711472794488,9H-AM-1006-04,09H,AM,10062018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9698246369929 40.7711472794488) +-73.9761879300037,40.7683918970301,3E-PM-1008-01,03E,PM,10082018,1,Adult,Gray,,Gray+,,Above Ground,3,,false,false,true,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9761879300037 40.7683918970301) +-73.9802842404016,40.7678257384977,1B-PM-1019-03,01B,PM,10192018,3,Juvenile,Gray,White,Gray+White,,Above Ground,25,in tree,false,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.98028424040162 40.7678257384977) +-73.9744025383371,40.7777296605765,13A-AM-1017-04,13A,AM,10172018,4,Adult,Gray,,Gray+,,,,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9744025383371 40.7777296605765) +-73.969370141813,40.7840721191988,22A-PM-1017-03,22A,PM,10172018,3,Juvenile,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.969370141813 40.7840721191988) +-73.9653873284496,40.7804699882574,20F-PM-1007-11,20F,PM,10072018,11,Adult,Gray,White,Gray+White,,Above Ground,10,in tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9653873284496 40.7804699882574) +-73.9630822385425,40.7914844989865,31B-PM-1007-04,31B,PM,10072018,4,Juvenile,Gray,,Gray+,,,,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9630822385425 40.7914844989865) +-73.9538475741188,40.796479421955,40F-PM-1006-02,40F,PM,10062018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,6,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9538475741188 40.796479421955) +-73.9777124331985,40.7704051056666,5B-AM-1008-03,05B,AM,10082018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9777124331985 40.7704051056666) +-73.9615396457996,40.7923594366783,33C-AM-1012-01,33C,AM,10122018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,Cinnamon along tail & back,Above Ground,20,tree branches,false,true,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9615396457996 40.7923594366783) +-73.955068474109,40.7911788152878,34H-PM-1006-05,34H,PM,10062018,5,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",white tail tip,Ground Plane,FALSE,in grass,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.955068474109 40.7911788152878) +-73.9597453664295,40.7891382153733,30F-PM-1007-01,30F,PM,10072018,1,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Above Ground,1,tree,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9597453664295 40.7891382153733) +-73.9546616782922,40.790974533739,34I-PM-1010-05,34I,PM,10102018,5,Adult,Gray,,Gray+,,,,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9546616782922 40.790974533739) +-73.9558995737654,40.7960097734603,39E-AM-1018-05,39E,AM,10182018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9558995737654 40.7960097734603) +-73.9730027200009,40.7798000868804,16A-PM-1019-05,16A,PM,10192018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,20,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9730027200009 40.7798000868804) +-73.969720780557,40.7741105688757,12F-AM-1020-04,12F,AM,10202018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,true,false,false,false,,POINT (-73.969720780557 40.7741105688757) +-73.9744080700098,40.7731515721826,9C-PM-1006-07,09C,PM,10062018,7,Adult,Black,"Cinnamon, White","Black+Cinnamon, White",,Ground Plane,FALSE,on top of tarped sand pile,false,false,false,true,false,,false,false,false,false,false,false,false,true,(me),POINT (-73.9744080700098 40.7731515721826) +-73.9726598256924,40.7707862446236,7F-PM-1012-03,07F,PM,10122018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,false,true,,POINT (-73.9726598256924 40.7707862446236) +-73.9541629063295,40.7934259301577,37G-AM-1014-02,37G,AM,10142018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,ran away & disappeared,false,false,false,false,false,false,false,false,,POINT (-73.9541629063295 40.7934259301577) +-73.956581233786,40.7902127690837,33H-AM-1019-01,33H,AM,10192018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,Cinnamon patches,Ground Plane,FALSE,,false,false,false,false,false,wrestling with child,false,false,false,false,false,false,false,false,,POINT (-73.956581233786 40.79021276908371) +-73.9698592838836,40.7743071443959,12F-AM-1020-03,12F,AM,10202018,3,Adult,Gray,Black,Gray+Black,,Ground Plane,FALSE,,false,false,false,false,false,playing,false,false,false,false,true,false,false,false,,POINT (-73.9698592838836 40.7743071443959) +-73.9598378495787,40.7956843021662,37B-AM-1018-04,37B,AM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9598378495787 40.7956843021662) +-73.9530811255728,40.7983069118579,42F-AM-1019-02,42F,AM,10192018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9530811255728 40.79830691185791) +-73.9729265300533,40.7741768291642,10D-AM-1008-02,10D,AM,10082018,2,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9729265300533 40.7741768291642) +-73.964593167562,40.7780374890066,18H-PM-1014-02,18H,PM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.964593167562 40.7780374890066) +-73.955258162768,40.7958147673603,39E-AM-1018-01,39E,AM,10182018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,standing still,false,false,false,false,false,false,false,true,,POINT (-73.955258162768 40.7958147673603) +-73.9771646835311,40.7693049165084,4C-PM-1010-05,04C,PM,10102018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9771646835311 40.7693049165084) +-73.9726236083428,40.7788217771475,15B-PM-1017-03,15B,PM,10172018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,by water,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9726236083428 40.778821777147506) +-73.9636482556874,40.7775831570186,18I-PM-1007-05,18I,PM,10072018,5,Juvenile,Cinnamon,"Gray, Black","Cinnamon+Gray, Black",,Ground Plane,FALSE,,false,false,false,false,true,jumping crazily / digging hole,false,false,false,false,false,false,true,false,,POINT (-73.9636482556874 40.7775831570186) +-73.9688070760806,40.7779688294172,16E-AM-1014-06,16E,AM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9688070760806 40.777968829417205) +-73.9793101482654,40.7692600238491,3B-PM-1007-02,03B,PM,10072018,2,Adult,Gray,,Gray+,,Above Ground,10,in tree,false,false,false,false,false,chased by dog,false,false,false,false,false,false,false,false,,POINT (-73.9793101482654 40.7692600238491) +-73.979734151564,40.7682150214703,2B-AM-1010-06,02B,AM,10102018,6,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.979734151564 40.7682150214703) +-73.9747873899653,40.7731945258327,9C-PM-1006-04,09C,PM,10062018,4,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9747873899653 40.7731945258327) +-73.970595860252,40.7832060751268,20A-AM-1010-01,20A,AM,10102018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.970595860252 40.7832060751268) +-73.9689554458632,40.7778593393957,16E-PM-1018-10,16E,PM,10182018,10,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9689554458632 40.7778593393957) +-73.9794118234651,40.7674495540569,1C-AM-1012-02,01C,AM,10122018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Gray & Cinnamon selected as Primary. Cinnamon & White selected as Highlights. Made executive adjustments.,Ground Plane,FALSE,,false,false,true,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9794118234651 40.7674495540569) +-73.9686358129525,40.7778035516486,16E-AM-1014-05,16E,AM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9686358129525 40.7778035516486) +-73.9631005470369,40.7885494057193,28D-AM-1012-01,28D,AM,10122018,1,Adult,Cinnamon,White,Cinnamon+White,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9631005470369 40.7885494057193) +-73.9735833104203,40.7786318041581,14A-PM-1014-08,14A,PM,10142018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,new movement flailing arms while foraging,false,false,false,false,false,false,false,true,,POINT (-73.9735833104203 40.7786318041581) +-73.9673220504383,40.7770296345963,15G-PM-1019-04,15G,PM,10192018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9673220504383 40.7770296345963) +-73.9670432105975,40.7753462013506,14H-PM-1012-03,14H,PM,10122018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,20,,true,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9670432105975 40.7753462013506) +-73.9720389756717,40.7763524091989,13C-PM-1019-02,13C,PM,10192018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9720389756717 40.7763524091989) +-73.9784872728213,40.7688122603932,3C-AM-1007-01,03C,AM,10072018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9784872728213 40.7688122603932) +-73.9597260014375,40.790707423031,32E-AM-1007-04,32E,AM,10072018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9597260014375 40.790707423031) +-73.9685201626934,40.783329261225,21B-AM-1019-05,21B,AM,10192018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9685201626934 40.783329261225) +-73.9654288151266,40.7815953970174,21E-AM-1017-02,21E,AM,10172018,2,Adult,Gray,,Gray+,,Above Ground,7,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9654288151266 40.7815953970174) +-73.9564478909357,40.7976928775417,40C-PM-1006-04,40C,PM,10062018,4,Adult,Black,,Black+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9564478909357 40.7976928775417) +-73.9506062997507,40.7976189496674,42H-PM-1014-03,42H,PM,10142018,3,Adult,,,+,,,,,false,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9506062997507 40.7976189496674) +-73.9793923984874,40.7708475474583,5A-AM-1006-01,05A,AM,10062018,1,Adult,Gray,,Gray+,,Above Ground,10,Oak tree near rock outcropping,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.97939239848742 40.7708475474583) +-73.9632164738341,40.7921270121312,32B-PM-1010-03,32B,PM,10102018,3,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,15,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9632164738341 40.7921270121312) +-73.9621297946132,40.7944058222814,34A-PM-1013-05,34A,PM,10132018,5,Adult,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,4,,true,false,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9621297946132 40.7944058222814) +-73.9722053355548,40.7662094993614,3I-AM-1010-03,03I,AM,10102018,3,Adult,Gray,,Gray+,,Above Ground,50,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9722053355548 40.7662094993614) +-73.9734630412566,40.7653097139415,1H-PM-1013-02,01H,PM,10132018,2,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9734630412566 40.7653097139415) +-73.9517525111679,40.7974407641075,42G-PM-1014-02,42G,PM,10142018,2,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Above Ground,14,,false,false,true,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9517525111679 40.7974407641075) +-73.9770313887741,40.7724869252099,7B-AM-1008-05,07B,AM,10082018,5,Adult,Gray,,Gray+,,Above Ground,,,false,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9770313887741 40.772486925209904) +-73.9745152462626,40.7655415515908,1G-AM-1006-04,01G,AM,10062018,4,Adult,Gray,White,Gray+White,,,,,false,true,false,false,true,collecting nest material,false,false,false,false,true,false,true,false,,POINT (-73.9745152462626 40.76554155159081) +-73.9768563402344,40.7744487310786,9A-AM-1013-12,09A,AM,10132018,12,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,foot of tree,true,true,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9768563402344 40.7744487310786) +-73.9657391918196,40.776502470347,16H-PM-1014-01,16H,PM,10142018,1,Juvenile,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9657391918196 40.776502470347) +-73.9699573485164,40.7765857838015,14E-AM-1008-10,14E,AM,10082018,10,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9699573485164 40.7765857838015) +-73.9703421391442,40.7773706575356,14D-AM-1014-01,14D,AM,10142018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9703421391442 40.7773706575356) +-73.9672160533827,40.7830263908749,21C-AM-1014-05,21C,AM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,true,false,false,true,false,,POINT (-73.9672160533827 40.7830263908749) +-73.9727230609785,40.7795341640894,16A-PM-1019-01,16A,PM,10192018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9727230609785 40.7795341640894) +-73.9672152696834,40.7823874581829,21D-AM-1008-05,21D,AM,10082018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9672152696834 40.7823874581829) +-73.9714653576023,40.7717400139502,9F-AM-1013-03,09F,AM,10132018,3,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9714653576023 40.7717400139502) +-73.9650120066074,40.7805932882407,20F-PM-1007-13,20F,PM,10072018,13,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Above Ground,10,,false,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9650120066074 40.78059328824071) +-73.9767953468937,40.7676376977667,3E-AM-1006-03,03E,AM,10062018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,checkin' his stashes,false,false,false,true,false,true,false,true,,POINT (-73.9767953468937 40.7676376977667) +-73.953123365424,40.7941113777459,38H-PM-1012-01,38H,PM,10122018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.953123365424 40.7941113777459) +-73.9692563597762,40.770904999952,9H-PM-1018-05,09H,PM,10182018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,true,false,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9692563597762 40.770904999952) +-73.9730926233232,40.7781330751738,14B-PM-1014-08,14B,PM,10142018,8,,Gray,"Cinnamon, White","Gray+Cinnamon, White","White belly & stripes on tail, Cinnamon face & stripes on back",Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9730926233232 40.7781330751738) +-73.9705837974358,40.7758494849673,13E-AM-1017-13,13E,AM,10172018,13,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,on rock,false,false,false,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.97058379743581 40.7758494849673) +-73.9677903197449,40.7826561917755,21C-AM-1014-03,21C,AM,10142018,3,Adult,Gray,,Gray+,,Above Ground,30,,false,true,true,false,false,,false,true,false,false,false,false,false,false,looked at us from tree,POINT (-73.9677903197449 40.7826561917755) +-73.9561669236168,40.7994737431277,42C-PM-1013-04,42C,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,true,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9561669236168 40.7994737431277) +-73.9604599477345,40.7915035010169,32D-PM-1006-06,32D,PM,10062018,6,Juvenile,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9604599477345 40.7915035010169) +-73.9809876538513,40.7683223242143,1A-PM-1014-05,01A,PM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,true,,POINT (-73.9809876538513 40.7683223242143) +-73.9683460607021,40.7805408447877,18D-AM-1018-03,18D,AM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9683460607021 40.7805408447877) +-73.97033289562,40.7701079697795,7H-AM-1006-14,07H,AM,10062018,14,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.97033289562 40.7701079697795) +-73.9680204438195,40.7743882322654,13H-PM-1010-08,13H,PM,10102018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9680204438195 40.77438823226541) +-73.963911430308,40.7809127228847,21G-AM-1014-05,21G,AM,10142018,5,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,4,,false,true,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.963911430308 40.7809127228847) +-73.9690266660317,40.7853134751509,23A-AM-1018-01,23A,AM,10182018,1,Juvenile,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9690266660317 40.7853134751509) +-73.9672063784809,40.7826070395665,21D-PM-1008-01,21D,PM,10082018,1,,Gray,,Gray+,,Above Ground,8,,false,false,true,false,false,,false,false,false,false,false,true,false,false,,POINT (-73.9672063784809 40.7826070395665) +-73.962534856258,40.7812134517411,22H-PM-1007-01,22H,PM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.962534856258 40.7812134517411) +-73.9739403850622,40.7693162287509,5F-AM-1007-05,05F,AM,10072018,5,Adult,Gray,White,Gray+White,,Above Ground,2,tree,true,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9739403850622 40.7693162287509) +-73.9649103330443,40.7823913860445,22F-PM-1014-08,22F,PM,10142018,8,Adult,Gray,,Gray+,,Above Ground,10,CLIMBED THE TREE,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9649103330443 40.7823913860445) +-73.974515099169,40.7700650799886,6E-PM-1010-03,06E,PM,10102018,3,Adult,Cinnamon,White,Cinnamon+White,white back legs,Ground Plane,FALSE,small open area but w/ 7 large oak trees,false,true,false,true,false,chasing #4,false,false,false,false,false,false,true,false,,POINT (-73.974515099169 40.770065079988605) +-73.9601215198114,40.7909769801241,32D-PM-1006-02,32D,PM,10062018,2,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,true,false,false,true,,POINT (-73.9601215198114 40.7909769801241) +-73.9545225586988,40.7956074663106,39F-AM-1014-03,39F,AM,10142018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9545225586988 40.7956074663106) +-73.9651206201297,40.7785279064847,18G-AM-1014-02,18G,AM,10142018,2,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9651206201297 40.7785279064847) +-73.9790980124501,40.7685934093915,2B-PM-1013-08,02B,PM,10132018,8,Adult,Gray,White,Gray+White,,Above Ground,15,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9790980124501 40.7685934093915) +-73.9742986032935,40.7770454318226,13A-PM-1014-04,13A,PM,10142018,4,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,false,false,,POINT (-73.9742986032935 40.7770454318226) +-73.9763719445827,40.7689551413337,4D-PM-1008-04,04D,PM,10082018,4,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9763719445827 40.7689551413337) +-73.9585862117341,40.7986549251083,40A-PM-1014-05,40A,PM,10142018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,eating (in a tree cage thing),false,false,false,false,false,false,true,false,,POINT (-73.9585862117341 40.7986549251083) +-73.9677474313377,40.7742119240825,12H-PM-1007-03,12H,PM,10072018,3,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,false,peanuts,false,false,false,false,false,false,true,false,,POINT (-73.9677474313377 40.7742119240825) +-73.9711666523376,40.7761513057034,13D-AM-1014-02,13D,AM,10142018,2,Adult,Cinnamon,,Cinnamon+,,Ground Plane,FALSE,,false,true,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9711666523376 40.7761513057034) +-73.9654741695628,40.7890427851106,28B-PM-1010-01,28B,PM,10102018,1,Adult,Gray,White,Gray+White,,Above Ground,10,in a tree,false,false,true,false,false,,false,false,false,false,false,false,false,false,,POINT (-73.9654741695628 40.7890427851106) +-73.9747313152152,40.7653888351839,1G-PM-1010-03,01G,PM,10102018,3,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9747313152152 40.7653888351839) +-73.9541748083177,40.7952758442897,39F-PM-1006-01,39F,PM,10062018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,carrying leaves,false,false,false,false,false,false,true,false,,POINT (-73.9541748083177 40.7952758442897) +-73.9747963162162,40.7745023355775,10B-PM-1014-04,10B,PM,10142018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,false,avoided people,POINT (-73.9747963162162 40.7745023355775) +-73.962524814515,40.7810022923615,21H-PM-1018-03,21H,PM,10182018,3,Adult,Gray,,Gray+,,Above Ground,25,,false,false,true,false,false,,true,false,false,false,false,false,true,false,,POINT (-73.962524814515 40.7810022923615) +-73.9736238258579,40.7688712771191,5F-PM-1007-04,05F,PM,10072018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9736238258579 40.7688712771191) +-73.9722530826293,40.7667138028361,3I-AM-1010-05,03I,AM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9722530826293 40.7667138028361) +-73.9687020800791,40.7735903424522,11H-AM-1010-08,11H,AM,10102018,8,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,true,,POINT (-73.9687020800791 40.7735903424522) +-73.9703604542938,40.7762690223294,13E-AM-1017-04,13E,AM,10172018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9703604542938 40.7762690223294) +-73.9767389132988,40.7689323691424,4D-PM-1008-10,04D,PM,10082018,10,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Above Ground,6,climbed the fence & posed for a picture,false,false,true,false,true,,false,false,false,false,false,true,false,false,,POINT (-73.9767389132988 40.7689323691424) +-73.9630596103391,40.7925720620556,32A-AM-1018-04,32A,AM,10182018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,Base of tree,false,false,false,false,true,,false,false,false,true,false,false,true,false,,POINT (-73.9630596103391 40.7925720620556) +-73.9713257586372,40.7762719619467,13D-AM-1014-09,13D,AM,10142018,9,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9713257586372 40.7762719619467) +-73.9587236619579,40.7991850180434,40A-AM-1010-02,40A,AM,10102018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,edge of park at 108th West,true,false,true,false,false,,false,false,false,true,false,false,false,true,,POINT (-73.9587236619579 40.7991850180434) +-73.9654409838612,40.7901338748522,29A-AM-1013-01,29A,AM,10132018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,climbed tree (oak),false,false,false,false,true,false,false,true,,POINT (-73.9654409838612 40.7901338748522) +-73.9619019299709,40.7924476439693,33B-PM-1010-05,33B,PM,10102018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9619019299709 40.7924476439693) +-73.9639801411692,40.7778921302618,18I-PM-1007-04,18I,PM,10072018,4,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,false,walking sitting up,false,false,false,false,false,false,false,true,,POINT (-73.9639801411692 40.7778921302618) +-73.9631468456897,40.7926110399714,32A-AM-1018-03,32A,AM,10182018,3,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9631468456897 40.7926110399714) +-73.9766693184436,40.7708879215854,6C-PM-1020-01,06C,PM,10202018,1,Adult,Gray,White,Gray+White,,Above Ground,25,Across Transverse,false,false,true,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.9766693184436 40.7708879215854) +-73.9575791421589,40.7959934459432,38D-AM-1017-06,38D,AM,10172018,6,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9575791421589 40.7959934459432) +-73.959412243507,40.7917871123534,33E-AM-1014-01,33E,AM,10142018,1,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,false,digging,false,false,false,false,false,false,false,true,,POINT (-73.959412243507 40.7917871123534) +-73.9724083320538,40.7744163768061,11D-AM-1010-08,11D,AM,10102018,8,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,drinking,false,false,false,false,false,true,false,false,,POINT (-73.9724083320538 40.7744163768061) +-73.9580681648547,40.7992010012653,41B-AM-1010-01,41B,AM,10102018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9580681648547 40.7992010012653) +-73.9688817006443,40.7829120321438,20B-PM-1013-09,20B,PM,10132018,9,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9688817006443 40.7829120321438) +-73.9571808775915,40.7934443866725,35E-AM-1020-02,35E,AM,10202018,2,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,25,,false,false,false,false,false,cleaning herself,false,false,false,false,false,false,true,false,,POINT (-73.9571808775915 40.7934443866725) +-73.9716414586381,40.771760114722,9F-PM-1014-06,09F,PM,10142018,6,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,running (from birds),false,false,false,true,false,false,true,false,,POINT (-73.9716414586381 40.771760114722) +-73.9800094828465,40.7677782585639,1B-AM-1012-04,01B,AM,10122018,4,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,true,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9800094828465 40.7677782585639) +-73.9513477815203,40.7945259614138,39I-PM-1013-02,39I,PM,10132018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,along the road,false,true,true,false,false,playing,false,false,false,false,false,false,false,false,,POINT (-73.9513477815203 40.7945259614138) +-73.9689586689061,40.7839613907139,21B-PM-1017-04,21B,PM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9689586689061 40.7839613907139) +-73.9700158929437,40.7762359066591,14E-AM-1008-18,14E,AM,10082018,18,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9700158929437 40.7762359066591) +-73.9721159387757,40.7660503188637,3I-PM-1013-03,03I,PM,10132018,3,Adult,Black,Cinnamon,Black+Cinnamon,,Ground Plane,FALSE,,true,false,true,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9721159387757 40.7660503188637) +-73.9756533763813,40.7733537881363,8B-PM-1012-07,08B,PM,10122018,7,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9756533763813 40.7733537881363) +-73.9563724838337,40.7882504581015,31I-PM-1019-04,31I,PM,10192018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,true,false,,POINT (-73.95637248383372 40.7882504581015) +-73.9766342759486,40.7687518380873,4D-AM-1012-04,04D,AM,10122018,4,Adult,Gray,,Gray+,,Above Ground,3,on tree trunk,false,true,true,false,false,,false,false,false,false,true,false,true,false,,POINT (-73.9766342759486 40.7687518380873) +-73.9643538221947,40.7917565604735,31A-PM-1017-01,31A,PM,10172018,1,Juvenile,Cinnamon,"Gray, White","Cinnamon+Gray, White","Gray lower back, Gray & Cinnamon selected as Primary with ""lower back"" written in next to Gray. White selected as Highlights. Made executive adjustments.",Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,false,false,,POINT (-73.9643538221947 40.7917565604735) +-73.9766012108307,40.7712310725379,6C-AM-1007-05,06C,AM,10072018,5,Adult,Gray,,Gray+,,Above Ground,20,,false,true,true,false,false,chasing #4,false,false,false,false,false,false,true,false,,POINT (-73.9766012108307 40.7712310725379) +-73.9684632673603,40.7848909525198,23A-AM-1018-05,23A,AM,10182018,5,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,false,false,false,true,,POINT (-73.9684632673603 40.7848909525198) +-73.9746063250438,40.7687654196811,4F-PM-1013-03,04F,PM,10132018,3,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,true,false,false,false,true,,POINT (-73.9746063250438 40.7687654196811) +-73.9570722262693,40.7985706143519,40C-AM-1017-04,40C,AM,10172018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,true,false,true,true,chasing (#3),false,false,false,false,false,false,true,false,,POINT (-73.9570722262693 40.7985706143519) +-73.9617207091245,40.7922839025935,33B-AM-1010-01,33B,AM,10102018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,false,true,digging,false,false,false,false,false,false,true,false,,POINT (-73.9617207091245 40.7922839025935) +-73.9668442742942,40.7870781042595,25B-PM-1007-01,25B,PM,10072018,1,,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9668442742942 40.7870781042595) +-73.970033345821,40.777259393859,15E-PM-1008-08,15E,PM,10082018,8,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.970033345821 40.777259393859) +-73.9619735385483,40.7944667974974,35A-PM-1013-01,35A,PM,10132018,1,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9619735385483 40.7944667974974) +-73.9752079247419,40.7755376979002,11B-AM-1007-01,11B,AM,10072018,1,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,false,,false,false,false,false,true,true,false,false,,POINT (-73.9752079247419 40.7755376979002) +-73.972415182837,40.773080463452,10E-AM-1010-02,10E,AM,10102018,2,Adult,Black,Gray,Black+Gray,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.972415182837 40.773080463452) +-73.9688293382172,40.7738958027568,12G-AM-1012-04,12G,AM,10122018,4,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,true,false,true,false,,POINT (-73.9688293382172 40.773895802756805) +-73.9775592228416,40.7668485329273,1D-PM-1007-01,01D,PM,10072018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9775592228416 40.7668485329273) +-73.9710991846972,40.7689827824241,6H-PM-1020-01,06H,PM,10202018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9710991846972 40.7689827824241) +-73.9698663926657,40.773999710413,12F-PM-1007-09,12F,PM,10072018,9,Adult,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,true,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9698663926657 40.773999710413) +-73.9528482858163,40.7922056218325,36I-PM-1007-08,36I,PM,10072018,8,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,true,false,true,false,,POINT (-73.9528482858163 40.7922056218325) +-73.9616141152539,40.7921803313341,33C-PM-1007-04,33C,PM,10072018,4,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9616141152539 40.7921803313341) +-73.9744390217386,40.7663168362582,2G-AM-1010-02,02G,AM,10102018,2,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9744390217386 40.7663168362582) +-73.9635140434993,40.7912807969365,31B-AM-1017-01,31B,AM,10172018,1,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9635140434993 40.7912807969365) +-73.9503533343658,40.7976543603953,42H-PM-1014-04,42H,PM,10142018,4,Adult,Gray,Cinnamon,Gray+Cinnamon,,Above Ground,15,,true,true,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9503533343658 40.7976543603953) +-73.9675637870968,40.7823880671728,21D-PM-1008-02,21D,PM,10082018,2,,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,false,,POINT (-73.9675637870968 40.7823880671728) +-73.9580906814132,40.7948404060484,37D-PM-1014-01,37D,PM,10142018,1,Adult,Gray,Cinnamon,Gray+Cinnamon,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,eyes from a safe distance,POINT (-73.9580906814132 40.7948404060484) +-73.9678831312936,40.7847605974975,23B-PM-1012-06,23B,PM,10122018,6,Adult,Gray,,Gray+,,Above Ground,30,,false,false,false,false,false,,true,false,false,false,false,false,false,false,scolding,POINT (-73.9678831312936 40.7847605974975) +-73.9613701960898,40.7943363227822,35B-PM-1013-04,35B,PM,10132018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,true,false,true,false,true,"got threatened by dog (same dog,dog #1)",false,false,false,false,false,false,false,true,runs from (dog),POINT (-73.9613701960898 40.7943363227822) +-73.964661337306,40.7769785494935,17I-AM-1014-03,17I,AM,10142018,3,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White",Cinnamon face,Above Ground,10,,false,false,true,false,false,climbing (dog barked & it ran up tree),false,false,false,false,false,false,true,false,,POINT (-73.964661337306 40.7769785494935) +-73.9665572004288,40.7804347548303,19E-PM-1018-04,19E,PM,10182018,4,,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9665572004288 40.7804347548303) +-73.9759163300535,40.7736180793606,9B-AM-1010-08,09B,AM,10102018,8,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White","Cinnamon head, White (Almost Silver)",Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,true,false,false,false,,POINT (-73.9759163300535 40.7736180793606) +-73.9756457597888,40.7703559775625,6D-PM-1020-02,06D,PM,10202018,2,Juvenile,Gray,,Gray+,,Ground Plane,FALSE,,false,true,false,false,false,,false,false,false,false,true,false,false,true,,POINT (-73.9756457597888 40.7703559775625) +-73.9662895079734,40.7843300758044,23C-AM-1019-01,23C,AM,10192018,1,Adult,Gray,"Cinnamon, White","Gray+Cinnamon, White","Gray & Cinnamon selected as Primary. Gray, Cinnamon & White selected as Highlights. Made executive adjustments.",Above Ground,7,,false,false,true,true,false,eating (on branch),true,false,false,false,false,false,true,false,,POINT (-73.9662895079734 40.7843300758044) +-73.9645437409662,40.7811599933331,21F-PM-1018-02,21F,PM,10182018,2,Juvenile,Cinnamon,Gray,Cinnamon+Gray,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,false,true,,POINT (-73.9645437409662 40.7811599933331) +-73.9639431360458,40.7908677445466,30B-AM-1007-04,30B,AM,10072018,4,Adult,Gray,,Gray+,,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,false,true,,POINT (-73.9639431360458 40.7908677445466) +-73.9704015859639,40.7825600069973,19A-PM-1013-05,19A,PM,10132018,5,Adult,Gray,White,Gray+White,,Ground Plane,FALSE,,false,false,false,false,true,,false,false,false,false,false,false,true,false,,POINT (-73.9704015859639 40.7825600069973) +-73.9665871993517,40.7836775064883,22D-PM-1012-07,22D,PM,10122018,7,Adult,Gray,"Black, Cinnamon, White","Gray+Black, Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,false,true,false,,POINT (-73.9665871993517 40.7836775064883) +-73.9639941227864,40.7899152327912,29B-PM-1010-02,29B,PM,10102018,2,,Gray,"Cinnamon, White","Gray+Cinnamon, White",,Ground Plane,FALSE,,false,false,false,true,false,,false,false,false,false,false,false,true,false,,POINT (-73.9639941227864 40.7899152327912) +-73.9754794191553,40.7696404489025,5E-PM-1012-01,05E,PM,10122018,1,Adult,Cinnamon,"Gray, White","Cinnamon+Gray, White",,Ground Plane,FALSE,,false,false,false,true,true,,false,false,false,false,false,true,false,false,,POINT (-73.9754794191553 40.7696404489025) diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 Central-Park-Squirrel-Census-Data.url b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 Central-Park-Squirrel-Census-Data.url new file mode 100644 index 0000000000000000000000000000000000000000..509c2462115d35df51bb6c0911967f4b2b01c949 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 Central-Park-Squirrel-Census-Data.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://data.cityofnewyork.us/Environment/2018-Central-Park-Squirrel-Census-Squirrel-Data/vfnx-vebw \ No newline at end of file diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 The Great Squirrel Census Data Analysis (with Pandas!).mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 The Great Squirrel Census Data Analysis (with Pandas!).mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3c23a20fa90d87df93844c5896d4a5746849c299 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 The Great Squirrel Census Data Analysis (with Pandas!).mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:700f8e2e4eea7c797a657e3198aa7dc4adc4e4d4aefc35e078406eac75177d78 +size 151817779 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 The Great Squirrel Census Data Analysis (with Pandas!)_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 The Great Squirrel Census Data Analysis (with Pandas!)_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..89c25560637c3ee41e1c8e468fcde1a2824b3d5c --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 The Great Squirrel Census Data Analysis (with Pandas!)_vi.srt @@ -0,0 +1,632 @@ +1 +00:00:00,510 --> 00:00:04,950 +Bây giờ bạn đã học cách thực hiện các khái niệm cơ bản về phân tích dữ liệu + +2 +00:00:05,280 --> 00:00:08,250 +với gấu trúc, đã đến lúc thử nghiệm kiến thức của bạn. + +3 +00:00:08,700 --> 00:00:13,700 +Và chúng tôi sẽ làm việc với một tập dữ liệu thực sự thú vị. Trở lại năm 2018/2019, một nhóm tình + +4 +00:00:13,950 --> 00:00:18,390 +nguyện viên đã đến công viên trung tâm New York và về cơ + +5 +00:00:18,450 --> 00:00:23,100 +bản họ đã chải toàn bộ công viên để tìm tất cả các con sóc. + +6 +00:00:23,730 --> 00:00:28,680 +Vì vậy, điều này dẫn đến một tập dữ liệu khổng lồ về sóc, số lượng sóc, + +7 +00:00:28,680 --> 00:00:31,410 +màu lông của sóc và rất nhiều thứ khác. + +8 +00:00:31,860 --> 00:00:36,860 +Và tất cả dữ liệu này có thể được tìm thấy trên trang web dữ liệu mở của thành phố New York mà chúng tôi + +9 +00:00:37,020 --> 00:00:40,740 +sẽ liên kết đến trong tài nguyên khóa học. Khi bạn đến đây, bạn có + +10 +00:00:40,740 --> 00:00:44,130 +thể xem tất cả dữ liệu mà họ đã thu thập. + +11 +00:00:44,490 --> 00:00:48,540 +Nếu bạn xem tất cả các cột trong tập dữ liệu này và nhấp vào hiển thị + +12 +00:00:48,540 --> 00:00:52,770 +tất cả, bạn có thể thấy họ đã ghi lại vị trí của từng con sóc, họ cấp + +13 +00:00:53,010 --> 00:00:55,320 +cho mỗi con sóc một ID duy nhất, họ + +14 +00:00:55,560 --> 00:00:59,730 +đánh giá xem con sóc có phải là con trưởng thành hay không. hoặc một con non, và + +15 +00:01:00,030 --> 00:01:04,379 +họ xem màu lông cơ bản là gì. Vì vậy, nó có thể có màu xám, + +16 +00:01:04,379 --> 00:01:07,860 +quế có màu đỏ hoặc đen. Bây giờ, nếu bạn cuộn xuống + +17 +00:01:07,860 --> 00:01:10,830 +thực sự sẽ có một hình dung thực sự thú vị về dữ + +18 +00:01:11,090 --> 00:01:13,130 +liệu này, nơi họ đã vẽ tất cả những + +19 +00:01:13,130 --> 00:01:15,800 +con sóc này lên bản đồ của công viên trung tâm. + +20 +00:01:16,220 --> 00:01:21,220 +Vì vậy, bạn có thể xem xét sự phân bố của quần thể sóc trong công viên trung + +21 +00:01:21,380 --> 00:01:21,680 +tâm. + +22 +00:01:21,680 --> 00:01:24,830 +Vì vậy, bạn có thể nhìn thấy những con sóc màu đỏ, nơi những con màu xám + +23 +00:01:24,830 --> 00:01:27,860 +và những con màu đen ở đâu. Vì vậy, chỉ có ba màu, thực sự. + +24 +00:01:28,040 --> 00:01:30,830 +Vì vậy, những gì bạn sẽ làm là bạn sẽ + +25 +00:01:30,860 --> 00:01:34,670 +truy cập trang web này, nhấp vào xuất và tải xuống dữ liệu CSV. + +26 +00:01:35,780 --> 00:01:36,830 +Bây giờ, một khi + +27 +00:01:36,830 --> 00:01:41,830 +bạn làm điều đó, bạn sẽ kết thúc với dữ liệu về sóc của công viên trung tâm năm 2018 như thế này. + +28 +00:01:42,890 --> 00:01:47,890 +Bây giờ bạn sẽ kéo dữ liệu đó vào thư mục dự án ngày 25 của mình và nhấp vào hệ số lại để + +29 +00:01:48,470 --> 00:01:49,770 +chuyển dữ liệu đó vào. + +30 +00:01:50,240 --> 00:01:55,130 +Và bạn có thể thấy rằng con số này lớn hơn rất nhiều so với những dữ liệu chúng ta có trước đây. + +31 +00:01:55,430 --> 00:01:57,800 +Có hàng ngàn mục nhập, và đó là sự cống + +32 +00:01:57,860 --> 00:02:00,740 +hiến thực sự mà những tình nguyện viên này đã đi khắp nơi + +33 +00:02:00,740 --> 00:02:04,160 +để ghi lại tất cả các dữ liệu này, quan sát tất cả các con sóc. + +34 +00:02:04,340 --> 00:02:07,040 +Đó hẳn là một nhiệm vụ rất tẻ nhạt. + +35 +00:02:07,340 --> 00:02:09,740 +Nhưng bây giờ đã có người khác thực hiện phần khó, chúng + +36 +00:02:10,039 --> 00:02:12,980 +tôi có thể thực hiện một số phân tích dữ liệu trên dữ liệu đó. + +37 +00:02:13,430 --> 00:02:18,020 +Vì vậy, tôi muốn bạn nhận xét mọi thứ mà bạn có cho đến nay + +38 +00:02:18,020 --> 00:02:18,853 +trong dự + +39 +00:02:19,070 --> 00:02:24,070 +án ngày 25 của mình và mục tiêu là bạn sử dụng dữ liệu đó và + +40 +00:02:24,290 --> 00:02:25,123 +sử dụng + +41 +00:02:25,160 --> 00:02:30,160 +những gì bạn đã học về gấu trúc để có thể tạo CSV có tên là + +42 +00:02:32,330 --> 00:02:36,050 +squirrel_count có một bảng nhỏ chỉ chứa màu lông, vì vậy + +43 +00:02:36,170 --> 00:02:40,580 +chỉ có ba màu lông và chúng được ghi vào cột màu lông chính. + +44 +00:02:41,090 --> 00:02:44,990 +Và về cơ bản nó có thể có màu xám, màu + +45 +00:02:45,020 --> 00:02:47,060 +đỏ quế hoặc màu đen. + +46 +00:02:47,090 --> 00:02:50,810 +Chỉ có ba giá trị có thể có trong cột đó. Bây giờ, những gì bạn + +47 +00:02:50,840 --> 00:02:55,460 +sẽ làm là bạn sẽ tìm ra tổng cộng có bao nhiêu con + +48 +00:02:55,460 --> 00:02:56,510 +sóc xám, bao + +49 +00:02:56,540 --> 00:03:01,540 +nhiêu con quế và bao nhiêu con đen dựa trên cột màu lông chính + +50 +00:03:02,020 --> 00:03:02,853 +đó. + +51 +00:03:03,040 --> 00:03:07,330 +Và sau đó, bạn sẽ lấy dữ liệu đó và xây dựng một khung dữ liệu mới từ nó + +52 +00:03:07,660 --> 00:03:08,590 +và sử dụng nó, + +53 +00:03:08,620 --> 00:03:13,620 +tạo CSV cuối cùng này bằng cách sử dụng gấu trúc. Bây giờ bạn đã biết mình cần phải làm gì, hãy + +54 +00:03:14,260 --> 00:03:18,160 +suy nghĩ về vấn đề và xem liệu bạn có thể hoàn thành thử thách này hay không. + +55 +00:03:18,400 --> 00:03:22,690 +Tạm dừng video ngay bây giờ. Được rồi. + +56 +00:03:22,690 --> 00:03:25,870 +Nếu bạn đã nhận xét ra dòng nơi bạn đã nhập gấu trúc, thì rõ + +57 +00:03:25,900 --> 00:03:27,760 +ràng bạn sẽ phải làm lại điều đó. + +58 +00:03:28,330 --> 00:03:32,320 +Vì vậy, chúng ta hãy nghĩ về những gì chúng ta muốn làm. Chúng tôi muốn tách cột + +59 +00:03:32,320 --> 00:03:36,190 +là màu lông chính. Và nếu nó có ích cho + +60 +00:03:36,190 --> 00:03:40,120 +bạn, bạn thực sự có thể hình dung rõ hơn dữ liệu trên trang + +61 +00:03:40,120 --> 00:03:44,740 +web này, nơi họ có bản xem trước bảng. Vì vậy, bạn có thể thấy rằng đây là màu + +62 +00:03:44,800 --> 00:03:47,410 +lông chính và bạn có thể thấy các màu đã được ghi lại. + +63 +00:03:48,130 --> 00:03:52,180 +Vì vậy, mục tiêu của chúng tôi là bằng cách nào đó nắm được chuỗi dữ liệu chứa + +64 +00:03:52,210 --> 00:03:56,170 +toàn bộ cột này, tìm ra bao nhiêu trong số chúng là màu xám, bao nhiêu trong + +65 +00:03:56,170 --> 00:04:01,060 +số đó là màu đen và bao nhiêu là quế. Chung ta se lam như thê nao? + +66 +00:04:01,150 --> 00:04:03,820 +Trước hết, hãy nắm bắt dữ liệu của chúng tôi. + +67 +00:04:03,820 --> 00:04:08,820 +Vì vậy, chúng tôi sẽ sử dụng gấu trúc của chúng tôi. phương thức read_csv. + +68 +00:04:09,670 --> 00:04:14,650 +Và sau đó chúng tôi sẽ hướng nó đến dữ liệu điều tra dân số sóc của các công viên trung tâm + +69 +00:04:14,650 --> 00:04:16,029 +năm 2018 này. Bây giờ, + +70 +00:04:16,029 --> 00:04:19,779 +nếu bạn muốn, bạn thực sự có thể nhấp chuột phải vào refactor và đổi tên nó + +71 +00:04:19,779 --> 00:04:23,890 +thành một cái gì đó ngắn hơn một chút. Nhưng bởi vì tôi biết rằng PyCharm sẽ thực sự điền + +72 +00:04:23,950 --> 00:04:25,720 +thông tin này cho tôi miễn là tôi + +73 +00:04:26,260 --> 00:04:28,840 +bắt đầu với một chuỗi và tệp đó nằm trong cùng một thư mục, + +74 +00:04:29,110 --> 00:04:33,460 +nó sẽ thực sự gõ tất cả nếu tôi chỉ cần nhấn enter, sau đó nó không ' không thực sự quan trọng. + +75 +00:04:34,000 --> 00:04:34,780 +Nhưng tất nhiên, + +76 +00:04:34,780 --> 00:04:37,600 +hãy đảm bảo rằng bạn không mắc lỗi chính tả nào ở đây nếu bạn + +77 +00:04:37,870 --> 00:04:41,290 +đang gõ nó ra, vì nếu không khi bạn nhấn run, bạn sẽ nhận được cả đống văn + +78 +00:04:41,300 --> 00:04:43,000 +bản lỗi bên trong bảng điều khiển của mình. + +79 +00:04:43,870 --> 00:04:46,600 +Vì vậy, khi tôi đã đọc thành công CSV đó, bây giờ + +80 +00:04:46,630 --> 00:04:50,080 +tôi đã có một khung dữ liệu. Từ khung dữ liệu đó, + +81 +00:04:50,110 --> 00:04:53,980 +tôi có thể nắm được cột mà tôi quan tâm được gọi là + +82 +00:04:54,220 --> 00:04:56,530 +màu lông chính. Bây giờ, vì nó + +83 +00:04:56,530 --> 00:05:01,150 +có khoảng trắng, nên việc truy cập dữ liệu đó dễ dàng hơn bằng cách sử dụng + +84 +00:05:01,150 --> 00:05:04,900 +dấu ngoặc vuông và sau đó đặt tên của cột đó như thế này. + +85 +00:05:04,990 --> 00:05:07,630 +Đây là một trong những phương pháp mà chúng tôi đã chỉ cho bạn. Bây giờ, khi + +86 +00:05:07,630 --> 00:05:09,790 +tôi đã nắm được cột đó, + +87 +00:05:09,790 --> 00:05:14,080 +điều tiếp theo tôi cần làm là tìm tất cả các hàng + +88 +00:05:14,110 --> 00:05:17,470 +trong cột đó có dữ liệu bằng mỗi màu. + +89 +00:05:17,500 --> 00:05:20,980 +Vì vậy, có màu là màu xám, vì + +90 +00:05:20,980 --> 00:05:24,250 +vậy màu xám không phải là 'ey'. + +91 +00:05:24,970 --> 00:05:28,600 +Và sau đó khi chúng tôi đã nắm được tất cả các con sóc xám, + +92 +00:05:28,870 --> 00:05:31,840 +chúng tôi sẽ lấy điều đó ra khỏi dữ liệu của mình. + +93 +00:05:32,440 --> 00:05:36,130 +Vì vậy, bây giờ chúng ta nên có một loạt các con sóc xám, và có lẽ là + +94 +00:05:36,580 --> 00:05:39,010 +một ý tưởng hay để in chúng ra chỉ để xem + +95 +00:05:39,040 --> 00:05:41,320 +liệu điều đó có thực sự hiệu quả hay không. + +96 +00:05:41,650 --> 00:05:45,280 +Và bởi vì tôi dự đoán sẽ có rất nhiều hàng có sóc xám, nên hợp lý hơn khi + +97 +00:05:45,490 --> 00:05:49,900 +đặt nó thành số nhiều, những con sóc màu xám. Vì vậy, bây giờ nếu tôi nhấn run, + +98 +00:05:50,200 --> 00:05:55,200 +bạn có thể thấy danh sách ở đây là tất cả các hàng có chứa một con sóc màu xám. + +99 +00:05:57,260 --> 00:05:59,570 +Bây giờ nó đã biên tập lại bảng này để + +100 +00:05:59,570 --> 00:06:03,710 +nó thực sự có thể hiển thị nó trong bảng điều khiển bởi vì chúng tôi biết rằng có + +101 +00:06:03,710 --> 00:06:05,900 +rất nhiều, nhiều cột và có rất nhiều hàng. + +102 +00:06:06,140 --> 00:06:10,340 +Nó chỉ hiển thị cho bạn một vài hàng đầu tiên và sau đó là một vài hàng cuối cùng và cả + +103 +00:06:10,340 --> 00:06:12,470 +một vài cột đầu tiên và một vài cột cuối cùng. + +104 +00:06:12,890 --> 00:06:16,760 +Vì vậy, chúng tôi có thể khá chắc chắn rằng chúng tôi đã quản lý để nắm được tất cả các + +105 +00:06:16,760 --> 00:06:20,990 +hàng có sóc xám làm màu lông chính của chúng. Bây giờ, nếu chúng ta muốn + +106 +00:06:20,990 --> 00:06:25,910 +biết số lượng sóc xám thì sao? Chà, chúng ta có thể sử dụng phương + +107 +00:06:25,910 --> 00:06:30,910 +pháp độ dài của mình bởi vì hãy nhớ rằng, một khi chúng ta nắm được các hàng, + +108 +00:06:31,610 --> 00:06:35,000 +nó sẽ được coi như một tệp có thể lặp lại, như + +109 +00:06:35,330 --> 00:06:40,330 +một danh sách và có thể sử dụng các phương thức như độ dài trên dữ liệu này. + +110 +00:06:41,060 --> 00:06:44,330 +Vì vậy, bây giờ nếu chúng tôi in grey_squirrels_count, + +111 +00:06:45,350 --> 00:06:50,350 +bạn có thể thấy rằng chúng tôi có tổng cộng 2.473 con sóc xám. + +112 +00:06:51,620 --> 00:06:56,420 +Vì vậy, bây giờ tất cả những gì tôi cần làm là lặp lại quá trình này + +113 +00:06:56,420 --> 00:07:00,440 +cho những chú sóc màu khác. Vì vậy, tôi sẽ gọi nó là một con sóc đỏ, + +114 +00:07:00,470 --> 00:07:02,570 +mặc dù về mặt lý thuyết, màu lông của chúng là màu quế. + +115 +00:07:02,990 --> 00:07:07,580 +Vì vậy, tôi sẽ sao chép và dán nó vào đó trong trường hợp tôi mắc lỗi chính + +116 +00:07:07,580 --> 00:07:10,400 +tả và con sóc cuối cùng là con sóc đen. + +117 +00:07:11,270 --> 00:07:13,910 +Vì vậy, đó là tất cả ba loại sóc, + +118 +00:07:14,000 --> 00:07:17,240 +và nếu tôi tiếp tục và in ra tất cả những loại + +119 +00:07:17,510 --> 00:07:22,510 +này, như số lượng sóc đỏ, số lượng sóc đen và số lượng sóc xám, bạn có thể thấy + +120 +00:07:23,390 --> 00:07:28,390 +rằng bạn có hầu hết là sóc xám, một số ít màu đỏ và rất hiếm khi bạn thực + +121 +00:07:28,610 --> 00:07:30,710 +sự nhìn thấy một con sóc đen. + +122 +00:07:30,920 --> 00:07:35,540 +Tôi chắc chắn đã không nhìn thấy một gần đây. Bây giờ chúng ta đã có ba giá trị của mình, đã + +123 +00:07:35,570 --> 00:07:39,980 +đến lúc xây dựng khung dữ liệu của chúng ta. Vì vậy, để xây dựng khung dữ liệu + +124 +00:07:40,100 --> 00:07:43,640 +của chúng tôi, cách dễ nhất là thực sự chỉ cần tạo một từ điển. + +125 +00:07:44,000 --> 00:07:48,470 +Vì vậy, tôi sẽ tạo một từ điển dữ liệu và từ điển này + +126 +00:07:48,530 --> 00:07:50,450 +sẽ có hai cặp khóa-giá trị. + +127 +00:07:50,630 --> 00:07:53,750 +Vì vậy, chìa khóa đầu tiên + +128 +00:07:55,070 --> 00:07:59,690 +sẽ là màu lông và điều này sẽ bao gồm ba + +129 +00:07:59,720 --> 00:08:04,400 +màu lông, đó là, um, xám, quế hoặc đỏ và đen. + +130 +00:08:05,210 --> 00:08:06,830 +Và sau đó, + +131 +00:08:06,890 --> 00:08:10,760 +cặp giá trị khóa tiếp theo sẽ là số lượng. + +132 +00:08:11,420 --> 00:08:15,830 +Vì vậy, bây giờ chúng ta có thể tạo một danh sách trong đó giá trị đầu tiên + +133 +00:08:15,830 --> 00:08:19,520 +sẽ là số lượng sóc xám, tiếp theo sẽ là số lượng sóc đỏ và + +134 +00:08:19,520 --> 00:08:24,050 +cuối cùng, nó sẽ là số lượng sóc đen. Vì vậy, bây giờ chúng ta đã có từ + +135 +00:08:24,320 --> 00:08:26,750 +điển của mình và nó trông giống như thế này, + +136 +00:08:27,500 --> 00:08:31,700 +sau đó chúng ta có thể tiếp tục và thực sự biến nó thành một khung dữ liệu. + +137 +00:08:32,090 --> 00:08:32,929 +Vì vậy, để + +138 +00:08:32,929 --> 00:08:37,220 +làm điều đó, chúng ta cần nắm giữ các con gấu trúc và sau đó nắm giữ lớp khung + +139 +00:08:37,580 --> 00:08:41,120 +dữ liệu, sau đó khởi tạo nó bằng cách sử dụng từ điển dữ liệu này. + +140 +00:08:41,570 --> 00:08:44,300 +Vì vậy, tôi sẽ lưu nó dưới dạng df, df cho khung dữ liệu. + +141 +00:08:44,780 --> 00:08:48,860 +Và sau đó, điều cuối cùng tôi cần làm là đưa + +142 +00:08:48,920 --> 00:08:51,620 +df của tôi chuyển đổi thành CSV. + +143 +00:08:52,190 --> 00:08:54,530 +Vì vậy, bây giờ tôi phải chỉ định + +144 +00:08:54,530 --> 00:08:59,250 +tên của tệp, mà tôi sẽ gọi là squirrel_count. csv và sau khi tôi nhấn run, bạn + +145 +00:08:59,730 --> 00:09:03,540 +sẽ thấy tệp mới đó hiển thị ngay tại đây và bạn có thể thấy + +146 +00:09:03,990 --> 00:09:08,990 +rằng nó đã xây dựng tệp CSV mới của tôi với tất cả dữ liệu mà tôi đã trích xuất + +147 +00:09:09,840 --> 00:09:13,260 +từ cuộc điều tra dân số ở công viên trung tâm và bây + +148 +00:09:13,620 --> 00:09:17,220 +giờ tôi đã có một bảng mới với dữ liệu mà tôi quan tâm. + +149 +00:09:17,790 --> 00:09:21,780 +Vậy bạn đã xoay sở để hoàn thành thử thách này chưa? Nếu bạn thấy nó khó làm việc với + +150 +00:09:21,780 --> 00:09:25,950 +các khung dữ liệu và tìm ra cách giữ các cột hoặc cách giữ các hàng + +151 +00:09:25,950 --> 00:09:29,490 +tùy thuộc vào các điều kiện mà chúng ta quan tâm, thì tôi thực + +152 +00:09:29,490 --> 00:09:33,360 +sự khuyên bạn nên quay lại bài học trước, chỉ cần cố gắng tự viết + +153 +00:09:33,630 --> 00:09:37,830 +ra mã mà chúng tôi đang thực hiện trong từng bước của video, chỉ để đảm bảo + +154 +00:09:37,830 --> 00:09:38,663 +rằng bạn + +155 +00:09:38,790 --> 00:09:41,910 +chắc chắn một trăm phần trăm với những gì đang diễn ra. + +156 +00:09:42,630 --> 00:09:44,820 +Khi bạn đã sẵn sàng, hãy bắt đầu + +157 +00:09:44,880 --> 00:09:49,350 +bài học tiếp theo, cuối cùng chúng ta sẽ xây dựng trò chơi các bang ở Hoa Kỳ. + +158 +00:09:50,030 --> 00:09:52,410 +Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 day-25-end.zip b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 day-25-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..019f9ce50b11420428bfd8f2b49ac8a7d206d086 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/004 day-25-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64d2b53245e3ab0656f579a0cb2bf0ed556046ff784b68b500f7dc8f644694de +size 146484 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 Sporcles-Name-the-States-Game.url b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 Sporcles-Name-the-States-Game.url new file mode 100644 index 0000000000000000000000000000000000000000..78b9c7ed49668e0c586888e733f5e0516bfd06ee --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 Sporcles-Name-the-States-Game.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.sporcle.com/games/g/states \ No newline at end of file diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 U.S. States Game Part 1 Setup.mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 U.S. States Game Part 1 Setup.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..39c166d00c8652f6d049c28c9e2f156ba23cca7e --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 U.S. States Game Part 1 Setup.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dad12b45ebfb62d01dedd401244517102ba4ba04d7b02b7e5fb4148423865ccf +size 92093805 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 U.S. States Game Part 1 Setup_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 U.S. States Game Part 1 Setup_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..68b41acb7c219e62d17b68a003cdbb7b7f58778e --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 U.S. States Game Part 1 Setup_vi.srt @@ -0,0 +1,624 @@ +1 +00:00:00,240 --> 00:00:03,600 +Được rồi. Đã đến lúc áp dụng một số nội dung mà chúng ta đã học được vào thực tế. + +2 +00:00:04,140 --> 00:00:09,140 +Và sản phẩm mà chúng tôi đang cố gắng xây dựng là một bài kiểm tra các tiểu bang của Hoa Kỳ. + +3 +00:00:10,220 --> 00:00:14,030 +Một trong những trang web yêu thích của tôi cho các câu đố là một trang web có tên là Sporcle. + +4 +00:00:14,570 --> 00:00:19,100 +Và họ chuyên về các câu đố mà về cơ bản chỉ là bạn lập danh sách. + +5 +00:00:19,730 --> 00:00:23,510 +Và một trong những câu đố hay nhất mà họ có là danh + +6 +00:00:23,510 --> 00:00:27,290 +sách các bang của Hoa Kỳ. Bạn có thể truy cập liên kết này trong tài + +7 +00:00:27,650 --> 00:00:32,240 +nguyên khóa học và bạn có thể bắt đầu chơi trò chơi này. Họ giả định rằng có 50 Tiểu + +8 +00:00:32,240 --> 00:00:36,890 +bang ở Hoa Kỳ và mỗi lần bạn nhập tên của một tiểu bang, thì tiểu + +9 +00:00:37,160 --> 00:00:40,760 +bang đó sẽ được gắn nhãn và bạn ghi được một điểm. + +10 +00:00:41,150 --> 00:00:45,680 +Mục đích là có thể đặt tên cho nhiều trạng thái mà bạn có thể nhớ được. + +11 +00:00:46,190 --> 00:00:51,140 +Về cơ bản, đây là trò chơi mà chúng tôi đang cố gắng tái tạo bằng cách sử dụng rùa + +12 +00:00:51,140 --> 00:00:55,130 +và sử dụng một số dữ liệu CSV. Và đây là kết quả cuối cùng trông như thế nào. + +13 +00:00:55,730 --> 00:00:57,470 +Chúng tôi có một màn hình con + +14 +00:00:57,860 --> 00:01:02,000 +rùa có nền là hình ảnh của Hoa Kỳ với tất cả các tiểu bang được + +15 +00:01:02,090 --> 00:01:02,923 +bỏ trống. + +16 +00:01:03,410 --> 00:01:07,160 +Và những gì chúng ta sẽ làm là nhìn vào hình dạng của bản đồ + +17 +00:01:07,190 --> 00:01:09,410 +và ghi nhớ các trạng thái trông như + +18 +00:01:09,800 --> 00:01:12,530 +thế nào, cố gắng đặt tên càng nhiều càng tốt. + +19 +00:01:13,040 --> 00:01:17,300 +Và khi chúng tôi đã nhập tên và nhấn OK, sau đó nếu nó thực sự tồn tại, + +20 +00:01:17,360 --> 00:01:20,780 +nó sẽ được thêm vào bản đồ. Nó có vẻ đơn giản, nhưng mã + +21 +00:01:21,080 --> 00:01:26,080 +sẽ cần một số điều mới mà chúng ta tìm hiểu về cách sử dụng dữ liệu, đặc biệt + +22 +00:01:26,360 --> 00:01:29,300 +là dữ liệu từ CSV. Bây giờ, điều đầu tiên + +23 +00:01:29,330 --> 00:01:32,690 +tôi muốn bạn làm là truy cập vào liên kết trong tài + +24 +00:01:32,690 --> 00:01:37,370 +nguyên khóa học đưa bạn đến tệp bắt đầu cho trò chơi các bang của Hoa Kỳ. + +25 +00:01:37,850 --> 00:01:42,650 +Bây giờ, khi bạn ở đây, bạn sẽ phân tách bản sao của chính mình về dự án này và sau + +26 +00:01:42,980 --> 00:01:45,560 +đó bạn sẽ nhấp vào ba dấu chấm này ở + +27 +00:01:45,620 --> 00:01:48,980 +trên cùng, sau đó tải xuống toàn bộ dự án này dưới dạng tệp zip. + +28 +00:01:49,280 --> 00:01:52,610 +Hãy nhớ rằng bạn sẽ không thấy thông báo này cho đến khi + +29 +00:01:53,000 --> 00:01:56,690 +bạn chia nhỏ dự án và nếu bạn chưa đăng nhập, thì khi bạn + +30 +00:01:56,960 --> 00:01:59,450 +tách dự án, nó sẽ cung cấp cho bạn + +31 +00:01:59,780 --> 00:02:02,360 +một tên ngẫu nhiên, có nghĩa là khi bạn tải + +32 +00:02:02,450 --> 00:02:07,450 +xuống dưới dạng zip, bạn sẽ phải đổi tên tệp zip đó thành us-state-game để dự án của bạn + +33 +00:02:08,270 --> 00:02:09,530 +có tên chính xác. + +34 +00:02:10,610 --> 00:02:15,610 +Vì vậy, cách dễ nhất, như mọi khi, là chỉ cần đăng nhập, fork một bản sao của dự án và sau + +35 +00:02:16,220 --> 00:02:19,580 +đó tải xuống dưới dạng tệp zip. Sau khi hoàn thành việc + +36 +00:02:19,790 --> 00:02:22,580 +đó, bạn có thể mở nó bên trong PyCharm. + +37 +00:02:23,150 --> 00:02:26,270 +Và bạn có thể thấy rằng có ba tệp ở đây. + +38 +00:02:26,390 --> 00:02:29,270 +Một được gọi là 50_states. csv và đây là tệp + +39 +00:02:29,630 --> 00:02:34,630 +CSV chứa tất cả 50 Tiểu bang ở Hoa Kỳ theo tên và sau đó là một số giá trị + +40 +00:02:35,870 --> 00:02:39,110 +X và Y, mà chúng ta sẽ nói về một chút sau này. + +41 +00:02:39,800 --> 00:02:44,090 +Điều tiếp theo bạn sẽ thấy là hình ảnh trống. gif. Bây giờ, lý do tại + +42 +00:02:44,090 --> 00:02:49,010 +sao nó là. gif hơn là a. png hoặc. jpg thực sự là vì + +43 +00:02:49,040 --> 00:02:51,680 +con rùa chỉ hoạt động với một định dạng hình ảnh này. + +44 +00:02:51,980 --> 00:02:56,600 +Vì vậy, để hiển thị một hình ảnh, chúng tôi thực sự cần phải chuyển đổi hình ảnh đó thành + +45 +00:02:56,690 --> 00:02:58,640 +tệp gif, điều này tôi đã thực hiện. + +46 +00:02:59,200 --> 00:03:03,940 +Tệp này chỉ là hình ảnh của tất cả các Tiểu bang của Hoa Kỳ bị bỏ + +47 +00:03:04,090 --> 00:03:08,320 +trống, vì vậy nó không có tên. Vì vậy, nó đã sẵn sàng để người dùng của chúng tôi bắt đầu đoán. + +48 +00:03:08,950 --> 00:03:10,570 +Cuối cùng, bạn + +49 +00:03:10,570 --> 00:03:14,440 +sẽ có một main trống. tệp py và đây là nơi chúng ta sẽ bắt đầu. + +50 +00:03:14,920 --> 00:03:17,740 +Vì vậy, điều đầu tiên tôi sẽ làm là tôi sẽ + +51 +00:03:17,770 --> 00:03:22,770 +nhập rùa, vì vậy hãy nhập thẳng mô-đun. Và sau đó tôi sẽ tạo một đối tượng màn + +52 +00:03:24,100 --> 00:03:27,940 +hình từ con rùa. Lớp màn hình. Bây giờ, khi + +53 +00:03:27,940 --> 00:03:29,350 +tôi đã có màn + +54 +00:03:29,380 --> 00:03:32,860 +hình của mình, sau đó tôi sẽ thay đổi tiêu đề + +55 +00:03:32,880 --> 00:03:37,200 +của dự án thành U. S. Trò chơi Kỳ. + +56 +00:03:38,340 --> 00:03:42,300 +Và cuối cùng, tôi sẽ khiến màn hình của mình chỉ thoát ra khi nhấp chuột. + +57 +00:03:42,810 --> 00:03:45,600 +Điều này khá cơ bản, chúng tôi đã làm điều này rất nhiều lần. + +58 +00:03:45,870 --> 00:03:49,710 +Nhưng điều tiếp theo mà chúng tôi sẽ làm là một chút mới mẻ vì chúng tôi chưa + +59 +00:03:49,710 --> 00:03:52,200 +thực sự làm việc với hình ảnh trong rùa trước đây. + +60 +00:03:52,710 --> 00:03:57,330 +Một trong những điều bạn có thể làm với rùa là bạn có thể thiết lập hình dạng của con rùa + +61 +00:03:57,630 --> 00:03:59,880 +thành một hình dạng mới. Vì vậy, bạn + +62 +00:03:59,880 --> 00:04:04,680 +có thể đặt nó thành hình tròn hoặc bạn có thể đặt nó thành hình vuông, v.v. + +63 +00:04:05,010 --> 00:04:08,940 +Nhưng bạn thực sự có thể tải một hình ảnh mới dưới dạng một hình dạng mới. + +64 +00:04:09,420 --> 00:04:14,340 +Và cách bạn làm điều đó là bạn giữ đối tượng màn hình của mình và bạn nói + +65 +00:04:14,400 --> 00:04:19,079 +thêm hình dạng và hình dạng này có thể là bất kỳ tệp hình ảnh nào. + +66 +00:04:19,470 --> 00:04:23,130 +Vì vậy, trong trường hợp của chúng tôi, nó sẽ là tên của tệp này. + +67 +00:04:23,550 --> 00:04:27,870 +Vì vậy, tôi sẽ tạo một biến mới có tên là image + +68 +00:04:27,900 --> 00:04:31,740 +và nó sẽ lưu trữ tên tệp hoặc đường dẫn tệp + +69 +00:04:31,920 --> 00:04:36,270 +của _states_img trống của tôi. gif. + +70 +00:04:36,660 --> 00:04:41,660 +Vì vậy, về cơ bản đây là con đường để tiếp cận hình ảnh của tôi và đó là hình dạng mà tôi + +71 +00:04:42,570 --> 00:04:44,340 +sẽ tải vào màn hình của mình. + +72 +00:04:45,060 --> 00:04:47,760 +Vì vậy, khi tôi đã thêm hình dạng vào màn hình, + +73 +00:04:47,790 --> 00:04:50,970 +thì bây giờ nó có thể được sử dụng bởi một con rùa. + +74 +00:04:51,060 --> 00:04:56,060 +Vì vậy, tôi có thể nói con rùa. hình dạng và thay đổi nó thay vì thành hình tròn + +75 +00:04:57,540 --> 00:05:01,230 +hoặc hình vuông hoặc hình con rùa, tôi sẽ thay đổi nó thành tệp hình ảnh này. + +76 +00:05:01,710 --> 00:05:05,340 +Vì vậy, bây giờ khi tôi chạy dự án của mình, + +77 +00:05:05,850 --> 00:05:10,170 +bạn có thể thích, tôi có ở đây, gặp lỗi như thế này; không + +78 +00:05:10,410 --> 00:05:14,520 +thể mở tệp này vì không có tệp hoặc thư mục như vậy. + +79 +00:05:14,850 --> 00:05:19,050 +Điều này thực sự rất phổ biến và nó có thể xảy ra với bạn. Trong trường hợp này, chỉ cần đảm + +80 +00:05:19,080 --> 00:05:23,670 +bảo rằng bất cứ điều gì bạn đã nhập ở đây thực sự khớp với tên + +81 +00:05:23,670 --> 00:05:26,430 +hình ảnh của bạn. Vì vậy, như bạn có thể thấy, + +82 +00:05:26,430 --> 00:05:29,040 +nó thực sự là blank_states_img. gif, và tôi + +83 +00:05:29,430 --> 00:05:34,430 +chỉ có trạng thái mà không có 's'. Vì vậy, bây giờ khi chúng tôi chạy lại điều + +84 +00:05:34,590 --> 00:05:36,840 +này sẽ không có vấn đề gì và + +85 +00:05:36,850 --> 00:05:41,850 +tôi có thể thấy hình ảnh hiển thị ở đây. Bây giờ chúng tôi đã quản lý để tải hình + +86 +00:05:42,480 --> 00:05:43,313 +ảnh của + +87 +00:05:43,560 --> 00:05:48,360 +mình vào trò chơi rùa của mình, điều tiếp theo chúng tôi muốn làm là tìm ra tọa độ của + +88 +00:05:48,360 --> 00:05:50,070 +mỗi trạng thái này. Ví dụ: + +89 +00:05:50,100 --> 00:05:53,820 +nếu chúng ta muốn từ California hiển thị ở đây, thì + +90 +00:05:54,090 --> 00:05:59,090 +chúng ta cần biết tọa độ X và Y của vị trí này so với toàn + +91 +00:05:59,240 --> 00:06:00,860 +bộ màn hình trò chơi. + +92 +00:06:01,580 --> 00:06:06,050 +Bằng cách đó, khi chúng tôi thực sự đoán một tiểu bang như California và nhấn OK, + +93 +00:06:06,050 --> 00:06:11,050 +nó thực sự có thể hiển thị với văn bản được viết trên chính tiểu bang đó để người dùng + +94 +00:06:11,960 --> 00:06:15,770 +biết họ đã đoán những tiểu bang nào và những tiểu bang nào họ + +95 +00:06:15,770 --> 00:06:16,603 +vẫn cần đoán. + +96 +00:06:17,290 --> 00:06:18,750 +1: Nhưng bạn sẽ làm thế + +97 +00:06:18,910 --> 00:06:22,120 +nào để 0: đặt các văn bản trên một điểm cụ thể của bản đồ? + +98 +00:06:22,420 --> 00:06:25,300 +Làm thế nào bạn có được tọa độ cho điểm này? Chà, sau khi tìm + +99 +00:06:25,690 --> 00:06:27,520 +kiếm nhanh trên Google, tôi tìm thấy + +100 +00:06:27,550 --> 00:06:31,930 +một câu hỏi về Stack Overflow mà về cơ bản là cố gắng thực hiện chính + +101 +00:06:31,930 --> 00:06:35,350 +xác những gì chúng tôi muốn. Vì vậy, đây là mã mà chúng tôi sẽ cần. + +102 +00:06:35,650 --> 00:06:40,480 +Vì vậy, hãy tiếp tục và sao chép tất cả và dán vào dự án của chúng ta. + +103 +00:06:41,140 --> 00:06:44,530 +Hãy xem qua mã này và hiểu những gì nó đang cố gắng thực hiện. + +104 +00:06:45,220 --> 00:06:48,910 +Vì vậy, trước tiên, chúng ta có một hàm ở đây được gọi là get_mouse_click_coor, và + +105 +00:06:49,240 --> 00:06:52,150 +nó nhận hai giá trị làm đầu vào, X và Y, sau đó + +106 +00:06:52,210 --> 00:06:54,580 +nó in chúng ra. Tiếp theo, chúng + +107 +00:06:54,610 --> 00:06:57,940 +tôi có mô-đun rùa của chúng tôi gọi onscreenclick, là một + +108 +00:06:57,970 --> 00:06:59,770 +trình lắng nghe sự kiện. + +109 +00:06:59,860 --> 00:07:04,690 +Vì vậy, nó sẽ lắng nghe khi con chuột nhấp và sau đó nó sẽ + +110 +00:07:04,720 --> 00:07:06,670 +gọi hàm get_mouse_click_coor của chúng tôi + +111 +00:07:06,880 --> 00:07:11,770 +và nó sẽ chuyển qua tọa độ X và Y của vị trí nhấp chuột đó. + +112 +00:07:12,310 --> 00:07:15,220 +Cuối cùng, chúng tôi đã có con rùa này. vòng lặp chính. + +113 +00:07:15,520 --> 00:07:19,300 +Vì vậy, đây là một cách thay thế để giữ cho màn hình của chúng ta mở + +114 +00:07:19,630 --> 00:07:21,700 +mặc dù mã của chúng ta đã chạy xong. + +115 +00:07:22,030 --> 00:07:26,800 +Vì vậy, về cơ bản nó là một sự thay thế cho màn hình của chúng tôi. exitonclick. Và trên thực tế, nếu bạn nghĩ + +116 +00:07:26,800 --> 00:07:27,850 +về nó, nếu + +117 +00:07:28,060 --> 00:07:32,800 +chúng ta muốn lấy vị trí nhấp chuột và màn hình của chúng ta thoát ra ngay sau khi + +118 +00:07:32,860 --> 00:07:36,490 +chúng ta nhấp vào nó, thì nó sẽ không thực sự hoạt động dễ dàng. + +119 +00:07:36,580 --> 00:07:40,720 +Vì vậy, chúng tôi sẽ xóa dòng này và chúng tôi sẽ thay thế + +120 +00:07:40,750 --> 00:07:43,990 +nó bằng con rùa này. mainloop, sẽ giữ cho màn hình của chúng ta luôn mở. + +121 +00:07:44,260 --> 00:07:48,130 +Vì vậy, nếu tôi nhận xét ra tất cả mã trước đó và khi tôi chạy dự án của mình, bạn có + +122 +00:07:48,160 --> 00:07:51,400 +thể thấy nó vẫn giữ cửa sổ mở. Nhưng nếu không có + +123 +00:07:51,580 --> 00:07:54,730 +nó, nó sẽ chỉ lóe lên và biến mất. + +124 +00:07:56,560 --> 00:08:00,460 +Trong khi mã này đang chạy nếu tôi nhấp vào một trong các tiểu + +125 +00:08:00,490 --> 00:08:02,380 +bang, giả sử California ở đâu, + +126 +00:08:02,680 --> 00:08:07,150 +bạn có thể thấy các giá trị X và Y được in trong bảng điều khiển. + +127 +00:08:07,510 --> 00:08:12,510 +Vì vậy, chúng ta có thể lặp lại điều này cho tất cả các Bang trên hình ảnh này và nắm + +128 +00:08:12,580 --> 00:08:17,350 +được vị trí của mỗi bang trên bản đồ này so với màn hình con rùa của chúng ta. + +129 +00:08:18,010 --> 00:08:22,030 +Bây giờ, nếu điều đó nghe thực sự tẻ nhạt thì tôi phải nói với bạn, nó thực sự là như vậy. + +130 +00:08:22,390 --> 00:08:23,620 +Nhưng may mắn cho + +131 +00:08:23,620 --> 00:08:28,620 +bạn, tôi đã thực sự trải qua toàn bộ quá trình này và tôi đã ghi lại tất + +132 +00:08:28,720 --> 00:08:32,799 +cả các giá trị X và Y. Bây giờ một số trong số chúng có thể hơi lệch khỏi trung + +133 +00:08:33,130 --> 00:08:35,830 +tâm của trạng thái, nhưng bạn biết đấy, bạn luôn có thể điều chỉnh điều này nếu bạn muốn. + +134 +00:08:36,280 --> 00:08:40,510 +Nhưng bây giờ bạn biết tất cả các giá trị X và Y này đến từ đâu. + +135 +00:08:41,650 --> 00:08:46,270 +Vì vậy, bạn thực sự không cần bất kỳ mã này vì chúng tôi đã có tất cả các giá trị X + +136 +00:08:46,270 --> 00:08:49,450 +và Y trong 50_states của chúng tôi. csv. + +137 +00:08:50,140 --> 00:08:55,140 +Tất cả những gì bạn phải làm là đọc từ CSV đó và nhận các giá trị X và Y đó. + +138 +00:08:57,150 --> 00:09:01,590 +Và sau đó bạn sẽ hỏi người dùng câu trả lời và chúng tôi sẽ làm điều đó + +139 +00:09:01,590 --> 00:09:03,330 +thông qua việc sử dụng đầu vào. + +140 +00:09:03,720 --> 00:09:08,720 +Hãy nhớ rằng chúng tôi có thể gọi màn hình. textinput để tạo một trong những hộp bật lên đó + +141 +00:09:08,970 --> 00:09:13,970 +và chúng tôi có thể đặt tiêu đề cho nó và chúng tôi cũng có thể đưa ra lời nhắc. + +142 +00:09:15,930 --> 00:09:19,620 +Vì vậy, khi tôi chạy cái này, bạn có thể thấy rằng hộp bật lên này trông như thế này. + +143 +00:09:20,160 --> 00:09:25,160 +Tiêu đề ở đầu cửa sổ và lời nhắc ở bên trong hộp. + +144 +00:09:29,450 --> 00:09:29,960 +2: Được rồi. + +145 +00:09:29,960 --> 00:09:33,350 +0: Và một khi chúng tôi nhập một cái gì đó vào đây + +146 +00:09:33,830 --> 00:09:38,630 +như Ohio, thì tôi thực sự có thể nắm được những gì người dùng đã nhập bằng cách nhấn vào + +147 +00:09:38,630 --> 00:09:40,880 +trạng thái answer_ này. Vì vậy, nếu tôi tiếp + +148 +00:09:41,390 --> 00:09:45,440 +tục và in nó, thì bạn có thể thấy nó sẽ là bất cứ thứ gì tôi nhập vào hộp này. + +149 +00:09:46,040 --> 00:09:47,630 +Vì vậy, bây giờ, bạn + +150 +00:09:47,750 --> 00:09:52,750 +đã biết giá trị X và Y của vị trí mà chúng ta cần viết văn bản cho + +151 +00:09:54,350 --> 00:09:57,920 +tên của trạng thái mà người dùng đã đoán đúng là gì. + +152 +00:09:58,700 --> 00:10:03,700 +Bạn cũng biết cách làm thế nào để người dùng nhập câu trả lời mới thông qua tính năng nhập văn bản của chúng tôi. + +153 +00:10:05,660 --> 00:10:06,950 +Vì vậy, trong bài + +154 +00:10:07,190 --> 00:10:11,900 +học tiếp theo, thử thách bắt đầu và bạn sẽ sử dụng mọi thứ bạn đã học cho + +155 +00:10:11,900 --> 00:10:15,260 +đến nay để đọc từ tệp CSV và bắt trò chơi hoạt động. + +156 +00:10:15,650 --> 00:10:18,020 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 day-25-us-states-game-start.zip b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 day-25-us-states-game-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..b6767d2632d385fb643f8d0c4c4f61394e72f7f8 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/005 day-25-us-states-game-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6c9607d1fd8135743f5c5a1d619517ace9e29fb25e06d82dc57e9750a96e6eb +size 41610 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/006 U.S. States Game Part 2 Challenge with .csv.mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/006 U.S. States Game Part 2 Challenge with .csv.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d31efab948903f4efbfc02f1cf67d23bff756c19 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/006 U.S. States Game Part 2 Challenge with .csv.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d90bef237773db97acaf2e7d89e38971a72894bc591c2e5c5e35e8943d604081 +size 182930613 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/006 U.S. States Game Part 2 Challenge with .csv_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/006 U.S. States Game Part 2 Challenge with .csv_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..64947d65db54e11908f6e35fcf74b59a753457f5 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/006 U.S. States Game Part 2 Challenge with .csv_vi.srt @@ -0,0 +1,932 @@ +1 +00:00:00,390 --> 00:00:00,720 +Được rồi. + +2 +00:00:00,720 --> 00:00:05,720 +Vì vậy, trong bài học trước, chúng tôi đã thiết lập rất nhiều và chúng tôi đã yêu cầu trò chơi của mình có các + +3 +00:00:05,880 --> 00:00:06,810 +tính năng cơ bản. + +4 +00:00:06,870 --> 00:00:11,250 +Nó có một cửa sổ bật lên yêu cầu chúng tôi nhập tên của các tiểu bang và + +5 +00:00:11,610 --> 00:00:15,870 +khi tôi nhập tên vào đây, tôi có thể nhận nó bên trong mã của mình bằng + +6 +00:00:15,900 --> 00:00:17,340 +cách sử dụng answer_state này. + +7 +00:00:18,030 --> 00:00:22,590 +Bây giờ công việc của bạn là sử dụng 50_states đó. csv để kiểm tra câu trả lời của người + +8 +00:00:23,070 --> 00:00:23,430 +dùng + +9 +00:00:23,430 --> 00:00:28,430 +so với tất cả các trạng thái bên trong bảng này và xem nó có khớp với một trong số + +10 +00:00:29,580 --> 00:00:31,650 +chúng hay không. Bây giờ, người + +11 +00:00:31,650 --> 00:00:36,210 +dùng có thể đánh vần nó bằng cách viết hoa, bắt đầu là Ohio, hoặc họ + +12 +00:00:36,270 --> 00:00:40,740 +có thể chỉ viết ohio và nó sẽ hoạt động cho cả hai trường hợp này. + +13 +00:00:41,760 --> 00:00:42,510 +Ngoài ra, khi + +14 +00:00:42,510 --> 00:00:47,510 +người dùng nhập một trạng thái nằm trong 50_states đó. csv, thì trạng thái đó sẽ + +15 +00:00:48,660 --> 00:00:53,660 +được ghi trên màn hình tại vị trí mà nó tồn + +16 +00:00:53,820 --> 00:00:54,653 +tại. + +17 +00:00:54,750 --> 00:00:59,190 +Vì vậy, nó ghi nhớ vị trí tương ứng với các giá trị X và Y mà chúng + +18 +00:00:59,190 --> 00:01:01,710 +ta đã đăng nhập bên trong tệp dữ liệu này. + +19 +00:01:02,310 --> 00:01:05,430 +Nhưng nếu người dùng đoán sai một trạng thái, thì không + +20 +00:01:05,970 --> 00:01:10,020 +có gì xảy ra và hộp nhập liệu của chúng tôi lại xuất hiện + +21 +00:01:10,410 --> 00:01:12,480 +yêu cầu nhập thông tin mới. + +22 +00:01:13,860 --> 00:01:16,860 +Bây giờ hãy để ý xem ở tiêu đề của phần nhập + +23 +00:01:16,920 --> 00:01:21,920 +văn bản, tôi cũng đang theo dõi xem họ đã đoán đúng trong số 50 trạng thái như thế nào. + +24 +00:01:22,590 --> 00:01:25,560 +Và mỗi khi họ thêm một trạng thái mới, + +25 +00:01:25,620 --> 00:01:28,380 +um, mới, thì số đó sẽ cập nhật. + +26 +00:01:29,700 --> 00:01:34,290 +anh ấy sẽ dựa vào kiến thức bạn đã học về cách đọc từ dữ liệu + +27 +00:01:34,290 --> 00:01:35,370 +CSV, nắm bắt + +28 +00:01:35,730 --> 00:01:39,390 +các phần cụ thể của dữ liệu CSV, tìm kiếm ví dụ: + +29 +00:01:39,720 --> 00:01:43,500 +một hàng cụ thể hoặc một cột cụ thể và làm việc với + +30 +00:01:43,950 --> 00:01:48,950 +dữ liệu đó để kiểm tra xem người dùng có đúng trạng thái không, sau đó sử + +31 +00:01:49,530 --> 00:01:50,363 +dụng dữ + +32 +00:01:50,370 --> 00:01:55,370 +liệu bên trong hàng đó để tìm ra nơi viết một số văn bản tại vị trí + +33 +00:01:55,980 --> 00:01:57,960 +X và Y để chúng tôi có + +34 +00:01:58,200 --> 00:02:02,670 +thể nhận được tên thực tế của trạng thái được viết tại vị trí mà + +35 +00:02:02,670 --> 00:02:06,120 +họ xuất hiện trên bản đồ. Vì vậy, đây là một thách thức khá + +36 +00:02:06,180 --> 00:02:09,660 +lớn và tôi hy vọng rằng bạn sẽ phải suy nghĩ về nó và chơi với mã + +37 +00:02:09,660 --> 00:02:13,050 +trong ít nhất 10 đến 20 phút. Vì vậy, hãy cho nó thời gian + +38 +00:02:13,350 --> 00:02:17,970 +cần thiết, suy nghĩ về cách bạn sẽ giải quyết vấn đề này và cố gắng hoàn thành + +39 +00:02:17,970 --> 00:02:20,220 +thử thách này. Vì vậy, hãy tạm dừng video ngay bây giờ. + +40 +00:02:25,700 --> 00:02:26,210 +1: Được rồi. + +41 +00:02:26,210 --> 00:02:28,640 +0: Được rồi. Vì vậy, tôi sẽ cùng bạn + +42 +00:02:28,910 --> 00:02:31,070 +tìm cách giải quyết, nhưng tôi muốn bạn kiểm tra lương tâm. + +43 +00:02:31,670 --> 00:02:35,930 +Nếu bạn chưa dành ít nhất 20 phút để khắc phục sự cố này, khắc + +44 +00:02:36,080 --> 00:02:40,400 +phục sự cố, làm cho sự cố làm theo ý bạn, thì hãy quay lại, thử lại. + +45 +00:02:40,460 --> 00:02:42,860 +Bạn cần phải cảm thấy cuộc đấu tranh để học hỏi. + +46 +00:02:43,220 --> 00:02:47,150 +Tôi có thể cho bạn biết cách làm bất cứ điều gì, nhưng nếu câu trả lời đó không đến từ + +47 +00:02:47,390 --> 00:02:50,840 +bạn, thì bạn sẽ không thực sự tiến bộ. Vì vậy, tôi thực sự rất + +48 +00:02:50,840 --> 00:02:55,460 +mong bạn hãy thử trước khi xem giải pháp. Được rồi. + +49 +00:02:55,460 --> 00:02:58,910 +Vì vậy, quay lại mã của chúng ta, điều đầu tiên + +50 +00:02:59,260 --> 00:03:02,320 +tôi sẽ làm là nhập mô-đun gấu trúc. + +51 +00:03:02,710 --> 00:03:04,450 +Vì vậy, tôi sẽ nhập khẩu gấu trúc. + +52 +00:03:04,960 --> 00:03:09,760 +Bây giờ tôi đã cài đặt gấu trúc trên dự án bắt đầu mà bạn đã tải xuống, nhưng nếu bạn đang + +53 +00:03:10,090 --> 00:03:14,170 +thực hiện việc này hoàn toàn từ đầu từ tệp bắt đầu của chính mình, thì có thể bạn + +54 +00:03:14,380 --> 00:03:18,010 +sẽ nhận được một dòng chữ nguệch ngoạc màu đỏ bên dưới gấu trúc và nó + +55 +00:03:18,040 --> 00:03:21,640 +sẽ yêu cầu bạn cài đặt gói. Nhưng nếu bạn không có nó, thì có + +56 +00:03:21,640 --> 00:03:24,160 +nghĩa là nó đã được cài đặt và sẵn sàng sử dụng. + +57 +00:03:24,640 --> 00:03:29,640 +Bây giờ chúng ta sẽ yêu cầu gấu trúc của chúng ta tiếp tục và đọc tệp CSV của chúng ta + +58 +00:03:30,190 --> 00:03:33,940 +và tệp CSV được gọi là 50_states. csv. + +59 +00:03:34,420 --> 00:03:36,370 +Vì vậy, khi lời nhắc xuất + +60 +00:03:36,670 --> 00:03:40,570 +hiện, tôi sẽ nhấn enter để PyCharm tự động chèn nó vào. + +61 +00:03:41,410 --> 00:03:45,550 +Bây giờ tôi sẽ lưu khung dữ liệu đó đến từ việc đọc CSV đó vào một + +62 +00:03:45,550 --> 00:03:47,110 +biến được gọi là dữ liệu. + +63 +00:03:47,890 --> 00:03:52,890 +Bây giờ dữ liệu của chúng tôi có 50 hàng dữ liệu và hàng đầu tiên + +64 +00:03:54,550 --> 00:03:59,230 +là tiêu đề cột cho mỗi hàng. Vì vậy, chúng tôi đã có trạng thái, các giá trị X và Y. + +65 +00:04:00,310 --> 00:04:04,420 +Hãy suy nghĩ về cách chúng ta có thể giải quyết vấn đề mà chúng ta gặp phải. + +66 +00:04:04,840 --> 00:04:07,000 +Vì vậy, khi người dùng nhập câu trả lời, chúng + +67 +00:04:07,450 --> 00:04:10,630 +ta phải kiểm tra xem liệu câu trả lời đó có phải là một trong những + +68 +00:04:10,930 --> 00:04:15,930 +trạng thái trong tất cả các trạng thái của 50_states hay không. csv. + +69 +00:04:23,230 --> 00:04:27,250 +Cột đầu tiên là danh sách tất cả 50 Bang. + +70 +00:04:27,790 --> 00:04:32,790 +Vì vậy, nếu bằng cách nào đó chúng ta có thể kiểm tra xem trạng thái mà họ đã đoán này có phải + +71 +00:04:34,120 --> 00:04:39,010 +là một trong những trạng thái trong cột đó hay không, thì chúng ta sẽ biết liệu họ hiểu đúng hay sai. + +72 +00:04:39,520 --> 00:04:41,470 +Nếu họ hiểu đúng, thì + +73 +00:04:41,950 --> 00:04:46,950 +chúng ta cần tìm ra cách chúng ta có thể tạo ra một con rùa + +74 +00:04:50,050 --> 00:04:55,050 +để viết tên của bang tại tọa độ X và Y của bang đó. + +75 +00:04:57,940 --> 00:04:59,980 +Ví dụ: nếu người dùng đoán Nam + +76 +00:05:00,010 --> 00:05:04,210 +Carolina và thực sự Nam Carolina là một trong 50 Tiểu bang, thì chúng tôi + +77 +00:05:04,510 --> 00:05:08,410 +sẽ có thể kéo toàn bộ hàng này ra và sau đó tạo một + +78 +00:05:08,440 --> 00:05:11,110 +con rùa, đưa nó đến vị trí X và + +79 +00:05:11,470 --> 00:05:16,470 +Y này và viết tên của tiểu bang trên hình ảnh trạng thái trống này trong trò chơi + +80 +00:05:18,640 --> 00:05:22,540 +rùa của chúng tôi. Hãy xem liệu chúng ta có thể giải quyết vấn đề này không. Bây giờ, điều đầu tiên + +81 +00:05:22,540 --> 00:05:27,010 +chúng ta cần tìm hiểu là làm thế nào để chúng ta nắm được tất cả các trạng + +82 +00:05:27,010 --> 00:05:30,070 +thái của 50_states. csv? Vì vậy, chúng tôi đã + +83 +00:05:30,280 --> 00:05:34,900 +có khung dữ liệu của mình và nếu tôi tiếp tục và nói dữ liệu, thì tôi có thể rút ra một trong các cột. + +84 +00:05:35,350 --> 00:05:37,390 +Vì vậy, tên cột là trạng thái và + +85 +00:05:37,870 --> 00:05:41,950 +tôi có thể sử dụng nó làm khóa với một tập hợp các dấu ngoặc vuông hoặc tôi + +86 +00:05:42,220 --> 00:05:45,190 +có thể sử dụng nó đơn giản như một tên thuộc tính. + +87 +00:05:46,510 --> 00:05:51,280 +Điều này giúp tôi có được chuỗi dữ liệu là cột đầu tiên. + +88 +00:05:52,180 --> 00:05:54,850 +Và nếu tôi muốn có thể biến nó thành một danh sách, hãy + +89 +00:05:55,150 --> 00:05:58,070 +nhớ rằng chúng tôi đã thấy phương thức to_list đó và điều đó có nghĩa + +90 +00:05:58,700 --> 00:06:01,970 +là chúng tôi có thể làm việc với nó giống như bất kỳ danh sách nào khác. + +91 +00:06:02,480 --> 00:06:04,730 +Vì vậy, chúng ta hãy gọi đây là all_states. + +92 +00:06:06,110 --> 00:06:08,900 +Và khi đã có toàn bộ all_states + +93 +00:06:08,900 --> 00:06:13,900 +này, chúng ta có thể kiểm tra xem answer_state có nằm trong all_states hay không. + +94 +00:06:17,210 --> 00:06:19,670 +Đây là điều mà bạn sẽ không thể làm + +95 +00:06:19,670 --> 00:06:23,120 +được, vì vậy hãy kiểm tra tư cách thành viên bằng cách sử dụng từ + +96 +00:06:23,450 --> 00:06:26,420 +khóa in trừ khi bạn đã chuyển từ khóa này thành danh sách. + +97 +00:06:27,350 --> 00:06:32,350 +Vì vậy, khi chúng tôi đã phát hiện ra rằng câu trả lời này của người dùng được cung cấp trên thực + +98 +00:06:32,450 --> 00:06:35,270 +tế là một trong những tiểu bang trong 50 Tiểu bang của + +99 +00:06:35,600 --> 00:06:39,200 +chúng tôi, thì việc tiếp theo chúng tôi cần làm là tạo ra một con rùa. + +100 +00:06:39,830 --> 00:06:42,410 +Vì vậy, hãy tạo một con rùa mới, chúng ta sẽ gọi + +101 +00:06:42,920 --> 00:06:47,510 +là t, và chúng ta sẽ sử dụng con rùa. Lớp rùa để xây dựng nó. + +102 +00:06:47,990 --> 00:06:52,100 +Và sau đó chúng ta sẽ làm cho con rùa ẩn đi hình dạng con rùa thực + +103 +00:06:52,460 --> 00:06:57,020 +sự, và chúng ta cũng sẽ làm cho nó viết lên để nó không thực sự vẽ bất kỳ + +104 +00:06:57,020 --> 00:06:57,853 +hình dạng nào. + +105 +00:06:58,190 --> 00:07:03,190 +Nhưng những gì chúng ta cần nó làm là chúng ta cần đến một vị trí X và Y + +106 +00:07:03,560 --> 00:07:04,393 +cụ thể. + +107 +00:07:04,910 --> 00:07:09,910 +Vị trí X và Y sẽ tương ứng với trạng thái mà người dùng đã đoán chính xác + +108 +00:07:10,070 --> 00:07:15,070 +và hàng dữ liệu từ 50_states của chúng tôi. csv. + +109 +00:07:17,570 --> 00:07:22,570 +Vì vậy, làm thế nào chúng ta có thể nắm giữ hàng dữ liệu thực tế tương ứng với trạng thái này? + +110 +00:07:24,350 --> 00:07:28,790 +Chà, chúng ta có thể lấy dữ liệu của mình và sau đó bên trong một số dấu ngoặc + +111 +00:07:29,000 --> 00:07:34,000 +vuông, chúng ta có thể kiểm tra dữ liệu đó. trạng thái gấp đôi bằng answer_state. + +112 +00:07:37,220 --> 00:07:42,220 +Thao tác này sẽ kéo ra hàng có trạng thái bằng với answer_state. + +113 +00:07:44,960 --> 00:07:49,160 +Vì vậy, tôi sẽ lưu nó dưới một cái gì đó được gọi là state_data. + +114 +00:07:50,270 --> 00:07:55,270 +Và bây giờ tôi có thể yêu cầu con rùa của tôi truy cập state_data. x và state_data. y. + +115 +00:07:59,180 --> 00:08:01,730 +Vì đây là một hàng dữ liệu, nên tôi + +116 +00:08:02,330 --> 00:08:06,710 +có thể khai thác các thuộc tính của nó bằng cách sử dụng tên của + +117 +00:08:07,100 --> 00:08:08,870 +các cột, X và Y. + +118 +00:08:10,400 --> 00:08:12,620 +Và một khi con rùa của + +119 +00:08:12,710 --> 00:08:16,910 +tôi đến đó, thì tôi muốn nó viết tên của tiểu bang. + +120 +00:08:17,360 --> 00:08:22,340 +Vì vậy, nó sẽ là state_data. tiểu bang. Bây giờ, khi chúng ta + +121 +00:08:22,340 --> 00:08:27,320 +nhấn chạy trên mã này và đoán tên của một trạng thái chắc chắn tồn tại, + +122 +00:08:27,320 --> 00:08:30,740 +khi chúng ta nhấp vào OK, chúng ta sẽ gặp lỗi. + +123 +00:08:31,340 --> 00:08:34,159 +Và điều thực sự quan trọng là bạn phải quen với việc nhìn thấy lỗi vì + +124 +00:08:34,429 --> 00:08:37,460 +chúng sẽ xảy ra với bạn mọi lúc. Cũng giống như trong cuộc sống, + +125 +00:08:37,700 --> 00:08:42,200 +điều chắc chắn duy nhất là cái chết và thuế, trong Lập trình điều chắc chắn duy nhất là bạn + +126 +00:08:42,230 --> 00:08:44,179 +sẽ gặp lỗi và bạn sẽ gặp lỗi. + +127 +00:08:44,570 --> 00:08:48,110 +Điều quan trọng là tìm ra nguyên nhân gây ra lỗi. + +128 +00:08:48,620 --> 00:08:53,270 +Vì vậy, nếu chúng tôi tiếp tục và sao chép lỗi này ở cuối, khoảng cách màn hình không tốt, điều đó dường như + +129 +00:08:53,300 --> 00:08:55,710 +đang cho chúng tôi biết điều gì đang thực sự xảy ra. + +130 +00:08:56,460 --> 00:09:00,720 +Sau đó, tôi truy cập Google và tìm kiếm lỗi cụ thể này, sau đó + +131 +00:09:01,200 --> 00:09:05,040 +tôi có thể thấy những người khác đã gặp sự cố này. + +132 +00:09:05,700 --> 00:09:09,660 +Vì vậy, nếu chúng ta đọc qua tất cả những điều này, giữa tất + +133 +00:09:09,720 --> 00:09:14,720 +cả các văn bản phụ, nó cho chúng ta biết rằng vấn đề thực sự là tọa độ của + +134 +00:09:15,090 --> 00:09:19,710 +chúng ta được lưu trữ dưới dạng chuỗi. Chúng ta cần lấy tọa độ thành số thực. + +135 +00:09:20,880 --> 00:09:24,450 +Vì vậy, một sự giám sát mà bạn có thể đã thực hiện mà thực sự phổ biến là chỉ + +136 +00:09:24,840 --> 00:09:28,200 +cần yêu cầu nó chuyển đến date state_data. x, dữ + +137 +00:09:28,260 --> 00:09:33,260 +liệu trạng thái. y mà không cần chuyển đổi chúng thành số nguyên trước tiên. + +138 +00:09:35,610 --> 00:09:40,610 +Vì vậy, bây giờ nếu chúng tôi mang lại màn hình của chúng tôi. exitonclick và sau đó chạy mã của chúng tôi, + +139 +00:09:41,370 --> 00:09:45,030 +chúng tôi có thể nhập tên của trạng thái nhấp vào OK, và + +140 +00:09:45,300 --> 00:09:50,300 +bạn có thể thấy dữ liệu trạng thái hiển thị trên vị trí tương ứng với trạng thái + +141 +00:09:50,400 --> 00:09:52,320 +cụ thể đó. Bây giờ, vấn đề + +142 +00:09:52,350 --> 00:09:56,280 +duy nhất là chúng ta không muốn tất cả những thứ rác rưởi này được viết ở đây, phải không? + +143 +00:09:56,610 --> 00:10:01,530 +Và điều này đang hiển thị vì chúng tôi đang lấy dữ liệu này từ chuỗi dữ liệu của mình. + +144 +00:10:01,920 --> 00:10:04,440 +Vì vậy, một cách đơn giản hơn nhiều là gì? Chà, chúng ta đã + +145 +00:10:04,470 --> 00:10:07,950 +nắm được câu trả lời mà người dùng đã gõ, phải không? + +146 +00:10:08,280 --> 00:10:12,000 +Vậy tại sao chúng ta không viết answer_state? + +147 +00:10:13,110 --> 00:10:18,000 +Vì vậy, bây giờ khi tôi nhập trạng thái và nó khớp với một trong các trạng + +148 +00:10:18,000 --> 00:10:18,833 +thái trong + +149 +00:10:18,840 --> 00:10:23,840 +50 trạng thái, thì nó sẽ đi đến vị trí X và Y của trạng thái đó và + +150 +00:10:23,910 --> 00:10:26,550 +in tên của trạng thái mà người dùng đã nhập. + +151 +00:10:27,060 --> 00:10:31,710 +Và bởi vì chúng tôi đã đảm bảo rằng đó là một trạng thái chính xác với cách viết đúng, nên + +152 +00:10:31,980 --> 00:10:34,740 +việc chúng tôi sử dụng answer_state hay nếu chúng tôi sử dụng + +153 +00:10:34,950 --> 00:10:38,220 +state_data thực sự không thành vấn đề. Bây giờ, nếu bạn + +154 +00:10:38,250 --> 00:10:42,360 +thực sự muốn sử dụng state_data thay vì answer_state vì giả sử bạn + +155 +00:10:42,450 --> 00:10:46,380 +đang viết một chương trình khác và bạn cần chức năng này, thì + +156 +00:10:46,710 --> 00:10:51,390 +bạn thực sự có thể nhấn vào state_data. trạng thái, sẽ + +157 +00:10:51,990 --> 00:10:56,910 +cho chúng ta tên trạng thái từ hàng tương + +158 +00:10:56,910 --> 00:11:01,830 +ứng với trạng thái khớp. Và sau đó chúng ta có thể sử dụng một phương thức được gọi là item. + +159 +00:11:02,670 --> 00:11:06,030 +Bây giờ, item là một phương thức trên chuỗi gấu trúc. + +160 +00:11:06,840 --> 00:11:09,990 +Vì vậy, chúng tôi biết rằng đây là một chuỗi dữ liệu Panda và bạn + +161 +00:11:10,050 --> 00:11:13,410 +có thể thực hiện kiểm tra loại đối với chuỗi dữ liệu đó nếu bạn muốn xác nhận. + +162 +00:11:13,830 --> 00:11:18,830 +Nhưng những gì mục làm là nó nhìn vào dữ liệu cơ bản và về cơ bản + +163 +00:11:18,990 --> 00:11:23,400 +nó chỉ lấy phần tử đầu tiên. Vì vậy, bây giờ, nếu tôi chạy trò + +164 +00:11:23,400 --> 00:11:26,520 +chơi như hiện tại và tôi nhập tên của một trạng thái, bạn có + +165 +00:11:26,790 --> 00:11:31,790 +thể thấy nó lấy giá trị thực dưới dữ liệu state_data. trạng thái không có bất kỳ chỉ mục + +166 +00:11:32,790 --> 00:11:36,750 +nào, số không hoặc bất kỳ phần nào khác của chuỗi dữ liệu. + +167 +00:11:37,380 --> 00:11:42,380 +Vì vậy, tôi chỉ muốn cho bạn thấy rằng bạn thực sự có thể lấy một hàng dữ liệu từ + +168 +00:11:42,390 --> 00:11:46,230 +một khung dữ liệu và sau đó lấy một giá trị cụ thể từ hàng đó + +169 +00:11:46,560 --> 00:11:51,540 +và lấy giá trị thô thực tế từ đó. Nhưng cá nhân, trong dòng mã này, tôi thích + +170 +00:11:51,570 --> 00:11:56,410 +sử dụng answer_state hơn vì chúng tôi biết nó đã được đặt tiêu đề, đã được định dạng + +171 +00:11:56,410 --> 00:11:57,910 +chính xác và nó + +172 +00:11:58,180 --> 00:12:02,050 +chỉ làm cho mã trông gọn gàng hơn một chút và dễ hiểu hơn. + +173 +00:12:02,170 --> 00:12:05,860 +Vì vậy, tôi sẽ gắn bó với điều này. Vì vậy, bây giờ nó đã hoạt động, + +174 +00:12:06,070 --> 00:12:07,870 +tất cả những gì chúng ta cần + +175 +00:12:07,870 --> 00:12:12,280 +làm là làm cho nó lặp lại chính nó mỗi khi người dùng đưa ra một dự đoán mới. + +176 +00:12:12,700 --> 00:12:16,600 +Điều đó có nghĩa là chúng ta có thể sẽ phải đặt nó bên trong một số loại vòng lặp while, điều kiện + +177 +00:12:17,320 --> 00:12:20,080 +while của chúng ta nên là gì? Chúng tôi biết rằng người + +178 +00:12:20,110 --> 00:12:24,310 +dùng sẽ đoán tất cả các trạng thái. Và một khi họ đã đoán + +179 +00:12:24,310 --> 00:12:26,920 +được tất cả, thì họ sẽ thắng, phải không? + +180 +00:12:27,310 --> 00:12:32,310 +Vậy tại sao chúng ta không tạo một danh sách các trạng thái được đoán và đặt nó bằng một + +181 +00:12:33,940 --> 00:12:34,773 +danh sách trống. + +182 +00:12:34,960 --> 00:12:39,960 +Và chúng tôi có thể kiểm tra trong khi độ dài của các đoạn mã được đoán nhỏ hơn 50, + +183 +00:12:41,980 --> 00:12:45,550 +sau đó chúng tôi có thể tiếp tục chạy lại tất cả mã + +184 +00:12:45,790 --> 00:12:50,320 +này, yêu cầu chúng đặt một đầu vào mới, kiểm tra đầu vào và viết tên trạng thái. + +185 +00:12:51,160 --> 00:12:54,580 +Nhưng mỗi khi người dùng đoán chính xác + +186 +00:12:54,910 --> 00:12:59,910 +một trạng thái, thì chúng tôi sẽ thêm answer_state này vào rab_state. + +187 +00:13:00,310 --> 00:13:02,740 +Vì vậy, chúng ta có thể nói thời gian đoán. chắp thêm, và + +188 +00:13:03,100 --> 00:13:06,100 +sau đó chúng ta sẽ nối thêm answer_state mới này. + +189 +00:13:06,820 --> 00:13:11,800 +Vì vậy, bây giờ khi tôi chạy lại mã này, bạn có thể thấy rằng mỗi khi tôi đoán + +190 +00:13:11,800 --> 00:13:16,240 +một trạng thái mới, đầu vào văn bản này lại bật lên và về cơ bản + +191 +00:13:16,540 --> 00:13:21,070 +tôi có thể tiếp tục cho đến khi tôi đặt tên cho tất cả các trạng thái. + +192 +00:13:21,790 --> 00:13:26,440 +Bây giờ, điều tiếp theo tôi muốn thay đổi là tiêu đề của cửa sổ nhập văn bản này. + +193 +00:13:26,980 --> 00:13:28,540 +Thay vì nói Đoán + +194 +00:13:28,690 --> 00:13:33,070 +trạng thái, tôi muốn nó theo dõi số trạng thái mà tôi đã đoán đúng. + +195 +00:13:33,430 --> 00:13:38,430 +Vì vậy, về cơ bản tôi muốn nói một cái gì đó như 0 hoặc 10 hoặc bất cứ điều gì, trong + +196 +00:13:38,590 --> 00:13:40,000 +số 50 trạng thái là đúng. + +197 +00:13:40,630 --> 00:13:44,260 +Số 0 này sẽ được thay thế bằng một chuỗi f và + +198 +00:13:44,650 --> 00:13:49,060 +chúng tôi sẽ sử dụng độ dài của các ngày tháng được đoán của chúng + +199 +00:13:49,060 --> 00:13:53,230 +tôi để có được số đó. Vì vậy, bây giờ khi tôi chạy + +200 +00:13:53,230 --> 00:13:57,400 +mã này, bạn có thể thấy rằng tôi bắt đầu với trạng thái 0, 0/50 và mỗi + +201 +00:13:57,400 --> 00:14:01,780 +khi tôi đoán một trạng thái mới, thì nó sẽ thêm vào số đó để tôi có thể + +202 +00:14:01,810 --> 00:14:05,020 +theo dõi số lượng tôi đã đoán và tôi còn lại bao nhiêu. + +203 +00:14:06,610 --> 00:14:11,820 +Bây giờ, điều tiếp theo bạn sẽ nhận ra nếu bạn kiểm tra điều này một vài lần là ngay cả khi bạn + +204 +00:14:12,190 --> 00:14:13,180 +nhận được trạng + +205 +00:14:13,480 --> 00:14:18,400 +thái đúng nhưng nếu bạn thực sự không đánh vần nó bằng chữ C viết hoa hoặc chữ cái viết hoa + +206 +00:14:18,400 --> 00:14:22,990 +để bắt đầu, thì nó sẽ không chấp nhận nó. Vì vậy, chúng tôi không thấy 'california' hiển thị. + +207 +00:14:23,350 --> 00:14:25,780 +Và điều này là do trong dữ liệu trạng thái + +208 +00:14:25,930 --> 00:14:30,490 +của chúng tôi, tất cả chúng đều có một trường hợp tiêu đề là chữ cái đầu tiên được viết hoa. + +209 +00:14:31,090 --> 00:14:34,150 +Vì vậy, làm thế nào chúng tôi có thể đảm bảo rằng trò chơi + +210 +00:14:34,150 --> 00:14:38,830 +của chúng tôi hoạt động nếu người dùng nhập tất cả chữ thường hoặc tất cả chữ hoa hoặc chữ hoa tiêu đề? + +211 +00:14:38,890 --> 00:14:42,610 +Miễn là họ viết đúng chính tả, chúng ta nên bỏ qua cách viết hoa. + +212 +00:14:44,080 --> 00:14:48,310 +Vì vậy, một cách để làm điều này là lấy answer_state này xuất phát + +213 +00:14:48,340 --> 00:14:52,430 +từ đầu vào văn bản mà người dùng đã nhập, và sau đó + +214 +00:14:52,820 --> 00:14:57,290 +cuối cùng, chúng ta có thể thay đổi điều đó thành một trường hợp tiêu đề. + +215 +00:14:57,560 --> 00:15:00,200 +Vì vậy, đây là một phương thức trên tất cả các chuỗi. + +216 +00:15:00,590 --> 00:15:05,270 +Vì vậy, điều đó có nghĩa là nếu tôi bắt đầu với một chuỗi, đó là, um, + +217 +00:15:05,300 --> 00:15:09,770 +angela, và sau đó tôi nói str. tiêu đề, sau đó điều này sẽ + +218 +00:15:10,280 --> 00:15:13,490 +trả lại cho tôi cùng một chuỗi nhưng nó sẽ + +219 +00:15:13,520 --> 00:15:15,710 +viết hoa chữ cái đầu tiên. + +220 +00:15:16,400 --> 00:15:18,650 +Đây là những gì chúng tôi sẽ làm đối với câu trả lời của người dùng. + +221 +00:15:19,100 --> 00:15:22,070 +Và sau đó chúng tôi sẽ có thể kiểm tra nó với tất cả các Bang. + +222 +00:15:22,400 --> 00:15:27,020 +Và bây giờ không quan trọng nếu người dùng đã nhập tất cả mọi thứ bằng chữ hoa, + +223 +00:15:27,350 --> 00:15:30,680 +hoặc nếu họ đã nhập nó bằng tất cả chữ thường, hoặc nếu + +224 +00:15:31,100 --> 00:15:34,370 +họ đã làm điều gì đó thực sự điên rồ như thế + +225 +00:15:34,430 --> 00:15:36,350 +này, nó vẫn sẽ được chấp nhận. + +226 +00:15:37,990 --> 00:15:39,130 +2: Vì vậy, bây giờ chúng tôi + +227 +00:15:39,370 --> 00:15:42,940 +đã có hầu hết các chức năng của trò chơi của chúng tôi. Trong bài học tiếp theo, chúng ta sẽ + +228 +00:15:43,000 --> 00:15:46,690 +tìm ra cách chúng ta có thể đưa trò chơi này trở thành một công cụ giáo + +229 +00:15:46,690 --> 00:15:50,950 +dục nhiều hơn và để nó tạo ra một CSV cuối cùng khi chúng ta sẵn sàng thoát khỏi trò chơi + +230 +00:15:51,340 --> 00:15:52,960 +sẽ cho chúng ta biết tất cả + +231 +00:15:53,230 --> 00:15:57,400 +các trạng thái mà chúng tôi đã bỏ lỡ để chúng tôi có thể tìm hiểu chúng, để chúng tôi + +232 +00:15:57,670 --> 00:16:02,320 +có thể quay lại trò chơi với nhiều kiến thức hơn. Đối với tất cả những điều đó và hơn thế nữa, tôi + +233 +00:16:02,320 --> 00:16:04,270 +sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 Course-Fixes-Report-an-Issue.url b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 U.S. States Game Part 3 Saving Data to .csv.mp4 b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 U.S. States Game Part 3 Saving Data to .csv.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..542d07699eec978b342301b48140d257cc3afb3d --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 U.S. States Game Part 3 Saving Data to .csv.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:708ec39fa13670372069c26d357aac2acd0e04dfb7644ea23d253cf7049ecacc +size 33240716 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 U.S. States Game Part 3 Saving Data to .csv_vi.srt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 U.S. States Game Part 3 Saving Data to .csv_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9cc25d71c58e3d306a5336fff59272dd03ecee61 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 U.S. States Game Part 3 Saving Data to .csv_vi.srt @@ -0,0 +1,320 @@ +1 +00:00:00,270 --> 00:00:04,410 +Vì vậy, bây giờ chúng tôi đã có khá nhiều chức năng mà chúng tôi + +2 +00:00:04,410 --> 00:00:06,930 +muốn để nó hoạt động như một trò chơi. + +3 +00:00:07,620 --> 00:00:10,680 +Nhưng nếu chúng ta muốn có thể sử dụng nó như một công + +4 +00:00:11,010 --> 00:00:15,510 +cụ học tập, thì sẽ rất tốt cho chúng ta nếu chúng ta có thể có một số + +5 +00:00:15,540 --> 00:00:18,000 +cách gõ mã thoát. Giả sử, nếu tôi + +6 +00:00:18,030 --> 00:00:23,030 +nhập exit, thì tôi có thể thoát khỏi trò chơi và sau đó tôi có thể lấy mã của mình để + +7 +00:00:24,600 --> 00:00:29,600 +tạo tệp CSV chứa tất cả các trạng thái mà tôi đã bỏ lỡ từ tất cả 50 trạng thái. + +8 +00:00:30,600 --> 00:00:34,170 +Chúng tôi biết rằng trong vòng lặp while của chúng tôi, chúng tôi có thể + +9 +00:00:34,290 --> 00:00:37,440 +thoát khỏi nó miễn là chúng tôi sử dụng câu lệnh break. + +10 +00:00:38,100 --> 00:00:40,920 +Những gì chúng ta có thể làm là chúng ta có + +11 +00:00:40,920 --> 00:00:45,270 +thể sử dụng câu lệnh if để kiểm tra tốt, nếu answer_state thực sự bằng với mã + +12 +00:00:45,300 --> 00:00:49,860 +bí mật đang thoát, hãy nhớ rằng answer_state sẽ được đặt tiêu đề nên chúng ta phải + +13 +00:00:49,890 --> 00:00:54,540 +kiểm tra nó bằng chữ E viết hoa và nếu điều đó xảy ra, thì chúng ta sẽ + +14 +00:00:54,780 --> 00:00:57,210 +thoát ra khỏi vòng lặp while của mình, có + +15 +00:00:57,270 --> 00:01:00,060 +nghĩa là nó sẽ kết thúc sớm vòng lặp while + +16 +00:01:00,360 --> 00:01:04,560 +và chúng ta có thể xóa dòng này để nó thực sự kết thúc trò chơi + +17 +00:01:04,620 --> 00:01:08,730 +và thoát ra khỏi cửa sổ. Vì vậy, nếu chúng tôi kiểm tra điều này, + +18 +00:01:09,480 --> 00:01:14,040 +thì bạn có thể thấy chúng tôi có thể nhập trạng thái của mình hoặc chúng tôi có thể nhập thoát + +19 +00:01:14,640 --> 00:01:16,290 +và điều đó sẽ thoát khỏi trò + +20 +00:01:16,410 --> 00:01:19,260 +chơi và chúng tôi kết thúc quá trình với mã thoát là 0. + +21 +00:01:20,010 --> 00:01:23,310 +Đây là thời điểm mà chúng ta muốn tạo một tệp mới và + +22 +00:01:24,030 --> 00:01:28,410 +tệp đó sẽ được gọi là bang_to_learn. csv. + +23 +00:01:29,070 --> 00:01:31,800 +Và tôi muốn bạn tạo CSV + +24 +00:01:31,830 --> 00:01:35,250 +sẽ chỉ chứa tên của các trạng thái + +25 +00:01:35,610 --> 00:01:40,610 +mà người dùng chưa đoán được khi họ thoát khỏi trò chơi. + +26 +00:01:41,820 --> 00:01:43,770 +Hãy suy nghĩ về cách bạn sẽ đạt được điều + +27 +00:01:44,040 --> 00:01:45,750 +này, tạm dừng video và tiếp tục. + +28 +00:01:50,690 --> 00:01:53,300 +Được rồi. Vì vậy, chúng ta hãy suy nghĩ về điều này. + +29 +00:01:53,600 --> 00:01:58,600 +Những gì chúng tôi muốn làm là lấy các trạng thái đã đoán và so sánh nó với tất cả các + +30 +00:01:59,840 --> 00:02:00,673 +trạng thái, sau + +31 +00:02:01,100 --> 00:02:05,240 +đó chúng tôi muốn tạo một danh sách mới gồm tất cả các trạng thái còn thiếu. + +32 +00:02:05,720 --> 00:02:10,720 +Vì vậy, chúng ta hãy tạo một danh sách mới được gọi là thiếu_nghiệp và sau đó chúng ta có thể + +33 +00:02:12,770 --> 00:02:17,270 +sử dụng vòng lặp for để lặp qua từng trạng thái bên trong tất cả các trạng thái. + +34 +00:02:17,780 --> 00:02:22,780 +Và nếu chúng ta thấy rằng một trạng thái không có trong các_thứ_phần_được_đoán, thì điều đó có nghĩa + +35 +00:02:23,930 --> 00:02:25,820 +là nó bị thiếu, phải không? + +36 +00:02:26,030 --> 00:02:30,590 +Vì vậy, sau đó chúng tôi có thể khai thác các trạng thái còn thiếu của chúng tôi và thêm trạng thái này. Và cuối cùng, chúng ta sẽ + +37 +00:02:32,360 --> 00:02:33,260 +kết thúc + +38 +00:02:33,290 --> 00:02:37,430 +với một danh sách tất cả các trạng thái còn thiếu. + +39 +00:02:38,060 --> 00:02:42,530 +Vì vậy, hãy kiểm tra mã này. Vì vậy, tôi sẽ + +40 +00:02:42,680 --> 00:02:47,660 +chỉ nhập một số tiểu bang, một số tiểu bang + +41 +00:02:47,720 --> 00:02:48,830 +bắt + +42 +00:02:49,280 --> 00:02:51,680 +đầu bằng A, vì vậy + +43 +00:02:51,740 --> 00:02:55,550 +Alaska, ừm, Arizona, 1: Ừm, uh, Arkansas, 0: + +44 +00:02:56,780 --> 00:02:59,620 +và cuối cùng là Alabama. + +45 +00:03:02,350 --> 00:03:05,890 +Được chứ. Vì vậy, tôi nghĩ đó là tất cả các + +46 +00:03:06,610 --> 00:03:11,610 +trạng thái bắt đầu bằng A, vì vậy bây giờ tôi sẽ bắt đầu thoát và nó sẽ cung cấp cho tôi danh sách tất + +47 +00:03:12,910 --> 00:03:16,240 +cả các trạng thái mà tôi đang thiếu. Vì vậy, nếu chúng ta xem + +48 +00:03:16,330 --> 00:03:20,500 +xét tất cả các bang A, nếu chúng ta so sánh nó với danh sách 50 + +49 +00:03:20,500 --> 00:03:24,910 +bang này, không có Alabama, không có Alaska và không có Arkansas vì tôi đã đoán đúng. + +50 +00:03:25,210 --> 00:03:28,660 +Vì vậy, đây chỉ là danh sách tất cả những thứ mà tôi không quản lý để có được. + +51 +00:03:29,650 --> 00:03:33,820 +Vậy bây giờ làm cách nào để chúng ta có thể chuyển danh sách này thành CSV? + +52 +00:03:35,110 --> 00:03:35,440 +Chà, + +53 +00:03:35,440 --> 00:03:40,440 +chúng ta có thể tạo một dữ liệu mới và dữ liệu mới đó sẽ là một + +54 +00:03:42,250 --> 00:03:45,250 +khung dữ liệu được tạo từ thiếu_nghiệp của chúng ta. + +55 +00:03:45,700 --> 00:03:48,910 +Vì vậy, đây sẽ chỉ là một khung dữ liệu một cột. + +56 +00:03:50,410 --> 00:03:52,180 +Sau khi tạo xong dữ liệu mới + +57 +00:03:52,240 --> 00:03:55,990 +đó, chúng ta có thể tiếp tục và lưu dữ liệu đó dưới dạng CSV. + +58 +00:03:56,410 --> 00:04:01,270 +Và chúng tôi sẽ gọi đó là bang_to_learn. csv, giống như chúng tôi đã + +59 +00:04:01,900 --> 00:04:04,540 +nhập ở đây. Bây giờ, khi + +60 +00:04:04,540 --> 00:04:07,990 +tôi chạy mã này và tôi đã nhập tất cả + +61 +00:04:10,180 --> 00:04:13,600 +các trạng thái A, và bây giờ tôi nhấn thoát. + +62 +00:04:14,050 --> 00:04:16,839 +Sau đó, bạn có thể thấy chúng tôi có một tệp + +63 +00:04:16,839 --> 00:04:20,079 +mới vừa được tạo mới từ báo chí và các tiểu bang của + +64 +00:04:20,200 --> 00:04:25,200 +chúng tôi là để tìm hiểu tất cả 44 Quốc gia mà tôi còn thiếu trong trò chơi của mình. + +65 +00:04:29,320 --> 00:04:31,870 +Tôi hy vọng bạn đã vui vẻ khi xây dựng trò chơi + +66 +00:04:32,080 --> 00:04:36,220 +này với tôi và tôi rất muốn biết bạn có thể đặt tên cho bao nhiêu trạng thái trong + +67 +00:04:36,220 --> 00:04:39,760 +lần đầu tiên chơi trò chơi này. Bởi vì rõ ràng là bạn càng chơi nó, bạn càng trở nên tốt hơn. + +68 +00:04:39,910 --> 00:04:43,990 +Và tôi hy vọng bạn sẽ sử dụng nó như một công cụ giáo dục. Nếu bạn có học sinh, nếu bạn + +69 +00:04:43,990 --> 00:04:46,330 +là giáo viên địa lý, nếu bạn có con, bạn + +70 +00:04:46,690 --> 00:04:50,500 +có thể cho chúng chơi với chương trình tuyệt vời này mà bạn đã xây dựng. + +71 +00:04:50,920 --> 00:04:54,220 +Hãy nhớ những gì chúng tôi đã làm ở đây có thể được tùy chỉnh vô tận. + +72 +00:04:54,550 --> 00:04:56,740 +Bạn có thể tạo một phiên bản cho quốc gia của + +73 +00:04:56,800 --> 00:05:00,640 +mình hoặc bạn có thể tạo một phiên bản cho toàn thế giới, nơi bạn phải đặt tên cho từng + +74 +00:05:00,640 --> 00:05:03,880 +quốc gia trên bản đồ thế giới hoặc bạn có thể thực hiện một số loại danh + +75 +00:05:04,060 --> 00:05:08,890 +sách khác, chẳng hạn như đặt tên tất cả các loại cây trên một hình ảnh hoặc đặt tên cho tất cả các loài động vật. + +76 +00:05:09,100 --> 00:05:10,840 +Thế giới thực sự là con sò + +77 +00:05:10,900 --> 00:05:15,900 +của bạn và tôi nóng lòng muốn xem những gì bạn đã tạo ra bằng trí tưởng tượng của mình và + +78 +00:05:16,060 --> 00:05:19,060 +cách bạn đã tùy chỉnh mã. Vì vậy, khi bạn đã hoàn thành + +79 +00:05:19,090 --> 00:05:24,090 +việc đó, hãy nhớ đăng nó trong phần Hỏi / Đáp của bài học này và để tất cả chúng ta có thể chơi và + +80 +00:05:24,430 --> 00:05:25,510 +chiêm ngưỡng mã của bạn. + diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 day-25-solution-us-states-game-end.zip b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 day-25-solution-us-states-game-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..5456b80746a3e625f1175db7acbe5cc0f5186c46 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/007 day-25-solution-us-states-game-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d71f871b8291641b4032b2c2971ec50417566eb0189ed600964f955c6e8950c +size 42030 diff --git a/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/external-links.txt b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..9dcdefbfcc29a6e2bedb541a1b045501a48102b5 --- /dev/null +++ b/part2/25 - Day 25 - Intermediate - Working with CSV Data and the Pandas Library/external-links.txt @@ -0,0 +1,15 @@ + +002 Pandas-Documentation +https://pandas.pydata.org/docs/ + +002 Pandas-API-Reference +https://pandas.pydata.org/docs/reference/index.html + +004 Central-Park-Squirrel-Census-Data +https://data.cityofnewyork.us/Environment/2018-Central-Park-Squirrel-Census-Squirrel-Data/vfnx-vebw + +005 Sporcles-Name-the-States-Game +https://www.sporcle.com/games/g/states + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/001 Day 26 Goals what you will make by the end of the day.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/001 Day 26 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..93f6b6ec1456a158cdda941f75a5de097dd0c47c --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/001 Day 26 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7543f5e220bb71b9577bfbaa1ff528d64f521194ee5c6e6cb184a6db18b5476 +size 3437058 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/001 Day 26 Goals what you will make by the end of the day_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/001 Day 26 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..60f0d0cbf5b73190acf95c8c17ac0c885ef98323 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/001 Day 26 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,92 @@ +1 +00:00:00,120 --> 00:00:04,730 +Xin chào các bạn, chào mừng đến với Ngày 26 của 100 Ngày viết mã. Hôm nay chúng ta sẽ học + +2 +00:00:04,820 --> 00:00:08,480 +tất cả về danh sách và cách hiểu từ điển. + +3 +00:00:08,900 --> 00:00:12,500 +Đây là thứ thực sự độc đáo đối với ngôn ngữ Python + +4 +00:00:12,890 --> 00:00:16,970 +và nó sẽ cắt giảm rất nhiều mã mà chúng ta phải viết khi + +5 +00:00:16,970 --> 00:00:20,030 +chúng ta làm việc với danh sách và từ điển. + +6 +00:00:20,630 --> 00:00:22,100 +Và vào cuối ngày hôm nay, + +7 +00:00:22,280 --> 00:00:27,260 +chúng tôi sẽ xây dựng một dự án sử dụng bảng chữ cái phiên âm NATO để chúng tôi có thể + +8 +00:00:27,260 --> 00:00:31,490 +đánh vần những thứ khác nhau trên điện thoại. Ví dụ, bất cứ khi nào bạn cần cung cấp + +9 +00:00:31,490 --> 00:00:33,920 +tên của mình và bạn phải đánh vần nó, họ có thể + +10 +00:00:34,220 --> 00:00:36,260 +không nghe thấy bạn nói chữ cái nào. + +11 +00:00:36,320 --> 00:00:38,840 +Vì vậy, thông thường bạn sẽ nói một cái gì đó + +12 +00:00:38,840 --> 00:00:41,450 +như A cho alpha, n cho tháng mười một, g cho chơi gôn. + +13 +00:00:41,930 --> 00:00:46,550 +Đây là những gì chúng tôi đang hướng tới để tạo ra; một chương trình hoạt động trong bảng điều khiển + +14 +00:00:46,910 --> 00:00:51,350 +và nó cho phép chúng ta nhập một từ. Vì vậy, ví dụ: tôi chỉ cần điền tên + +15 +00:00:51,410 --> 00:00:55,310 +của mình mà tôi tình cờ phải đánh vần trên điện thoại nhiều lần và tôi + +16 +00:00:55,550 --> 00:01:00,550 +nhấn enter, sau đó nó sẽ trả về một danh sách tất cả các bảng chữ cái phiên âm NATO khớp + +17 +00:01:00,980 --> 00:01:02,810 +với từng chữ cái trong tên của + +18 +00:01:03,020 --> 00:01:06,440 +tôi. vì vậy tôi có thể đọc nó cho người kia nghe qua điện + +19 +00:01:06,440 --> 00:01:08,570 +thoại, alpha, tháng mười một, gôn, echo, Lima, alpha. + +20 +00:01:09,290 --> 00:01:13,580 +Và bằng cách đó, tôi có thể sử dụng công cụ nhỏ này và có thể đánh vần bất kỳ từ nào tôi + +21 +00:01:13,820 --> 00:01:16,160 +muốn một cách dễ dàng bằng bảng chữ cái phiên âm NATO. + +22 +00:01:16,400 --> 00:01:21,350 +Vì vậy, tôi hy vọng bạn hào hứng khi tìm hiểu về chủ đề hiểu rộng này và khi bạn + +23 +00:01:21,380 --> 00:01:24,620 +đã sẵn sàng, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/002 How to Create Lists using List Comprehension.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/002 How to Create Lists using List Comprehension.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c57ab3a590712423ff82aaa57b3e8bcd3dc98b1f --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/002 How to Create Lists using List Comprehension.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb18ed0c952ca69d110d3a97f5473289d5fcf6fd035c1cc47e52340e83615e74 +size 106823782 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/002 How to Create Lists using List Comprehension_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/002 How to Create Lists using List Comprehension_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f806adc53ade33aae0e3d1ea3523f3bd72918c91 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/002 How to Create Lists using List Comprehension_vi.srt @@ -0,0 +1,952 @@ +1 +00:00:00,480 --> 00:00:05,480 +Chủ đề lớn mà chúng ta sẽ khám phá ngày hôm nay là một khái niệm được gọi + +2 +00:00:05,970 --> 00:00:08,850 +là hiểu danh sách. Và như tôi đã đề cập + +3 +00:00:08,850 --> 00:00:11,880 +trước đây, đây là thứ thực sự độc đáo đối với ngôn ngữ Python. + +4 +00:00:12,210 --> 00:00:13,980 +Trong nhiều ngôn ngữ lập trình khác, + +5 +00:00:14,010 --> 00:00:17,490 +bạn không thực sự có quyền truy cập vào những thứ như thế này. + +6 +00:00:17,520 --> 00:00:19,500 +Không có gì thực sự so sánh được với nó. + +7 +00:00:19,830 --> 00:00:22,350 +Và đó là thứ mà các nhà phát triển + +8 +00:00:22,350 --> 00:00:26,820 +Python thực sự rất yêu thích vì nó cắt giảm lượng nhập và nó chỉ làm cho mã + +9 +00:00:26,820 --> 00:00:30,840 +ngắn hơn rất nhiều và trong hầu hết các trường hợp, dễ đọc hơn rất nhiều. + +10 +00:00:31,520 --> 00:00:36,410 +Vì vậy, chính xác một danh sách hiểu là gì? Đó là trường hợp bạn tạo một + +11 +00:00:36,410 --> 00:00:36,770 +danh + +12 +00:00:36,770 --> 00:00:41,770 +sách mới từ một danh sách trước đó. Cho đến nay, chúng tôi đã làm điều đó bằng cách sử dụng vòng lặp for. + +13 +00:00:42,200 --> 00:00:45,830 +Vì vậy, ví dụ: nếu tôi có một danh sách các số, 1, + +14 +00:00:46,280 --> 00:00:51,280 +2, 3 và tôi muốn tạo một danh sách mới trong đó mỗi số được tăng lên một, + +15 +00:00:52,370 --> 00:00:57,260 +thì tôi sẽ sử dụng vòng lặp for để tạo một danh sách trống mới và sau + +16 +00:00:57,350 --> 00:01:01,670 +đó lặp lại thông qua từng số trong danh sách đó để thêm một vào + +17 +00:01:01,700 --> 00:01:02,810 +mỗi số đó. + +18 +00:01:03,170 --> 00:01:08,170 +Và sau đó tôi sẽ thêm từng con số gia tăng đó vào danh sách mới của mình. + +19 +00:01:08,870 --> 00:01:13,100 +Và tôi sẽ kết thúc với một danh sách mới bao gồm ba mục, và + +20 +00:01:13,370 --> 00:01:17,810 +nó sẽ là 2, 3 và 4. Bây giờ bằng cách sử dụng khả năng + +21 +00:01:17,900 --> 00:01:22,520 +hiểu danh sách, chúng ta có thể lấy bốn dòng mã này và biến nó thành một. + +22 +00:01:23,060 --> 00:01:27,740 +Và cách chúng tôi tạo ra một danh sách dễ hiểu trông giống như thế này. + +23 +00:01:28,340 --> 00:01:32,450 +Tôi thích sử dụng phương pháp từ khóa trong đó bạn nhập các từ + +24 +00:01:32,450 --> 00:01:33,283 +khóa hiểu + +25 +00:01:33,530 --> 00:01:38,390 +danh sách, sau đó thay thế từng từ bằng mục thực tế trong mã của bạn. + +26 +00:01:39,170 --> 00:01:43,520 +Cách mà chúng tôi sẽ tạo bất kỳ sự hiểu biết danh sách nào là + +27 +00:01:43,550 --> 00:01:48,550 +chúng tôi sẽ tạo tên của danh sách mới và thay vì tạo một danh sách trống và sau + +28 +00:01:49,040 --> 00:01:53,420 +đó phải thêm vào hoặc điền nó, chúng tôi thực sự sẽ tạo nó thẳng hàng. + +29 +00:01:53,840 --> 00:01:58,220 +Vì vậy, chúng tôi mở một tập hợp các dấu ngoặc vuông để biểu thị rằng chúng + +30 +00:01:58,640 --> 00:02:03,170 +tôi đang tạo một danh sách mới và sau đó chúng tôi có _item cho mục mới này trong + +31 +00:02:03,320 --> 00:02:06,020 +mẫu từ khóa danh sách. Đây là cách nó sẽ hoạt động. + +32 +00:02:06,050 --> 00:02:08,419 +Hãy thực hiện điều tương tự mà chúng tôi đã làm trước đây + +33 +00:02:08,660 --> 00:02:10,520 +khi chúng tôi lấy cho bạn một danh sách các + +34 +00:02:10,580 --> 00:02:14,240 +số và chúng tôi tạo một danh sách mới trong đó mỗi số được tăng thêm một và hãy xem chúng + +35 +00:02:14,480 --> 00:02:17,300 +tôi sẽ thực hiện như thế nào bằng cách sử dụng tính năng hiểu danh sách. + +36 +00:02:18,590 --> 00:02:22,040 +Vì vậy, từ khóa đầu tiên tôi sẽ thay thế là danh sách. + +37 +00:02:22,280 --> 00:02:26,210 +Vì vậy, đây là danh sách mà chúng ta sẽ lặp lại. Và trong trường hợp của chúng tôi, đó + +38 +00:02:26,240 --> 00:02:30,110 +là danh sách các con số này. Vì vậy, chúng ta hãy thay thế + +39 +00:02:30,110 --> 00:02:33,440 +từ khóa danh sách đó bằng danh sách thực tế, là những con số. + +40 +00:02:34,010 --> 00:02:38,210 +Điều dễ hiểu tiếp theo là từng mục trong danh sách. + +41 +00:02:38,210 --> 00:02:41,600 +Vì vậy, chúng tôi có thể gọi đây là bất cứ điều gì chúng tôi muốn. Trong vòng lặp for ở đây, chúng + +42 +00:02:41,600 --> 00:02:46,190 +ta đã gọi nó là n, vậy tại sao chúng ta không tiếp tục và gọi nó là n một lần nữa? + +43 +00:02:47,870 --> 00:02:52,700 +Số n này sẽ đại diện cho từng số trong danh sách các số đó giống + +44 +00:02:52,760 --> 00:02:54,740 +như trong vòng lặp for này. + +45 +00:02:55,460 --> 00:02:59,590 +Và từ khóa cuối cùng mà chúng tôi vẫn chưa thay thế là new_item. + +46 +00:03:00,010 --> 00:03:04,270 +Vì vậy, chúng ta muốn mỗi mục mới có trong danh sách mới này là gì? + +47 +00:03:04,690 --> 00:03:05,200 +Vâng, + +48 +00:03:05,200 --> 00:03:10,200 +mỗi mục mới về cơ bản được tính bằng cách lấy n và sau đó thêm + +49 +00:03:10,750 --> 00:03:11,500 +một vào nó. + +50 +00:03:11,500 --> 00:03:16,500 +Vì vậy, dòng này là biểu thức hoặc mã mà chúng ta cần thực + +51 +00:03:17,560 --> 00:03:21,910 +thi để có được new_item. Vì vậy, đây trở thành danh sách cuối + +52 +00:03:21,910 --> 00:03:25,060 +cùng của chúng tôi hiểu. Chúng tôi có danh sách các + +53 +00:03:25,150 --> 00:03:29,620 +số và sau đó chúng tôi tạo một danh sách mới trong đó chúng tôi lặp qua từng số, + +54 +00:03:29,950 --> 00:03:31,750 +n, bên trong danh sách các số + +55 +00:03:32,080 --> 00:03:37,080 +này và sau đó với mỗi n, chúng tôi thêm một vào danh sách đó để tạo danh sách cuối cùng. + +56 +00:03:37,570 --> 00:03:42,310 +Vì vậy, khi bạn nhìn vào phần hiểu danh sách giống như trong mã thực, có thể hơi khó + +57 +00:03:42,610 --> 00:03:45,700 +hiểu để xem bạn sẽ đọc nó như thế nào, nó diễn + +58 +00:03:45,730 --> 00:03:47,260 +ra theo thứ tự nào. + +59 +00:03:47,620 --> 00:03:50,920 +Nhưng khi bạn đang sử dụng phương pháp từ khóa này mà tôi thường sử + +60 +00:03:50,920 --> 00:03:55,240 +dụng khi bạn chỉ cần gõ ra những gì bạn cần có bên trong khả năng hiểu danh sách, bạn + +61 +00:03:55,240 --> 00:03:58,390 +cần một tên cho danh sách mới, bạn cần một bộ dấu ngoặc + +62 +00:03:58,660 --> 00:04:02,680 +vuông và sau đó bên trong dấu ngoặc vuông , bạn có new_item cho mục trong danh sách. + +63 +00:04:03,010 --> 00:04:07,390 +Sau đó, bạn thay thế từng từ khóa, mục + +64 +00:04:07,390 --> 00:04:12,340 +danh sách và new_item. Vì vậy, tôi muốn bạn thực sự viết ra mã này. + +65 +00:04:12,640 --> 00:04:15,310 +Hãy tiếp tục và tạo một dự án PyCharm mới và + +66 +00:04:15,670 --> 00:04:18,220 +tôi muốn bạn truy cập vào bảng điều khiển Python. + +67 +00:04:18,700 --> 00:04:21,940 +Chúng tôi sẽ không thực sự viết mã bên trong chính của chúng tôi. py + +68 +00:04:22,300 --> 00:04:26,770 +Và lý do là vì bảng điều khiển cho phép chúng ta viết từng dòng mã và + +69 +00:04:27,070 --> 00:04:31,150 +sau đó chúng ta có thể xem các biến của mình một cách thực sự dễ + +70 +00:04:31,150 --> 00:04:35,650 +dàng trên ngăn bên tay phải ở đây. Ví dụ: nếu tôi có danh sách các số, + +71 +00:04:36,130 --> 00:04:39,310 +1, 2, 3 và sau đó tôi phải viết ra khả năng hiểu danh + +72 +00:04:39,340 --> 00:04:42,610 +sách của mình nơi chúng tôi tạo danh sách mới mà tôi sẽ gọi là + +73 +00:04:43,150 --> 00:04:46,510 +new_numbers và sau đó chúng tôi phải tạo khả năng hiểu danh sách của mình. + +74 +00:04:46,600 --> 00:04:51,600 +Vì vậy, cách để nhớ nó là new_item cho mục trong danh sách. + +75 +00:04:52,660 --> 00:04:57,660 +Vì vậy, bây giờ hãy tiếp tục và viết điều này ra và xem liệu bạn có thể nhớ cách chúng tôi thực sự cấu + +76 +00:04:58,150 --> 00:05:02,830 +trúc khả năng hiểu danh sách của mình hay không và xem liệu bạn có thể làm cho nó hoạt động trong + +77 +00:05:02,830 --> 00:05:06,340 +bảng điều khiển PyCharm của mình hay không. Vì vậy, hãy tạm dừng video, thử xem. + +78 +00:05:08,170 --> 00:05:11,500 +Được rồi. Vì vậy, danh sách của chúng tôi tất nhiên là danh sách những con số này. + +79 +00:05:11,530 --> 00:05:13,180 +Vì vậy, chúng ta hãy thay thế nó trước. + +80 +00:05:13,660 --> 00:05:16,930 +Và sau đó, đối với mỗi mục trong danh sách số đó, chúng ta có thể + +81 +00:05:16,930 --> 00:05:21,070 +gọi nó là bất cứ thứ gì chúng ta muốn. Vì vậy, tôi sẽ chỉ gọi nó là n + +82 +00:05:21,310 --> 00:05:25,300 +hay num, điều đó không quan trọng. Nhưng miễn là bạn nhất + +83 +00:05:25,540 --> 00:05:26,950 +quán sử dụng + +84 +00:05:27,340 --> 00:05:30,670 +nó khi tạo mục mới vì mỗi mục mới + +85 +00:05:30,730 --> 00:05:34,210 +sẽ là n, là mỗi số trong danh sách, +1. + +86 +00:05:34,750 --> 00:05:36,400 +Vì vậy, bây giờ khi + +87 +00:05:36,460 --> 00:05:41,410 +tôi nhấn enter, bạn có thể thấy tôi đã có danh sách mới này có tên là new_numbers được + +88 +00:05:41,410 --> 00:05:45,550 +tạo từ danh sách trước đó, các số và danh sách này hiện có cùng + +89 +00:05:45,580 --> 00:05:48,160 +số mục nhưng mỗi mục hiện được tăng thêm một. + +90 +00:05:49,480 --> 00:05:52,960 +Bây giờ, điều quan trọng cần nhớ là khi chúng ta nói khả năng hiểu danh sách, + +91 +00:05:53,200 --> 00:05:56,680 +điều đó không hoàn toàn có nghĩa là bạn chỉ có thể làm việc với danh sách. + +92 +00:05:56,930 --> 00:06:00,710 +Bạn có thể làm việc với các chuỗi khác như chuỗi chẳng hạn. + +93 +00:06:00,950 --> 00:06:05,630 +Vì vậy, ở đây tôi có một biến được gọi là tên, nó chỉ là một chuỗi. Đó là từ + +94 +00:06:05,690 --> 00:06:06,523 +Angela. + +95 +00:06:06,770 --> 00:06:11,770 +Và tôi đang tạo một danh sách mới bằng cách sử dụng cách hiểu danh sách có loại mã + +96 +00:06:13,520 --> 00:06:14,510 +này. Bây + +97 +00:06:14,510 --> 00:06:19,510 +giờ, tôi muốn bạn dừng lại một chút và suy nghĩ về những gì sẽ có trong danh + +98 +00:06:19,610 --> 00:06:24,050 +sách mới này, nó sẽ như thế nào? Và sau đó tôi muốn bạn dùng thử bên trong PyCharm. + +99 +00:06:24,350 --> 00:06:28,460 +Vì vậy, hãy tạm dừng video ngay bây giờ. Được rồi. + +100 +00:06:28,460 --> 00:06:32,900 +Vì vậy, tên bằng Angela, đây là biến mà chúng tôi đang làm việc với. + +101 +00:06:33,500 --> 00:06:35,630 +Và sau đó tôi sẽ tạo + +102 +00:06:35,720 --> 00:06:39,290 +một danh sách mới mà tôi sẽ gọi là danh sách thư. + +103 +00:06:40,550 --> 00:06:44,600 +Danh sách mới này sẽ được tạo bằng cách sử dụng khả năng hiểu danh sách của tôi. + +104 +00:06:44,990 --> 00:06:49,990 +Vì vậy, nó sẽ là ký tự cho chữ cái trong tên. Và điều này làm là nó + +105 +00:06:53,510 --> 00:06:56,330 +lấy chuỗi này, chuỗi này, nó đi + +106 +00:06:56,780 --> 00:06:59,750 +qua từng chữ cái trong chuỗi đó và + +107 +00:07:00,230 --> 00:07:04,640 +sau đó nó thêm từng chữ cái vào danh sách mới này. + +108 +00:07:05,060 --> 00:07:08,210 +Vì vậy, khi tôi nhấn enter, bạn có thể thấy, danh + +109 +00:07:08,210 --> 00:07:13,010 +sách chữ cái trông như thế nào. Nó chỉ tách chuỗi của tôi thành các chữ cái + +110 +00:07:13,280 --> 00:07:15,950 +riêng lẻ và nó được thêm vào một danh sách hoàn toàn mới. + +111 +00:07:17,390 --> 00:07:20,390 +Như tôi đã đề cập, những thứ này trong Python + +112 +00:07:20,390 --> 00:07:25,390 +như một danh sách hoặc một chuỗi hoặc một phạm vi hoặc tuple, chúng được gọi là chuỗi + +113 +00:07:27,800 --> 00:07:32,630 +vì chúng có một thứ tự cụ thể. Và khi bạn thực hiện việc hiểu + +114 +00:07:32,660 --> 00:07:37,280 +danh sách, nó sẽ lấy chuỗi đó và nó sẽ đi qua nó theo thứ + +115 +00:07:37,280 --> 00:07:41,870 +tự có thể là các chữ cái trong chuỗi hoặc các mục trong danh sách. + +116 +00:07:42,230 --> 00:07:46,280 +Và sau đó, nó sẽ lấy từng mục đó theo đúng thứ tự đó và sau đó làm điều + +117 +00:07:46,490 --> 00:07:50,450 +gì đó với nó, thêm một cái vào nó, hoặc trong trường hợp này, không làm gì cả + +118 +00:07:50,450 --> 00:07:54,650 +và chỉ thêm nó vào một danh sách mới. Đây là một thách thức dành cho bạn. + +119 +00:07:55,010 --> 00:07:56,720 +Bạn có thể lấy phạm + +120 +00:07:56,750 --> 00:08:01,670 +vi, cũng là một chuỗi mà chúng ta có thể lặp lại và sau đó tạo phạm + +121 +00:08:01,670 --> 00:08:03,440 +vi từ 1 đến 5 không? + +122 +00:08:03,800 --> 00:08:07,940 +Và hãy nhớ rằng cách thức hoạt động của phạm vi là nó sẽ mất + +123 +00:08:07,940 --> 00:08:12,590 +1 rồi đến 2, rồi 3 và sau đó 4, nhưng nó sẽ không tăng lên 5. + +124 +00:08:13,070 --> 00:08:17,630 +Tôi muốn bạn lặp qua phạm vi này và sau đó tạo một danh sách trong + +125 +00:08:17,630 --> 00:08:20,630 +đó mỗi số trong phạm vi được nhân đôi. + +126 +00:08:21,170 --> 00:08:25,760 +Và danh sách cuối cùng sẽ trông như thế này. Nó sẽ là 2, 4, + +127 +00:08:25,820 --> 00:08:29,780 +6 và 8. Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +128 +00:08:32,450 --> 00:08:34,730 +Được rồi. Vì vậy, hãy tạo danh + +129 +00:08:34,760 --> 00:08:37,039 +sách mới của chúng tôi mà tôi sẽ gọi là range_list. + +130 +00:08:37,429 --> 00:08:40,340 +Và chúng tôi sẽ sử dụng mẫu từ khóa đó để nhắc nhở bản thân. + +131 +00:08:40,610 --> 00:08:44,570 +Vì vậy, nó sẽ là new_item cho mục trong danh sách. + +132 +00:08:45,110 --> 00:08:48,380 +Và danh sách này, trong trường hợp này, thực sự sẽ không phải là một danh + +133 +00:08:48,380 --> 00:08:50,810 +sách, nó sẽ là một phạm vi từ 1 đến 5. + +134 +00:08:51,320 --> 00:08:55,220 +Và sau đó mỗi mục, chúng ta phải đặt cho nó một cái tên, mà tôi sẽ chỉ gọi là num. + +135 +00:08:55,710 --> 00:09:00,510 +Và sau đó trong danh sách mới này, mỗi mục mới sẽ là gì? Chà, nó sẽ được + +136 +00:09:00,510 --> 00:09:05,040 +nhân với 2. Vì vậy, bây giờ khi tôi nhấn + +137 +00:09:05,070 --> 00:09:08,640 +enter, tôi nhận được range_list của mình, là 2, 4, 6, 8. + +138 +00:09:09,030 --> 00:09:11,760 +Vì vậy, nó lặp qua từng số trong phạm vi + +139 +00:09:11,940 --> 00:09:14,340 +và nhân từng số đó với 2, sau + +140 +00:09:14,670 --> 00:09:18,750 +đó nó tạo ra một danh sách mới bằng cách sử dụng từng số đó. + +141 +00:09:19,920 --> 00:09:24,420 +Bây giờ, điều cuối cùng tôi muốn cho bạn thấy về khả năng hiểu danh sách + +142 +00:09:24,420 --> 00:09:28,590 +là cũng có một thứ gọi là hiểu danh sách có điều kiện. + +143 +00:09:29,010 --> 00:09:31,860 +Điều này đưa các từ khóa của chúng tôi đi xa hơn một chút. + +144 +00:09:31,880 --> 00:09:35,030 +Trong khi trước đó chúng tôi đã dừng lại ngay tại + +145 +00:09:35,900 --> 00:09:40,730 +đây, 0: new_item cho mục trong danh sách. Chúng tôi cũng có thể gắn thẻ vào hai từ khóa + +146 +00:09:40,850 --> 00:09:42,410 +khác; nếu và một bài kiểm tra. + +147 +00:09:43,070 --> 00:09:48,070 +Điều này sẽ cho phép chúng tôi làm là chỉ thêm mục mới này + +148 +00:09:48,800 --> 00:09:53,660 +và chỉ thực hiện mã này nếu thử nghiệm thực sự vượt qua. + +149 +00:09:54,920 --> 00:09:59,780 +Đây là một ví dụ. Tôi có một loạt tên ở đây; Alex, Beth, Caroline, + +150 +00:09:59,780 --> 00:10:02,120 +Dave, Eleanor và Freddy. Bây giờ, một trong + +151 +00:10:02,120 --> 00:10:06,980 +những điều thú vị mà bạn thực sự có thể làm với bảng điều khiển Python là bạn không chỉ + +152 +00:10:06,980 --> 00:10:10,160 +có thể xem tất cả các biến bằng nhau mà còn có thể + +153 +00:10:10,370 --> 00:10:12,530 +chỉnh sửa chúng nếu bạn gặp sự cố. + +154 +00:10:13,010 --> 00:10:17,300 +Những người tinh mắt trong số các bạn sẽ biết rằng tôi đã thực sự mắc lỗi chính + +155 +00:10:17,300 --> 00:10:21,800 +tả trong cái tên này, đó không phải là Elanor, nó thực sự được đánh vần hơi khác một chút. + +156 +00:10:22,280 --> 00:10:27,020 +Vì vậy, những gì tôi có thể làm trên ngăn bên phải ở đây là tôi có thể nhấp chuột phải + +157 +00:10:27,020 --> 00:10:30,860 +vào phần dữ liệu mà tôi muốn thay đổi, sau đó nhấp vào đặt giá trị, và + +158 +00:10:31,280 --> 00:10:33,740 +sau đó thực sự thay đổi dữ liệu ở đây. + +159 +00:10:35,120 --> 00:10:39,530 +Bây giờ tôi đã viết đúng chính tả, nếu tôi nhập tên và nhấn enter, bạn + +160 +00:10:39,770 --> 00:10:44,360 +có thể thấy nó hiện đã được sửa và đây là danh sách tên mới của tôi. + +161 +00:10:45,170 --> 00:10:46,820 +Vì vậy, bằng cách sử dụng + +162 +00:10:47,180 --> 00:10:50,030 +danh sách tên này, tôi sẽ thử tạo một danh sách tên + +163 +00:10:50,360 --> 00:10:52,460 +mới, nhưng tôi chỉ muốn những tên ngắn. + +164 +00:10:52,550 --> 00:10:57,550 +Tôi chỉ muốn những cái tên được tạo thành từ bốn chữ cái trở xuống, như Alex + +165 +00:10:57,620 --> 00:10:58,453 +hoặc Beth. + +166 +00:10:58,700 --> 00:11:02,750 +Cách tôi sẽ làm điều này là tôi sẽ tạo một danh sách + +167 +00:11:02,780 --> 00:11:06,530 +mới, được gọi là short_names. Và sau đó tôi sẽ sử dụng khả năng hiểu danh sách của mình. + +168 +00:11:06,800 --> 00:11:11,720 +Và hãy nhớ, trong trường hợp này, các từ khóa là new_item + +169 +00:11:11,810 --> 00:11:16,550 +cho mục trong danh sách. Và sau đó nếu và một bài kiểm tra. + +170 +00:11:17,540 --> 00:11:19,670 +Vì vậy, chúng ta hãy điền vào các phần dễ trước. + +171 +00:11:20,060 --> 00:11:24,290 +Danh sách sẽ là danh sách tên của chúng tôi, mục mà tôi có thể + +172 +00:11:24,290 --> 00:11:29,210 +gọi là bất cứ thứ gì tôi muốn. Tôi sẽ chỉ gọi tên nó theo dạng số ít của tên. + +173 +00:11:29,720 --> 00:11:33,770 +Và sau đó khi tôi lặp lại từng cái tên trong danh sách tên của + +174 +00:11:34,100 --> 00:11:38,090 +mình, mục mới sẽ là gì? Chà, nó thực sự sẽ không được sửa đổi. + +175 +00:11:38,090 --> 00:11:42,350 +Nó sẽ là cùng một cái tên. Nhưng trong trường hợp này, tôi sẽ + +176 +00:11:42,380 --> 00:11:46,940 +chỉ thêm tên đó vào danh sách nếu nó vượt qua bài kiểm tra này. + +177 +00:11:47,540 --> 00:11:51,140 +Và bài kiểm tra này sẽ xem xét độ dài của tên mà + +178 +00:11:51,260 --> 00:11:53,030 +tôi đã tạo ở đây, vì + +179 +00:11:53,290 --> 00:11:57,940 +vậy nếu tôi đặt tên này là n thì tôi sẽ kiểm tra nó với n và + +180 +00:11:57,940 --> 00:12:01,060 +nó cũng sẽ thêm n. Nhưng bởi vì tôi đã gọi nó + +181 +00:12:01,060 --> 00:12:04,300 +bằng tên nên tôi sẽ sử dụng tên đó ngay tại đây trong điều kiện. + +182 +00:12:04,810 --> 00:12:07,900 +Vì vậy, nếu độ dài của tên nhỏ hơn năm, tức + +183 +00:12:08,230 --> 00:12:11,620 +là nó có bốn ký tự trở xuống, thì tôi sẽ thêm + +184 +00:12:12,370 --> 00:12:17,350 +tên đó vào danh sách mới của mình. Bây giờ, khi tôi nhấn enter, bạn có + +185 +00:12:17,710 --> 00:12:22,710 +thể thấy rằng tôi đã có danh sách tên ngắn mới này và nó chỉ chứa những + +186 +00:12:22,870 --> 00:12:24,970 +cái tên, Alex, Beth và Dave. + +187 +00:12:25,630 --> 00:12:30,580 +Vì vậy, việc hiểu danh sách này bây giờ phức tạp hơn một chút bởi vì + +188 +00:12:30,580 --> 00:12:35,580 +điều đầu tiên nó làm là xem qua từng tên bên trong danh sách tên này, nó + +189 +00:12:36,100 --> 00:12:41,080 +kiểm tra độ dài của từng tên đó. Và nếu độ dài là năm, thì + +190 +00:12:41,350 --> 00:12:44,530 +nó sẽ thêm tên vào danh sách mới này. + +191 +00:12:46,180 --> 00:12:47,620 +Bây giờ đây là một thách thức cho bạn. + +192 +00:12:48,130 --> 00:12:52,120 +Tôi muốn bạn lấy tất cả các tên từ danh sách những + +193 +00:12:52,570 --> 00:12:57,340 +cái tên này được tạo thành từ năm chữ cái trở lên, vì vậy về + +194 +00:12:57,370 --> 00:12:58,720 +cơ bản Caroline, + +195 +00:12:59,050 --> 00:13:04,050 +Eleanor và Freddie, và tôi muốn bạn chuyển từng tên này thành phiên bản viết hoa. + +196 +00:13:04,720 --> 00:13:09,720 +Những gì bạn nên kết thúc với là một danh sách trong đó bạn có CAROLINE ở tất cả các + +197 +00:13:10,960 --> 00:13:15,430 +chữ hoa, ELEANOR ở tất cả các chữ hoa và FREDDIE ở tất cả các chữ hoa. + +198 +00:13:15,670 --> 00:13:17,470 +Nhưng tất nhiên, bạn sẽ không chỉ gõ nó + +199 +00:13:17,470 --> 00:13:19,420 +ra, bạn sẽ sử dụng khả năng hiểu danh sách. + +200 +00:13:19,930 --> 00:13:22,900 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +201 +00:13:25,060 --> 00:13:27,790 +Được rồi. Tôi sẽ gọi danh sách mới này là long_names, + +202 +00:13:27,820 --> 00:13:32,170 +vì tôi đã không ăn trong một thời gian và tôi thiếu trí tưởng tượng. Bây giờ, để tạo danh + +203 +00:13:32,260 --> 00:13:34,450 +sách các tên dài này, tôi + +204 +00:13:34,510 --> 00:13:37,450 +sẽ sử dụng mẫu từ khóa mới mà + +205 +00:13:37,780 --> 00:13:41,530 +chúng ta đã học, đây là mục mới cho mục + +206 +00:13:41,800 --> 00:13:46,300 +trong danh sách nếu thử nghiệm. Danh sách, một lần nữa, sẽ là danh sách tên của chúng tôi. + +207 +00:13:46,780 --> 00:13:49,540 +Mỗi mục chúng ta có thể gọi nó là bất cứ thứ gì + +208 +00:13:49,690 --> 00:13:54,430 +chúng ta muốn, nhưng tôi sẽ gọi nó bằng tên. Và nếu bạn thấy cái này quá giống cái này, bạn có thể gọi + +209 +00:13:54,700 --> 00:13:55,870 +bất cứ thứ gì bạn muốn. + +210 +00:13:55,900 --> 00:14:00,900 +Nôm na, bạn có thể sử dụng tiếng Pháp hoặc bạn chỉ có thể viết n hoặc bạn có thể làm bất cứ điều gì bạn muốn. + +211 +00:14:02,830 --> 00:14:07,830 +Tên mà chúng tôi đang lặp lại này sẽ được thử nghiệm để xem liệu chúng tôi có thực sự tạo + +212 +00:14:08,350 --> 00:14:10,120 +ra một mặt hàng mới hay không. + +213 +00:14:10,600 --> 00:14:15,600 +Vì vậy, bài kiểm tra, trong trường hợp này, chúng tôi đang kiểm tra xem liệu độ dài của tên bây giờ + +214 +00:14:15,760 --> 00:14:17,290 +có lớn hơn năm hay không. + +215 +00:14:19,090 --> 00:14:23,890 +Và nếu cái tên mà chúng ta hiện đang lặp lại này vượt qua được bài kiểm tra này, + +216 +00:14:24,160 --> 00:14:27,340 +thì chúng ta sẽ xác định được mục mới nên là gì. + +217 +00:14:27,940 --> 00:14:31,870 +Vì vậy, mục mới sẽ là tên cụ thể đã vượt qua bài kiểm tra, + +218 +00:14:32,260 --> 00:14:34,060 +nhưng sau đó nó sẽ được + +219 +00:14:34,360 --> 00:14:38,950 +viết hoa, vì vậy chúng tôi sẽ gọi tên. trên để tạo mục mới sẽ + +220 +00:14:38,980 --> 00:14:42,850 +được thêm vào danh sách. Vì vậy, bây giờ khi + +221 +00:14:43,030 --> 00:14:47,770 +tôi nhấn enter, bạn có thể thấy danh sách mới mà tôi đã tạo, long_names, có + +222 +00:14:47,800 --> 00:14:50,920 +Caroline, Eleanor và Freddy, tất cả đều được viết hoa. + +223 +00:14:51,560 --> 00:14:54,770 +Về cơ bản, chúng tôi lặp lại từng cái tên trong danh sách, chúng tôi + +224 +00:14:55,010 --> 00:14:58,370 +lấy từng cái tên đó và kiểm tra xem chúng có dài hơn năm hay không. + +225 +00:14:58,760 --> 00:15:00,860 +Trên thực tế, nếu chúng dài hơn năm, + +226 +00:15:00,920 --> 00:15:04,640 +thì chúng tôi xem xét phần này của mã để xem chúng tôi nên + +227 +00:15:04,640 --> 00:15:07,910 +làm gì với từng tên đó. Và trong trường hợp của chúng tôi, chúng tôi đã chuyển nó thành chữ hoa. + +228 +00:15:08,600 --> 00:15:12,020 +Vì vậy, có khá nhiều lý thuyết được đề cập trong bài học hôm nay. + +229 +00:15:12,320 --> 00:15:15,260 +Và nếu bạn muốn xem đoạn mã mà tôi đã viết cho đến nay, + +230 +00:15:15,530 --> 00:15:20,420 +thì bạn luôn có thể xem phần Repl cuối ngày 26. nó để tải xuống hoặc chỉ cần + +231 +00:15:20,420 --> 00:15:25,310 +đọc qua mã mà tôi đã nhập. Bây giờ, để có thể hiểu đầy đủ + +232 +00:15:25,340 --> 00:15:27,800 +những gì đang xảy ra, bạn không thể chỉ + +233 +00:15:28,010 --> 00:15:31,580 +xem tôi nói về nó. Bạn phải tập luyện. + +234 +00:15:31,850 --> 00:15:33,230 +Vì vậy, trong các + +235 +00:15:33,260 --> 00:15:38,090 +bài học sắp tới, tôi có một loạt các bài tập để bạn thực hành sử dụng và tạo + +236 +00:15:38,090 --> 00:15:41,480 +ra danh sách hiểu cho chính mình. Và theo cách đó, khi bạn đã thực + +237 +00:15:41,750 --> 00:15:45,050 +hiện xong các bài tập, bạn đã thực hiện các bước nhấn mã, sau đó bạn sẽ + +238 +00:15:45,050 --> 00:15:49,490 +có thể thể hiện cơ bắp hiểu danh sách của mình. Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 Exercise-28.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 Exercise-28.url new file mode 100644 index 0000000000000000000000000000000000000000..a423fb9f592372805ba91b91ea1e6d37a48b5690 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 Exercise-28.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d16d11d5-4612-46d1-b2ea-6174f93eacd2 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 How-to-join-Auditorium.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 [Interactive Coding Exercise] Squaring Numbers.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 [Interactive Coding Exercise] Squaring Numbers.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d5216af4a93a8e45d8667bd439daecf5fd0b118b --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 [Interactive Coding Exercise] Squaring Numbers.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06ef48ed49e807a995c80e4463351951664aef64fa1bb8f164e37b25e7f16ab7 +size 6853899 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 [Interactive Coding Exercise] Squaring Numbers_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 [Interactive Coding Exercise] Squaring Numbers_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fbdbdc1a062e0676ad5228afeeb8b6daba32d59c --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/003 [Interactive Coding Exercise] Squaring Numbers_vi.srt @@ -0,0 +1,208 @@ +1 +00:00:00,330 --> 00:00:01,290 +Người hướng dẫn: Trong + +2 +00:00:01,290 --> 00:00:04,890 +bài tập này, chúng ta sẽ thực hành một số cách đọc hiểu danh sách. + +3 +00:00:04,890 --> 00:00:05,723 +Bạn sẽ viết + +4 +00:00:05,723 --> 00:00:08,580 +một số mã hiểu danh sách của riêng mình + +5 +00:00:08,580 --> 00:00:10,710 +và bạn sẽ tạo một danh sách mới + +6 +00:00:10,710 --> 00:00:12,300 +từ danh sách các số, trong + +7 +00:00:12,300 --> 00:00:15,510 +đó mỗi số đều là bình phương. + +8 +00:00:15,510 --> 00:00:17,280 +Vì vậy, trong đó ban đầu + +9 +00:00:17,280 --> 00:00:20,580 +là 2, sau đó trong danh sách mới, nó sẽ trở thành + +10 +00:00:20,580 --> 00:00:23,010 +4, trong đó ban đầu là 8, nó sẽ trở + +11 +00:00:23,010 --> 00:00:24,450 +thành 64, v.v. + +12 +00:00:24,450 --> 00:00:26,820 +Nếu bạn nhìn vào hộp mô tả, bạn có + +13 +00:00:26,820 --> 00:00:29,760 +thể thấy kết quả đầu ra sẽ như thế nào. + +14 +00:00:29,760 --> 00:00:32,640 +Nhưng tất nhiên, chúng tôi muốn bạn thực + +15 +00:00:32,640 --> 00:00:36,480 +sự viết mã có thể tạo ra mã này bằng cách hiểu danh sách. + +16 +00:00:36,480 --> 00:00:39,900 +Chỉ cần một dòng mã để thực hiện việc này. + +17 +00:00:39,900 --> 00:00:41,760 +Và bạn không cần vòng lặp + +18 +00:00:41,760 --> 00:00:45,480 +for, bạn không cần phải viết bất kỳ điều kiện nào. + +19 +00:00:45,480 --> 00:00:47,310 +Việc này nên được thực hiện bằng cách sử dụng + +20 +00:00:47,310 --> 00:00:49,110 +những gì bạn đã học về hiểu danh sách. + +21 +00:00:49,110 --> 00:00:51,180 +Và nếu bất kỳ lúc nào bạn gặp + +22 +00:00:51,180 --> 00:00:54,330 +khó khăn, hãy xem các gợi ý trong hộp mô + +23 +00:00:54,330 --> 00:00:56,130 +tả, xem lại bài học mà + +24 +00:00:56,130 --> 00:00:59,370 +bạn đã học về hiểu danh sách và thử một số + +25 +00:00:59,370 --> 00:01:03,360 +thứ, in ra và xem nó có hiệu quả không. + +26 +00:01:03,360 --> 00:01:04,209 +Hãy thử ngay bây giờ. + +27 +00:01:07,110 --> 00:01:08,700 +Tôi biết giải pháp có vẻ đơn giản. + +28 +00:01:08,700 --> 00:01:12,330 +Chỉ là một dòng mã, nhưng đôi khi một dòng mã + +29 +00:01:12,330 --> 00:01:15,480 +càng ngắn gọn thì càng khó đạt được. + +30 +00:01:15,480 --> 00:01:17,670 +Vì vậy chúng ta hãy cùng nhau vượt qua điều này. + +31 +00:01:17,670 --> 00:01:19,770 +Chúng ta có các số bình phương, + +32 +00:01:19,770 --> 00:01:23,340 +đó là danh sách các số ở dòng 1 trong đó mỗi + +33 +00:01:23,340 --> 00:01:26,760 +giá trị được nhân với chính nó. + +34 +00:01:26,760 --> 00:01:30,900 +Bây giờ, chúng ta bình phương một số bằng cách nhân num với num. + +35 +00:01:30,900 --> 00:01:32,340 +Bây giờ, chính xác thì num là gì? + +36 +00:01:32,340 --> 00:01:37,170 +Chà, num sẽ là mỗi số trong danh sách của chúng ta, + +37 +00:01:37,170 --> 00:01:38,670 +được gọi là số. + +38 +00:01:38,670 --> 00:01:41,730 +Cú pháp đầy đủ là num nhân với + +39 +00:01:41,730 --> 00:01:44,310 +num cho num trong số. + +40 +00:01:44,310 --> 00:01:45,900 +Nếu những điều này không + +41 +00:01:45,900 --> 00:01:48,870 +có ý nghĩa gì, tôi thực sự khuyên bạn nên xem lại + +42 +00:01:48,870 --> 00:01:52,980 +bài học về hiểu danh sách vì đây là nội dung khó hiểu và nếu bạn chỉ + +43 +00:01:52,980 --> 00:01:56,760 +in ra các số mà bạn đã bình phương từng số một theo cách thủ + +44 +00:01:56,760 --> 00:01:58,950 +công hoặc bạn đã sử dụng một vòng lặp + +45 +00:01:58,950 --> 00:02:01,440 +hoàn chỉnh trong đó bạn có câu lệnh if, + +46 +00:02:01,440 --> 00:02:03,300 +thì đó không phải là mục tiêu + +47 +00:02:03,300 --> 00:02:05,250 +ngày hôm nay. + +48 +00:02:05,250 --> 00:02:07,440 +Mục đích là để thực hành hiểu danh sách. + +49 +00:02:07,440 --> 00:02:10,229 +Vì vậy, hãy sửa lại nó và quay lại mã của bạn và sửa + +50 +00:02:10,229 --> 00:02:11,430 +đổi nếu cần thiết. + +51 +00:02:11,430 --> 00:02:13,920 +Nếu bạn làm đúng mọi thứ thì xin chúc mừng và bạn + +52 +00:02:13,920 --> 00:02:16,323 +đã sẵn sàng chuyển sang bài học tiếp theo. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 Exercise-29.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 Exercise-29.url new file mode 100644 index 0000000000000000000000000000000000000000..8ed7eab0345b6453aa723d4534fc40f48c0456a3 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 Exercise-29.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/cd26595b-5d0b-40a6-933e-8dc47a497fcc \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 How-to-join-Auditorium.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 [Interactive Coding Exercise] Filtering Even Numbers.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 [Interactive Coding Exercise] Filtering Even Numbers.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2f1081caebd72fd3a664085f647aa565fe03999e --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 [Interactive Coding Exercise] Filtering Even Numbers.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6612922f20eba3e5c5bde388a659589c19e92fb441afb15141d7c535a6b0ceef +size 12124030 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 [Interactive Coding Exercise] Filtering Even Numbers_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 [Interactive Coding Exercise] Filtering Even Numbers_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9691c358127a4fe44a0f7859fe5ff2bd2808a7ea --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/004 [Interactive Coding Exercise] Filtering Even Numbers_vi.srt @@ -0,0 +1,280 @@ +1 +00:00:00,420 --> 00:00:01,530 +Angela: Trong + +2 +00:00:01,530 --> 00:00:04,410 +bài tập này, chúng ta sẽ sử + +3 +00:00:04,410 --> 00:00:08,370 +dụng khả năng hiểu danh sách để lọc + +4 +00:00:08,370 --> 00:00:12,360 +ra các số chẵn từ một dãy số. + +5 +00:00:12,360 --> 00:00:15,270 +Trong khung nhập liệu, chúng ta có một + +6 +00:00:15,270 --> 00:00:18,120 +số văn bản có nhiều số và sau đó nó sẽ được + +7 +00:00:18,120 --> 00:00:22,200 +đưa vào phần chính. py qua dòng 1 nơi chúng + +8 +00:00:22,200 --> 00:00:26,370 +tôi chia các số bằng dấu phẩy và dấu cách. + +9 +00:00:26,370 --> 00:00:30,030 +Và sau đó bạn phải viết một số phần hiểu danh sách + +10 +00:00:30,030 --> 00:00:34,110 +để chuyển đổi chuỗi thành số nguyên, nhưng vẫn giữ định + +11 +00:00:34,110 --> 00:00:36,540 +dạng danh sách đó, sau đó sử dụng + +12 +00:00:36,540 --> 00:00:38,850 +lại phần hiểu danh sách để lọc + +13 +00:00:38,850 --> 00:00:41,370 +ra các số lẻ và lưu trữ các số chẵn + +14 +00:00:41,370 --> 00:00:45,210 +trong một danh sách mới gọi là kết quả. + +15 +00:00:45,210 --> 00:00:46,950 +Và cuối cùng giữ nguyên dòng + +16 +00:00:46,950 --> 00:00:50,940 +12 vì chúng ta cần in ra kết quả để kiểm tra mã của bạn. + +17 +00:00:50,940 --> 00:00:54,060 +Hãy thử viết mã, xem bên trong hộp mô tả nếu có + +18 +00:00:54,060 --> 00:00:55,920 +điều gì chưa rõ ràng, đồng + +19 +00:00:55,920 --> 00:00:59,130 +thời kiểm tra các gợi ý, đồng thời xem lại bài + +20 +00:00:59,130 --> 00:01:01,650 +học về hiểu danh sách nếu bạn quay lại + +21 +00:01:01,650 --> 00:01:03,650 +sau một thời gian dài. + +22 +00:01:05,820 --> 00:01:08,730 +Bằng cách nào đó, giải pháp luôn rõ ràng hơn + +23 +00:01:08,730 --> 00:01:11,730 +khi chúng ta chỉ nhìn vào mã giải pháp. + +24 +00:01:11,730 --> 00:01:13,680 +Điều đầu tiên chúng ta + +25 +00:01:13,680 --> 00:01:18,680 +cần làm là chuyển đổi các số đầu vào thành số nguyên. + +26 +00:01:19,230 --> 00:01:21,600 +Chúng tôi đang thực hiện điều đó bằng cách sử dụng + +27 +00:01:21,600 --> 00:01:24,270 +tính năng hiểu danh sách, cách này dễ dàng hơn bất kỳ phương + +28 +00:01:24,270 --> 00:01:26,610 +pháp nào khác và cũng ngắn hơn rất nhiều. + +29 +00:01:26,610 --> 00:01:28,350 +Cách tôi đọc hiểu danh sách là + +30 +00:01:28,350 --> 00:01:30,510 +tôi luôn bắt đầu bằng vòng lặp for. + +31 +00:01:30,510 --> 00:01:32,100 +Vì vậy, chúng ta có một vòng + +32 +00:01:32,100 --> 00:01:34,830 +lặp for trong đó chúng ta lặp qua danh sách + +33 +00:01:34,830 --> 00:01:36,300 +các chuỗi đến từ dòng 1, + +34 +00:01:36,300 --> 00:01:41,040 +tất cả các đầu vào được phân tách bằng dấu phẩy và dấu cách của chúng. + +35 +00:01:41,040 --> 00:01:43,770 +Vì vậy, với x, sẽ là mỗi giá trị + +36 +00:01:43,770 --> 00:01:46,920 +trong danh sách các chuỗi, tại thời + +37 +00:01:46,920 --> 00:01:49,650 +điểm này vẫn là các chuỗi và chúng + +38 +00:01:49,650 --> 00:01:54,630 +ta sẽ lấy x rồi biến nó thành một số nguyên. + +39 +00:01:54,630 --> 00:01:56,850 +Phần đầu tiên của việc hiểu danh sách + +40 +00:01:56,850 --> 00:01:59,670 +là những gì sẽ có trong danh sách mới. + +41 +00:01:59,670 --> 00:02:03,960 +Phần thứ hai là cách nó được đưa vào danh sách mới. + +42 +00:02:03,960 --> 00:02:05,490 +Hy vọng bạn hiểu đúng điều + +43 +00:02:05,490 --> 00:02:09,120 +này, các số trong dấu ngoặc vuông bằng nhau trong ngoặc đơn x, + +44 +00:02:09,120 --> 00:02:11,100 +và sau đó x diễn ra như thế nào? + +45 +00:02:11,100 --> 00:02:14,400 +Chà, nó nằm trong một vòng lặp for, for x trong danh sách các chuỗi, + +46 +00:02:14,400 --> 00:02:18,063 +lặp qua từng giá trị trong danh sách các chuỗi của chúng ta. + +47 +00:02:18,900 --> 00:02:20,010 +Việc tiếp theo + +48 +00:02:20,010 --> 00:02:23,640 +chúng ta cần làm chỉ là lọc các số chẵn. + +49 +00:02:23,640 --> 00:02:26,520 +Trong trường hợp này, chúng ta lại sử dụng tính năng + +50 +00:02:26,520 --> 00:02:31,260 +hiểu danh sách và hãy nhớ rằng tôi đã nói hãy bắt đầu bằng việc xem xét vòng lặp for. + +51 +00:02:31,260 --> 00:02:32,910 +Vậy vòng lặp for của chúng ta đang làm gì? + +52 +00:02:32,910 --> 00:02:36,330 +Nó lặp qua từng số trong danh sách + +53 +00:02:36,330 --> 00:02:40,020 +các số đến từ dòng 4 và chúng ta đang + +54 +00:02:40,020 --> 00:02:41,910 +kiểm tra cái gì? + +55 +00:02:41,910 --> 00:02:44,160 +Vâng, phần tiếp theo là điều kiện. + +56 +00:02:44,160 --> 00:02:47,520 +Nếu số mà chúng ta đang lặp chia + +57 +00:02:47,520 --> 00:02:52,320 +hết cho 2 thì số đó sẽ được thêm vào danh sách + +58 +00:02:52,320 --> 00:02:54,720 +mới gọi là kết quả. + +59 +00:02:54,720 --> 00:02:57,180 +Thứ tự có thể thay đổi một chút, nhưng + +60 +00:02:57,180 --> 00:02:59,700 +khi bạn đã quen với việc hiểu danh + +61 +00:02:59,700 --> 00:03:03,390 +sách, bạn sẽ thấy khá rõ ràng nó sẽ làm gì. + +62 +00:03:03,390 --> 00:03:05,520 +Nhưng nó luôn dễ dàng và rõ ràng + +63 +00:03:05,520 --> 00:03:06,810 +hơn khi bạn nhìn lại + +64 +00:03:06,810 --> 00:03:07,920 +giải pháp thay vì + +65 +00:03:07,920 --> 00:03:09,810 +cố gắng tìm ra giải pháp. + +66 +00:03:09,810 --> 00:03:11,760 +Vì vậy, nếu bạn gặp bất kỳ vấn đề nào, vui + +67 +00:03:11,760 --> 00:03:13,950 +lòng quay lại và thay đổi mã của mình. + +68 +00:03:13,950 --> 00:03:16,710 +Việc nhìn vào lời giải và nghe lời giải thích + +69 +00:03:16,710 --> 00:03:18,330 +không phải là gian lận. + +70 +00:03:18,330 --> 00:03:21,003 +Tất cả chúng ta đều phải trải qua điều này để trở nên tốt hơn. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 Exercise-30.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 Exercise-30.url new file mode 100644 index 0000000000000000000000000000000000000000..35a57e1697830e2e9490e3576cfe50bdbc034807 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 Exercise-30.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/57f6506d-2274-4bb6-989f-60e1e97f2a84 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 How-to-join-Auditorium.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 [Interactive Coding Exercise] Data Overlap.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 [Interactive Coding Exercise] Data Overlap.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0df5538afd1aed48cadefd8bdec5861ff10661f9 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 [Interactive Coding Exercise] Data Overlap.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:038eca600301b81dc0af971cee7cecb5be4ec4197a28246af5e1f694dfcd3068 +size 15855243 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 [Interactive Coding Exercise] Data Overlap_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 [Interactive Coding Exercise] Data Overlap_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f3af85f60f0f109a007c6c8aa19eebb047a8c10c --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/005 [Interactive Coding Exercise] Data Overlap_vi.srt @@ -0,0 +1,432 @@ +1 +00:00:01,290 --> 00:00:02,730 +Người hướng dẫn: Được + +2 +00:00:02,730 --> 00:00:06,780 +rồi, điều đầu tiên cần chú ý về bài tập này là nó khó. + +3 +00:00:06,780 --> 00:00:08,340 +Vì vậy, tôi chỉ muốn cho bạn biết + +4 +00:00:08,340 --> 00:00:10,110 +rằng chúng tôi đang thực hiện việc hiểu + +5 +00:00:10,110 --> 00:00:13,200 +danh sách nhưng hai phần trước hơi dễ dàng hơn một chút. + +6 +00:00:13,200 --> 00:00:14,940 +Và bây giờ chúng tôi đã ướt chân, tôi + +7 +00:00:14,940 --> 00:00:17,880 +nghĩ chúng tôi đã sẵn sàng cho một thử thách thực sự. + +8 +00:00:17,880 --> 00:00:20,430 +Vì vậy, chỉ cần đặt kỳ vọng của bạn. + +9 +00:00:20,430 --> 00:00:23,940 +Nó sẽ không phải là thứ mà bạn có thể lướt qua. + +10 +00:00:23,940 --> 00:00:25,320 +Bây giờ, tôi muốn + +11 +00:00:25,320 --> 00:00:30,320 +bạn xem qua phần mô tả và xem mục tiêu là gì. + +12 +00:00:30,360 --> 00:00:35,360 +Chúng tôi có hai tệp bên ngoài, file1. txt và tập tin2. txt. + +13 +00:00:36,510 --> 00:00:41,510 +Và thách thức của bạn là tạo một danh sách có tên là + +14 +00:00:42,000 --> 00:00:46,380 +result chứa các số chung cho cả hai tệp. + +15 +00:00:46,380 --> 00:00:49,950 +Vì vậy, điều này xảy ra thường xuyên một cách đáng ngạc nhiên. + +16 +00:00:49,950 --> 00:00:53,430 +Tôi thấy mình đang sử dụng Python để kiểm tra, chẳng hạn như + +17 +00:00:53,430 --> 00:00:57,030 +danh sách phim yêu thích của tôi có nằm trong cùng danh sách với + +18 +00:00:57,030 --> 00:01:00,330 +danh sách phim yêu thích của bạn tôi hay lựa chọn cầu thủ + +19 +00:01:00,330 --> 00:01:04,680 +bóng đá giả tưởng của tôi có giống với danh sách của bạn tôi hay không. + +20 +00:01:04,680 --> 00:01:09,150 +Và điều này sẽ được thực hiện bằng cách sử dụng tính năng hiểu danh sách. + +21 +00:01:09,150 --> 00:01:10,950 +Bây giờ, nếu xem qua phần + +22 +00:01:10,950 --> 00:01:12,840 +mô tả, bạn sẽ thấy một số + +23 +00:01:12,840 --> 00:01:15,960 +gợi ý và chúng sẵn sàng trợ giúp bạn. + +24 +00:01:15,960 --> 00:01:18,960 +Khi gặp khó khăn, bạn nên cố gắng xem + +25 +00:01:18,960 --> 00:01:21,060 +qua gợi ý và xem từng gợi ý có + +26 +00:01:21,060 --> 00:01:24,780 +thể giúp bạn vượt qua thử thách hay không. + +27 +00:01:24,780 --> 00:01:28,380 +Nhưng chỉ cần nhận biết, nó sẽ là một cuộc đấu tranh. + +28 +00:01:28,380 --> 00:01:31,980 +Bây giờ, điều bạn mong đợi nằm trong kết quả ví dụ, đây là mục + +29 +00:01:31,980 --> 00:01:34,620 +tiêu mà chúng tôi đang cố gắng đạt được. + +30 +00:01:34,620 --> 00:01:36,930 +Vì vậy, bước chuẩn bị đầu tiên + +31 +00:01:36,930 --> 00:01:39,060 +là đọc qua hướng dẫn. + +32 +00:01:39,060 --> 00:01:41,610 +Bước tiếp theo là tôi muốn bạn + +33 +00:01:41,610 --> 00:01:45,270 +xem file1. txt và tập tin2. txt. + +34 +00:01:45,270 --> 00:01:47,310 +Lưu ý, những điều này không thể chỉnh sửa được. + +35 +00:01:47,310 --> 00:01:48,960 +Chúng tôi đã thiết kế chúng + +36 +00:01:48,960 --> 00:01:52,170 +ở chế độ chỉ đọc để bạn không vô tình thay đổi + +37 +00:01:52,170 --> 00:01:53,430 +một số và xảy ra sự + +38 +00:01:53,430 --> 00:01:56,250 +cố hoặc kết quả không khớp, v.v. + +39 +00:01:56,250 --> 00:01:58,260 +Tệp1. txt chứa một số + +40 +00:01:58,260 --> 00:02:02,610 +số, mỗi số một dòng và file2. txt chứa nhiều số hơn, không + +41 +00:02:02,610 --> 00:02:04,320 +cùng số lượng và cũng + +42 +00:02:04,320 --> 00:02:07,050 +là một số trên mỗi dòng. + +43 +00:02:07,050 --> 00:02:11,460 +Công việc của bạn là nhập những số đó từ hai tệp đó, sử + +44 +00:02:11,460 --> 00:02:14,790 +dụng khả năng hiểu này để so sánh hai tệp + +45 +00:02:14,790 --> 00:02:18,570 +đó và xuất ra thứ gọi là kết quả chứa các số chung + +46 +00:02:18,570 --> 00:02:20,640 +cho cả hai tệp. + +47 +00:02:20,640 --> 00:02:24,330 +Đó là mục tiêu và tôi sẽ để bạn tự tìm hiểu. + +48 +00:02:24,330 --> 00:02:25,263 +Vậy thì chúc may mắn. + +49 +00:02:30,000 --> 00:02:35,000 +Bây giờ, bước đầu tiên là sử dụng Python để mở các tệp của chúng tôi. + +50 +00:02:35,070 --> 00:02:39,060 +Bạn có thể thấy ở dòng một, chúng tôi đang sử dụng từ + +51 +00:02:39,060 --> 00:02:42,903 +khóa with để mở file1. txt dưới dạng tệp1. + +52 +00:02:43,740 --> 00:02:48,330 +Và sau đó chúng tôi đang sử dụng file1. readlines để tạo danh + +53 +00:02:48,330 --> 00:02:53,283 +sách từ tất cả các dòng trong tệp đó. + +54 +00:02:55,050 --> 00:03:00,000 +Bước hai là thực hiện hành động tương tự trên file2 + +55 +00:03:00,000 --> 00:03:03,420 +và lấy danh sách chứa một số trên mỗi + +56 +00:03:03,420 --> 00:03:05,790 +dòng của tệp đó. + +57 +00:03:05,790 --> 00:03:08,940 +Readlines là một phương pháp mà chúng tôi cần để hoàn thành + +58 +00:03:08,940 --> 00:03:11,730 +hành động này và tôi đã để nó trong phần gợi ý, nhưng hy + +59 +00:03:11,730 --> 00:03:14,520 +vọng rằng tại thời điểm này, bạn cũng đã quen với việc + +60 +00:03:14,520 --> 00:03:17,190 +tìm kiếm trên Google những gì bạn cần trên Internet + +61 +00:03:17,190 --> 00:03:19,410 +và bạn có thể đã tìm thấy nó đường. + +62 +00:03:19,410 --> 00:03:21,510 +Bây giờ, bước tiếp theo là bước khó khăn. + +63 +00:03:21,510 --> 00:03:24,600 +Đây là sự hiểu biết danh sách thực tế của chúng tôi. + +64 +00:03:24,600 --> 00:03:26,730 +Hãy bắt đầu với vòng lặp for. + +65 +00:03:26,730 --> 00:03:30,550 +Vì vậy, ở dòng bảy, bạn có thể thấy chúng ta đang lặp + +66 +00:03:31,620 --> 00:03:34,410 +qua list1 và chúng ta đang lấy từng số + +67 +00:03:34,410 --> 00:03:36,630 +bằng cách sử dụng biến num. + +68 +00:03:36,630 --> 00:03:41,630 +Vì vậy, đối với num trong list1, nếu num nằm trong list2, thì từ khóa in ở đây, bạn + +69 +00:03:42,980 --> 00:03:46,680 +thấy in hiển thị hai lần trong dòng này, nhưng chúng thực sự + +70 +00:03:46,680 --> 00:03:48,870 +có nghĩa khác nhau và chúng thực hiện + +71 +00:03:48,870 --> 00:03:50,550 +những việc khác nhau. + +72 +00:03:50,550 --> 00:03:53,910 +Đầu tiên là vòng lặp for in, có nghĩa là + +73 +00:03:53,910 --> 00:03:57,990 +trong một danh sách cụ thể, lặp qua từng mục. + +74 +00:03:57,990 --> 00:04:02,910 +Nhưng nếu tê liệt trong list2 thực sự là một điều kiện. + +75 +00:04:02,910 --> 00:04:04,950 +Đó là kiểm tra xem số mà + +76 +00:04:04,950 --> 00:04:08,880 +chúng ta hiện đang lặp qua list1 có tồn tại trong + +77 +00:04:08,880 --> 00:04:11,100 +list2 hay không. + +78 +00:04:11,100 --> 00:04:14,070 +Và đây là một cách rất ngắn gọn và súc tích + +79 +00:04:14,070 --> 00:04:15,990 +để đạt được mục tiêu của chúng + +80 +00:04:15,990 --> 00:04:19,290 +ta, nhưng nó không phải là cách dễ đọc và dễ hiểu + +81 +00:04:19,290 --> 00:04:20,123 +nhất. + +82 +00:04:20,123 --> 00:04:23,670 +Bạn có thể phải suy nghĩ về nó một vài lần. + +83 +00:04:23,670 --> 00:04:25,260 +Bạn có thể thử mở rộng + +84 +00:04:25,260 --> 00:04:29,790 +nó thành một vòng lặp for đầy đủ và một câu lệnh if đầy đủ. + +85 +00:04:29,790 --> 00:04:32,100 +Nhưng về cơ bản, bước đầu tiên là lặp qua + +86 +00:04:32,100 --> 00:04:33,660 +từng số trong list1. + +87 +00:04:33,660 --> 00:04:35,280 +Bước thứ hai là kiểm tra + +88 +00:04:35,280 --> 00:04:38,310 +từng số đó với mọi mục trong list2. + +89 +00:04:38,310 --> 00:04:40,830 +Sau đó, chúng tôi kết thúc với các giá + +90 +00:04:40,830 --> 00:04:45,830 +trị phù hợp với tiêu chí đó và chúng tôi thêm nó vào kết quả của mình và + +91 +00:04:46,170 --> 00:04:50,403 +tạo một danh sách mới bằng cách sử dụng các kết quả đó. + +92 +00:04:52,320 --> 00:04:54,900 +Bây giờ, điều cuối cùng cần nhớ + +93 +00:04:54,900 --> 00:04:59,760 +là để kết quả được in ra khớp với các phép kiểm tra, kết quả + +94 +00:04:59,760 --> 00:05:03,360 +phải là một danh sách các số nguyên. + +95 +00:05:03,360 --> 00:05:07,170 +Vì vậy, bước cuối cùng trước khi thêm số của chúng + +96 +00:05:07,170 --> 00:05:10,980 +ta vào danh sách là chuyển nó thành số nguyên. + +97 +00:05:10,980 --> 00:05:15,300 +Và chúng tôi làm điều đó ở phần đầu tiên của quá trình hiểu danh sách. + +98 +00:05:15,300 --> 00:05:17,940 +Và bây giờ với vài dòng mã này, chúng + +99 +00:05:17,940 --> 00:05:20,970 +ta đã đạt được mục tiêu của thử thách + +100 +00:05:20,970 --> 00:05:25,970 +và sẽ đạt được kết quả vượt qua tất cả các bài kiểm tra. + +101 +00:05:26,280 --> 00:05:27,113 +Vì vậy, đây chính là + +102 +00:05:27,113 --> 00:05:29,460 +điểm mấu chốt, nếu bạn cần quay lại để khắc phục giải pháp + +103 +00:05:29,460 --> 00:05:31,470 +của mình thì đã đến lúc phải làm điều đó. + +104 +00:05:31,470 --> 00:05:33,030 +Nếu bạn đạt được mọi thứ thì + +105 +00:05:33,030 --> 00:05:35,760 +xin chúc mừng, một cái vỗ nhẹ vào lưng. + +106 +00:05:35,760 --> 00:05:38,400 +Điều này không dễ dàng. Tôi biết. + +107 +00:05:38,400 --> 00:05:40,080 +Và khi bạn đã hài lòng với mã, + +108 +00:05:40,080 --> 00:05:42,453 +hãy chuyển sang bài học tiếp theo. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/006 Apply List Comprehension to the U.S. States Game.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/006 Apply List Comprehension to the U.S. States Game.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5d2a1c788b8132fb9830f3b675a13473f44a21c7 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/006 Apply List Comprehension to the U.S. States Game.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2b3bb19d331b317fc8e5f452a9d245c0cd3a925661b829fff203252c3fc5ee5 +size 13073267 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/006 Apply List Comprehension to the U.S. States Game_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/006 Apply List Comprehension to the U.S. States Game_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ef757f4f79d59cae8af912b47a5b2e026906f517 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/006 Apply List Comprehension to the U.S. States Game_vi.srt @@ -0,0 +1,164 @@ +1 +00:00:00,900 --> 00:00:05,580 +Bây giờ lý do tại sao chúng tôi đang tìm hiểu về khả năng hiểu danh sách là vì khi chúng + +2 +00:00:05,580 --> 00:00:07,980 +tôi tạo trò chơi tất cả các bang của Hoa + +3 +00:00:08,490 --> 00:00:13,490 +Kỳ, tôi nhận ra rằng đoạn mã mà chúng tôi đang viết có thể ngắn hơn rất nhiều nếu chúng tôi chỉ biết + +4 +00:00:14,340 --> 00:00:15,840 +về khả năng hiểu danh sách. + +5 +00:00:16,260 --> 00:00:21,260 +Vì vậy, tôi muốn bạn quay lại mã của bạn cho trò chơi các bang của Hoa + +6 +00:00:21,930 --> 00:00:25,230 +Kỳ và mở nó ra. Và tôi muốn bạn nhìn vào câu lệnh if này. + +7 +00:00:25,770 --> 00:00:28,560 +Vì vậy, khi người dùng gõ thoát, chúng + +8 +00:00:29,070 --> 00:00:34,070 +tôi tạo một danh sách mới các trạng thái bị thiếu để lưu nó vào tệp CSV. + +9 +00:00:36,570 --> 00:00:38,190 +Tôi muốn bạn thay đổi mã + +10 +00:00:38,220 --> 00:00:42,690 +này bằng cách sử dụng kiến thức mới của bạn về phần hiểu này và xem liệu bạn có thể + +11 +00:00:42,690 --> 00:00:44,820 +cắt mã này xuống ba hoặc bốn dòng hay không. + +12 +00:00:45,660 --> 00:00:48,300 +Tạm dừng video và hoàn thành thử thách này ngay bây giờ. + +13 +00:00:51,510 --> 00:00:55,860 +Được rồi. Vì vậy, thay vì tất cả những điều này, tạo một trạng thái thiếu trống mới và sau + +14 +00:00:55,860 --> 00:01:00,570 +đó thực hiện một vòng lặp for, chúng ta có thể thực hiện điều này đơn giản trong một dòng. Vì vậy, một lần nữa, nó sẽ + +15 +00:01:00,570 --> 00:01:05,570 +được gọi là miss_states và đây sẽ là một danh sách mới, nhưng lần này nó + +16 +00:01:06,330 --> 00:01:10,320 +sẽ được tạo bằng cách sử dụng khả năng hiểu danh sách của + +17 +00:01:10,830 --> 00:01:13,950 +chúng ta; mục mới cho mục trong danh sách nếu + +18 +00:01:14,790 --> 00:01:15,900 +thử nghiệm. + +19 +00:01:16,620 --> 00:01:20,850 +Danh sách trong trường hợp này mà chúng tôi đang lặp lại là tất cả các trạng thái của chúng tôi. + +20 +00:01:21,210 --> 00:01:23,910 +Vì vậy, chúng tôi sẽ thay thế điều đó bằng tất cả các trạng thái. Bây giờ, mỗi mục + +21 +00:01:23,970 --> 00:01:27,390 +về cơ bản là một trạng thái trong danh sách đó. + +22 +00:01:28,020 --> 00:01:33,020 +Và bài kiểm tra mà chúng ta sẽ thực hiện là để xem liệu trạng thái có không nằm trong các trạng + +23 +00:01:35,250 --> 00:01:39,270 +thái được thêm vào mỗi lần người dùng đưa ra một dự đoán chính xác hay không, + +24 +00:01:39,270 --> 00:01:41,010 +vì vậy về cơ bản chúng ta + +25 +00:01:41,400 --> 00:01:45,330 +có thể lấy phần này của mã trước đó của mình và đặt nó ở đây. + +26 +00:01:45,870 --> 00:01:49,470 +Và trong trường hợp đó, chúng tôi sẽ thêm trạng thái + +27 +00:01:49,530 --> 00:01:53,760 +cụ thể vượt qua bài kiểm tra này vào danh sách mới này. + +28 +00:01:54,270 --> 00:01:55,380 +Một dòng này về + +29 +00:01:55,440 --> 00:02:00,440 +cơ bản sẽ thay thế tất cả bốn dòng này và nó cắt giảm đáng kể số + +30 +00:02:01,320 --> 00:02:02,340 +lượng mã. + +31 +00:02:02,820 --> 00:02:07,620 +Và nó cũng đọc tương đối tốt. Thêm một trạng thái vào danh sách mới này nếu + +32 +00:02:08,009 --> 00:02:11,130 +chúng ta lặp qua tất cả các trạng thái trong danh sách các trạng + +33 +00:02:11,430 --> 00:02:14,520 +thái và nếu trạng thái đó không có trong danh sách các trạng + +34 +00:02:14,520 --> 00:02:16,860 +thái được đoán này. Khả năng hiểu danh + +35 +00:02:16,860 --> 00:02:21,860 +sách rất phổ biến với các nhà phát triển Python và tôi hy vọng thông qua một số bài + +36 +00:02:22,500 --> 00:02:23,580 +tập này, bạn + +37 +00:02:23,580 --> 00:02:28,580 +có thể thấy lý do tại sao, chỉ xét về lượng mã tuyệt đối mà nó cắt giảm và + +38 +00:02:28,980 --> 00:02:32,520 +mức độ đơn giản hóa mọi thứ. Giờ đây, ngoài việc + +39 +00:02:32,580 --> 00:02:34,500 +hiểu danh sách, chúng ta cũng + +40 +00:02:34,800 --> 00:02:39,660 +có thể đọc hiểu bằng từ điển. Vì vậy, trong bài học tiếp theo, đó là những gì + +41 +00:02:39,780 --> 00:02:40,980 +chúng ta sẽ xem xét. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/007 How to use Dictionary Comprehension.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/007 How to use Dictionary Comprehension.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..36c70ba680ccf5d05b224ebc5afc33e79079ea02 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/007 How to use Dictionary Comprehension.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e029d8fa41fc078f886c30c391226116da73560b59c37c4eb49702b5114d169 +size 45361410 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/007 How to use Dictionary Comprehension_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/007 How to use Dictionary Comprehension_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..16e700ab3bd621a7afb2e59535abc04ccfefc45f --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/007 How to use Dictionary Comprehension_vi.srt @@ -0,0 +1,560 @@ +1 +00:00:00,450 --> 00:00:03,270 +Bây giờ bạn đã thấy cách hoạt động của khả năng + +2 +00:00:03,570 --> 00:00:07,290 +hiểu danh sách, đã đến lúc tìm hiểu về một kiểu đọc hiểu khác, + +3 +00:00:07,290 --> 00:00:08,250 +hiểu từ điển. + +4 +00:00:08,820 --> 00:00:13,820 +Điều này cũng rất hữu ích vì nó cho phép chúng ta tạo một từ điển mới từ các giá + +5 +00:00:14,940 --> 00:00:18,990 +trị trong danh sách hoặc trong từ điển. Ví dụ: chúng tôi có thể viết + +6 +00:00:19,050 --> 00:00:21,120 +ra các từ khóa của mình như thế này. + +7 +00:00:21,540 --> 00:00:24,180 +Chúng ta sẽ tạo một từ điển mới có + +8 +00:00:24,600 --> 00:00:29,250 +tên là new_dict và nó sẽ được tạo bằng cách sử dụng dấu ngoặc nhọn này ngay + +9 +00:00:29,250 --> 00:00:33,420 +bây giờ thay vì dấu ngoặc vuông. Và bên trong phần hiểu, chúng ta + +10 +00:00:33,750 --> 00:00:38,190 +phải đặt new_key, new_value, và chúng ta lặp lại các mục trong một danh sách. + +11 +00:00:38,430 --> 00:00:42,480 +Vì vậy, bất kỳ loại nào có thể lặp lại; một danh sách, một dải ô, một chuỗi, bất cứ thứ gì bạn muốn. + +12 +00:00:42,810 --> 00:00:45,810 +Và đây là hình thức hiểu từ điển đơn giản nhất. + +13 +00:00:46,380 --> 00:00:51,380 +Bây giờ hãy nhớ rằng đọc hiểu từ điển chỉ là một cách tạo từ điển + +14 +00:00:51,690 --> 00:00:54,540 +bằng cách sử dụng cú pháp rút gọn này. + +15 +00:00:55,020 --> 00:00:57,150 +Chúng ta có thể tiến thêm một bước nữa. + +16 +00:00:57,570 --> 00:01:02,570 +Chúng tôi cũng có thể tạo một từ điển mới dựa trên các giá trị trong một từ điển + +17 +00:01:03,600 --> 00:01:04,433 +hiện có. + +18 +00:01:04,709 --> 00:01:09,710 +Vì vậy, chúng tôi có thể lấy từ điển đó và sau đó nắm giữ tất cả các mục + +19 +00:01:10,080 --> 00:01:14,760 +bên trong từ điển đó, sau đó chia nó thành một khóa và một giá trị. + +20 +00:01:15,210 --> 00:01:19,680 +Vì vậy, bây giờ, chúng tôi đang lặp lại từng khóa và từng giá trị trong tất + +21 +00:01:19,680 --> 00:01:21,300 +cả các mục từ từ điển + +22 +00:01:21,840 --> 00:01:26,840 +và chúng tôi có thể sử dụng các biến khóa và giá trị này để tạo khóa_mới hoặc giá_trị_mới. + +23 +00:01:29,280 --> 00:01:33,300 +Và để tiến thêm một bước nữa vì lợi ích hoàn thành, tất nhiên, chúng ta + +24 +00:01:33,480 --> 00:01:36,570 +có thể luôn thêm điều kiện của mình vào cuối, giống như chúng + +25 +00:01:36,690 --> 00:01:39,450 +ta đã làm trước đây với phần hiểu danh sách. + +26 +00:01:40,050 --> 00:01:42,450 +Vì vậy, chúng ta hãy xem cách mã này hoạt động trong thực tế. + +27 +00:01:42,780 --> 00:01:44,790 +Tôi sẽ lấy danh sách tên trước đó + +28 +00:01:44,940 --> 00:01:49,920 +của mình và sau đó tôi sẽ nhấp vào nút này để làm mới bảng điều khiển của mình để tất + +29 +00:01:49,920 --> 00:01:51,720 +cả các biến trước đó bị xóa. + +30 +00:01:52,410 --> 00:01:56,400 +Vì vậy, bây giờ tôi sẽ tạo một danh sách tên mới. + +31 +00:01:57,120 --> 00:02:00,660 +Vì vậy, tôi sẽ sử dụng những cái tên trước đây mà tôi đã có trước đây, và đây là danh sách của chúng tôi ở đây. + +32 +00:02:01,260 --> 00:02:05,400 +Bây giờ, điều tiếp theo tôi sẽ làm là tôi sẽ tạo một từ điển, + +33 +00:02:05,400 --> 00:02:09,509 +nơi tôi tạo ra một số điểm ngẫu nhiên cho mỗi cái tên này. + +34 +00:02:09,780 --> 00:02:14,780 +Vì vậy, hãy tưởng tượng chúng ta có một nhóm sinh viên và chúng tôi muốn tạo một + +35 +00:02:15,060 --> 00:02:19,170 +số điểm ngẫu nhiên cho mỗi người trong số họ để họ nhận được điểm + +36 +00:02:19,170 --> 00:02:22,740 +ngẫu nhiên từ 1 đến 100. Bây giờ đối với các giáo viên ngoài kia, tôi + +37 +00:02:22,740 --> 00:02:26,310 +thực sự hy vọng đây không phải là những gì bạn làm khi bạn tạo ra điểm số của học sinh. + +38 +00:02:26,850 --> 00:02:30,450 +Nhưng về cơ bản, chúng tôi muốn tạo một từ + +39 +00:02:30,450 --> 00:02:35,430 +điển trông giống như thế này. Mỗi sinh viên trong danh sách này, + +40 +00:02:35,550 --> 00:02:40,140 +hãy bắt đầu với Alex. Chúng tôi muốn từ điển của mình có một + +41 +00:02:40,170 --> 00:02:43,080 +khóa, là tên của học sinh, sau đó là một giá + +42 +00:02:43,110 --> 00:02:45,240 +trị, là điểm ngẫu nhiên của họ. + +43 +00:02:45,750 --> 00:02:50,640 +Và chúng tôi muốn tiếp tục thông qua danh sách những cái tên đó cho đến khi chúng tôi tạo ra một số điểm + +44 +00:02:50,640 --> 00:02:53,970 +ngẫu nhiên cho mỗi cái tên đó. Đó là mục tiêu. + +45 +00:02:54,090 --> 00:02:57,300 +Và bây giờ chúng ta phải sử dụng khả năng hiểu từ điển của mình. + +46 +00:02:57,930 --> 00:03:01,540 +Hãy nhớ rằng, khi chúng tôi tạo một danh sách mới bằng cách sử dụng tính năng hiểu danh sách, chúng + +47 +00:03:01,570 --> 00:03:04,390 +tôi đang sử dụng dấu ngoặc vuông. Nhưng bây giờ chúng tôi đang tạo một + +48 +00:03:04,390 --> 00:03:08,080 +từ điển nên chúng tôi sẽ sử dụng dấu ngoặc nhọn. Bây giờ, bên trong các dấu ngoặc nhọn + +49 +00:03:08,110 --> 00:03:10,750 +này, tôi sẽ đặt danh sách từ khóa thông thường của mình xuống. + +50 +00:03:10,840 --> 00:03:13,900 +Vì vậy, nó sẽ là một new_key: new_value + +51 +00:03:13,960 --> 00:03:17,620 +mà chúng tôi sẽ thêm vào từ điển mới của mình. + +52 +00:03:18,160 --> 00:03:19,480 +Và sau đó tôi + +53 +00:03:19,480 --> 00:03:23,770 +sẽ làm cho một mục trong danh sách. Trong trường hợp này, danh sách của chúng + +54 +00:03:23,800 --> 00:03:28,090 +tôi hoặc có thể lặp lại của chúng tôi sẽ là tất cả danh sách tên. + +55 +00:03:28,810 --> 00:03:31,630 +Bây giờ, mặc dù trong các từ khóa của tôi, tôi luôn sử dụng danh sách, + +56 +00:03:31,870 --> 00:03:34,450 +nó chỉ dễ hình dung hơn. Nhưng trên thực tế, nó thực sự + +57 +00:03:34,450 --> 00:03:38,320 +là bất kỳ loại nào có thể lặp lại như một dải ô hoặc một chuỗi hoặc một bộ giá trị. + +58 +00:03:38,890 --> 00:03:40,990 +Khi chúng ta đã có danh sách tên của mình, chúng + +59 +00:03:41,020 --> 00:03:43,450 +ta sẽ đặt tên cho mỗi cái tên đó một cái gì đó, + +60 +00:03:43,510 --> 00:03:45,220 +và tôi sẽ gọi nó là học sinh. + +61 +00:03:45,700 --> 00:03:49,900 +Vì vậy, chúng tôi đang lặp lại tất cả các sinh viên trong danh sách tên của chúng tôi ở đây. + +62 +00:03:50,470 --> 00:03:52,300 +Và đối với mỗi + +63 +00:03:52,330 --> 00:03:56,050 +học sinh đó, tôi sẽ tạo học sinh làm khóa + +64 +00:03:56,650 --> 00:04:00,610 +mới, nhưng giá trị sẽ là một số ngẫu nhiên mới. + +65 +00:04:01,030 --> 00:04:02,830 +Vì vậy, để tạo một + +66 +00:04:02,830 --> 00:04:06,370 +số ngẫu nhiên, trước tiên tôi sẽ phải nhập mô-đun ngẫu nhiên. + +67 +00:04:06,760 --> 00:04:10,150 +Vì vậy, tôi đã cắt mã trước đó của mình, nhập ngẫu nhiên và + +68 +00:04:10,270 --> 00:04:11,860 +hãy dán mã đó vào lại. + +69 +00:04:12,340 --> 00:04:17,339 +Vì vậy, bây giờ chúng ta có thể thay thế giá trị cho mỗi mục từ điển này bằng ngẫu nhiên. randint, và chúng tôi có thể tạo một số ngẫu nhiên từ 1 + +70 +00:04:18,070 --> 00:04:19,269 +đến 100. + +71 +00:04:19,390 --> 00:04:23,530 +Vì vậy, bây giờ khi tôi nhấn enter, bạn sẽ thấy từ điển + +72 +00:04:24,040 --> 00:04:28,240 +student_scores mới của chúng tôi đang được tạo và bạn có thể thấy + +73 +00:04:28,240 --> 00:04:29,620 +chúng tôi có tất + +74 +00:04:29,950 --> 00:04:34,360 +cả các sinh viên trong danh sách tên của chúng tôi, Alex, Beth, Caroline, v.v. + +75 +00:04:34,360 --> 00:04:35,710 +Và mỗi người trong số họ bây giờ có một số điểm ngẫu nhiên mới. + +76 +00:04:35,980 --> 00:04:40,060 +Vì vậy, có vẻ như mọi người đã làm + +77 +00:04:40,810 --> 00:04:44,710 +khá tốt ngoài Eleanor, tôi đoán vậy. Tạo điểm số ngẫu nhiên dường như hoạt động. Bây giờ, bước tiếp theo, chúng ta sẽ tiến hành điều này xa hơn + +78 +00:04:44,860 --> 00:04:49,450 +một chút vì điều này khá + +79 +00:04:49,480 --> 00:04:50,320 +đơn giản. + +80 +00:04:50,350 --> 00:04:53,260 +Chúng tôi chỉ làm những gì chúng tôi đã làm trước đây, đó là lặp lại qua một danh sách. + +81 +00:04:53,260 --> 00:04:57,190 +Nhưng bây giờ tôi muốn lặp lại một từ điển. May mắn thay, bây giờ chúng tôi đã tạo ra thương hiệu này, từ điển + +82 +00:04:57,550 --> 00:05:01,810 +lấp lánh, mới, các trang_số_sinh_viên của chúng + +83 +00:05:01,810 --> 00:05:06,580 +tôi và tôi muốn sử dụng từ điển đó trong lần đọc hiểu từ điển tiếp theo của mình. + +84 +00:05:07,030 --> 00:05:11,050 +Vì vậy, điều tiếp theo tôi muốn làm là có + +85 +00:05:11,620 --> 00:05:15,640 +thể tạo một từ điển có tên là pass_students. Và đây sẽ là một cuốn từ điển tra cứu từ điển của student_scores, vì vậy + +86 +00:05:15,700 --> 00:05:19,750 +hãy tưởng tượng bạn có cả một + +87 +00:05:19,780 --> 00:05:22,900 +trường trung học nơi điểm số của mọi người được ghi lại + +88 +00:05:22,900 --> 00:05:26,320 +và bạn nhìn vào tất cả những ai đạt điểm từ 60 trở lên. + +89 +00:05:26,710 --> 00:05:30,820 +Và sau đó chúng ta sẽ nói, tốt, những người đó đã vượt qua và những người khác đã thất + +90 +00:05:31,210 --> 00:05:32,080 +bại trong năm đó. + +91 +00:05:32,080 --> 00:05:35,920 +Về cơ bản, chúng ta nên lặp lại toàn bộ + +92 +00:05:36,640 --> 00:05:41,350 +từ điển các mục này, tìm ra mục nào trong số này có + +93 +00:05:41,620 --> 00:05:46,030 +giá trị bằng 60 hoặc hơn 60, và sau đó chúng tôi + +94 +00:05:46,540 --> 00:05:51,070 +sẽ thêm lại các mục đó vào từ điển đã qua_tiền mới này. + +95 +00:05:51,130 --> 00:05:52,450 +Vì vậy, về cơ + +96 +00:05:53,620 --> 00:05:58,550 +bản, chúng ta có thể kết thúc với, ừm, Beth, với Caroline, với Dave và với Freddy. + +97 +00:05:58,580 --> 00:06:02,000 +Vì vậy, nó sẽ vẫn trông khá giống với từ điển student_scores của chúng tôi. + +98 +00:06:02,510 --> 00:06:07,510 +Vì vậy, nó sẽ có một cái gì đó giống như Beth và + +99 +00:06:08,120 --> 00:06:11,870 +sau đó chấm điểm của cô ấy, là 72. Nhưng chỉ cần cô ấy được đưa vào từ điển này, điều đó + +100 +00:06:11,900 --> 00:06:16,550 +có nghĩa là cô ấy đã vượt qua. + +101 +00:06:16,580 --> 00:06:17,900 +Và chúng ta sẽ + +102 +00:06:18,650 --> 00:06:23,650 +kết thúc với từ điển mới này, nơi mọi người đều là học sinh đã qua và đạt điểm. + +103 +00:06:24,260 --> 00:06:25,580 +Hãy suy nghĩ về cách bạn có thể làm điều này. Và nếu bạn đã sẵn sàng cho thử thách, + +104 +00:06:27,140 --> 00:06:31,700 +hãy thử tạm dừng video và xem liệu bạn có thể hoàn thành việc này hay không. + +105 +00:06:31,760 --> 00:06:35,120 +Như mọi khi, chúng tôi biết rằng chúng tôi sẽ tạo một từ + +106 +00:06:37,250 --> 00:06:41,900 +điển mới, vì vậy các dấu ngoặc nhọn, và sau đó nó sẽ là new_key: new_value của chúng tôi. + +107 +00:06:42,260 --> 00:06:46,100 +Và sau đó nó sẽ là cho, và bây giờ, bởi vì chúng tôi đang + +108 +00:06:46,670 --> 00:06:50,180 +lặp lại từ điển này và chúng tôi muốn nắm giữ từng giá + +109 +00:06:50,210 --> 00:06:55,210 +trị, chúng tôi sẽ sử dụng phương pháp mà chúng tôi đã thấy trong các trang trình bày trước + +110 +00:06:55,490 --> 00:06:56,323 +của chúng tôi. + +111 +00:06:56,660 --> 00:07:00,980 +Vì vậy, chúng tôi sẽ nắm bắt từng + +112 +00:07:01,160 --> 00:07:06,160 +chìa khóa và giá trị từ từ điển của chúng tôi. Và sau từ khóa in, đó là thứ mà chúng tôi thực sự muốn lặp lại, đó là + +113 +00:07:07,040 --> 00:07:09,890 +từ điển của chúng tôi. + +114 +00:07:09,920 --> 00:07:13,760 +Khi chúng ta đã có từ điển của mình, sau đó chúng ta cần gọi phương + +115 +00:07:15,260 --> 00:07:16,700 +thức items trên từ điển đó. + +116 +00:07:16,700 --> 00:07:20,210 +Vì vậy, đó là các mục có tập hợp các dấu ngoặc đơn, + +117 +00:07:20,210 --> 00:07:23,000 +không chỉ là các mục dưới dạng một thuộc tính. + +118 +00:07:23,060 --> 00:07:25,490 +Vì vậy, bây giờ chúng tôi đã gỡ bỏ các từ khóa của mình, + +119 +00:07:26,150 --> 00:07:28,340 +hãy chuyển đổi nó sang trường hợp cụ thể của chúng tôi. + +120 +00:07:28,340 --> 00:07:30,950 +Vì vậy, từ điển của chúng tôi + +121 +00:07:31,370 --> 00:07:35,210 +có tên là student_scores, hãy đảm bảo tôi viết đúng chính tả. + +122 +00:07:35,420 --> 00:07:37,070 +Vì vậy, học sinh_scores. các mục nhận được tất cả các mục trong từ điển đó. + +123 +00:07:37,400 --> 00:07:42,140 +Và sau đó đối với từng khóa sẽ là học + +124 +00:07:42,650 --> 00:07:44,360 +sinh và đối với từng giá + +125 +00:07:44,420 --> 00:07:47,750 +trị sẽ là điểm của chúng, chúng ta sẽ lặp lại từ điển này. + +126 +00:07:47,750 --> 00:07:52,610 +Khóa mới sẽ chỉ là tên của học sinh + +127 +00:07:53,180 --> 00:07:58,130 +và giá trị mới sẽ chỉ là điểm của họ. + +128 +00:07:58,130 --> 00:07:59,510 +Nhưng những gì chúng ta cần + +129 +00:08:00,050 --> 00:08:05,050 +làm là chúng ta cần kiểm tra bằng cách sử dụng câu lệnh if, nếu học sinh mà chúng ta đang lặp lại đã vượt qua. + +130 +00:08:05,750 --> 00:08:09,530 +Vì vậy, bài kiểm tra về cơ bản là nhìn + +131 +00:08:09,980 --> 00:08:14,980 +vào điểm số và xem liệu nó có lớn hơn hoặc bằng 60 hay không. Và nếu đúng như vậy, thì chúng ta sẽ lấy học sinh này làm chìa khóa mới, + +132 +00:08:15,920 --> 00:08:19,820 +điểm của họ làm giá trị + +133 +00:08:19,850 --> 00:08:22,910 +mới và đặt nó vào bên trong từ điển mới này. + +134 +00:08:23,150 --> 00:08:27,860 +Vì vậy, bây giờ nếu tôi tiếp tục và nhấn enter, thì bạn có + +135 +00:08:28,550 --> 00:08:31,280 +thể thấy chúng tôi đã tạo từ + +136 +00:08:31,640 --> 00:08:35,480 +điển mới, chỉ chứa tất cả những sinh viên đã vượt qua. Vì vậy, đó là Beth, Caroline, Dave và Freddy, và chúng + +137 +00:08:35,900 --> 00:08:40,130 +tôi đã mất Alex và Eleanor. + +138 +00:08:40,159 --> 00:08:43,700 +Vì vậy, để thực hành nhiều hơn về điều này, tôi đã chuẩn bị thêm một số bài tập + +139 +00:08:45,500 --> 00:08:47,480 +viết mã cho bạn về khả năng hiểu từ điển. + +140 +00:08:47,570 --> 00:08:52,250 +Vì vậy, hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 Exercise-31.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 Exercise-31.url new file mode 100644 index 0000000000000000000000000000000000000000..513c55867628ee39541b6b9602187d89431ee3d3 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 Exercise-31.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/ce265a22-8384-45dc-b7fa-f733d0370279 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 How-to-join-Auditorium.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 [Interactive Coding Exercise] Dictionary Comprehension 1.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 [Interactive Coding Exercise] Dictionary Comprehension 1.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6aa8857d7a23aa856c7d4b9063fe2c40c3089097 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 [Interactive Coding Exercise] Dictionary Comprehension 1.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10cedd0114b10cedacdabe112842d4826c01a887d022a3a304912e10c6325b76 +size 15254586 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 [Interactive Coding Exercise] Dictionary Comprehension 1_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 [Interactive Coding Exercise] Dictionary Comprehension 1_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7f4935f5168ee0ec89f838df4ee4ecab31ac0e19 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/008 [Interactive Coding Exercise] Dictionary Comprehension 1_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:00,630 --> 00:00:02,250 +Người hướng dẫn: Được rồi, trong + +2 +00:00:02,250 --> 00:00:05,550 +bài tập này, chúng ta sẽ thực hiện một số thao tác hiểu từ điển. + +3 +00:00:05,550 --> 00:00:09,030 +Những gì chúng tôi có là một câu đầu vào và khi câu đó + +4 +00:00:09,030 --> 00:00:13,680 +được chuyển vào tệp main của bạn. py, bạn sẽ chuyển + +5 +00:00:13,680 --> 00:00:18,533 +nó thành một danh sách các từ. + +6 +00:00:19,470 --> 00:00:24,470 +Và danh sách nên chứa từng từ trong câu. + +7 +00:00:24,870 --> 00:00:28,590 +Và bạn sẽ sử dụng danh sách đó để tạo một + +8 +00:00:28,590 --> 00:00:32,820 +từ điển nơi bạn đếm số chữ cái trong mỗi từ. + +9 +00:00:32,820 --> 00:00:35,370 +Nếu bạn nhìn vào khung mô tả, bạn + +10 +00:00:35,370 --> 00:00:38,400 +sẽ thấy đầu ra mẫu sẽ trông như thế nào đối + +11 +00:00:38,400 --> 00:00:40,620 +với câu đầu vào. Vận tốc tốc độ + +12 +00:00:40,620 --> 00:00:44,100 +bay của một con én không mang hàng là gì? + +13 +00:00:44,100 --> 00:00:46,650 +Và bạn sẽ nhận thấy rằng để đơn giản, + +14 +00:00:46,650 --> 00:00:50,880 +chúng tôi tính tất cả dấu câu như một phần của từ. + +15 +00:00:50,880 --> 00:00:54,480 +Vì vậy, dấu én và dấu chấm hỏi ở cuối từ + +16 +00:00:54,480 --> 00:00:57,240 +điển đầu ra ví dụ đó được tính + +17 +00:00:57,240 --> 00:01:00,030 +là tám chứ không phải bảy. + +18 +00:01:00,030 --> 00:01:01,530 +Đây là mục tiêu và bạn sẽ + +19 +00:01:01,530 --> 00:01:03,270 +cần sử dụng những gì đã học + +20 +00:01:03,270 --> 00:01:05,700 +về cách hiểu danh sách và từ điển. + +21 +00:01:05,700 --> 00:01:07,080 +Bạn có thể phải tra cứu khắp + +22 +00:01:07,080 --> 00:01:11,010 +nơi để tìm ra cách biến một câu thành một danh sách các từ và bạn có thể + +23 +00:01:11,010 --> 00:01:12,090 +cần kiểm tra một số gợi + +24 +00:01:12,090 --> 00:01:14,790 +ý để giúp bạn trong quá trình thực hiện. + +25 +00:01:14,790 --> 00:01:16,983 +Hãy thử thách này. + +26 +00:01:20,640 --> 00:01:24,330 +Tương tự như việc hiểu danh sách, chúng ta bắt đầu với vòng lặp for. + +27 +00:01:24,330 --> 00:01:27,990 +Vì vậy, hãy lưu ý rằng chúng ta đang tạo ra sự hiểu biết từ điển + +28 +00:01:27,990 --> 00:01:29,640 +và sự khác biệt duy nhất giữa + +29 +00:01:29,640 --> 00:01:32,130 +sự hiểu biết từ điển và danh sách là ký hiệu + +30 +00:01:32,130 --> 00:01:34,470 +đi xung quanh mã của chúng ta. + +31 +00:01:34,470 --> 00:01:36,210 +Đối với danh sách, đó là dấu ngoặc vuông, + +32 +00:01:36,210 --> 00:01:38,403 +đối với từ điển, đó là dấu ngoặc nhọn. + +33 +00:01:39,660 --> 00:01:42,810 +Điều đầu tiên chúng ta có là câu. tách và đây là một + +34 +00:01:42,810 --> 00:01:46,350 +phương thức Python có thể lấy một chuỗi + +35 +00:01:46,350 --> 00:01:47,910 +và phân tách nó. + +36 +00:01:47,910 --> 00:01:52,230 +Bên trong phương thức phân tách, chúng ta có thể thêm một dấu phân cách tùy chọn. + +37 +00:01:52,230 --> 00:01:56,370 +Vậy bạn muốn chia câu thành gì? + +38 +00:01:56,370 --> 00:01:59,040 +Và nếu bạn để trống nó, thì nó sẽ bị chia thành khoảng + +39 +00:01:59,040 --> 00:02:01,590 +trắng, đó là những gì chúng ta có ở đây. + +40 +00:02:01,590 --> 00:02:04,650 +Khoảng cách giữa mỗi từ sẽ được sử dụng + +41 +00:02:04,650 --> 00:02:09,650 +làm điểm đánh dấu để xác định từng mục trong danh sách. + +42 +00:02:10,080 --> 00:02:13,350 +Câu. về cơ bản, phân chia lấy câu + +43 +00:02:13,350 --> 00:02:17,460 +đầu vào của chúng ta rồi tạo một danh sách thêm từng mục được phân tách + +44 +00:02:17,460 --> 00:02:22,200 +bằng khoảng trắng dưới dạng một thành phần mới riêng lẻ trong danh sách. + +45 +00:02:22,200 --> 00:02:24,750 +Và bạn có thể chạy mã vào thời điểm này để xem + +46 +00:02:24,750 --> 00:02:27,090 +nó trông như thế nào nếu bạn không làm + +47 +00:02:27,090 --> 00:02:28,233 +được điều này. + +48 +00:02:29,070 --> 00:02:31,950 +Bây giờ, bước tiếp theo trong quá trình hiểu từ điển của + +49 +00:02:31,950 --> 00:02:33,480 +chúng ta là vòng lặp for. + +50 +00:02:33,480 --> 00:02:36,930 +Vì vậy, chúng tôi đang nói từng từ trong câu. tách, có nghĩa là hãy lặp + +51 +00:02:36,930 --> 00:02:39,930 +qua từng mục trong danh sách mà chúng ta vừa + +52 +00:02:39,930 --> 00:02:42,840 +tạo và chúng ta sẽ thực hiện điều gì đó với + +53 +00:02:42,840 --> 00:02:45,720 +từng mục trong danh sách mà giờ đây chúng + +54 +00:02:45,720 --> 00:02:49,650 +ta có thể truy cập thông qua tên biến này Word. + +55 +00:02:49,650 --> 00:02:52,770 +Cuối cùng, khi bắt đầu hiểu từ điển, chúng + +56 +00:02:52,770 --> 00:02:55,200 +ta xác định những gì sẽ có trong từ + +57 +00:02:55,200 --> 00:02:58,740 +điển của mình, cấu trúc của nó, nếu bạn muốn. + +58 +00:02:58,740 --> 00:03:01,050 +Nó sẽ có một cặp khóa và giá trị. + +59 +00:03:01,050 --> 00:03:04,110 +Chìa khóa sẽ là từ thực tế. + +60 +00:03:04,110 --> 00:03:06,300 +Và lưu ý rằng điều này xuất phát từ vòng lặp for của chúng tôi. + +61 +00:03:06,300 --> 00:03:11,130 +Vì vậy, điều này tương đương với từng mục trong danh sách của chúng tôi. + +62 +00:03:11,130 --> 00:03:12,960 +Về cơ bản, mỗi từ trong + +63 +00:03:12,960 --> 00:03:16,230 +câu sẽ là một khóa và sau đó giá trị sẽ xuất + +64 +00:03:16,230 --> 00:03:19,140 +hiện sau ký hiệu dấu hai chấm. + +65 +00:03:19,140 --> 00:03:24,090 +Và đây là sử dụng phương thức len để tính độ dài của + +66 +00:03:24,090 --> 00:03:24,923 +từ đó. + +67 +00:03:24,923 --> 00:03:27,870 +Vậy từ đó có bao nhiêu ký tự và toàn + +68 +00:03:27,870 --> 00:03:32,520 +bộ dòng mã này đạt được mục tiêu mà chúng ta đã có khi + +69 +00:03:32,520 --> 00:03:35,040 +bắt đầu bài tập, đó là tạo một + +70 +00:03:35,040 --> 00:03:39,300 +từ điển bằng cách lấy một câu đầu vào và cho chúng + +71 +00:03:39,300 --> 00:03:43,860 +ta thấy mỗi từ có bao nhiêu ký tự. + +72 +00:03:43,860 --> 00:03:45,870 +Và mỗi từ được phân tách thành + +73 +00:03:45,870 --> 00:03:50,130 +một cặp khóa-giá trị riêng biệt trong từ điển của chúng tôi. + +74 +00:03:50,130 --> 00:03:52,500 +Hy vọng bạn đã làm được việc này. + +75 +00:03:52,500 --> 00:03:55,530 +Nếu không, hãy quay lại ngay bây giờ và sửa mã của bạn. + +76 +00:03:55,530 --> 00:03:58,710 +Đừng lo lắng nếu bạn không đạt được nó + +77 +00:03:58,710 --> 00:04:02,250 +hoặc bạn thấy giải pháp và nó có vẻ khác. + +78 +00:04:02,250 --> 00:04:04,410 +Nếu mã của bạn vượt qua được bài kiểm tra + +79 +00:04:04,410 --> 00:04:06,240 +thì nó đã đạt được mục tiêu ngay + +80 +00:04:06,240 --> 00:04:08,040 +cả khi nó trông có vẻ khác. + +81 +00:04:08,040 --> 00:04:09,600 +Nhưng nếu mã của bạn không hoạt động + +82 +00:04:09,600 --> 00:04:11,070 +thì đây chính là điểm cần học hỏi. + +83 +00:04:11,070 --> 00:04:13,320 +Đây là lúc để sửa chữa nó và đưa + +84 +00:04:13,320 --> 00:04:16,470 +kỹ năng này vào đai dụng cụ của bạn. + +85 +00:04:16,470 --> 00:04:17,822 +Vì vậy, đừng lo lắng về nó. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 Exercise-32.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 Exercise-32.url new file mode 100644 index 0000000000000000000000000000000000000000..50912b74f152b0f899a34bd58c162b8b443f1425 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 Exercise-32.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/91d77ad3-10f1-4297-bad5-36a8e5ad45c9 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 How-to-join-Auditorium.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 [Interactive Coding Exercise] Dictionary Comprehension 2.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 [Interactive Coding Exercise] Dictionary Comprehension 2.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3fa48c56dec37f7ffa082ae2d3c5feb52cb2ce69 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 [Interactive Coding Exercise] Dictionary Comprehension 2.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72746e6bb569186b76c9fb56bee8d83be4fdbabe2f84387607253e03ef7a91b4 +size 16570836 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 [Interactive Coding Exercise] Dictionary Comprehension 2_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 [Interactive Coding Exercise] Dictionary Comprehension 2_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..da80677b4beafae9945d4910cb6b1a99c08ea152 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/009 [Interactive Coding Exercise] Dictionary Comprehension 2_vi.srt @@ -0,0 +1,432 @@ +1 +00:00:00,480 --> 00:00:01,680 +Người hướng dẫn: + +2 +00:00:01,680 --> 00:00:05,040 +Mỗi lần đi Mỹ, tôi luôn rất bối rối không biết nên + +3 +00:00:05,040 --> 00:00:08,610 +mặc gì, vì tôi không bao giờ biết nhiệt độ thực sự là + +4 +00:00:08,610 --> 00:00:09,854 +bao nhiêu vì tôi nghĩ + +5 +00:00:09,854 --> 00:00:12,270 +bằng độ C và thực sự rất khó để làm quen + +6 +00:00:12,270 --> 00:00:15,060 +với việc nghĩ bằng độ F, như thế nào là lạnh, + +7 +00:00:15,060 --> 00:00:17,070 +cái gì ấm. + +8 +00:00:17,070 --> 00:00:18,060 +Vì vậy, trong bài tập này, + +9 +00:00:18,060 --> 00:00:21,330 +chúng ta sẽ xây dựng một chương trình Python để làm điều đó cho mình. + +10 +00:00:21,330 --> 00:00:22,950 +Chúng ta sẽ lấy dữ liệu + +11 +00:00:22,950 --> 00:00:26,040 +đầu vào đã có sẵn ở định dạng từ điển + +12 +00:00:26,040 --> 00:00:30,060 +và mỗi ngày có nhiệt độ liên quan đến nó, một con + +13 +00:00:30,060 --> 00:00:32,549 +số tính bằng độ C và chúng ta sẽ + +14 +00:00:32,549 --> 00:00:35,220 +xuất ra, tương tự, một từ điển + +15 +00:00:35,220 --> 00:00:38,550 +có các phím giống hệt nhau. + +16 +00:00:38,550 --> 00:00:41,310 +Thứ Hai, Thứ Ba, cho đến Chủ Nhật, tuy + +17 +00:00:41,310 --> 00:00:46,290 +nhiên, chúng ta sẽ chuyển đổi các giá trị thành Fahrenheit. + +18 +00:00:46,290 --> 00:00:48,810 +Trong ngăn mô tả, bạn sẽ thấy công + +19 +00:00:48,810 --> 00:00:52,410 +thức được sử dụng để chuyển đổi độ C sang độ + +20 +00:00:52,410 --> 00:00:55,980 +F và những gì bạn sẽ làm là viết một số mã để thực + +21 +00:00:55,980 --> 00:00:58,200 +hiện một số thao tác hiểu từ + +22 +00:00:58,200 --> 00:01:02,340 +điển, lấy từ điển và tạo một từ điển. + +23 +00:01:02,340 --> 00:01:05,160 +Nếu bạn xem đầu vào của ví dụ và đầu + +24 +00:01:05,160 --> 00:01:08,760 +ra của ví dụ trông như thế nào, thì bạn sẽ + +25 +00:01:08,760 --> 00:01:12,000 +hiểu mục tiêu của chúng ta là gì. + +26 +00:01:12,000 --> 00:01:14,820 +Và nếu bạn nhìn vào dòng một, bạn sẽ thấy + +27 +00:01:14,820 --> 00:01:17,820 +rằng chúng ta có mã này gọi là eval, tất cả những + +28 +00:01:17,820 --> 00:01:20,610 +gì nó làm là lấy đầu vào dưới dạng một chuỗi + +29 +00:01:20,610 --> 00:01:23,490 +và chuyển nó thành một từ điển. + +30 +00:01:23,490 --> 00:01:26,040 +Bạn có thể thử chạy mã và in ra Weather_c + +31 +00:01:26,040 --> 00:01:29,730 +để xem biến đó trông như thế nào hiện tại. + +32 +00:01:29,730 --> 00:01:32,580 +Nhưng mục tiêu của bạn là viết mã + +33 +00:01:32,580 --> 00:01:34,830 +lấy đầu vào ví dụ, từ điển + +34 +00:01:34,830 --> 00:01:37,470 +có giá trị độ C, được chuyển đổi + +35 +00:01:37,470 --> 00:01:39,990 +thành đầu ra ví dụ, từ điển có + +36 +00:01:39,990 --> 00:01:42,720 +giá trị Fahrenheit. + +37 +00:01:42,720 --> 00:01:43,893 +Vì vậy, hãy đi ngay bây giờ. + +38 +00:01:50,316 --> 00:01:53,550 +Điều đầu tiên chúng ta làm trong quá trình + +39 +00:01:53,550 --> 00:01:56,850 +hiểu từ điển là tạo biến mới, Weather_f, + +40 +00:01:56,850 --> 00:01:59,793 +sau đó đặt nó bằng một từ điển mới. + +41 +00:02:01,020 --> 00:02:03,780 +Những gì chúng ta sẽ duyệt qua + +42 +00:02:03,780 --> 00:02:08,780 +là danh sách các mục thời tiết tính bằng độ C. + +43 +00:02:10,620 --> 00:02:15,540 +Bây giờ chúng tôi đang sử dụng . items đến từ Python, phương + +44 +00:02:15,540 --> 00:02:20,540 +thức này lấy từ điển của chúng ta và đưa ra một danh sách trong + +45 +00:02:20,940 --> 00:02:25,940 +đó mỗi cặp khóa và giá trị là một mục trong danh sách. + +46 +00:02:26,940 --> 00:02:31,440 +Và nếu bạn in ra Weather_c. items như hiện tại, bạn sẽ thấy + +47 +00:02:31,440 --> 00:02:34,530 +rằng mỗi cặp giá trị khóa được chuyển + +48 +00:02:34,530 --> 00:02:37,931 +đổi thành cái được gọi là bộ dữ liệu. + +49 +00:02:37,931 --> 00:02:39,510 +Bộ dữ liệu là thứ được chứa + +50 +00:02:39,510 --> 00:02:42,330 +trong một tập hợp dấu ngoặc đơn trong đó các + +51 +00:02:42,330 --> 00:02:44,370 +giá trị trong bộ dữ liệu được liên + +52 +00:02:44,370 --> 00:02:46,200 +kết với nhau nhưng chúng có thể + +53 +00:02:46,200 --> 00:02:48,600 +có các kiểu dữ liệu khác nhau. + +54 +00:02:48,600 --> 00:02:49,433 +Vì vậy, trong + +55 +00:02:49,433 --> 00:02:52,170 +trường hợp của chúng ta, chúng ta có một + +56 +00:02:52,170 --> 00:02:55,020 +chuỗi và một số được tách ra để mỗi mục được + +57 +00:02:55,020 --> 00:02:56,643 +thêm vào danh sách. + +58 +00:02:58,440 --> 00:03:03,180 +Phần tiếp theo là lặp qua từng bộ dữ liệu đó. + +59 +00:03:03,180 --> 00:03:04,680 +Chúng tôi đang sử dụng vòng + +60 +00:03:04,680 --> 00:03:07,440 +lặp for, làm tiêu chuẩn trong việc hiểu từ điển + +61 +00:03:07,440 --> 00:03:10,350 +của mình và chúng tôi đang xác định những gì chúng + +62 +00:03:10,350 --> 00:03:12,690 +tôi đang lặp qua và đặt tên cho từng phần + +63 +00:03:12,690 --> 00:03:15,210 +đó của bộ dữ liệu để làm việc. + +64 +00:03:15,210 --> 00:03:17,070 +Chúng ta đang viết cho dấu + +65 +00:03:17,070 --> 00:03:18,870 +ngoặc đơn, là cấu trúc của + +66 +00:03:18,870 --> 00:03:20,910 +một bộ dữ liệu, phần đầu tiên + +67 +00:03:20,910 --> 00:03:24,480 +là ngày, là chuỗi đại diện cho một ngày trong tuần, + +68 +00:03:24,480 --> 00:03:26,580 +dấu phẩy và sau đó là nhiệt độ, + +69 +00:03:26,580 --> 00:03:28,860 +sẽ đại diện cho con số mà chúng ta + +70 +00:03:28,860 --> 00:03:31,410 +đang có sẽ làm việc với sau này. + +71 +00:03:31,410 --> 00:03:33,120 +Vì vậy, bây giờ chúng ta có + +72 +00:03:33,120 --> 00:03:35,280 +một vòng lặp for lặp qua từng mục + +73 +00:03:35,280 --> 00:03:37,830 +trong từ điển của chúng ta dưới dạng danh + +74 +00:03:37,830 --> 00:03:41,370 +sách và chúng ta có cách truy cập chuỗi ngày trong tuần + +75 +00:03:41,370 --> 00:03:43,653 +và giá trị nhiệt độ. + +76 +00:03:44,490 --> 00:03:45,990 +Bây giờ, tất cả những gì + +77 +00:03:45,990 --> 00:03:48,450 +còn lại cần làm là cấu trúc từng giá trị + +78 +00:03:48,450 --> 00:03:51,450 +trong từ điển mới mà chúng ta muốn xuất ra. + +79 +00:03:51,450 --> 00:03:53,730 +Cấu trúc giá trị chính rất đơn giản. + +80 +00:03:53,730 --> 00:03:55,890 +Chìa khóa sẽ là ngày trong tuần, hoàn + +81 +00:03:55,890 --> 00:03:57,630 +toàn không bị thay đổi, sau + +82 +00:03:57,630 --> 00:04:01,170 +đó chúng ta thêm dấu hai chấm rồi nhập giá trị vào. + +83 +00:04:01,170 --> 00:04:04,620 +Bây giờ giá trị là nơi chúng tôi thực hiện chuyển đổi. + +84 +00:04:04,620 --> 00:04:06,750 +Vì vậy, chúng tôi lấy biến tạm + +85 +00:04:06,750 --> 00:04:11,040 +thời, biểu thị nhiệt độ tính bằng độ C từ Weather_c, và + +86 +00:04:11,040 --> 00:04:15,030 +chúng tôi áp dụng công thức chuyển đổi nó thành độ F, + +87 +00:04:15,030 --> 00:04:17,970 +tức là nhân nó với 9, chia cho 5, rồi cộng + +88 +00:04:17,970 --> 00:04:24,060 +32, và điều đó sẽ chuyển đổi độ C của chúng tôi độ sang độ Fahrenheit. + +89 +00:04:24,060 --> 00:04:26,580 +Và nó được gán cho giá trị + +90 +00:04:26,580 --> 00:04:29,760 +của từng mục mới trong từ điển. + +91 +00:04:29,760 --> 00:04:34,140 +Riêng dòng mã này ở dòng thứ năm đã cực kỳ ngắn gọn. + +92 +00:04:34,140 --> 00:04:36,180 +Nó cực kỳ ngắn gọn. + +93 +00:04:36,180 --> 00:04:38,010 +Cho tốt hơn hoặc tồi tệ hơn. + +94 +00:04:38,010 --> 00:04:39,690 +Nó có thể khó hiểu, nhưng + +95 +00:04:39,690 --> 00:04:41,310 +một khi bạn hiểu rõ về + +96 +00:04:41,310 --> 00:04:44,490 +nó và tìm ra cách đọc nó, chẳng hạn như sử + +97 +00:04:44,490 --> 00:04:46,560 +dụng phương pháp từ khóa hoặc + +98 +00:04:46,560 --> 00:04:50,130 +bất kỳ phương pháp nào mà bạn cảm thấy thoải mái, + +99 +00:04:50,130 --> 00:04:53,485 +thì việc giải mã và hiểu và nó có thể thực sự + +100 +00:04:53,485 --> 00:04:55,440 +rất mạnh mẽ chỉ trong một + +101 +00:04:55,440 --> 00:04:57,450 +dòng mã. + +102 +00:04:57,450 --> 00:04:59,340 +Hy vọng rằng bạn đã đạt được điều này. + +103 +00:04:59,340 --> 00:05:01,470 +Nếu không, hãy quay lại mã của bạn, sửa + +104 +00:05:01,470 --> 00:05:03,600 +nó và đảm bảo bạn hiểu điều gì đang xảy + +105 +00:05:03,600 --> 00:05:04,950 +ra trước khi tiếp tục. + +106 +00:05:04,950 --> 00:05:07,020 +Không có gì xấu hổ khi sửa mã của + +107 +00:05:07,020 --> 00:05:08,850 +bạn sau khi xem giải pháp. + +108 +00:05:08,850 --> 00:05:11,373 +Đây là một phần của quá trình học tập. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 Day-26-End-Code.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 Day-26-End-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..31cd025001bd73a11fb23ecfdb34438e884505f7 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 Day-26-End-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-26-end \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 How to Iterate over a Pandas DataFrame.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 How to Iterate over a Pandas DataFrame.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8b2f9e4ec9686711cc283abaec24469a1b4a3e48 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 How to Iterate over a Pandas DataFrame.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b49fc70e7bd00967492c92ce24a84fcc831f8db30089127387552f1ada3741d0 +size 20167129 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 How to Iterate over a Pandas DataFrame_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 How to Iterate over a Pandas DataFrame_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ac05fffa2924d06fb6385bc2f20220b6da1ab7fb --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/010 How to Iterate over a Pandas DataFrame_vi.srt @@ -0,0 +1,276 @@ +1 +00:00:00,960 --> 00:00:01,740 +Trong bài học + +2 +00:00:01,740 --> 00:00:06,120 +này, tôi muốn chỉ cho bạn cách bạn có thể sử dụng vòng lặp với khung dữ liệu gấu + +3 +00:00:06,120 --> 00:00:11,010 +trúc và cách lặp qua khung dữ liệu gấu trúc. Vì vậy, ở đây, tôi có một + +4 +00:00:11,280 --> 00:00:15,720 +từ điển đơn giản, tôi có hai chìa khóa, học sinh và điểm, và học sinh + +5 +00:00:15,750 --> 00:00:18,870 +dưới, tôi có danh sách tên học sinh, và dưới điểm, + +6 +00:00:18,870 --> 00:00:21,480 +tôi có danh sách điểm tương ứng của họ. + +7 +00:00:21,990 --> 00:00:26,990 +Bây giờ chúng ta biết rằng chúng ta có thể lặp lại một từ điển rất đơn giản bằng cách + +8 +00:00:28,500 --> 00:00:30,540 +tạo một vòng lặp for và sau đó + +9 +00:00:30,600 --> 00:00:35,600 +chúng ta nói, tốt, chúng ta sẽ xem qua từng khóa và giá trị bên trong từ điển dành cho + +10 +00:00:36,120 --> 00:00:36,953 +sinh viên này. + +11 +00:00:37,230 --> 00:00:41,190 +Và sau đó chúng tôi sẽ lấy tất cả các mục để + +12 +00:00:41,190 --> 00:00:45,360 +có thể lặp lại nó. Vì vậy, bây giờ khi tôi in từng + +13 +00:00:45,690 --> 00:00:49,770 +phím, bạn có thể thấy rằng nó đi qua từ điển và in cả hai phím. + +14 +00:00:50,910 --> 00:00:54,240 +Và tương tự, tôi có thể làm cho nó lặp qua cả hai giá trị. + +15 +00:00:54,660 --> 00:00:57,540 +Vì vậy, đây là cách chúng tôi lặp lại các từ điển + +16 +00:00:57,870 --> 00:01:01,020 +và chúng tôi đã sử dụng nó trong việc hiểu từ điển của mình. + +17 +00:01:01,890 --> 00:01:05,820 +Bây giờ bạn có thể lặp qua khung dữ liệu giống như cách bạn lặp + +18 +00:01:05,820 --> 00:01:07,800 +qua từ điển. Theo nhiều + +19 +00:01:07,830 --> 00:01:12,360 +cách, bạn có thể coi một khung dữ liệu giống như thể bạn đang làm + +20 +00:01:12,360 --> 00:01:16,170 +việc với một từ điển Python. Vì vậy, tôi sẽ tiếp tục và + +21 +00:01:16,710 --> 00:01:20,730 +nhập gấu trúc và tôi sẽ sử dụng gấu trúc để tạo một khung dữ liệu mới + +22 +00:01:21,390 --> 00:01:24,840 +và nó sẽ được tạo từ từ điển dành cho sinh viên của chúng tôi. + +23 +00:01:25,230 --> 00:01:26,760 +Vì vậy, bạn đã thấy tất cả những + +24 +00:01:26,820 --> 00:01:31,820 +thứ này trước đây, và tôi sẽ chỉ gọi đây là student_data_frame và tôi có thể in nó cho bạn để xem nó trông + +25 +00:01:34,080 --> 00:01:34,910 +như thế nào. + +26 +00:01:34,910 --> 00:01:35,743 +1: Được rồi. + +27 +00:01:38,630 --> 00:01:40,280 +0: Đây là khung dữ liệu của chúng tôi. + +28 +00:01:40,280 --> 00:01:45,280 +Nó trông giống như một bảng khá chuẩn với cột đầu tiên là + +29 +00:01:45,290 --> 00:01:49,280 +tất cả các chỉ số. Vì vậy, ở chỉ số 0 là hàng + +30 +00:01:49,940 --> 00:01:53,480 +đầu tiên này và về cơ bản nó biểu thị chỉ số của mỗi hàng. + +31 +00:01:54,230 --> 00:01:56,660 +Bây giờ làm việc với khung dữ liệu này, chúng + +32 +00:01:56,750 --> 00:02:01,750 +ta thực sự có thể lặp qua một khung dữ liệu bằng cách sử dụng phương pháp tương tự như trước đây. + +33 +00:02:02,990 --> 00:02:07,990 +Vì vậy, chúng ta có thể nói cho khóa, giá trị trong khung_dữ_liệu_của_sinh_viên của chúng tôi. mặt hàng. + +34 +00:02:14,390 --> 00:02:17,690 +Vì vậy, nếu tôi in từng phím, bạn có + +35 +00:02:18,980 --> 00:02:23,180 +thể thấy nó sẽ cung cấp cho tôi tiêu đề của mỗi cột. + +36 +00:02:23,810 --> 00:02:26,720 +Nhưng nếu tôi in từng giá trị, thì + +37 +00:02:28,520 --> 00:02:32,030 +nó sẽ cung cấp cho tôi dữ liệu trong mỗi cột. + +38 +00:02:32,660 --> 00:02:37,280 +Bây giờ điều này không đặc biệt hữu ích vì về cơ bản nó chỉ lặp lại tên + +39 +00:02:37,610 --> 00:02:42,110 +của các cột của chúng ta và sau đó là dữ liệu bên trong mỗi cột. + +40 +00:02:42,710 --> 00:02:46,430 +Đây là lý do tại sao gấu trúc có một vòng lặp có + +41 +00:02:47,180 --> 00:02:50,690 +sẵn và đó là một phương thức được gọi là iterrows. + +42 +00:02:51,140 --> 00:02:56,140 +Và nó cho phép chúng ta lặp qua từng hàng của khung dữ liệu thay + +43 +00:02:56,540 --> 00:02:57,680 +vì từng cột. + +44 +00:02:58,490 --> 00:03:03,490 +Và cách chúng ta làm điều đó là chúng ta lại sử dụng vòng lặp for và sau đó + +45 +00:03:03,910 --> 00:03:07,030 +chúng ta có thể nắm giữ từng chỉ mục bên trong + +46 +00:03:07,030 --> 00:03:10,570 +mỗi hàng, sao cho tương ứng với số trong cột đầu tiên đó. + +47 +00:03:11,050 --> 00:03:14,320 +Và sau đó chúng tôi có thể nắm giữ dữ liệu trong hàng. + +48 +00:03:15,010 --> 00:03:19,660 +Và sau đó chúng ta có thể nói đối với hàng chỉ mục trong khung dữ liệu, đó là student_data_frame, + +49 +00:03:19,690 --> 00:03:24,850 +và sau đó là phương thức của nó. hàng nghiêng. + +50 +00:03:26,290 --> 00:03:31,290 +Và bây giờ tôi có thể lặp qua từng hàng đó và in ra chỉ mục cho + +51 +00:03:34,150 --> 00:03:35,260 +mỗi hàng đó. + +52 +00:03:36,250 --> 00:03:39,820 +Vì vậy, bạn có thể thấy rằng điều này sẽ in ra khung dữ liệu của chúng tôi + +53 +00:03:40,150 --> 00:03:43,360 +ở đây, Và sau đó để in ra từng chỉ mục ở 0, 1, 2. + +54 +00:03:43,750 --> 00:03:46,900 +Nhưng tôi cũng có thể in ra từng hàng. + +55 +00:03:47,530 --> 00:03:52,530 +Vì vậy, bây giờ tôi nhận được hàng đầu tiên có một học sinh và một điểm số, hàng thứ hai + +56 +00:03:53,380 --> 00:03:57,310 +có một học sinh và một điểm số, và hàng thứ ba có một học sinh + +57 +00:03:57,310 --> 00:03:58,143 +và điểm số. + +58 +00:03:58,540 --> 00:04:03,540 +Vì vậy, mỗi hàng trong số các hàng này là một đối tượng chuỗi gấu trúc. Vì vậy, điều đó có nghĩa là chúng ta có + +59 +00:04:04,480 --> 00:04:09,480 +thể nhấn vào hàng và sau đó nắm giữ giá trị trong một cột cụ thể bằng cách sử dụng + +60 +00:04:10,690 --> 00:04:13,930 +ký hiệu dấu chấm. Vì vậy, chúng ta có thể nói hàng. sinh viên và bây + +61 +00:04:14,470 --> 00:04:16,360 +giờ khi nó đi qua vòng lặp, bạn + +62 +00:04:16,690 --> 00:04:19,540 +có thể thấy trước tiên, nó sẽ in ra toàn bộ khung dữ + +63 +00:04:19,870 --> 00:04:24,490 +liệu của chúng ta, và sau đó nó sẽ in ra từng sinh viên bên trong khung dữ liệu đó. + +64 +00:04:25,090 --> 00:04:28,240 +Bây giờ tôi cũng có thể nói hàng. và bây giờ nó sẽ + +65 +00:04:28,900 --> 00:04:32,320 +cung cấp cho tôi từng điểm số bên trong khung dữ liệu. + +66 +00:04:32,740 --> 00:04:35,320 +Và tôi thậm chí có thể làm điều gì đó + +67 +00:04:35,410 --> 00:04:40,410 +như thế này khi tôi nói nếu hàng. sinh viên bằng Angela, vậy thì chúng + +68 +00:04:41,440 --> 00:04:46,440 +ta có thể in ra hàng cụ thể mà chúng ta hiện đang lặp lại,. ghi bàn. Và theo cách này, chúng tôi sẽ lấy được học sinh, điểm của Angela là 56, như + +69 +00:04:47,020 --> 00:04:51,850 +bạn có thể xác minh ở đây. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 Introducing the NATO Alphabet Project.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 Introducing the NATO Alphabet Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..08661e1d9ced1ccb7887725e976498b32a816109 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 Introducing the NATO Alphabet Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:425ba9feb32167415e26b4c712fb80a157f84683f2f87961af74992fdfae9b89 +size 51744548 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 Introducing the NATO Alphabet Project_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 Introducing the NATO Alphabet Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ef265e4fcf00349ef5896d788bb2b1be4b6f7cc6 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 Introducing the NATO Alphabet Project_vi.srt @@ -0,0 +1,304 @@ +1 +00:00:00,270 --> 00:00:03,360 +Bây giờ chúng tôi cuối cùng đã sẵn sàng để giải quyết dự án của mình và + +2 +00:00:03,510 --> 00:00:08,510 +dự án này dựa trên cuộc đấu tranh thực tế mà tôi có. Thường thì khi tôi gọi cho một công + +3 +00:00:09,480 --> 00:00:13,830 +ty và qua điện thoại, tôi phải cung cấp một số loại chi + +4 +00:00:13,830 --> 00:00:16,680 +tiết phải không? Họ sẽ hỏi tôi, tên bạn là gì, và bạn có thể đánh vần nó không? + +5 +00:00:16,890 --> 00:00:21,360 +Vì vậy, tôi sẽ phải giống như A-N-G-E-L-A. Và họ giống như, chờ đã, đó có phải là chữ E không? + +6 +00:00:21,390 --> 00:00:24,390 +Đó có phải là điểm B, bạn đã nói gì? Trong những trường hợp này, tôi thường phải + +7 +00:00:24,390 --> 00:00:29,070 +sắp xếp mặc định cho một số loại bảng chữ cái Hải quân. trong đó tôi nói A + +8 +00:00:29,070 --> 00:00:32,220 +là alfa, N là tháng 11, G là gôn. + +9 +00:00:32,610 --> 00:00:36,870 +Và rồi một lúc nào đó tôi quên mất E là viết tắt của gì và tôi giống E là .. con voi? + +10 +00:00:37,530 --> 00:00:42,180 +Và đã có lúc tôi chỉ hoàn toàn lấy MIG và nói những thứ như M là + +11 +00:00:42,180 --> 00:00:46,170 +ký hiệu ghi nhớ, P là viêm phổi, W là cờ lê, điều này không + +12 +00:00:46,440 --> 00:00:47,880 +có ý nghĩa gì + +13 +00:00:47,880 --> 00:00:52,880 +cả vì đây là những chữ cái im lặng. Và tôi đã có một số người rất tức giận, + +14 +00:00:52,950 --> 00:00:54,570 +ừm, nhưng nó khá vui. + +15 +00:00:55,110 --> 00:00:59,610 +Vì vậy, bây giờ những gì chúng tôi muốn tạo là chúng tôi muốn tạo một công + +16 +00:00:59,610 --> 00:01:03,840 +cụ lấy bảng chữ cái phiên âm NATO được tạo ra bởi vì nó thường thực + +17 +00:01:03,840 --> 00:01:08,840 +sự, thực sự quan trọng để bên kia biết chính xác bạn đã nói gì và bạn đang đánh vần + +18 +00:01:08,970 --> 00:01:13,970 +những chữ cái nào. để họ không nhầm chữ E của bạn với chữ B hoặc chữ T của bạn + +19 +00:01:15,000 --> 00:01:16,500 +với chữ C vì tất + +20 +00:01:16,530 --> 00:01:20,700 +cả các âm đều thực sự giống nhau. Đi tới trang tài nguyên của khóa học, nơi + +21 +00:01:20,760 --> 00:01:24,120 +bạn có thể tìm thấy các tệp bắt đầu cho dự án bảng chữ cái NATO. + +22 +00:01:24,990 --> 00:01:29,730 +Tôi muốn bạn luyện tập với khả năng hiểu danh sách và hiểu + +23 +00:01:29,730 --> 00:01:31,980 +từ điển. Nhưng trong trường + +24 +00:01:32,010 --> 00:01:34,800 +hợp này, chúng ta không xem qua từ điển + +25 +00:01:34,830 --> 00:01:39,830 +mà thực sự chúng ta đang xem qua một khung dữ liệu vì dữ liệu của chúng + +26 +00:01:39,930 --> 00:01:43,830 +ta nằm bên trong một CSV. Vì vậy, chúng tôi sẽ đọc nó bằng cách sử dụng gấu trúc. + +27 +00:01:44,130 --> 00:01:49,130 +và sau đó chúng ta sẽ kết thúc với một khung dữ liệu. Thay vì có khả năng hiểu từ điển + +28 +00:01:49,410 --> 00:01:54,150 +tiêu chuẩn không có thật trong đó các từ khóa của chúng tôi là new_key: + +29 +00:01:54,180 --> 00:01:59,180 +new_value cho khóa, giá trị trong dict. mặt hàng. + +30 +00:02:05,130 --> 00:02:08,430 +Bây giờ chúng ta sẽ thay đổi vòng lặp for này, vì vậy thay + +31 +00:02:08,490 --> 00:02:11,330 +vì sử dụng vòng lặp for đơn giản mà chúng ta chỉ + +32 +00:02:11,410 --> 00:02:12,990 +lặp qua từ điển, chúng + +33 +00:02:13,380 --> 00:02:17,670 +ta sẽ sử dụng vòng lặp cụ thể này. Vì vậy, trong trường hợp + +34 +00:02:17,700 --> 00:02:22,700 +này, chúng tôi đang nói cho hàng chỉ mục trong khung dữ liệu của + +35 +00:02:24,300 --> 00:02:28,740 +chúng tôi, và sau đó là hàng. iterrows như một phương pháp. + +36 +00:02:29,220 --> 00:02:34,220 +Vì vậy, về cơ bản tôi muốn bạn sử dụng vòng lặp khác nhau này để lặp qua khung dữ liệu + +37 +00:02:34,440 --> 00:02:39,440 +của chúng tôi và sau đó tạo một từ điển mới bằng cách sử dụng khóa mới và giá trị mới. + +38 +00:02:41,130 --> 00:02:45,390 +Vậy chính xác thì tôi muốn bạn làm gì với điều này? Tôi muốn bạn có thể sử dụng + +39 +00:02:45,420 --> 00:02:49,380 +CSV của bảng chữ cái phiên âm NATO, và tôi muốn bạn + +40 +00:02:49,830 --> 00:02:51,690 +làm hai điều với nó. + +41 +00:02:52,140 --> 00:02:57,140 +Điều đầu tiên là bạn phải tạo một từ điển ở định dạng này. + +42 +00:03:01,000 --> 00:03:06,000 +Định dạng về cơ bản, chìa khóa sẽ là chữ cái thực, + +43 +00:03:06,130 --> 00:03:11,130 +vì vậy có thể là A. Và sau đó giá trị sẽ là mã tương ứng cho + +44 +00:03:12,460 --> 00:03:15,700 +bảng chữ cái phiên âm NATO. Vì vậy, A thực sự là cho alpha. + +45 +00:03:16,150 --> 00:03:20,530 +Và tiếp theo là B, viết tắt của Bravo. + +46 +00:03:21,490 --> 00:03:22,180 +Về cơ + +47 +00:03:22,180 --> 00:03:26,830 +bản, chúng tôi sẽ sử dụng CSV và chúng tôi sẽ chuyển đổi nó thành một + +48 +00:03:26,830 --> 00:03:30,190 +từ điển ở định dạng cụ thể này, trong đó các + +49 +00:03:30,190 --> 00:03:34,330 +khóa là các ký tự bên trong CSV, vì vậy cột đầu tiên đó + +50 +00:03:34,690 --> 00:03:39,690 +và sau đó các giá trị là các từ mã tương ứng cho mỗi chữ cái đó. + +51 +00:03:40,630 --> 00:03:45,250 +Và lý do tại sao chúng ta đang nói về iterrows và phải lặp qua các hàng của + +52 +00:03:45,250 --> 00:03:49,570 +khung dữ liệu thay vì chỉ khiến bạn nắm được khung dữ liệu và sau đó chỉ + +53 +00:03:49,900 --> 00:03:52,270 +nói to_dict như những gì chúng ta đã làm + +54 +00:03:52,420 --> 00:03:56,590 +trước đây, là bởi vì nó sẽ không cung cấp nó cho bạn ở định dạng + +55 +00:03:56,590 --> 00:03:57,640 +cụ thể này. + +56 +00:03:58,000 --> 00:04:01,210 +Vì vậy, bạn sẽ phải sử dụng những gì bạn đã + +57 +00:04:01,210 --> 00:04:05,770 +học về khả năng hiểu từ điển để tạo từ điển ở định dạng cụ thể này. + +58 +00:04:06,370 --> 00:04:08,830 +Và khi bạn đã tạo từ điển ở định dạng này, + +59 +00:04:08,860 --> 00:04:11,200 +thì bước tiếp theo sẽ dễ dàng hơn rất nhiều. + +60 +00:04:11,500 --> 00:04:16,500 +Bạn sẽ tạo một danh sách các từ mã phiên âm từ một từ mà người + +61 +00:04:19,450 --> 00:04:20,620 +dùng nhập vào. + +62 +00:04:21,940 --> 00:04:26,410 +Bằng cách đó, người dùng có thể sử dụng đầu vào để nhập một từ. + +63 +00:04:26,830 --> 00:04:30,430 +Vì vậy, ví dụ, Thomas, và sau đó khi họ nhấn enter, họ + +64 +00:04:30,550 --> 00:04:32,740 +nhận được một danh sách được in + +65 +00:04:33,010 --> 00:04:38,010 +ra đó là từ mã bảng chữ cái phiên âm cho mỗi chữ cái trong đầu vào của họ. + +66 +00:04:39,190 --> 00:04:41,800 +Vì vậy, Tango, Hotel, Oscar Mike, Alpha Sierra, mà sau đó + +67 +00:04:41,830 --> 00:04:45,160 +họ có thể đọc lại bằng cách sử dụng công cụ nhỏ của chúng tôi. + +68 +00:04:46,210 --> 00:04:50,290 +Tôi có thể nói rằng để thực hiện bước 1 khó hơn rất nhiều so với bước 2. + +69 +00:04:50,620 --> 00:04:54,070 +Nhưng về cơ bản, để thực hiện bước 1 là + +70 +00:04:54,160 --> 00:04:58,630 +hiểu từ điển, tạo từ điển ở định dạng này từ CSV, và + +71 +00:04:58,630 --> 00:05:03,630 +thực hiện bước 2 về cơ bản là hoàn thành dự án và có thể tạo + +72 +00:05:03,910 --> 00:05:08,860 +và in ra danh sách các từ mã dựa trên từ. mà người dùng nhập. + +73 +00:05:09,400 --> 00:05:13,570 +Vì vậy, tôi muốn bạn tạm dừng video, suy nghĩ về cách bạn có thể + +74 +00:05:13,900 --> 00:05:18,900 +giải quyết vấn đề này, sau đó chuyển đến tài nguyên của khóa học và tải xuống tệp zip bắt + +75 +00:05:20,170 --> 00:05:24,370 +đầu này để bạn có thể mở nó bên trong PyCharm và tạo dự án của mình. + +76 +00:05:24,880 --> 00:05:26,770 +Tạm dừng video và bắt đầu ngay bây giờ. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 NATO-alphabet-start.zip b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 NATO-alphabet-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..90ec59ced5398d9e8ccc9e40630e188d1b52062e --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/011 NATO-alphabet-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d22b709c1d0b1c1909471df383145bd15c23be377c9e47bc895f6d461348c2d3 +size 860 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Course-Fixes-Report-an-Issue.url b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution & Walkthrough for the NATO Alphabet Project.mp4 b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution & Walkthrough for the NATO Alphabet Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4d26e017c6bddb3c899002178cc494b036194c68 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution & Walkthrough for the NATO Alphabet Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78673937eef8b8c5502096611295d56292acb6bea2e3f09ef686949e98c7055b +size 33693847 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution & Walkthrough for the NATO Alphabet Project_vi.srt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution & Walkthrough for the NATO Alphabet Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8065197174b4b229aa19ac9646fbe0b0f0343682 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution & Walkthrough for the NATO Alphabet Project_vi.srt @@ -0,0 +1,348 @@ +1 +00:00:00,240 --> 00:00:05,220 +Khi bạn đã giải nén và mở tệp bắt đầu bên trong PyCharm, đây là những gì + +2 +00:00:05,610 --> 00:00:06,689 +bạn sẽ thấy. + +3 +00:00:06,780 --> 00:00:11,610 +Có một tệp CSV chứa từng chữ cái và từ mã, và cũng có + +4 +00:00:11,970 --> 00:00:16,379 +tệp chính của chúng tôi. py với một số mã ví dụ mà tôi đã chỉ cho + +5 +00:00:16,379 --> 00:00:18,480 +bạn trong bài học trước. Bây giờ, nếu + +6 +00:00:18,510 --> 00:00:23,400 +bạn không biết làm thế nào để hoàn thành thử thách này, đặc biệt là bước 1, + +7 +00:00:23,760 --> 00:00:28,760 +tôi thực sự khuyên bạn nên xem qua mã ví dụ này và chỉ cần đi qua + +8 +00:00:29,730 --> 00:00:33,480 +từng loại vòng lặp khác nhau và xem bạn nhận được gì + +9 +00:00:33,480 --> 00:00:37,170 +khi in. khóa hoặc giá trị. Và trong trường hợp này, khi + +10 +00:00:37,200 --> 00:00:41,550 +bạn in chỉ mục hoặc khi bạn in hàng. Và sau đó xem điều gì sẽ xảy ra khi bạn + +11 +00:00:41,550 --> 00:00:46,500 +nắm giữ một số mục trong hàng. Và xem làm thế nào có thể hàng. sinh viên hoặc hàng. + +12 +00:00:46,500 --> 00:00:49,560 +điểm số hoạt động. Khi bạn đã hiểu đầy + +13 +00:00:49,590 --> 00:00:53,250 +đủ điều này, thì việc hoàn thành bước 1 sẽ tương đối dễ dàng. + +14 +00:00:53,880 --> 00:00:58,110 +Vì vậy, về cơ bản, mục tiêu là chúng tôi muốn tạo một từ điển giống + +15 +00:00:58,110 --> 00:00:59,760 +như thế này từ CSV. + +16 +00:01:00,360 --> 00:01:04,379 +Việc đầu tiên chúng ta phải làm là tiến hành nhập khẩu gấu trúc. + +17 +00:01:06,270 --> 00:01:09,540 +Và nếu bạn cần cài đặt nó, phải có một dòng chữ nguệch ngoạc + +18 +00:01:09,570 --> 00:01:10,680 +và sau đó bạn + +19 +00:01:10,800 --> 00:01:14,550 +có thể nhấp vào nó và bóng đèn sẽ giúp bạn cài đặt mô-đun gấu trúc. + +20 +00:01:14,940 --> 00:01:17,400 +Nhưng khi chúng tôi đã nắm được gấu + +21 +00:01:17,430 --> 00:01:22,350 +trúc, chúng tôi có thể tiếp tục và sử dụng nó để đọc CSV từ tệp + +22 +00:01:22,350 --> 00:01:27,270 +của chúng tôi, đó là tệp này. Nó nằm dưới đường dẫn tệp chỉ nato_phonetic_ + +23 +00:01:27,270 --> 00:01:31,470 +bảng chữ cái. csv. Vì vậy, nó sẽ lưu điều này làm dữ liệu + +24 +00:01:31,500 --> 00:01:34,890 +của chúng tôi, về cơ bản sẽ là khung dữ liệu của chúng tôi. Bây giờ, khi chúng tôi + +25 +00:01:34,890 --> 00:01:37,440 +đã nắm được dữ liệu của mình, thì + +26 +00:01:37,560 --> 00:01:41,010 +bạn có thể thấy rằng nếu chúng tôi in nó ra, + +27 +00:01:41,880 --> 00:01:43,800 +nó sẽ giống như thế này. + +28 +00:01:44,250 --> 00:01:49,250 +Nhưng nếu chúng tôi sử dụng phương pháp đó, to_dict, và sau đó chúng tôi cố gắng + +29 +00:01:49,950 --> 00:01:54,060 +in nó ra, bạn có thể thấy rằng nó không tổ chức từ điển + +30 +00:01:54,060 --> 00:01:57,780 +theo định dạng mà chúng tôi muốn, nghĩa là có ký tự làm + +31 +00:01:57,990 --> 00:02:02,730 +khóa, mã tương ứng như giá trị. Để hoàn thành bước 1 như tôi đã + +32 +00:02:02,820 --> 00:02:06,300 +đề cập, chúng ta sẽ phải sử dụng tính năng hiểu từ điển. + +33 +00:02:06,750 --> 00:02:11,750 +Và phương thức sẽ sử dụng các mũi tên để lặp qua từng hàng + +34 +00:02:12,690 --> 00:02:17,340 +bên trong khung dữ liệu đó. Vì vậy, tôi sẽ sao chép dòng + +35 +00:02:17,580 --> 00:02:20,490 +đó ở đây và tôi sẽ dán nó vào đây. + +36 +00:02:21,150 --> 00:02:25,860 +Bây giờ, đây là định dạng, vì vậy hãy tiếp tục và thay thế từng từ khóa. + +37 +00:02:26,250 --> 00:02:29,250 +Khung dữ liệu của chúng tôi, trong trường hợp của chúng tôi, chỉ được gọi là dữ liệu. + +38 +00:02:30,000 --> 00:02:33,900 +Và sau đó chúng ta sẽ nói rằng dữ liệu lặp lại qua từng hàng, + +39 +00:02:34,170 --> 00:02:37,020 +sau đó đối với từng chỉ mục và hàng, chúng ta + +40 +00:02:37,230 --> 00:02:39,270 +sẽ làm điều gì đó với nó. + +41 +00:02:39,900 --> 00:02:44,900 +Bây giờ khóa mới sẽ là hàng. chữ cái và giá trị mới cũng sẽ đến + +42 +00:02:49,200 --> 00:02:54,180 +từ hàng đó và nó sẽ là hàng. mã số. + +43 +00:02:55,020 --> 00:02:58,650 +Vì vậy, đây là mã sẽ tạo từ điển mới + +44 +00:02:59,110 --> 00:03:03,670 +của chúng tôi và tôi sẽ gọi nó là phonetic_dictionary của chúng tôi. + +45 +00:03:04,840 --> 00:03:06,580 +Bây giờ, nếu tôi in nó ra, + +46 +00:03:07,630 --> 00:03:12,370 +bạn có thể thấy rằng đây là dữ liệu thẳng. to_dict và sau đó là dòng thứ + +47 +00:03:12,790 --> 00:03:16,810 +hai mà chúng tôi đã thực sự định dạng nó bằng cách sử + +48 +00:03:17,140 --> 00:03:20,980 +dụng những gì chúng tôi đã học về khả năng hiểu từ điển. + +49 +00:03:21,730 --> 00:03:25,570 +Khi chúng ta đã nắm được từ điển phiên âm này, thì việc thực hiện + +50 +00:03:25,630 --> 00:03:30,630 +bước 2 vô cùng dễ dàng bởi vì tất cả những gì chúng ta phải làm là tạo một số loại + +51 +00:03:31,120 --> 00:03:35,200 +đầu vào, yêu cầu người dùng nhập một từ và sau đó chúng ta có thể lưu + +52 +00:03:35,560 --> 00:03:39,220 +đầu vào này vào một Biến đổi. Bây giờ, khi họ + +53 +00:03:39,250 --> 00:03:41,320 +đã nhập từ, chúng ta phải + +54 +00:03:41,530 --> 00:03:46,530 +kiểm tra nó với từng phím bên trong từ điển phiên âm này. + +55 +00:03:47,410 --> 00:03:50,470 +Vì vậy, hãy chú ý xem mỗi phím đều được viết hoa như thế nào. + +56 +00:03:50,800 --> 00:03:55,480 +Vì vậy, chúng tôi sẽ phải thay đổi bất cứ điều gì mà người + +57 +00:03:55,510 --> 00:04:00,220 +dùng đã nhập tất cả lên trên. Vì vậy, theo cách đó, nếu họ nhập chữ + +58 +00:04:00,220 --> 00:04:03,750 +thường hoặc chữ hoa, điều đó không thực sự quan trọng vì chúng ta + +59 +00:04:03,760 --> 00:04:08,020 +sẽ chuyển toàn bộ chuỗi thành chữ hoa. Và sau đó chúng ta sẽ sử dụng khả năng hiểu danh sách của mình. + +60 +00:04:08,890 --> 00:04:13,890 +Cách chúng tôi tạo ra khả năng hiểu danh sách của chúng tôi sẽ trở thành mục mới cho mục + +61 +00:04:14,890 --> 00:04:16,570 +trong danh sách. Vì vậy, trong trường + +62 +00:04:16,570 --> 00:04:20,529 +hợp này, danh sách của chúng tôi hoặc thứ mà chúng tôi sẽ lặp lại sẽ là từ + +63 +00:04:20,529 --> 00:04:21,363 +của chúng tôi. + +64 +00:04:21,640 --> 00:04:25,540 +Và sau đó chúng ta sẽ đi qua từng chữ cái trong từ. + +65 +00:04:26,770 --> 00:04:29,170 +Và khi chúng ta đã có từng chữ cái, + +66 +00:04:29,230 --> 00:04:33,640 +chúng ta sẽ xem qua từ điển phiên âm của mình, từ điển này ngay tại + +67 +00:04:33,730 --> 00:04:38,440 +đây và chọn ra giá trị tương ứng với chữ cái cụ thể mà chúng ta đang + +68 +00:04:38,440 --> 00:04:39,310 +lặp lại. + +69 +00:04:39,550 --> 00:04:42,970 +Vì vậy, chúng ta sẽ sử dụng dấu ngoặc vuông và sau đó chuyển vào chữ cái như thế này. + +70 +00:04:43,600 --> 00:04:48,600 +Bây giờ chúng tôi đã tạo danh sách đầu ra của mình và chúng tôi có thể tiếp tục và in nó ra. + +71 +00:04:51,310 --> 00:04:56,310 +Bây giờ chúng ta hãy tiếp tục và bình luận dòng này và chạy mã của chúng tôi. + +72 +00:04:58,120 --> 00:05:01,300 +Vì vậy, nó sẽ yêu cầu tôi nhập một từ, tôi sẽ nhập tên của mình. + +73 +00:05:01,660 --> 00:05:06,660 +Và bây giờ nó được quản lý để chuyển đổi nó thành một danh sách các bảng chữ cái phiên + +74 +00:05:07,450 --> 00:05:10,300 +âm tương ứng với mỗi chữ cái trong từ đó. + +75 +00:05:11,200 --> 00:05:15,010 +Bạn đã quản lý để hoàn thành thử thách này? Và nếu không, bạn đã + +76 +00:05:15,220 --> 00:05:16,930 +vấp phải phần nào? + +77 +00:05:17,320 --> 00:05:21,370 +Đó có phải là phần mà bạn đã sử dụng cỏ dại không? Nếu vậy, hãy quay lại tệp + +78 +00:05:21,370 --> 00:05:25,720 +bắt đầu cho dự án này và xem qua từng cách khác nhau mà chúng + +79 +00:05:25,720 --> 00:05:29,560 +tôi đang lặp lại nó và sử dụng các câu lệnh in để + +80 +00:05:29,560 --> 00:05:34,360 +thực sự hiểu vòng lặp thực sự diễn ra như thế nào và xem qua dữ liệu. + +81 +00:05:35,080 --> 00:05:35,470 +Bây + +82 +00:05:35,470 --> 00:05:40,240 +giờ, nếu ngược lại, đó là phần đọc hiểu từ điển hoặc phần hiểu danh sách, thì hãy + +83 +00:05:40,240 --> 00:05:41,073 +nhớ quay lại + +84 +00:05:41,320 --> 00:05:44,950 +bài học liên quan và chỉ cần đảm bảo rằng bạn đã xem lại + +85 +00:05:44,950 --> 00:05:48,130 +và bạn viết mã trong bài học cho chính mình. chắc + +86 +00:05:48,400 --> 00:05:52,690 +chắn rằng bạn hiểu những gì đang xảy ra trước khi bạn tiếp tục sang ngày + +87 +00:05:52,690 --> 00:05:53,230 +hôm sau. + diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution-NATO-alphabet-end.zip b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution-NATO-alphabet-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..fcec7d114fa57b55ce4a535c5c371abc4976a434 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/012 Solution-NATO-alphabet-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bedda8778fae1c573bb5d002dc4ab12df34b73d7e47d02774852361be6e2180 +size 815 diff --git a/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/external-links.txt b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..b4be229a1af7ced44e73264d24247af0174312c0 --- /dev/null +++ b/part2/26 - Day 26 - Intermediate - List Comprehension and the NATO Alphabet/external-links.txt @@ -0,0 +1,36 @@ + +003 Exercise-28 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/d16d11d5-4612-46d1-b2ea-6174f93eacd2 + +003 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +004 Exercise-29 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/cd26595b-5d0b-40a6-933e-8dc47a497fcc + +004 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +005 Exercise-30 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/57f6506d-2274-4bb6-989f-60e1e97f2a84 + +005 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +008 Exercise-31 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/ce265a22-8384-45dc-b7fa-f733d0370279 + +008 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +009 Exercise-32 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/91d77ad3-10f1-4297-bad5-36a8e5ad45c9 + +009 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +010 Day-26-End-Code +https://repl.it/@appbrewery/day-26-end + +012 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/001 Day 27 Goals what we will make by the end of the day.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/001 Day 27 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5d64f242c2d0c7fa3b4caf20bcfe2f471cbbc671 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/001 Day 27 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5ac604222d652400629263a172ad65a10591af73d8a43a090c784764da85b4f +size 16177413 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/001 Day 27 Goals what we will make by the end of the day_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/001 Day 27 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8101a0c312df8159eb7edff307488b34e35dead9 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/001 Day 27 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,116 @@ +1 +00:00:00,510 --> 00:00:05,490 +Xin chào các bạn, chào mừng đến với Ngày 27 của 100 Ngày viết mã. Hôm nay chúng ta sẽ đi + +2 +00:00:05,520 --> 00:00:10,520 +sâu vào Giao diện người dùng đồ họa sử dụng TKinter và chúng ta + +3 +00:00:11,310 --> 00:00:15,090 +cũng sẽ tìm hiểu thêm về các đối số của hàm. + +4 +00:00:15,840 --> 00:00:20,310 +Vì vậy, chúng ta đã thấy một chút về giao diện người dùng đồ họa khi + +5 +00:00:20,310 --> 00:00:24,270 +chúng ta sử dụng mô-đun rùa của mình, nhưng tôi muốn đi sâu hơn + +6 +00:00:24,780 --> 00:00:29,010 +một chút và tôi muốn chỉ cho bạn một trong những cách phổ biến nhất để + +7 +00:00:29,010 --> 00:00:33,420 +tạo giao diện người dùng đồ họa. Ví dụ, một chương trình như thế này trong một + +8 +00:00:33,990 --> 00:00:37,620 +cửa sổ riêng biệt và chúng ta sẽ sử dụng mô-đun TKinter có sẵn để thực hiện việc này. + +9 +00:00:37,980 --> 00:00:41,280 +Vì vậy, chúng ta sẽ tìm hiểu cách tạo nhãn, cách tạo + +10 +00:00:41,520 --> 00:00:46,520 +nút, cách phản hồi với những lần nhấp vào nút đó cũng như những thứ như nhập văn bản + +11 +00:00:47,280 --> 00:00:50,580 +và cách bố trí và thiết kế chương trình của bạn. + +12 +00:00:51,120 --> 00:00:52,740 +Và trong khi chúng ta đang làm + +13 +00:00:52,770 --> 00:00:56,760 +tất cả những điều này, chúng ta sẽ xem xét các tính năng nâng cao hơn + +14 +00:00:57,120 --> 00:01:02,040 +của các hàm Python, bao gồm những thứ như cách đặt các đối số mặc định và những Args và Kwargs + +15 +00:01:02,040 --> 00:01:03,000 +này là gì. + +16 +00:01:03,450 --> 00:01:08,450 +Vì vậy, một cách để có thể chuyển một lượng đầu vào không xác định vào một + +17 +00:01:09,120 --> 00:01:14,120 +hàm và chúng tôi sẽ áp dụng các khái niệm nâng cao này để xây dựng + +18 +00:01:15,120 --> 00:01:20,120 +chương trình chuyển đổi đơn vị bằng TKinter. Chương trình này sẽ giúp chúng tôi chuyển đổi dặm sang ki lô mét hoặc lít sang + +19 +00:01:21,060 --> 00:01:25,860 +gallon, hoặc bất kỳ chuyển đổi nhỏ nào mà bạn có thể thường sử dụng. Ví dụ, giả sử rằng tôi + +20 +00:01:25,860 --> 00:01:30,720 +đã chạy 10 dặm và tôi muốn biết quãng đường đó là bao nhiêu km. + +21 +00:01:31,080 --> 00:01:32,700 +Nếu tôi tiếp tục và nhấp vào + +22 +00:01:32,880 --> 00:01:36,180 +tính toán, bạn có thể thấy nó tạo ra giá trị tương đương tính bằng km + +23 +00:01:36,450 --> 00:01:39,960 +và bạn có thể thấy rằng toàn bộ chương trình của chúng tôi được trình bày độc đáo. + +24 +00:01:39,960 --> 00:01:42,840 +Vì vậy, nó nói rằng 10 dặm tương đương với 16 + +25 +00:01:43,350 --> 00:01:46,560 +km và nó hoàn toàn đáp ứng các đầu vào của chúng tôi. + +26 +00:01:47,190 --> 00:01:49,770 +Đây là những gì chúng tôi sẽ làm + +27 +00:01:49,860 --> 00:01:54,860 +trong dự án của mình, một chương trình giao diện người dùng đồ họa Python hoàn chỉnh + +28 +00:01:56,670 --> 00:02:01,380 +sử dụng mã Python của chúng tôi. Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và chúng + +29 +00:02:01,380 --> 00:02:03,390 +ta hãy bắt đầu bằng cách tìm hiểu thêm một chút về TKinter. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/002 History of GUI and Introduction to Tkinter.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/002 History of GUI and Introduction to Tkinter.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..dc2c9a3db72fd0ffd79cba190acea25986ae9702 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/002 History of GUI and Introduction to Tkinter.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa94471b0f5ec2d0dec31ef80ad18d6a2882727d277296246c5337484aa3bea0 +size 47536851 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/002 History of GUI and Introduction to Tkinter_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/002 History of GUI and Introduction to Tkinter_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..159830185369a4607882c4b42ff770037c1bffc8 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/002 History of GUI and Introduction to Tkinter_vi.srt @@ -0,0 +1,312 @@ +1 +00:00:00,510 --> 00:00:00,900 +Được rồi. + +2 +00:00:00,900 --> 00:00:05,900 +Vì vậy, mục tiêu chính của chúng tôi trong các bài học hôm nay là tìm hiểu về mô-đun Tkinter + +3 +00:00:08,280 --> 00:00:12,480 +và xem cách chúng tôi có thể sử dụng nó để tạo giao diện người dùng đồ + +4 +00:00:12,540 --> 00:00:17,450 +họa, còn được gọi là a, gui hoặc GUI. Bây giờ, GUI là một + +5 +00:00:17,480 --> 00:00:22,480 +vấn đề lớn vào những năm 90 vì trước đây, để tương + +6 +00:00:23,060 --> 00:00:25,250 +tác với máy tính, + +7 +00:00:25,520 --> 00:00:30,170 +bạn phải sử dụng hệ điều hành dòng lệnh như MS-DOS. + +8 +00:00:30,170 --> 00:00:34,250 +Vì vậy, đây là loại tương tự như bảng điều khiển Python của chúng tôi, nơi + +9 +00:00:34,550 --> 00:00:37,100 +mọi thứ chúng tôi muốn máy tính làm, + +10 +00:00:37,340 --> 00:00:40,760 +chúng tôi phải nói với nó bằng cách viết một đoạn văn bản. + +11 +00:00:41,030 --> 00:00:44,570 +Vì vậy, nếu chúng ta muốn Python in hello, chúng ta phải viết ra văn bản. + +12 +00:00:45,350 --> 00:00:46,640 +Nhưng GUI thì khác. + +13 +00:00:47,060 --> 00:00:50,990 +GUI có dạng đồ họa và đi kèm với chuột, chúng cho phép + +14 +00:00:51,260 --> 00:00:54,770 +người dùng được đào tạo rất ít về máy tính có + +15 +00:00:55,040 --> 00:00:58,400 +thể chỉ và nhấp vào thứ họ muốn làm trên + +16 +00:00:58,400 --> 00:00:59,233 +màn hình. + +17 +00:00:59,660 --> 00:01:03,770 +Và một trong những máy tính đầu tiên kết hợp loại + +18 +00:01:04,069 --> 00:01:07,340 +hệ điều hành GUI này là Mac Lisa. + +19 +00:01:08,060 --> 00:01:09,950 +Nó có những cửa sổ nhỏ này + +20 +00:01:10,220 --> 00:01:13,790 +mà bạn có thể nhấp vào và nó khởi chạy các chương trình mà bạn + +21 +00:01:13,820 --> 00:01:18,140 +có thể tương tác bằng cách trỏ và nhấp. Bây giờ, tôi đã đề cập + +22 +00:01:18,140 --> 00:01:21,890 +rằng máy Mac có các cửa sổ này và trên thực tế, + +23 +00:01:22,160 --> 00:01:26,870 +máy Mac đã lập trình các cửa sổ trước khi Windows thực sự tồn tại. + +24 +00:01:27,470 --> 00:01:32,470 +Vì vậy, Windows là phiên bản của Microsoft của hệ điều hành giao diện + +25 +00:01:33,470 --> 00:01:36,350 +người dùng đồ họa. Và khi mới ra + +26 +00:01:36,530 --> 00:01:41,530 +mắt, nó đã tạo ra khá nhiều tranh cãi vì có vẻ như hãng đã đánh cắp + +27 +00:01:42,500 --> 00:01:46,130 +ý tưởng này từ Apple bởi vì suy cho cùng, Mac Lisa + +28 +00:01:46,130 --> 00:01:49,310 +đã ra mắt trước cả Windows chứ đừng nói đến + +29 +00:01:49,340 --> 00:01:53,420 +windows 95 hoặc phiên bản mới hơn. bạn có thể quen thuộc với. + +30 +00:01:54,170 --> 00:01:59,170 +Và điều này thậm chí còn khiến Apple kiện Microsoft vì đã vi phạm quyền trí tuệ của + +31 +00:02:00,470 --> 00:02:05,470 +họ khi sử dụng giao diện người dùng đồ họa này để tương tác với máy tính. + +32 +00:02:06,050 --> 00:02:09,050 +Đây là mức độ quan trọng của GUI vào những năm 90. + +33 +00:02:09,620 --> 00:02:14,620 +Có một bước đột phá lớn trong việc tương tác với máy tính và điều đó khiến nó trở nên quan trọng + +34 +00:02:14,630 --> 00:02:19,040 +đối với cả Apple và Microsoft đến nỗi cuối cùng họ phải đấu với nhau tại tòa án. + +35 +00:02:20,030 --> 00:02:21,530 +Bây giờ, thậm chí cho + +36 +00:02:21,560 --> 00:02:26,560 +đến ngày nay, Bill Gates vẫn được hỏi liệu ông có thực sự sao chép ý tưởng giao diện + +37 +00:02:27,560 --> 00:02:31,880 +người dùng đồ họa của một hệ điều hành từ Steve Jobs và Apple hay không. + +38 +00:02:32,600 --> 00:02:37,370 +Và tôi đã đọc trên Reddit AMA gần đây, nơi ai đó đã hỏi anh ấy câu hỏi + +39 +00:02:37,370 --> 00:02:42,290 +này, anh ấy thực sự trả lời bằng cách nói rằng việc sao chép không thực sự sao chép. + +40 +00:02:42,290 --> 00:02:46,880 +Chỉ là họ đã thuê một số người từ một công ty khác, Xerox PARC, và + +41 +00:02:46,880 --> 00:02:50,690 +điều xảy ra là họ vẫn tiếp tục công việc mà họ + +42 +00:02:50,690 --> 00:02:51,980 +đã làm trước đó. + +43 +00:02:52,970 --> 00:02:57,560 +Nhưng phần lịch sử đầy màu sắc hơn thực sự đến từ cuốn tiểu sử + +44 +00:02:57,560 --> 00:03:00,490 +về Steve Jobs của Walter Isaacson và trong đó, + +45 +00:03:00,490 --> 00:03:05,490 +có một mô tả tuyệt vời về cảnh Steve Jobs, được bao quanh bởi các nhân viên + +46 +00:03:07,090 --> 00:03:12,090 +của mình, về cơ bản chỉ đang đi về phía Gates, nói với anh ta rằng bạn + +47 +00:03:13,230 --> 00:03:16,170 +đang gạt chúng tôi. Tôi đã tin tưởng bạn và bây + +48 +00:03:16,170 --> 00:03:17,760 +giờ bạn đang ăn cắp của chúng tôi. + +49 +00:03:18,060 --> 00:03:21,000 +Bạn đã thấy các phiên bản trước của hệ điều hành của chúng + +50 +00:03:21,030 --> 00:03:24,090 +tôi và hiện bạn đang sử dụng nó trong phần mềm Microsoft của mình. + +51 +00:03:24,810 --> 00:03:29,810 +Và để ghi nhận công lao của mình, Bill Gates đã thực sự đưa ra được một câu trả lời khá + +52 +00:03:30,690 --> 00:03:33,510 +tốt ngay tại chỗ khi ông ấy nói, "Chà, Steve, tôi + +53 +00:03:33,600 --> 00:03:35,730 +nghĩ có nhiều cách để nhìn nhận nó. + +54 +00:03:35,730 --> 00:03:40,680 +Tôi nghĩ giống như cả hai chúng ta đều có người hàng xóm giàu có tên là Xerox và tôi đã đột nhập vào + +55 +00:03:40,680 --> 00:03:44,520 +nhà anh ta để lấy trộm TV và phát hiện ra rằng bạn đã lấy trộm nó. + +56 +00:03:44,520 --> 00:03:49,260 +Đó là một sự trở lại khá tốt của Bill Gates. Và chiếc Xerox mà họ + +57 +00:03:49,260 --> 00:03:51,720 +đang nhắc đến chính là Xerox parc. + +58 +00:03:52,020 --> 00:03:57,020 +Đó là trung tâm tìm kiếm bên phải Palo Alto đã tạo ra vô số bước đột phá, ừm, + +59 +00:03:58,650 --> 00:04:02,460 +về mặt công nghiệp máy tính. Và trên thực tế, họ + +60 +00:04:02,490 --> 00:04:07,490 +đã tạo ra giao diện người dùng đồ họa đầu tiên thực sự được đưa vào + +61 +00:04:07,740 --> 00:04:12,000 +sử dụng trong máy tính trước cả khi Apple hay Microsoft nghĩ đến. + +62 +00:04:12,360 --> 00:04:17,360 +Họ cũng tạo ra những thứ khác như Ethernet hoặc ngôn ngữ Lập trình hướng đối + +63 +00:04:17,550 --> 00:04:20,100 +tượng đầu tiên. Và quan trọng + +64 +00:04:20,550 --> 00:04:24,630 +nhất, họ cũng tạo ra giao diện người dùng đồ họa đầu + +65 +00:04:24,660 --> 00:04:29,610 +tiên cho phép người dùng tương tác với máy tính bằng cách trỏ và nhấp. + +66 +00:04:29,970 --> 00:04:33,690 +Và họ thậm chí còn phát triển con chuột đầu tiên cho phép mọi người làm điều này. + +67 +00:04:34,290 --> 00:04:37,710 +Vì vậy, đây là một chút lịch sử của Thung lũng + +68 +00:04:37,710 --> 00:04:41,130 +Silicon đặc biệt hấp dẫn. Nếu bạn quan tâm, có + +69 +00:04:41,790 --> 00:04:46,790 +một bộ phim tên là Cướp biển Thung lũng Silicon đi vào câu chuyện này chi tiết hơn và + +70 +00:04:46,890 --> 00:04:49,800 +đây là nơi tôi tìm hiểu về nó lần đầu tiên. + +71 +00:04:50,340 --> 00:04:52,020 +Nhưng quay lại với những + +72 +00:04:52,110 --> 00:04:56,850 +gì chúng tôi đang làm, tôi chỉ muốn cho bạn thấy giao diện người dùng đồ họa quan + +73 +00:04:56,880 --> 00:05:01,440 +trọng như thế nào khi nó mới xuất hiện. Vì vậy, chúng tôi sẽ học cách sử + +74 +00:05:01,500 --> 00:05:06,180 +dụng Tkinter để tạo các chương trình giao diện đồ họa của riêng mình để chúng tôi + +75 +00:05:06,180 --> 00:05:10,410 +không còn phụ thuộc vào các chương trình dựa trên bảng điều khiển hoặc dựa + +76 +00:05:10,740 --> 00:05:15,480 +trên văn bản này và chúng tôi cũng không làm việc trong playpen của mô-đun rùa . + +77 +00:05:15,780 --> 00:05:19,950 +Bây giờ chúng tôi sẽ xây dựng một số chương trình dành cho nam và nữ lớn. + +78 +00:05:20,280 --> 00:05:21,750 +Vậy hãy bắt đầu. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Creating Windows and Labels with Tkinter.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Creating Windows and Labels with Tkinter.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9d871c7d3f7cd8365bd350614a9b10299185e7ec --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Creating Windows and Labels with Tkinter.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:965d8441c9ef9ff3fab325e0a21ad8be891c9e590f58c5061fcdb6b0512d2ce0 +size 63277271 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Creating Windows and Labels with Tkinter_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Creating Windows and Labels with Tkinter_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..44b45a6dec927bb3970e1149a255b5e084a978c8 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Creating Windows and Labels with Tkinter_vi.srt @@ -0,0 +1,580 @@ +1 +00:00:00,420 --> 00:00:05,420 +Hãy bắt đầu, như thường lệ, nhập thư viện có liên quan. Tkinter, giống như mô-đun rùa, + +2 +00:00:06,750 --> 00:00:11,250 +đã được cài đặt sẵn với mọi cài đặt Python. + +3 +00:00:11,760 --> 00:00:13,380 +Miễn là bạn đã chạy + +4 +00:00:13,410 --> 00:00:17,760 +Python, thì bạn có thể chỉ cần nhập Tkinter dưới dạng mô-đun và sau + +5 +00:00:18,000 --> 00:00:22,410 +đó bạn sẽ có thể sử dụng tất cả các lớp, thuộc tính và phương + +6 +00:00:22,440 --> 00:00:24,870 +thức bên trong. Vì vậy, ví dụ, + +7 +00:00:24,870 --> 00:00:27,720 +chúng ta có thể bắt đầu bằng cách tạo một cửa + +8 +00:00:28,380 --> 00:00:31,800 +sổ mới, và điều này tương đương với các màn hình mà chúng ta + +9 +00:00:32,040 --> 00:00:34,710 +đã làm việc với rùa. Vì vậy, để làm được + +10 +00:00:34,740 --> 00:00:39,740 +điều này, chúng ta phải đào sâu vào mô-đun Tkinter và sau đó tìm một lớp có tên là Tk. + +11 +00:00:40,260 --> 00:00:43,620 +Và sau đó khi chúng ta khởi tạo một đối tượng mới từ lớp + +12 +00:00:43,860 --> 00:00:48,300 +đó, thì chúng ta sẽ có một cửa sổ. Nhưng nếu tôi chạy nó như + +13 +00:00:48,450 --> 00:00:51,330 +hiện tại, bạn sẽ thấy hoàn toàn không có gì + +14 +00:00:53,070 --> 00:00:56,550 +xảy ra và nó sẽ ngay lập tức thoát mã 0. + +15 +00:00:57,150 --> 00:01:02,070 +Và lý do cho điều này là vì chúng ta cần một cách để + +16 +00:01:02,070 --> 00:01:06,300 +giữ cửa sổ trên màn hình. Những gì Tkinter đã làm ở đây là nó tiếp tục, + +17 +00:01:06,390 --> 00:01:09,570 +tạo cửa sổ, thấy rằng không còn hướng dẫn nào nữa và sau đó về cơ bản + +18 +00:01:09,660 --> 00:01:12,360 +nó đã kết thúc chương trình. Bây giờ, những gì chúng + +19 +00:01:12,360 --> 00:01:16,890 +ta muốn thay vào đó là có một vòng lặp while về cơ bản vẫn tiếp tục chạy, vì vậy + +20 +00:01:16,890 --> 00:01:21,270 +điều gì đó giống như một thời gian là đúng. Và bên trong vòng lặp while này, + +21 +00:01:21,390 --> 00:01:26,390 +nó giữ cửa sổ này và tiếp tục lắng nghe để xem liệu người dùng sẽ làm + +22 +00:01:26,790 --> 00:01:30,900 +gì khác để tương tác với cửa sổ đó để nó có thể phản + +23 +00:01:30,900 --> 00:01:32,880 +hồi khi điều đó xảy ra. + +24 +00:01:33,300 --> 00:01:37,530 +Vì vậy, vòng lặp này được bao gồm bên trong Tkinter và tất cả + +25 +00:01:37,740 --> 00:01:42,740 +những gì bạn phải làm là khiến cửa sổ của bạn chỉ cần gọi vòng lặp chính. + +26 +00:01:44,190 --> 00:01:48,780 +Vòng lặp chính này là thứ sẽ giữ cho cửa sổ trên màn hình như thế này. + +27 +00:01:49,200 --> 00:01:54,090 +Vì vậy, bây giờ đây là cửa sổ của chúng ta và đây là dòng mã giữ nó trên màn hình và lắng nghe những gì + +28 +00:01:54,090 --> 00:01:57,990 +người dùng sẽ làm để tương tác với nó. Ví dụ, nhấp vào một + +29 +00:01:57,990 --> 00:02:00,090 +nút hoặc nhập một cái gì đó. + +30 +00:02:00,810 --> 00:02:05,810 +Bây giờ dòng mã này luôn phải ở cuối chương trình của bạn và tất cả những thứ + +31 +00:02:06,360 --> 00:02:07,860 +còn lại mà bạn + +32 +00:02:07,920 --> 00:02:11,850 +sẽ viết đi vào giữa việc tạo cửa sổ và bắt cửa sổ chạy. + +33 +00:02:13,020 --> 00:02:17,730 +Điều tiếp theo chúng ta có thể làm là chúng ta có thể thay đổi tiêu đề của chương trình đó. + +34 +00:02:18,060 --> 00:02:20,160 +Và chúng tôi đã làm điều này trước khi sử dụng rùa. + +35 +00:02:20,460 --> 00:02:24,540 +Chúng tôi chỉ gọi phương thức tiêu đề và chúng tôi cung cấp một chuỗi làm đầu vào. + +36 +00:02:24,840 --> 00:02:27,360 +Vì vậy, 'Chương trình GUI đầu tiên của tôi', và + +37 +00:02:27,810 --> 00:02:30,450 +bây giờ nếu tôi chạy lại mã của mình, thì + +38 +00:02:30,840 --> 00:02:35,610 +bạn có thể thấy rằng đây là những gì đang hiển thị ở thanh trên cùng của chương trình + +39 +00:02:35,610 --> 00:02:37,170 +của tôi. Bây giờ, những + +40 +00:02:37,200 --> 00:02:41,370 +thứ khác mà chúng ta có thể muốn thay đổi với cửa sổ là kích thước của nó. + +41 +00:02:41,460 --> 00:02:46,050 +Vì vậy, có một kích thước mặc định và cũng có một cách để thay đổi kích thước. + +42 +00:02:46,920 --> 00:02:50,930 +Và chúng ta có thể làm điều đó bằng cách khai thác một phương pháp được gọi là kích thước tối thiểu. + +43 +00:02:51,450 --> 00:02:55,560 +Cửa sổ sẽ thay đổi tỷ lệ để bao gồm tất cả các thành phần mà + +44 +00:02:55,560 --> 00:02:57,960 +bạn đặt bên trong. Nếu bạn đặt một trăm nút bên + +45 +00:02:57,960 --> 00:02:59,590 +trong, nó sẽ làm cho cửa sổ trở nên lớn. + +46 +00:02:59,950 --> 00:03:02,050 +Nhưng nếu bạn không có nhiều thứ + +47 +00:03:02,380 --> 00:03:07,380 +trong cửa sổ, thì bạn có thể muốn xác định kích thước tối thiểu để bạn có thể + +48 +00:03:07,690 --> 00:03:11,290 +chỉ định rằng, theo mặc định, tôi muốn chiều rộng của mình là, + +49 +00:03:11,320 --> 00:03:14,920 +giả sử, tôi không biết, 500 và chiều cao là 300, trừ khi + +50 +00:03:15,250 --> 00:03:17,740 +người dùng muốn thay đổi kích thước cửa sổ + +51 +00:03:18,160 --> 00:03:21,790 +hoặc có nhiều thành phần làm cho cửa sổ lớn hơn rất nhiều. + +52 +00:03:22,450 --> 00:03:23,530 +Vì vậy, khi chúng tôi + +53 +00:03:23,530 --> 00:03:28,530 +chạy mã của mình bây giờ, bạn có thể thấy đây là cửa sổ 500 pixel x 300 pixel mà chúng tôi vừa tạo + +54 +00:03:29,590 --> 00:03:31,240 +với tiêu đề tùy chỉnh của riêng mình. + +55 +00:03:32,980 --> 00:03:35,260 +Ngoài việc tạo cửa sổ, tất nhiên + +56 +00:03:35,320 --> 00:03:39,760 +chúng ta có thể tạo một số thành phần để đặt bên trong cửa sổ. + +57 +00:03:40,150 --> 00:03:41,410 +Vì vậy, trước hết + +58 +00:03:41,410 --> 00:03:46,410 +tôi muốn cho bạn thấy cách bạn tạo một nhãn. Cũng giống như cửa sổ của chúng + +59 +00:03:46,990 --> 00:03:50,740 +tôi được tạo từ mô-đun tkinker và đó là lớp Tk + +60 +00:03:51,070 --> 00:03:54,340 +đã được sử dụng, cũng có một lớp bên trong + +61 +00:03:54,430 --> 00:03:58,210 +Tkinter được gọi là nhãn. Vì vậy, chúng tôi khởi tạo một + +62 +00:03:58,240 --> 00:04:00,370 +lớp nhãn và chúng tôi có thể lưu nó vào + +63 +00:04:00,430 --> 00:04:03,670 +một biến gọi là my_label hoặc bất kỳ thứ gì khác cho vấn đề đó. + +64 +00:04:04,180 --> 00:04:08,050 +Bây giờ nhãn này có khá nhiều điều mà chúng ta có thể thay đổi về nó. + +65 +00:04:08,590 --> 00:04:13,590 +Có thể không rõ ràng từ tài liệu hoặc từ lời nhắc mà PyCharm cung cấp cho chúng tôi, nhưng + +66 +00:04:15,220 --> 00:04:16,053 +trên thực tế, + +67 +00:04:16,120 --> 00:04:21,120 +chúng tôi có thể thay đổi một thuộc tính được gọi là văn bản để chúng tôi có thể thay + +68 +00:04:21,339 --> 00:04:26,290 +đổi những gì được hiển thị bên trong nhãn. Hãy chỉ viết một số văn bản có tên 'Tôi + +69 +00:04:27,310 --> 00:04:31,150 +là một nhãn' Thật không may, điều đó thực sự không đủ để làm cho nhãn hiển thị. + +70 +00:04:31,210 --> 00:04:35,830 +Vì vậy, khi tôi chạy chương trình của mình, bạn thực sự không thấy nhãn ở bất + +71 +00:04:35,830 --> 00:04:38,830 +kỳ đâu trên màn hình. Khi chúng tôi làm việc với + +72 +00:04:38,830 --> 00:04:43,830 +Tkinter, điều chúng tôi phải làm là đầu tiên chúng tôi phải tạo một thành phần giống như + +73 +00:04:44,020 --> 00:04:44,853 +một nhãn. + +74 +00:04:45,010 --> 00:04:49,750 +Và sau đó chúng ta phải xác định thành phần đó sẽ được trình bày như thế nào + +75 +00:04:49,750 --> 00:04:51,940 +trên màn hình trước khi nó hiển thị. + +76 +00:04:52,330 --> 00:04:57,190 +Và một trong những cách dễ nhất để sắp xếp bất kỳ thành phần nào là chỉ cần nắm giữ + +77 +00:04:57,190 --> 00:05:00,640 +thành phần đó và sau đó gọi phương thức được gọi là pack. + +78 +00:05:01,150 --> 00:05:05,800 +Và điều này sẽ đặt nó vào màn hình và nó sẽ tự động căn giữa + +79 +00:05:05,800 --> 00:05:08,530 +nó trên màn hình. Vì vậy, bây giờ + +80 +00:05:08,560 --> 00:05:11,170 +nếu tôi chạy mã với sửa đổi này, bạn có + +81 +00:05:11,410 --> 00:05:16,410 +thể thấy nhãn của chúng tôi cuối cùng cũng hiển thị và nó được đóng gói để nằm + +82 +00:05:16,750 --> 00:05:18,520 +ở trung tâm của chương trình. + +83 +00:05:20,020 --> 00:05:23,740 +Bây giờ có các thuộc tính khác mà chúng ta có thể sửa đổi về nhãn của mình. + +84 +00:05:24,010 --> 00:05:27,430 +Vì vậy, chúng tôi có thể khởi tạo nhãn của mình bằng một đoạn văn bản, nhưng + +85 +00:05:27,670 --> 00:05:31,810 +chúng tôi cũng có thể chỉ định một phông chữ. Phông chữ là một lần nữa, sẽ + +86 +00:05:31,810 --> 00:05:33,010 +là một bộ, và + +87 +00:05:33,430 --> 00:05:36,670 +bộ tuple đó trước tiên sẽ lấy tên của phông chữ, vì + +88 +00:05:36,700 --> 00:05:38,890 +vậy hãy giả sử tôi muốn sử dụng Arial, + +89 +00:05:39,340 --> 00:05:42,310 +và sau đó nó sẽ lấy kích thước của phông chữ. + +90 +00:05:42,340 --> 00:05:47,290 +Vì vậy, hãy làm cho nó lớn hơn một chút, có thể là một phông chữ cỡ 24. Và cuối cùng, sẽ là xem, + +91 +00:05:47,290 --> 00:05:51,820 +nếu nó in đậm hay nghiêng hoặc, ừm, chúng ta hãy + +92 +00:05:51,850 --> 00:05:56,110 +đặt nó thành in đậm. Và bây giờ nếu tôi chạy lại mã của + +93 +00:05:56,470 --> 00:06:00,350 +mình, bạn có thể thấy bây giờ tôi đã có một phông chữ Arial, kích thước 24 + +94 +00:06:00,620 --> 00:06:01,970 +và nó được in đậm. + +95 +00:06:02,780 --> 00:06:07,780 +Bạn cũng có thể thay đổi mục này thành chữ nghiêng hoặc bạn có thể chỉ cần bỏ qua nó và bỏ qua mục cuối + +96 +00:06:09,110 --> 00:06:12,590 +cùng đó và nó sẽ chỉ cung cấp cho bạn một đoạn văn bản thông thường. + +97 +00:06:13,130 --> 00:06:18,130 +Nhưng điều này sẽ không hiển thị trừ khi bạn có dòng mã này, nơi bạn thực sự sử dụng trình đóng gói + +98 +00:06:18,260 --> 00:06:23,090 +để đóng gói nhãn của chúng tôi lên màn hình. Bây giờ trong tài nguyên khóa học, + +99 +00:06:23,090 --> 00:06:24,290 +tôi đã + +100 +00:06:24,290 --> 00:06:29,290 +liên kết đến tài liệu Tkinter về tài liệu Python và họ nói về + +101 +00:06:29,990 --> 00:06:32,720 +trình đóng gói chi tiết hơn rất nhiều. + +102 +00:06:33,200 --> 00:06:36,020 +Về cơ bản nó là một hệ thống quản lý hình học. + +103 +00:06:36,020 --> 00:06:40,130 +Đó chỉ là một cách đơn giản để sắp xếp các thành phần mà bạn đang xây dựng. + +104 +00:06:40,820 --> 00:06:45,440 +Và trình đóng gói này có một số tùy chọn. Vì vậy, nếu chúng tôi cuộn xuống, + +105 +00:06:45,440 --> 00:06:50,440 +bạn có thể thấy rằng chúng tôi có thể thay đổi mở rộng thành boolean, đúng hay sai. + +106 +00:06:50,900 --> 00:06:55,340 +Và điều đó cho nó biết liệu nó có nên mở rộng để chiếm toàn bộ không gian + +107 +00:06:55,340 --> 00:06:58,910 +hay ở mức nhỏ nhất có thể. Ngoài ra, bạn có những + +108 +00:06:58,910 --> 00:07:01,730 +thứ như bên thay đổi bên nào nên + +109 +00:07:01,730 --> 00:07:05,750 +được đóng gói, bên trái, bên phải, trên cùng hay dưới cùng? + +110 +00:07:06,710 --> 00:07:10,040 +Vì vậy, chúng tôi biết rằng hiện tại nhãn của chúng tôi + +111 +00:07:10,340 --> 00:07:15,340 +đang ở giữa, nhưng nếu tôi thay đổi bên thành bên trái bằng nhau, bây giờ khi tôi chạy + +112 +00:07:16,580 --> 00:07:18,080 +mã, bạn có thể thấy + +113 +00:07:18,110 --> 00:07:21,590 +nó bây giờ đã được đóng gói ở bên trái của màn hình. + +114 +00:07:21,920 --> 00:07:24,800 +Và nếu tôi nói dưới cùng, thì nó sẽ đi đến + +115 +00:07:26,000 --> 00:07:30,680 +dưới cùng và bên phải và trên cùng. Tất cả những thứ đó sẽ hoạt động. + +116 +00:07:31,790 --> 00:07:34,370 +Và nếu tôi thay đổi mở rộng thành true, bạn có + +117 +00:07:34,400 --> 00:07:38,330 +thể thấy nó hiện đang cố gắng chiếm toàn bộ chiều cao và chiều rộng của kích + +118 +00:07:38,330 --> 00:07:41,240 +thước màn hình có sẵn. Bây giờ, khi bạn đang + +119 +00:07:41,240 --> 00:07:43,850 +viết hàm pack này ở đây, ngay khi tôi + +120 +00:07:44,510 --> 00:07:48,290 +nhập pack và mở dấu ngoặc đơn của mình, thông thường chúng ta đã + +121 +00:07:48,710 --> 00:07:53,570 +quen với toàn bộ các thuộc tính được liệt kê ở đây cho chúng ta và chúng ta + +122 +00:07:53,900 --> 00:07:57,800 +có thể chỉ định từng thuộc tính và chọn và chọn về cơ bản. + +123 +00:07:58,400 --> 00:08:01,130 +Nhưng trong trường hợp này, đây là tất cả những gì chúng ta thấy. + +124 +00:08:01,310 --> 00:08:06,310 +Vậy điều gì đang xảy ra ở đây? So sánh điều này với khi chúng tôi sử dụng mô-đun rùa + +125 +00:08:07,460 --> 00:08:11,810 +và tôi sẽ xây dựng một con rùa Tim rùa. rùa. + +126 +00:08:13,040 --> 00:08:16,340 +Và sau đó tôi nói, thời gian. viết. Hãy xem cách, + +127 +00:08:16,370 --> 00:08:19,910 +khi tôi mở dấu ngoặc đơn ở đây, bạn có thể thấy + +128 +00:08:19,910 --> 00:08:23,360 +có đối số là Đối tượng sẽ được viết và sau đó + +129 +00:08:23,360 --> 00:08:26,960 +liệu có nên di chuyển chữ viết xuống góc dưới cùng, nó nên + +130 +00:08:27,350 --> 00:08:29,000 +được căn chỉnh theo hướng + +131 +00:08:29,000 --> 00:08:34,000 +nào, điều gì phông chữ và tất cả các đầu vào có sẵn mà chúng tôi có + +132 +00:08:34,580 --> 00:08:39,140 +thể cung cấp cho chức năng viết này. Bây giờ so sánh nó với chức năng gói của chúng tôi ở đây. + +133 +00:08:39,830 --> 00:08:43,520 +Điều này, bạn sẽ nhận thấy, thực sự khác biệt. Bây giờ, nếu bạn thực + +134 +00:08:43,549 --> 00:08:47,930 +sự nhìn vào tài liệu cho gói, bạn có thể thấy nó thực sự + +135 +00:08:48,170 --> 00:08:51,980 +có một số thứ mà chúng ta có thể thay đổi; trước, + +136 +00:08:51,980 --> 00:08:56,190 +mở rộng, điền vào, vào trong, bên cạnh và tất cả những thứ này + +137 +00:08:56,460 --> 00:09:00,090 +có thể sửa đổi và thực hiện nhiều việc khác nhau. + +138 +00:09:00,480 --> 00:09:04,950 +Nhưng làm thế nào mà nó dường như không tồn tại như một trong những đối số + +139 +00:09:04,950 --> 00:09:08,820 +mà chúng ta có thể sử dụng? Bí mật nằm ở + +140 +00:09:08,880 --> 00:09:13,230 +phần cuối cùng này, ** kw. Và trong bài học tiếp theo, chúng + +141 +00:09:13,530 --> 00:09:17,910 +ta sẽ nói về một số tính năng nâng cao hơn của các đối số trong Python. + +142 +00:09:18,270 --> 00:09:22,020 +Và chúng ta sẽ xem xét cách chúng ta có thể cung cấp các giá trị đối số + +143 +00:09:22,320 --> 00:09:27,320 +mặc định, cách chúng ta có thể xác định đối số vị trí không giới hạn và đối số từ khóa không giới hạn. + +144 +00:09:28,260 --> 00:09:30,990 +Để hiểu rõ hơn về vấn đề này, hãy chuyển sang bài + +145 +00:09:31,260 --> 00:09:34,290 +học tiếp theo và chúng ta sẽ đi sâu về các đối số trong Python. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Python-Docs-The-Packer.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Python-Docs-The-Packer.url new file mode 100644 index 0000000000000000000000000000000000000000..bb462a539d48e1e2c7b8574b00f0719882aed7b4 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 Python-Docs-The-Packer.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/tkinter.html#the-packer \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 TCL-tk-Docs-pack-.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 TCL-tk-Docs-pack-.url new file mode 100644 index 0000000000000000000000000000000000000000..d710ab1845af746f2034a36cd28c368de70d6a98 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/003 TCL-tk-Docs-pack-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://tcl.tk/man/tcl8.6/TkCmd/pack.htm \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/004 Setting Default Values for Optional Arguments inside a Function Header.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/004 Setting Default Values for Optional Arguments inside a Function Header.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f0bd6fd8eddabf2f5034cfc510174bc279c32e31 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/004 Setting Default Values for Optional Arguments inside a Function Header.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0b792dd449fe2098b12e6b3985cdab436c32f01e96f4de5131a9f76e4ff56a3 +size 49667257 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/004 Setting Default Values for Optional Arguments inside a Function Header_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/004 Setting Default Values for Optional Arguments inside a Function Header_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d11812b24d088ee12cd786a31700d5ecce145cef --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/004 Setting Default Values for Optional Arguments inside a Function Header_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,210 --> 00:00:05,210 +Trong bài học trước, chúng ta đã thấy sự khác biệt như thế nào khi chúng ta cố gắng + +2 +00:00:05,400 --> 00:00:06,480 +sử dụng hàm + +3 +00:00:06,780 --> 00:00:11,780 +ghi của con rùa và chúng ta thấy tất cả các đối số có sẵn được liệt kê, so + +4 +00:00:12,210 --> 00:00:14,940 +với khi chúng ta cố gắng sử dụng phương thức gói + +5 +00:00:15,330 --> 00:00:20,100 +của nhãn Tkinter và hãy chú ý rằng thực tế có rất ít đối số được liệt kê. + +6 +00:00:20,520 --> 00:00:24,000 +Tuy nhiên, bằng cách nào đó, có tất cả các thông số này + +7 +00:00:24,240 --> 00:00:28,650 +mà chúng ta có thể thay đổi khi xem tài liệu, như mở rộng hoặc bên cạnh. + +8 +00:00:29,010 --> 00:00:32,340 +Vì vậy, hãy đặt cạnh đó bằng bên trái, và + +9 +00:00:32,700 --> 00:00:35,730 +tôi sẽ xóa phần còn lại của mã rùa. + +10 +00:00:36,150 --> 00:00:41,150 +Và bây giờ bạn có thể thấy nhãn của chúng tôi được đặt ở phía bên trái của màn hình của chúng tôi. + +11 +00:00:42,900 --> 00:00:45,030 +Làm thế nào mà các tham số này, mặc dù + +12 +00:00:45,090 --> 00:00:48,090 +chúng không được liệt kê trong danh sách thuộc tính, làm thế nào chúng ta + +13 +00:00:48,330 --> 00:00:52,770 +có thể sử dụng chúng chỉ bằng cách nhập chúng vào? Để hiểu được điều này, chúng + +14 +00:00:52,800 --> 00:00:57,510 +ta phải tìm hiểu thêm một chút về các lập luận nâng cao. + +15 +00:00:57,900 --> 00:00:59,430 +Không phải cách lập + +16 +00:00:59,520 --> 00:01:04,519 +luận tốt hơn, mà là cách sử dụng các đối số Python nâng cao để chỉ định + +17 +00:01:06,330 --> 00:01:07,890 +phạm vi đầu vào rộng hơn. + +18 +00:01:08,790 --> 00:01:12,870 +Chúng tôi đã thấy cách các đối số từ khóa hoạt động. Ví dụ, ở đây tôi + +19 +00:01:12,870 --> 00:01:17,430 +có một hàm và tôi có ba đối số từ khóa, a, + +20 +00:01:17,490 --> 00:01:20,280 +b và c. Và khi tôi gọi hàm, + +21 +00:01:20,610 --> 00:01:25,320 +tôi có thể cung cấp các đầu vào đó, a, b và c theo bất kỳ thứ tự nào tôi + +22 +00:01:25,650 --> 00:01:27,930 +muốn miễn là tôi có từ khóa ở phía trước. + +23 +00:01:27,990 --> 00:01:31,020 +Vậy c = 3, a = 1, và b = 2. + +24 +00:01:31,980 --> 00:01:34,980 +Bây giờ điều gì sẽ xảy ra nếu khi tôi sử dụng + +25 +00:01:35,370 --> 00:01:40,370 +hàm này, nó là chín trong số mười lần, a sẽ bằng 1, b là 2 và c là 3. + +26 +00:01:41,460 --> 00:01:46,110 +Tại sao khi tôi gọi hàm, tôi luôn phải đặt các giá trị này? + +27 +00:01:46,170 --> 00:01:48,510 +Điều đó có vẻ hơi lãng phí công sức, phải không? + +28 +00:01:49,020 --> 00:01:53,850 +Python có một cách rất gọn gàng để giải quyết vấn đề này bằng cách tạo ra các đối số + +29 +00:01:53,940 --> 00:01:55,320 +có giá trị mặc định. + +30 +00:01:55,830 --> 00:01:59,160 +Chúng ta có thể làm điều này bằng cách thay đổi khai báo hàm. + +31 +00:01:59,550 --> 00:02:01,470 +Vì vậy, khi chúng ta tạo hàm của mình, chúng ta + +32 +00:02:01,590 --> 00:02:05,970 +đã có thể cung cấp cho nó một số giá trị để bắt đầu. Vì vậy, chúng ta có thể nói rằng + +33 +00:02:05,970 --> 00:02:09,870 +a phải bằng 1, b = 2 và c = 3, và đây là các + +34 +00:02:09,940 --> 00:02:11,370 +giá trị mặc định. + +35 +00:02:11,790 --> 00:02:15,900 +Vì vậy, điều đó có nghĩa là khi tôi gọi hàm này và tôi muốn sử dụng các + +36 +00:02:16,290 --> 00:02:20,670 +giá trị mặc định, tôi thực sự không phải cung cấp bất kỳ đầu vào nào và nó sẽ hoạt + +37 +00:02:20,670 --> 00:02:22,740 +động như trước đây. Tuy nhiên, bây + +38 +00:02:22,800 --> 00:02:26,400 +giờ, nếu tôi muốn sửa đổi một trong những đầu vào đó, giả sử tôi + +39 +00:02:26,430 --> 00:02:29,220 +muốn cung cấp một giá trị tùy chỉnh cho b thay vì + +40 +00:02:29,520 --> 00:02:32,880 +để nó bằng giá trị mặc định là 2, thì tôi chỉ có thể + +41 +00:02:32,880 --> 00:02:37,880 +thay đổi giá trị của b , b = 5. Và phần còn lại, vì vậy a + +42 +00:02:38,640 --> 00:02:42,240 +và c, vẫn sẽ nhận các giá trị mặc định của chúng. + +43 +00:02:42,990 --> 00:02:46,140 +Để ý khi tôi gọi cho tim. write, phương thức ghi này + +44 +00:02:46,590 --> 00:02:50,730 +có năm đầu vào; self, bởi vì nó là một phương thức và + +45 +00:02:50,760 --> 00:02:54,240 +được liên kết với lớp rùa, nó có một đối số + +46 +00:02:54,690 --> 00:02:57,750 +là những gì nó sẽ viết, di chuyển, căn chỉnh + +47 +00:02:58,050 --> 00:03:00,910 +và phông chữ. Bây giờ, nếu tôi + +48 +00:03:01,360 --> 00:03:04,690 +muốn sử dụng thời gian. rùa để chỉ cần viết + +49 +00:03:04,690 --> 00:03:06,370 +một số loại văn bản, tôi + +50 +00:03:08,350 --> 00:03:12,820 +thực sự có thể chỉ cần đưa vào này. Và khi tôi chạy đoạn mã này, bạn + +51 +00:03:13,720 --> 00:03:17,320 +sẽ thấy rằng tôi có một số đoạn văn bản đang được viết. + +52 +00:03:18,280 --> 00:03:22,300 +Nhưng làm thế nào mà tôi có tất cả các đầu vào khác mà về cơ + +53 +00:03:22,360 --> 00:03:26,620 +bản tôi đã hoàn toàn bỏ qua? Còn về việc di chuyển? + +54 +00:03:26,650 --> 00:03:31,000 +Còn về căn chỉnh? Còn về phông chữ? Như bạn + +55 +00:03:31,330 --> 00:03:34,330 +có thể thấy, họ có = ... điều này đang cố gắng cho bạn biết rằng chúng đã có một giá trị mặc định. + +56 +00:03:34,660 --> 00:03:38,860 +Và trên thực tế, nếu tôi di chuột qua chức năng ghi này, + +57 +00:03:39,370 --> 00:03:42,160 +bạn có thể thấy rằng trong các tài + +58 +00:03:42,220 --> 00:03:45,940 +liệu nhanh bật lên, nó cho tôi biết rằng đối số, 1: + +59 +00:03:46,150 --> 00:03:47,860 +hoặc arg, là những + +60 +00:03:48,210 --> 00:03:50,100 +gì nó được ghi vào màn + +61 +00:03:50,490 --> 00:03:54,450 +hình, di chuyển là tùy chọn có thể được đặt là đúng + +62 +00:03:54,510 --> 00:03:58,380 +hoặc sai, căn chỉnh là tùy chọn, phông chữ là tùy chọn. + +63 +00:03:58,380 --> 00:04:01,140 +Lý do tại sao chúng là tùy chọn + +64 +00:04:01,710 --> 00:04:06,420 +là vì tất cả những thứ này thực sự có giá trị mặc định. Ví dụ, di chuyển, theo mặc định, là sai; căn chỉnh theo + +65 +00:04:06,420 --> 00:04:07,860 +mặc + +66 +00:04:07,860 --> 00:04:12,860 +định là căn giữa và cũng có một phông chữ mặc định. + +67 +00:04:14,070 --> 00:04:15,960 +Vì vậy, điều đó có nghĩa là tất cả những gì chúng ta phải làm chỉ là cung cấp các đối số được yêu cầu. + +68 +00:04:16,920 --> 00:04:21,920 +Nếu tôi không thêm bất cứ điều gì khi tôi gọi phương thức ghi này, + +69 +00:04:23,340 --> 00:04:27,930 +bạn có thể thấy rằng tôi thực sự gặp lỗi ở đây. + +70 +00:04:27,930 --> 00:04:30,090 +Và nó nói rằng viết đang thiếu + +71 +00:04:30,300 --> 00:04:34,650 +một đối số vị trí bắt buộc, đó là đối số đầu tiên đó là + +72 +00:04:34,890 --> 00:04:37,260 +đối số mà nó mong đợi để viết. Ý tôi là, nếu bạn đang gọi rùa để + +73 +00:04:37,620 --> 00:04:41,130 +viết một số bài viết và + +74 +00:04:41,130 --> 00:04:44,520 +bạn không bảo nó phải viết gì, đó là một chút vấn đề. + +75 +00:04:44,790 --> 00:04:45,870 +Vì vậy, ARG này là một đối số bắt buộc vì nó không có điều đó = ... + +76 +00:04:46,200 --> 00:04:51,200 +cuối cùng. Vì vậy, cái này bạn phải cung cấp. Nhưng một khi bạn đã làm điều đó, thì phần còn lại của + +77 +00:04:52,590 --> 00:04:56,910 +chúng đều có giá trị mặc định. + +78 +00:04:56,940 --> 00:04:59,430 +Họ đã biết cách cư xử và phải làm gì ngay + +79 +00:04:59,430 --> 00:05:01,710 +cả khi bạn không nói thêm điều gì cho họ. Tuy nhiên, bây giờ, nếu bạn muốn sửa + +80 +00:05:02,010 --> 00:05:05,850 +đổi một trong những đối + +81 +00:05:05,850 --> 00:05:08,640 +số đó, giả sử tôi quyết định thay đổi phông + +82 +00:05:08,700 --> 00:05:12,990 +chữ thành một cái gì đó hoàn toàn khác như Times New Roman, và tạo + +83 +00:05:13,110 --> 00:05:18,110 +phông chữ cỡ chữ siêu lớn 80 và thay đổi nó thành chữ đậm, sau đó bạn có + +84 +00:05:18,870 --> 00:05:22,710 +thể thấy rằng cài đặt tùy chọn đó được triển khai và bây giờ + +85 +00:05:23,220 --> 00:05:28,220 +nó đã thay đổi phông chữ và thay đổi kích thước và cũng làm cho nó in đậm. + +86 +00:05:28,650 --> 00:05:32,490 +1: Nhưng điều này hoàn toàn + +87 +00:05:33,120 --> 00:05:35,100 +không bắt buộc. + +88 +00:05:35,160 --> 00:05:36,510 +Và đây là tất cả để tạo hàm với các giá trị mặc định. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/005 Default Values Quiz.html b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/005 Default Values Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..49f7fc2b7c97d7a393fbefa91a7c28c3c042b9d3 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/005 Default Values Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/006 args Many Positional Arguments.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/006 args Many Positional Arguments.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e7540fb2609ef908a5c026b39c34f9dd225059fe --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/006 args Many Positional Arguments.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76db795bc49d8e5cf4be03a1c13f81ab566191cd946710d8cda861ebb42aa5c2 +size 22473520 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/006 args Many Positional Arguments_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/006 args Many Positional Arguments_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..137746c1dd937b366a42588d160703ef7e55b010 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/006 args Many Positional Arguments_vi.srt @@ -0,0 +1,348 @@ +1 +00:00:00,090 --> 00:00:01,080 +Trong bài học trước, + +2 +00:00:01,170 --> 00:00:05,010 +chúng ta đã xem xét cách cung cấp giá trị mặc định cho các đối số tùy chọn. + +3 +00:00:05,340 --> 00:00:08,100 +Trong bài học này, chúng ta sẽ thảo luận về cách tạo các hàm + +4 +00:00:08,189 --> 00:00:10,290 +có thể nhận bất kỳ số lượng đối số nào. + +5 +00:00:10,800 --> 00:00:13,680 +Giả sử rằng chúng ta có một hàm được + +6 +00:00:13,980 --> 00:00:18,660 +gọi là add, thêm n1 và n2 và nó chỉ trả về tổng của các số đó. + +7 +00:00:19,020 --> 00:00:23,850 +Điều đó rất tốt và tốt, nhưng nếu tôi muốn thêm nhiều hơn hai số thì sao? + +8 +00:00:23,940 --> 00:00:28,080 +Vâng, tôi sẽ phải thêm n1, n2, n3, n4, nhưng sau đó tôi + +9 +00:00:28,320 --> 00:00:31,020 +sẽ phải thêm bốn số mỗi lần. + +10 +00:00:31,500 --> 00:00:36,500 +Vì vậy, điều gì sẽ xảy ra nếu tôi muốn làm cho hàm này linh hoạt hơn và cho phép bất kỳ số lượng đối + +11 +00:00:37,080 --> 00:00:40,740 +số nào được sử dụng làm đầu vào? Điều tôi có thể làm + +12 +00:00:40,830 --> 00:00:45,750 +là chỉ cần thay đổi mã để sử dụng asterix này và sau đó là + +13 +00:00:45,900 --> 00:00:48,060 +tên của tham số của tôi. + +14 +00:00:48,810 --> 00:00:52,110 +Tên args đó theo quy ước là thứ mà hầu hết + +15 +00:00:52,140 --> 00:00:57,120 +các nhà phát triển Python sẽ sử dụng. Và nó chỉ đơn giản là viết tắt của các đối số. + +16 +00:00:57,420 --> 00:01:00,120 +Nhưng bạn không cần phải đặt tên đó nếu bạn không muốn. + +17 +00:01:01,230 --> 00:01:05,430 +Nhưng những gì bạn cần là ma trận đó. Đó là phần thực sự quan trọng. + +18 +00:01:05,910 --> 00:01:10,910 +Điều nói với Python là hàm thêm này có thể chấp nhận bất kỳ số lượng đối số nào. + +19 +00:01:13,110 --> 00:01:15,210 +Và khi ở bên trong hàm, bạn + +20 +00:01:15,240 --> 00:01:17,850 +thực sự có thể lặp qua tất cả các đối + +21 +00:01:18,090 --> 00:01:22,770 +số sẽ ở dạng một bộ tuple và bạn có thể làm bất cứ điều gì bạn + +22 +00:01:22,770 --> 00:01:24,690 +muốn với mỗi đối số đó. + +23 +00:01:25,140 --> 00:01:29,520 +Thay vì bây giờ chỉ truyền vào hai đối số vì điều đó đã được sửa khi chúng ta + +24 +00:01:29,520 --> 00:01:34,200 +tạo hàm, giờ đây chúng ta có thể truyền vào bất kỳ số lượng giá trị nào như bốn giá trị + +25 +00:01:34,290 --> 00:01:36,660 +hoặc bảy giá trị và chúng ta có thể làm + +26 +00:01:36,960 --> 00:01:41,640 +bất cứ điều gì chúng ta muốn với chúng. Hãy thử mã này ra. + +27 +00:01:41,670 --> 00:01:44,940 +Tôi sẽ xóa mã liên quan đến Python rùa và tôi sẽ tạo + +28 +00:01:45,300 --> 00:01:49,980 +một tệp mới có tên là sân chơi. py + +29 +00:01:50,640 --> 00:01:54,720 +Và chúng tôi sẽ sử dụng sân chơi này. py để kiểm tra những gì chúng ta vừa học được. + +30 +00:01:55,560 --> 00:01:59,820 +Tôi muốn bạn suy nghĩ về những gì bạn vừa thấy trong các trang + +31 +00:01:59,820 --> 00:02:04,820 +trình bày và xem liệu bạn có thể tạo một hàm được gọi là add, nơi + +32 +00:02:05,610 --> 00:02:06,420 +bạn có + +33 +00:02:06,420 --> 00:02:11,420 +thể chuyển bao nhiêu số tùy thích và nó sẽ luôn cộng tất cả các số + +34 +00:02:12,060 --> 00:02:16,080 +đang được truyền lại với nhau. vào hàm làm đầu vào, rồi + +35 +00:02:16,080 --> 00:02:19,470 +trả về tổng giá trị. Tạm dừng video và xem bạn có thể tiếp tục không. + +36 +00:02:21,210 --> 00:02:21,600 +Được rồi. + +37 +00:02:21,600 --> 00:02:26,600 +Vì vậy, những gì chúng ta muốn làm là có thể gọi phương thức này là add, ví dụ ở + +38 +00:02:26,790 --> 00:02:30,270 +đây và truyền vào bất kỳ số lượng giá trị nào, phải không? + +39 +00:02:30,300 --> 00:02:32,550 +Hãy bắt đầu với ba người. + +40 +00:02:33,090 --> 00:02:38,090 +Và sau đó chúng tôi muốn nhận tất cả các giá trị đó bên trong hàm này và sau đó + +41 +00:02:38,400 --> 00:02:42,300 +cộng tất cả chúng lại với nhau. Vì vậy, chúng tôi sẽ sử dụng thủ thuật asterix đó. + +42 +00:02:42,450 --> 00:02:47,130 +Vì vậy, một * và sau đó chúng ta có thể đặt tên cho các đối số mà + +43 +00:02:47,490 --> 00:02:49,860 +chúng ta nhận được, thường được gọi là args. + +44 +00:02:51,450 --> 00:02:53,280 +Bây giờ chúng tôi đã có những + +45 +00:02:53,490 --> 00:02:58,490 +args này, nếu tôi thực sự tiếp tục và in nó ra và chúng tôi chạy và sau đó chạy và thay đổi + +46 +00:03:01,750 --> 00:03:06,640 +điều này thành sân chơi của chúng tôi, bạn có thể thấy nó về cơ bản chỉ là in ra một tuple. + +47 +00:03:07,090 --> 00:03:11,410 +Và tuple đó đại diện cho tất cả các đầu vào đã được chuyển vào khi + +48 +00:03:11,410 --> 00:03:13,900 +hàm này được gọi. Và trên thực + +49 +00:03:13,900 --> 00:03:18,840 +tế, nếu tôi kiểm tra thời gian trên args này, bạn có thể thấy nó thực sự + +50 +00:03:18,840 --> 00:03:21,850 +là một bộ giá trị. Bây giờ, khi chúng ta + +51 +00:03:21,850 --> 00:03:26,140 +đã nắm được bộ kéo args này, chúng ta thực sự có thể lặp lại nó. + +52 +00:03:26,320 --> 00:03:30,610 +Vì vậy, chúng ta có thể nói với n trong args, với mỗi + +53 +00:03:30,640 --> 00:03:35,260 +số trong bộ giá trị đó, hãy tiếp tục và in từng số đó. + +54 +00:03:36,280 --> 00:03:39,940 +Bạn có thể thấy nó bây giờ đã tách chúng ra; ba, năm và sáu. + +55 +00:03:40,270 --> 00:03:42,910 +Vì vậy, điều đó giúp chúng tôi đủ dễ dàng để tạo tổng. + +56 +00:03:43,240 --> 00:03:45,700 +Vì vậy, hãy tạo một tổng bằng không. + +57 +00:03:46,060 --> 00:03:48,550 +Và sau đó thay vì in ra từng chữ + +58 +00:03:48,580 --> 00:03:53,560 +n, chúng ta chỉ có thể cộng n vào tổng, và cuối cùng bên ngoài vòng lặp, chúng + +59 +00:03:53,590 --> 00:03:55,600 +ta sẽ trả về tổng của mình. + +60 +00:03:56,350 --> 00:04:00,880 +Vì vậy, bây giờ khi chúng tôi in kết quả cuối cùng này bằng cách gọi thêm ba, năm, sáu, bạn + +61 +00:04:00,880 --> 00:04:04,750 +có thể thấy nó hiện đã được thêm ba, năm và sáu và chúng ta có thể + +62 +00:04:05,020 --> 00:04:09,220 +gọi phương thức này theo nhiều cách khác nhau. Chúng tôi có thể thêm nhiều giá + +63 +00:04:09,460 --> 00:04:13,630 +trị hơn vào nó, hai và một, và bạn có thể thấy nó hiện bằng 17. + +64 +00:04:13,990 --> 00:04:18,990 +Và về cơ bản bạn có thể tiếp tục vì nó có thể nhận bất kỳ số lượng giá trị nào. + +65 +00:04:19,779 --> 00:04:23,710 +Tất cả điều này được thực hiện bởi từ khóa asterix này. + +66 +00:04:24,280 --> 00:04:29,280 +Và về cơ bản, nó đóng gói tất cả những số này mà bạn đã nhập làm đầu vào vào một + +67 +00:04:30,070 --> 00:04:33,790 +bộ tuple được gọi là bất cứ thứ gì bạn muốn nó được gọi. + +68 +00:04:34,120 --> 00:04:37,660 +Vì vậy, bạn có thể gọi nó là số nếu bạn muốn, hoặc bạn + +69 +00:04:37,690 --> 00:04:42,400 +có thể giữ nguyên mặc định, chỉ là args. Và sau đó khi chúng ta đã có các args bên trong hàm, chúng ta lặp lại nó + +70 +00:04:42,430 --> 00:04:47,080 +và chúng ta có thể làm bất cứ điều gì chúng ta muốn với mỗi giá trị. Bây giờ, ngoài việc lặp qua nó, bạn + +71 +00:04:47,110 --> 00:04:48,640 +cũng có thể truy + +72 +00:04:48,670 --> 00:04:53,200 +cập chúng bằng chỉ mục vì xét cho cùng thì nó cũng là một tuple. + +73 +00:04:53,200 --> 00:04:57,250 +Vì vậy, chúng ta có thể nói args ở vị trí 0 như thế này. + +74 +00:04:57,280 --> 00:04:58,780 +Và nếu tôi in nó + +75 +00:04:59,260 --> 00:05:03,550 +ra, bạn sẽ thấy rằng giá trị là ba vì giá trị đầu tiên là ba. + +76 +00:05:04,390 --> 00:05:08,260 +Vì vậy, đó là lý do tại sao các đối số không giới + +77 +00:05:08,290 --> 00:05:12,340 +hạn sử dụng * args này còn được gọi là đối số vị trí không + +78 +00:05:12,610 --> 00:05:17,320 +giới hạn, bởi vì vị trí của các đối số mà bạn truyền vào hàm có ý + +79 +00:05:17,350 --> 00:05:22,350 +nghĩa rất lớn vì nếu tôi tìm nạp đối số ở vị trí một, nó sẽ không còn + +80 +00:05:22,630 --> 00:05:25,030 +nữa ba, và bây giờ sẽ là năm. + +81 +00:05:26,140 --> 00:05:31,140 +Vì vậy, đây là một cách để chúng ta có thể xác định một hàm và chỉ định số lượng + +82 +00:05:34,300 --> 00:05:38,980 +đầu vào không giới hạn hoặc không xác định. Nói cách khác, số lượng đối số cho + +83 +00:05:39,070 --> 00:05:43,690 +hàm có thể thay đổi vì toán tử asterix thu thập tất cả các + +84 +00:05:43,930 --> 00:05:47,860 +đối số thành một bộ. Tuy nhiên, điều gì sẽ xảy ra + +85 +00:05:47,890 --> 00:05:52,720 +nếu chúng ta muốn đề cập đến các lập luận của mình bằng tên thay vì vị trí? + +86 +00:05:53,230 --> 00:05:56,140 +Chà, đó chính xác là những gì chúng ta sẽ nói đến trong bài học tiếp theo. + +87 +00:05:56,460 --> 00:05:57,010 +Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 Playground.py-Completed-Code.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 Playground.py-Completed-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..7d5dbd6af6675ee282735ef9027c61e032d58e03 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 Playground.py-Completed-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-27-playground \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 kwargs Many Keyword Arguments.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 kwargs Many Keyword Arguments.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..449582250a79fee854f2a3916651e2905dfe265a --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 kwargs Many Keyword Arguments.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd2f53fe0dd55b62b4c2eb3f27b07e08a0eb1dc3446505bd4b20031e7c9b3d6c +size 86338563 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 kwargs Many Keyword Arguments_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 kwargs Many Keyword Arguments_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..240b30d4467ba92a60022e63baf44ad9759014ba --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/007 kwargs Many Keyword Arguments_vi.srt @@ -0,0 +1,548 @@ +1 +00:00:00,480 --> 00:00:03,330 +Trong bài học trước, chúng ta đã biết cách sử dụng toán tử + +2 +00:00:03,330 --> 00:00:07,320 +asterix để cung cấp bất kỳ số lượng đối số vị trí nào cho một hàm vì + +3 +00:00:07,680 --> 00:00:11,370 +nó thu thập chúng thành một bộ. Trong bài học này, chúng ta + +4 +00:00:11,430 --> 00:00:14,130 +sẽ xem xét toán tử asterix kép và điều + +5 +00:00:14,430 --> 00:00:18,750 +này sẽ cho phép chúng ta làm việc với một số đối số từ + +6 +00:00:18,750 --> 00:00:20,940 +khóa tùy ý. Hãy xem điều này trong hành động. + +7 +00:00:21,600 --> 00:00:24,360 +Vì vậy, giả sử tôi tạo một hàm khác có tên là tính toán, + +8 +00:00:24,720 --> 00:00:29,160 +và lần này tôi sẽ thêm hai tiểu hành tinh. Và trong trường hợp này, tôi + +9 +00:00:29,220 --> 00:00:34,220 +sẽ gọi đối số của mình là ** kwargs hoặc đối số từ khóa. + +10 +00:00:34,770 --> 00:00:39,770 +Những gì chúng tôi đã làm bây giờ là chúng tôi đã thêm hai dấu hoa thị vào + +11 +00:00:39,900 --> 00:00:40,733 +trước tên + +12 +00:00:41,160 --> 00:00:45,630 +thông số này và hiện chúng tôi đã tạo các đối số từ khóa không giới hạn. + +13 +00:00:46,080 --> 00:00:51,080 +Điều này cho phép tôi làm là về cơ bản bây giờ tôi có thể gọi hàm tính toán + +14 +00:00:52,380 --> 00:00:57,090 +này, tôi có thể chuyển vào một đối số từ khóa, ví dụ: thêm, và hãy cung + +15 +00:00:57,210 --> 00:01:00,210 +cấp cho nó một giá trị, có thể là ba, và + +16 +00:01:00,510 --> 00:01:04,739 +sau đó hãy thêm một đối số từ khóa khác mà tôi sẽ gọi nhân, + +17 +00:01:05,069 --> 00:01:08,910 +đặt giá trị đó bằng năm. Và thực sự thứ + +18 +00:01:08,940 --> 00:01:13,140 +mà nó đã được biến thành những ** kwargs, về cơ + +19 +00:01:13,500 --> 00:01:18,210 +bản là một cuốn từ điển. Vì vậy, nếu tôi in những ** kwargs này, + +20 +00:01:18,810 --> 00:01:23,040 +bạn có thể thấy những gì được in về cơ bản là một từ điển chuẩn mực. + +21 +00:01:23,490 --> 00:01:26,790 +Và trên thực tế, nếu chúng ta thực hiện lại việc kiểm tra kiểu đó, hãy nhập, bạn + +22 +00:01:28,620 --> 00:01:30,900 +có thể thấy nó thực chất là một cuốn từ điển. + +23 +00:01:31,920 --> 00:01:36,810 +Từ điển này về cơ bản đại diện cho từng đối số từ khóa và giá trị + +24 +00:01:36,810 --> 00:01:37,643 +của chúng. + +25 +00:01:37,950 --> 00:01:42,570 +Vì vậy, thêm bây giờ là một khóa và ba bây giờ là giá trị, nhân là + +26 +00:01:42,570 --> 00:01:45,660 +khóa thứ hai và năm là giá trị của nó. + +27 +00:01:46,140 --> 00:01:50,760 +Những gì tôi có thể làm ở đây là tôi có thể làm theo cách chuẩn để lặp qua từ điển. + +28 +00:01:50,760 --> 00:01:55,760 +Vì vậy, tôi có thể nói cho khóa, giá trị bằng ** kwargs. các mục, và sau đó tôi + +29 +00:01:57,960 --> 00:02:02,160 +có thể truy cập vào từng khóa và giá trị của chúng khi + +30 +00:02:02,160 --> 00:02:04,800 +tôi lặp lại từ điển như thế này. + +31 +00:02:04,920 --> 00:02:08,910 +Vì vậy, cộng ba nhân với năm. Ngoài ra, tôi có thể + +32 +00:02:08,970 --> 00:02:11,700 +chỉ cần sử dụng tên của các phím. + +33 +00:02:12,120 --> 00:02:17,120 +Vì vậy, tôi có thể chỉ cần in ** kwargs của mình và sau đó sử dụng dấu ngoặc vuông + +34 +00:02:18,270 --> 00:02:22,200 +và sau đó cung cấp tên của khóa, vì vậy hãy thêm ví dụ. + +35 +00:02:22,950 --> 00:02:27,060 +Và điều đó sẽ cho tôi giá trị là ba như bạn có thể thấy ở đây. + +36 +00:02:27,930 --> 00:02:28,260 +Bây + +37 +00:02:28,260 --> 00:02:33,260 +giờ, những gì điều này cho phép tôi làm là về cơ bản nó cho phép tôi xem qua tất cả các đầu + +38 +00:02:34,920 --> 00:02:39,060 +vào và tìm những đầu vào mà tôi muốn và sử dụng chúng để làm điều gì đó. + +39 +00:02:39,540 --> 00:02:44,100 +Vì vậy, ví dụ, trong trường hợp này, nó là một hàm tính toán, phải không? + +40 +00:02:44,490 --> 00:02:48,420 +Vì vậy, chúng ta có thể nói bắt đầu với một đối số vị + +41 +00:02:48,450 --> 00:02:53,370 +trí bình thường, vì vậy hãy gọi nó là n và hãy chuyển vào n đó ngay từ đầu. + +42 +00:02:53,670 --> 00:02:58,500 +Vì vậy, giả sử chúng ta bắt đầu với số 2, n bây giờ bằng 2, + +43 +00:02:58,900 --> 00:03:03,700 +và sau đó ** kwargs là một từ điển của các đối số còn lại. + +44 +00:03:05,290 --> 00:03:08,020 +Giả sử rằng tôi muốn thực hiện một số phép tính. + +45 +00:03:08,050 --> 00:03:13,050 +Tôi muốn nói n + = kwargs, và tôi + +46 +00:03:13,870 --> 00:03:18,340 +sẽ nắm bắt giá trị dưới cộng. + +47 +00:03:19,030 --> 00:03:22,960 +Và sau đó tôi sẽ nói, n * = kwargs, và + +48 +00:03:23,380 --> 00:03:26,290 +tôi sẽ nắm bắt giá trị của nhân. + +49 +00:03:26,950 --> 00:03:30,250 +Vì vậy, bây giờ khi tôi tiếp tục và in n của + +50 +00:03:30,310 --> 00:03:35,310 +mình, bạn có thể thấy rằng điều gì sẽ xảy ra là nó nhận giá trị đầu tiên 2 + +51 +00:03:39,850 --> 00:03:44,380 +bằng n, và sau đó n, giá trị 2 này, sẽ được thêm vào số tôi muốn + +52 +00:03:44,410 --> 00:03:46,660 +thêm đó là 3. Vì vậy, 2 + + +53 +00:03:47,140 --> 00:03:52,140 +3 là 5, và sau đó nó nhân 5 với bất cứ thứ gì mà tôi đã lưu trữ trong phép nhân. + +54 +00:03:52,660 --> 00:03:55,120 +Vì vậy, 5 cộng với 5, và chúng tôi nhận được 25. + +55 +00:03:55,810 --> 00:04:00,460 +Điều này cung cấp cho chúng tôi một cách linh hoạt hơn để làm việc với các đối số này. + +56 +00:04:00,910 --> 00:04:05,500 +Và nó cung cấp cho chúng ta một cách để đặt tên cho các giá trị mà chúng ta đang chuyển vào hàm này. + +57 +00:04:06,880 --> 00:04:11,110 +Bây giờ, quay lại những gì họ đã làm trong mô-đun Tkinter, về + +58 +00:04:11,650 --> 00:04:16,649 +cơ bản, mô-đun Tkinter này thực sự được chuyển từ một công nghệ khác có tên + +59 +00:04:17,560 --> 00:04:18,392 +là TK. + +60 +00:04:18,940 --> 00:04:23,320 +Và TK thực sự có một cú pháp rất khác với Python. + +61 +00:04:23,950 --> 00:04:28,900 +Để nó hoạt động, về cơ bản họ đã sử dụng tất cả các lệnh Tk, như + +62 +00:04:28,930 --> 00:04:32,470 +tạo nhãn hoặc đóng gói một số loại mặt hàng và lấy tất + +63 +00:04:32,920 --> 00:04:37,920 +cả các tùy chọn và biến chúng thành các ** kwargs hoặc các đối số từ khóa tùy + +64 +00:04:40,180 --> 00:04:41,013 +chọn này. + +65 +00:04:41,380 --> 00:04:46,000 +Và đó là lý do tại sao khi chúng tôi tạo một nhãn mới từ + +66 +00:04:46,030 --> 00:04:48,310 +mô-đun Tkinter hoặc khi chúng tôi + +67 +00:04:48,520 --> 00:04:53,290 +gọi phương thức gói, bạn có thể thấy rằng nó không thực sự đưa ra bất + +68 +00:04:53,290 --> 00:04:57,850 +kỳ thuộc tính nào mà chúng tôi có thể sửa đổi ngoài ** kw, đó + +69 +00:04:58,120 --> 00:05:00,580 +là giống như ** kwargs của chúng tôi. + +70 +00:05:01,390 --> 00:05:04,390 +Vì vậy, chúng ta thực sự cũng có thể tạo một lớp như vậy, bởi + +71 +00:05:04,660 --> 00:05:07,180 +vì điều này được thực hiện khi khởi tạo, phải không? + +72 +00:05:07,180 --> 00:05:09,640 +Điều này được thực hiện khi họ đang tạo lớp nhãn đó. + +73 +00:05:10,420 --> 00:05:13,810 +Giả sử rằng chúng tôi tạo một lớp như thế này + +74 +00:05:14,410 --> 00:05:16,270 +mà tôi sẽ lái xe, + +75 +00:05:16,780 --> 00:05:21,430 +và trong init, những gì tôi sẽ thêm vào ngoài tự là ** kw, hoặc ** + +76 +00:05:21,670 --> 00:05:25,030 +kwargs, hoặc bất cứ cách nào bạn muốn đánh vần nó. + +77 +00:05:25,840 --> 00:05:30,840 +Kw này sẽ là tất cả các đối số tùy chọn mà tôi sẽ truyền vào khi khởi + +78 +00:05:31,270 --> 00:05:35,950 +tạo một đối tượng mới từ lớp này. Tôi có thể + +79 +00:05:35,950 --> 00:05:38,770 +nói, ví dụ, bản thân. + +80 +00:05:38,830 --> 00:05:42,370 +chế tạo của ô tô bằng kw. + +81 +00:05:43,270 --> 00:05:47,230 +Và sau đó từ kw, tôi sẽ bắt tay vào làm. + +82 +00:05:48,010 --> 00:05:49,810 +Và sau đó tôi sẽ có tự. mô hình sẽ + +83 +00:05:49,810 --> 00:05:53,980 +bằng kw và sau đó là mô hình. Và tất nhiên, tất cả các lỗi chính + +84 +00:05:53,980 --> 00:05:57,830 +tả đều quan trọng, vì vậy hãy đảm bảo rằng bạn không mắc lỗi chính tả nào. + +85 +00:05:58,280 --> 00:06:00,260 +Và sau đó tôi quyết định tạo chiếc xe + +86 +00:06:00,290 --> 00:06:04,490 +của mình sẽ là đối tượng được tạo từ lớp này. Bây giờ hãy để ý xem khi + +87 +00:06:04,490 --> 00:06:06,440 +tôi mở dấu ngoặc ở đây, bạn + +88 +00:06:06,740 --> 00:06:10,850 +thực sự không thấy bất kỳ thuộc tính nào như make và model hiển + +89 +00:06:10,880 --> 00:06:14,480 +thị khi tôi khởi tạo. Tất cả những + +90 +00:06:14,510 --> 00:06:18,380 +gì bạn thấy là ** kw, giống như cách bạn + +91 +00:06:19,850 --> 00:06:21,680 +thấy ở đây, ** kw. + +92 +00:06:22,640 --> 00:06:26,750 +Và điều đó tất nhiên đề cập đến các đối số từ khóa tùy chọn của chúng tôi. + +93 +00:06:27,320 --> 00:06:31,610 +Hãy thêm một số giá trị. Hãy đặt kiểu dáng thành Nissan và + +94 +00:06:32,150 --> 00:06:37,150 +hãy đặt kiểu dáng thành-- hãy đặt nó thành GT-R. Và bây giờ tôi có thể sử dụng đối tượng của mình giống + +95 +00:06:40,820 --> 00:06:44,930 +như bất kỳ đối tượng nào khác. Tôi có thể nói my_car. người mẫu. + +96 +00:06:45,290 --> 00:06:49,580 +Và khi tôi nhấn run, bạn có thể thấy tôi đã in GT-R ở đây. + +97 +00:06:50,690 --> 00:06:54,740 +Và nếu tôi quyết định in trang phục, bạn có thể thấy nó + +98 +00:06:54,740 --> 00:06:55,970 +bị đình trệ. + +99 +00:06:56,480 --> 00:07:00,830 +Bây giờ, điều gì sẽ xảy ra nếu tôi không thực sự chỉ định một trong những đối số này. + +100 +00:07:01,430 --> 00:07:05,390 +Hãy để ý xem nó thực sự sẽ gặp sự cố như thế nào. + +101 +00:07:06,020 --> 00:07:08,570 +Nó cho tôi biết rằng mô hình keyError. + +102 +00:07:08,750 --> 00:07:13,750 +Vì vậy, khi nó được khởi tạo đối tượng ô tô này, nó đã rơi trên đường này. Và nó không thể nắm giữ một + +103 +00:07:15,800 --> 00:07:20,800 +giá trị được gọi là mô hình từ từ điển đối số kw này. + +104 +00:07:23,060 --> 00:07:24,650 +Trên thực tế, với từ điển, chúng + +105 +00:07:25,040 --> 00:07:28,370 +ta có thể nắm giữ các giá trị thông qua phương thức dấu ngoặc vuông, nhưng chúng + +106 +00:07:28,640 --> 00:07:33,640 +ta cũng có thể sử dụng một hàm được gọi là get. Và chúng tôi sử dụng get theo cách rất giống với + +107 +00:07:35,030 --> 00:07:37,220 +cách chúng tôi sử dụng dấu ngoặc vuông. + +108 +00:07:37,250 --> 00:07:41,540 +Chúng tôi chỉ chuyển tên của khóa và chúng tôi muốn nắm giữ giá trị. + +109 +00:07:42,140 --> 00:07:47,140 +Nhưng lợi ích của get là nếu khóa này không tồn tại trong từ điển, thì nó + +110 +00:07:50,510 --> 00:07:54,650 +sẽ chỉ trả về không và nó sẽ không báo lỗi cho chúng ta. + +111 +00:07:55,820 --> 00:08:00,080 +Vì vậy, bây giờ nếu tôi chạy lại mã này, bạn có thể thấy rằng mọi thứ đều + +112 +00:08:00,320 --> 00:08:03,890 +hoạt động, trừ chiếc xe của tôi. mô hình bây giờ là bằng không. + +113 +00:08:04,580 --> 00:08:09,580 +Vì vậy, đây là cách chúng ta thực sự có thể tạo một lớp với rất nhiều đối số từ + +114 +00:08:10,340 --> 00:08:11,173 +khóa tùy chọn. + +115 +00:08:12,110 --> 00:08:17,110 +Vì vậy, chúng ta có thể có một bản ngã. màu sắc hoặc bản thân. ghế ngồi. + +116 +00:08:21,050 --> 00:08:25,580 +Và tùy thuộc vào mục đích mà chúng ta muốn khởi tạo đối tượng ô tô này, sau đó + +117 +00:08:25,910 --> 00:08:30,910 +chúng ta có thể chỉ cần tiếp tục và thêm bất cứ thứ gì chúng ta muốn đặt làm kiểu dáng và + +118 +00:08:31,820 --> 00:08:35,750 +mô hình hoặc màu sắc và ghế ngồi. Và theo cùng một cách mà + +119 +00:08:35,780 --> 00:08:38,059 +sử dụng lớp nhãn này, chúng ta có thể + +120 +00:08:38,390 --> 00:08:41,150 +đặt văn bản hoặc chúng ta có thể đặt phông chữ. + +121 +00:08:41,270 --> 00:08:46,270 +Chúng tôi có thể đặt tất cả các tùy chọn hoặc chúng tôi có thể để chúng làm giá trị mặc định. Điều đó sẽ giúp bạn + +122 +00:08:48,230 --> 00:08:52,610 +hiểu cách mã này hoạt động tốt hơn một chút. + +123 +00:08:53,180 --> 00:08:56,580 +Và lý do tại sao nó hoạt động như vậy, như tôi đã nói, + +124 +00:08:56,580 --> 00:09:01,580 +chủ yếu là do mô-đun này đã được chuyển đổi từ một ngôn ngữ khác và đây chỉ là cách + +125 +00:09:01,950 --> 00:09:06,950 +hiệu quả nhất để họ thực hiện điều này. Bây giờ với nhiều mô-đun Pythonic khác hoặc + +126 +00:09:07,380 --> 00:09:11,280 +những thứ đã được tạo bằng Python như mô-đun rùa, thì bạn + +127 +00:09:11,610 --> 00:09:16,260 +sẽ thấy nhiều loại mã chuẩn không có thật hơn giống như những gì chúng + +128 +00:09:16,320 --> 00:09:19,740 +tôi đang làm việc. Vì vậy, khi chúng tôi khởi tạo + +129 +00:09:19,950 --> 00:09:22,530 +một con rùa mới, bạn có thể thấy rằng nó có + +130 +00:09:22,620 --> 00:09:25,230 +hình dạng mặc định, nó có boolean hiển thị và chúng tôi + +131 +00:09:25,290 --> 00:09:29,190 +có thể đặt tất cả các thuộc tính mà chúng tôi có thể thấy trong lời nhắc này. + +132 +00:09:30,510 --> 00:09:31,860 +Bây giờ trong bài + +133 +00:09:31,890 --> 00:09:36,210 +học tiếp theo, tôi muốn đi sâu hơn vào tài liệu TKinter và tôi muốn cho bạn + +134 +00:09:36,570 --> 00:09:40,230 +thấy cách chúng tôi có thể tạo các thành phần khác, không chỉ nhãn mà + +135 +00:09:40,470 --> 00:09:42,990 +còn những thứ như nút và đầu vào văn bản + +136 +00:09:43,280 --> 00:09:46,790 +và toàn bộ những thứ sẽ mang lại Chương trình GUI vào cuộc sống. + +137 +00:09:47,210 --> 00:09:50,120 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/008 Optional Arguments, args and kwargs Quiz.html b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/008 Optional Arguments, args and kwargs Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..fbb939d6f332cbb870ac5d25efbc78a61d9200c2 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/008 Optional Arguments, args and kwargs Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 Buttons, Entry, and Setting Component Options.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 Buttons, Entry, and Setting Component Options.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ba6bab2d3922fa85ef35f17eef02b55c964b1936 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 Buttons, Entry, and Setting Component Options.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28b394853d26a93a08246a511f1e5596a8415726926ced392b4e4a122cce5ff6 +size 93931591 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 Buttons, Entry, and Setting Component Options_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 Buttons, Entry, and Setting Component Options_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3f0f8555e03431c0b94a475abacfa71c9ee2367d --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 Buttons, Entry, and Setting Component Options_vi.srt @@ -0,0 +1,608 @@ +1 +00:00:00,360 --> 00:00:05,360 +Trong bài học trước, chúng ta đã thấy cách chúng ta có thể đặt nhiều thuộc tính + +2 +00:00:06,300 --> 00:00:09,000 +cho các phương thức được liên kết với + +3 +00:00:09,300 --> 00:00:13,440 +Tkinter hoặc để khởi tạo các thành phần như nhãn của chúng ta. + +4 +00:00:14,160 --> 00:00:15,750 +Bây giờ trong tài liệu, họ cho + +5 +00:00:15,870 --> 00:00:19,770 +chúng tôi biết rằng có một số cách để chúng tôi có thể đặt các tùy chọn này. + +6 +00:00:20,190 --> 00:00:25,190 +Chúng ta có thể làm điều đó khi chúng ta khởi tạo một đối tượng mới hoặc chúng ta có thể + +7 +00:00:25,860 --> 00:00:30,420 +truy cập các thuộc tính như thể chúng là khóa trong từ điển và sau đó đặt giá trị. + +8 +00:00:31,020 --> 00:00:31,650 +Và cuối + +9 +00:00:31,650 --> 00:00:36,450 +cùng, chúng ta có thể đặt nhiều thuộc tính bằng cách sử dụng phương thức cấu hình + +10 +00:00:36,450 --> 00:00:38,970 +và chuyển giá trị cho từng thứ mà chúng + +11 +00:00:39,690 --> 00:00:43,590 +ta muốn thay đổi, tôi khuyên bạn nên xem tài liệu Tcl tk liệt + +12 +00:00:43,950 --> 00:00:47,460 +kê tất cả các tùy chọn. Chẳng hạn như ở + +13 +00:00:47,460 --> 00:00:52,440 +đây, tôi đã chọn nhãn của mình và có các tùy chọn tiêu chuẩn + +14 +00:00:52,470 --> 00:00:56,400 +như màu nền hoặc văn bản. Và có các tùy chọn dành riêng cho tiện ích + +15 +00:00:56,430 --> 00:01:01,050 +con, rất cụ thể cho nhãn, bạn có thể thay đổi chiều cao của nó, bạn có thể thay đổi chiều rộng của nó. + +16 +00:01:01,740 --> 00:01:04,680 +Trở lại với nhãn của tôi trong chính của tôi. py, nếu tôi muốn + +17 +00:01:05,129 --> 00:01:08,760 +thay đổi thuộc tính nhãn của mình, ví dụ: nếu tôi muốn thay + +18 +00:01:08,760 --> 00:01:13,500 +đổi văn bản bên trong và tôi muốn làm cho nó khác với văn bản ban đầu mà + +19 +00:01:13,500 --> 00:01:15,570 +nó hiển thị, thì tôi có thể thực + +20 +00:01:15,840 --> 00:01:20,280 +hiện việc này đơn giản bằng cách thay đổi nó như thể nó là một từ điển. + +21 +00:01:20,880 --> 00:01:24,390 +Và tôi có thể đặt giá trị đó thành giá trị mới, vì vậy văn bản mới. + +22 +00:01:25,740 --> 00:01:30,740 +Bây giờ tôi cũng có thể làm điều đó bằng cách làm my_label. cấu hình và sau đó chuyển vào văn + +23 +00:01:31,830 --> 00:01:36,830 +bản dưới dạng đối số từ khóa. Dù bằng cách nào khi tôi + +24 +00:01:37,230 --> 00:01:40,440 +chạy chính này. py, hãy nhớ trước đây, chúng tôi đang + +25 +00:01:40,440 --> 00:01:41,850 +điều hành sân chơi của mình. + +26 +00:01:41,850 --> 00:01:46,850 +Vì vậy, quay lại để chạy và sau đó nhấp vào đây và sau đó thay đổi nó thành chính của chúng tôi. py + +27 +00:01:48,720 --> 00:01:53,720 +Và bây giờ bạn sẽ thấy văn bản mới hiển thị thay vì văn bản gốc, đó là + +28 +00:01:53,760 --> 00:01:55,110 +Tôi là một nhãn. + +29 +00:01:55,800 --> 00:02:00,800 +Vì vậy, đây là cách chúng tôi định cấu hình và thay đổi hoặc cập nhật các thuộc tính của một thành phần + +30 +00:02:01,830 --> 00:02:03,360 +cụ thể mà chúng tôi đã tạo. + +31 +00:02:04,860 --> 00:02:08,759 +Ngoài nhãn, chúng ta cũng có thể tạo các nút. + +32 +00:02:09,180 --> 00:02:13,920 +Hãy tạo một nút, một lần nữa, sẽ đến từ mô-đun Tkinter và nó sẽ + +33 +00:02:14,220 --> 00:02:17,610 +là lớp nút từ mô-đun đó như bạn có thể thấy + +34 +00:02:17,670 --> 00:02:20,220 +ngay tại đây. Bây giờ, tất cả + +35 +00:02:20,280 --> 00:02:22,380 +các thành phần mà chúng ta sẽ sử + +36 +00:02:22,410 --> 00:02:25,290 +dụng đều đến từ lớp này. Bạn sẽ rất thường + +37 +00:02:25,320 --> 00:02:30,320 +xuyên thấy mọi người thay vì nhập Tkinter, họ sẽ nói từ nhập tkinter, và + +38 +00:02:30,780 --> 00:02:31,620 +sau đó + +39 +00:02:31,770 --> 00:02:36,270 +là dấu hoa thị để biểu thị nhập mọi lớp đơn lẻ. + +40 +00:02:36,900 --> 00:02:40,590 +Điều này có nghĩa là về cơ bản chúng ta có thể loại bỏ tất cả các đề cập của mô-đun và chúng + +41 +00:02:40,590 --> 00:02:43,170 +ta chỉ có thể khởi tạo một cửa sổ dưới dạng tk, nhãn của chúng ta + +42 +00:02:43,500 --> 00:02:48,500 +dưới dạng nhãn và nút của chúng ta đơn giản là nút, như thế này. Tiết kiệm một chút thao tác + +43 +00:02:50,400 --> 00:02:54,330 +nhập, tùy thuộc vào số lượng lớp bạn sẽ sử dụng. + +44 +00:02:54,330 --> 00:02:55,500 +Nếu bạn chỉ định sử + +45 +00:02:55,800 --> 00:02:58,980 +dụng một cái, tôi khuyên bạn nên giữ lại mô-đun để bạn biết nó đến từ đâu. + +46 +00:02:59,230 --> 00:03:00,940 +Nhưng nếu bạn định sử dụng vô + +47 +00:03:00,970 --> 00:03:04,750 +số chúng như chúng tôi đang ở đây, thì việc nhập liệu sẽ nhanh hơn rất nhiều. + +48 +00:03:05,410 --> 00:03:07,660 +Vì vậy, hãy tạo nút của chúng tôi. Và một lần nữa, + +49 +00:03:07,660 --> 00:03:12,660 +nó có một loạt các đối số từ khóa tùy chọn. Và một số trong số đó là + +50 +00:03:12,910 --> 00:03:14,440 +tiêu chuẩn. Vì vậy, ví + +51 +00:03:14,440 --> 00:03:19,030 +dụ, chúng ta có thể thay đổi văn bản nút giống như cách chúng ta đã thay đổi văn bản nhãn. + +52 +00:03:19,450 --> 00:03:24,450 +Vì vậy, hãy làm cho nó để nói nhấp vào tôi. Và hãy nhớ rằng để làm cho bất kỳ thứ gì xuất hiện + +53 +00:03:25,240 --> 00:03:27,700 +trên màn hình, nó cần phải có một số loại bố cục. + +54 +00:03:28,090 --> 00:03:31,540 +Vì vậy, chúng ta hãy gọi gói một lần nữa để làm cho nó được đóng gói trên màn hình. + +55 +00:03:32,260 --> 00:03:34,360 +Vì vậy, bây giờ nếu tôi chạy mã này + +56 +00:03:34,690 --> 00:03:39,690 +như hiện tại, bạn có thể thấy rằng nút của tôi đã được đặt ở giữa màn hình và nhãn của + +57 +00:03:39,940 --> 00:03:41,650 +tôi được đóng gói ở bên trái. + +58 +00:03:43,120 --> 00:03:45,400 +Hãy tiếp tục và loại bỏ bên trái + +59 +00:03:45,430 --> 00:03:49,780 +đó để nó thực sự đi theo thứ tự sao cho thứ đầu tiên được tạo, nó + +60 +00:03:49,810 --> 00:03:53,830 +được đưa lên màn hình trước rồi đến thứ tiếp theo là nút và sau + +61 +00:03:53,890 --> 00:03:56,740 +đó tất cả điều này được căn giữa theo mặc định. + +62 +00:03:58,150 --> 00:04:02,110 +Câu hỏi rõ ràng tiếp theo là làm thế nào chúng ta có thể làm cho nút này thực sự hoạt động? + +63 +00:04:02,290 --> 00:04:07,240 +Bởi vì lúc này nhấp vào nó hoàn toàn không có gì cả. Như bạn còn nhớ khi chúng tôi sử + +64 +00:04:07,270 --> 00:04:09,550 +dụng mô-đun rùa, chúng tôi có + +65 +00:04:09,760 --> 00:04:14,650 +thể có một trình lắng nghe sự kiện. Vì vậy, chúng ta có thể tạo + +66 +00:04:14,830 --> 00:04:17,380 +một số loại hàm, hãy gọi nó là button_clicked. + +67 +00:04:18,730 --> 00:04:22,480 +Và sau đó, chức năng này có thể làm điều gì đó, ví + +68 +00:04:22,750 --> 00:04:24,430 +dụ, tôi đã được nhấp. + +69 +00:04:25,300 --> 00:04:29,410 +Và khi nút này phát hiện một sự kiện, chẳng hạn như một + +70 +00:04:29,470 --> 00:04:33,430 +sự kiện nhấp chuột, thì nó có thể gọi hàm này. + +71 +00:04:33,910 --> 00:04:38,470 +Vì vậy, trong thế giới tkinter, có một thuộc tính được gọi là lệnh, bạn có thể đặt + +72 +00:04:38,890 --> 00:04:43,420 +thuộc tính này bằng tên của một hàm. Vì vậy, hãy nhớ, + +73 +00:04:43,720 --> 00:04:47,470 +đó là tên của hàm, không phải gọi hàm. + +74 +00:04:47,620 --> 00:04:50,920 +Vì vậy, chúng tôi thực sự không cần dấu ngoặc đơn ở cuối. + +75 +00:04:51,670 --> 00:04:56,500 +Bây giờ khi chúng tôi chạy mã của mình, khi nút này phát hiện một lệnh về + +76 +00:04:56,500 --> 00:04:58,480 +cơ bản là một sự kiện nhấp + +77 +00:04:58,750 --> 00:05:03,010 +chuột, thì nó sẽ kích hoạt phương thức này và hy vọng nó sẽ in + +78 +00:05:03,010 --> 00:05:07,450 +nó vào bảng điều khiển. Vì vậy, chúng ta hãy nhấn run. Bây giờ, tôi sẽ nhấp vào + +79 +00:05:07,450 --> 00:05:11,650 +nút này và bạn có thể thấy nó nói rằng tôi đã được nhấp và nó sẽ làm như + +80 +00:05:11,650 --> 00:05:13,210 +vậy mỗi khi tôi nhấp vào nó. + +81 +00:05:14,650 --> 00:05:16,840 +Vì vậy, đây là một thách thức cho bạn. + +82 +00:05:17,530 --> 00:05:19,900 +Làm cách nào bạn có thể + +83 +00:05:19,930 --> 00:05:24,370 +tạo nhãn, my_label, thay vì đọc văn bản mới, vì nó có nghĩa + +84 +00:05:24,400 --> 00:05:27,910 +là nút đã được nhấp khi tôi nhấp vào nút này? + +85 +00:05:28,480 --> 00:05:32,620 +Vì vậy, nhấp vào nút này bây giờ sẽ thay đổi văn bản. Tạm dừng video, + +86 +00:05:32,950 --> 00:05:35,950 +tiếp tục. Được rồi. + +87 +00:05:35,950 --> 00:05:40,950 +Vì vậy, chúng tôi biết rằng chúng tôi có thể thay đổi văn bản của nhãn bằng cách sử dụng một trong các phương pháp này. + +88 +00:05:41,410 --> 00:05:45,100 +Vì vậy, về cơ bản bạn có thể chọn một trong số này và thêm nó vào chức năng này. + +89 +00:05:45,310 --> 00:05:46,540 +Vì vậy, + +90 +00:05:46,570 --> 00:05:51,570 +tôi sẽ sử dụng my_label. cấu hình chỉ vì nó có ý nghĩa hơn một chút khi + +91 +00:05:52,540 --> 00:05:53,650 +tôi đọc dòng mã đó. + +92 +00:05:53,830 --> 00:05:57,860 +Vì vậy, tôi sẽ cấu hình thuộc tính văn bản để đọc nút + +93 +00:05:58,070 --> 00:05:59,180 +đã được nhấp. + +94 +00:06:01,580 --> 00:06:03,410 +Và bây giờ khi tôi nhấn run, + +95 +00:06:04,040 --> 00:06:08,300 +những gì bạn sẽ thấy là khi tôi nhấp vào nút này, nó sẽ thay đổi văn bản. + +96 +00:06:10,010 --> 00:06:13,010 +Vì vậy, chúng tôi hiện đang nhận được nhiều tương tác hơn một chút. + +97 +00:06:13,670 --> 00:06:17,330 +Điều tiếp theo tôi muốn cho bạn thấy là khả năng tương tác nhiều hơn. + +98 +00:06:17,750 --> 00:06:21,260 +Tôi muốn cho bạn thấy một thành phần được gọi là thành phần + +99 +00:06:21,440 --> 00:06:24,980 +nhập, và về cơ bản đây chỉ là một đầu vào một cách hiệu quả. + +100 +00:06:25,610 --> 00:06:28,460 +Vì vậy, hãy tạo một đối tượng mới mà tôi sẽ gọi + +101 +00:06:28,820 --> 00:06:31,280 +là đầu vào và nó được tạo từ lớp mục nhập + +102 +00:06:31,310 --> 00:06:35,210 +đến từ mô-đun tkinter của chúng ta. Bây giờ một lần nữa, nếu chúng ta muốn + +103 +00:06:35,270 --> 00:06:37,220 +một thứ gì đó xuất hiện trên màn + +104 +00:06:37,490 --> 00:06:42,260 +hình, chúng ta phải tạo bố cục cho nó và chúng ta có thể sử dụng gói tự động để làm điều đó. + +105 +00:06:42,620 --> 00:06:47,510 +Vì vậy, bây giờ khi tôi chạy mã này, bạn có thể thấy bây giờ tôi đã có một trường đầu vào. Bây giờ, nếu tôi muốn xem xét các tùy + +106 +00:06:47,510 --> 00:06:51,980 +chọn cho mục nhập của mình, tôi chỉ cần truy cập tài liệu tk này, tìm mục + +107 +00:06:52,220 --> 00:06:56,930 +nhập của tôi, nhấp vào nó và bạn có thể thấy tôi có các tùy chọn tiêu + +108 +00:06:57,260 --> 00:06:58,010 +chuẩn và + +109 +00:06:58,010 --> 00:07:02,780 +tùy chọn dành riêng cho tiện ích con. Bây giờ, một trong những điều tôi + +110 +00:07:02,810 --> 00:07:07,400 +muốn thay đổi là chiều rộng. Ví dụ: tôi có thể thay đổi + +111 +00:07:07,430 --> 00:07:12,430 +độ rộng của đầu vào này chỉ bằng cách sử dụng đối số từ khóa + +112 +00:07:13,940 --> 00:07:14,690 +width. + +113 +00:07:14,690 --> 00:07:19,690 +Và tôi có thể chỉ định một số nguyên để chỉ ra chiều rộng mong muốn của cửa sổ nhập. + +114 +00:07:21,320 --> 00:07:25,640 +Vì vậy, tại thời điểm hiện tại, nếu tôi nghĩ rằng nó hơi quá rộng, + +115 +00:07:26,000 --> 00:07:30,980 +thì hãy thử sửa đổi đầu vào của chúng tôi để có chiều rộng thấp hơn một chút. + +116 +00:07:31,310 --> 00:07:32,750 +Hãy thay đổi nó thành có thể là 10 và bạn + +117 +00:07:33,830 --> 00:07:37,430 +có thể thấy nó bây giờ nhỏ hơn rất nhiều so với trước đây. Bây giờ nếu tôi + +118 +00:07:37,430 --> 00:07:41,900 +muốn nắm giữ giá trị đến từ mục nhập đó thì sao? + +119 +00:07:42,890 --> 00:07:45,740 +Trong trường hợp đó, tôi phải sử dụng get + +120 +00:07:46,130 --> 00:07:49,010 +mà về cơ bản chỉ trả về chuỗi của mục nhập. + +121 +00:07:49,430 --> 00:07:52,430 +Vì vậy, tôi có thể nói đầu vào. get và sau + +122 +00:07:52,910 --> 00:07:57,910 +đó phương thức này sẽ trả về đầu vào dưới dạng một chuỗi. + +123 +00:07:58,940 --> 00:08:01,550 +Vì vậy, tôi có thể, chẳng hạn, in nó ra. + +124 +00:08:02,210 --> 00:08:06,470 +Nhưng thật không may, điểm khi dòng mã này được chạy, thực + +125 +00:08:06,800 --> 00:08:10,490 +sự không có đầu vào nào bên trong mục này. + +126 +00:08:10,910 --> 00:08:13,700 +Vì vậy, chúng tôi thực sự sẽ hoàn toàn không in gì cả. + +127 +00:08:15,500 --> 00:08:17,060 +Đây là một thách thức dành cho bạn. + +128 +00:08:17,660 --> 00:08:21,350 +Bạn có thể tìm ra cách để bất cứ thứ gì được + +129 +00:08:22,880 --> 00:08:25,820 +viết ở đây trở thành văn bản trong nhãn khi + +130 +00:08:26,210 --> 00:08:28,340 +tôi nhấp vào nút này không? + +131 +00:08:29,090 --> 00:08:32,690 +Cho rằng tôi đã nhập một cái gì đó vào đây, khi tôi + +132 +00:08:33,020 --> 00:08:37,250 +nhấp vào nút này, tôi muốn một cái gì đó được hiển thị trong nhãn + +133 +00:08:37,250 --> 00:08:40,880 +thay vì 'nút đã được nhấp. 'Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +134 +00:08:43,280 --> 00:08:43,700 +Được rồi. + +135 +00:08:43,700 --> 00:08:48,700 +Vì vậy, chúng ta biết rằng trình kích hoạt cho nút là hàm button_clicked. + +136 +00:08:49,940 --> 00:08:54,770 +Vì vậy, đây là nơi chúng tôi thực sự định cấu hình nhãn của mình. Nếu thay vào đó, chúng tôi sẽ nắm + +137 +00:08:54,800 --> 00:08:58,560 +giữ thông tin đầu vào của chúng tôi ở đây và gọi đầu vào. + +138 +00:08:58,650 --> 00:09:01,830 +nhận được new_text, tốt, sau đó chúng tôi + +139 +00:09:01,830 --> 00:09:06,540 +thực sự có thể sử dụng văn bản mới này và điền nhãn. + +140 +00:09:06,990 --> 00:09:10,020 +Vì vậy, chúng ta có thể nói text = new_text. + +141 +00:09:10,650 --> 00:09:12,300 +Và bây giờ khi tôi nhấn run, bạn + +142 +00:09:12,480 --> 00:09:15,750 +có thể thấy rằng tôi có thể nhập bất cứ thứ gì tôi muốn vào đây. + +143 +00:09:15,870 --> 00:09:17,580 +Và sau đó khi tôi nhấp vào + +144 +00:09:17,910 --> 00:09:21,780 +'nhấp vào tôi', nó sẽ lấy văn bản bên trong mục nhập và đưa nó vào nhãn. + +145 +00:09:23,250 --> 00:09:28,250 +Đây là cách chúng tôi sẽ làm việc với một số thành phần cơ bản nhất của tkinter + +146 +00:09:28,620 --> 00:09:30,750 +như nhãn, nút, mục nhập và chúng tôi + +147 +00:09:30,900 --> 00:09:34,620 +cũng đã thấy phương thức gói. Bây giờ, như bạn có thể thấy, + +148 +00:09:34,620 --> 00:09:37,890 +chúng là tất cả những thứ khác mà bạn có thể làm với tkinter. + +149 +00:09:38,400 --> 00:09:39,630 +Vì vậy, trong bài học + +150 +00:09:39,660 --> 00:09:42,480 +tiếp theo, chúng ta sẽ hoàn thiện những gì chúng ta đã làm cho + +151 +00:09:42,780 --> 00:09:46,800 +đến nay và tôi muốn cho bạn thấy một số widget khác mà bạn có thể làm việc và thêm + +152 +00:09:46,800 --> 00:09:48,120 +vào chương trình tkinter của mình. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 TCL-tk-Docs-Entry-.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 TCL-tk-Docs-Entry-.url new file mode 100644 index 0000000000000000000000000000000000000000..da10677a3de4907250804eb3593e707b6119f790 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/009 TCL-tk-Docs-Entry-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://tcl.tk/man/tcl8.6/TkCmd/entry.htm \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Other Tkinter Widgets Radiobuttons, Scales, Checkbuttons and more.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Other Tkinter Widgets Radiobuttons, Scales, Checkbuttons and more.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..710f1a348067f424b85ec15673d224ba12117bc7 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Other Tkinter Widgets Radiobuttons, Scales, Checkbuttons and more.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfd29f6746d837520d683619d384d12e5c086e8c859927afbef7d8cb59e90da9 +size 49512256 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Other Tkinter Widgets Radiobuttons, Scales, Checkbuttons and more_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Other Tkinter Widgets Radiobuttons, Scales, Checkbuttons and more_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b306be51e18d2d13dc1b585046ae32c03e51d5c7 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Other Tkinter Widgets Radiobuttons, Scales, Checkbuttons and more_vi.srt @@ -0,0 +1,432 @@ +1 +00:00:00,480 --> 00:00:01,859 +Bây giờ trong bài + +2 +00:00:01,920 --> 00:00:06,750 +học trước, chúng ta đã thấy một số cách khác nhau để làm việc với các widget tkinter. + +3 +00:00:07,290 --> 00:00:11,190 +Chúng tôi đã thấy cách chúng tôi có thể tạo nhãn, vì vậy một + +4 +00:00:11,490 --> 00:00:16,490 +cái gì đó như thế này, và cả các nút có thể được nhấp vào và thực hiện + +5 +00:00:20,340 --> 00:00:23,730 +một số loại hành động. Sau đó, chúng tôi cũng đã thấy các + +6 +00:00:24,570 --> 00:00:26,940 +mục nhập, về cơ bản là một số loại hộp văn bản. + +7 +00:00:27,420 --> 00:00:32,369 +Và bây giờ tôi muốn cho bạn thấy một số widget khác mà bạn có thể làm việc với. + +8 +00:00:32,759 --> 00:00:35,220 +Ví dụ: hộp nhập văn bản cho phép bạn + +9 +00:00:35,250 --> 00:00:40,250 +sử dụng nhiều dòng văn bản hoặc một cái gì đó giống như hộp xoay về cơ bản + +10 +00:00:41,340 --> 00:00:43,350 +là một loại bộ đếm cho phép + +11 +00:00:43,680 --> 00:00:47,430 +bạn lên xuống và sau đó là thang đo về cơ bản là + +12 +00:00:47,430 --> 00:00:49,020 +một thanh trượt mà bạn + +13 +00:00:49,020 --> 00:00:53,460 +có thể di chuyển dọc theo trục của nó và thay đổi giá trị của nó. + +14 +00:00:54,090 --> 00:00:59,090 +Sau đó, có một hộp kiểm có thể bật hoặc tắt về cơ bản chỉ là hộp đánh + +15 +00:00:59,520 --> 00:01:04,260 +dấu, các nút radio và cuối cùng là hộp danh sách các lựa chọn mà bạn + +16 +00:01:04,260 --> 00:01:05,310 +có thể chọn. + +17 +00:01:06,840 --> 00:01:11,220 +Vì vậy, đây là hầu hết tất cả các widget mà bạn có thể làm việc với. Để giúp bạn không phải gõ nhiều + +18 +00:01:11,220 --> 00:01:13,050 +mã ví dụ này, tôi + +19 +00:01:13,050 --> 00:01:17,730 +đã tạo một Repl demo widget tkinter. nó cho bạn mà bạn có thể + +20 +00:01:18,030 --> 00:01:21,870 +truy cập và bạn có thể xem một số mã hiện có + +21 +00:01:21,870 --> 00:01:22,703 +mà chúng + +22 +00:01:22,770 --> 00:01:27,660 +tôi đã tạo như cách tạo cửa sổ hoặc cách tạo nhãn và cách tạo nút. + +23 +00:01:28,140 --> 00:01:32,370 +Nhưng tôi muốn cho bạn thấy một số tính năng khác bằng cách chỉ nhìn vào mã. + +24 +00:01:32,850 --> 00:01:34,710 +Ví dụ, với mục nhập, chúng + +25 +00:01:34,740 --> 00:01:38,730 +tôi thực sự có thể chèn một số văn bản để bắt đầu các mục nhập. + +26 +00:01:39,060 --> 00:01:42,060 +Vì vậy, hãy chú ý ở đây chúng ta có thể nhấp vào nó để chỉnh sửa nó như thế nào, + +27 +00:01:42,360 --> 00:01:46,350 +nhưng nó thực sự có một số văn bản bắt đầu ở đó. Vì vậy, ví dụ, nếu bạn + +28 +00:01:46,350 --> 00:01:48,690 +muốn tạo một hộp thư điện tử, có thể + +29 +00:01:48,720 --> 00:01:52,740 +bạn sẽ viết từ email để cung cấp cho người dùng một chút gợi ý. + +30 +00:01:53,220 --> 00:01:56,280 +Bây giờ bạn cũng có một hộp văn bản + +31 +00:01:56,310 --> 00:02:00,420 +là một khu vực rộng lớn để người dùng có thể chỉnh sửa. + +32 +00:02:01,650 --> 00:02:04,110 +Và điều này được tạo đơn giản với tiện ích văn bản. + +33 +00:02:04,410 --> 00:02:09,410 +Bạn có thể đặt số dòng là chiều cao và chiều rộng là chiều rộng của hộp. + +34 +00:02:11,250 --> 00:02:16,250 +Và bạn có thể đặt văn bản được lấy tiêu điểm để con trỏ bắt đầu xuất hiện trong hộp + +35 +00:02:16,740 --> 00:02:17,580 +văn bản đó. + +36 +00:02:18,240 --> 00:02:23,240 +Và sau đó chúng ta có thể chèn một số đoạn văn bản để bắt đầu và chúng ta cũng có thể giữ văn bản + +37 +00:02:24,570 --> 00:02:29,460 +bên trong hộp văn bản bằng cách sử dụng phương thức get. Bây giờ hãy chú ý rằng có điều + +38 +00:02:29,460 --> 00:02:31,290 +gì đó hơi kỳ lạ + +39 +00:02:31,320 --> 00:02:34,560 +như kết thúc ở đây và kết thúc ở đây. + +40 +00:02:34,890 --> 00:02:38,040 +Đây chỉ là một chỉ mục để cho phép tkinter tìm + +41 +00:02:38,040 --> 00:02:42,660 +ra mặt hàng cụ thể mà bạn đang đề cập đến và bạn không phải thay + +42 +00:02:42,660 --> 00:02:45,420 +đổi nó bao giờ. Đây chỉ là mã mà bạn sử dụng. + +43 +00:02:45,840 --> 00:02:50,460 +Bạn có thể giữ mã chính xác như ở đây và chỉ cần sửa đổi thử nghiệm mà + +44 +00:02:50,460 --> 00:02:51,390 +bạn muốn chèn. + +45 +00:02:52,020 --> 00:02:57,020 +Và cái này 1. 0 về cơ bản đề cập đến việc nắm + +46 +00:02:57,090 --> 00:03:00,370 +giữ văn bản bắt đầu từ dòng đầu tiên với ký tự không. + +47 +00:03:01,750 --> 00:03:06,750 +Và sau đó chúng tôi có một tiện ích mới mà chúng tôi chưa bao giờ thực sự + +48 +00:03:07,300 --> 00:03:10,480 +thấy trước đây, một hộp quay, trông giống như thế này. + +49 +00:03:10,720 --> 00:03:15,720 +Vì vậy, bạn có thể nhấp vào lên và xuống để thay đổi giá trị của nó và chúng tôi + +50 +00:03:17,320 --> 00:03:22,320 +có thể in ra giá trị đang được thay đổi trong đó bằng cách chỉ cần lấy hộp quay + +51 +00:03:24,340 --> 00:03:26,800 +được gắn với một hàm được gọi là spinbox_used. + +52 +00:03:27,130 --> 00:03:29,170 +Và sau đó chúng tôi chỉ nhận được giá trị mỗi lần. + +53 +00:03:30,940 --> 00:03:33,580 +Bây giờ một quy mô cũng khá tự giải thích. + +54 +00:03:33,580 --> 00:03:37,750 +Bạn có thể di chuyển nó lên và xuống và chúng tôi đang nắm bắt giá trị + +55 +00:03:37,750 --> 00:03:40,810 +mà người dùng sẽ đạt được bằng cách chỉ cần đóng + +56 +00:03:40,870 --> 00:03:44,890 +gói, một lần nữa, một lệnh khác vào quy mô đó khi chúng tôi tạo nó. + +57 +00:03:45,220 --> 00:03:47,110 +Và sau đó khi hàm đó + +58 +00:03:47,110 --> 00:03:51,640 +được gọi, nó thực sự vượt qua giá trị mà tỷ lệ hiện đang ở và + +59 +00:03:51,640 --> 00:03:55,480 +đó là những gì đang được in. Tiếp theo, chúng tôi có + +60 +00:03:55,510 --> 00:03:59,830 +một hộp kiểm và chúng tôi có thể nhấp vào bật hoặc tắt nó. + +61 +00:03:59,920 --> 00:04:04,920 +Và chúng ta có thể in một hoặc 0 bằng cách chỉ cần gắn hộp kiểm đó với một biến. + +62 +00:04:07,240 --> 00:04:12,240 +Và biến này là thứ được mô-đun tkinter định nghĩa là IntVar. + +63 +00:04:13,360 --> 00:04:15,070 +Vì vậy, đây thực sự là một lớp học. + +64 +00:04:15,550 --> 00:04:18,490 +Và một khi chúng ta tạo đối tượng đó từ lớp, sau đó chúng + +65 +00:04:18,550 --> 00:04:22,029 +ta có thể thêm nó vào nút kiểm tra của mình khi chúng ta tạo nó và + +66 +00:04:22,480 --> 00:04:27,480 +biến đó sẽ theo dõi giá trị của hộp kiểm đó. 1 để bật và 0 + +67 +00:04:28,510 --> 00:04:31,930 +cho tắt. Và sau đó chúng tôi có thể + +68 +00:04:31,990 --> 00:04:34,150 +in nó ra khi nút kiểm tra đó được sử dụng. + +69 +00:04:36,490 --> 00:04:40,300 +Giờ đây, các nút radio rất hữu ích để chọn giữa các tùy chọn khác nhau. + +70 +00:04:40,540 --> 00:04:44,320 +Vì vậy, thông thường bạn sẽ có một số tùy chọn và chỉ một trong số chúng + +71 +00:04:44,380 --> 00:04:48,460 +có thể được chọn bất kỳ lúc nào. Vì vậy, trong trường hợp này, một lần + +72 +00:04:48,460 --> 00:04:52,570 +nữa, chúng ta tạo một IntVar và chúng ta gắn var đó với mỗi nút radio mà + +73 +00:04:52,600 --> 00:04:54,760 +chúng ta tạo, sau đó chúng ta cung cấp + +74 +00:04:55,150 --> 00:04:58,990 +cho mỗi nút radio một giá trị. Vì vậy, cái này có giá trị + +75 +00:04:58,990 --> 00:05:03,910 +1, cái này có giá trị 2 và cả hai đều được gắn với trạng thái vô tuyến IntVar. + +76 +00:05:04,390 --> 00:05:07,570 +Và sau đó khi nút đó được thay đổi, thì + +77 +00:05:07,840 --> 00:05:12,550 +chúng ta thực sự có thể nắm được trạng thái radio bằng cách gọi radio_state. + +78 +00:05:12,580 --> 00:05:16,990 +nhận và khi bạn nhận được bất kỳ giá trị nào thì nó hiện đang được + +79 +00:05:17,020 --> 00:05:20,740 +chọn, vì vậy option1 hoặc option2. Bây giờ cuối cùng, chúng + +80 +00:05:20,770 --> 00:05:22,720 +ta đã có một hộp danh sách + +81 +00:05:22,750 --> 00:05:27,250 +chỉ là một danh sách các tùy chọn được tạo từ một danh sách Python. + +82 +00:05:27,310 --> 00:05:29,020 +Chúng tôi sẽ lặp qua từng mục, + +83 +00:05:29,350 --> 00:05:34,350 +chèn nó vào hộp danh sách của chúng tôi và sau đó khi hộp danh sách được sử dụng, chúng tôi sử dụng + +84 +00:05:35,290 --> 00:05:40,290 +hàm liên kết này để gọi lại cuộc gọi cụ thể này. Bằng cách này bất cứ khi nào chúng ta + +85 +00:05:41,620 --> 00:05:44,350 +chọn bất kỳ mục nào trong đây, nó sẽ in + +86 +00:05:44,620 --> 00:05:49,510 +ra và nhận được lựa chọn hiện tại. Bây giờ, rất nhiều đoạn + +87 +00:05:49,570 --> 00:05:53,890 +mã này sẽ được sử dụng giống nhau mỗi lần. + +88 +00:05:53,920 --> 00:05:58,220 +Vì vậy, sẽ không thực sự quan trọng nếu bạn không hiểu đầy đủ chính xác một số + +89 +00:05:58,220 --> 00:05:59,930 +thành phần kỳ lạ này là gì. + +90 +00:06:00,230 --> 00:06:05,230 +Đó chỉ là một yếu tố về cách thư viện tkinter này đã lấy mô-đun tk này và + +91 +00:06:07,940 --> 00:06:12,590 +biến nó thành một định dạng Python để chúng ta có thể tương tác với nó bằng + +92 +00:06:12,590 --> 00:06:13,100 +Python. + +93 +00:06:13,100 --> 00:06:17,750 +Vì vậy, có một số bit kỳ lạ như hộp danh sách chọn này hoặc điều này, ừm, kết thúc + +94 +00:06:17,840 --> 00:06:19,880 +đang được sử dụng ở đây, nhưng bạn + +95 +00:06:20,390 --> 00:06:24,230 +có thể thấy rằng mỗi dòng được nhận xét và nó cho bạn biết nó làm gì. + +96 +00:06:24,560 --> 00:06:28,130 +Vì vậy, bạn sẽ có thể tìm ra dòng mã nào bạn + +97 +00:06:28,130 --> 00:06:33,130 +cần viết để thêm một số văn bản hoặc để nhận một số văn bản hoặc cách liên + +98 +00:06:35,480 --> 00:06:40,480 +kết một hàm với hộp danh sách và cách giữ giá trị hiện đang được chọn . + +99 +00:06:41,960 --> 00:06:46,960 +Tôi khuyên bạn nên truy cập liên kết này tại đây và tải xuống mã và mở nó trong + +100 +00:06:47,150 --> 00:06:49,490 +PyCharm nếu bạn thích, bởi vì sau đó + +101 +00:06:49,850 --> 00:06:54,560 +bạn thực sự có thể nhận được phiên bản lớn hơn nhiều của chương trình đang chạy hoặc + +102 +00:06:54,860 --> 00:06:56,120 +cách khác, chỉ cần + +103 +00:06:56,150 --> 00:07:00,080 +chơi với mã tại đây. rằng bạn hiểu cách hoạt động của các vật dụng + +104 +00:07:00,080 --> 00:07:04,010 +này và cách bạn có thể sử dụng nó về cơ bản như một pallet + +105 +00:07:04,370 --> 00:07:06,860 +nếu bạn muốn có một vài hộp kiểm hoặc + +106 +00:07:06,860 --> 00:07:09,800 +nếu bạn muốn một vài hộp quay, thì bạn chỉ cần + +107 +00:07:09,800 --> 00:07:13,670 +chọn và chọn chúng từ sách dạy nấu ăn này về cơ bản và + +108 +00:07:13,940 --> 00:07:17,990 +sau đó bạn có thể đưa chúng vào chương trình của mình khi cần thiết. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Tkinter-Widget-Example-Code-Palette.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Tkinter-Widget-Example-Code-Palette.url new file mode 100644 index 0000000000000000000000000000000000000000..bb659dbcb2a155bdabc9bd32ba1e5512d0f8f67b --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/010 Tkinter-Widget-Example-Code-Palette.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/tkinter-widget-demo \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Day-27-End-Code.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Day-27-End-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..6707ec5316bde7148c35be7f05dd38d98b0d2d6b --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Day-27-End-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-27-end \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Tkinter Layout Managers pack(), place() and grid().mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Tkinter Layout Managers pack(), place() and grid().mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c48e9c2f305a0cd47c69f73266834ffaa7c18683 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Tkinter Layout Managers pack(), place() and grid().mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04419a9313f45b14fd66bae37d38d265c4dd13fd836523cc639e755f9d3da3df +size 75196646 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Tkinter Layout Managers pack(), place() and grid()_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Tkinter Layout Managers pack(), place() and grid()_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..782b7a2fbfee4dc19c222640d1ec7d3f7c408286 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/011 Tkinter Layout Managers pack(), place() and grid()_vi.srt @@ -0,0 +1,640 @@ +1 +00:00:00,570 --> 00:00:03,480 +Bây giờ trở lại chính của chúng tôi. py chương trình trước + +2 +00:00:03,780 --> 00:00:07,170 +đây của chúng tôi có một nhãn, một nút và + +3 +00:00:07,200 --> 00:00:10,320 +một mục nhập, và nó tương đối đơn giản. + +4 +00:00:10,740 --> 00:00:13,560 +Vì vậy, tôi sẽ quay trở lại chính này. tệp py trong đó chúng + +5 +00:00:13,830 --> 00:00:18,570 +tôi chỉ có ba tiện ích để tôi có thể chỉ cho bạn cách chúng tôi có thể + +6 +00:00:18,570 --> 00:00:22,350 +xác định bố cục và vị trí của từng tiện ích của chúng tôi. + +7 +00:00:23,460 --> 00:00:28,380 +Đầu tiên, tôi đã định cấu hình lại tệp một chút. Vì vậy, tôi đã chuyển chức năng + +8 +00:00:28,380 --> 00:00:30,060 +button _clicked lên trên cùng + +9 +00:00:30,540 --> 00:00:35,540 +và tôi đã đảm bảo rằng mỗi phương thức đóng gói đều nằm ở + +10 +00:00:37,110 --> 00:00:41,760 +cuối mỗi widget. Bằng cách đó, chúng tôi sẽ có thể làm việc với nó khá dễ dàng. Bây giờ, như tôi + +11 +00:00:41,760 --> 00:00:45,930 +đã đề cập trước đây, tkinter có một loạt các trình quản lý bố + +12 +00:00:45,930 --> 00:00:50,930 +cục khác nhau xác định cách định vị từng widget trong chương trình GUI của bạn. + +13 +00:00:52,440 --> 00:00:56,340 +Bây giờ có ba điều bạn nên biết, đóng gói, đặt và lưới. + +14 +00:00:57,270 --> 00:00:58,080 +Bây giờ, + +15 +00:00:58,080 --> 00:01:03,080 +trước tiên, chúng ta đã thấy gói và tất cả những gì gói đó làm là về cơ + +16 +00:01:04,319 --> 00:01:08,340 +bản nó gói từng widget bên cạnh nhau theo một định dạng logic mơ hồ. + +17 +00:01:08,970 --> 00:01:10,470 +Và theo mặc định, gói sẽ + +18 +00:01:10,470 --> 00:01:15,470 +luôn bắt đầu từ trên cùng và sau đó đóng gói mọi tiện ích con khác ngay dưới + +19 +00:01:15,600 --> 00:01:18,360 +tiện ích trước đó. Như tôi đã đề + +20 +00:01:18,390 --> 00:01:23,390 +cập, bạn có thể thay đổi điều này bằng cách thêm một tham số bên và bạn có + +21 +00:01:24,840 --> 00:01:27,360 +thể thay đổi nó thành ví dụ: side = left. + +22 +00:01:27,900 --> 00:01:31,200 +Và nếu bạn thay đổi điều này cho tất cả + +23 +00:01:31,260 --> 00:01:36,090 +các gói, thì nó sẽ đóng gói mọi thứ bắt đầu từ cạnh trái + +24 +00:01:36,390 --> 00:01:40,890 +của chương trình như thế này. Và bạn cũng có thể thay đổi thành dưới cùng hoặc sang phải. + +25 +00:01:41,550 --> 00:01:46,550 +Nhưng vấn đề với pack là nó thực sự khá khó để chỉ định một vị + +26 +00:01:46,800 --> 00:01:49,080 +trí chính xác. Vì vậy, ví dụ, + +27 +00:01:49,080 --> 00:01:53,370 +nếu bạn muốn nhãn này lên một chút và sau đó nút này xuống một chút và + +28 +00:01:53,370 --> 00:01:57,240 +mục nhập này nằm ở bên phải. Rất, rất phức tạp để + +29 +00:01:57,240 --> 00:01:59,910 +làm điều đó bằng cách sử dụng pack. + +30 +00:02:00,390 --> 00:02:03,360 +Và đó là lý do tại sao không chỉ có một trình quản lý bố cục + +31 +00:02:03,390 --> 00:02:06,870 +duy nhất mà còn có rất nhiều người khác. Vì vậy, chúng ta hãy + +32 +00:02:06,870 --> 00:02:11,760 +xem xét tiếp theo, được gọi là địa điểm. Vị trí là tất cả về vị trí chính xác. + +33 +00:02:12,300 --> 00:02:14,430 +Vì vậy, khi bạn đặt thứ gì đó, bạn có + +34 +00:02:14,910 --> 00:02:18,870 +thể cung cấp giá trị X và Y. Vì vậy, ví dụ, tôi + +35 +00:02:18,870 --> 00:02:22,890 +có thể nói nhãn của tôi. và sau đó tôi có thể + +36 +00:02:22,890 --> 00:02:27,300 +nói, tốt, giá trị X phải bằng 0 và giá trị Y phải bằng 0. + +37 +00:02:27,720 --> 00:02:31,500 +Và điều này chỉ đặt nhãn đó ở góc trên cùng bên trái. + +38 +00:02:32,160 --> 00:02:36,270 +Bây giờ, điều quan trọng cần nhớ là nếu một tiện ích được tạo nhưng nó không + +39 +00:02:36,570 --> 00:02:41,010 +có bất kỳ bố cục nào được chỉ định bằng cách sử dụng gói, vị trí hoặc lưới, thì + +40 +00:02:41,250 --> 00:02:43,920 +nó sẽ không được hiển thị như bạn có thể thấy + +41 +00:02:43,920 --> 00:02:48,920 +ở đây, chúng tôi chỉ có nhãn hiển thị . Bây giờ chúng tôi đã đặt nhãn của mình ở góc trên + +42 +00:02:49,200 --> 00:02:52,110 +cùng bên trái, chúng tôi có thể thử đặt nó ở một nơi khác. + +43 +00:02:52,380 --> 00:02:55,260 +Vì vậy, hãy di chuyển nó một chút dọc theo trục X. + +44 +00:02:55,290 --> 00:02:58,350 +Vì vậy, giả sử đặt nó trên a (100, 0) Điều đó di chuyển + +45 +00:02:58,800 --> 00:03:02,320 +nó sang bên phải một chút nữa và nếu chúng ta muốn di chuyển nó xuống, + +46 +00:03:02,320 --> 00:03:04,570 +chúng ta có thể thay đổi vị trí Y. + +47 +00:03:04,930 --> 00:03:09,310 +Vì vậy, bây giờ nó đang ở dưới cùng và sau đó X là 100. Bây giờ, hãy nhớ rằng chúng ta + +48 +00:03:09,310 --> 00:03:13,750 +đã xác định chiều rộng và chiều cao. Vì vậy, chiều rộng là 500 pixel, chiều cao + +49 +00:03:13,750 --> 00:03:17,440 +là 300 pixel và ở bất kỳ đâu dọc theo màn hình đó, bạn + +50 +00:03:17,710 --> 00:03:22,710 +có thể xác định giá trị X và Y cho một tiện ích cụ thể để đặt nó ở vị + +51 +00:03:23,380 --> 00:03:24,760 +trí chính xác đó. + +52 +00:03:25,630 --> 00:03:30,630 +Mặt khác, nhược điểm của vị trí là thực tế là nó quá cụ thể và chúng + +53 +00:03:31,540 --> 00:03:36,010 +tôi phải tính toán trong đầu về tọa độ và vị trí đặt mỗi widget. + +54 +00:03:36,400 --> 00:03:39,820 +Nó đủ đơn giản nếu bạn chỉ có ba widget như chúng tôi có ở + +55 +00:03:40,120 --> 00:03:42,490 +đây, nhưng nếu bạn có một trăm hoặc năm mươi, + +56 +00:03:42,490 --> 00:03:46,870 +thì điều đó nhanh chóng trở thành một cơn ác mộng để quản lý các tọa độ chính xác + +57 +00:03:46,930 --> 00:03:47,920 +của từng widget. + +58 +00:03:48,910 --> 00:03:53,260 +Vì vậy, ngoài việc đóng gói và đặt, còn có một trình quản lý bố cục + +59 +00:03:53,350 --> 00:03:55,300 +cuối cùng cũng là trình quản + +60 +00:03:55,660 --> 00:04:00,160 +lý yêu thích của tôi, đó là lưới. Và lưới là một khái niệm thực sự đơn giản. + +61 +00:04:00,490 --> 00:04:05,490 +Nó tưởng tượng rằng toàn bộ chương trình của bạn là một lưới và bạn có thể chia nó thành bất + +62 +00:04:06,640 --> 00:04:08,770 +kỳ số cột và hàng nào bạn muốn. + +63 +00:04:09,190 --> 00:04:13,660 +Vì vậy, xin nhắc lại, hàng là hàng dọc theo chiều ngang và + +64 +00:04:13,660 --> 00:04:16,450 +cột là hàng dọc theo chiều dọc. + +65 +00:04:17,529 --> 00:04:22,330 +Nếu tôi xóa vị trí của mình và thay vào đó tôi sử dụng lưới của mình, tôi + +66 +00:04:22,630 --> 00:04:25,330 +có thể nói my_label. lưới, và sau + +67 +00:04:25,660 --> 00:04:29,680 +đó tôi có thể cung cấp một số cột và một hàng. + +68 +00:04:29,710 --> 00:04:34,120 +Vì vậy, giả sử tôi sẽ đặt nó ở cột đầu tiên và hàng đầu tiên. + +69 +00:04:34,150 --> 00:04:38,320 +Vì vậy, sau đó bắt đầu từ số không để chúng ta có thể nói + +70 +00:04:38,320 --> 00:04:42,010 +cột = 0, hàng = 0. Và bạn có thể thấy rằng nó được đặt ở góc trên cùng bên trái. + +71 +00:04:42,760 --> 00:04:47,170 +Bây giờ hệ thống lưới là tương đối so với các thành phần khác. + +72 +00:04:47,410 --> 00:04:52,240 +Vì vậy, ngay cả khi tôi thay đổi cột này thành, tôi không biết, năm và hàng thành năm, bạn + +73 +00:04:52,600 --> 00:04:55,750 +có thể thấy rằng nó không thực sự thay đổi bố cục + +74 +00:04:55,750 --> 00:04:58,990 +vì không có tiện ích con nào trong cột bốn, ba, hai hoặc một. + +75 +00:04:59,200 --> 00:05:01,900 +Vì vậy, nó vẫn là cái đầu tiên trong lưới. + +76 +00:05:03,340 --> 00:05:05,620 +Vì vậy, cách dễ nhất để làm việc với + +77 +00:05:05,650 --> 00:05:08,830 +lưới là bắt đầu với những thứ bạn muốn nó nằm ở trên + +78 +00:05:09,070 --> 00:05:12,010 +cùng bên trái, xác định cột bắt đầu và các hàng, không, + +79 +00:05:12,370 --> 00:05:17,320 +không, sau đó cho các tiện ích con tiếp theo và tiếp tục đi qua nó và xác định vị + +80 +00:05:17,350 --> 00:05:20,530 +trí của nó trên lưới. Ví dụ: nếu tôi + +81 +00:05:20,530 --> 00:05:25,530 +muốn nút nằm trên cột một và hàng một và sau đó tôi muốn mục + +82 +00:05:27,970 --> 00:05:30,580 +nhập của tôi được gọi là đầu vào + +83 +00:05:30,610 --> 00:05:35,610 +nằm trên lưới ở cột hai và hàng hai, bây giờ nếu bạn chạy điều + +84 +00:05:39,580 --> 00:05:41,230 +này, bạn có thể thấy + +85 +00:05:41,260 --> 00:05:45,100 +nó bây giờ đã được đặt dọc theo lưới của chúng tôi. + +86 +00:05:45,640 --> 00:05:48,040 +Và đây thực sự là những gì nó trông như thế nào. + +87 +00:05:48,400 --> 00:05:51,160 +Nhãn của chúng tôi ở cột 0 hàng + +88 +00:05:51,160 --> 00:05:53,590 +0, nút ở cột một hàng + +89 +00:05:53,590 --> 00:05:56,860 +một và mục nhập ở cột hai hàng hai. + +90 +00:05:58,130 --> 00:06:03,130 +Đây là một trong những cách dễ dàng nhất để hình dung và tạo bố cục cho các + +91 +00:06:03,920 --> 00:06:07,400 +chương trình tkinter của bạn. Và nó thực sự + +92 +00:06:07,490 --> 00:06:10,850 +linh hoạt, dễ hình dung và dễ hiểu. + +93 +00:06:11,120 --> 00:06:16,100 +Vì vậy, đây luôn là cách làm việc ưa thích của tôi với bố + +94 +00:06:16,130 --> 00:06:18,620 +cục cho tkinter. Chỉ là một lời cảnh báo mặc dù. + +95 +00:06:18,650 --> 00:06:23,650 +Bạn không thể kết hợp lưới và đóng gói trong cùng một chương trình. + +96 +00:06:23,990 --> 00:06:28,760 +Vì vậy, ví dụ: nếu tôi muốn nhãn và nút của mình được xác định bởi lưới nhưng sau đó + +97 +00:06:29,060 --> 00:06:34,060 +tôi quyết định sử dụng phương thức gói cho mục nhập cuối cùng của mình, thì bạn có thể thấy rằng + +98 +00:06:35,600 --> 00:06:40,580 +tôi thực sự gặp lỗi khi chạy mã của mình. Nó nói, không thể sử dụng gói trình + +99 +00:06:40,610 --> 00:06:43,070 +quản lý hình học đã có + +100 +00:06:43,250 --> 00:06:45,980 +các nô lệ được quản lý bằng lưới. + +101 +00:06:46,370 --> 00:06:49,010 +Vì vậy, hai điều này là không tương thích với nhau. + +102 +00:06:49,010 --> 00:06:51,890 +Về cơ bản bạn phải chọn cái này hay cái kia. + +103 +00:06:52,490 --> 00:06:57,050 +Và thường thì tôi sẽ chọn lưới vì nó linh hoạt hơn + +104 +00:06:57,050 --> 00:07:00,980 +và dễ hiểu hơn. Vì vậy, bây giờ ở đây có một thách thức cho bạn. + +105 +00:07:01,520 --> 00:07:06,380 +Tôi muốn bạn thay đổi mã mà chúng tôi đã viết để chúng tôi kết + +106 +00:07:06,380 --> 00:07:10,310 +thúc với bố cục này. Vì vậy, chúng tôi đã có một nhãn, một nút và một mục nhập. + +107 +00:07:10,670 --> 00:07:15,650 +Tôi muốn bạn thêm một nút mới và nó sẽ được định vị như thế này. + +108 +00:07:15,950 --> 00:07:19,940 +Hãy suy nghĩ về cách bạn có thể giải quyết thử thách này bằng cách sử dụng hệ + +109 +00:07:19,940 --> 00:07:23,750 +thống lưới mà bạn đã học vừa rồi. Tạm dừng video và hoàn thành thử thách. + +110 +00:07:25,400 --> 00:07:29,510 +Được rồi. Vì vậy, điều đầu tiên bạn + +111 +00:07:29,510 --> 00:07:33,590 +nhận thấy là nhãn vẫn ở cột số không, hàng không, nút vẫn + +112 +00:07:33,980 --> 00:07:38,690 +ở hàng một cột một, nhưng nút mới này bây giờ ở hàng không cột hai. + +113 +00:07:39,350 --> 00:07:41,060 +Vì vậy, hãy tiếp tục và tạo ra nó. + +114 +00:07:41,960 --> 00:07:46,370 +Bây giờ tôi sẽ tạo một nút mới và tôi sẽ không lo lắng về lệnh của nó hay + +115 +00:07:46,370 --> 00:07:47,720 +bất kỳ điều gì khác. + +116 +00:07:48,050 --> 00:07:51,830 +Tôi sẽ cung cấp cho nó một đoạn văn bản để chúng tôi có thể xác định nó và tôi sẽ gọi + +117 +00:07:51,830 --> 00:07:52,700 +nó là nút mới. + +118 +00:07:53,240 --> 00:07:57,530 +Nhưng sau đó, điều quan trọng nhất là cách chúng tôi bố trí nút mới này. + +119 +00:07:58,010 --> 00:08:02,990 +Vì vậy, tôi sẽ sử dụng hệ thống lưới và tôi sẽ cung cấp cho nó + +120 +00:08:03,260 --> 00:08:05,990 +một cột hai vì nó là 0, một, + +121 +00:08:06,170 --> 00:08:10,550 +hai, cột thứ ba từ bên trái và sau đó hàng sẽ bằng không. + +122 +00:08:13,580 --> 00:08:17,090 +Bây giờ, khi tôi chạy đoạn mã này, bạn sẽ nhận thấy điều gì đó hơi kỳ lạ. + +123 +00:08:17,510 --> 00:08:21,980 +Tại sao mục nhập ở dưới nút? Bởi vì trong ví dụ của chúng + +124 +00:08:22,040 --> 00:08:26,750 +tôi, mục nhập thực sự nằm ở bên phải của nút mới này trong một cột mới. + +125 +00:08:27,500 --> 00:08:31,520 +Bằng cách đặt nút mới này giữa nút cũ và mục nhập, chúng tôi đã + +126 +00:08:31,520 --> 00:08:34,940 +thực sự thay đổi vị trí của mục nhập đó trên lưới. + +127 +00:08:35,240 --> 00:08:39,350 +Vì vậy, chúng tôi thực sự phải chuyển nó sang cột tiếp theo. + +128 +00:08:39,950 --> 00:08:41,000 +Vì vậy, để + +129 +00:08:41,030 --> 00:08:46,030 +làm điều đó, chúng ta phải thay đổi lưới của mục nhập của chúng ta thay vì + +130 +00:08:46,520 --> 00:08:51,380 +có cột hai, thành cột ba, sao cho nó ở bên phải của nút mới này. + +131 +00:08:52,130 --> 00:08:55,890 +Và bây giờ khi tôi chạy nó, nó có bố cục chính xác mà chúng + +132 +00:08:56,280 --> 00:09:01,080 +tôi muốn và bây giờ chúng tôi đã học được một chút về cách chúng tôi có thể định vị chính + +133 +00:09:01,080 --> 00:09:06,080 +xác các widget trong chương trình của mình bằng cách sử dụng trình quản lý bố cục gói, địa điểm và lưới. + +134 +00:09:08,610 --> 00:09:13,610 +Điều cuối cùng tôi muốn cho bạn thấy liên quan đến bố cục và thiết kế của các chương + +135 +00:09:14,730 --> 00:09:19,320 +trình GUI của chúng tôi là cách thêm một chút khoảng đệm xung quanh các thành phần. + +136 +00:09:19,920 --> 00:09:24,920 +Cách dễ nhất để thêm padding là sửa đổi trực tiếp các widget. + +137 +00:09:25,410 --> 00:09:26,310 +Vì vậy, ví + +138 +00:09:26,310 --> 00:09:30,450 +dụ: nếu tôi muốn một chút đệm xung quanh tất cả các phần tử trong cửa sổ + +139 +00:09:30,450 --> 00:09:33,570 +của mình, vì vậy về cơ bản đã thêm xung quanh mép cửa + +140 +00:09:33,960 --> 00:09:38,960 +sổ, thì tôi có thể chỉ cần nói cửa sổ. config và tôi có thể thay + +141 +00:09:42,060 --> 00:09:45,900 +đổi padding trong trục X và padding trong trục Y, + +142 +00:09:45,930 --> 00:09:48,360 +vì vậy padx và pady. + +143 +00:09:48,870 --> 00:09:51,990 +Vì vậy, bây giờ nếu tôi chạy chương trình này như hiện tại, + +144 +00:09:52,290 --> 00:09:57,290 +bạn có thể thấy rằng bây giờ có nhiều không gian hơn đang được thêm vào xung quanh tất cả bốn + +145 +00:09:58,320 --> 00:10:02,190 +cạnh của chương trình của chúng tôi. Bây giờ tôi có thể làm cho điều này trở nên khắc nghiệt hơn rất nhiều. + +146 +00:10:02,190 --> 00:10:07,190 +Vì vậy, giả sử tôi thêm padx là 100 và pady là 200, bạn có thể + +147 +00:10:08,610 --> 00:10:11,340 +thấy chúng ta đã thêm bao nhiêu pad. + +148 +00:10:12,450 --> 00:10:16,170 +Và điều này chỉ có nghĩa là bạn thêm nhiều không gian xung quanh chương trình của mình + +149 +00:10:16,170 --> 00:10:19,380 +và nó làm cho mọi thứ dễ nhìn hơn và trông đẹp hơn một chút. + +150 +00:10:20,670 --> 00:10:25,080 +Nếu bạn muốn thêm phần đệm xung quanh một tiện ích cụ thể không chỉ toàn bộ cửa sổ, thì + +151 +00:10:25,350 --> 00:10:30,350 +bạn có thể làm tương tự với tiện ích đó. Vì vậy, chúng tôi có thể nắm giữ nhãn của tôi và + +152 +00:10:30,480 --> 00:10:30,750 +một + +153 +00:10:30,750 --> 00:10:35,750 +lần nữa sử dụng cấu hình để thay đổi padx và pady. Vì vậy, hãy thêm, có lẽ + +154 +00:10:36,720 --> 00:10:41,310 +tôi không biết, 50 pixel đệm trong chữ X và chữ Y. + +155 +00:10:43,320 --> 00:10:45,570 +Bây giờ bạn có thể thấy rằng xung + +156 +00:10:45,600 --> 00:10:50,490 +quanh nhãn đó có rất nhiều không gian để nó đẩy mọi thứ khác ra xa và thực sự làm + +157 +00:10:50,490 --> 00:10:53,010 +cho toàn bộ cửa sổ chương trình lớn hơn rất nhiều. + +158 +00:10:53,640 --> 00:10:58,640 +Vì vậy, đây chỉ là một cách để bạn có thể thêm không gian xung quanh các vật dụng của mình để chúng + +159 +00:10:59,160 --> 00:11:00,840 +không bị nghiền nát với nhau và + +160 +00:11:01,080 --> 00:11:03,480 +nó giúp bạn bố trí và thiết kế của mình. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Course-Fixes-Report-an-Issue.url b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Mile to Kilometers Converter Project.mp4 b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Mile to Kilometers Converter Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..069e5de72915ebdb7a2c8fccd6367877bc9c1489 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Mile to Kilometers Converter Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b214e8085c3fce33bc873280ae63808bf631ce50f0ef6e041f76b8f6c50a675d +size 114273897 diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Mile to Kilometers Converter Project_vi.srt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Mile to Kilometers Converter Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7c54d65c710f1b48ad854ada64007238256aef27 --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/012 Mile to Kilometers Converter Project_vi.srt @@ -0,0 +1,680 @@ +1 +00:00:00,090 --> 00:00:00,780 +Được rồi, các + +2 +00:00:00,780 --> 00:00:04,980 +bạn, cuối cùng đã đến lúc đưa mọi thứ bạn đã học được cho đến ngày hôm nay vào thực + +3 +00:00:05,280 --> 00:00:08,370 +tế và xây dựng công cụ chuyển đổi từ dặm sang km của chúng tôi. + +4 +00:00:09,390 --> 00:00:12,120 +Đây là kết quả cuối cùng sẽ như thế nào. + +5 +00:00:12,150 --> 00:00:16,170 +Đây là chương trình GUI của chúng tôi, nơi chúng tôi có một mục nhập văn + +6 +00:00:16,200 --> 00:00:19,530 +bản, chúng tôi có một số nhãn và chúng tôi có một nút. + +7 +00:00:19,950 --> 00:00:23,430 +Vì vậy, tôi sẽ có thể nhập một số dặm nhất định và sau đó + +8 +00:00:23,760 --> 00:00:25,350 +khi tôi nhấn tính toán, nó + +9 +00:00:25,440 --> 00:00:30,030 +sẽ cung cấp cho tôi số km tương đương. Bây giờ, ở đây, tôi đã + +10 +00:00:30,210 --> 00:00:32,549 +làm tròn nó đến số nguyên gần nhất, + +11 +00:00:32,549 --> 00:00:36,660 +nhưng hãy thoải mái quyết định bao nhiêu chữ số thập phân bạn muốn. + +12 +00:00:37,020 --> 00:00:40,170 +Nhưng điều quan trọng là để nó hoạt động, trước hết, + +13 +00:00:40,500 --> 00:00:45,500 +mà còn là bạn phải có thể sử dụng và đặt tất cả các thành phần này + +14 +00:00:45,990 --> 00:00:49,770 +và tuân theo bố cục này. Chỉ cần chia nhỏ bố cục, bạn + +15 +00:00:49,800 --> 00:00:52,950 +có thể thấy tôi có một widget mục nhập và đây là + +16 +00:00:53,040 --> 00:00:56,190 +tất cả các widget nhãn. Và cuối cùng, tôi có + +17 +00:00:56,190 --> 00:01:01,110 +một tiện ích nút và chúng được chia dọc theo một lưới trông giống như + +18 +00:01:01,110 --> 00:01:02,160 +thế này. + +19 +00:01:02,850 --> 00:01:07,470 +Trước tiên, hãy suy nghĩ về cách bạn có thể tạo bố cục và thiết kế, sau + +20 +00:01:07,860 --> 00:01:12,240 +đó tiếp tục thêm phần triển khai và xem liệu bạn có thể hoàn thành dự + +21 +00:01:12,240 --> 00:01:15,090 +án này hay không. Vì vậy, hãy tạm dừng video ngay bây giờ và thử xem. + +22 +00:01:18,810 --> 00:01:20,760 +Hãy thoải mái tạo + +23 +00:01:20,760 --> 00:01:25,230 +nó bên trong chính của bạn. py bằng cách bình luận mọi thứ khác ra ngoài hoặc như trong + +24 +00:01:25,260 --> 00:01:27,150 +trường hợp của tôi, tôi thực sự sẽ tạo một tệp + +25 +00:01:27,540 --> 00:01:32,540 +mới, cái mà tôi sẽ gọi là mile_to_kilo_converter. py Bên trong tệp mới này là nơi tôi + +26 +00:01:36,690 --> 00:01:39,690 +sẽ tạo dự án của mình. Và trước hết, + +27 +00:01:39,990 --> 00:01:44,910 +tôi sẽ tiếp tục và nhập mọi thứ từ mô-đun tkinter. + +28 +00:01:46,410 --> 00:01:50,490 +Vì vậy, hãy nhập *, và bây giờ tôi đã có tất cả các lớp của mình. + +29 +00:01:51,240 --> 00:01:55,200 +Tất nhiên, điều tiếp theo tôi sẽ làm là tạo cửa sổ của chúng ta. + +30 +00:01:55,590 --> 00:02:00,590 +Vì vậy, nó sẽ được tạo từ lớp tk và cửa sổ của tôi sẽ + +31 +00:02:02,280 --> 00:02:03,113 +có một + +32 +00:02:03,120 --> 00:02:08,120 +tiêu đề, mà tôi sẽ gọi nó là bộ chuyển đổi dặm sang km. + +33 +00:02:10,350 --> 00:02:11,400 +Và cuối cùng, + +34 +00:02:11,430 --> 00:02:16,430 +chúng ta sẽ hiển thị cửa sổ của chúng ta và bắt đầu trong vòng lặp chính. + +35 +00:02:17,550 --> 00:02:21,690 +Ngay bây giờ nếu tôi chạy công cụ chuyển đổi dặm sang kilo tệp + +36 +00:02:21,990 --> 00:02:26,990 +này, bạn có thể thấy tôi vừa có một cửa sổ trống với tiêu đề công cụ chuyển + +37 +00:02:27,300 --> 00:02:29,670 +đổi dặm sang kilôgam. Sau đó, việc tiếp + +38 +00:02:29,670 --> 00:02:34,530 +theo cần làm là tạo tất cả các widget của chúng ta và trình bày nó trên màn hình. + +39 +00:02:35,010 --> 00:02:36,300 +Nếu chúng ta nhìn + +40 +00:02:36,300 --> 00:02:41,300 +vào bảng phân tích này, bạn có thể thấy chúng ta có một widget mục nhập ở đây và sau + +41 +00:02:41,520 --> 00:02:44,880 +đó là bốn widget nhãn khác nhau ở mỗi vị trí này và + +42 +00:02:44,880 --> 00:02:47,220 +cuối cùng tôi có một nút tính toán ở đây. + +43 +00:02:48,090 --> 00:02:51,840 +Vì vậy, tôi sẽ tạo từng widget này và sau đó tôi sẽ trình bày + +44 +00:02:51,840 --> 00:02:54,420 +chúng trên màn hình. Đầu tiên, + +45 +00:02:54,420 --> 00:02:57,000 +tôi có một widget + +46 +00:02:57,060 --> 00:03:00,550 +mile_inputs sẽ được tạo từ lớp entry. + +47 +00:03:01,930 --> 00:03:06,930 +Và sau đó tôi có một nhãn là nhãn dặm, và nó sẽ + +48 +00:03:08,530 --> 00:03:11,260 +được tạo từ một lớp nhãn. + +49 +00:03:11,890 --> 00:03:15,370 +Và nhãn sẽ chứa một số văn bản. + +50 +00:03:15,720 --> 00:03:20,720 +Văn bản sẽ chỉ nói Miles với chữ M viết hoa, như thế này. + +51 +00:03:22,000 --> 00:03:25,930 +Bây giờ cái tiếp theo chúng ta sẽ tạo là cái bằng với nhãn của chúng ta. + +52 +00:03:25,960 --> 00:03:29,410 +Vì vậy, tôi sẽ chỉ gọi nó là is_equal_label. + +53 +00:03:30,940 --> 00:03:34,270 +Và cái này sẽ, một lần nữa, chỉ là một số văn bản. + +54 +00:03:34,270 --> 00:03:36,520 +Nó sẽ không thực sự có nhiều chức năng. + +55 +00:03:39,010 --> 00:03:41,290 +Và sau đó chúng tôi có + +56 +00:03:41,290 --> 00:03:44,200 +nhãn thực sự sẽ là giá trị km. + +57 +00:03:44,530 --> 00:03:49,530 +Vì vậy, tôi sẽ tạo nó dưới dạng kilter_result_label. + +58 +00:03:50,880 --> 00:03:51,713 +1: Được rồi. + +59 +00:03:54,330 --> 00:03:59,160 +0: Và điều đó sẽ bắt đầu chỉ với một con số 0 lớn. Và cuối cùng, tôi đã + +60 +00:03:59,160 --> 00:04:01,320 +có nhãn km. + +61 +00:04:01,380 --> 00:04:02,213 +1: được + +62 +00:04:05,580 --> 00:04:09,510 +rồi, 0: ad, đây chỉ là nói, uh, KM, 1: + +63 +00:04:09,960 --> 00:04:10,793 +phải không? + +64 +00:04:12,120 --> 00:04:16,200 +0: Và điều cuối cùng mà tôi cần tạo là nút tính toán đó và + +65 +00:04:16,260 --> 00:04:19,350 +sau đó chúng ta sẽ hoàn thành với các widget 1: + +66 +00:04:19,380 --> 00:04:20,213 +phải không? + +67 +00:04:23,880 --> 00:04:27,390 +0: Và đây sẽ là văn bản của tính toán. + +68 +00:04:28,290 --> 00:04:30,570 +Vì vậy, bây giờ tôi đã tạo tất cả các widget của mình. + +69 +00:04:30,750 --> 00:04:34,740 +Nếu tôi đi và cố gắng chạy mã này, bạn sẽ thấy không có mã nào trong + +70 +00:04:34,740 --> 00:04:39,060 +số chúng được hiển thị bởi vì không có mã nào trong số chúng được hiển thị trên màn hình. + +71 +00:04:39,840 --> 00:04:40,500 +Tại thời + +72 +00:04:40,500 --> 00:04:45,500 +điểm này, cũng nên đề cập rằng nếu bạn vô tình bỏ sót một trong những tên đối + +73 +00:04:45,540 --> 00:04:46,560 +số từ khóa này, + +74 +00:04:46,590 --> 00:04:51,590 +thì bạn sẽ thực sự gặp lỗi và lỗi sẽ đọc một cái gì đó như thế này. + +75 +00:04:51,870 --> 00:04:56,520 +Đối tượng chuỗi không có thuộc tính tk, điều này có vẻ hơi khó hiểu. + +76 +00:04:56,820 --> 00:05:00,780 +Nhưng về cơ bản nếu bạn thấy điều đó, thì hãy xem qua, + +77 +00:05:00,780 --> 00:05:05,780 +hãy đảm bảo rằng bạn thực sự có văn bản = đó trong đó chứ không + +78 +00:05:05,850 --> 00:05:09,690 +chỉ là chuỗi thực tế. Đó là một sai lầm thực sự phổ biến mà học sinh mắc phải. + +79 +00:05:10,710 --> 00:05:13,860 +Vì vậy, điều tiếp theo tôi muốn làm là sử dụng phương pháp + +80 +00:05:13,890 --> 00:05:18,090 +bố trí lưới của tôi để bố trí tất cả các thành phần này vào đúng vị trí. + +81 +00:05:18,360 --> 00:05:22,020 +Vì vậy, về cơ bản tôi sẽ có một lưới với ba cột và ba hàng. + +82 +00:05:22,080 --> 00:05:24,630 +Vì vậy, đây sẽ là cột không, một, hai, và + +83 +00:05:24,960 --> 00:05:27,360 +sau đó đây sẽ là hàng không, một hai. + +84 +00:05:28,470 --> 00:05:30,540 +Vì vậy, điều đó sẽ tương đối đơn giản. + +85 +00:05:30,570 --> 00:05:34,350 +Và hãy bắt đầu với mile_input của chúng tôi. lưới, và chúng + +86 +00:05:35,100 --> 00:05:40,100 +ta sẽ viết số cột và số hàng. + +87 +00:05:41,760 --> 00:05:45,090 +Bây giờ tôi sẽ sao chép nó vì tôi sẽ cần sử dụng nó + +88 +00:05:45,090 --> 00:05:45,923 +một vài lần. + +89 +00:05:46,080 --> 00:05:50,820 +Và sau đó tôi sẽ tham khảo kết quả cuối cùng và bạn có thể thấy mục nhập của chúng tôi ở đây. + +90 +00:05:50,820 --> 00:05:54,090 +Vì vậy, nó sẽ nằm trên cột một, hàng không, 1: + +91 +00:05:55,590 --> 00:05:56,423 +phải không? + +92 +00:05:58,250 --> 00:06:01,910 +0: Và sau đó hãy xác định nhãn dặm trên lưới. + +93 +00:06:03,320 --> 00:06:07,880 +Và cái này tôi nghĩ sẽ là cột hai, hàng không. + +94 +00:06:10,580 --> 00:06:14,900 +Và sau đó tôi sẽ đi qua tất cả các widget này và xác định chúng + +95 +00:06:14,900 --> 00:06:15,733 +trên lưới, 1: + +96 +00:06:20,770 --> 00:06:21,603 +phải không? + +97 +00:06:21,850 --> 00:06:22,990 +0: Vì vậy, họ là bạn có nó. + +98 +00:06:23,170 --> 00:06:27,940 +Chúng tôi đã có tất cả các cột và hàng tương ứng với vị trí của từng tiện ích con + +99 +00:06:27,940 --> 00:06:32,680 +này trong bố cục cuối cùng của chúng tôi. Bây giờ, nếu tôi chạy mã + +100 +00:06:32,680 --> 00:06:36,010 +của mình, bạn sẽ thấy phiên bản này hiển thị. + +101 +00:06:37,210 --> 00:06:39,910 +Bây giờ chúng tôi phải thực hiện một số sàng lọc. + +102 +00:06:40,210 --> 00:06:45,210 +Và điều đầu tiên bạn nhận thấy là mục này quá lớn. + +103 +00:06:45,820 --> 00:06:48,490 +Vì vậy, hãy tiếp tục và thay đổi chiều + +104 +00:06:48,910 --> 00:06:53,530 +rộng của nó, và tôi sẽ thay đổi nó thành chỉ năm hoặc bảy, về cơ + +105 +00:06:54,010 --> 00:06:58,420 +bản không phải là quá rộng. Bằng cách đó, nó sẽ nhỏ hơn rất nhiều như thế này. + +106 +00:07:00,280 --> 00:07:03,790 +Và sau đó, chúng ta sẽ sử dụng phương pháp mà chúng ta đã học + +107 +00:07:03,790 --> 00:07:07,570 +trước đó để cung cấp cho cửa sổ của chúng ta một chút đệm bằng cách + +108 +00:07:07,750 --> 00:07:10,900 +thay đổi cấu hình của nó để thêm một padx và pady, và + +109 +00:07:10,960 --> 00:07:14,560 +bạn có thể đệm nó tùy thích. Nhưng trong trường hợp của tôi, + +110 +00:07:14,590 --> 00:07:19,180 +tôi nghĩ 20 pixel nên làm cho nó lớn hơn một chút và dễ + +111 +00:07:19,180 --> 00:07:22,720 +nhìn hơn một chút. Vì vậy, bây giờ chúng ta đã hoàn thành + +112 +00:07:23,080 --> 00:07:25,630 +khá nhiều việc với bố cục, hãy tiếp tục và thực sự thêm chức năng. + +113 +00:07:27,070 --> 00:07:29,080 +Chúng ta sẽ cần + +114 +00:07:29,140 --> 00:07:33,940 +một số loại chức năng chuyển đổi dặm thành km. + +115 +00:07:34,660 --> 00:07:39,040 +Số dặm sẽ được nhập vào mục nhập dặm. + +116 +00:07:39,520 --> 00:07:42,880 +Chúng ta có thể nhận được số dặm bằng cách gọi + +117 +00:07:42,910 --> 00:07:45,160 +số dặm _input. lấy, và sau đó + +118 +00:07:46,120 --> 00:07:51,070 +chúng ta có thể chuyển đổi giá trị đó thành km bằng cách sử dụng một số loại công thức. + +119 +00:07:51,820 --> 00:07:54,010 +Nếu chúng ta tìm kiếm trong Google từ dặm sang km, bạn + +120 +00:07:54,040 --> 00:07:59,040 +có thể thấy rằng công thức nhân khá nhiều giá trị dặm với 1. 609. + +121 +00:08:02,050 --> 00:08:03,250 +Điều đó đủ đơn + +122 +00:08:03,280 --> 00:08:07,930 +giản, chúng ta sẽ nói số dặm nhân với 1. 609 và chúng tôi nhận + +123 +00:08:08,620 --> 00:08:13,390 +được giá trị tính bằng km. Sau đó, chúng tôi đã + +124 +00:08:13,480 --> 00:08:17,920 +đặt kilter_result_label của mình để hiển thị kết quả cập nhật này. + +125 +00:08:18,580 --> 00:08:21,190 +Vì vậy, chúng tôi sẽ nắm giữ kilter_result_label + +126 +00:08:21,580 --> 00:08:26,580 +và tôi sẽ gọi cấu hình trên nó để thay đổi thuộc tính văn bản của + +127 +00:08:27,070 --> 00:08:28,720 +nó thành giá trị mới + +128 +00:08:28,870 --> 00:08:32,140 +này sẽ là giá trị của chúng tôi tính bằng km. + +129 +00:08:32,770 --> 00:08:35,350 +Bây giờ chúng ta phải cẩn thận với các kiểu dữ + +130 +00:08:35,830 --> 00:08:39,340 +liệu ở đây, bởi vì khi chúng ta nắm được thông tin đầu vào từ đầu + +131 +00:08:39,370 --> 00:08:43,750 +vào dặm đó, đây vẫn sẽ là một chuỗi. Nhưng chúng ta muốn nhân nó với một số + +132 +00:08:44,020 --> 00:08:49,020 +vì vậy chúng ta phải đổi nó thành một số thực. Bởi vì mọi người có thể nhập số vị + +133 +00:08:49,180 --> 00:08:53,560 +trí thập phân, tôi sẽ thay đổi nó thành một số dấu phẩy động như thế này. + +134 +00:08:54,160 --> 00:08:57,960 +Bây giờ tôi đã có một số dấu phẩy động nhân với một số dấu phẩy động nên + +135 +00:08:58,290 --> 00:09:01,410 +điều đó hoàn toàn hợp lệ. Bây giờ, tiếp theo, khi + +136 +00:09:01,440 --> 00:09:06,360 +tôi thực sự muốn đặt số đó vào nhãn, tôi cần nó dưới dạng một chuỗi. + +137 +00:09:06,900 --> 00:09:09,570 +Thay vì chỉ cần thêm kilomet này vào, + +138 +00:09:09,600 --> 00:09:14,600 +tôi thực sự sẽ sử dụng một chuỗi f để tôi bọc biến kilomet này bên + +139 +00:09:15,690 --> 00:09:17,700 +trong chuỗi f của mình và + +140 +00:09:17,760 --> 00:09:21,960 +sau đó tôi chuyển nó thành một chuỗi để đưa vào nhãn này. + +141 +00:09:23,280 --> 00:09:23,700 +Bây + +142 +00:09:23,700 --> 00:09:28,700 +giờ, tất cả những gì chúng ta phải làm là kích hoạt chức năng này mile_to_km khi + +143 +00:09:29,700 --> 00:09:31,440 +người dùng nhấn nút tính toán. + +144 +00:09:32,010 --> 00:09:36,780 +Và nếu bạn nhớ, cách chúng ta làm điều đó là buộc nó như một lệnh. + +145 +00:09:37,200 --> 00:09:39,810 +Vì vậy, lệnh = mile_to_km nhưng không + +146 +00:09:40,050 --> 00:09:42,930 +có dấu ngoặc đơn cuối cùng vì chúng tôi + +147 +00:09:43,290 --> 00:09:46,860 +chỉ muốn nó được gọi khi nó thực sự được nhấp. + +148 +00:09:47,610 --> 00:09:50,070 +Hãy kiểm tra mã của chúng tôi và xem liệu nó có thực sự hoạt động hay không. + +149 +00:09:50,130 --> 00:09:54,510 +Hãy kiểm tra 20 dặm tính bằng km. Vì vậy, nếu tôi nhấp vào tính toán, + +150 +00:09:54,570 --> 00:09:58,110 +bạn có thể thấy nó được tính toán và nhãn ở đó, nhãn kết + +151 +00:09:58,230 --> 00:10:02,400 +quả km đó, sẽ được thay đổi. Nếu bạn muốn để nó như thế này, điều + +152 +00:10:02,400 --> 00:10:04,560 +đó hoàn toàn ổn. Nếu muốn, bạn cũng + +153 +00:10:04,560 --> 00:10:08,400 +có thể làm tròn số này để nó trở thành một số nguyên và cuối cùng + +154 +00:10:09,600 --> 00:10:12,660 +bạn sẽ có thứ gì đó trông bóng bẩy hơn một chút nhưng + +155 +00:10:12,690 --> 00:10:14,610 +có thể không chính xác hơn một chút. + +156 +00:10:15,270 --> 00:10:19,470 +Đó là cách bạn hoàn thành dự án này. Tất nhiên, giờ đây, thế giới thực + +157 +00:10:19,470 --> 00:10:21,570 +sự là con hàu của bạn. + +158 +00:10:21,870 --> 00:10:24,960 +Bạn đã học về cách nhiều widget hơn chúng tôi đã sử dụng ở đây. + +159 +00:10:24,990 --> 00:10:27,870 +Vì vậy, bạn có thể kết hợp bất kỳ thứ gì + +160 +00:10:28,170 --> 00:10:30,870 +khác mà bạn đã thấy, chẳng hạn như có thể + +161 +00:10:30,930 --> 00:10:35,220 +thêm nút radio hoặc hộp kiểm và bạn có thể sửa đổi điều này để có thể + +162 +00:10:35,520 --> 00:10:40,500 +không chỉ tính từ dặm sang kilôgam và bạn có thể thử chơi với mã và tạo phiên bản của + +163 +00:10:40,500 --> 00:10:42,840 +riêng mình chương trình. Nếu bạn tạo ra điều + +164 +00:10:42,870 --> 00:10:47,400 +gì đó thú vị, hãy chia sẻ điều đó với chúng tôi trong phần Hỏi / Đáp bên dưới bài học để + +165 +00:10:47,400 --> 00:10:50,730 +chúng tôi có thể ngưỡng mộ và chúc mừng bạn đã làm việc chăm chỉ. + +166 +00:10:51,180 --> 00:10:56,180 +Vì vậy, tôi hy vọng bạn đã cảm thấy vui vẻ khi xây dựng các chương trình GUI đầu tiên của mình bằng tkinter. Trong bài học ngày mai, chúng ta + +167 +00:10:57,120 --> 00:11:01,010 +sẽ đi sâu hơn vào tkinter và chúng ta sẽ xem xét + +168 +00:11:01,010 --> 00:11:03,930 +cách tạo ra một số chương trình phức tạp + +169 +00:11:04,140 --> 00:11:08,340 +hơn, nhưng thú vị hơn. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ + +170 +00:11:08,490 --> 00:11:09,090 +gặp bạn ở đó. + diff --git a/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/external-links.txt b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..56ae5d9b35be60e79abf177d03e8b137f3684dbb --- /dev/null +++ b/part2/27 - Day 27 - Intermediate - Tkinter, args, kwargs and Creating GUI Programs/external-links.txt @@ -0,0 +1,21 @@ + +003 Python-Docs-The-Packer +https://docs.python.org/3/library/tkinter.html#the-packer + +003 TCL-tk-Docs-pack- +http://tcl.tk/man/tcl8.6/TkCmd/pack.htm + +007 Playground.py-Completed-Code +https://repl.it/@appbrewery/day-27-playground + +009 TCL-tk-Docs-Entry- +http://tcl.tk/man/tcl8.6/TkCmd/entry.htm + +010 Tkinter-Widget-Example-Code-Palette +https://repl.it/@appbrewery/tkinter-widget-demo + +011 Day-27-End-Code +https://repl.it/@appbrewery/day-27-end + +012 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/001 Day 28 Goals what we will make by the end of the day.mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/001 Day 28 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..543c71b92af4c2b3715b0982f966a47d1abe1821 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/001 Day 28 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c8a1b72d8cf0367da46e7ed1899cc78f93d0c0037ce314fc457d4686783c5ba +size 7191421 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/001 Day 28 Goals what we will make by the end of the day_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/001 Day 28 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d96e4b887f969cbc75025ede031bfd657a0fe70c --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/001 Day 28 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,152 @@ +1 +00:00:00,180 --> 00:00:04,950 +Xin chào các bạn, chào mừng đến với ngày 28 của 100 Ngày viết mã. Hôm nay chúng ta sẽ xây dựng + +2 +00:00:04,950 --> 00:00:09,000 +một ứng dụng Pomodora hoàn toàn từ đầu bằng cách sử dụng tkinter và + +3 +00:00:09,240 --> 00:00:13,530 +kiến thức mà chúng ta thu được từ các bài học ngày hôm qua. + +4 +00:00:14,190 --> 00:00:17,220 +Bây giờ bạn đã nghe tôi nói về + +5 +00:00:17,280 --> 00:00:19,860 +kỹ thuật Pomodoro, cuốn sách nổi tiếng + +6 +00:00:20,570 --> 00:00:25,570 +này của Francesco Cirillo, Cirillo. Kỹ thuật nổi tiếng này giúp + +7 +00:00:29,060 --> 00:00:34,060 +mọi người quản lý thời gian và hoàn thành nhiều việc hơn. + +8 +00:00:35,480 --> 00:00:37,250 +Bây giờ, nếu bạn không nghe tôi nói về nó, về + +9 +00:00:37,280 --> 00:00:40,700 +cơ bản đây là một sự cố rất đơn giản. Về cơ bản, bạn tìm ra + +10 +00:00:40,700 --> 00:00:43,390 +nhiệm vụ mà bạn cần thực hiện một cách khó khăn, + +11 +00:00:43,400 --> 00:00:48,320 +một việc gì đó cần một thời gian như viết cuốn sách tiếp theo hoặc viết mã một dự án. + +12 +00:00:48,890 --> 00:00:52,970 +Và sau đó, bạn muốn đặt bộ đếm thời gian của mình thành 25 phút và + +13 +00:00:53,000 --> 00:00:57,950 +sau đó thực hiện nhiệm vụ trong 25 phút. Và sau đó, bạn nghỉ giải lao 5 phút ngắn ngủi. + +14 +00:00:58,280 --> 00:01:03,080 +Và sau khi bạn đã thực hiện bốn trong số Pomodoros này, về cơ bản là bốn lần lặp + +15 +00:01:03,140 --> 00:01:06,500 +lại, sau đó bạn có thể nghỉ ngơi từ 15 đến 30 phút. + +16 +00:01:07,310 --> 00:01:12,110 +Vì vậy, về cơ bản, điều này thực sự sử dụng hiệu quả cách + +17 +00:01:12,320 --> 00:01:17,320 +bộ não của chúng ta hoạt động thường xuyên nghỉ giải lao ngắn và làm việc + +18 +00:01:17,990 --> 00:01:22,970 +25 phút mỗi lần, giúp chúng ta lưu giữ thông tin và duy trì động lực. + +19 +00:01:23,660 --> 00:01:28,660 +Đây là chương trình mà chúng tôi sẽ xây dựng bằng tkinter. Nó sẽ là một bộ đếm thời gian với + +20 +00:01:28,760 --> 00:01:32,930 +một quả cà chua trên đó. Và khi bạn nhấp vào bắt đầu, + +21 +00:01:33,020 --> 00:01:36,170 +nó sẽ thông báo cho bạn làm việc trong 25 phút. + +22 +00:01:36,830 --> 00:01:39,080 +Sau đó, cửa sổ đó có thể chuyển sang + +23 +00:01:39,410 --> 00:01:43,520 +chế độ nền và trong khi bạn đang viết mã hoặc làm bất cứ điều gì, khi + +24 +00:01:43,580 --> 00:01:48,230 +bộ hẹn giờ lên, nó sẽ bật ra phía trước màn hình, phía trên tất cả các cửa sổ khác + +25 +00:01:48,230 --> 00:01:49,850 +và yêu cầu bạn nghỉ ngơi. + +26 +00:01:50,240 --> 00:01:53,780 +Vì vậy, giải lao đầu tiên là năm phút và bạn sẽ nhận thấy + +27 +00:01:53,810 --> 00:01:58,810 +ở đây, chúng tôi đã đạt được một dấu kiểm cho việc hoàn thành Pomodoro đầu tiên của chúng tôi. + +28 +00:01:59,840 --> 00:02:01,820 +Và khi bạn đã hoàn thành thời gian + +29 +00:02:01,850 --> 00:02:06,850 +nghỉ, sau đó nó sẽ quay trở lại hoạt động và sẽ tiếp tục cho đến khi bạn đạt đến thời gian + +30 +00:02:07,340 --> 00:02:12,290 +nghỉ dài hơn hoặc cho đến khi bạn nhấp vào đặt lại để dừng và đặt lại bộ đếm thời gian. + +31 +00:02:13,100 --> 00:02:13,850 +Một cách + +32 +00:02:13,850 --> 00:02:17,780 +hiệu quả, nó sẽ giúp bạn thực hiện những Pomodoros này khi bạn có 25 + +33 +00:02:17,780 --> 00:02:21,710 +phút làm việc, 5 phút giải lao. Bạn thực hiện bốn trong số các phiên làm việc + +34 +00:02:21,770 --> 00:02:26,600 +kéo dài 25 phút này, và sau đó bạn được nghỉ 20 phút. Vì vậy, hy vọng bằng cách tạo chương trình này, bạn + +35 +00:02:26,630 --> 00:02:30,830 +sẽ tăng năng suất của mình và bạn sẽ có công cụ hữu ích của riêng mình để giúp bạn + +36 +00:02:31,070 --> 00:02:33,380 +đạt được nhiều hơn và làm được nhiều việc hơn. + +37 +00:02:33,950 --> 00:02:37,610 +Vì vậy, đây là những gì chúng tôi sẽ xây dựng. Khi bạn đã sẵn sàng, hãy + +38 +00:02:37,610 --> 00:02:39,920 +chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 How to work with the Canvas Widget and Add Images to Tkinter.mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 How to work with the Canvas Widget and Add Images to Tkinter.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..623e5ab9e4c08aa476c0248b4ff117f66b2e6eaf --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 How to work with the Canvas Widget and Add Images to Tkinter.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67853388f46209d2873ef77307cdc61affc3ea021738e4ca2d6fe026bf066162 +size 106297319 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 How to work with the Canvas Widget and Add Images to Tkinter_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 How to work with the Canvas Widget and Add Images to Tkinter_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fcb16c8e61c7b4d1fd594f73941c2a8889703716 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 How to work with the Canvas Widget and Add Images to Tkinter_vi.srt @@ -0,0 +1,900 @@ +1 +00:00:00,330 --> 00:00:03,620 +Điều đầu tiên tôi muốn bạn làm để bắt đầu + +2 +00:00:03,630 --> 00:00:08,340 +là xem các tài nguyên của khóa học và tải xuống các tệp bắt đầu cho + +3 +00:00:08,340 --> 00:00:10,410 +dự án Pomodoro. Khi bạn đã + +4 +00:00:10,470 --> 00:00:15,470 +có điều đó, thì bạn sẽ có thể giải nén tệp này và giữ thư mục bắt đầu. + +5 +00:00:17,070 --> 00:00:20,640 +Tiếp theo, tôi muốn bạn mở thư mục đó bằng PyCharm. + +6 +00:00:21,240 --> 00:00:24,210 +Vì vậy, trong trường hợp của tôi, thư mục của tôi nằm trong các tệp tải + +7 +00:00:24,480 --> 00:00:29,480 +xuống của tôi, và sau đó tôi chỉ cần nhấp vào mở. Và PyCharm sẽ tự động định cấu hình phiên bản + +8 +00:00:29,880 --> 00:00:31,950 +Python mới nhất mà bạn đã cài đặt. + +9 +00:00:32,580 --> 00:00:35,700 +Vì vậy, nếu bạn nhìn vào bên trong thư mục này, có hai tệp. + +10 +00:00:36,060 --> 00:00:40,680 +Có một hình ảnh của một quả cà chua mà chúng tôi sẽ sử dụng trong dự án + +11 +00:00:41,070 --> 00:00:45,750 +của mình và cũng có một hình ảnh chính. py với một vài phần đã được + +12 +00:00:45,750 --> 00:00:49,320 +băm sẵn cho bạn. Và chúng tôi cũng đã bao gồm + +13 +00:00:49,380 --> 00:00:54,380 +một số hằng số, như một số mã hex màu hoặc tên phông chữ hoặc số phút để làm việc trong + +14 +00:00:55,170 --> 00:00:59,460 +thời gian nghỉ ngắn trong thời gian nghỉ dài. Vì vậy, nó đã có trong tệp bắt đầu. + +15 +00:01:00,330 --> 00:01:03,840 +Điều đầu tiên chúng tôi sẽ làm là thiết lập giao diện người dùng của chúng tôi. + +16 +00:01:03,870 --> 00:01:05,940 +Vì vậy, trong phần thiết lập giao diện + +17 +00:01:06,210 --> 00:01:09,720 +người dùng, chúng ta sẽ tạo một cửa sổ mới bằng tkinter và + +18 +00:01:10,110 --> 00:01:13,590 +chúng ta sẽ chạy cửa sổ và tạo màu nền cho nó, khá + +19 +00:01:13,830 --> 00:01:14,663 +đơn giản. + +20 +00:01:14,910 --> 00:01:19,290 +Vì vậy, hãy đi đến đầu tệp của chúng tôi và nhập mô-đun tkinter của chúng tôi. + +21 +00:01:19,740 --> 00:01:23,070 +Và sau đó nếu chúng ta cuộn xuống phần thiết lập giao + +22 +00:01:23,310 --> 00:01:27,330 +diện người dùng, hãy tiếp tục và tạo một cửa sổ mới từ lớp tk. + +23 +00:01:27,810 --> 00:01:32,250 +Hãy nhớ rằng lớp tk của chúng tôi là một trong các lớp từ tkinter, + +24 +00:01:32,610 --> 00:01:37,610 +vì vậy bạn có thể nhấn vào mô-đun tkinter và sau đó nắm giữ lớp tk như + +25 +00:01:37,800 --> 00:01:40,560 +tôi đã làm ở đây, hoặc như trong trường + +26 +00:01:40,590 --> 00:01:43,920 +hợp của chúng tôi, nếu chúng tôi sẽ sử dụng rất + +27 +00:01:44,340 --> 00:01:49,340 +nhiều lớp từ tkinter thì chúng ta có thể nói đơn giản từ tkinter hãy tiếp tục + +28 +00:01:49,740 --> 00:01:54,450 +và nhập tất cả các lớp. Vì vậy, theo cách đó chúng ta có thể tham khảo ngay lớp tk này. + +29 +00:01:55,170 --> 00:01:56,670 +Bây giờ chúng ta đã tạo xong + +30 +00:01:56,700 --> 00:02:01,050 +cửa sổ của mình, điều tiếp theo chúng ta có thể làm là đặt tiêu đề của cửa sổ, tất nhiên bạn có + +31 +00:02:01,410 --> 00:02:05,040 +thể gọi nó là bất cứ thứ gì bạn muốn. Nhưng trong trường hợp + +32 +00:02:05,040 --> 00:02:09,180 +của tôi, tôi sẽ đặt nó thành chỉ Pomodoro, chỉ + +33 +00:02:09,720 --> 00:02:13,080 +có nghĩa là cà chua trong tiếng Ý. + +34 +00:02:13,650 --> 00:02:15,990 +Vì vậy, bây giờ chúng ta đã có Pomodoro của mình, sau đó chúng + +35 +00:02:16,230 --> 00:02:21,230 +ta sẽ làm cho cửa sổ của chúng ta hiển thị bằng cách sử dụng window. vòng lặp chính như bình + +36 +00:02:22,290 --> 00:02:23,123 +thường. + +37 +00:02:23,310 --> 00:02:28,310 +Và bây giờ nếu chúng tôi chạy điều này, hãy viết mã chính của chúng tôi và bạn có thể thấy chúng tôi có một cửa + +38 +00:02:28,980 --> 00:02:32,400 +sổ trống, một tiêu đề và chúng tôi đã sẵn sàng để chuyển sang bước tiếp theo. + +39 +00:02:33,180 --> 00:02:38,180 +Bước tiếp theo là đưa một hình ảnh vào chương trình của chúng ta để chúng ta có thể lấy quả cà + +40 +00:02:39,630 --> 00:02:42,660 +chua này làm nền của chương trình và sau đó chúng ta có + +41 +00:02:43,020 --> 00:02:44,910 +thể đặt một số văn bản lên + +42 +00:02:44,940 --> 00:02:49,710 +trên để biểu thị đồng hồ đếm ngược của chúng ta. Đây là những gì chúng tôi đang hướng tới, nhưng + +43 +00:02:49,920 --> 00:02:53,700 +để đạt được điều này và có thể đưa hình ảnh lên màn hình trông như + +44 +00:02:54,000 --> 00:02:55,380 +thế này, chúng tôi + +45 +00:02:55,530 --> 00:03:00,040 +sẽ phải tìm hiểu về tiện ích canvas tkinter. Một widget canvas thực + +46 +00:03:00,040 --> 00:03:03,550 +sự hơi giống canvas ngoài đời thực. + +47 +00:03:03,820 --> 00:03:07,210 +Nó cho phép bạn xếp từng thứ một lên trên những thứ khác. + +48 +00:03:07,240 --> 00:03:10,630 +Vì vậy, bạn có thể vẽ một cái gì đó và sau đó bạn có thể vẽ một cái gì đó lên trên cái đó. + +49 +00:03:11,140 --> 00:03:16,140 +Và những gì nó cho phép chúng tôi làm trong trường hợp của chúng tôi là đặt một hình ảnh vào chương trình của chúng + +50 +00:03:17,080 --> 00:03:19,870 +tôi và sau đó đặt một số văn bản thẳng lên trên đó. + +51 +00:03:21,400 --> 00:03:23,530 +Giữa quá trình tạo cửa sổ của chúng ta + +52 +00:03:23,590 --> 00:03:27,370 +và vòng lặp chính của cửa sổ là nơi chúng ta sẽ tạo canvas của mình. + +53 +00:03:27,790 --> 00:03:32,710 +Và canvas của chúng tôi được tạo bằng cách sử dụng tiện + +54 +00:03:32,740 --> 00:03:33,573 +ích canvas. + +55 +00:03:34,000 --> 00:03:39,000 +Một trong những thứ mà chúng ta có thể chỉ định khi tạo canvas là chiều rộng + +56 +00:03:39,100 --> 00:03:43,420 +và chiều cao, và đó sẽ là một giá trị tính theo pixel. + +57 +00:03:44,020 --> 00:03:49,020 +Vì vậy, chúng tôi biết rằng chúng tôi muốn hiển thị hình ảnh cà chua này bên trong canvas đó. + +58 +00:03:50,020 --> 00:03:52,540 +Và chúng ta có thể thấy rằng + +59 +00:03:52,570 --> 00:03:56,470 +nó có chiều rộng xấp xỉ 200 và chiều cao là 223. + +60 +00:03:57,010 --> 00:04:01,330 +Vì vậy, hãy tạo một canvas có kích thước gần giống như hình ảnh. + +61 +00:04:01,810 --> 00:04:06,810 +Vì vậy, chúng tôi sẽ đặt chiều rộng là 200 và chiều cao là 224 để chúng tôi làm + +62 +00:04:08,980 --> 00:04:12,250 +việc với một số số chẵn. Khi tôi đã tạo xong canvas, + +63 +00:04:12,310 --> 00:04:15,370 +điều tiếp theo tôi muốn làm là thêm hình ảnh của mình vào đó. + +64 +00:04:16,000 --> 00:04:20,709 +Và chúng ta có thể sử dụng một phương thức mà canvas có nó được gọi là create_image. + +65 +00:04:21,130 --> 00:04:22,720 +Và ngay sau khi tôi gõ + +66 +00:04:22,750 --> 00:04:26,440 +create, bạn có thể thấy thực sự có rất nhiều phương pháp khác như tạo + +67 +00:04:26,440 --> 00:04:29,530 +văn bản trong canvas, tạo hình chữ nhật, tạo hình bầu dục. + +68 +00:04:29,770 --> 00:04:34,180 +Và tất cả những thứ này có thể được chồng lên nhau trong + +69 +00:04:34,240 --> 00:04:37,000 +cùng một khung vẽ. Bây giờ, khi chúng tôi + +70 +00:04:37,030 --> 00:04:42,030 +tạo một hình ảnh, có một số thứ được yêu cầu. Điều đầu tiên là vị trí + +71 +00:04:42,880 --> 00:04:45,850 +X và Y của hình ảnh này trong canvas. + +72 +00:04:46,420 --> 00:04:50,950 +Cho rằng chúng ta có chiều rộng là 200 và chiều cao là 224, tôi muốn + +73 +00:04:51,250 --> 00:04:56,250 +hình ảnh của mình ở giữa khung vẽ. Vì vậy, tôi có thể cung cấp giá + +74 +00:04:56,800 --> 00:05:01,660 +trị X là một nửa chiều rộng và giá trị Y là một nửa chiều cao. + +75 +00:05:02,560 --> 00:05:05,230 +Ngoài các giá trị X và Y, + +76 +00:05:05,290 --> 00:05:08,080 +chúng ta cũng phải chỉ định một hình ảnh. + +77 +00:05:08,530 --> 00:05:12,250 +Nhưng tôi không thể chỉ đơn giản là gõ tên hình ảnh của + +78 +00:05:12,520 --> 00:05:15,340 +tôi là cà chua. png, bởi vì + +79 +00:05:15,760 --> 00:05:20,760 +đó không phải là loại dữ liệu mà đối số này mong đợi. + +80 +00:05:21,670 --> 00:05:25,660 +Thay vào đó, thứ mà nó muốn là một cái gì đó được gọi là hình + +81 +00:05:26,050 --> 00:05:28,450 +ảnh và lớp này đến từ tkinter và về + +82 +00:05:28,750 --> 00:05:33,750 +cơ bản nó là một cách để đọc qua một tệp và nắm giữ một hình ảnh cụ thể + +83 +00:05:37,210 --> 00:05:41,380 +tại một vị trí tệp cụ thể. Trong trường hợp của tôi, vị trí + +84 +00:05:41,380 --> 00:05:44,980 +tệp thực tế là cà chua. png. + +85 +00:05:45,610 --> 00:05:50,610 +Và nếu hình ảnh của bạn được lưu trữ trong thư mục con khác hoặc một nơi khác, thì + +86 +00:05:52,750 --> 00:05:57,750 +bạn nên cung cấp đường dẫn tệp tương đối hoặc tuyệt đối để đến đó từ nơi mã của + +87 +00:05:57,800 --> 00:06:01,100 +bạn, đó là chính. py Nhưng trong trường hợp + +88 +00:06:01,100 --> 00:06:03,170 +của chúng tôi, điều đó rất dễ dàng, + +89 +00:06:03,650 --> 00:06:06,560 +cả hai đều nằm trong cùng một thư mục, vì vậy chúng + +90 +00:06:06,560 --> 00:06:11,560 +tôi có thể chỉ định tên tệp của mình như vậy. Điều tiếp theo chúng tôi sẽ làm là chúng tôi sẽ lưu hình ảnh bức ảnh + +91 +00:06:11,900 --> 00:06:14,120 +này trong một biến để chúng tôi có thể tham khảo nó sau này. + +92 +00:06:14,600 --> 00:06:17,810 +Tôi sẽ gọi đây là cà chua của chúng tôi. + +93 +00:06:17,990 --> 00:06:19,790 +Hãy thoải mái gọi nó là bất cứ điều gì bạn muốn. + +94 +00:06:20,450 --> 00:06:24,650 +Và đó là dữ liệu đi vào đối số hình ảnh này. + +95 +00:06:25,430 --> 00:06:29,990 +Bây giờ chúng tôi đã tạo canvas của chúng tôi, chúng tôi đã tạo hình ảnh của chúng tôi, chúng + +96 +00:06:30,320 --> 00:06:34,400 +tôi đã yêu cầu canvas của chúng tôi tạo một hình ảnh tại vị trí này, và sau + +97 +00:06:34,580 --> 00:06:36,740 +đó chúng tôi đặt hình ảnh vào bên trong. + +98 +00:06:37,010 --> 00:06:42,010 +Điều cuối cùng chúng ta cần làm là đóng gói canvas của mình hoặc sử dụng một số loại phương + +99 +00:06:42,350 --> 00:06:47,030 +pháp khác để chỉ định bố cục của canvas sẽ hiển thị như thế nào trên màn hình. + +100 +00:06:47,480 --> 00:06:49,790 +Và bây giờ chúng ta có thể nhấn + +101 +00:06:50,180 --> 00:06:54,140 +run và chúng ta có thể nhìn thấy hình ảnh của mình trên màn hình. + +102 +00:06:54,770 --> 00:06:59,270 +Vì vậy, bây giờ hãy để ý hình ảnh về cơ bản chiếm toàn + +103 +00:06:59,270 --> 00:07:03,620 +bộ không gian của cửa sổ. Và trên thực tế, cửa sổ đang tự thay đổi kích thước để phù hợp với hình ảnh này. + +104 +00:07:04,340 --> 00:07:08,150 +Sẽ không tốt hơn nếu màn hình này thực sự lớn hơn một chút phải không? + +105 +00:07:08,180 --> 00:07:10,850 +Vì vậy, chúng ta không chỉ nhìn vào hình ảnh của một quả cà chua. + +106 +00:07:11,690 --> 00:07:15,650 +Chúng ta có thể làm điều đó bằng cách cấu hình cửa sổ của chúng ta. + +107 +00:07:15,980 --> 00:07:19,520 +Và cấu hình mà chúng tôi muốn thay đổi là padding, vì + +108 +00:07:19,580 --> 00:07:24,580 +vậy tôi sẽ thay đổi padx và pady. Trên trục X nằm ngang, tôi thực + +109 +00:07:25,010 --> 00:07:29,090 +sự sẽ thêm cả trăm pixel vùng đệm ở cả hai bên. + +110 +00:07:29,390 --> 00:07:31,820 +Và sau đó trên Yaxis, pady, + +111 +00:07:31,820 --> 00:07:36,820 +tôi sẽ thay đổi nó thành 50 để nó có 50 pixel + +112 +00:07:36,860 --> 00:07:41,270 +đệm ở trên cùng. Nó trông khá đẹp ngoài một khuyết điểm nhỏ. + +113 +00:07:41,660 --> 00:07:46,190 +Bạn có thể thấy rằng hình ảnh cà chua của chúng ta bị cắt một chút ở + +114 +00:07:46,640 --> 00:07:51,640 +bên trái và tôi nghi ngờ điều này là do hình ảnh thực tế bị lệch một chút sang + +115 +00:07:52,670 --> 00:07:53,390 +bên trái. + +116 +00:07:53,390 --> 00:07:58,390 +Vì vậy, chúng tôi thực sự có thể điều chỉnh vị trí X này sang bên phải một chút, và bằng cách + +117 +00:07:59,270 --> 00:08:00,770 +đó cà chua của chúng tôi + +118 +00:08:00,770 --> 00:08:04,310 +có thể được căn giữa trên màn hình mà không bị cắt ở hai bên. + +119 +00:08:05,660 --> 00:08:10,340 +Vì vậy, bây giờ chúng tôi đã chỉnh sửa hình ảnh của mình và chúng tôi đã hiển thị nó trên + +120 +00:08:10,820 --> 00:08:14,210 +màn hình, việc tiếp theo cần làm là hiển thị một số văn bản. + +121 +00:08:14,840 --> 00:08:18,770 +Như bạn đã nhận thấy trước đây, ngoài canvas. create_image, chúng sẽ tạo ra một + +122 +00:08:19,100 --> 00:08:23,330 +loạt những thứ khác mà chúng ta có thể tạo, bao gồm một số văn bản. + +123 +00:08:24,410 --> 00:08:29,240 +Phương thức create_text này hoạt động rất giống với phương thức create_image. + +124 +00:08:29,720 --> 00:08:34,720 +Lưu ý rằng điều đầu tiên được đánh dấu là * args. + +125 +00:08:35,900 --> 00:08:39,289 +Và sau đó chúng tôi đã có ** kw của mình. + +126 +00:08:39,710 --> 00:08:42,620 +Vì vậy, hãy nhớ từ các bài học ngày hôm qua, + +127 +00:08:42,950 --> 00:08:47,950 +các đối số này là đối số vị trí không giới hạn và các đối số này là + +128 +00:08:49,610 --> 00:08:54,140 +đối số từ khóa không giới hạn. Vì vậy, các đối số từ khóa + +129 +00:08:54,140 --> 00:08:55,010 +ở đây + +130 +00:08:55,260 --> 00:08:59,280 +là hình ảnh hoặc màu nền hoặc bất kỳ thứ gì khác, + +131 +00:08:59,610 --> 00:09:02,550 +nhưng đây là các giá trị X và Y. + +132 +00:09:03,090 --> 00:09:04,980 +Vì vậy, tạo văn bản, + +133 +00:09:05,010 --> 00:09:08,220 +chúng tôi cũng phải cung cấp giá trị X và Y. + +134 +00:09:08,640 --> 00:09:13,410 +Vì vậy, tôi chỉ sẽ thử các giá trị tương tự như hình ảnh để xem nó trông như thế nào. + +135 +00:09:14,280 --> 00:09:18,330 +Và bây giờ chúng ta có thể thêm một số đối số từ khóa, ví dụ: văn bản. + +136 +00:09:18,690 --> 00:09:22,020 +Vì vậy, tôi chỉ muốn nó nói 00:00, trông + +137 +00:09:22,410 --> 00:09:26,040 +khá giống đồng hồ. Bây giờ, nếu chúng tôi chạy + +138 +00:09:26,070 --> 00:09:30,570 +mã của mình, bạn có thể thấy chúng tôi có một chút văn bản hiển thị. + +139 +00:09:31,140 --> 00:09:33,990 +Bây giờ, hãy để ý xem nó hơi cao lên trên quả cà + +140 +00:09:34,020 --> 00:09:38,610 +chua như thế nào, vì hãy nhớ quả cà chua bắt đầu ở trên cùng ở đây và kết thúc ở đây. + +141 +00:09:38,910 --> 00:09:41,550 +Vì vậy, đó là trung tâm của hình ảnh cà chua, + +142 +00:09:41,820 --> 00:09:46,110 +nhưng chúng ta có thể di chuyển nó xuống một chút để nó thực sự được căn giữa + +143 +00:09:46,110 --> 00:09:50,700 +trong phần màu đỏ này, phần hình tròn. Với một chút thử nghiệm, + +144 +00:09:50,730 --> 00:09:55,110 +tôi nghĩ điều này, 103, 130, thực sự hoạt động khá tốt và + +145 +00:09:55,110 --> 00:09:57,870 +nó khá lớn ở giữa quả cà chua. + +146 +00:09:58,650 --> 00:10:03,650 +Hãy sửa đổi văn bản này theo một số cách khác. Chúng tôi có thể thay đổi màu tô về + +147 +00:10:04,620 --> 00:10:09,420 +cơ bản là màu của văn bản và tôi sẽ thay đổi màu đó thành màu trắng, + +148 +00:10:09,510 --> 00:10:13,590 +bạn có thể xem ở đây. Và sau đó tôi cũng sẽ thay đổi phông chữ. + +149 +00:10:14,100 --> 00:10:16,140 +Và điều này sẽ mong đợi một tuple. + +150 +00:10:16,290 --> 00:10:20,760 +Vì vậy, nó sẽ là tên phông chữ, sau đó là kích thước, và sau đó là in đậm hay + +151 +00:10:20,760 --> 00:10:25,380 +nghiêng hoặc bất cứ điều gì bạn muốn làm. Bây giờ trong các hằng số ở đây, tôi đã + +152 +00:10:25,380 --> 00:10:27,450 +có tên phông chữ được xác định, sẽ là + +153 +00:10:27,480 --> 00:10:31,530 +Courier mà chúng tôi sẽ sử dụng. Vì vậy, chúng tôi có thể thêm thẳng + +154 +00:10:31,560 --> 00:10:36,360 +tên phông chữ của mình và sau đó chúng tôi sẽ thêm kích thước phông chữ là 35, và nó + +155 +00:10:36,720 --> 00:10:41,070 +sẽ nói, vâng, hãy làm cho nó in đậm. Vì vậy, bạn có nó. + +156 +00:10:41,100 --> 00:10:45,840 +Chúng tôi có cà chua của chúng tôi, chúng tôi có văn bản của chúng tôi hiển thị dưới dạng đồng hồ đếm ngược. + +157 +00:10:46,380 --> 00:10:46,890 +Bây + +158 +00:10:46,890 --> 00:10:51,780 +giờ, điều cuối cùng tôi muốn làm chỉ là thay đổi màu nền thành một màu trông + +159 +00:10:51,780 --> 00:10:54,120 +đẹp hơn một chút. Bây giờ, một trong những trang web + +160 +00:10:54,120 --> 00:10:57,600 +yêu thích của tôi là trang này có tên là colorhunt. io, hiển thị cho bạn một loạt + +161 +00:10:57,660 --> 00:11:01,140 +các bảng màu khác nhau mà các nhà thiết kế chuyên nghiệp đã tạo + +162 +00:11:01,140 --> 00:11:03,210 +ra và nó giúp chúng tôi thực sự + +163 +00:11:03,300 --> 00:11:07,680 +dễ dàng chỉ cần chụp một số mã hex này và sử dụng chúng ngay lập tức + +164 +00:11:07,680 --> 00:11:10,710 +trong chương trình của mình. Bây giờ, cái thực + +165 +00:11:10,740 --> 00:11:13,290 +sự thu hút mắt tôi là cái này, + +166 +00:11:13,620 --> 00:11:16,320 +vì nó có một chút bảng màu cà chua. + +167 +00:11:16,710 --> 00:11:21,710 +Vì vậy, tôi đã chuyển tất cả các mã hex này sang các hằng số + +168 +00:11:22,230 --> 00:11:25,560 +trong tệp bắt đầu. Vì vậy, bạn có thể thấy tôi đã + +169 +00:11:25,950 --> 00:11:30,450 +có màu hồng, đỏ, xanh lá cây, vàng và chúng tôi sẽ sử dụng màu đó trong chương trình của mình để tạo cho + +170 +00:11:30,450 --> 00:11:34,020 +nó chủ đề màu nhất quán và làm cho nó trông giống như được thiết kế chuyên nghiệp. + +171 +00:11:34,800 --> 00:11:39,210 +Vì vậy, những gì tôi muốn làm là tôi muốn thay đổi màu nền của cửa sổ và + +172 +00:11:39,540 --> 00:11:43,770 +tôi có thể làm điều đó thông qua đối số từ khóa được gọi là bg cho + +173 +00:11:44,280 --> 00:11:47,010 +nền và tôi có thể đặt nó thành mã hex. + +174 +00:11:47,160 --> 00:11:52,160 +Vì vậy, một mã hex bắt đầu bằng dấu thăng và sau đó là một số số + +175 +00:11:52,350 --> 00:11:55,930 +và một số chữ cái. Bây giờ tôi đã có tất cả + +176 +00:11:56,440 --> 00:12:00,820 +những thứ đó cho bạn và tất cả những gì bạn phải làm chỉ là đặt tên của hằng số. + +177 +00:12:01,690 --> 00:12:06,610 +Vì vậy, điều này không nên đặt trong dấu ngoặc kép vì nó không phải là từ. Trên thực tế, nó đề cập + +178 +00:12:06,610 --> 00:12:11,110 +đến biến cụ thể đó và chuỗi được giữ bên trong. + +179 +00:12:11,710 --> 00:12:13,510 +Vì vậy, bây giờ nếu chúng + +180 +00:12:13,540 --> 00:12:18,130 +tôi kiểm tra màn hình của chúng tôi, bạn có thể thấy nền đã được thay đổi thành + +181 +00:12:18,130 --> 00:12:21,700 +màu vàng đẹp mắt, giống như màu gạo hoặc màu cỏ khô, nhưng + +182 +00:12:21,820 --> 00:12:25,300 +quả cà chua, cụ thể là canvas, vẫn có nền màu trắng đó. + +183 +00:12:26,230 --> 00:12:30,100 +Vì vậy, hãy thay đổi màu nền của canvas. Và một lần nữa, nó đang + +184 +00:12:30,100 --> 00:12:31,600 +sử dụng bg. + +185 +00:12:31,630 --> 00:12:36,630 +Vì vậy, một số trong số này, bạn sẽ nhận thấy, là các thuộc tính tiêu chuẩn mà chúng ta có thể thay đổi + +186 +00:12:36,640 --> 00:12:38,890 +như chiều rộng và chiều cao và màu nền, là + +187 +00:12:38,920 --> 00:12:43,660 +các thuộc tính tiêu chuẩn trên tất cả các tiện ích con. Và một số thứ khác như tệp + +188 +00:12:43,660 --> 00:12:47,020 +ở đây là một số đối số từ khóa cụ thể hơn. + +189 +00:12:47,680 --> 00:12:51,760 +Vì vậy, hãy áp dụng màu vàng này cho nền của canvas, và bạn + +190 +00:12:52,180 --> 00:12:55,570 +có thể thấy rằng canvas bây giờ cũng có màu vàng. + +191 +00:12:55,990 --> 00:12:58,270 +Nhưng nó vẫn có đường viền nhỏ màu trắng này + +192 +00:12:58,300 --> 00:13:02,590 +biểu thị các cạnh của canvas của chúng ta. Để loại bỏ điều đó, tôi + +193 +00:13:02,620 --> 00:13:07,000 +đã tìm thấy một đối số từ khóa cụ thể thực sự hữu ích và + +194 +00:13:07,390 --> 00:13:10,840 +phải mất khá nhiều thời gian để tìm hiểu, tìm kiếm + +195 +00:13:10,840 --> 00:13:13,540 +Stack Overflow và googling để tìm ra điều này. + +196 +00:13:13,540 --> 00:13:17,800 +Nó không đơn giản lắm vì không may là tkinter không được + +197 +00:13:17,800 --> 00:13:20,680 +ghi chép đầy đủ. Nhưng rất may cho bạn, + +198 +00:13:20,740 --> 00:13:25,740 +tất cả những gì bạn phải làm là tìm canvas của mình và trên dòng nơi bạn đã tạo + +199 +00:13:26,320 --> 00:13:29,260 +nó, hãy tiếp tục và thêm đối số từ khóa này. + +200 +00:13:29,410 --> 00:13:33,820 +Nó được gọi là highlightthickness, và hãy chắc chắn rằng bạn đánh + +201 +00:13:34,300 --> 00:13:37,240 +vần nó đúng, vì nó thực sự dài. + +202 +00:13:37,300 --> 00:13:41,860 +Và hãy nhớ rằng có hai chữ Ts vì nó nổi bật và độ dày và không có gì ở + +203 +00:13:41,860 --> 00:13:44,770 +giữa, không có gạch dưới, không có gì để ngăn cách nó. + +204 +00:13:45,190 --> 00:13:47,920 +Tôi nghĩ rằng nhóm tkinter có thể thực sự làm tốt hơn một chút + +205 +00:13:48,010 --> 00:13:48,843 +ở đây, nhưng này. + +206 +00:13:49,030 --> 00:13:53,590 +Nếu chúng tôi đặt highlightthickness bằng 0 và chúng tôi chạy lại mã của mình, + +207 +00:13:53,650 --> 00:13:57,280 +thì bạn sẽ thấy rằng nó bây giờ trông khá ổn. + +208 +00:13:57,430 --> 00:14:02,430 +Và canvas của chúng ta bây giờ có màu hoàn toàn giống với màu nền của cửa sổ. + +209 +00:14:04,090 --> 00:14:08,110 +Và bạn không thể nói cho nó biết nơi bắt đầu của cửa sổ và kết thúc của canvas. Bây giờ, vấn đề duy nhất + +210 +00:14:08,110 --> 00:14:13,110 +là khi chúng ta đã xóa đường viền xung quanh canvas đó, quả cà chua của chúng + +211 +00:14:13,750 --> 00:14:16,780 +ta lại một lần nữa bị dịch chuyển một chút. + +212 +00:14:17,140 --> 00:14:22,140 +Vì vậy, chúng tôi thực sự có thể điều chỉnh điều này và chúng tôi có thể thay đổi nó trở lại 100 và tôi sẽ + +213 +00:14:23,800 --> 00:14:25,930 +thay đổi nó cho cả văn bản và hình ảnh. + +214 +00:14:26,590 --> 00:14:30,160 +Và chúng ta có thể làm cho hình ảnh quả cà chua + +215 +00:14:30,220 --> 00:14:34,900 +đó tròn hoàn hảo một lần nữa. Với tkinter, tôi thấy rằng bạn phải thực hiện khá nhiều điều + +216 +00:14:34,900 --> 00:14:37,060 +chỉnh xung quanh, đặc biệt là với những vị trí này. + +217 +00:14:37,570 --> 00:14:39,490 +Và bạn sẽ dành một chút thời gian + +218 +00:14:39,790 --> 00:14:43,420 +để đánh giá nó bằng mắt về kích thước, chiều rộng và vị trí đặt nó. + +219 +00:14:43,900 --> 00:14:48,900 +Nhưng bây giờ chúng tôi đã quản lý thành công để đặt một hình ảnh lên màn hình, thay + +220 +00:14:49,720 --> 00:14:50,950 +đổi nền của cửa + +221 +00:14:51,830 --> 00:14:56,560 +sổ, giữ cho nó nhất quán và thêm một chút văn bản vào cà chua của chúng tôi. + +222 +00:14:57,160 --> 00:15:01,720 +Vì vậy, bây giờ chúng ta đã sẵn sàng cho bước tiếp theo. Trong bài học tiếp theo, chúng ta + +223 +00:15:02,020 --> 00:15:05,230 +sẽ tạo phần còn lại của giao diện người dùng. + +224 +00:15:05,440 --> 00:15:08,920 +Và điều đó chủ yếu sẽ phụ thuộc vào bạn. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi + +225 +00:15:09,010 --> 00:15:10,090 +sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 Use-Color-Hunt-to-Choose-a-Nice-Colour.url b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 Use-Color-Hunt-to-Choose-a-Nice-Colour.url new file mode 100644 index 0000000000000000000000000000000000000000..9a31438db9076678f99c4f16ad65c358c72de0ac --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 Use-Color-Hunt-to-Choose-a-Nice-Colour.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://colorhunt.co/ \ No newline at end of file diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 pomodoro-start.zip b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 pomodoro-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..53bea3e8b8966c77489b8209bb23350aaec97b81 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/002 pomodoro-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11a6c0bb1357d97f1d4051f13d3d310a00d3f8c4da9683e475a66a9b2431821f +size 10597 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/003 Challenge - Complete the Application's User Interface (UI).mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/003 Challenge - Complete the Application's User Interface (UI).mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4d3fff671875a93df39e2762e80e4c18b0fe5a83 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/003 Challenge - Complete the Application's User Interface (UI).mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f355ae94bd23f7bc3432de346a66c514f6f9d90ef8346dfc943014274fa8b5d0 +size 80675163 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/003 Challenge - Complete the Application's User Interface (UI)_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/003 Challenge - Complete the Application's User Interface (UI)_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fb78c6d28add77eddb64b51dda72a2a5e68185b2 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/003 Challenge - Complete the Application's User Interface (UI)_vi.srt @@ -0,0 +1,532 @@ +1 +00:00:00,390 --> 00:00:01,470 +Trong bài học + +2 +00:00:01,500 --> 00:00:06,500 +trước, chúng tôi đã bắt đầu thiết lập giao diện người dùng của mình và chúng tôi tạo canvas + +3 +00:00:06,870 --> 00:00:11,250 +này, đặt hình ảnh của chúng tôi lên đó, và trên đó, đặt một số văn bản. + +4 +00:00:11,700 --> 00:00:13,200 +Đây là khoảng cách mà chúng tôi + +5 +00:00:13,530 --> 00:00:17,070 +đã đạt được và bây giờ chúng tôi muốn hoàn thành việc thiết lập giao diện người dùng, + +6 +00:00:17,400 --> 00:00:19,410 +vì vậy hãy thêm vào một số thành phần khác. + +7 +00:00:19,860 --> 00:00:24,860 +Và chúng tôi muốn kết thúc trông giống như thế này với một nhãn ở trên cùng, một đoạn + +8 +00:00:25,470 --> 00:00:28,380 +văn bản lớn, một số nút ở dưới cùng và + +9 +00:00:28,680 --> 00:00:32,430 +cũng là một nhãn theo dõi bao nhiêu Pomodoros mà chúng tôi đã thực hiện. + +10 +00:00:32,759 --> 00:00:36,330 +Vì vậy, mỗi phiên làm việc 25 phút sẽ cho chúng tôi + +11 +00:00:36,410 --> 00:00:38,370 +một dấu kiểm. Vì vậy, bạn + +12 +00:00:38,660 --> 00:00:43,370 +sẽ sử dụng rất nhiều thứ mà bạn đã học được trong các bài học ngày hôm + +13 +00:00:43,400 --> 00:00:48,400 +qua về việc sử dụng các widget tkinter nào và cách thiết lập chúng để tạo ra thứ này. + +14 +00:00:49,160 --> 00:00:52,910 +Vì vậy, nó sẽ là một thử thách đối với bạn, nhưng trước khi chúng ta bắt đầu, có + +15 +00:00:52,910 --> 00:00:55,850 +một vài điều tôi muốn chỉ ra. Vì vậy, một điều + +16 +00:00:55,850 --> 00:00:58,850 +cần lưu ý là chúng tôi có bg này là viết + +17 +00:00:58,880 --> 00:01:01,130 +tắt của màu nền và chúng tôi đã + +18 +00:01:01,610 --> 00:01:06,350 +sử dụng các hằng số của chúng tôi ở đây để thiết lập các màu nền đó. + +19 +00:01:06,920 --> 00:01:08,390 +Bây giờ bạn có + +20 +00:01:08,390 --> 00:01:13,280 +thể thấy rằng ở đây tôi đã có nhãn và dấu kiểm có màu xanh lục. + +21 +00:01:13,520 --> 00:01:17,300 +Và màu đó đến từ hằng số của chúng tôi ngay tại đây. + +22 +00:01:17,840 --> 00:01:21,140 +Vì vậy, bạn sẽ có thể tô màu một đoạn văn bản + +23 +00:01:21,350 --> 00:01:24,800 +trong nhãn, không phải bằng cách sử dụng bg, mà bằng cách + +24 +00:01:24,800 --> 00:01:29,800 +sử dụng fg, viết tắt của tiền cảnh. Và về cơ bản bạn có thể đặt bằng + +25 +00:01:30,890 --> 00:01:35,600 +màu xanh lục mà chúng ta có. Và miễn là nó được thêm vào nhãn, thì bạn sẽ + +26 +00:01:35,750 --> 00:01:38,420 +có thể thấy nó hiển thị. Bây giờ, điều khác tôi + +27 +00:01:38,450 --> 00:01:41,810 +muốn cho bạn thấy là nếu bạn không biết cách nắm + +28 +00:01:41,840 --> 00:01:42,673 +giữ một + +29 +00:01:42,950 --> 00:01:47,930 +dấu kiểm, cách dễ nhất là truy cập Wikipedia và tìm dấu kiểm cụ thể mà + +30 +00:01:47,930 --> 00:01:48,763 +bạn thích. + +31 +00:01:48,980 --> 00:01:53,980 +Và sau đó chỉ cần sao chép nó và dán nó vào đây dưới dạng văn bản. + +32 +00:01:54,290 --> 00:01:58,370 +Vì vậy, ví dụ: nếu chúng tôi có một nhãn có đối số văn bản và tôi + +33 +00:01:58,550 --> 00:02:02,120 +sao chép một dấu kiểm đó và tôi dán nó vào đây, thì dấu kiểm + +34 +00:02:02,450 --> 00:02:06,410 +đó sẽ hiển thị trên màn hình. Bây giờ, điều cuối cùng tôi + +35 +00:02:06,410 --> 00:02:10,100 +muốn đề cập trước khi để bạn bắt đầu thử thách là chúng + +36 +00:02:10,100 --> 00:02:12,860 +tôi đã đóng gói canvas của mình lên màn hình. + +37 +00:02:13,490 --> 00:02:17,240 +Nhưng vì chúng tôi có khá nhiều thứ cần trình bày trên màn hình, + +38 +00:02:17,540 --> 00:02:20,480 +nên việc sử dụng lưới sẽ dễ dàng hơn nhiều. + +39 +00:02:21,230 --> 00:02:25,070 +Vì vậy, tôi muốn bạn thay đổi canvas thành sử dụng hệ thống lưới. + +40 +00:02:25,490 --> 00:02:30,200 +Và ở đây, tôi đã tạo ra một loại phân tích ít nhiều về cách lưới + +41 +00:02:30,200 --> 00:02:34,640 +đó có thể trông như thế nào. Vì vậy, bạn có thể sẽ kết + +42 +00:02:34,640 --> 00:02:37,640 +thúc với một, hai, ba, bốn hàng và ba cột, + +43 +00:02:37,700 --> 00:02:41,900 +và hãy suy nghĩ về cách bạn có thể sắp xếp các nhãn, các nút + +44 +00:02:41,900 --> 00:02:45,170 +và dấu kiểm liên quan đến các hàng và cột đó. + +45 +00:02:45,770 --> 00:02:47,510 +Giữ trang này trên màn + +46 +00:02:47,570 --> 00:02:51,230 +hình, tôi muốn bạn tạm dừng video và thực hiện thử thách này. + +47 +00:02:51,590 --> 00:02:55,130 +Và nếu bạn không biết kích thước của mọi thứ hoặc phông chữ, đừng lo lắng, + +48 +00:02:55,130 --> 00:02:56,990 +chỉ cần đoán chúng. Nó không thực sự quan trọng. + +49 +00:02:57,020 --> 00:02:59,860 +Miễn là bạn có bố cục thô và các vật dụng chính xác, + +50 +00:03:00,100 --> 00:03:03,760 +thì đó sẽ được coi là chiến thắng. Tạm dừng video ngay bây giờ và tiếp tục. + +51 +00:03:06,760 --> 00:03:07,090 +Được rồi. + +52 +00:03:07,090 --> 00:03:11,680 +Vì vậy, tôi sẽ bắt đầu bằng cách tạo nhãn hàng đầu này + +53 +00:03:11,680 --> 00:03:16,390 +ở đây và tôi sẽ gọi title_label và nó sẽ được tạo từ lớp nhãn. + +54 +00:03:16,990 --> 00:03:20,980 +Bây giờ, văn bản trong này hiện tại sẽ đọc bộ đếm thời gian + +55 +00:03:21,580 --> 00:03:26,580 +và tôi muốn thay đổi màu của nó bằng cách sử dụng đối số từ khóa nền trước. + +56 +00:03:28,090 --> 00:03:31,900 +Và tôi sẽ thay đổi nó thành màu xanh lục mà chúng ta có ở đây. + +57 +00:03:32,920 --> 00:03:36,400 +Bây giờ, tôi muốn có thể hiển thị nhãn đó trên màn hình, vì vậy tôi phải cung + +58 +00:03:36,400 --> 00:03:40,000 +cấp cho nó một số dạng bố cục. Và như chúng tôi đã đề + +59 +00:03:40,030 --> 00:03:44,290 +cập, chúng tôi sẽ sử dụng hệ thống lưới. Vì vậy, tôi sẽ thay đổi lưới. + +60 +00:03:45,490 --> 00:03:49,540 +Và nếu chúng ta tham khảo hình ảnh này, bạn có thể thấy sẽ có ba cột. + +61 +00:03:49,810 --> 00:03:52,360 +Cột này sẽ nằm ở cột giữa, và sau + +62 +00:03:52,720 --> 00:03:54,880 +đó nó sẽ ở hàng đầu tiên. + +63 +00:03:55,120 --> 00:03:56,800 +Vì vậy, chúng ta sẽ bắt đầu từ con số không. + +64 +00:03:56,800 --> 00:04:01,800 +Vì vậy, tôi sẽ nói cột = 1 và hàng = 0. + +65 +00:04:03,190 --> 00:04:08,190 +Bây giờ tôi phải thay đổi gói canvas này vì nếu không nó sẽ gây + +66 +00:04:08,560 --> 00:04:11,650 +ra lỗi cho tôi. Và về vị trí + +67 +00:04:11,680 --> 00:04:15,310 +của canvas, nó sẽ lại ở cùng cột với nhãn đó, nhưng + +68 +00:04:15,520 --> 00:04:17,170 +nó sẽ ở hàng tiếp theo. + +69 +00:04:20,740 --> 00:04:25,210 +Vì vậy, cột 1, hàng 1. Và bây giờ khi tôi chạy nó, bạn có thể + +70 +00:04:25,210 --> 00:04:30,160 +thấy nhãn của chúng tôi hiển thị và sau đó canvas của chúng tôi hiển thị và tất cả đều được + +71 +00:04:30,160 --> 00:04:31,390 +định vị chính xác. + +72 +00:04:32,050 --> 00:04:37,030 +Bây giờ tôi muốn thay đổi nhãn này để nó trông giống với bản trình diễn mà + +73 +00:04:37,030 --> 00:04:39,460 +tôi đã cho bạn xem, như thế này. + +74 +00:04:39,490 --> 00:04:43,180 +Vì vậy, tôi phải thay đổi phông chữ và văn bản để làm cho nó lớn hơn rất nhiều. + +75 +00:04:44,230 --> 00:04:48,520 +Như chúng ta đã thấy trước đây, chúng ta có thể chỉ cần thêm phông chữ khi chúng ta tạo nhãn. + +76 +00:04:49,240 --> 00:04:52,090 +Vì vậy, chúng ta có thể đặt nó thành một bộ giá trị. + +77 +00:04:52,210 --> 00:04:56,260 +Và trước tiên, tôi sẽ sử dụng tên phông chữ của mình mà tôi đã có như một + +78 +00:04:56,590 --> 00:05:00,040 +hằng số mà tôi đã sử dụng khi tạo văn bản, nó sẽ là Courier. + +79 +00:05:00,730 --> 00:05:03,040 +Và sau đó về kích thước, bạn có + +80 +00:05:04,450 --> 00:05:07,870 +thể chỉ cần phỏng đoán. Nó sẽ là một cái gì đó khá lớn. + +81 +00:05:07,900 --> 00:05:12,250 +Vì vậy, tôi sẽ sử dụng 50 và tôi sẽ không in đậm hay nghiêng hoặc bất cứ thứ gì, + +82 +00:05:12,250 --> 00:05:16,750 +vì vậy đó là phần cuối của phông chữ đó. Và bây giờ khi tôi chạy lại, bạn có + +83 +00:05:16,780 --> 00:05:21,370 +thể thấy nó lớn hơn rất nhiều và nó trông giống như ví dụ mà chúng ta đã + +84 +00:05:21,370 --> 00:05:22,203 +có ở đây. + +85 +00:05:22,390 --> 00:05:27,280 +Nhưng sự khác biệt duy nhất là nó thực sự vẫn có nền trắng. Thay vì chỉ thay đổi nền trước, + +86 +00:05:27,280 --> 00:05:28,750 +tôi cũng sẽ + +87 +00:05:28,750 --> 00:05:32,650 +thay đổi nền và tôi sẽ làm cho nó có cùng màu + +88 +00:05:32,650 --> 00:05:35,170 +vàng mà tôi có ở nền cửa sổ. + +89 +00:05:35,860 --> 00:05:40,860 +Vì vậy, bây giờ có vẻ như tất cả đã được hòa trộn và tất cả đều là + +90 +00:05:41,170 --> 00:05:45,310 +một phần của cùng một ứng dụng. Hãy chuyển sang hàng tiếp theo, sẽ là + +91 +00:05:45,340 --> 00:05:46,930 +các nút của chúng ta. + +92 +00:05:47,290 --> 00:05:51,910 +Vì vậy, tôi sẽ có nút bắt đầu và tôi cũng sẽ có nút đặt lại và + +93 +00:05:52,150 --> 00:05:54,730 +cả hai đều sẽ được tạo từ lớp nút. + +94 +00:05:55,300 --> 00:06:00,300 +Nút bắt đầu sẽ bắt đầu văn bản và nút đặt + +95 +00:06:02,420 --> 00:06:07,370 +lại sẽ đặt lại từ. Nút bắt đầu cũng sẽ được + +96 +00:06:07,370 --> 00:06:12,370 +bố trí trên lưới của chúng tôi và nó sẽ là + +97 +00:06:14,060 --> 00:06:16,280 +cột 0 hàng 2. + +98 +00:06:18,230 --> 00:06:22,940 +Và nút đặt lại sẽ là cột 2, hàng 2. + +99 +00:06:24,350 --> 00:06:29,350 +Vì vậy, bây giờ bạn có thể thấy nút bắt đầu và nút đặt lại hiện nằm ở hàng tiếp theo sau khung + +100 +00:06:29,930 --> 00:06:34,190 +vẽ và nó nằm ở hai bên của nó. Bây giờ hãy để ý xem có + +101 +00:06:34,190 --> 00:06:38,720 +một chút nền trắng xung quanh mỗi nút. Nếu điều đó làm phiền bạn, thì bạn + +102 +00:06:38,780 --> 00:06:43,010 +thực sự có thể khắc phục điều đó bằng cách làm điều tương tự như chúng + +103 +00:06:43,010 --> 00:06:43,843 +ta đã + +104 +00:06:43,880 --> 00:06:48,880 +làm với canvas đã loại bỏ đường viền bằng cách thay đổi độ dày nổi bật đó thành 0. + +105 +00:06:50,150 --> 00:06:52,250 +Và bởi vì điều đó thực sự dễ mắc lỗi chính + +106 +00:06:52,280 --> 00:06:54,020 +tả, tôi thực sự chỉ định dán nó vào. + +107 +00:06:56,120 --> 00:06:59,870 +Vì vậy, bây giờ bạn có thể thấy rằng bảng trắng đã biến mất khá nhiều. + +108 +00:07:01,190 --> 00:07:04,550 +Bây giờ chúng ta đang vào điều cuối cùng mà chúng ta đã + +109 +00:07:05,480 --> 00:07:08,150 +trình bày, đó là dấu kiểm ngay tại đây. + +110 +00:07:09,530 --> 00:07:13,670 +Vì vậy, tôi sẽ gọi nó là check_marks vì cuối cùng có thể sẽ có khá + +111 +00:07:13,670 --> 00:07:14,570 +nhiều người trong + +112 +00:07:15,320 --> 00:07:20,320 +số họ hy vọng nếu chúng tôi làm được nhiều việc tốt và nhãn của chúng tôi sẽ phải + +113 +00:07:20,810 --> 00:07:24,200 +nhắn tin sẽ có dấu kiểm. Bây giờ, nếu bạn đang sử dụng + +114 +00:07:24,230 --> 00:07:29,230 +máy Mac, bạn thực sự có thể vào chỉnh sửa và chuyển đến biểu tượng cảm xúc và biểu tượng và chọn một + +115 +00:07:31,340 --> 00:07:32,330 +dấu kiểm từ đây. + +116 +00:07:32,870 --> 00:07:37,100 +Nhưng trên Windows, bạn có thể chỉ cần sử dụng thủ thuật mà tôi đã chỉ cho bạn. + +117 +00:07:37,340 --> 00:07:42,320 +Hãy tiếp tục sao chép và dán nó từ một đoạn văn bản, chẳng hạn như Wikipedia. + +118 +00:07:43,520 --> 00:07:47,570 +Khi chúng tôi đã có văn bản của mình, tôi sẽ thay đổi lại màu nền trước của văn bản + +119 +00:07:47,570 --> 00:07:50,120 +đó và tôi sẽ thay đổi nó thành màu xanh lục. + +120 +00:07:50,900 --> 00:07:55,520 +Và nó cũng sẽ yêu cầu màu nền là màu vàng để chúng ta + +121 +00:07:55,910 --> 00:07:58,850 +loại bỏ màu trắng. Và cuối + +122 +00:07:58,850 --> 00:08:01,700 +cùng, tôi sẽ thêm điều này + +123 +00:08:03,170 --> 00:08:07,970 +bằng cách sử dụng lưới, đặt cột thành 1 và + +124 +00:08:08,030 --> 00:08:11,870 +hàng thành 3. Vì vậy, về cơ bản đây sẽ là hàng cuối cùng. + +125 +00:08:12,350 --> 00:08:14,600 +Vì vậy, bạn có thể thấy sau tất cả những + +126 +00:08:14,630 --> 00:08:19,630 +công việc đó, cuối cùng chúng tôi đã hoàn thành giao diện người dùng và hiện chúng tôi đã đạt được giao + +127 +00:08:20,330 --> 00:08:21,290 +diện cuối cùng. + +128 +00:08:21,530 --> 00:08:26,530 +Và tất cả những gì chúng ta cần làm bây giờ là thực sự thêm chức năng hẹn giờ, mà chúng ta sẽ thực + +129 +00:08:27,020 --> 00:08:29,780 +hiện trong bài học tiếp theo. Bây giờ, nếu bạn + +130 +00:08:29,810 --> 00:08:33,799 +thấy bất kỳ tiện ích tkinter nào khó sử dụng hoặc bạn gặp khó khăn + +131 +00:08:33,799 --> 00:08:38,150 +hoặc bạn không thể tìm ra những điều nhất định về nó, thì hãy nhớ xem + +132 +00:08:38,270 --> 00:08:41,419 +lại các bài học ngày hôm qua, nơi chúng ta đã nói + +133 +00:08:41,750 --> 00:08:44,030 +về các tiện ích đó chi tiết hơn. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 Add a Count Down Mechanism.mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 Add a Count Down Mechanism.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d081a7f2a18b18dbc4e428beb0c847929d4441d0 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 Add a Count Down Mechanism.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ae3a3188dab8b7d1fd34445b34731a4b923ebb442fac725747ee8c1317c1932 +size 106253971 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 Add a Count Down Mechanism_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 Add a Count Down Mechanism_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9bc79c8f49226123575eb17476b528298bb13cf2 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 Add a Count Down Mechanism_vi.srt @@ -0,0 +1,1028 @@ +1 +00:00:00,540 --> 00:00:01,560 +Trong bài học + +2 +00:00:01,589 --> 00:00:05,880 +trước, chúng tôi đã hoàn thành giao diện người dùng cho bộ đếm thời gian Pomodoro + +3 +00:00:06,450 --> 00:00:11,130 +của mình và chúng tôi đã quản lý để đưa tất cả các thành phần chúng tôi cần + +4 +00:00:11,130 --> 00:00:16,050 +vào giao diện người dùng đồ họa của mình. Bây giờ, bước tiếp theo là thực sự cung cấp cho nó một số chức năng. + +5 +00:00:16,770 --> 00:00:21,480 +Tôi muốn có thể tạo ra một số loại cơ chế đếm ngược để thực hiện một việc + +6 +00:00:21,480 --> 00:00:24,000 +thực sự đơn giản. Ví dụ, + +7 +00:00:24,000 --> 00:00:28,830 +nếu nó chỉ có thể đếm ngược từ năm, bốn, ba, + +8 +00:00:29,220 --> 00:00:33,600 +hai, một đi xuống mỗi lần, điều đó thật tuyệt. + +9 +00:00:34,110 --> 00:00:36,420 +Đó là những gì chúng ta sẽ làm trong bài học này. + +10 +00:00:36,480 --> 00:00:40,530 +Và chúng ta sẽ đi xem phần cơ chế đếm ngược để làm điều đó. + +11 +00:00:41,490 --> 00:00:46,470 +Một trong những cách mà bạn có thể nghĩ đến khi tiếp cận điều này là sử dụng mô-đun thời gian của chúng tôi + +12 +00:00:46,470 --> 00:00:47,303 +vì chúng tôi + +13 +00:00:47,340 --> 00:00:52,020 +đã thấy trước đây rằng chúng tôi có thể nói thời gian. ngủ và chúng ta có thể bảo nó + +14 +00:00:52,020 --> 00:00:53,550 +ngủ trong một giây. + +15 +00:00:54,000 --> 00:00:58,980 +Vì vậy, sau đó chúng ta có thể thiết lập một vòng lặp while và trong khi điều gì đó hoặc điều + +16 +00:00:59,280 --> 00:01:04,260 +khác là đúng, hãy tiếp tục và ngủ trong một giây. Và sau đó, bạn biết đấy, trừ đi + +17 +00:01:04,319 --> 00:01:09,240 +một trong một số loại bộ đếm. + +18 +00:01:09,240 --> 00:01:14,240 +Vì vậy, chúng tôi có thể bắt đầu đếm ở năm và sau đó mỗi lần chúng tôi trừ đi một và sau đó mỗi + +19 +00:01:15,360 --> 00:01:16,890 +lần chúng tôi chỉ cần cập nhật + +20 +00:01:17,250 --> 00:01:21,750 +nhãn của mình tại đây, nhãn mà chúng tôi đã tạo trong canvas thành bất kỳ giá trị nào có thể đếm được. + +21 +00:01:22,560 --> 00:01:24,990 +Bây giờ, điều đó nghe có vẻ tuyệt vời về nguyên tắc. + +22 +00:01:25,200 --> 00:01:30,200 +Vấn đề duy nhất là chúng tôi đang làm việc trong một chương trình giao diện người dùng + +23 +00:01:30,690 --> 00:01:31,523 +đồ họa. + +24 +00:01:32,310 --> 00:01:36,750 +Lý do tại sao điều đó có liên quan là bởi vì nếu chúng ta nghĩ về + +25 +00:01:36,750 --> 00:01:38,640 +một chương trình dòng lệnh, chẳng hạn + +26 +00:01:38,640 --> 00:01:43,020 +như nếu chúng ta sử dụng bảng điều khiển của mình để làm điều gì đó, hãy + +27 +00:01:43,080 --> 00:01:43,980 +in lời chào, tốt, + +28 +00:01:43,980 --> 00:01:48,980 +nó sẽ chỉ làm điều gì đó khi bạn thực sự cung cấp cho nó một chỉ dẫn và bạn + +29 +00:01:49,380 --> 00:01:50,213 +nhấn enter. + +30 +00:01:50,760 --> 00:01:55,530 +Nó thực sự không cần phải để ý đến những gì bạn có thể làm ở giữa. + +31 +00:01:56,130 --> 00:01:59,190 +Nhưng giao diện người dùng đồ họa hơi khác một chút. + +32 +00:01:59,520 --> 00:02:03,690 +Nó cần phải tiếp tục theo dõi màn hình để xem liệu + +33 +00:02:03,690 --> 00:02:06,870 +người dùng có nhấp vào một nút hay không. + +34 +00:02:07,350 --> 00:02:12,350 +Vì vậy, về cơ bản nó sẽ làm mới và tiếp tục lắng nghe các sự kiện. + +35 +00:02:13,110 --> 00:02:14,880 +Vì vậy, mỗi phần của giây, nó sẽ tiếp tục + +36 +00:02:14,880 --> 00:02:16,890 +kiểm tra, có điều gì đó xảy ra không, có điều gì + +37 +00:02:16,920 --> 00:02:20,760 +đó xảy ra không, đã xảy ra điều gì đó chưa. Và thời điểm khi nó xảy ra, + +38 +00:02:20,850 --> 00:02:24,510 +sau đó nó phải phản ứng. Nó phải phản ứng với sự kiện đó. + +39 +00:02:25,050 --> 00:02:30,030 +Trong trường hợp này, chúng tôi có xu hướng gọi các loại chương trình GUI này là hướng sự kiện. + +40 +00:02:30,690 --> 00:02:35,040 +Và cách mà nó được điều khiển là thông qua vòng lặp chính của chúng tôi. + +41 +00:02:35,490 --> 00:02:39,450 +Vì vậy, khi chúng ta thiết lập cửa sổ của mình và bắt đầu vòng lặp chính, về cơ + +42 +00:02:39,780 --> 00:02:44,780 +bản nó sẽ lặp lại và cứ mỗi mili giây nó sẽ kiểm tra xem có điều gì đó xảy ra không, có điều gì + +43 +00:02:44,940 --> 00:02:47,730 +đó đã xảy ra không, có điều gì đó đã xảy ra không? + +44 +00:02:48,210 --> 00:02:51,090 +Vì vậy, điều đó có nghĩa là nếu chúng ta có một vòng lặp khác trong chương trình của + +45 +00:02:51,120 --> 00:02:55,200 +mình, nó thực sự sẽ không thể đến được vòng lặp chính. Và trong trường hợp này, khi bạn thực + +46 +00:02:55,230 --> 00:02:57,780 +sự cố gắng chạy nó, không có gì xảy ra. + +47 +00:02:57,840 --> 00:02:59,830 +Chương trình của chúng tôi thậm chí không khởi chạy. + +48 +00:03:00,340 --> 00:03:05,260 +Vì vậy, chúng ta phải suy nghĩ lại điều này và chúng ta phải làm khác đi một chút. Để tạo ra các chương trình + +49 +00:03:05,260 --> 00:03:08,950 +tương tác và thú vị, bạn cần một cái gì + +50 +00:03:09,370 --> 00:03:12,640 +đó xảy ra trên màn hình, phải không? + +51 +00:03:12,640 --> 00:03:16,750 +Thường xuyên như vậy. Bạn cần cơ chế thời gian này. May mắn thay, + +52 +00:03:16,780 --> 00:03:18,820 +tkinter đã nghĩ ra điều này. + +53 +00:03:19,150 --> 00:03:23,800 +Và trên thực tế, chúng tôi có thể sử dụng một trong các phương pháp nội trang cho mọi tiện ích con. + +54 +00:03:24,220 --> 00:03:26,140 +Vì vậy, nếu chúng ta nhấn vào tiện + +55 +00:03:26,290 --> 00:03:31,290 +ích cửa sổ của mình, chúng ta có thể nắm được một phương thức được gọi là after và after khá đơn giản. + +56 +00:03:32,230 --> 00:03:36,760 +Đó là một phương thức cần một khoảng thời gian mà nó sẽ đợi và sau + +57 +00:03:37,270 --> 00:03:39,190 +khoảng thời gian đó, nó chỉ + +58 +00:03:39,460 --> 00:03:44,460 +đơn giản gọi một hàm cụ thể mà bạn yêu cầu nó gọi truyền vào bất kỳ đối số + +59 +00:03:44,650 --> 00:03:48,760 +nào mà bạn muốn cung cấp cho nó. Đây là cách nó hoạt động. + +60 +00:03:48,820 --> 00:03:53,820 +Chúng tôi gọi cửa sổ. sau đó, trước tiên chúng tôi cung cấp khoảng + +61 +00:03:54,460 --> 00:03:58,720 +thời gian chờ tính bằng mili giây. Vì vậy, nếu chúng ta muốn một giây, thì đó là 1000 mili giây. + +62 +00:03:59,320 --> 00:04:02,200 +Tiếp theo, chúng ta chuyển một hàm để gọi. + +63 +00:04:02,530 --> 00:04:07,390 +Vì vậy, hãy tạo một hàm ở đây. Hãy chỉ cần gọi nó, nói điều gì đó, + +64 +00:04:07,990 --> 00:04:10,330 +và sau đó chúng ta sẽ chuyển qua + +65 +00:04:12,610 --> 00:04:16,420 +mọi thứ, như thế này. Và sau đó tất cả những gì chúng tôi làm là chúng tôi chỉ in thứ đó. + +66 +00:04:16,959 --> 00:04:18,760 +Vì vậy, chức năng siêu đơn giản. + +67 +00:04:18,790 --> 00:04:23,790 +Và sau đó chúng tôi đặt tên của hàm này là hàm để gọi sau 1000 + +68 +00:04:24,310 --> 00:04:25,143 +mili giây. + +69 +00:04:25,600 --> 00:04:29,590 +Bây giờ, điều cuối cùng trong danh sách các đối số này, + +70 +00:04:29,920 --> 00:04:34,090 +nếu tôi tiếp tục và cắt nó và hiển thị lại cho bạn, + +71 +00:04:34,510 --> 00:04:39,010 +khi nó đưa ra lời nhắc, điều cuối cùng thực sự là một * args. + +72 +00:04:39,490 --> 00:04:44,230 +Điều này, nếu bạn nhớ, cho phép chúng tôi đưa vào vô số + +73 +00:04:44,290 --> 00:04:46,090 +đối số vị trí. + +74 +00:04:46,600 --> 00:04:50,890 +Điều đó có nghĩa là chúng ta có thể đưa ra bao nhiêu đối số + +75 +00:04:51,220 --> 00:04:56,220 +tùy thích và những đối số đó, trong trường hợp này, chỉ đơn giản là sẽ được chuyển đến + +76 +00:04:56,350 --> 00:04:59,920 +hàm mà chúng ta muốn gọi. Vì vậy, trong trường hợp này, nó sẽ là thứ đó. + +77 +00:05:00,190 --> 00:05:03,580 +Vì vậy, nếu tôi đặt hello ở đây sau đó + +78 +00:05:03,940 --> 00:05:07,990 +tôi chạy mã của mình, bạn có thể thấy rằng sau 1000 + +79 +00:05:08,440 --> 00:05:10,750 +mili giây, về cơ bản là một + +80 +00:05:10,810 --> 00:05:15,400 +giây, nó gọi hàm này, say_something và nó chuyển hello này làm đầu vào + +81 +00:05:15,580 --> 00:05:18,370 +cho hàm đó. Như tôi đã + +82 +00:05:18,400 --> 00:05:22,000 +nói, bạn có thể có vô số đối số vị trí. + +83 +00:05:22,330 --> 00:05:26,530 +Vì vậy, hãy đặt một số đối số khác mà chúng ta sẽ gọi + +84 +00:05:26,530 --> 00:05:27,363 +là a, + +85 +00:05:27,610 --> 00:05:32,320 +b và c, sau đó chúng ta sẽ in a, in b và in c. + +86 +00:05:33,970 --> 00:05:36,640 +Và bây giờ thay vì chuyển vào hello, chúng ta + +87 +00:05:36,670 --> 00:05:41,650 +sẽ chuyển vào rất nhiều tham số vị trí. Vì vậy, chúng tôi sẽ nói 3, + +88 +00:05:41,680 --> 00:05:44,500 +5 và 8. Bây giờ, khi tôi + +89 +00:05:44,560 --> 00:05:46,840 +nhấn run, bạn sẽ thấy nó đợi một giây + +90 +00:05:47,170 --> 00:05:51,850 +và sau đó nó chuyển cả ba thông số này để nói điều gì đó và nó sẽ tiếp + +91 +00:05:52,270 --> 00:05:55,480 +tục và in tất cả những thông số đó ra cùng một lúc. + +92 +00:05:56,050 --> 00:06:01,010 +Vì vậy, đây là cách hoạt động của phương thức sau. Nhưng điều chúng tôi muốn làm + +93 +00:06:01,370 --> 00:06:03,920 +là chúng tôi muốn nó lặp lại chính + +94 +00:06:04,010 --> 00:06:09,010 +nó, về cơ bản là lặp lại. Một cách để có được hành vi đó là chỉ + +95 +00:06:10,760 --> 00:06:11,240 +cần + +96 +00:06:11,240 --> 00:06:16,240 +đặt phương thức này, gọi một nơi nào đó bên trong một hàm và sau đó gọi chính nó. + +97 +00:06:16,370 --> 00:06:20,930 +Vì vậy, đây là những gì tôi muốn nói. Hãy tạo một hàm được gọi + +98 +00:06:21,740 --> 00:06:26,740 +là count_down và điều này sẽ nhận một đầu vào ở dạng số để đếm ngược. + +99 +00:06:28,550 --> 00:06:32,270 +Và sau đó bên trong hàm này, chúng ta gọi là cửa sổ. sau. + +100 +00:06:32,720 --> 00:06:35,510 +Và chúng tôi nói rằng sau 1000 mili + +101 +00:06:35,750 --> 00:06:40,750 +giây, hãy gọi hàm đếm ngược này và sau đó chuyển vào một số đếm. + +102 +00:06:44,570 --> 00:06:47,390 +Nếu số đếm đó bắt đầu là + +103 +00:06:47,630 --> 00:06:50,840 +5, thì chúng ta muốn nói số đếm - 1. + +104 +00:06:51,320 --> 00:06:55,700 +Bây giờ tất cả những gì chúng ta phải làm là gọi phương thức đếm ngược này. + +105 +00:06:56,030 --> 00:07:00,530 +Vì vậy, chúng ta hãy gọi count_down và chuyển số đếm bắt đầu, + +106 +00:07:00,590 --> 00:07:04,430 +giả sử là 5 giây. Vì vậy, bây giờ + +107 +00:07:04,430 --> 00:07:07,760 +khi tôi chạy mã, nó sẽ gọi phương thức + +108 +00:07:08,300 --> 00:07:11,720 +này truyền vào 5 ở đây, và sau đó nó + +109 +00:07:12,110 --> 00:07:17,060 +sẽ đợi một giây, và sau đó nó sẽ gọi hàm count_down chuyển năm + +110 +00:07:17,240 --> 00:07:21,920 +trừ một để nó trở thành bốn. Và sau đó nó lặp lại một lần + +111 +00:07:21,950 --> 00:07:26,180 +nữa, trở thành ba, hai, một. Vì vậy, bây giờ nếu chúng ta + +112 +00:07:26,360 --> 00:07:30,500 +bắt được số mà chúng ta có thể in, thì chúng ta sẽ + +113 +00:07:30,530 --> 00:07:34,190 +có thể thấy nó đếm ngược khi chúng ta chạy mã; + +114 +00:07:34,580 --> 00:07:38,390 +năm bốn ba hai một. Mỗi giây một lần, và về cơ + +115 +00:07:38,450 --> 00:07:42,770 +bản nó vẫn tiếp tục và thậm chí nó còn tiếp tục với những tiêu cực. + +116 +00:07:43,310 --> 00:07:46,310 +Vì vậy, nếu chúng ta không muốn nó chuyển sang thời gian âm, thì + +117 +00:07:46,340 --> 00:07:49,220 +tất cả những gì chúng ta phải làm là thêm câu lệnh if. + +118 +00:07:49,640 --> 00:07:54,620 +Nếu số lượng lớn hơn 0, thì hãy tiếp tục và thực thi dòng mã này. + +119 +00:07:55,880 --> 00:07:59,780 +Vì vậy, bây giờ nó sẽ đi từ năm, bốn, ba, hai, một, + +120 +00:07:59,810 --> 00:08:02,570 +không, và sau đó nó sẽ dừng lại. + +121 +00:08:03,470 --> 00:08:08,450 +Đây là loại hành vi mà chúng ta cần nếu muốn cập nhật bộ đếm ngược + +122 +00:08:08,450 --> 00:08:11,180 +trong bộ đếm thời gian Pomodoro của mình. + +123 +00:08:11,900 --> 00:08:14,180 +Vì vậy, làm thế nào chúng tôi có thể thay vì in + +124 +00:08:14,180 --> 00:08:19,180 +số lượng thực sự thay đổi văn bản này trên canvas của chúng tôi? Chúng tôi sẽ, cách chúng + +125 +00:08:19,820 --> 00:08:24,820 +tôi làm điều đó là gán cho văn bản này một biến. + +126 +00:08:25,430 --> 00:08:28,460 +Vì vậy, tôi sẽ gọi nó là timer_text và bây + +127 +00:08:29,870 --> 00:08:34,870 +giờ chúng ta đã có timer_text là một tập hợp làm văn bản được tạo trong canvas, + +128 +00:08:35,360 --> 00:08:38,870 +sau đó chúng ta có thể truy cập nó ngay tại đây. + +129 +00:08:39,620 --> 00:08:44,120 +Và cách chúng ta thay đổi một đoạn văn bản hoặc bất cứ thứ gì cho vấn + +130 +00:08:44,120 --> 00:08:48,110 +đề đó trong canvas hơi khác với cách chúng ta làm đối với một nhãn. + +131 +00:08:48,530 --> 00:08:52,070 +Nếu đó chỉ là nhãn tiêu đề mà chúng tôi muốn thay + +132 +00:08:52,070 --> 00:08:56,310 +đổi, chúng tôi sẽ nói nhãn title_. cấu hình, và sau đó hãy thay đổi văn bản thành một cái gì đó mới. + +133 +00:08:56,940 --> 00:08:58,920 +Nhưng để thay đổi một phần tử + +134 +00:08:58,950 --> 00:09:02,640 +canvas, bạn thực sự phải nhấn vào canvas cụ thể mà bạn muốn thay đổi + +135 +00:09:03,240 --> 00:09:08,220 +và Sau đó, bạn gọi một phương thức có tên itemconfig. Và sau đó trong phương pháp này, bạn chuyển + +136 +00:09:08,280 --> 00:09:12,240 +vào mục cụ thể mà bạn thực sự muốn định cấu hình, vì vậy + +137 +00:09:12,540 --> 00:09:14,910 +trong trường hợp của chúng tôi, đó + +138 +00:09:15,570 --> 00:09:20,570 +là timer_text, và sau đó bạn chuyển điều về nó mà bạn thực sự muốn thay đổi về + +139 +00:09:20,970 --> 00:09:24,300 +kwarg, vì vậy điều này là một đối số từ khóa. + +140 +00:09:24,870 --> 00:09:28,380 +Chúng tôi sẽ thay đổi văn bản thành số hiện tại. + +141 +00:09:28,650 --> 00:09:31,620 +Bây giờ hãy chú ý cách đây không phải là số chuỗi, bởi vì + +142 +00:09:31,830 --> 00:09:34,290 +sau đó nó sẽ chỉ hiển thị từ đó, mà thực + +143 +00:09:34,620 --> 00:09:39,270 +sự là thời gian đếm ngược trực tiếp của nó. Tại thời điểm này nếu tôi chạy mã, + +144 +00:09:39,300 --> 00:09:40,500 +tôi thực sự gặp + +145 +00:09:40,500 --> 00:09:45,500 +lỗi và nó cho chúng ta biết rằng canvas tên chưa được xác định và đó là + +146 +00:09:46,320 --> 00:09:50,940 +bởi vì tôi đang gọi phương thức này đếm ngược trước khi tôi thực sự tạo + +147 +00:09:50,940 --> 00:09:51,690 +canvas. + +148 +00:09:51,690 --> 00:09:56,250 +Vì vậy, nếu tôi chuyển nó xuống dưới dòng này và chạy lại, thì bạn sẽ + +149 +00:09:56,280 --> 00:09:58,020 +thấy nó thực sự hoạt động. + +150 +00:09:58,320 --> 00:10:02,370 +Và bạn thấy nó bắt đầu từ năm và nó đếm ngược đến không. + +151 +00:10:03,180 --> 00:10:08,180 +Bây giờ làm thế nào chúng ta có thể gắn hành vi đó với nút bắt đầu để + +152 +00:10:08,250 --> 00:10:13,140 +tôi có thể nhấn nút bắt đầu và sau đó và chỉ sau đó nó bắt đầu đếm + +153 +00:10:13,140 --> 00:10:17,700 +ngược từ năm, bốn, ba, hai, một? Chà, hãy tiếp tục và thêm một chức + +154 +00:10:17,760 --> 00:10:22,500 +năng khác và tôi sẽ thêm nó vào phần cơ chế hẹn giờ và tôi sẽ + +155 +00:10:22,500 --> 00:10:24,120 +gọi nó là start_timer. + +156 +00:10:24,900 --> 00:10:27,750 +Bây giờ chức năng này là siêu đơn giản. + +157 +00:10:27,930 --> 00:10:32,930 +Tất cả những gì nó sẽ làm là nó sẽ chịu trách nhiệm gọi hàm đếm + +158 +00:10:33,030 --> 00:10:36,660 +ngược đó và nó sẽ đếm ngược từ năm giây. + +159 +00:10:36,810 --> 00:10:39,840 +Vì vậy, tôi sẽ chuyển nó vào bên trong start_timer. + +160 +00:10:40,500 --> 00:10:45,500 +Và bây giờ bộ hẹn giờ bắt đầu sẽ là chức năng cần được kích + +161 +00:10:47,070 --> 00:10:49,560 +hoạt khi nhấn nút khởi động. + +162 +00:10:49,920 --> 00:10:53,280 +Bạn có nhớ cách gắn một hàm với + +163 +00:10:53,280 --> 00:10:58,260 +một nút trong tkinter không? Tạm dừng video và xem liệu bạn có thể giải quyết + +164 +00:10:58,260 --> 00:11:03,260 +được thử thách này hay không để có thể chạy mã, nhấn bắt đầu và bộ đếm thời gian để bắt đầu đếm ngược. + +165 +00:11:06,630 --> 00:11:11,630 +Vì vậy, đối số từ khóa là lệnh và tất cả những gì chúng ta phải làm + +166 +00:11:12,210 --> 00:11:15,990 +là gắn nó với hàm start_timer, nhưng không có dấu ngoặc đơn. + +167 +00:11:16,500 --> 00:11:19,920 +Vì vậy, bây giờ khi tôi nhấn chạy và tôi nhấp vào bắt + +168 +00:11:20,340 --> 00:11:24,840 +đầu, nó sẽ bắt đầu cài đặt bộ đếm thời gian cho văn bản đó từ năm, bốn, + +169 +00:11:24,930 --> 00:11:25,763 +ba, hai, một. + +170 +00:11:26,220 --> 00:11:31,220 +Vì vậy, vòng lặp chính đang lắng nghe và khi người dùng tương tác với + +171 +00:11:31,890 --> 00:11:36,660 +nút bắt đầu, nó thực sự gọi hàm start_timer gọi hàm đếm ngược + +172 +00:11:36,960 --> 00:11:39,900 +và bắt nó đếm ngược từ năm giây. + +173 +00:11:40,560 --> 00:11:43,980 +Bây giờ chúng tôi thực sự không muốn đếm ngược từ năm giây. + +174 +00:11:44,010 --> 00:11:48,750 +Chúng tôi muốn đếm ngược theo phút bởi vì chúng tôi có thể sẽ không làm việc trong + +175 +00:11:48,750 --> 00:11:50,130 +năm giây cùng một lúc. + +176 +00:11:50,160 --> 00:11:54,040 +Chúng tôi sẽ làm việc trong 25 phút hoặc giải lao một phút. + +177 +00:11:54,580 --> 00:11:59,580 +Vậy làm cách nào tôi có thể thay đổi bộ đếm ngược này để diễn giải điều này thay vì + +178 +00:12:01,390 --> 00:12:04,990 +từ năm giây thành năm phút? Vâng, hãy suy nghĩ về điều đó. + +179 +00:12:05,680 --> 00:12:09,850 +Nếu chúng ta muốn đếm ngược, giả sử là một phút, + +180 +00:12:10,240 --> 00:12:14,230 +sau đó tính theo giây sẽ là 60 giây. + +181 +00:12:14,860 --> 00:12:18,670 +Tất cả những gì chúng ta phải làm là lấy số phút mà chúng ta muốn + +182 +00:12:18,670 --> 00:12:22,540 +đếm ngược và nhân nó với 60. Trong trường hợp này, nếu + +183 +00:12:22,540 --> 00:12:27,040 +chúng ta muốn đếm ngược năm phút thay vì năm giây, tất cả những + +184 +00:12:27,400 --> 00:12:30,160 +gì chúng ta phải làm là nhân với 60. + +185 +00:12:30,670 --> 00:12:33,880 +Vì vậy, khi chúng ta gọi hàm này là count_down, + +186 +00:12:34,150 --> 00:12:36,790 +thay vì đếm ngược năm giây, chúng ta + +187 +00:12:36,820 --> 00:12:39,190 +có 300 giây để đếm từ đó. + +188 +00:12:39,880 --> 00:12:44,470 +Nhưng bây giờ nếu chúng tôi chạy mã của mình, bạn có thể thấy nó sẽ bắt đầu từ 300. + +189 +00:12:44,740 --> 00:12:49,240 +Nó sẽ đi xuống tất cả các con đường xuống 0. Bây giờ về thời gian, đó + +190 +00:12:49,390 --> 00:12:54,040 +là năm phút, nhưng đây không phải là cách tốt để hình dung nó. + +191 +00:12:54,370 --> 00:12:58,570 +Không ai nghĩ về 288 giây còn lại, phải không? + +192 +00:12:59,140 --> 00:13:04,140 +Vì vậy, chúng tôi phải định dạng số đếm này để chúng tôi có thể + +193 +00:13:04,720 --> 00:13:09,010 +hiển thị nó ở định dạng 00:00 như kiểu thời gian thông + +194 +00:13:09,010 --> 00:13:14,010 +thường, chẳng hạn như bạn còn một phút 35 giây hoặc tương tự như vậy. + +195 +00:13:15,520 --> 00:13:20,520 +Vậy làm thế nào chúng ta có thể tạo ra một cái gì đó như thế này? Nếu chúng ta đếm theo giây, giả sử chúng + +196 +00:13:20,680 --> 00:13:21,220 +ta + +197 +00:13:21,220 --> 00:13:26,220 +có 300, và chúng ta muốn biết trong đó bao nhiêu phút trong đó tất cả những gì + +198 +00:13:26,800 --> 00:13:31,800 +chúng ta phải làm là lấy 300 và sau đó chia cho 60 và chúng ta sẽ nhận + +199 +00:13:32,680 --> 00:13:37,150 +được 5, vì vậy đó là 5 phút. Nhưng điều gì sẽ xảy ra nếu + +200 +00:13:37,210 --> 00:13:42,210 +đồng hồ đếm ngược đã diễn ra và thay vào đó chúng ta chỉ còn 245 giây? + +201 +00:13:42,790 --> 00:13:48,000 +Chà, chúng ta thực sự có thể nắm được số phút và giây tương đương với. + +202 +00:13:50,020 --> 00:13:54,430 +Và cách chúng ta sẽ làm điều đó là lấy số đó, giả sử 245, + +203 +00:13:54,760 --> 00:13:56,920 +chia nó cho 60 giây và + +204 +00:13:57,280 --> 00:14:02,280 +chúng ta sẽ nhận được số 245/60 là 4. 08, 3 lặp + +205 +00:14:05,440 --> 00:14:06,820 +lại. + +206 +00:14:07,570 --> 00:14:12,570 +Nếu chúng ta làm tròn số đó xuống để loại bỏ tất cả các chữ số + +207 +00:14:13,240 --> 00:14:16,060 +thập phân, thì đó sẽ là 4 phút. + +208 +00:14:16,810 --> 00:14:21,810 +Và sau đó nếu chúng ta muốn biết còn bao nhiêu giây sau khi chúng ta + +209 +00:14:22,420 --> 00:14:23,620 +nắm giữ được + +210 +00:14:24,010 --> 00:14:29,010 +4 phút, thì cách chúng ta làm là sử dụng mô-đun vì hãy nhớ mô-đun chia + +211 +00:14:29,650 --> 00:14:34,450 +một số cho một số khác, vì vậy 245 chia đến 60, và sau đó + +212 +00:14:34,870 --> 00:14:37,240 +nó sẽ cho chúng ta phần còn lại. + +213 +00:14:37,420 --> 00:14:42,280 +Sau khi chia sạch sẽ còn lại bao nhiêu. Và trong trường hợp này, + +214 +00:14:42,340 --> 00:14:47,340 +đây thực sự sẽ là số giây còn lại sau khi + +215 +00:14:48,100 --> 00:14:51,650 +hết 4 phút. Vì vậy, hãy viết mã này ra. + +216 +00:14:52,550 --> 00:14:57,550 +Số phút đếm sẽ là số chia cho 60, nhưng sau đó chúng ta phải + +217 +00:14:59,780 --> 00:15:04,330 +làm tròn nó xuống để loại bỏ tất cả phần còn lại. + +218 +00:15:04,330 --> 00:15:09,110 +Bây giờ chúng tôi không muốn làm tròn nó thành một cái gì đó giống như 3. 6 nó trở thành + +219 +00:15:09,170 --> 00:15:10,640 +4. + +220 +00:15:10,910 --> 00:15:15,770 +Chúng tôi thực sự chỉ muốn loại bỏ mọi thứ sau chữ số thập phân. Để làm điều đó, cách dễ nhất + +221 +00:15:15,770 --> 00:15:16,310 +là + +222 +00:15:16,310 --> 00:15:21,310 +nhập mô-đun toán học và sau đó sử dụng một hàm được gọi là toán học. sàn và toán này. sàn, nếu tôi di chuột qua nó, sẽ + +223 +00:15:23,870 --> 00:15:27,800 +trả về số + +224 +00:15:27,830 --> 00:15:32,830 +nguyên lớn nhất nhỏ hơn hoặc bằng x. + +225 +00:15:36,020 --> 00:15:37,310 +Nếu đây là 4. 8, thì số lỗ lớn nhất nhỏ hơn 4. 8 là 4. + +226 +00:15:37,790 --> 00:15:42,790 +Vì vậy, về cơ bản đó là những gì điều này sẽ làm. + +227 +00:15:46,250 --> 00:15:47,960 +Và điều này sẽ cho chúng ta số phút. Bây giờ, điều tiếp theo chúng tôi muốn + +228 +00:15:48,170 --> 00:15:51,020 +làm là biết, còn bao nhiêu + +229 +00:15:51,020 --> 00:15:53,000 +giây nữa sau khi chúng tôi loại bỏ số phút. Để làm điều này, chúng ta sẽ đếm + +230 +00:15:53,000 --> 00:15:58,000 +và sau đó chúng ta sẽ sử dụng modulo để chia + +231 +00:15:58,700 --> 00:15:59,660 +nó cho 60. + +232 +00:15:59,720 --> 00:16:03,200 +Vì vậy, mô-đun sẽ cung cấp cho chúng + +233 +00:16:03,770 --> 00:16:08,770 +ta số giây còn lại sau khi chúng ta chia nó cho 600. Ví dụ, nếu chúng ta có 100 giây và chúng + +234 +00:16:09,440 --> 00:16:12,650 +ta chia nó + +235 +00:16:12,650 --> 00:16:16,250 +cho 60, thì, nó sẽ bằng một. + +236 +00:16:16,250 --> 00:16:17,870 +Vì vậy, chúng tôi có thể trừ 60 từ 100 và chúng tôi nhận được 40 là phần còn lại. + +237 +00:16:18,290 --> 00:16:23,290 +Đó là những gì chúng ta sẽ nhận được sau khi thực hiện modulo. + +238 +00:16:25,010 --> 00:16:27,830 +Vì vậy, về cơ bản đó là số giây còn lại. + +239 +00:16:28,430 --> 00:16:31,220 +Vì vậy, bây giờ chúng ta đã có phút và giây, chúng ta + +240 +00:16:32,240 --> 00:16:36,260 +thực sự có thể thay đổi số đếm này để sử dụng chuỗi f và chúng ta có thể + +241 +00:16:36,260 --> 00:16:41,260 +định dạng nó để chúng ta thêm số phút trước, sau đó chúng ta thêm dấu hai chấm và sau đó chúng ta thêm + +242 +00:16:42,170 --> 00:16:43,003 +tính bằng giây. + +243 +00:16:43,130 --> 00:16:48,130 +Bây giờ hãy nhìn vào những gì sẽ xảy ra. Chúng tôi sẽ thử đếm ngược năm phút. + +244 +00:16:49,430 --> 00:16:53,900 +Vì vậy, chúng tôi nắm giữ số + +245 +00:16:54,260 --> 00:16:58,490 +giây, chúng tôi chuyển nó cho hàm này, chúng tôi tính ra số đếm tương đương + +246 +00:16:58,880 --> 00:17:03,080 +với phút và giây và sau đó chúng tôi trừ đi một giây mỗi lần. + +247 +00:17:03,470 --> 00:17:06,920 +Vì vậy, bây giờ khi tôi chạy mã và tôi nhấn bắt đầu, hãy + +248 +00:17:07,520 --> 00:17:10,310 +chú ý cách nó bắt đầu từ 5 phút, giảm + +249 +00:17:10,640 --> 00:17:14,270 +xuống 4 phút, 50, 59 và sau đó nó tiếp tục diễn ra như + +250 +00:17:14,270 --> 00:17:15,980 +một bộ đếm thời gian thực. + +251 +00:17:16,069 --> 00:17:19,310 +Điều đó khá tuyệt. + +252 +00:17:20,180 --> 00:17:21,440 +Điều duy nhất còn lại để tìm ra là làm thế nào chúng ta có thể làm cho nó không hiển thị 5: 0? + +253 +00:17:21,650 --> 00:17:26,650 +Làm thế nào chúng tôi có thể làm cho nó + +254 +00:17:27,349 --> 00:17:32,060 +hiển thị 5:00 như bạn thấy trên đồng hồ? Để tìm hiểu cách thực hiện điều đó, chúng ta phải tìm hiểu về + +255 +00:17:32,840 --> 00:17:36,260 +kiểu gõ động trong Python. + +256 +00:17:36,290 --> 00:17:39,170 +Chúng ta phải hiểu cách hoạt động của nó và + +257 +00:17:39,440 --> 00:17:43,370 +đó là những gì chúng ta sẽ nói đến trong bài học tiếp theo. Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 TCL-tk-Docs-after-.url b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 TCL-tk-Docs-after-.url new file mode 100644 index 0000000000000000000000000000000000000000..8c25a4b345a784f108164265ef412b46403638a0 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/004 TCL-tk-Docs-after-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://tcl.tk/man/tcl8.6/TclCmd/after.htm \ No newline at end of file diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Dynamic Typing Explained.mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Dynamic Typing Explained.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fcee5d9646eb37658e7732cfc1b640388b2ee84c --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Dynamic Typing Explained.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3955ffb038e867952d21a4ba1dd64ee76741ca820ad43502c1220f245c83386d +size 55258179 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Dynamic Typing Explained_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Dynamic Typing Explained_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e296a1717bcde25afc2ffe9dab4ce666ff9fdfd8 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Dynamic Typing Explained_vi.srt @@ -0,0 +1,416 @@ +1 +00:00:00,780 --> 00:00:04,830 +Trong bài học trước, chúng tôi đã cố gắng làm cho cơ chế đếm ngược của mình hoạt động + +2 +00:00:05,160 --> 00:00:10,100 +và chúng tôi đã đếm ngược từ năm phút đến 0. Bây giờ, mọi thứ đều hoạt động, nhưng + +3 +00:00:10,580 --> 00:00:14,510 +chỉ có điều gì đó hơi khúc mắc và bạn sẽ thấy + +4 +00:00:14,510 --> 00:00:18,200 +nó khi tôi bắt đầu. Lưu ý cách nó nói 5: 0. + +5 +00:00:18,740 --> 00:00:21,880 +Nó sẽ không tốt hơn nhiều nếu nó nói 5:00? + +6 +00:00:23,450 --> 00:00:25,280 +Vì vậy, làm thế nào chúng tôi sẽ làm điều đó? Chà, đó + +7 +00:00:25,550 --> 00:00:30,320 +là số 0 đến từ count_sec này vì nó lấy số đếm bằng giây, + +8 +00:00:30,320 --> 00:00:35,210 +chia nó cho 60 và tìm phần còn lại bằng cách sử dụng mô-đun. + +9 +00:00:35,720 --> 00:00:39,140 +Bây giờ, khi không có phần dư, nó sẽ bằng không. + +10 +00:00:39,620 --> 00:00:42,500 +Vì vậy, chúng ta có thể sử dụng câu + +11 +00:00:42,740 --> 00:00:45,800 +lệnh if và kiểm tra xem count_sec có bằng 0 + +12 +00:00:46,190 --> 00:00:50,990 +hay không, sau đó thay vì đặt nó bằng 0, hãy đặt nó bằng một + +13 +00:00:51,020 --> 00:00:52,160 +chuỗi là "00". + +14 +00:00:52,790 --> 00:00:56,150 +Bây giờ điều này thực sự, tin hay không, hoạt động. + +15 +00:00:56,900 --> 00:00:58,310 +Và bạn sẽ thấy nó khi tôi chạy nó. + +16 +00:00:58,340 --> 00:01:01,250 +Khi tôi bắt đầu, trông không tốt hơn nhiều sao? + +17 +00:01:02,330 --> 00:01:07,330 +Nhưng một số bạn có thể đã nhận ra rằng có điều gì đó hơi điên rồ đang xảy ra ở + +18 +00:01:07,640 --> 00:01:09,380 +đây trong hai dòng mã này. + +19 +00:01:09,830 --> 00:01:14,830 +Chúng tôi đang kiểm tra xem liệu biến này có chứa dữ liệu bằng số nguyên, số nguyên + +20 +00:01:16,610 --> 00:01:18,650 +bằng 0 hay không và sau + +21 +00:01:19,250 --> 00:01:21,890 +đó chúng tôi đang đặt nó thành một chuỗi. + +22 +00:01:22,310 --> 00:01:26,000 +Vì vậy, đây hoàn toàn là hai kiểu dữ liệu khác nhau. + +23 +00:01:26,030 --> 00:01:29,120 +Đó là một int và đó là một chuỗi. + +24 +00:01:29,540 --> 00:01:32,450 +Vậy làm cách nào mà chúng ta có thể làm được điều này? + +25 +00:01:33,350 --> 00:01:36,350 +Vì vậy, hãy để tôi kéo bảng điều khiển Python lên. + +26 +00:01:36,560 --> 00:01:39,260 +Chúng ta biết rằng nếu chúng ta lấy một + +27 +00:01:39,290 --> 00:01:44,180 +số nguyên, chẳng hạn như 3, và chúng ta cố gắng thêm nó vào một chuỗi, chẳng + +28 +00:01:44,480 --> 00:01:45,800 +hạn như 4, điều + +29 +00:01:45,830 --> 00:01:50,330 +này sẽ không hoạt động và chúng ta gặp lỗi kiểu vì đây là kiểu + +30 +00:01:50,420 --> 00:01:52,250 +int và đây là kiểu chuỗi. + +31 +00:01:52,520 --> 00:01:57,520 +Vì vậy, bạn thực sự không thể thêm hai điều này với nhau vì có sự không khớp. + +32 +00:01:58,250 --> 00:01:59,720 +Bây giờ đây là điều điên rồ. + +33 +00:01:59,840 --> 00:02:04,550 +Hãy tạo một biến a và làm cho nó chứa số nguyên bằng 3. + +34 +00:02:05,150 --> 00:02:10,150 +Và tại thời điểm này, bạn có thể thấy rằng đây là một biến có kiểu dữ liệu là int. + +35 +00:02:11,390 --> 00:02:16,130 +Nếu tôi quyết định thay đổi biến đó và làm cho nó chứa một kiểu dữ liệu khác, giả + +36 +00:02:16,430 --> 00:02:19,400 +sử là số 4, hoặc đơn giản hơn, hãy làm cho + +37 +00:02:19,400 --> 00:02:23,870 +nó giữ một đoạn văn bản, Xin chào. Ngay sau khi điều đó đi qua, + +38 +00:02:23,870 --> 00:02:27,410 +bạn có thể thấy rằng a hiện là chuỗi kiểu dữ liệu. + +39 +00:02:28,010 --> 00:02:30,950 +Và thực tế là tôi có thể làm điều đó, + +40 +00:02:31,100 --> 00:02:36,100 +thay đổi kiểu dữ liệu của một biến bằng cách thay đổi nội dung trong biến đó, + +41 +00:02:37,310 --> 00:02:42,310 +đây được gọi là kiểu nhập động. Theo nghĩa này, Python là một ngôn + +42 +00:02:42,770 --> 00:02:47,770 +ngữ khá độc đáo vì một mặt nó được đánh mạnh, theo nghĩa là nó + +43 +00:02:48,380 --> 00:02:53,380 +giữ kiểu dữ liệu của biến, vì vậy đây là một chuỗi và nó biết + +44 +00:02:54,230 --> 00:02:58,670 +rằng đó là một chuỗi và nếu bạn làm điều gì đó không + +45 +00:02:59,110 --> 00:03:02,650 +có ý nghĩa đối với một chuỗi, giả sử nếu + +46 +00:03:03,010 --> 00:03:06,640 +bạn cố gắng nâng a lên lũy thừa của 2, thì + +47 +00:03:07,090 --> 00:03:11,440 +đó sẽ là lỗi loại. Kiểu quan trọng và khi bạn gọi một + +48 +00:03:11,800 --> 00:03:15,280 +hàm đang mong đợi một kiểu cụ thể, hãy giả sử nếu bạn + +49 +00:03:15,610 --> 00:03:18,070 +sử dụng hàm power đang mong đợi một số + +50 +00:03:18,100 --> 00:03:22,600 +nguyên và bạn chuyển vào một cái gì đó rõ ràng không phải là số nguyên, hãy + +51 +00:03:22,630 --> 00:03:26,980 +nói chuỗi của chúng tôi ở đây và bạn cố gắng làm cho nó thực hiện + +52 +00:03:27,700 --> 00:03:32,020 +một số mọi thứ, giả sử nâng nó lên lũy thừa 3, sau đó, một lần + +53 +00:03:32,380 --> 00:03:34,300 +nữa, chúng tôi gặp lỗi loại. + +54 +00:03:34,330 --> 00:03:37,510 +Nó biết loại nào được cho là đi vào chức năng đó + +55 +00:03:37,840 --> 00:03:40,570 +và nó đảm bảo rằng bạn tuân thủ điều đó. + +56 +00:03:40,600 --> 00:03:43,150 +Đây là nơi ngôn ngữ được đánh máy mạnh mẽ. + +57 +00:03:43,660 --> 00:03:48,660 +Nhưng phần mà ngôn ngữ được nhập động là mặc dù nó biết kiểu + +58 +00:03:48,700 --> 00:03:51,160 +biến là gì, nó biết + +59 +00:03:51,220 --> 00:03:54,100 +kiểu mà hàm mong đợi, bạn cũng có + +60 +00:03:54,580 --> 00:03:59,580 +thể thay đổi kiểu dữ liệu của bất kỳ biến nào như thế này. + +61 +00:04:02,500 --> 00:04:06,130 +Về cơ bản đó là những gì chúng tôi đang sử dụng ở đây. Chúng tôi đang sử dụng + +62 +00:04:06,130 --> 00:04:07,510 +tính năng nhập + +63 +00:04:07,510 --> 00:04:12,510 +động để thay đổi kiểu dữ liệu của count_sec từ số nguyên thành chuỗi. + +64 +00:04:13,210 --> 00:04:18,209 +Và sau đó chúng tôi sử dụng chuỗi đó để hiển thị bên trong văn bản canvas này. + +65 +00:04:19,390 --> 00:04:20,529 +Tuy nhiên, bây giờ + +66 +00:04:20,529 --> 00:04:25,530 +vẫn còn một chút lỗi với điều này và bạn sẽ thấy nó khi nó giảm xuống dưới 10 giây. + +67 +00:04:27,430 --> 00:04:30,430 +Lưu ý rằng ngay sau khi nó chuyển sang + +68 +00:04:30,820 --> 00:04:34,660 +giây thứ 9, thay vì nói 09, đó là những gì bạn + +69 +00:04:34,690 --> 00:04:35,523 +muốn hoặc + +70 +00:04:35,740 --> 00:04:40,740 +08, 06, nó chỉ liệt kê số giây cho đến khi nó đạt đến 00. + +71 +00:04:41,380 --> 00:04:43,690 +Vì vậy, làm thế nào chúng ta có thể sửa chữa điều này? + +72 +00:04:44,770 --> 00:04:47,050 +Chìa khóa nằm ở hai dòng mã này. + +73 +00:04:47,740 --> 00:04:49,810 +Xem liệu bạn có thể làm điều này + +74 +00:04:50,290 --> 00:04:55,290 +như một thử thách hay không, tạm dừng video và xem liệu bạn có thể thực hiện được hay không + +75 +00:04:55,390 --> 00:04:56,200 +để khi + +76 +00:04:56,200 --> 00:05:01,200 +video còn lại chín giây, nó hiển thị 09 hoặc 08 hoặc 07 và tất nhiên là cả 00. + +77 +00:05:03,370 --> 00:05:07,840 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. Được rồi. + +78 +00:05:07,840 --> 00:05:12,700 +Vì vậy, về cơ bản những gì chúng tôi muốn kiểm tra là khi số đếm được tính + +79 +00:05:12,700 --> 00:05:17,050 +bằng giây nhỏ hơn 10, bởi vì bây giờ nó sẽ ở các chữ số đơn + +80 +00:05:17,230 --> 00:05:20,590 +lẻ và thay vì chỉ có một chữ số, chúng tôi muốn + +81 +00:05:20,650 --> 00:05:22,870 +thêm một số 0 vào trước nó. + +82 +00:05:23,470 --> 00:05:26,890 +Vì vậy, cách chúng ta có thể làm điều này là chỉ thông qua một chuỗi f. + +83 +00:05:27,340 --> 00:05:32,340 +Chúng ta có thể sử dụng một chuỗi f để thêm số 0 ở phía trước và + +84 +00:05:32,620 --> 00:05:34,390 +sau đó thêm số đếm + +85 +00:05:34,600 --> 00:05:39,220 +trong vài giây sau đó, định dạng nó thành loại định dạng thời gian tiêu chuẩn. + +86 +00:05:40,270 --> 00:05:44,290 +Bây giờ chúng tôi đã khắc phục rằng nếu chúng tôi chạy lại ứng dụng của + +87 +00:05:44,590 --> 00:05:46,450 +mình, nó sẽ giảm xuống còn 10 + +88 +00:05:47,140 --> 00:05:51,190 +giây, bạn có thể thấy nó bây giờ cho biết 09, 08, 07 và nó được định + +89 +00:05:51,460 --> 00:05:54,430 +dạng độc đáo bằng cách sử dụng chuỗi f của chúng tôi. + +90 +00:05:55,660 --> 00:06:00,660 +Và chúng tôi có thể làm được điều này vì tính linh hoạt của các kiểu dữ liệu trong Python, + +91 +00:06:01,130 --> 00:06:02,480 +kiểm tra nó dưới dạng + +92 +00:06:02,510 --> 00:06:07,430 +số, đảm bảo rằng nó nhỏ hơn 10 và sau đó định dạng nó thành một chuỗi và sử + +93 +00:06:07,430 --> 00:06:08,263 +dụng f-string. + +94 +00:06:08,900 --> 00:06:13,070 +Bây giờ, đây không phải là một tính năng có sẵn trong tất cả các ngôn ngữ lập trình. + +95 +00:06:13,370 --> 00:06:17,090 +Ví dụ, các ngôn ngữ như C hoặc Java hoặc Swift, bạn + +96 +00:06:17,420 --> 00:06:19,280 +sẽ không thể làm điều này. + +97 +00:06:19,880 --> 00:06:24,470 +Khi bạn tạo một biến và bạn cung cấp cho nó một loại dữ liệu nhất định, + +98 +00:06:24,680 --> 00:06:27,830 +thì nó sẽ phải giữ mãi loại dữ liệu đó. + +99 +00:06:28,520 --> 00:06:33,520 +Nhưng Python cho phép bạn thay đổi kiểu dữ liệu của một biến chỉ bằng cách gán + +100 +00:06:34,820 --> 00:06:36,980 +nó cho một kiểu giá trị khác. + +101 +00:06:37,970 --> 00:06:43,040 +Có một câu trả lời Stack Overflow thực sự rất hay giải quyết vấn đề chính + +102 +00:06:43,040 --> 00:06:47,870 +xác mà tôi đang nói đến, nói về thực tế rằng Python là một ngôn + +103 +00:06:47,870 --> 00:06:52,220 +ngữ được gõ động mạnh mẽ. Và tôi khuyên bạn nếu bạn muốn tìm hiểu sâu hơn + +104 +00:06:52,370 --> 00:06:56,870 +về vấn đề này, hãy đọc câu trả lời này và tôi sẽ liên kết đến câu trả lời này trong tài nguyên khóa học. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Python-as-a-Strongly-and-Dynamically-Typed-Programming-Language.url b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Python-as-a-Strongly-and-Dynamically-Typed-Programming-Language.url new file mode 100644 index 0000000000000000000000000000000000000000..3fb5788501a6214b9edf9edeec28bce5ee5ef983 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/005 Python-as-a-Strongly-and-Dynamically-Typed-Programming-Language.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://stackoverflow.com/questions/11328920/is-python-strongly-typed \ No newline at end of file diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/006 Setting Different Timer Sessions and Values.mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/006 Setting Different Timer Sessions and Values.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..28686fe85ed58a4a7c451ecd9b4a15c36e761481 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/006 Setting Different Timer Sessions and Values.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d9f1f8c06b74279f4666cf1f05edc55b42142134d6df4e08d421f11054535bc +size 47820860 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/006 Setting Different Timer Sessions and Values_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/006 Setting Different Timer Sessions and Values_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c7808206ee69db40debed9f14a4301a9eb5497aa --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/006 Setting Different Timer Sessions and Values_vi.srt @@ -0,0 +1,460 @@ +1 +00:00:00,240 --> 00:00:02,820 +Bây giờ chúng ta gần như ở đó. Khi chúng tôi nhấn bắt + +2 +00:00:02,880 --> 00:00:07,880 +đầu, bộ đếm ngược của chúng tôi hoạt động và nó bắt đầu đếm ngược từ số phút mà + +3 +00:00:08,550 --> 00:00:11,130 +chúng tôi yêu cầu. Đây là một thách thức dành cho bạn. + +4 +00:00:11,700 --> 00:00:16,700 +Chúng tôi biết rằng kỹ thuật Pomodoro yêu cầu chúng tôi làm việc trong 25 phút và sau đó + +5 +00:00:18,180 --> 00:00:21,300 +nghỉ ngơi sau 25 phút, sau đó nó quay trở lại + +6 +00:00:21,780 --> 00:00:26,780 +25 và điều này lặp lại cho đến khi chúng tôi thực hiện xong bốn hiệp 25 phút, + +7 +00:00:27,690 --> 00:00:30,390 +và sau đó chúng tôi nhận được nghỉ dài. + +8 +00:00:31,050 --> 00:00:36,050 +Vì vậy, tôi muốn bạn suy nghĩ về cách bạn có thể tạo một biến được gọi là đại diện, + +9 +00:00:36,570 --> 00:00:41,010 +biến này sẽ là một biến toàn cục và bạn có thể truy cập nó bên trong start_timer + +10 +00:00:41,040 --> 00:00:46,040 +bằng cách nhấn vào đại diện toàn cầu này. Bây giờ bằng cách sử dụng mô-đun hoặc một + +11 +00:00:48,180 --> 00:00:52,890 +số loại cơ chế khác mà bạn có thể nghĩ đến để xem liệu bạn có thể tìm + +12 +00:00:52,890 --> 00:00:57,840 +ra cách để đồng hồ đếm ngược của chúng tôi đếm ngược một số phút khác nhau hay không. + +13 +00:00:58,440 --> 00:01:02,820 +Ví dụ: chúng ta sẽ bắt đầu với work_seconds sẽ + +14 +00:01:03,120 --> 00:01:07,410 +là công việc tính theo phút nhân 60, và sau + +15 +00:01:08,310 --> 00:01:11,910 +đó chúng ta có short_break_sec và giây + +16 +00:01:14,040 --> 00:01:16,620 +nghỉ dài của chúng ta. + +17 +00:01:19,530 --> 00:01:22,530 +Bây giờ, làm thế nào chúng ta có thể gọi + +18 +00:01:22,530 --> 00:01:27,530 +đây là đồng hồ đếm ngược để nếu đó là lần đại diện thứ ba, thứ năm, thứ + +19 +00:01:30,180 --> 00:01:31,013 +bảy, mà + +20 +00:01:31,830 --> 00:01:35,550 +chúng tôi thực sự thực hiện đếm ngược của mình, thì chúng tôi + +21 +00:01:35,910 --> 00:01:40,710 +muốn bộ đếm ngược này thực hiện 25 phút của chúng tôi tính theo giây làm việc. + +22 +00:01:41,400 --> 00:01:44,550 +Nhưng mặt khác, nếu đó là, ừm, lần + +23 +00:01:44,610 --> 00:01:47,460 +thứ tám, thì chúng tôi muốn + +24 +00:01:47,490 --> 00:01:52,260 +đếm ngược hoạt động trong những giây nghỉ dài của chúng tôi. + +25 +00:01:52,920 --> 00:01:57,920 +Nhưng nếu đó là rep thứ hai hoặc thứ tư hoặc thứ sáu thì nó sẽ được đếm ngược đến giây + +26 +00:02:03,720 --> 00:02:05,460 +nghỉ giải lao ngắn của chúng ta. + +27 +00:02:06,900 --> 00:02:11,520 +Về cơ bản những gì chúng tôi đang cố gắng đạt được là để đồng hồ đếm ngược + +28 +00:02:11,520 --> 00:02:14,580 +của chúng tôi thực hiện 25 phút, sau đó 5 phút, sau + +29 +00:02:15,030 --> 00:02:18,000 +đó 25, 5 và cho đến khi chúng tôi hoàn thành bốn + +30 +00:02:18,330 --> 00:02:21,120 +bộ 25, sau đó chúng tôi được nghỉ 20 phút. + +31 +00:02:21,570 --> 00:02:25,650 +Vì vậy, hãy suy nghĩ về những gì bạn đã làm trước khi sử dụng modulo và xem liệu bạn + +32 +00:02:25,650 --> 00:02:29,160 +có thể tìm ra cách để điều này hoạt động trong mã của bạn hay không. + +33 +00:02:29,790 --> 00:02:32,700 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +34 +00:02:35,220 --> 00:02:35,610 +Được rồi. + +35 +00:02:35,610 --> 00:02:40,610 +Vì vậy, những gì chúng tôi muốn làm là đầu tiên khi chúng tôi bắt đầu bộ đếm thời gian để tăng số đại diện. + +36 +00:02:41,790 --> 00:02:44,130 +Vì vậy, chúng tôi sẽ tăng nó lên một. + +37 +00:02:44,580 --> 00:02:49,580 +Vì vậy, bây giờ nó bắt đầu ở rep đầu tiên hoặc lặp lại đầu tiên. + +38 +00:02:50,610 --> 00:02:52,500 +Bây giờ trong lần lặp + +39 +00:02:52,590 --> 00:02:56,760 +lại đầu tiên này, nó sẽ cần phải chạy dòng mã cụ thể này. + +40 +00:02:57,420 --> 00:02:59,650 +Và sau đó khi lặp lại lần thứ hai, nó + +41 +00:02:59,650 --> 00:03:02,290 +cần chạy dòng mã này. Và cuối cùng, khi + +42 +00:03:02,290 --> 00:03:06,520 +đến lần lặp lại thứ tám thì nó cần chạy dòng mã này. + +43 +00:03:07,030 --> 00:03:11,410 +Vì vậy, chúng ta thực sự có thể sử dụng câu lệnh if để kiểm tra tất cả những điều này. + +44 +00:03:11,890 --> 00:03:16,890 +Vì vậy, ở đây chúng ta có thể kiểm tra xem liệu mô đun đại diện của 8 có bằng 0 hay không. + +45 +00:03:19,990 --> 00:03:23,170 +Nếu số đại diện chia cho 8 không có phần dư, thì + +46 +00:03:23,440 --> 00:03:27,130 +điều đó có nghĩa là đó thực sự là thời gian cho một kỳ nghỉ dài. + +47 +00:03:28,270 --> 00:03:29,740 +Bây giờ, Elif, nếu + +48 +00:03:29,740 --> 00:03:33,850 +không, nếu số đại diện thực sự là số chẵn, vì vậy nếu + +49 +00:03:33,880 --> 00:03:37,810 +modulo 2 bằng 0, thì trong trường hợp này, đó là thời + +50 +00:03:37,870 --> 00:03:40,720 +gian để nghỉ ngơi một thời gian ngắn. + +51 +00:03:42,910 --> 00:03:44,140 +Và cuối cùng, + +52 +00:03:44,200 --> 00:03:48,340 +nếu không có những điều kiện đó và chúng tôi có một tuyên + +53 +00:03:48,760 --> 00:03:52,450 +bố khác, thì đó chỉ là thời gian làm việc bình thường. + +54 +00:03:53,530 --> 00:03:55,840 +Bây giờ chúng tôi có thể nghĩ rằng đó là tất cả + +55 +00:03:55,960 --> 00:03:59,080 +những gì cần thiết, nhưng như thường lệ, chúng tôi phải kiểm tra nó để chắc chắn. + +56 +00:03:59,620 --> 00:04:04,620 +Vì vậy, hãy tiếp tục và thay đổi số phút làm việc của chúng tôi xuống còn một phút để chúng + +57 +00:04:04,960 --> 00:04:09,640 +tôi có thể chạy nó và có cơ hội hợp lý để biết khi nào nó thực sự đạt đến + +58 +00:04:09,670 --> 00:04:10,503 +con số không. + +59 +00:04:10,930 --> 00:04:14,740 +Khi bộ đếm bộ đếm thời gian của chúng tôi + +60 +00:04:15,130 --> 00:04:19,180 +giảm xuống 0, chúng tôi mong đợi bộ đếm thời gian nghỉ + +61 +00:04:19,540 --> 00:04:22,600 +năm phút, nhưng không. Nó thực sự chỉ dừng lại. + +62 +00:04:23,260 --> 00:04:28,260 +Và đây là lý do tại sao chúng ta cần kiểm tra mã của mình và kiểm tra các chương trình của chúng ta thường xuyên + +63 +00:04:29,170 --> 00:04:33,400 +khi chúng ta viết mã để chúng ta có thể bắt được những lỗi này về mặt logic của chúng ta. + +64 +00:04:33,970 --> 00:04:35,890 +Vậy điều gì đang xảy ra ở đây? Về cơ + +65 +00:04:35,920 --> 00:04:39,880 +bản, nó đang đếm ngược đến số giây mà chúng + +66 +00:04:39,880 --> 00:04:42,820 +tôi đã yêu cầu nó đếm ngược. + +67 +00:04:43,330 --> 00:04:47,080 +Và sau đó một khi nó được thực hiện, tốt, đó là loại kết thúc. + +68 +00:04:47,200 --> 00:04:52,200 +Không có cách nào khác để kích hoạt bộ hẹn giờ bắt đầu trừ khi chúng ta nhấn nút. + +69 +00:04:53,140 --> 00:04:58,140 +Vì vậy, những gì chúng ta thực sự cần làm là thêm một câu lệnh khác ở đây và bắt + +70 +00:05:01,270 --> 00:05:02,770 +khi số đếm về 0, bởi + +71 +00:05:03,190 --> 00:05:07,540 +vì chính trong thời điểm đó chúng ta muốn thực sự gọi lại bộ đếm thời gian + +72 +00:05:07,780 --> 00:05:08,613 +bắt đầu. + +73 +00:05:09,130 --> 00:05:13,600 +Và lần này nó sẽ tăng số lần lặp lại và tìm ra bộ đếm ngược mà chúng ta thực + +74 +00:05:13,600 --> 00:05:14,740 +sự cần thực hiện. + +75 +00:05:15,430 --> 00:05:19,000 +Vì vậy, nếu chúng tôi chạy lại mã này và tôi tua nhanh qua bộ đếm + +76 +00:05:19,450 --> 00:05:22,360 +thời gian, bạn có thể thấy rằng bây giờ, khi nó chạm + +77 +00:05:23,260 --> 00:05:27,760 +0, nó sẽ chuyển thẳng đến thời gian nghỉ năm phút của chúng tôi và nó tiếp tục hẹn giờ. + +78 +00:05:28,660 --> 00:05:31,870 +Bây giờ, với tư cách là người dùng, thật khó để biết + +79 +00:05:31,870 --> 00:05:36,870 +liệu tôi đang ở trong phần làm việc hay tôi đang ở trong phần nghỉ và điều gì đang thực + +80 +00:05:37,180 --> 00:05:38,013 +sự diễn ra. + +81 +00:05:38,260 --> 00:05:42,910 +Vì vậy, chúng ta nên cải thiện trải nghiệm người dùng bằng cách thay đổi tiêu đề này + +82 +00:05:42,940 --> 00:05:46,300 +từ nói hẹn giờ thành bất cứ điều gì người dùng nên làm. + +83 +00:05:46,900 --> 00:05:51,880 +Vì vậy, nếu họ đang ở trong phần đếm ngược của khoảng nghỉ dài này thì nó sẽ nói là nghỉ, nếu họ + +84 +00:05:51,910 --> 00:05:55,360 +ở trong phần ngắt ngắn, thì nó sẽ nói là nghỉ và nếu họ đang + +85 +00:05:55,420 --> 00:05:58,250 +ở trong phần làm việc thì nó sẽ nói là công việc. + +86 +00:05:58,760 --> 00:06:02,450 +Vì vậy, nhãn mà chúng ta cần thay đổi là nhãn tiêu đề này. + +87 +00:06:02,960 --> 00:06:07,040 +Và tôi cũng muốn thay đổi màu sắc, màu nền trước, để khi nó hoạt động, + +88 +00:06:07,400 --> 00:06:12,170 +nó có màu xanh lá cây, khi nó ngắt quãng ngắn thì nó màu hồng, khi nó kéo dài + +89 +00:06:12,500 --> 00:06:14,930 +nó là màu đỏ. Vì vậy, tất nhiên, tôi + +90 +00:06:14,930 --> 00:06:17,330 +đang đề cập đến những hằng số này ở đây. + +91 +00:06:18,050 --> 00:06:22,580 +Xem liệu bạn có thể hoàn thành việc này như một thử thách và yêu cầu thay đổi nhãn đó + +92 +00:06:22,640 --> 00:06:25,730 +để hiển thị cho người dùng biết họ nên làm gì mỗi lần. + +93 +00:06:26,390 --> 00:06:31,280 +Tạm dừng video và hoàn thành thử thách này. Được chứ. + +94 +00:06:31,310 --> 00:06:33,110 +Vì vậy, khi họ nghỉ dài, chúng + +95 +00:06:33,140 --> 00:06:38,140 +ta sẽ lấy nhãn tiêu đề của mình để định cấu hình nó và thay đổi văn bản để + +96 +00:06:41,120 --> 00:06:41,953 +nói nghỉ. + +97 +00:06:42,590 --> 00:06:46,940 +Và chúng ta cũng sẽ định cấu hình màu nền trước cùng một lúc và + +98 +00:06:47,300 --> 00:06:48,650 +chúng ta sẽ làm + +99 +00:06:48,680 --> 00:06:52,670 +cho màu này là màu đỏ. Bây giờ cho phần tiếp + +100 +00:06:52,670 --> 00:06:57,320 +theo, là khoảng ngắt ngắn, nó cũng sẽ đọc ngắt, nhưng trong trường hợp này, + +101 +00:06:57,380 --> 00:07:02,000 +màu nền trước sẽ là màu hồng. Và cuối cùng, khi chúng sẽ hoạt + +102 +00:07:02,330 --> 00:07:03,680 +động, màu nền + +103 +00:07:03,740 --> 00:07:08,720 +trước sẽ là màu xanh lá cây và nhãn sẽ đọc được tác phẩm. + +104 +00:07:09,350 --> 00:07:14,210 +Vì vậy, bây giờ khi nó đang trong một phiên làm việc, nó sẽ nói làm việc. + +105 +00:07:14,630 --> 00:07:17,030 +Và khi nó chuyển sang thời gian nghỉ, + +106 +00:07:18,170 --> 00:07:22,340 +thì nó sẽ nói là nghỉ. Và bởi vì đây là màu hồng, tất nhiên, + +107 +00:07:22,370 --> 00:07:26,000 +đây là khoảng thời gian ngắn mà chúng ta cũng có thể thấy rằng chúng ta + +108 +00:07:26,000 --> 00:07:29,180 +có năm phút và đang đếm. Và khi đến kỳ nghỉ + +109 +00:07:29,300 --> 00:07:31,010 +dài sau bốn phiên làm việc, + +110 +00:07:31,040 --> 00:07:35,720 +khi đó văn bản sẽ có màu đỏ và đồng hồ đếm ngược sẽ hiển thị 20 phút. + +111 +00:07:36,980 --> 00:07:40,880 +Chúng tôi gần như ở đó. Chỉ có một vài đầu lỏng lẻo để buộc lại. + +112 +00:07:41,240 --> 00:07:46,240 +Một là thay đổi phần này để chúng tôi thực sự nhận được dấu kiểm cho mỗi phiên làm việc thành + +113 +00:07:47,150 --> 00:07:52,150 +công mà chúng tôi hoàn thành và cũng để đảm bảo rằng nút đặt lại của chúng tôi hoạt động để + +114 +00:07:52,460 --> 00:07:56,690 +khi chúng tôi nhấp vào nó, bộ đếm thời gian dừng lại và trở về 0. + +115 +00:07:57,470 --> 00:08:00,470 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Adding Checkmarks and Resetting the Application.mp4 b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Adding Checkmarks and Resetting the Application.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4140c58ac3192d0dcde51af2cadb32a2f6676d80 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Adding Checkmarks and Resetting the Application.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e0917310ab30428a43f32735af3fe3697282f5d5de05c27d513466ea995e2c6 +size 84116820 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Adding Checkmarks and Resetting the Application_vi.srt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Adding Checkmarks and Resetting the Application_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0797a8588dfa0dafb19dad92313663de69ad3bd2 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Adding Checkmarks and Resetting the Application_vi.srt @@ -0,0 +1,568 @@ +1 +00:00:00,240 --> 00:00:05,220 +Bây giờ chúng ta đang ở đoạn cuối cùng. Chương trình Pomodoro của chúng tôi gần như đã hoàn thành. + +2 +00:00:05,520 --> 00:00:07,740 +Chúng tôi có giao diện người dùng đẹp mắt này, chúng tôi có + +3 +00:00:07,770 --> 00:00:11,520 +những màu sắc đẹp đẽ từ colorhunt của chúng tôi. io bảng màu, và chúng tôi + +4 +00:00:11,970 --> 00:00:15,600 +có khá nhiều thứ hoạt động ngoài một số kết thúc + +5 +00:00:15,600 --> 00:00:16,433 +lỏng lẻo. + +6 +00:00:16,560 --> 00:00:21,000 +Vì vậy, điều đầu tiên tôi muốn sửa là phần có dấu kiểm. Vì vậy, chúng tôi đã + +7 +00:00:21,000 --> 00:00:22,890 +tạo các dấu kiểm, + +8 +00:00:22,920 --> 00:00:27,570 +là một nhãn hiện chỉ chứa một dấu kiểm duy nhất. + +9 +00:00:28,080 --> 00:00:33,080 +Bây giờ tôi thực sự sẽ cắt dấu kiểm này và xóa văn bản ở đây vì tôi + +10 +00:00:33,510 --> 00:00:37,140 +muốn nhãn đó bắt đầu trống. Bây giờ, thời điểm + +11 +00:00:37,170 --> 00:00:40,860 +duy nhất khi tôi muốn nhãn đó có thêm một + +12 +00:00:40,860 --> 00:00:45,860 +dấu kiểm là khi người dùng đã hoàn thành việc đếm ngược công việc. + +13 +00:00:47,070 --> 00:00:49,980 +Vì vậy, khi họ đã hoàn thành phiên làm việc 25 phút của mình, + +14 +00:00:50,190 --> 00:00:53,850 +thì họ sẽ nhận được dấu kiểm đó. Để làm điều đó, tôi + +15 +00:00:53,880 --> 00:00:58,880 +sẽ viết mã bên trong câu lệnh else này bởi vì mỗi lần đếm ngược + +16 +00:00:59,520 --> 00:01:00,990 +hoàn thành, nó sẽ + +17 +00:01:01,230 --> 00:01:05,610 +chuyển sang câu lệnh else này vì số đếm giảm xuống 0. + +18 +00:01:06,240 --> 00:01:10,710 +Bây giờ, hiện tại chúng tôi chỉ nhận được bộ đếm thời gian để tự khởi động lại và chuyển sang + +19 +00:01:10,740 --> 00:01:11,573 +phiên tiếp theo. + +20 +00:01:11,910 --> 00:01:16,910 +Nhưng những gì chúng tôi muốn làm ở đây là chúng tôi muốn kiểm tra xem chúng tôi có bao nhiêu đại diện, + +21 +00:01:18,450 --> 00:01:20,280 +và cứ hai đại diện thì điều đó + +22 +00:01:20,340 --> 00:01:25,340 +có nghĩa là chúng tôi đã hoàn thành một phiên làm việc bởi vì đó là công việc sau đó nghỉ ngơi, sau + +23 +00:01:26,400 --> 00:01:29,820 +đó làm việc, sau đó nghỉ ngơi. Vì vậy, cứ hai đại diện, + +24 +00:01:29,850 --> 00:01:32,790 +chúng tôi đã hoàn thành một phiên làm việc 25 phút. + +25 +00:01:33,630 --> 00:01:35,130 +Vì vậy, đây là một thách thức cho bạn. + +26 +00:01:35,610 --> 00:01:40,610 +Vì vậy, hãy suy nghĩ về cách bạn có thể sử dụng các đại diện thay đổi của chúng + +27 +00:01:41,520 --> 00:01:44,040 +tôi để kiểm tra sao cho cứ hai đại + +28 +00:01:44,340 --> 00:01:48,930 +diện chúng tôi đã hoàn thành, chúng tôi thêm một dấu kiểm vào nhãn dấu kiểm này. + +29 +00:01:49,830 --> 00:01:52,710 +Hãy tạm dừng video và xem liệu bạn có thể hoàn thành thử thách này hay không, sau + +30 +00:01:52,830 --> 00:01:55,320 +đó kiểm tra thử và xem liệu bạn có thực hiện đúng hay không. + +31 +00:01:55,880 --> 00:01:56,713 +1: Được rồi. + +32 +00:01:59,450 --> 00:01:59,810 +0: Được rồi. + +33 +00:01:59,810 --> 00:02:04,610 +Vì vậy, chúng tôi biết rằng số đại diện bằng với số phiên chúng tôi đã có. + +34 +00:02:04,940 --> 00:02:07,130 +Vì vậy, ví dụ, nếu chúng tôi đã thực hiện cho các đại + +35 +00:02:07,160 --> 00:02:10,490 +diện, thì điều đó có nghĩa là chúng tôi đã có hai phiên làm việc và hai lần nghỉ giải lao. + +36 +00:02:11,030 --> 00:02:16,030 +Điều đó có nghĩa là về cơ bản chúng ta có thể chia số đại diện cho hai để có tổng số buổi làm việc mà chúng + +37 +00:02:16,280 --> 00:02:17,210 +tôi đã thực hiện. + +38 +00:02:17,930 --> 00:02:22,930 +Những gì tôi có thể làm là tôi có thể tạo một biến tạm thời được gọi là + +39 +00:02:23,450 --> 00:02:26,840 +mark, biến này sẽ ở trong một chuỗi trống để bắt đầu. + +40 +00:02:27,800 --> 00:02:31,490 +Và sau đó tôi có thể tạo một vòng lặp for để lặp qua một phạm vi. + +41 +00:02:32,000 --> 00:02:36,950 +Và phạm vi sẽ đi từ 0 đến số đại diện của chúng tôi chia cho 2. + +42 +00:02:37,880 --> 00:02:42,880 +Hiện tại, điều này đang đưa ra cảnh báo cho chúng ta vì số đại diện chia cho 2 hoặc + +43 +00:02:42,920 --> 00:02:47,570 +bất cứ thứ gì chia cho bất kỳ thứ gì đều trở thành số kiểu thả nổi. + +44 +00:02:48,140 --> 00:02:53,140 +Trong trường hợp của chúng tôi, chúng tôi muốn làm là chúng tôi muốn sử dụng phép toán đó. tầng một lần nữa để chúng tôi có + +45 +00:02:53,420 --> 00:02:58,370 +thể xếp tầng số đại diện này chia cho 2 đến một số nguyên và bằng cách + +46 +00:02:58,930 --> 00:03:02,230 +đó chúng tôi có được số phiên làm việc chính xác. + +47 +00:03:02,950 --> 00:03:05,500 +Nếu bạn muốn làm cho điều này rõ ràng hơn một + +48 +00:03:05,680 --> 00:03:07,660 +chút vào lần tiếp theo khi bạn đọc + +49 +00:03:07,720 --> 00:03:12,720 +mã của mình, bạn thực sự có thể tạo một work_sessions và chúng tôi có thể chuyển phần này của mã của + +50 +00:03:14,470 --> 00:03:15,303 +mình sang đây. + +51 +00:03:15,850 --> 00:03:20,740 +Vì vậy, tổng số buổi làm việc bằng số đại diện chia cho 2 và sau đó + +52 +00:03:20,740 --> 00:03:23,050 +làm tròn xuống số nguyên gần nhất. + +53 +00:03:23,590 --> 00:03:27,010 +Và sau đó, chúng tôi có thể sử dụng số lượng phiên làm việc đó để tạo phạm vi của chúng tôi. + +54 +00:03:27,850 --> 00:03:29,260 +Khi chúng tôi đã tạo + +55 +00:03:29,290 --> 00:03:33,010 +phạm vi của mình, chúng tôi biết rằng vòng lặp này sẽ chạy trong nhiều lần. + +56 +00:03:33,370 --> 00:03:38,370 +Vì vậy, chúng tôi có thể thêm vào nhãn hiệu của chúng tôi. Đối với mỗi lần vòng lặp + +57 +00:03:38,890 --> 00:03:41,680 +chạy, tôi sẽ dán vào một dấu kiểm. + +58 +00:03:42,220 --> 00:03:45,580 +Bạn sẽ có dấu kiểm mà bạn đã có từ trước đó và bạn + +59 +00:03:45,790 --> 00:03:49,150 +có thể dán nó vào đây. Bây giờ, khi chúng ta đã + +60 +00:03:49,150 --> 00:03:54,100 +hoàn thành vòng lặp đó, thì tất cả những gì chúng ta cần làm là cập nhật nhãn + +61 +00:03:54,160 --> 00:03:59,160 +dấu kiểm của mình bằng cách gọi cấu hình và sau đó thay đổi văn bản cho bằng dấu + +62 +00:04:00,580 --> 00:04:02,710 +của chúng ta. Bây giờ, trong trường + +63 +00:04:02,710 --> 00:04:05,740 +hợp này, nó có lẽ hợp lý khi nó thực sự là số nhiều. + +64 +00:04:06,040 --> 00:04:08,350 +Vì vậy, tôi sẽ sử dụng refactor của mình + +65 +00:04:08,440 --> 00:04:12,130 +-> đổi tên để chỉ thêm 's' vào mọi nơi tôi đang sử dụng cái này. + +66 +00:04:13,540 --> 00:04:17,709 +Bây giờ chúng ta hãy kiểm tra nó ra. Khi tôi nhấn start, + +67 +00:04:17,769 --> 00:04:22,660 +nó sẽ bắt đầu đếm ngược. Và khi phiên làm việc đó hoàn thành, bạn + +68 +00:04:22,990 --> 00:04:27,580 +sẽ thấy bộ đếm thời gian về 0 và dấu kiểm đầu tiên của chúng tôi hiển thị. + +69 +00:04:28,510 --> 00:04:32,800 +Và đối với mỗi phiên làm việc mà chúng tôi hoàn thành, chúng tôi nhận được thêm một dấu + +70 +00:04:33,010 --> 00:04:36,220 +kiểm chỉ để thúc đẩy chúng tôi làm việc chăm chỉ hơn một chút. + +71 +00:04:37,390 --> 00:04:42,370 +Điều cuối cùng mà tôi muốn giải quyết là cơ chế đặt lại của chúng tôi. + +72 +00:04:42,910 --> 00:04:45,220 +Vì vậy, chúng tôi có nút đặt lại đáng yêu này, nhưng + +73 +00:04:45,250 --> 00:04:47,410 +nó không thực sự có tác dụng gì vào lúc này. + +74 +00:04:48,070 --> 00:04:51,640 +Những gì tôi sẽ làm là tạo một hàm mới ở đây + +75 +00:04:51,670 --> 00:04:53,860 +mà tôi sẽ gọi là reset_timer. + +76 +00:04:54,760 --> 00:04:59,760 +Và những gì reset_timer này sẽ làm về cơ bản là nó sẽ đặt lại tất cả các + +77 +00:04:59,770 --> 00:05:04,330 +dấu kiểm, đặt lại văn bản bên trong bộ hẹn giờ, dừng bộ đếm thời + +78 +00:05:04,600 --> 00:05:09,600 +gian và thay đổi tiêu đề này trở lại văn bản mà nó có ban đầu, đó + +79 +00:05:10,630 --> 00:05:14,350 +chỉ là bộ đếm thời gian. Bây giờ, phần khó nhất về + +80 +00:05:14,470 --> 00:05:19,450 +việc này thực sự là dừng bộ đếm thời gian vì những gì chúng ta phải làm là chúng ta + +81 +00:05:19,450 --> 00:05:23,740 +thực sự cần phải nhấn vào cửa sổ đó. sau một lần nữa. + +82 +00:05:24,280 --> 00:05:26,080 +Nhưng thay vì gọi after, + +83 +00:05:26,140 --> 00:05:30,130 +chúng tôi thực sự muốn gọi after_cancel. Bằng cách này, chúng tôi thực + +84 +00:05:30,160 --> 00:05:34,510 +sự có thể hủy bộ hẹn giờ mà chúng tôi đã thiết lập trước đó. + +85 +00:05:35,920 --> 00:05:40,750 +Đây là điều mà chúng tôi muốn hủy bỏ. Và nếu chúng ta muốn hủy nó, chúng ta phải + +86 +00:05:40,870 --> 00:05:44,140 +đặt tên cho nó và chúng ta phải đặt nó bên trong một biến. + +87 +00:05:44,920 --> 00:05:46,990 +Vì vậy, tôi sẽ gọi đây là bộ đếm thời gian của tôi. + +88 +00:05:47,620 --> 00:05:52,620 +Nhưng vì đây sẽ là một biến cục bộ vì nó được tạo bên trong hàm cụ + +89 +00:05:52,990 --> 00:05:56,500 +thể này, nên tôi thực sự phải đưa nó ra ngoài. + +90 +00:05:56,530 --> 00:06:01,370 +Tôi phải biến nó thành một biến toàn cục, vì vậy sau khi tạo nó ở đây, nhưng giá trị + +91 +00:06:01,730 --> 00:06:04,910 +nào tôi cung cấp cho nó? Vâng, ban đầu, nó thực + +92 +00:06:04,970 --> 00:06:07,280 +sự sẽ không có bất kỳ giá trị nào. + +93 +00:06:07,550 --> 00:06:11,480 +Vì vậy, nó sẽ bắt đầu như không có. Và sau đó, tôi sẽ + +94 +00:06:11,540 --> 00:06:16,540 +khai thác vào bộ đếm thời gian chung đó để giúp nó tiếp tục điều này. + +95 +00:06:19,220 --> 00:06:23,840 +Bây giờ, sau đó khi tôi muốn đặt lại bộ hẹn giờ của mình và hủy + +96 +00:06:23,840 --> 00:06:28,840 +nó, thì tôi thực sự có thể nhấn vào bộ hẹn giờ chung này và dừng bộ hẹn giờ. + +97 +00:06:29,900 --> 00:06:34,340 +Vì vậy, bây giờ để thực sự kích hoạt chức năng này, reset_timer, chúng ta phải + +98 +00:06:34,700 --> 00:06:38,360 +thêm nó dưới dạng lệnh vào nút đặt lại của chúng ta. + +99 +00:06:38,900 --> 00:06:42,230 +Vì vậy, nơi chúng tôi tạo nút của mình, tôi sẽ thêm nó dưới dạng lệnh. + +100 +00:06:42,680 --> 00:06:45,080 +Và hãy nhớ rằng, chúng ta phải bỏ dấu ngoặc đơn. + +101 +00:06:45,680 --> 00:06:49,490 +Vì vậy, bây giờ nếu tôi chạy chương trình của mình và tôi khởi động bộ hẹn + +102 +00:06:49,820 --> 00:06:53,240 +giờ, bạn có thể thấy rằng ngay sau khi tôi nhấp vào nút đặt + +103 +00:06:53,570 --> 00:06:57,230 +lại này, bộ hẹn giờ của tôi sẽ dừng và bộ hẹn giờ không tiếp tục. + +104 +00:06:57,950 --> 00:07:00,590 +Vì vậy, bây giờ tất cả những gì chúng ta + +105 +00:07:00,590 --> 00:07:05,180 +phải làm là thêm tất cả những thứ mà chúng ta phải đặt lại, chẳng hạn như văn + +106 +00:07:05,420 --> 00:07:07,850 +bản ở đây, chúng ta muốn nó đọc 00. + +107 +00:07:09,140 --> 00:07:11,390 +Vì vậy, đó là timer_text từ canvas của chúng tôi. + +108 +00:07:11,780 --> 00:07:15,170 +Và sau đó điều khác chúng tôi muốn làm là nhãn tiêu đề. + +109 +00:07:15,350 --> 00:07:18,350 +Chúng tôi muốn đặt điều đó thành bộ đếm thời gian chỉ đọc. + +110 +00:07:20,270 --> 00:07:21,320 +Và cuối cùng, + +111 +00:07:21,380 --> 00:07:26,380 +chúng tôi muốn đặt lại các dấu kiểm của mình để khi bạn nhấn vào nút đặt lại, + +112 +00:07:26,810 --> 00:07:28,850 +nó sẽ đặt lại nhãn tiêu đề này, + +113 +00:07:29,120 --> 00:07:34,120 +văn bản bộ hẹn giờ ở đây sẽ dừng bộ đếm thời gian và loại bỏ tất cả + +114 +00:07:35,360 --> 00:07:39,080 +các dấu kiểm, như thế này. Tạm dừng video và tiếp tục. + +115 +00:07:42,290 --> 00:07:45,860 +Được rồi. Vì vậy, điều đầu tiên chúng tôi muốn thay đổi là văn bản hẹn giờ của chúng tôi. + +116 +00:07:46,250 --> 00:07:48,860 +Và bởi vì văn bản hẹn giờ được tạo trong canvas, chúng tôi + +117 +00:07:48,890 --> 00:07:50,990 +có một cách hơi khác để thay đổi điều đó. + +118 +00:07:51,440 --> 00:07:53,900 +Vì vậy, chúng tôi gọi là canvas. itemconfig, và sau đó chuyển + +119 +00:07:54,200 --> 00:07:57,830 +vào thứ mà chúng ta muốn thay đổi, đó là văn bản bộ đếm thời gian. + +120 +00:07:58,220 --> 00:08:02,000 +Và sau đó là thuộc tính mà chúng tôi muốn thay đổi, đó là văn bản. + +121 +00:08:02,390 --> 00:08:06,590 +Và sau đó chúng tôi thay đổi điều đó thành chỉ nói + +122 +00:08:07,100 --> 00:08:11,300 +00:00, quay lại từ đầu. Giờ đây, nhãn tiêu đề dễ thay đổi hơn rất nhiều. + +123 +00:08:11,360 --> 00:08:13,700 +Có thể nói title_label. cấu hình, và sau đó + +124 +00:08:14,030 --> 00:08:18,140 +chúng ta có thể cấu hình văn bản của nó về cơ bản chỉ đọc bộ đếm thời gian. + +125 +00:08:18,860 --> 00:08:21,350 +Cuối cùng, chúng tôi sẽ đặt lại các dấu kiểm của mình. + +126 +00:08:21,410 --> 00:08:24,560 +Vì vậy, chúng tôi nhấn vào nhãn dấu kiểm của chúng + +127 +00:08:24,560 --> 00:08:28,880 +tôi một lần nữa, sử dụng cấu hình để thay đổi văn bản trở lại trống. + +128 +00:08:30,500 --> 00:08:33,140 +Tuy nhiên, vẫn có một vấn đề nhỏ với mã của chúng tôi. + +129 +00:08:33,440 --> 00:08:36,010 +Điều gì sẽ xảy ra nếu trong khi bộ đếm thời gian của chúng + +130 +00:08:36,020 --> 00:08:39,320 +ta đang đếm ngược, tôi nhấn vào nút đặt lại và sau đó nhấn lại vào nút bắt đầu? + +131 +00:08:40,580 --> 00:08:46,790 +Bạn có phát hiện ra điều đó không? Bộ đếm thời gian của chúng tôi đã chuyển từ "Làm việc" thành "Giải lao" vì số lần thực hiện của chúng tôi vẫn đang tăng. + +132 +00:08:47,690 --> 00:08:51,710 +Cho đến nay, chúng tôi vẫn chưa đặt lại số đại diện về 0 khi chúng tôi đặt lại bộ đếm thời gian. + +133 +00:08:51,830 --> 00:08:56,120 +Vì vậy, tất cả những gì chúng ta cần làm để sửa lỗi này là thêm: global + +134 +00:08:56,390 --> 00:08:59,450 +reps reps = 0 vào chức năng đặt lại thời gian. + +135 +00:09:00,500 --> 00:09:09,380 +Thats tất cả để có nó! Bây giờ, nếu chúng tôi đặt lại WORK_MIN của mình thành 25, SHORT_BREAK + +136 +00:09:09,380 --> 00:09:16,520 +5, LONG_BREAK 20 hoặc bất kỳ điều gì bạn muốn. Sau đó, khi chúng ta nhấn run, chúng ta sẽ kết thúc với bộ đếm thời gian Pomodoro cuối cùng của mình. + +137 +00:09:16,970 --> 00:09:24,200 +Và bây giờ nó sẽ sẵn sàng để bạn bắt đầu thực hành làm Pomodoros và cải thiện công việc cũng như năng suất + +138 +00:09:24,200 --> 00:09:25,030 +của bạn. + +139 +00:09:25,700 --> 00:09:32,780 +Vì vậy, tôi hy vọng bạn thích làm ứng dụng tkinter đầy đủ chức năng này với tôi và tôi hy vọng + +140 +00:09:32,780 --> 00:09:39,710 +bạn sẽ sửa đổi điều này, tùy chỉnh nó, làm cho nó thực sự là của riêng bạn và có thể + +141 +00:09:39,710 --> 00:09:46,130 +cho chúng tôi thấy những gì bạn đã làm. Bởi vì đây thực sự là một ứng dụng hữu ích mà bạn có thể sử dụng hoặc bạn có + +142 +00:09:46,130 --> 00:09:49,430 +thể mời bạn bè và gia đình của bạn bắt đầu sử dụng và thể hiện sự chăm chỉ của bạn. + diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Course-Fixes-Report-an-Issue.url b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Solution-pomodoro-end.zip b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Solution-pomodoro-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..11e25e0ff2d29b0bdeb3c8b9bd68bca3b8882cb8 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/007 Solution-pomodoro-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3813d60fe118bbdb4a272b352a39f14d59100e2029e8f58f993ae3b0716f1fc +size 13578 diff --git a/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/external-links.txt b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..1700307d0e7878f4a20b073725f7e24704fda798 --- /dev/null +++ b/part2/28 - Day 28 - Intermediate - Tkinter, Dynamic Typing and the Pomodoro GUI Application/external-links.txt @@ -0,0 +1,12 @@ + +002 Use-Color-Hunt-to-Choose-a-Nice-Colour +https://colorhunt.co/ + +004 TCL-tk-Docs-after- +http://tcl.tk/man/tcl8.6/TclCmd/after.htm + +005 Python-as-a-Strongly-and-Dynamically-Typed-Programming-Language +https://stackoverflow.com/questions/11328920/is-python-strongly-typed + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/001 Day 29 Goals what we will make by the end of the day.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/001 Day 29 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2f154e994a527a4401f8528c24686368f78fe7bd --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/001 Day 29 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f7cd6136b9d658f9575b35bf6ecd0eb9803002da866e3016ceea2febd0f9172 +size 31378207 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/001 Day 29 Goals what we will make by the end of the day_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/001 Day 29 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..43556565166034c3297e04e3fc76eadcc298d07e --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/001 Day 29 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,220 @@ +1 +00:00:00,480 --> 00:00:05,460 +Xin chào các bạn, chào mừng bạn đến với 100 Ngày viết mã. Và hôm nay chúng ta đang ở ngày 29, + +2 +00:00:05,760 --> 00:00:08,760 +nơi chúng ta sẽ xây dựng một trình quản lý mật khẩu. + +3 +00:00:09,270 --> 00:00:11,610 +Vì vậy, chúng tôi sẽ làm điều này bằng cách sử dụng tkinter. + +4 +00:00:11,880 --> 00:00:16,880 +Và nguồn cảm hứng thực sự cho dự án này xuất hiện bởi vì tôi đang cố + +5 +00:00:16,880 --> 00:00:21,880 +gắng đăng ký một trang web mà nó yêu cầu một mật khẩu cực kỳ phức tạp, + +6 +00:00:22,460 --> 00:00:27,020 +một cái gì đó dọc theo những dòng này, hoặc nó phải thực sự dài. + +7 +00:00:27,020 --> 00:00:29,510 +Nó phải bao gồm rất nhiều thứ khác nhau, nó không thể + +8 +00:00:29,840 --> 00:00:34,130 +khớp với các mật khẩu trước đây của bạn. Nó chỉ có một loạt các quy tắc và + +9 +00:00:34,610 --> 00:00:39,610 +tôi thực sự gặp khó khăn trong việc tìm ra một mật khẩu thực sự phù hợp với tất cả các + +10 +00:00:39,680 --> 00:00:42,110 +yêu cầu của họ. Và vào thời điểm tôi nghĩ + +11 +00:00:42,410 --> 00:00:44,420 +ra nó, tôi đã quên mất mật khẩu là gì. + +12 +00:00:45,080 --> 00:00:49,070 +Một trong những blog yêu thích của tôi là Coding Horror của một người tên là Jeff Atwood. + +13 +00:00:49,250 --> 00:00:52,100 +Và bạn có thể không biết tên anh ta, nhưng bạn + +14 +00:00:52,130 --> 00:00:55,520 +thực sự sẽ sử dụng một cái gì đó mà anh ta làm ra. + +15 +00:00:55,730 --> 00:00:58,130 +Anh ấy là một trong những người sáng lập và + +16 +00:00:58,130 --> 00:01:00,350 +cũng là người sáng tạo ban đầu của Stack + +17 +00:01:00,380 --> 00:01:03,230 +Overflow mà tôi chắc rằng đến giờ bạn cũng đã quen thuộc. + +18 +00:01:03,650 --> 00:01:08,650 +Và thậm chí anh ấy còn nói về cách quy tắc mật khẩu thực sự khủng khiếp. + +19 +00:01:09,290 --> 00:01:13,730 +Chúng quá dài và quá phức tạp và chúng thậm chí đã truyền cảm hứng cho một bộ truyện + +20 +00:01:13,760 --> 00:01:16,400 +tranh XKCD thực sự hay, về cơ bản nói lên + +21 +00:01:16,820 --> 00:01:20,270 +sự thật rằng qua 20 năm nỗ lực, chúng tôi đã huấn luyện thành công + +22 +00:01:20,270 --> 00:01:23,570 +mọi người sử dụng mật khẩu mà con người khó có thể làm được. + +23 +00:01:23,570 --> 00:01:27,380 +dễ nhớ nhưng máy tính dễ đoán. Đây là trạng thái điên rồ của mọi thứ. + +24 +00:01:28,340 --> 00:01:31,640 +Vì vậy, chúng tôi sẽ tạo ra một chương trình để chống lại điều đó. + +25 +00:01:31,880 --> 00:01:35,690 +Và nó sẽ được gọi là MyPass, trình quản lý mật khẩu của chúng + +26 +00:01:36,230 --> 00:01:40,220 +tôi, và chúng tôi sẽ sử dụng nó để lưu trữ và tạo mật khẩu. + +27 +00:01:40,700 --> 00:01:43,820 +Ví dụ: nếu tôi muốn tạo một tài khoản trên App + +28 +00:01:44,300 --> 00:01:48,770 +Brewery, thì tôi nhập tên của trang web để tôi biết mật khẩu này dùng để + +29 +00:01:49,130 --> 00:01:53,990 +làm gì, tôi nhập vào email của mình và tên người dùng đã được điền sẵn trong + +30 +00:01:53,990 --> 00:01:58,670 +trình quản lý mật khẩu của tôi. Và sau đó, tất cả những gì tôi phải + +31 +00:01:58,700 --> 00:02:03,500 +làm là nghĩ ra một mật khẩu hy vọng không quá khủng khiếp, nhưng rõ ràng là tôi không bao + +32 +00:02:03,830 --> 00:02:08,830 +giờ nhớ được, hoặc tôi có thể sử dụng mật khẩu tạo nội trang để chỉ tạo cho tôi một mật khẩu + +33 +00:02:09,530 --> 00:02:14,530 +rất phức tạp, rất dài với tất cả các số và ký hiệu cần thiết và tất cả những thứ đó. + +34 +00:02:15,200 --> 00:02:18,170 +Và khi tôi đã hoàn thành việc đó, sau đó tôi có thể nhấp vào + +35 +00:02:18,620 --> 00:02:21,830 +thêm và tôi nhận được một cửa sổ bật lên hỏi tôi liệu điều này có ổn không. + +36 +00:02:22,490 --> 00:02:24,980 +Và nếu tất cả đều ổn, thì tôi nhấp vào + +37 +00:02:25,190 --> 00:02:28,610 +Có và dữ liệu đó sẽ được thêm vào tệp văn bản mà tôi + +38 +00:02:28,640 --> 00:02:30,530 +có trên máy tính của mình. + +39 +00:02:30,980 --> 00:02:35,750 +Vì vậy, đây không phải là một dịch vụ dựa trên internet và bạn giữ mọi thứ cục bộ trên máy tính + +40 +00:02:35,750 --> 00:02:36,583 +của mình, điều + +41 +00:02:36,770 --> 00:02:41,180 +mà một số người cảm thấy an toàn hơn rất nhiều so với việc sử dụng dịch vụ của bên + +42 +00:02:41,180 --> 00:02:43,400 +thứ ba như LastPass hoặc bất cứ thứ gì khác. + +43 +00:02:44,420 --> 00:02:48,350 +Vì vậy, đây là những gì chúng tôi đang cố gắng xây dựng và nó có một số tính năng thực sự gọn gàng. + +44 +00:02:48,680 --> 00:02:52,280 +Ví dụ, nó có một số xác nhận cơ bản. Vì vậy, nếu bạn, ví dụ, để + +45 +00:02:52,280 --> 00:02:56,690 +trống một trong các trường và bạn nhấp vào thêm, bạn sẽ nhận được một cửa sổ bật lên cho bạn + +46 +00:02:56,720 --> 00:03:01,030 +biết, vui lòng không để trống bất kỳ trường nào. Hoặc nếu bạn tạo một mật khẩu, thì bạn thực + +47 +00:03:01,210 --> 00:03:06,210 +sự có thể sử dụng nó ngay lập tức bằng cách dán nó. Điều gì đang xảy ra đằng sau hậu trường là + +48 +00:03:06,250 --> 00:03:09,130 +ngay sau khi tôi nhấp vào tạo mật khẩu, sau đó mật + +49 +00:03:09,460 --> 00:03:14,440 +khẩu của tôi được lưu vào khay nhớ tạm và tôi có thể dán nó vào trường mật khẩu trên + +50 +00:03:14,440 --> 00:03:16,810 +trang web mà tôi đang cố gắng đăng ký. + +51 +00:03:18,340 --> 00:03:20,320 +Đây là những gì chúng ta sẽ xây dựng ngày hôm nay. + +52 +00:03:20,410 --> 00:03:23,410 +Và nó sẽ sử dụng mọi thứ bạn đã học về tkinter và + +53 +00:03:23,830 --> 00:03:26,680 +chúng ta cũng sẽ học một số điều mới mà bạn có + +54 +00:03:26,680 --> 00:03:28,930 +thể làm với tkinter. Khi bạn đã sẵn + +55 +00:03:29,020 --> 00:03:31,600 +sàng, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Canvas-Documentation-on-tkdocs.com.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Canvas-Documentation-on-tkdocs.com.url new file mode 100644 index 0000000000000000000000000000000000000000..68c3020c9f407d715b1a8eaac053a135771a32f9 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Canvas-Documentation-on-tkdocs.com.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://tkdocs.com/tutorial/canvas.html \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Challenge 1 - Working with Images and Setting up the Canvas.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Challenge 1 - Working with Images and Setting up the Canvas.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..07222b3d6dc72d296f0a5b5dbc8f1d6ff015d1f2 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Challenge 1 - Working with Images and Setting up the Canvas.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c90c6314eccfa174723090ef23ec128a26dcc1921ef44d3340fd41549830cdc +size 39472568 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Challenge 1 - Working with Images and Setting up the Canvas_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Challenge 1 - Working with Images and Setting up the Canvas_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..db2e0f081c7ed625df0b0fcf4deaa3205a5f8f38 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 Challenge 1 - Working with Images and Setting up the Canvas_vi.srt @@ -0,0 +1,320 @@ +1 +00:00:00,570 --> 00:00:02,370 +Để bắt đầu, như mọi khi, + +2 +00:00:02,370 --> 00:00:07,050 +hãy truy cập tài nguyên khóa học và tải xuống dự án bắt đầu dưới dạng tệp zip. + +3 +00:00:07,770 --> 00:00:10,470 +Bây giờ, khi bạn đã giải nén nó, hãy mở + +4 +00:00:11,820 --> 00:00:15,360 +nó bằng PyCharm và tiếp tục và xem bên trong các tệp bắt đầu. + +5 +00:00:16,079 --> 00:00:18,300 +Tôi đã bao gồm một hình ảnh + +6 +00:00:18,360 --> 00:00:21,450 +logo sẽ được sử dụng trong dự án của chúng tôi. + +7 +00:00:21,930 --> 00:00:25,890 +Và tôi cũng có một cái nhìn rất, rất trống rỗng vào chính. py + +8 +00:00:26,580 --> 00:00:30,810 +Bây giờ ở đây đã có một thách thức. Để bắt đầu, chúng ta sẽ + +9 +00:00:30,810 --> 00:00:35,790 +tạo một cửa sổ bằng tkinter có tiêu đề Trình quản lý mật + +10 +00:00:35,790 --> 00:00:36,623 +khẩu. + +11 +00:00:36,960 --> 00:00:41,960 +Và thứ duy nhất mà nó sẽ có chỉ là một widget canvas hiển thị hình + +12 +00:00:43,110 --> 00:00:44,430 +ảnh logo đó. + +13 +00:00:44,790 --> 00:00:48,210 +Vì vậy, canvas sẽ có chiều rộng và chiều cao là 200 + +14 +00:00:48,690 --> 00:00:53,690 +pixel, và canvas sẽ được đệm từ mép cửa sổ thêm 20 pixel ở cả bốn cạnh + +15 +00:00:54,420 --> 00:00:55,440 +để nó có + +16 +00:00:55,620 --> 00:01:00,570 +thể trông khá chính giữa như thế này. Và hình ảnh này cuối cùng + +17 +00:01:00,570 --> 00:01:03,300 +sẽ được đập vào giữa khung hình. + +18 +00:01:04,769 --> 00:01:08,580 +Vì vậy, tôi muốn bạn nghĩ lại những gì bạn đã học ngày hôm + +19 +00:01:08,580 --> 00:01:10,890 +qua về tiện ích canvas và trong + +20 +00:01:10,920 --> 00:01:14,730 +tài nguyên khóa học, tôi đã liên kết đến trang này trên tài liệu + +21 +00:01:15,090 --> 00:01:18,300 +canvas bao gồm tất cả phương thức create_image quan trọng đó. + +22 +00:01:18,690 --> 00:01:21,840 +Hãy xem qua phần này để biết các đầu vào mong đợi là gì và + +23 +00:01:22,110 --> 00:01:26,340 +bạn cũng có thể cuộn lên để xem thêm các tài liệu tham khảo về những thứ khác mà bạn + +24 +00:01:26,340 --> 00:01:27,660 +có thể làm với canvas. + +25 +00:01:28,110 --> 00:01:31,110 +Hoặc chỉ cần xem nhanh mã của ngày hôm qua nếu bạn cần. + +26 +00:01:31,620 --> 00:01:36,620 +Nhưng tôi muốn bạn có thể tạo một chương trình tkinter bằng tất cả những thứ bạn đã học được + +27 +00:01:36,870 --> 00:01:38,730 +và khi bạn chạy nó, nó sẽ + +28 +00:01:38,730 --> 00:01:42,180 +trông khá giống như thế này. Tạm dừng video và hoàn + +29 +00:01:42,180 --> 00:01:44,100 +thành thử thách này, 1: Được + +30 +00:01:44,960 --> 00:01:45,793 +rồi. + +31 +00:01:47,420 --> 00:01:50,360 +0: Vì vậy, để bắt đầu, chúng ta sẽ đi đến đầu tệp của chúng + +32 +00:01:50,480 --> 00:01:54,080 +ta và tôi sẽ nhập tất cả các lớp bên trong tkinter và tôi sẽ sử dụng nó để + +33 +00:01:54,590 --> 00:01:58,100 +thiết lập giao diện người dùng của mình. Như mọi khi, tôi bắt đầu + +34 +00:01:58,100 --> 00:02:00,020 +tạo một cửa sổ và đặt tiêu + +35 +00:02:02,000 --> 00:02:03,350 +đề cho nó. + +36 +00:02:04,790 --> 00:02:08,780 +Và sau đó tôi sẽ làm cho cửa sổ của tôi bắt đầu với vòng lặp chính của tôi. + +37 +00:02:09,350 --> 00:02:11,990 +Bây giờ ở giữa, tôi sẽ tạo canvas của mình. + +38 +00:02:14,030 --> 00:02:18,440 +Và đây là từ tiện ích canvas. Bây giờ widget canvas này, như + +39 +00:02:18,440 --> 00:02:23,440 +tôi đã đề cập, sẽ có chiều cao là 200 và chiều rộng là 200. + +40 +00:02:25,160 --> 00:02:26,120 +Và thêm + +41 +00:02:26,120 --> 00:02:31,120 +vào đó, nó sẽ hiển thị logo này. png bên trong như hình ảnh. + +42 +00:02:31,640 --> 00:02:35,060 +Vì vậy, tôi sẽ tạo hình ảnh logo của chúng tôi từ lớp hình + +43 +00:02:35,330 --> 00:02:38,000 +ảnh và sau đó tôi phải cung cấp tên tệp. + +44 +00:02:38,330 --> 00:02:42,740 +Vì vậy, tên tập tin chỉ đơn giản là logo. png trong trường hợp này vì cả + +45 +00:02:42,770 --> 00:02:47,720 +hai đều nằm trong cùng một thư mục. Vì vậy, khi tôi đã tạo hình ảnh của mình, + +46 +00:02:47,750 --> 00:02:52,730 +tôi có thể yêu cầu canvas của mình tạo một hình ảnh bên trong canvas và sau đó tôi có + +47 +00:02:53,150 --> 00:02:56,030 +thể chỉ định tên hình ảnh và đó tất nhiên sẽ + +48 +00:02:56,480 --> 00:03:00,550 +là hình ảnh biểu trưng của tôi. Bây giờ, một việc khác mà tôi phải + +49 +00:03:00,580 --> 00:03:04,240 +làm trước khi thực sự có thể chạy mã của mình, bởi vì tại thời + +50 +00:03:04,720 --> 00:03:08,770 +điểm này, nó thực sự sẽ mang lại cho tôi một lỗi và lỗi cho biết + +51 +00:03:08,770 --> 00:03:10,720 +chỉ mục tuple nằm ngoài phạm vi. + +52 +00:03:10,780 --> 00:03:14,650 +Về cơ bản, nó mong đợi một số loại tuple + +53 +00:03:14,680 --> 00:03:19,680 +hoạt động và tuple đó là xác định vị trí X và Y của + +54 +00:03:20,110 --> 00:03:24,430 +hình ảnh này trên canvas. Vì vậy, chúng tôi làm điều đó bằng cách chỉ cần thêm các số nguyên. + +55 +00:03:24,550 --> 00:03:28,570 +Vì vậy, vị trí X của trung tâm của hình ảnh sẽ là 100, + +56 +00:03:28,900 --> 00:03:32,980 +bởi vì hãy nhớ rằng chiều rộng là 200 nên một nửa của đó là 100. + +57 +00:03:33,340 --> 00:03:37,510 +Và tương tự đối với vị trí Y, nó cũng sẽ là 100. + +58 +00:03:38,020 --> 00:03:40,750 +Vì vậy, theo cách này, chúng tôi có vị trí X và Y để tìm, và + +59 +00:03:40,960 --> 00:03:43,840 +chúng tôi đã tạo kích thước canvas. Bây giờ, tất cả những + +60 +00:03:43,840 --> 00:03:48,730 +gì chúng ta cần làm là làm cho canvas của chúng ta có một số loại kích thước bố cục. + +61 +00:03:49,210 --> 00:03:53,740 +Tôi sẽ bắt đầu bằng cách đóng gói canvas của mình lên màn hình vì sau này, khi chúng + +62 +00:03:53,740 --> 00:03:57,760 +ta có nhiều thành phần hơn, thì chúng ta có thể nghĩ đến việc sử dụng + +63 +00:03:57,760 --> 00:04:01,330 +những thứ lạ mắt hơn như lưới. Bây giờ, nếu tôi chạy như vậy, + +64 +00:04:01,480 --> 00:04:06,480 +thì bạn có thể thấy rằng tôi đã tạo cửa sổ trình quản lý mật khẩu của mình và tôi + +65 +00:04:07,930 --> 00:04:09,940 +đã tạo canvas 200 x 200 của mình. + +66 +00:04:10,330 --> 00:04:15,040 +Yêu cầu duy nhất mà tôi chưa đáp ứng là thêm một số đệm giữa cửa + +67 +00:04:15,040 --> 00:04:16,540 +sổ và khung đó. + +68 +00:04:16,750 --> 00:04:20,290 +Vì vậy, hãy làm điều đó bằng cách sử dụng cửa sổ của chúng tôi. config và tôi + +69 +00:04:20,769 --> 00:04:24,820 +sẽ đặt padding bằng cách sử dụng padx và pady. + +70 +00:04:25,270 --> 00:04:26,380 +Và như chúng tôi + +71 +00:04:26,440 --> 00:04:30,550 +đã đề cập, tôi sẽ đặt nó thành 20 trên X và 20 trên Y. + +72 +00:04:31,420 --> 00:04:36,420 +Vì vậy, bây giờ chúng tôi có được khá nhiều chính xác hình ảnh mà bạn đã thấy trong cuộc trình diễn và đây + +73 +00:04:37,030 --> 00:04:39,610 +là kết quả cuối cùng mà chúng tôi đang tìm kiếm. + +74 +00:04:40,390 --> 00:04:42,910 +Bạn đã quản lý để hoàn thành thử thách này? + +75 +00:04:43,360 --> 00:04:46,900 +Nếu không, hãy nhớ xem lại một số bài học mà chúng ta đã học ngày + +76 +00:04:47,110 --> 00:04:49,990 +hôm qua khi chúng ta đã xem qua widget canvas rất chi tiết. + +77 +00:04:50,920 --> 00:04:54,580 +Nhưng nếu bạn hài lòng với tất cả mã này, thì trong bài học tiếp theo, + +78 +00:04:54,760 --> 00:04:58,540 +chúng ta sẽ tìm hiểu thêm về hệ thống lưới và cách tạo ra một giao + +79 +00:04:58,540 --> 00:05:02,830 +diện người dùng phức tạp như thế này. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp + +80 +00:05:02,980 --> 00:05:03,520 +bạn ở đó. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 password-manager-start.zip b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 password-manager-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..4c854a552c4ab99d00021db39adad58102a0378f --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/002 password-manager-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df0102dd8d8b1334b1627d76781c86b139c608a8d9f938691b566e5db2daf88e +size 14156 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Challenge 2 - Use grid() and columnspan to Complete the User Interface.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Challenge 2 - Use grid() and columnspan to Complete the User Interface.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..04294f1b6173ba8f1ce7a67a31938456b6b471fa --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Challenge 2 - Use grid() and columnspan to Complete the User Interface.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f813381756b064ffbdcf1e8e2a6f367e3848078cbe7e36bc3feb9c5fbca21011 +size 19926030 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Challenge 2 - Use grid() and columnspan to Complete the User Interface_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Challenge 2 - Use grid() and columnspan to Complete the User Interface_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7f3d63452e74ca0d79df2c4e1dd4653ad594f702 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Challenge 2 - Use grid() and columnspan to Complete the User Interface_vi.srt @@ -0,0 +1,296 @@ +1 +00:00:00,720 --> 00:00:05,720 +Để đi từ điều này đến điều này, không chỉ cần thêm một số tiện ích con mà còn phải có + +2 +00:00:06,570 --> 00:00:11,250 +thêm một chút kiến thức về cách bố trí các tiện ích con của chúng ta trên lưới. + +3 +00:00:11,760 --> 00:00:16,760 +Bởi vì hãy để ý ở đây chúng ta có một mục duy nhất nằm ở phía bên phải của màn + +4 +00:00:18,330 --> 00:00:20,580 +hình như thế nào. Nhưng ở dưới đây, chúng + +5 +00:00:20,610 --> 00:00:25,470 +tôi có một mục chỉ chiếm một phần không gian đó. Hiệu quả nếu chúng ta nghĩ về + +6 +00:00:25,470 --> 00:00:27,060 +lưới của mình, + +7 +00:00:27,270 --> 00:00:30,930 +mục nhập cụ thể này thực sự chiếm hai cột. + +8 +00:00:31,440 --> 00:00:36,440 +Vì vậy, làm thế nào chúng ta có thể làm điều này? Để chứng minh điều này, tôi đã tạo một ứng dụng hộp cát. + +9 +00:00:37,380 --> 00:00:38,700 +Vì vậy, nó rất + +10 +00:00:38,730 --> 00:00:42,720 +đơn giản, tất cả những gì nó có là một nhãn đỏ và một nhãn xanh. + +11 +00:00:43,200 --> 00:00:46,320 +Và bạn có thể thấy rằng nhãn màu đỏ có chiều rộng là + +12 +00:00:46,320 --> 00:00:48,480 +20, chiều cao là 5 cũng như màu + +13 +00:00:48,750 --> 00:00:51,420 +xanh lá cây, nhưng màu đỏ ở hàng 0 cột 0 + +14 +00:00:51,870 --> 00:00:54,570 +trong khi màu xanh lá cây ở hàng 1 cột 1. + +15 +00:00:54,720 --> 00:00:57,240 +Vì vậy, chúng tôi có được loại hình ca rô này. + +16 +00:00:57,870 --> 00:01:00,870 +Nếu tôi quyết định thêm một nhãn khác, hãy gọi + +17 +00:01:00,960 --> 00:01:05,580 +nó là b cho màu xanh lam và tôi cho nó nền là màu xanh lam. + +18 +00:01:06,150 --> 00:01:10,020 +Và sau đó tôi cung cấp cho nó cùng chiều rộng và chiều cao. Bây giờ, nếu tôi đặt nhãn + +19 +00:01:10,020 --> 00:01:15,020 +mới này vào lưới và tôi đặt nó vào hàng tiếp theo, vậy là hàng 2, nhưng + +20 +00:01:16,260 --> 00:01:21,210 +cột tôi sẽ đặt nó trên cột 0. Bây giờ, tôi nghĩ rằng tại thời điểm + +21 +00:01:21,390 --> 00:01:25,590 +này, tất cả các bạn có thể dự đoán được nhãn đó sẽ đi + +22 +00:01:25,590 --> 00:01:26,370 +đến đâu. + +23 +00:01:26,370 --> 00:01:31,370 +Và thực sự nó đi vào cột đầu tiên ngoài cùng bên trái và ở hàng + +24 +00:01:31,800 --> 00:01:32,633 +thứ ba. + +25 +00:01:32,820 --> 00:01:37,820 +Bây giờ điều gì sẽ xảy ra nếu tôi muốn nhãn màu xanh dương đó đi qua toàn bộ chiều rộng để nó ở dưới màu đỏ + +26 +00:01:39,630 --> 00:01:43,080 +và cũng ở dưới màu xanh lá cây? Chà, bạn có thể nghĩ + +27 +00:01:43,080 --> 00:01:46,710 +rằng tôi có thể chỉ cần tăng gấp đôi chiều rộng, phải không? + +28 +00:01:46,830 --> 00:01:48,210 +Thay vì chiều rộng + +29 +00:01:48,210 --> 00:01:52,830 +là 20, hãy thay đổi nó thành 40. Chắc chắn điều đó sẽ kéo dài nhãn này để + +30 +00:01:52,830 --> 00:01:55,590 +nó đi qua toàn bộ nhãn màu đỏ và xanh lá cây. + +31 +00:01:56,220 --> 00:02:00,480 +Nhưng thật không may khi tôi chạy điều này, thay vào đó, bạn sẽ thấy điều này xảy ra. + +32 +00:02:01,140 --> 00:02:04,470 +Nhãn màu xanh lam vẫn nằm trong cột đầu tiên. + +33 +00:02:04,890 --> 00:02:09,889 +Và trên thực tế, nó đã kéo dài cột đó đến chiều rộng 40 và cột màu đỏ đó bây giờ + +34 +00:02:10,530 --> 00:02:13,950 +lại được căn giữa ở ngoài cùng bên trái hoặc cột đầu tiên. + +35 +00:02:14,550 --> 00:02:19,170 +Và màu xanh lam đó không ở gần nhãn màu xanh lá cây vì nó không + +36 +00:02:19,170 --> 00:02:23,670 +được phép đi vào cột thứ hai. Vậy chúng ta có thể giải quyết tình huống này như thế nào? + +37 +00:02:24,540 --> 00:02:26,670 +Chà, câu trả lời thực + +38 +00:02:26,670 --> 00:02:29,640 +tế là một thuộc tính khác mà + +39 +00:02:29,940 --> 00:02:33,000 +lưới có, cái được gọi là khoảng cột. + +40 +00:02:33,660 --> 00:02:36,870 +Bây giờ khoảng cột chính xác như những + +41 +00:02:36,870 --> 00:02:41,870 +gì nó nghe thực sự. Về cơ bản, thứ cụ thể này sẽ kéo dài bao nhiêu cột? + +42 +00:02:43,170 --> 00:02:46,710 +Vì vậy, trong trường hợp của chúng tôi, chúng tôi muốn nó đi + +43 +00:02:46,980 --> 00:02:49,230 +qua hai cột, cột 0 và cột 1. + +44 +00:02:49,620 --> 00:02:52,230 +Vì vậy, nó sẽ bắt đầu từ cột 0 nhưng + +45 +00:02:52,290 --> 00:02:57,270 +sau đó kéo dài toàn bộ hai cột. Và bây giờ khi tôi chạy đoạn mã này, bạn có thể thấy + +46 +00:02:57,540 --> 00:02:59,250 +chúng tôi có được hiệu ứng mong muốn. + +47 +00:03:00,040 --> 00:03:05,040 +Nhãn màu xanh hiện nằm trên màu đỏ và xanh lục và nó kéo dài + +48 +00:03:05,680 --> 00:03:06,513 +hai cột. + +49 +00:03:07,270 --> 00:03:11,380 +Liên kết đến sân chơi này nằm trong các tài nguyên của khóa học, vì + +50 +00:03:11,410 --> 00:03:13,780 +vậy hãy thoải mái đến đó và thử nếu + +51 +00:03:13,780 --> 00:03:18,160 +bạn muốn thử với ví dụ này. Bây giờ trong trường hợp của chúng ta, + +52 +00:03:18,190 --> 00:03:20,920 +nếu chúng ta chia nhỏ bố cục cuối cùng mà + +53 +00:03:21,280 --> 00:03:25,540 +chúng ta đang tìm kiếm, thì đó thực sự là bố cục 3 cột và 5 hàng. + +54 +00:03:25,960 --> 00:03:27,790 +Vì vậy, chúng tôi đã có canvas + +55 +00:03:27,880 --> 00:03:32,590 +của chúng tôi mà thực sự sẽ đi ở giữa, vì vậy nó có thể là cột thứ hai. + +56 +00:03:33,010 --> 00:03:37,000 +Và sau đó chúng tôi có trang web, email / tên người dùng, mật khẩu và cuối + +57 +00:03:37,270 --> 00:03:38,950 +cùng là hai nút của chúng tôi. + +58 +00:03:39,580 --> 00:03:44,580 +Bây giờ tôi đã trình bày toàn bộ giao diện người dùng này và tôi đã chỉ định chiều rộng + +59 +00:03:45,970 --> 00:03:50,140 +của một số mục nhập và nút này chỉ vì bạn sẽ cần thực hiện một chút + +60 +00:03:50,140 --> 00:03:54,010 +chỉnh sửa xung quanh chỉ để đảm bảo rằng mọi thứ phù hợp với nhau. + +61 +00:03:54,490 --> 00:03:56,020 +Tôi thực sự đã làm điều đó + +62 +00:03:56,170 --> 00:03:59,440 +trước thời hạn và tôi đã tìm ra loại chiều rộng gần như tối ưu. + +63 +00:04:00,070 --> 00:04:04,900 +Vì vậy, những gì tôi muốn bạn làm là sử dụng những gì chúng ta + +64 +00:04:04,900 --> 00:04:09,430 +đã học về khoảng cột lưới. Vì vậy, nếu chúng ta có nhãn, + +65 +00:04:09,700 --> 00:04:13,420 +một nút, nút mới và mục nhập, nếu tôi muốn nút cụ thể + +66 +00:04:13,840 --> 00:04:16,300 +này đi qua hai cột, thì tôi phải thay + +67 +00:04:16,329 --> 00:04:21,329 +đổi thuộc tính columnpan thành 2 và tôi phải chỉ định cột đó bắt đầu ở đâu và + +68 +00:04:21,820 --> 00:04:26,820 +như thế nào nhiều cột nó sẽ đi qua. Sử dụng mọi thứ bạn đã học cho đến + +69 +00:04:27,550 --> 00:04:30,490 +nay, tôi muốn bạn tạo lại giao diện người dùng này. + +70 +00:04:31,030 --> 00:04:36,010 +Hãy xem những gì trên màn hình; đây là các nhãn, đây là các + +71 +00:04:36,310 --> 00:04:41,310 +mục nhập và hai là các nút. Hãy xem vị trí của chúng trong hệ thống lưới + +72 +00:04:41,440 --> 00:04:45,790 +và có bao nhiêu cột mà chúng đi qua cũng như chiều rộng của một số tiện ích con này + +73 +00:04:46,120 --> 00:04:50,470 +và xem liệu bạn có thể tạo lại giao diện người dùng này trong dự án của mình hay không. + +74 +00:04:50,680 --> 00:04:52,690 +Vì vậy, hãy tạm dừng video và thử xem. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Tkinter-Grid-columnspan-Demo-Repl.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Tkinter-Grid-columnspan-Demo-Repl.url new file mode 100644 index 0000000000000000000000000000000000000000..544b824b6e02dd63471e1732ddfd1bf3a5113905 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/003 Tkinter-Grid-columnspan-Demo-Repl.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/grid-columnspan-demo#main.py \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/004 Solution to the Creating the Grid Layout.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/004 Solution to the Creating the Grid Layout.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f410a3ce58e4eda65e4615f37a9ab83631a41855 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/004 Solution to the Creating the Grid Layout.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccfeb27a2d1996ddb42d775f7045bb5ff9e3306c91e3510397aca7a40f3b5a6b +size 41506951 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/004 Solution to the Creating the Grid Layout_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/004 Solution to the Creating the Grid Layout_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7026b3ec763cb8c9caca8edbc74080714d7ef75f --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/004 Solution to the Creating the Grid Layout_vi.srt @@ -0,0 +1,404 @@ +1 +00:00:00,180 --> 00:00:03,270 +Bạn đã tham gia thử thách chưa? Đây là những gì chúng tôi hiện + +2 +00:00:03,600 --> 00:00:06,720 +có và đây là những gì bạn nên tạo ra khi hoàn thành thử thách. + +3 +00:00:07,320 --> 00:00:11,220 +Nếu bạn chưa thử tạo lại giao diện người dùng này, hãy tạm dừng video ngay bây + +4 +00:00:11,550 --> 00:00:16,530 +giờ vì tôi sắp hướng dẫn bạn cách giải quyết. Một lần nữa, chúng ta sẽ ở trong phần thiết + +5 +00:00:16,530 --> 00:00:18,960 +lập giao diện người dùng và tôi sẽ viết mã + +6 +00:00:19,350 --> 00:00:23,490 +của mình bên dưới nơi tôi có canvas. Bây giờ, điều đầu tiên tôi sẽ tạo thực + +7 +00:00:23,490 --> 00:00:24,870 +sự là tất cả + +8 +00:00:25,020 --> 00:00:29,490 +các nhãn này bởi vì chúng tương đối đơn giản để bố trí và chúng sẽ là một + +9 +00:00:29,970 --> 00:00:31,680 +công việc nhanh chóng và dễ dàng. + +10 +00:00:37,700 --> 00:00:38,270 +1: Được rồi. + +11 +00:00:38,270 --> 00:00:38,570 +0: Bây + +12 +00:00:38,570 --> 00:00:43,490 +giờ tôi đã tạo ba nhãn và đã đến lúc thực sự đưa chúng lên màn hình. Bây giờ, vì tôi sẽ + +13 +00:00:43,520 --> 00:00:47,510 +sử dụng lưới, tôi không thể sử dụng thêm gói. + +14 +00:00:47,780 --> 00:00:50,540 +Vì vậy, tôi cũng phải đặt canvas của mình lên lưới. + +15 +00:00:51,050 --> 00:00:54,620 +Khung sẽ đi vào lưới ở hàng 0, hàng + +16 +00:00:54,710 --> 00:00:56,930 +đầu tiên ở trên cùng. + +17 +00:00:57,380 --> 00:01:00,560 +Và về cột, nó thực sự sẽ là + +18 +00:01:01,130 --> 00:01:04,970 +cột 1, cột giữa. Và sau đó đi xuống danh + +19 +00:01:05,000 --> 00:01:09,680 +sách, nhãn trang web và nhãn email và nhãn mật khẩu của tôi, tất cả + +20 +00:01:09,890 --> 00:01:12,380 +chúng sẽ nằm trên các hàng tiếp theo. + +21 +00:01:12,410 --> 00:01:15,950 +Vì vậy, hàng 1 rồi đến hàng 2 và + +22 +00:01:18,290 --> 00:01:19,490 +hàng 3. + +23 +00:01:21,530 --> 00:01:24,350 +Và tất cả chúng sẽ ở + +24 +00:01:24,350 --> 00:01:28,070 +cùng một cột, sẽ là cột 0, cột đầu tiên. + +25 +00:01:29,870 --> 00:01:33,830 +Bây giờ, nếu tôi chạy mã này và chúng ta xem xét, bạn + +26 +00:01:34,100 --> 00:01:38,960 +có thể thấy rằng nó trông hơi kỳ lạ chỉ vì canvas này ở cột 1 trong + +27 +00:01:38,960 --> 00:01:43,310 +khi các nhãn này ở cột 0. Nhưng điều đó không sao cả. + +28 +00:01:43,370 --> 00:01:46,070 +Nó thậm chí sẽ ra khi chúng ta thêm các thành phần khác. + +29 +00:01:46,880 --> 00:01:50,270 +Đó là tất cả các nhãn được thực hiện. Điều tiếp theo là các mục. + +30 +00:01:52,250 --> 00:01:56,870 +Bây giờ, như tôi đã cho bạn thấy trong slide, các mục này sẽ có độ rộng khác nhau. + +31 +00:01:57,200 --> 00:01:59,000 +Vì vậy, mục nhập trang + +32 +00:01:59,000 --> 00:02:03,860 +web, mục này ở đây và mục nhập email đều sẽ có chiều rộng là 35. + +33 +00:02:04,250 --> 00:02:07,610 +Trong khi mục nhập mật khẩu sẽ chỉ có chiều rộng là 21. + +34 +00:02:08,990 --> 00:02:13,990 +Bây giờ hãy nhớ rằng chiều rộng là một thuộc tính của lớp mục nhập. + +35 +00:02:14,600 --> 00:02:17,030 +Nó không phải là một cái gì đó liên quan đến lưới điện. + +36 +00:02:17,360 --> 00:02:21,950 +Vì vậy, nếu bên trong phương thức lưới này, bạn thêm một cái gì đó như chiều rộng, thì điều này sẽ + +37 +00:02:22,550 --> 00:02:25,160 +không hoạt động và nó sẽ gây ra lỗi cho bạn. + +38 +00:02:25,280 --> 00:02:28,040 +Vì vậy, đó là một nguồn lỗi phổ biến của học sinh nên lưu ý. + +39 +00:02:28,850 --> 00:02:33,500 +Khi chúng tôi đã tạo các mục nhập của mình, đã đến lúc bố trí chúng bằng cách sử dụng lưới của chúng tôi. + +40 +00:02:34,130 --> 00:02:39,130 +Bây giờ, mục nhập trang web đầu tiên sẽ đi vào cùng hàng với nhãn + +41 +00:02:39,530 --> 00:02:44,390 +trang web, vì vậy hàng 1, nhưng cột sẽ là cột 1 nên nó sẽ + +42 +00:02:44,390 --> 00:02:45,980 +là cột tiếp theo. + +43 +00:02:46,130 --> 00:02:46,963 +1: Được rồi. + +44 +00:02:51,800 --> 00:02:55,250 +0: Và mục nhập email sẽ nằm trong cùng một cột, nhưng chỉ + +45 +00:02:55,310 --> 00:02:57,200 +bị dịch chuyển xuống một hàng. + +46 +00:02:59,710 --> 00:03:00,310 +1: Và + +47 +00:03:00,310 --> 00:03:04,030 +cuối cùng mục nhập mật khẩu sẽ ở hàng tiếp theo, hàng 3 + +48 +00:03:04,420 --> 00:03:08,380 +và nó cũng sẽ ở cột 1. Ngay bây giờ, đây là những gì nó + +49 +00:03:08,410 --> 00:03:09,760 +trông như thế này. + +50 +00:03:09,820 --> 00:03:12,580 +Và bạn có thể thấy rằng điều này trông không + +51 +00:03:12,670 --> 00:03:14,890 +tệ lắm ngoài việc có lẽ + +52 +00:03:14,890 --> 00:03:19,890 +tôi cần phải đổi nó thành chữ P viết hoa và tôi có thể thêm dấu hai chấm + +53 +00:03:24,640 --> 00:03:29,290 +vào cuối mỗi dòng này, như thế này. Bây giờ bước cuối cùng cần làm là thêm hai nút. + +54 +00:03:29,500 --> 00:03:33,550 +Vì vậy, một nút phải đi qua đây ở bên phải của trường mật khẩu và + +55 +00:03:33,880 --> 00:03:35,410 +một nút ở dưới cùng. + +56 +00:03:42,450 --> 00:03:43,283 +1: Được rồi. + +57 +00:03:43,350 --> 00:03:47,580 +0: Bây giờ, nút tạo mật khẩu này sẽ ở trên lưới + +58 +00:03:47,850 --> 00:03:50,640 +nhưng nó sẽ ở cột thứ ba. + +59 +00:03:51,870 --> 00:03:55,440 +Và về hàng, nó sẽ nằm trên cùng một hàng với mật khẩu, + +60 +00:03:55,470 --> 00:03:56,610 +đó là hàng 3. + +61 +00:03:57,330 --> 00:03:58,163 +1: Được rồi. + +62 +00:04:01,620 --> 00:04:04,890 +0: Trong khi nút thêm chỉ đơn giản là sẽ ở hàng cuối cùng, + +63 +00:04:05,130 --> 00:04:05,963 +1: phải không? + +64 +00:04:07,950 --> 00:04:12,450 +0: Và đây phải là một nút chứ không phải là một nút radio. + +65 +00:04:13,710 --> 00:04:15,690 +Vì vậy, đây là những gì chúng tôi có cho đến nay. + +66 +00:04:16,290 --> 00:04:20,970 +Đây rõ ràng không phải là những gì chúng tôi muốn có, trông giống như thế này hơn. + +67 +00:04:21,060 --> 00:04:22,500 +Và nếu tôi đặt nó + +68 +00:04:22,830 --> 00:04:27,810 +cạnh nhau, bạn có thể thấy rằng nút thêm quá nhỏ. Nhắc lại điều này, chúng ta cần + +69 +00:04:27,930 --> 00:04:32,090 +đặt chiều rộng là 36. Vì vậy, chúng ta hãy tiếp tục và thêm điều đó. + +70 +00:04:32,160 --> 00:04:32,993 +1: Được rồi. + +71 +00:04:35,490 --> 00:04:39,360 +0: Bây giờ, điều đó làm cho nút rộng hơn rất nhiều, nhưng nó + +72 +00:04:39,360 --> 00:04:44,160 +vẫn không giải quyết được thực tế là mật khẩu tạo này thực sự nằm trong một + +73 +00:04:44,160 --> 00:04:49,160 +cột hoàn toàn khác trong khi chúng tôi thực sự muốn nút đó bao gồm toàn bộ mục + +74 +00:04:51,720 --> 00:04:54,450 +nhập mật khẩu và cả mật khẩu tạo. . + +75 +00:04:54,750 --> 00:04:58,440 +Vì vậy, về cơ bản chúng ta cần nút này có khoảng cột là 2 để + +76 +00:04:58,680 --> 00:05:01,920 +nó kéo dài cả hai cột này. Và trên thực tế, mục + +77 +00:05:01,950 --> 00:05:05,580 +nhập trang web và mục nhập email / tên người dùng cũng vậy. + +78 +00:05:06,270 --> 00:05:07,260 +Vì vậy, chúng ta hãy khắc phục điều đó. + +79 +00:05:08,340 --> 00:05:13,340 +Lưới mục nhập trang web sẽ có đối số từ khóa bổ sung là khoảng + +80 +00:05:14,160 --> 00:05:17,640 +cột và điều này sẽ được đặt thành 2. + +81 +00:05:18,240 --> 00:05:22,470 +Và chúng tôi sẽ thêm nó vào mục nhập email khi nó cũng ở trên lưới, + +82 +00:05:22,920 --> 00:05:24,720 +và cuối cùng là nút thêm. + +83 +00:05:25,770 --> 00:05:29,070 +Vì vậy, bây giờ bạn có thể thấy rằng chúng ta đang tiến khá gần, phải không? + +84 +00:05:29,580 --> 00:05:31,410 +Khi chúng tôi đặt các thanh cột + +85 +00:05:31,470 --> 00:05:35,280 +đó vào, bạn có thể thấy bố cục của chúng tôi đã thay đổi đáng kể + +86 +00:05:35,280 --> 00:05:37,560 +và mọi thứ giờ trông thẳng hàng hơn rất nhiều. + +87 +00:05:38,190 --> 00:05:43,190 +Bây giờ việc căn chỉnh không hoàn hảo vì nút tạo mật khẩu thực sự chỉ + +88 +00:05:43,230 --> 00:05:46,080 +được phép ở kích thước mà nó cần. + +89 +00:05:46,620 --> 00:05:50,700 +Và tôi đã mày mò với một số chiều rộng và tất nhiên, bạn có thể thử chiều + +90 +00:05:50,760 --> 00:05:55,620 +rộng của riêng mình và di chuyển nó xung quanh một chút để xem bạn có thể thay đổi nó hay không. + +91 +00:05:56,640 --> 00:05:59,750 +Nhưng tôi nghĩ về cái nhìn tổng thể, điều này không tệ. + +92 +00:06:00,410 --> 00:06:05,360 +Điều duy nhất tôi muốn nói thêm là có lẽ khoảng 20 cái đệm xung quanh cửa sổ của + +93 +00:06:05,360 --> 00:06:09,290 +chúng tôi thực sự là không đủ. Có lẽ chúng ta cần tăng nó lên một chút. + +94 +00:06:09,680 --> 00:06:10,520 +Nếu bạn + +95 +00:06:10,550 --> 00:06:15,010 +muốn, bạn thực sự có thể thay đổi vùng đệm thành 50 để bạn có được nhiều + +96 +00:06:15,010 --> 00:06:18,490 +khoảng trắng hơn một chút và nó trông đỡ bận hơn một chút. + +97 +00:06:19,270 --> 00:06:22,360 +Vì vậy, đây là thiết kế cuối cùng mà chúng tôi đang cố gắng hoàn thiện. + +98 +00:06:22,810 --> 00:06:26,080 +Và bây giờ chúng tôi đã thiết lập tất cả giao diện người dùng của + +99 +00:06:26,410 --> 00:06:29,260 +mình, tất cả những gì còn lại cần làm là thêm chức năng. + +100 +00:06:30,160 --> 00:06:32,590 +Và đó là những gì chúng ta sẽ làm trong các bài học sắp tới. + +101 +00:06:32,920 --> 00:06:35,770 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Challenge 3 - Saving Data to File.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Challenge 3 - Saving Data to File.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..511de3ed9d266d79b8d19ead0b7306550b41a721 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Challenge 3 - Saving Data to File.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bc11658ac9c5101e0920ca61dcecd3ee7c84dff9b0601fba56b441809ed2202 +size 111672175 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Challenge 3 - Saving Data to File_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Challenge 3 - Saving Data to File_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b4c4f074d9f8642f487db5ac39e9c37bb577e9fe --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Challenge 3 - Saving Data to File_vi.srt @@ -0,0 +1,804 @@ +1 +00:00:00,390 --> 00:00:04,320 +Bây giờ giao diện người dùng đã được thiết lập xong, đã đến lúc chuyển sang bước tiếp + +2 +00:00:04,590 --> 00:00:09,030 +theo, nơi chúng ta thực sự có thể bắt đầu lưu một số dữ liệu này mà người dùng đang nhập. + +3 +00:00:09,810 --> 00:00:12,870 +Vì vậy, có một số điều tôi muốn cho bạn thấy trước khi chúng ta bắt đầu. + +4 +00:00:13,380 --> 00:00:16,920 +Đầu tiên, hãy chú ý cách chúng tôi chạy mã của mình vào lúc này, nó sẽ khởi chạy + +5 +00:00:17,280 --> 00:00:18,900 +ứng dụng của chúng tôi như thế nào. + +6 +00:00:19,050 --> 00:00:24,000 +Nhưng sẽ không hay nếu con trỏ đã nằm trong hộp văn bản đầu tiên? Điều đó có nghĩa là người dùng + +7 +00:00:24,000 --> 00:00:27,600 +có thể bắt đầu nhập ngay lập tức khi họ khởi + +8 +00:00:27,600 --> 00:00:32,189 +chạy trình quản lý mật khẩu. Để làm điều đó, tất nhiên bạn có thể tìm hiểu + +9 +00:00:32,250 --> 00:00:37,250 +các tài liệu, nhưng cách dễ nhất là nắm giữ mục nhập trang web đó và sau đó gọi một phương pháp trên + +10 +00:00:38,190 --> 00:00:39,750 +đó được gọi là tiêu điểm. + +11 +00:00:40,170 --> 00:00:43,950 +Và điều này sẽ tập trung con trỏ vào mục nhập cụ thể đó. + +12 +00:00:44,220 --> 00:00:45,540 +Và bạn có thể thấy điều đó ngay tại đó. + +13 +00:00:46,500 --> 00:00:50,370 +Bây giờ, điều tuyệt vời tiếp theo là khi bạn đăng ký rất nhiều trang + +14 +00:00:50,370 --> 00:00:52,530 +web, ít nhất là trong trường hợp của + +15 +00:00:52,890 --> 00:00:55,860 +tôi, tôi thường chỉ sử dụng một email để đăng ký. + +16 +00:00:56,160 --> 00:01:01,160 +Vì vậy, sẽ thật tuyệt nếu khi chúng tôi khởi chạy trình quản lý mật khẩu của mình mà trường email + +17 +00:01:01,800 --> 00:01:06,030 +này đã được điền sẵn với email được sử dụng phổ biến nhất của chúng tôi? + +18 +00:01:06,660 --> 00:01:06,930 +Chà, + +19 +00:01:06,930 --> 00:01:11,850 +chúng ta có thể làm điều đó bằng cách chỉ cần thêm một giá trị bắt đầu vào mục nhập email đó. + +20 +00:01:12,570 --> 00:01:17,280 +Và cách chúng tôi làm điều đó là thông qua một phương thức được gọi là chèn. + +21 +00:01:17,760 --> 00:01:21,180 +Bây giờ chèn nó có hai tham số. Và trên thực tế, + +22 +00:01:21,180 --> 00:01:26,180 +bạn thực sự có thể cuộn xuống phương thức chèn và bạn có thể thấy nó + +23 +00:01:26,430 --> 00:01:29,130 +mô tả chi tiết rằng nó cần một chỉ + +24 +00:01:29,550 --> 00:01:34,550 +mục và cả chuỗi mà bạn muốn chèn. Cách hoạt động của chỉ mục là về cơ bản + +25 +00:01:36,030 --> 00:01:37,950 +nó ở vị trí của con trỏ. + +26 +00:01:38,490 --> 00:01:43,490 +Nếu bạn muốn chèn nó vào đầu của mục email đó, thì bạn có thể chỉ + +27 +00:01:44,430 --> 00:01:45,750 +cần điền số không. + +28 +00:01:45,780 --> 00:01:50,700 +Về cơ bản, điều đó sẽ chèn đoạn văn bản này vào ký tự thứ 0 đầu tiên. + +29 +00:01:51,390 --> 00:01:55,860 +Ngoài ra, có một chỉ mục hữu ích khác được gọi là end. + +30 +00:01:56,430 --> 00:02:01,200 +Và kết thúc này đến từ hằng số tkinter và nó chỉ là hằng số + +31 +00:02:01,200 --> 00:02:05,430 +sẽ đại diện cho ký tự cuối cùng bên trong mục nhập đó. + +32 +00:02:05,940 --> 00:02:08,250 +Ví dụ: nếu bên trong mục nhập của bạn, bạn đã + +33 +00:02:08,250 --> 00:02:12,750 +có một số văn bản và bạn muốn chèn nó vào sau văn bản của mình ở đây, thì bạn + +34 +00:02:12,870 --> 00:02:14,910 +sẽ sử dụng chỉ mục làm phần cuối. + +35 +00:02:15,300 --> 00:02:17,430 +Nhưng nếu bạn muốn chèn nó ngay từ đầu, thì + +36 +00:02:17,490 --> 00:02:21,390 +bạn sẽ sử dụng chỉ mục bằng không. Bây giờ trong trường hợp của chúng tôi, điều + +37 +00:02:21,450 --> 00:02:25,020 +đó thực sự không thành vấn đề vì mục nhập email của chúng tôi sẽ bắt + +38 +00:02:25,020 --> 00:02:26,190 +đầu trống hoàn toàn. + +39 +00:02:26,490 --> 00:02:29,910 +Vì vậy, tôi sẽ chọn chèn đoạn văn bản này ngay + +40 +00:02:30,390 --> 00:02:34,980 +từ đầu và văn bản mà tôi sẽ chèn chỉ là một email giả ví dụ. + +41 +00:02:35,010 --> 00:02:38,250 +Đây không phải là email thực của tôi, nhưng trong trường hợp của + +42 +00:02:38,310 --> 00:02:40,140 +bạn, nếu bạn đang tạo trình quản + +43 +00:02:40,200 --> 00:02:45,090 +lý mật khẩu của riêng mình, thì bạn có thể đặt email của chính mình xuống để mỗi khi bạn + +44 +00:02:45,180 --> 00:02:49,140 +chạy ứng dụng, nó sẽ bắt đầu được điền trước khi email đó bạn đã có. + +45 +00:02:50,460 --> 00:02:55,460 +Vì vậy, phần còn lại của thử thách sẽ phụ thuộc vào bạn. Bên trong phần lưu mật khẩu này, + +46 +00:02:56,460 --> 00:02:59,130 +những gì tôi muốn bạn làm là có + +47 +00:02:59,470 --> 00:03:03,880 +thể lấy các đầu vào được đưa vào mục nhập trang web, mục nhập + +48 +00:03:03,880 --> 00:03:07,240 +email và mục nhập mật khẩu, và khi người dùng nhấp + +49 +00:03:07,780 --> 00:03:10,690 +vào nút thêm này, tôi muốn bạn bằng cách nào + +50 +00:03:11,230 --> 00:03:16,230 +đó tìm ra cách lưu dữ liệu đó vào một tệp được gọi là dữ liệu. txt. + +51 +00:03:18,010 --> 00:03:18,843 +Dữ liệu này. txt sẽ lấy + +52 +00:03:19,270 --> 00:03:23,500 +trang web mà người dùng đã nhập, email mà họ + +53 +00:03:23,740 --> 00:03:27,730 +đã nhập và mật khẩu mà họ đã nhập và nó sẽ đưa nó vào đây với một khoảng + +54 +00:03:28,120 --> 00:03:32,440 +trắng ở giữa và một ký hiệu ống dẫn mà bạn có thể tìm thấy trên bàn phím của mình. Hoặc trên thực tế, bạn có thể định dạng tệp này theo cách bạn muốn + +55 +00:03:32,440 --> 00:03:36,370 +vì vào cuối ngày, bạn sẽ + +56 +00:03:36,400 --> 00:03:37,720 +là người nhìn vào + +57 +00:03:38,020 --> 00:03:41,080 +tệp này để tìm email và mật khẩu của mình. Vì vậy, hãy định dạng nó theo cách phù hợp với bạn. + +58 +00:03:41,080 --> 00:03:44,140 +Nhưng về cơ bản, những gì + +59 +00:03:45,250 --> 00:03:50,250 +chúng tôi muốn làm là vận chuyển những thứ mà người dùng nhập vào đây, trang web có + +60 +00:03:50,710 --> 00:03:51,543 +mật khẩu + +61 +00:03:51,610 --> 00:03:56,610 +này, email và mật khẩu của họ và thời điểm họ nhấn nút thêm này để kích hoạt + +62 +00:03:57,970 --> 00:04:02,140 +một số loại chức năng giúp lưu điều này thông tin thành một dữ liệu. tệp txt. + +63 +00:04:02,140 --> 00:04:06,550 +Và định dạng đó là thông tin như thế này. + +64 +00:04:06,910 --> 00:04:08,920 +Và mỗi khi người dùng + +65 +00:04:09,310 --> 00:04:12,640 +thêm một mục nhập khác, nó sẽ được thêm vào + +66 +00:04:12,850 --> 00:04:17,560 +một dòng mới và nó sẽ được thêm vào cuối mục nhập trước đó. + +67 +00:04:17,560 --> 00:04:18,670 +Vì vậy, tôi biết + +68 +00:04:19,360 --> 00:04:23,620 +rằng đã một thời gian ngắn kể từ lần cuối chúng tôi xử lý việc ghi vào hồ sơ. Vì vậy, tôi sẽ liên kết đến tài liệu có liên quan đến thử thách này. + +69 +00:04:23,620 --> 00:04:28,300 +Một là cách ghi vào tệp bằng Python và bạn có thể + +70 +00:04:28,660 --> 00:04:32,830 +xem mã demo mà bạn có thể chạy và bạn có thể dùng thử, sau đó bạn sẽ định dạng mã đó + +71 +00:04:32,830 --> 00:04:34,990 +để hoạt động cho trường hợp cụ thể của mình. Bây giờ, thứ còn lại là + +72 +00:04:35,260 --> 00:04:39,010 +widget mục nhập tkinter. + +73 +00:04:39,010 --> 00:04:41,830 +Vì vậy, có phương pháp chèn sẽ khá hữu ích. + +74 +00:04:42,130 --> 00:04:45,550 +Nhưng điều khác mà bạn muốn xảy ra là một khi + +75 +00:04:45,970 --> 00:04:50,110 +bạn nhấn nút thêm, bạn muốn tất cả thông tin này ngoài email được xóa. + +76 +00:04:50,440 --> 00:04:54,520 +Vì vậy, bạn có thể cũng sẽ phải xem xét chức năng xóa. + +77 +00:04:54,970 --> 00:04:59,970 +Và ở trên cùng, bạn có thể thấy nó thậm chí còn chỉ cho bạn cách xóa hoàn toàn nội dung nào + +78 +00:05:00,760 --> 00:05:01,900 +đó khỏi mục nhập. + +79 +00:05:01,930 --> 00:05:06,930 +Sử dụng hai phần tài liệu này. + +80 +00:05:07,780 --> 00:05:11,290 +Tôi muốn bạn có thể lấy thông tin này, + +81 +00:05:11,950 --> 00:05:13,900 +đưa nó vào dữ liệu. tệp txt và sau đó, xóa sạch mục nhập trang web này + +82 +00:05:14,020 --> 00:05:15,940 +và mục nhập mật khẩu. + +83 +00:05:16,300 --> 00:05:21,130 +Vì vậy, đó là tất cả những gì cần làm. Sẽ có khá nhiều đoạn mã viết. + +84 +00:05:21,610 --> 00:05:25,630 +Vì vậy, bạn có một suy nghĩ về nó và tiếp tục và hoàn thành thử thách này. + +85 +00:05:25,870 --> 00:05:29,350 +Tôi sẽ đợi bạn và sau đó chúng ta sẽ cùng nhau giải quyết. + +86 +00:05:29,770 --> 00:05:32,860 +Vì vậy, điều đầu tiên tôi cần xảy ra + +87 +00:05:37,240 --> 00:05:42,100 +là khi người dùng nhấn vào nút thêm, tôi cần kích hoạt một chức năng. Vì vậy, trong add_button này, tôi cũng sẽ thêm một lệnh và tôi sẽ + +88 +00:05:42,160 --> 00:05:45,670 +gọi hàm lưu của mình. + +89 +00:05:45,730 --> 00:05:50,730 +Vì vậy, tôi sẽ đặt chức năng đó bên trong phần lưu mật khẩu. + +90 +00:05:51,190 --> 00:05:55,090 +Bây giờ, hàm lưu này sẽ + +91 +00:05:55,990 --> 00:06:00,740 +ghi vào một tệp được gọi là dữ liệu. txt, hay trên thực tế, bạn có thể gọi nó là bất cứ thứ gì + +92 +00:06:00,740 --> 00:06:02,480 +bạn muốn. Bên trong chức năng + +93 +00:06:02,630 --> 00:06:07,250 +lưu, chúng tôi muốn có thể ghi vào một tệp cụ thể. + +94 +00:06:07,310 --> 00:06:10,130 +Vì vậy, chúng ta cần mở tệp và sau đó chúng ta cần ghi vào nó. + +95 +00:06:10,370 --> 00:06:13,640 +Và chúng ta có thể sử dụng tùy chọn a, để thêm vào cuối tệp. + +96 +00:06:14,000 --> 00:06:18,050 +Hoặc ghi, ghi đè bất kỳ nội dung hiện + +97 +00:06:18,350 --> 00:06:22,280 +có hoặc đọc, chỉ đọc tệp thực tế. Bây giờ trong trường hợp của chúng tôi, mỗi khi chúng tôi thêm một mật khẩu mới, chúng tôi muốn + +98 +00:06:22,310 --> 00:06:25,520 +thêm nó vào các mật khẩu trước đó. + +99 +00:06:25,550 --> 00:06:30,110 +Vì vậy, chúng tôi sẽ cần phần phụ này. + +100 +00:06:30,350 --> 00:06:32,000 +Vì vậy, hãy tiếp tục và + +101 +00:06:33,110 --> 00:06:35,630 +mở một tệp mà chúng ta sẽ gọi là dữ liệu. txt và chúng tôi sẽ mở nó bằng + +102 +00:06:35,660 --> 00:06:40,660 +cách sử dụng chế độ nối thêm. Bây giờ, hãy nhớ rằng khi bạn đang mở + +103 +00:06:41,330 --> 00:06:43,010 +một tệp bằng + +104 +00:06:43,010 --> 00:06:48,010 +chế độ nối thêm hoặc chế độ ghi và tệp đó không tồn tại, bạn chỉ cần tạo nó. + +105 +00:06:48,350 --> 00:06:51,500 +Chúng tôi sẽ mở cái này và bạn có thể lưu nó + +106 +00:06:52,220 --> 00:06:56,270 +vào một tên tệp, vì vậy bạn có thể làm như thế này data_file = open, hoặc + +107 +00:06:56,270 --> 00:06:59,720 +bạn có thể nhớ rằng trước đây chúng ta đã nói về từ khóa with. + +108 +00:07:00,230 --> 00:07:05,000 +Vì vậy, chúng ta có thể nói với việc mở tệp dữ liệu cụ thể này làm tệp dữ liệu của chúng ta. + +109 +00:07:05,480 --> 00:07:10,480 +Và điều này cho phép chúng tôi làm là nó sẽ tự động + +110 +00:07:12,380 --> 00:07:17,380 +đóng tệp này mà chúng tôi không cần phải ghi tệp sau đó. gần. + +111 +00:07:18,050 --> 00:07:21,110 +Vì vậy, đó là một cách tốt hơn nhiều để làm việc với các tệp. + +112 +00:07:22,100 --> 00:07:25,220 +Nhưng nếu bạn không nhớ từ khóa + +113 +00:07:26,030 --> 00:07:27,830 +with, đừng lo lắng. Sử dụng mở sẽ vẫn hoạt động. Bây giờ, khi chúng tôi đã mở + +114 +00:07:27,860 --> 00:07:31,340 +dữ liệu của mình. txt trong chế độ nối thêm, + +115 +00:07:31,370 --> 00:07:34,760 +bước tiếp theo là thực sự thêm các phần dữ liệu. Bây giờ, làm cách nào để chúng + +116 +00:07:34,880 --> 00:07:39,260 +ta có được dữ liệu từ các mục nhập của mình? Chà, đó là nơi mà tài + +117 +00:07:39,290 --> 00:07:43,640 +liệu nhập cảnh có ích. + +118 +00:07:43,640 --> 00:07:47,000 +Và bạn có thể thấy ngay ở trên cùng, nó cho bạn + +119 +00:07:47,510 --> 00:07:49,460 +biết rằng để tìm nạp văn + +120 +00:07:49,460 --> 00:07:53,600 +bản mục nhập hiện tại, hãy sử dụng phương thức get, vì vậy mục nhập. lấy. + +121 +00:07:53,840 --> 00:07:55,370 +Chúng tôi có + +122 +00:07:56,000 --> 00:08:00,500 +thể nắm giữ trang web của mình bằng cách nắm giữ mục nhập trang web và sau đó gọi điện. lấy. + +123 +00:08:00,500 --> 00:08:01,760 +Và sau đó chúng ta có thể làm tương tự cho email và mật khẩu. + +124 +00:08:02,270 --> 00:08:05,510 +Khi chúng tôi đã có tất cả các phần văn bản này, + +125 +00:08:07,400 --> 00:08:10,550 +thì chúng tôi sẽ viết nó vào tệp của mình. + +126 +00:08:10,940 --> 00:08:13,790 +Vì vậy, data_file của chúng tôi. viết và những gì chúng ta sẽ viết là + +127 +00:08:14,030 --> 00:08:17,000 +một chuỗi mà tôi + +128 +00:08:17,540 --> 00:08:20,420 +sẽ định dạng bằng cách sử dụng một chuỗi f. + +129 +00:08:20,450 --> 00:08:22,520 +Và đầu tiên tôi sẽ đưa + +130 +00:08:22,850 --> 00:08:27,850 +vào trang web, sau đó là dấu cách và ký hiệu đường ống, dấu cách, sau đó + +131 +00:08:28,340 --> 00:08:31,160 +là email và cuối cùng, sẽ là mật khẩu. Hãy kiểm tra điều này, hãy chạy nó + +132 +00:08:33,679 --> 00:08:38,030 +và xem nó có hoạt + +133 +00:08:38,030 --> 00:08:39,830 +động 1: phải không? + +134 +00:08:42,730 --> 00:08:46,990 +0: Giả sử chúng tôi đang đăng ký Amazon, tôi sẽ sử dụng + +135 +00:08:47,080 --> 00:08:51,130 +tên người dùng bình thường của mình và tôi sẽ tạo một mật khẩu siêu không an toàn, mà bạn không bao giờ nên sử dụng. + +136 +00:08:51,130 --> 00:08:52,420 +Nhưng bây giờ tôi sẽ nhấp vào thêm. Và sau khi tôi nhấp vào + +137 +00:08:52,720 --> 00:08:57,060 +nó, mặc dù chưa có gì xảy ra cho đến nay, nếu chúng + +138 +00:08:57,090 --> 00:08:59,160 +ta nhìn vào bên trong thư mục dự án của mình, bạn + +139 +00:08:59,190 --> 00:09:01,800 +có thể thấy chúng ta đã tạo ra dữ liệu này một cách kỳ diệu. tệp txt. Và bạn có thể thấy nó được định dạng trang web, email và mật khẩu + +140 +00:09:02,100 --> 00:09:06,630 +của chúng tôi, tất cả trong tệp đó. + +141 +00:09:06,630 --> 00:09:10,860 +Vì vậy, đó là một thành công khá nhiều. Bây giờ, điều khác mà tôi đã đề cập là sẽ rất tuyệt + +142 +00:09:11,730 --> 00:09:14,730 +nếu nhận được một + +143 +00:09:14,760 --> 00:09:18,570 +số loại dấu hiệu cho thấy nó hoạt động đúng không? Và để ứng dụng của chúng tôi được chuẩn bị và sẵn sàng cho + +144 +00:09:18,570 --> 00:09:23,250 +phần dữ liệu tiếp theo được nhập. + +145 +00:09:23,250 --> 00:09:25,590 +Vì vậy, chúng tôi muốn xóa bất + +146 +00:09:25,800 --> 00:09:30,330 +kỳ văn bản nào có bên trong mục nhập trang web và mục nhập mật khẩu. Nếu bạn xem lại tài liệu, bạn có thể thấy rằng bạn có thể xóa bất + +147 +00:09:30,330 --> 00:09:35,130 +kỳ thứ gì bên trong mục nhập bằng + +148 +00:09:35,520 --> 00:09:40,290 +cách gọi xóa và yêu cầu nó xóa từ một chỉ mục cụ thể sang chỉ mục khác. + +149 +00:09:40,350 --> 00:09:44,850 +Bây giờ, sẽ có nhiều thông tin chi tiết hơn nếu bạn thực sự cuộn xuống + +150 +00:09:45,270 --> 00:09:50,160 +phương thức thực và nó cho bạn biết rằng nó có hai tham số; đầu tiên và cuối cùng. Đầu tiên là phần bắt đầu của phạm vi và cuối cùng + +151 +00:09:50,160 --> 00:09:55,160 +là phần cuối của phạm vi. + +152 +00:09:55,950 --> 00:09:59,580 +Và nó cho bạn biết rằng nếu bạn bỏ qua nó, nó sẽ chỉ xóa một ký tự. + +153 +00:09:59,850 --> 00:10:03,600 +Vì vậy, đó không phải là những gì chúng tôi muốn. + +154 +00:10:03,600 --> 00:10:05,010 +Chúng tôi muốn nó xóa tất cả các ký tự trong một mục cụ thể. + +155 +00:10:05,400 --> 00:10:09,540 +Vì vậy, hãy bắt đầu với mục nhập trang web của chúng tôi, gọi xóa + +156 +00:10:09,900 --> 00:10:14,100 +trên đó, và chúng tôi sẽ bắt đầu từ chỉ mục 0 và đi đến cuối cùng. Giống như cách chúng tôi sử dụng chỉ mục của mình khi + +157 +00:10:14,580 --> 00:10:19,580 +chèn email của mình vào mục + +158 +00:10:20,430 --> 00:10:23,160 +nhập email, chúng tôi di chuyển con + +159 +00:10:23,370 --> 00:10:27,120 +trỏ đến đầu, ký tự thứ 0 trong mục nhập đó. + +160 +00:10:27,360 --> 00:10:32,310 +Trong trường hợp này, chúng tôi sẽ xóa từ ký + +161 +00:10:32,730 --> 00:10:36,390 +tự số 0 đến cuối mục nhập. + +162 +00:10:36,390 --> 00:10:38,310 +Và sau đó chúng ta có thể làm + +163 +00:10:39,420 --> 00:10:42,060 +tương tự cho mục nhập mật khẩu của mình, 1: phải không? + +164 +00:10:42,650 --> 00:10:43,483 +0: Và bây + +165 +00:10:45,050 --> 00:10:46,970 +giờ nếu chúng tôi chạy mã này, bạn + +166 +00:10:47,000 --> 00:10:52,000 +có thể thấy rằng sau khi tôi nhập một cái gì đó vào và hãy tạo một mật khẩu xấu khác Qwerty. Và nhân tiện, nếu tôi gọi ra bất kỳ mật khẩu nào của bạn, chỉ vì lợi ích + +167 +00:10:52,310 --> 00:10:55,460 +của tôi, ừm, và chắc + +168 +00:10:55,490 --> 00:11:00,110 +chắn là vì sự bảo mật của chính bạn, hãy tiếp tục và thay đổi nó. + +169 +00:11:00,410 --> 00:11:03,710 +Đây là những mật khẩu thực sự tồi tệ. Nhưng dù bằng cách nào, tôi sẽ nhấp vào thêm và bạn + +170 +00:11:03,770 --> 00:11:07,190 +có thể thấy khoảnh khắc + +171 +00:11:07,280 --> 00:11:11,270 +tôi nhấp vào rằng trang web của tôi và các mục nhập mật khẩu của + +172 +00:11:11,270 --> 00:11:16,250 +tôi hiện đã bị xóa và bây giờ nó đã sẵn sàng để thực hiện mục nhập tiếp theo. Và trở lại dữ liệu của tôi. txt, bây giờ tôi đã có một mục + +173 +00:11:16,340 --> 00:11:20,780 +nhập khác. + +174 +00:11:20,780 --> 00:11:21,680 +Nhưng hãy lưu + +175 +00:11:22,070 --> 00:11:26,030 +ý điều này, nó đã được thêm vào cuối mục trước, nhưng nó nằm trên cùng một dòng. Đó là một chút khó hiểu. + +176 +00:11:26,390 --> 00:11:30,440 +Bây giờ bạn có thể nhớ ký tự + +177 +00:11:30,980 --> 00:11:35,870 +đặc biệt này là \ n, và điều đó cho phép chúng tôi nhập mọi thứ vào một dòng mới. + +178 +00:11:36,470 --> 00:11:40,310 +Hãy xóa mọi thứ mà chúng ta có ở đây cho + +179 +00:11:40,850 --> 00:11:45,850 +đến nay và hãy nhấn lưu để chúng ta có thể bắt đầu lại từ đầu. + +180 +00:11:46,490 --> 00:11:48,110 +Bây giờ chúng ta hãy chạy chương trình của chúng ta với dòng mới được chèn vào. + +181 +00:11:48,650 --> 00:11:52,400 +Và nếu tôi tiếp tục và thêm trang web và để tôi + +182 +00:11:53,890 --> 00:11:58,890 +nghĩ ra một mật khẩu xấu khác, ừm, mật khẩu là một mật khẩu thực sự khủng khiếp. Bây giờ, nếu tôi nhấp vào thêm, bạn sẽ + +183 +00:11:59,650 --> 00:12:04,060 +nhận thấy rằng các + +184 +00:12:04,060 --> 00:12:05,440 +trường đó + +185 +00:12:05,500 --> 00:12:10,500 +biến mất và mật khẩu được thêm vào đây. Bây giờ, nếu tôi thử và thêm một giá trị khác vào đây, giả sử-- thì bạn + +186 +00:12:10,630 --> 00:12:14,260 +có thể thấy rằng giá trị + +187 +00:12:14,650 --> 00:12:19,650 +tiếp theo được thêm vào ở dòng tiếp theo, tốt hơn rất nhiều về mặt định dạng. + +188 +00:12:21,640 --> 00:12:23,890 +Đây chỉ là những điều nhỏ nhặt giúp mọi thứ trông ngăn nắp và gọn gàng. + +189 +00:12:24,670 --> 00:12:27,910 +Nhưng phần lớn là ghi nhớ cách lưu mọi thứ + +190 +00:12:28,450 --> 00:12:33,450 +vào một tệp và sử dụng tài liệu để nắm giữ các giá trị bên trong + +191 +00:12:35,200 --> 00:12:40,200 +các mục nhập của chúng tôi và đưa nó vào tệp dữ liệu của chúng tôi. + +192 +00:12:40,750 --> 00:12:41,650 +Một trong những + +193 +00:12:43,210 --> 00:12:47,410 +điều bạn có thể nhận ra đó là trải nghiệm người dùng tồi tệ khi người dùng nhập + +194 +00:12:47,410 --> 00:12:51,250 +một phần dữ liệu, chẳng hạn như trang web và mật khẩu và họ nhấp vào thêm. Mọi thứ sắp biến mất, nhưng họ không thực sự xác nhận rằng + +195 +00:12:51,250 --> 00:12:56,250 +điều này, trên thực tế, đã hoạt động. + +196 +00:13:00,010 --> 00:13:05,010 +Vì vậy, trong bài học tiếp theo, chúng ta sẽ xem xét cách chúng ta có thể tạo một số + +197 +00:13:06,340 --> 00:13:07,840 +cửa sổ bật lên để + +198 +00:13:07,900 --> 00:13:11,350 +có thể cho người dùng thấy kết quả của hành động của họ. + +199 +00:13:11,350 --> 00:13:14,170 +Chúng tôi có thể cho họ biết liệu nó có thành công hay + +200 +00:13:14,440 --> 00:13:18,820 +không, hãy yêu cầu họ xác nhận xem liệu họ có hài lòng với việc nhập dữ liệu đó hay không. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ + +201 +00:13:18,850 --> 00:13:23,650 +gặp bạn trong bài học tiếp theo. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Entry-Widget-Docs-on-tkdocs.com.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Entry-Widget-Docs-on-tkdocs.com.url new file mode 100644 index 0000000000000000000000000000000000000000..b730ec5dd7fc8fa461c74eba20d8334d16643a5e --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 Entry-Widget-Docs-on-tkdocs.com.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://tkdocs.com/tutorial/widgets.html#entry \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 w3schools-Python-Writing-to-File-Documentation.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 w3schools-Python-Writing-to-File-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..be5ded725886726c84d965c0285f41fb78a76e35 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/005 w3schools-Python-Writing-to-File-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/python_file_write.asp \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/006 Dialog Boxes and Pop-Ups in Tkinter.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/006 Dialog Boxes and Pop-Ups in Tkinter.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..42bdac55bafe02794c0fa84efa67eab3a6f1bf98 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/006 Dialog Boxes and Pop-Ups in Tkinter.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7c0300b18896c56e24759cce96909ae2f968a1b71e0548f9dd925d961948882 +size 60744264 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/006 Dialog Boxes and Pop-Ups in Tkinter_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/006 Dialog Boxes and Pop-Ups in Tkinter_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..70a0be17cf54cc3c39c802d83ec0524df3d0aaa8 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/006 Dialog Boxes and Pop-Ups in Tkinter_vi.srt @@ -0,0 +1,560 @@ +1 +00:00:00,330 --> 00:00:01,589 +Bây giờ trong bài học + +2 +00:00:01,650 --> 00:00:05,670 +trước, chúng ta đã quản lý để trình quản lý mật khẩu bắt đầu lưu dữ liệu mà chúng + +3 +00:00:05,670 --> 00:00:08,189 +ta đang nhập vào bên trong trình quản lý mật khẩu. + +4 +00:00:08,790 --> 00:00:12,810 +Và chúng tôi đã định dạng nó và đưa nó vào bên trong dữ liệu của chúng tôi. txt. + +5 +00:00:13,590 --> 00:00:18,860 +Bây giờ, một trong những điều gây ra một chút vấn đề về trải nghiệm người dùng là bất cứ + +6 +00:00:19,380 --> 00:00:24,380 +khi nào người dùng thực sự nhập thông tin chi tiết của họ vào trình quản lý mật khẩu + +7 +00:00:25,590 --> 00:00:26,423 +này vào + +8 +00:00:26,460 --> 00:00:30,900 +lúc này, nó thực sự không cung cấp cho bạn một số cách để biết rằng nó + +9 +00:00:30,990 --> 00:00:31,890 +đã thành công hoặc + +10 +00:00:32,340 --> 00:00:37,110 +nếu không, hoặc thực sự yêu cầu họ kiểm tra và xác minh rằng dữ liệu mà họ + +11 +00:00:37,410 --> 00:00:41,010 +đã nhập chắc chắn là dữ liệu mà họ muốn lưu vào tệp. + +12 +00:00:41,820 --> 00:00:43,080 +Để làm được điều này, + +13 +00:00:43,170 --> 00:00:46,260 +chúng ta sẽ tìm hiểu về một thứ khác mà bạn có thể làm với + +14 +00:00:46,740 --> 00:00:48,960 +tkinter, một thứ được gọi là hộp thoại tiêu chuẩn. + +15 +00:00:49,260 --> 00:00:53,460 +Về cơ bản, đây là các cửa sổ bật lên mà chương trình tkinter của bạn có thể tạo ra. + +16 +00:00:53,970 --> 00:00:58,350 +Và một trong những hộp thoại tiêu chuẩn phổ biến nhất là các hộp thông báo. + +17 +00:00:58,980 --> 00:01:02,520 +Và thực sự, rất dễ dàng để tạo các cửa sổ bật lên này. + +18 +00:01:02,970 --> 00:01:06,390 +Bạn có thể chỉ cần nhập mô-đun hộp thông báo và + +19 +00:01:06,660 --> 00:01:11,370 +bạn có thể nhấn vào các phương pháp như hiển thị thông tin hoặc hiển thị + +20 +00:01:11,730 --> 00:01:15,810 +cảnh báo, hiển thị lỗi hoặc bạn có thể hỏi người dùng có + +21 +00:01:15,810 --> 00:01:19,560 +không hoặc OK hoặc hủy, đặt câu hỏi có hoặc không, yêu + +22 +00:01:19,980 --> 00:01:22,380 +cầu thử lại hoặc sự hủy bỏ. + +23 +00:01:23,160 --> 00:01:26,790 +Bây giờ là ảnh chụp màn hình được tạo trong phiên bản Windows của Thụy Điển, nhưng chúng + +24 +00:01:26,910 --> 00:01:31,620 +tôi thực sự có thể tự mình thử các ảnh này và bắt đầu đưa vào một số hộp thoại tiêu chuẩn để + +25 +00:01:31,620 --> 00:01:34,410 +chúng tôi có thể cung cấp cho người dùng một số phản hồi. + +26 +00:01:35,070 --> 00:01:39,090 +Điều mà chúng tôi thực sự muốn nói với người dùng là thời + +27 +00:01:39,090 --> 00:01:43,830 +điểm mà chức năng lưu được gọi là do họ đã nhấn vào nút thêm ở đây. + +28 +00:01:44,430 --> 00:01:49,430 +Nhưng trước khi thực sự cam kết tất cả thông tin hiện tại vào tệp, chúng tôi muốn + +29 +00:01:50,130 --> 00:01:54,060 +kiểm tra và đảm bảo rằng họ thực sự hài lòng với những gì họ + +30 +00:01:54,060 --> 00:01:54,893 +đã viết. + +31 +00:01:55,110 --> 00:01:59,220 +Vì vậy, chúng tôi có thể tạo một hộp thông báo ở đây và yêu cầu họ kiểm tra + +32 +00:01:59,220 --> 00:02:02,700 +các chi tiết mà họ đã nhập và sau đó nhấn có hoặc không để xem + +33 +00:02:02,700 --> 00:02:06,300 +liệu họ có muốn lưu nó hay không. Để sử dụng hộp tin nhắn, chúng + +34 +00:02:06,330 --> 00:02:10,050 +ta thực sự phải nhập hộp tin nhắn. Một lần nữa, + +35 +00:02:10,050 --> 00:02:15,050 +từ mô-đun tkinter mà chúng tôi sẽ nhập mô-đun hộp thư. + +36 +00:02:16,200 --> 00:02:20,280 +Bây giờ hãy để ý xem đây thực sự không phải là một lớp như thế nào. Vì vậy, đó là lý do tại + +37 +00:02:20,310 --> 00:02:24,510 +sao, mặc dù chúng tôi đã nói * có nghĩa là nhập mọi thứ, + +38 +00:02:24,870 --> 00:02:29,340 +nhưng nó thực sự chỉ nhập tất cả các lớp, hằng số, nhưng nó không nhập + +39 +00:02:29,580 --> 00:02:32,340 +những thứ như hộp thông báo, mà chỉ đơn giản + +40 +00:02:32,580 --> 00:02:36,300 +là một mô-đun mã khác. Và trên thực tế, nếu + +41 +00:02:36,300 --> 00:02:41,010 +bạn nhấp chuột phải vào nó và đi đến phần triển khai ở đây, thì bạn + +42 +00:02:41,430 --> 00:02:46,430 +thực sự có thể thấy hộp thư này. tệp py và cách nó được triển khai. + +43 +00:02:49,110 --> 00:02:53,460 +Tuy nhiên, điều quan trọng là thực sự đưa nó vào sử dụng. Vì vậy, chúng ta có thể sử dụng + +44 +00:02:53,460 --> 00:02:57,210 +hộp thông báo và gọi một phương thức để hiển thị cửa sổ bật lên. + +45 +00:02:57,750 --> 00:03:00,160 +Loại đơn giản nhất chỉ là showinfo + +46 +00:03:00,280 --> 00:03:02,110 +mà bạn chỉ cần nghĩ + +47 +00:03:02,110 --> 00:03:06,430 +về hai điều thực sự; một tiêu đề và cũng là một thông điệp. + +48 +00:03:07,420 --> 00:03:10,720 +Vì vậy, tôi sẽ chỉ đặt tiêu đề là tiêu đề và thông điệp dưới dạng tin nhắn. + +49 +00:03:11,230 --> 00:03:13,480 +Và bạn có thể thấy khi tôi nhấn thêm, + +50 +00:03:13,630 --> 00:03:18,490 +tôi nhận được điều này và nó chỉ có tiêu đề và thông báo và bạn không thể làm gì + +51 +00:03:18,490 --> 00:03:20,290 +khác hơn là nhấp vào OK. + +52 +00:03:22,000 --> 00:03:23,770 +Ngoài showinfo, thực tế còn + +53 +00:03:23,980 --> 00:03:27,850 +rất nhiều phương pháp khác; bạn có thể hỏi có hoặc không, + +54 +00:03:28,240 --> 00:03:33,160 +yêu cầu thử lại hoặc hủy bỏ. Bạn có thể hiển thị lỗi hoặc bạn có thể hiển thị cảnh báo. + +55 +00:03:33,910 --> 00:03:36,910 +Ngoài ra, bạn có thể thực sự hỏi người dùng điều gì đó. + +56 +00:03:36,910 --> 00:03:41,770 +Vì vậy, điều này tạo ra hai nút, có hoặc không, thử lại hoặc hủy, + +57 +00:03:41,800 --> 00:03:46,480 +OK hoặc hủy, đặt câu hỏi cũng có và không, và chúng tôi cũng + +58 +00:03:46,480 --> 00:03:51,190 +có có, không và hủy ở đây. Những gì tôi sẽ làm là tôi sẽ hỏi OK + +59 +00:03:51,190 --> 00:03:52,090 +hoặc hủy bỏ. + +60 +00:03:53,110 --> 00:03:58,110 +Và những gì tôi muốn hỏi người dùng là tôi sẽ đặt tiêu đề là trang web + +61 +00:03:58,960 --> 00:03:59,920 +mà họ đã + +62 +00:04:00,490 --> 00:04:05,490 +nhập để nó đến từ đây, và sau đó tôi sẽ đặt thông báo dưới dạng + +63 +00:04:06,900 --> 00:04:07,690 +chuỗi f. + +64 +00:04:07,690 --> 00:04:12,690 +Vì vậy, tôi sẽ nói đây là các chi tiết đã nhập: \ n. + +65 +00:04:14,590 --> 00:04:17,560 +Và sau đó tôi sẽ cung cấp cho họ email + +66 +00:04:19,180 --> 00:04:24,180 +mà họ đã nhập, sau đó là một dòng mới và mật khẩu mà họ đã nhập. + +67 +00:04:28,000 --> 00:04:35,130 +Và sau dòng mới, tôi sẽ hỏi họ, liệu có ổn để lưu không? + +68 +00:04:35,130 --> 00:04:37,050 +0: Nếu tôi tiếp tục và chạy + +69 +00:04:38,130 --> 00:04:41,400 +mã này, bạn có thể thấy rằng khi tôi nhập một trang + +70 +00:04:41,460 --> 00:04:44,760 +web nói rằng Amaazon và tôi nhập mật khẩu của mình và + +71 +00:04:45,690 --> 00:04:49,620 +nhấp vào thêm, tôi nhận được cửa sổ bật lên và nó cho biết đây + +72 +00:04:50,040 --> 00:04:53,700 +là các chi tiết đã nhập. Đây là email, đây + +73 +00:04:53,700 --> 00:04:56,130 +là mật khẩu, lưu lại được không? + +74 +00:04:56,640 --> 00:04:59,550 +Bây giờ những gì tôi muốn làm là khi họ nhấp vào + +75 +00:04:59,790 --> 00:05:04,350 +OK, sau đó hành động đó được thực hiện và để chúng tôi ghi vào tệp dữ liệu của mình. + +76 +00:05:04,650 --> 00:05:06,360 +Nhưng nếu họ bấm hủy, + +77 +00:05:06,360 --> 00:05:10,260 +tôi muốn họ có thể quay lại màn hình và chỉnh sửa nếu cần. + +78 +00:05:10,920 --> 00:05:12,150 +Để làm điều + +79 +00:05:12,360 --> 00:05:16,020 +đó, chúng ta phải nhận đầu ra từ cuộc gọi phương thức + +80 +00:05:16,350 --> 00:05:19,770 +này, nó sẽ là một boolean. Nó sẽ đúng hoặc sai. + +81 +00:05:19,920 --> 00:05:22,140 +Vì vậy, tôi sẽ đặt nó thành is_ok. + +82 +00:05:23,070 --> 00:05:27,570 +Bây giờ nếu điều này là đúng, thì, trong trường hợp đó, chúng ta sẽ tiếp tục và thực + +83 +00:05:27,600 --> 00:05:30,510 +hiện tất cả những điều này. Vì vậy, ghi + +84 +00:05:30,510 --> 00:05:34,440 +vào tệp và xóa mọi thứ bên trong mục nhập. + +85 +00:05:34,890 --> 00:05:38,850 +Nhưng nếu nó không ổn, thì chúng tôi chỉ đơn giản là sẽ không làm gì cả và + +86 +00:05:39,120 --> 00:05:42,600 +hộp bật lên sẽ tự loại bỏ. Bây giờ, nếu tôi chạy lại + +87 +00:05:42,630 --> 00:05:47,630 +mã này và tôi nhập một số ### và tôi nhấp vào thêm, bạn có thể thấy nếu tôi nhấp vào + +88 +00:05:48,750 --> 00:05:53,610 +hủy, không có gì xảy ra và tôi quay lại. Nhưng nếu tôi nhấp vào OK, thì tất cả + +89 +00:05:53,700 --> 00:05:54,540 +thông tin + +90 +00:05:54,750 --> 00:05:59,750 +đó sẽ được đưa vào dữ liệu của tôi. txt như ở đây. + +91 +00:06:01,910 --> 00:06:06,910 +Bây giờ đã đến lúc bạn làm quen với các hộp thông báo và các hộp thoại tiêu + +92 +00:06:07,070 --> 00:06:07,903 +chuẩn này. + +93 +00:06:08,270 --> 00:06:12,470 +Nhưng công việc của bạn là tìm ra cách chúng ta có thể khiến ứng dụng + +94 +00:06:12,470 --> 00:06:17,390 +của mình có một chút xác thực nào đó bởi vì khi họ có một trang web trống và mật + +95 +00:06:17,390 --> 00:06:18,230 +khẩu trống và họ + +96 +00:06:18,950 --> 00:06:23,900 +nhấp vào thêm, bạn thực sự không nên để họ lưu một mật khẩu trống và trống. trang web, phải + +97 +00:06:23,900 --> 00:06:24,890 +không? Điều đó không đúng. + +98 +00:06:25,340 --> 00:06:29,930 +Vì vậy, chúng tôi muốn kiểm tra xem độ dài của các mục nhập trong trang web + +99 +00:06:29,930 --> 00:06:33,290 +hoặc mật khẩu có bằng không. Và trong trường hợp đó, + +100 +00:06:33,320 --> 00:06:35,720 +chúng tôi sẽ đưa ra một hộp thông báo + +101 +00:06:35,750 --> 00:06:38,120 +sẽ nói với họ về cơ bản rằng, Này, + +102 +00:06:38,450 --> 00:06:42,650 +bạn đã để trống một số trường. Vì vậy, đây là những gì bạn đang hướng tới. + +103 +00:06:42,710 --> 00:06:46,970 +Giả sử rằng bạn đã để trống trang web hoặc mật khẩu và bạn nhấp vào thêm, bạn sẽ nhận + +104 +00:06:47,360 --> 00:06:51,230 +được một cửa sổ bật lên cho bạn biết, Này, đừng để trống bất kỳ trường nào. + +105 +00:06:51,620 --> 00:06:56,620 +Và điều này sẽ kích hoạt khi trang web hoặc mật khẩu trống. + +106 +00:06:57,680 --> 00:07:01,190 +Vì vậy, hãy suy nghĩ về cách bạn có thể giải quyết thách thức đó và bắt đầu. + +107 +00:07:01,660 --> 00:07:02,493 +2: Được rồi. + +108 +00:07:06,640 --> 00:07:10,630 +0: Được rồi. Vì vậy, đây là nơi chúng tôi nhận được tất cả thông tin từ các mục nhập của chúng tôi. + +109 +00:07:10,810 --> 00:07:13,360 +Và đây cũng là thời điểm tốt để thực hiện việc xác nhận này. + +110 +00:07:13,930 --> 00:07:16,120 +Chúng ta có thể sử dụng câu lệnh if + +111 +00:07:16,210 --> 00:07:20,980 +để kiểm tra, nếu chuỗi trang web này có độ dài bằng 0, thì điều đó có nghĩa là người + +112 +00:07:21,400 --> 00:07:23,770 +dùng đã không nhập bất kỳ thứ gì vào đó. + +113 +00:07:24,250 --> 00:07:26,770 +Và chúng ta có thể sử dụng một hoặc câu lệnh + +114 +00:07:26,800 --> 00:07:31,660 +để kiểm tra tốt, nếu mật khẩu cũng có độ dài bằng 0, tốt, trong trường hợp đó, họ cũng + +115 +00:07:31,660 --> 00:07:33,910 +không nhập bất cứ thứ gì vào đó. + +116 +00:07:34,450 --> 00:07:37,240 +Bây giờ bạn cũng có thể thêm xác thực cho email, + +117 +00:07:37,240 --> 00:07:40,660 +nhưng vì chúng tôi đã điền sẵn email nên thực sự không có + +118 +00:07:40,900 --> 00:07:42,190 +nhiều điểm ở đây. + +119 +00:07:42,790 --> 00:07:46,810 +Vì vậy, nếu họ để trống trang web hoặc để trống mật + +120 +00:07:47,110 --> 00:07:51,370 +khẩu, thì chúng ta sẽ tạo một hộp thông báo và chúng ta sẽ + +121 +00:07:51,370 --> 00:07:55,540 +sử dụng hộp thông báo showinfo. Tiêu đề chỉ có nội dung + +122 +00:07:55,960 --> 00:07:59,950 +Rất tiếc và thông báo sẽ cho biết Vui lòng đảm bảo rằng + +123 +00:08:00,880 --> 00:08:03,220 +bạn không để trống bất kỳ trường nào. + +124 +00:08:03,820 --> 00:08:07,270 +Và bây giờ khi bạn chạy mã này, nếu bạn để trống một trong hai mã này, + +125 +00:08:07,480 --> 00:08:10,600 +thì bạn sẽ nhận được một cửa sổ bật lên cho bạn biết điều này. + +126 +00:08:11,170 --> 00:08:16,060 +Bây giờ chúng tôi thực sự không muốn phần còn lại của mã này xảy ra nếu điều này là đúng. + +127 +00:08:16,480 --> 00:08:21,480 +Vì vậy, hãy tiếp tục và thêm một câu lệnh khác để chúng tôi có thể thụt + +128 +00:08:22,300 --> 00:08:26,590 +lề tất cả những điều này để chúng tôi chỉ tiếp tục chuyển + +129 +00:08:27,070 --> 00:08:32,070 +tiếp nếu trên thực tế, độ dài của trang web hoặc mật khẩu không bằng 0. + +130 +00:08:33,730 --> 00:08:37,030 +Vì vậy, trong trường hợp này, khi họ để trống, bạn có thể + +131 +00:08:37,090 --> 00:08:40,690 +nói OK và nó sẽ quay trở lại để bạn tiếp tục nhập thêm chi tiết. + +132 +00:08:42,070 --> 00:08:43,210 +Bây giờ trong bài + +133 +00:08:43,240 --> 00:08:47,380 +học tiếp theo, chúng ta sẽ thêm một phần chức năng khác vào ứng dụng của + +134 +00:08:47,680 --> 00:08:49,480 +chúng ta, đó là tạo mật khẩu. + +135 +00:08:49,780 --> 00:08:53,830 +Chúng tôi đã thấy mật khẩu khủng khiếp như thế nào mà chúng tôi nghĩ ra từ chính + +136 +00:08:53,830 --> 00:08:54,610 +đầu của mình. + +137 +00:08:54,610 --> 00:08:58,900 +Vì vậy, chúng tôi sẽ sử dụng mã tạo mật khẩu mà chúng tôi đã tạo nhiều, nhiều + +138 +00:08:58,900 --> 00:09:01,840 +trăng trước đây như một trong những dự án của chúng tôi + +139 +00:09:01,930 --> 00:09:04,840 +và chúng tôi sẽ nhúng mã đó vào ứng dụng này. + +140 +00:09:05,350 --> 00:09:08,380 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Course-Fixes-Report-an-Issue.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Day-5-Password-Generator-Project-Code.zip b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Day-5-Password-Generator-Project-Code.zip new file mode 100644 index 0000000000000000000000000000000000000000..411f9750de09c8129b21f2df120085e6a0aac678 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Day-5-Password-Generator-Project-Code.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88c4dfd3b1efb88c5891498ee8be9524c128af5f1320e01124a4ca863a0e4453 +size 502 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Generate a Password & Copy it to the Clipboard.mp4 b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Generate a Password & Copy it to the Clipboard.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1e54f29faf2c24995629c6725e2cc553b7a9081c --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Generate a Password & Copy it to the Clipboard.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33f20d4061a2bb833d22b66f29fe67960acfec444dd34cc54ec0407bf7d42f2c +size 117944031 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Generate a Password & Copy it to the Clipboard_vi.srt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Generate a Password & Copy it to the Clipboard_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e0de4b000e356f4a1df824839c6d06b2476eed93 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Generate a Password & Copy it to the Clipboard_vi.srt @@ -0,0 +1,760 @@ +1 +00:00:00,240 --> 00:00:03,870 +Bây giờ những gì có vẻ giống như một thời gian dài trước + +2 +00:00:04,350 --> 00:00:07,530 +đây, chúng tôi đã tạo một dự án tạo mật khẩu. + +3 +00:00:07,620 --> 00:00:12,620 +Vì vậy, đây thực tế là vào ngày thứ 5, nơi chúng tôi lấy ba danh sách, chữ + +4 +00:00:13,110 --> 00:00:14,640 +cái, số và ký hiệu, + +5 +00:00:15,180 --> 00:00:20,010 +và chúng tôi sử dụng nó để tạo danh sách ngẫu nhiên gồm các chữ cái, ký hiệu + +6 +00:00:20,010 --> 00:00:20,843 +và số, + +7 +00:00:21,000 --> 00:00:25,860 +sau đó chúng tôi trộn tất cả chúng lại với nhau và chúng tôi biến nó thành một + +8 +00:00:25,860 --> 00:00:28,320 +chuỗi để tạo một mật khẩu rất an toàn. + +9 +00:00:29,760 --> 00:00:32,009 +Bây giờ tôi đã sửa đổi mã một chút, + +10 +00:00:32,189 --> 00:00:34,970 +để chúng tôi không cần sử dụng bất kỳ đầu vào nào. + +11 +00:00:34,970 --> 00:00:38,190 +Vì vậy, chúng tôi không phải nhập bất cứ thứ gì trong bảng điều khiển. Thay vào đó, tôi + +12 +00:00:38,220 --> 00:00:43,220 +đã tạo một số ngẫu nhiên từ 8 đến 10 để chọn 8 hoặc 10 chữ + +13 +00:00:44,580 --> 00:00:49,470 +cái và sau đó là 2 đến 4 số và 2 đến 4 biểu tượng. + +14 +00:00:50,370 --> 00:00:52,980 +Vì vậy, những gì tôi muốn bạn làm là truy + +15 +00:00:53,220 --> 00:00:54,900 +cập liên kết này có trong tài + +16 +00:00:55,560 --> 00:01:00,560 +nguyên khóa học và chỉ cần sao chép mọi thứ có trong đó vào phần trình tạo mật khẩu + +17 +00:01:01,140 --> 00:01:01,973 +của bạn, + +18 +00:01:02,220 --> 00:01:07,220 +bởi vì chúng tôi sẽ sử dụng mã này trong trình quản lý mật khẩu của chúng tôi. rằng + +19 +00:01:08,070 --> 00:01:09,750 +khi người dùng nhấp vào nút + +20 +00:01:09,780 --> 00:01:14,780 +này, chúng tôi có thể tạo cho họ một mật khẩu ngẫu nhiên và đã điền trước trường đó. + +21 +00:01:14,910 --> 00:01:16,380 +Vì vậy, họ không phải nhập bất + +22 +00:01:16,530 --> 00:01:20,700 +cứ thứ gì và họ không cần phải nghĩ ra một mật khẩu thực sự phức tạp như thế này. + +23 +00:01:21,810 --> 00:01:26,810 +Khi chúng ta đã đặt mã tạo mật khẩu của mình vào phần tạo mật khẩu, hãy + +24 +00:01:27,360 --> 00:01:31,680 +tiếp tục và định dạng lại nó. Vì vậy, chúng ta hãy đặt hàng nhập khẩu của chúng tôi lên hàng đầu. + +25 +00:01:33,660 --> 00:01:37,770 +Và như một thách thức, tôi muốn bạn nhìn vào ba dòng này, nhìn vào những + +26 +00:01:38,190 --> 00:01:39,420 +gì họ đang làm. + +27 +00:01:39,990 --> 00:01:44,990 +Chúng tôi đã tạo một danh sách trống và chúng tôi đang thêm một chữ cái ngẫu nhiên từ danh + +28 +00:01:47,310 --> 00:01:50,100 +sách các chữ cái này. Và sau đó, chúng tôi có + +29 +00:01:50,220 --> 00:01:54,420 +vòng lặp for này về cơ bản tạo ra một phạm vi từ số ngẫu nhiên này, vì vậy bất kỳ + +30 +00:01:54,690 --> 00:01:56,880 +đâu trong khoảng từ 8 đến 10, và sau đó chúng + +31 +00:01:57,420 --> 00:02:02,420 +tôi thêm một ký tự ngẫu nhiên vào danh sách mật khẩu đó. Vì vậy, đây là một cơ hội thực + +32 +00:02:02,790 --> 00:02:06,480 +sự tốt để sử dụng khả năng hiểu danh sách thay vì chúng + +33 +00:02:06,900 --> 00:02:11,400 +ta có thể loại bỏ rất nhiều vòng lặp for này và thực hiện từng + +34 +00:02:11,430 --> 00:02:15,990 +điều này chỉ trong một dòng mã. Đó cũng là một điểm tốt để sửa + +35 +00:02:15,990 --> 00:02:16,890 +đổi một chút. + +36 +00:02:17,520 --> 00:02:22,520 +Tôi muốn bạn suy nghĩ về cách những thứ này hoạt động và xem liệu bạn có thể làm + +37 +00:02:22,530 --> 00:02:27,530 +điều tương tự hay không bằng cách thay đổi ba phần này thành ba phần hiểu danh sách. + +38 +00:02:30,180 --> 00:02:32,640 +Nếu bạn thành công, sau khi bạn chạy + +39 +00:02:32,790 --> 00:02:35,280 +mã, nó sẽ vẫn hoạt động theo cùng một + +40 +00:02:35,580 --> 00:02:39,780 +cách và bạn sẽ thấy một mật khẩu ngẫu nhiên được tạo và in ở đây. + +41 +00:02:40,590 --> 00:02:42,360 +Tạm dừng video và tiếp tục. + +42 +00:02:42,380 --> 00:02:43,213 +1: Được rồi. + +43 +00:02:48,830 --> 00:02:52,490 +0: Được rồi. Vì vậy, những gì tôi sẽ làm là thay vì + +44 +00:02:52,640 --> 00:02:54,830 +tạo một danh sách trống, tôi sẽ tạo ba danh sách mới. + +45 +00:02:55,340 --> 00:03:00,340 +Một sẽ là password_letters và danh sách này sẽ được tạo, tất nhiên, + +46 +00:03:03,340 --> 00:03:03,880 +sử + +47 +00:03:03,880 --> 00:03:08,880 +dụng ít khả năng hiểu hơn và thay thế hai dòng mã này. + +48 +00:03:09,580 --> 00:03:11,320 +Hãy nhớ các định dạng từ khóa của chúng tôi. + +49 +00:03:11,350 --> 00:03:16,350 +Chúng tôi có mục mới của chúng tôi cho mục trong danh sách. + +50 +00:03:17,230 --> 00:03:20,200 +Bây giờ, trong trường hợp này, danh sách của chúng tôi thực sự không phải là danh sách. + +51 +00:03:20,380 --> 00:03:25,330 +Nó thực sự sẽ là một phạm vi bởi vì chúng tôi sẽ tạo một phạm vi + +52 +00:03:25,360 --> 00:03:30,360 +bằng cách sử dụng số ngẫu nhiên này. Vì vậy, chúng tôi tạo ra một phạm vi giữa + +53 +00:03:31,540 --> 00:03:36,010 +số không và số này trừ đi một. Vì vậy, chúng tôi có thể chuyển các chữ cái số của chúng tôi vào đây. + +54 +00:03:37,210 --> 00:03:40,810 +Mỗi mục trong thực tế không quan trọng. + +55 +00:03:40,990 --> 00:03:44,800 +Chúng tôi thực sự không cần sử dụng nó, vì vậy chúng tôi có thể sử dụng một dấu gạch dưới để thay thế nó. + +56 +00:03:45,430 --> 00:03:48,490 +Nhưng điều quan trọng là vật phẩm mới sẽ như thế nào, bởi vì vật phẩm này + +57 +00:03:48,910 --> 00:03:51,880 +sẽ được tạo ra từ ngẫu nhiên. sự lựa chọn và chúng + +58 +00:03:52,210 --> 00:03:57,210 +tôi sẽ chuyển vào danh sách các bức thư của chúng tôi ở đây để chúng tôi chọn + +59 +00:03:58,180 --> 00:04:03,160 +một bức thư ngẫu nhiên và chúng tôi đưa nó vào danh sách mới của chúng tôi, password_letters. + +60 +00:04:03,640 --> 00:04:07,240 +Và sau đó chúng tôi sẽ kiểm tra xem chúng tôi cần làm điều này + +61 +00:04:07,240 --> 00:04:12,240 +bao nhiêu lần bằng cách xem xét phạm vi. Dòng đó sẽ thay thế hai dòng mã này và + +62 +00:04:13,660 --> 00:04:17,589 +chúng ta có thể tiếp tục và làm điều tương tự cho hai phần còn lại. + +63 +00:04:22,140 --> 00:04:22,973 +2: Vâng. + +64 +00:04:23,610 --> 00:04:28,610 +0: Ba dòng mã này sử dụng khả năng hiểu danh sách để thay thế cho các vòng lặp for. Vì vậy, chúng tôi có thể xóa những + +65 +00:04:29,490 --> 00:04:33,450 +vòng lặp for và bây giờ chúng tôi kết thúc với ba danh sách. + +66 +00:04:34,050 --> 00:04:38,310 +Bây giờ chúng tôi muốn kết hợp ba danh sách này thành một danh sách để chúng + +67 +00:04:38,310 --> 00:04:42,720 +tôi thực sự có thể xáo trộn nó. Vì vậy, tôi sẽ tạo + +68 +00:04:43,380 --> 00:04:48,380 +lại, password_list này, và nó sẽ được tạo bằng cách thêm password_letters của chúng ta + +69 +00:04:49,980 --> 00:04:53,400 +vào các biểu tượng password_ và password_numbers của chúng ta. + +70 +00:04:54,000 --> 00:04:58,170 +Vì vậy, về cơ bản chúng tôi đang thêm tất cả ba danh sách này lại với nhau và đưa + +71 +00:04:58,170 --> 00:05:02,670 +nó vào một danh sách lớn, và sau đó chúng tôi xáo trộn nó để có được danh sách ngẫu nhiên cuối cùng. + +72 +00:05:03,180 --> 00:05:07,050 +Bây giờ chúng tôi thực sự có thể cắt giảm mã này hơn nữa nếu chúng tôi muốn. + +73 +00:05:07,620 --> 00:05:10,680 +Ví dụ: thay vì tạo một biến riêng biệt ở đây, chúng tôi + +74 +00:05:10,710 --> 00:05:13,410 +thực sự có thể đặt nó thẳng vào như thế này. + +75 +00:05:13,920 --> 00:05:16,500 +Và thay vì gọi ngẫu nhiên. randint, chúng ta thực + +76 +00:05:17,100 --> 00:05:21,330 +sự có thể nói từ nhập ngẫu nhiên các phương thức mà chúng ta + +77 +00:05:21,660 --> 00:05:26,660 +cần, đó là lựa chọn và randint và ở đây chúng ta cũng đang sử dụng + +78 +00:05:28,950 --> 00:05:29,783 +hàm trộn. + +79 +00:05:30,990 --> 00:05:35,990 +Vì vậy, bây giờ chúng ta có thể xóa tất cả những nơi mà chúng ta có ngẫu nhiên và chúng ta + +80 +00:05:36,840 --> 00:05:39,810 +có thể thay thế chúng chỉ đơn giản bằng randint và chúng ta + +81 +00:05:42,060 --> 00:05:45,840 +có thể xóa ba dòng mã này. Và cuối cùng, nó chỉ đơn giản là + +82 +00:05:45,840 --> 00:05:50,520 +xáo trộn và chúng tôi xáo trộn password_list của mình. Bây giờ, một điều cuối cùng mà tôi nghĩ là + +83 +00:05:50,520 --> 00:05:54,810 +một điều tốt cần chỉ ra là ở đây chúng tôi đã tạo một chuỗi trống được gọi + +84 +00:05:54,810 --> 00:05:57,270 +là mật khẩu và sau đó đối với mỗi ký tự + +85 +00:05:57,620 --> 00:05:59,870 +trong danh sách của chúng tôi, về cơ + +86 +00:05:59,900 --> 00:06:04,550 +bản chúng tôi đã thêm nó vào mật khẩu này. Bây giờ điều đó đã đủ dễ dàng, nhưng ba dòng + +87 +00:06:04,580 --> 00:06:09,580 +này thực sự có thể được thực hiện theo cách Pythonic hơn. Trong Python, có một + +88 +00:06:10,160 --> 00:06:12,890 +phương thức được gọi là nối + +89 +00:06:13,160 --> 00:06:15,680 +có sẵn trên mọi chuỗi đơn. + +90 +00:06:16,070 --> 00:06:20,480 +Vì vậy, bạn có thể lấy một chuỗi giống như dấu thăng và bạn có thể gọi phương thức + +91 +00:06:20,480 --> 00:06:21,313 +nối trên đó. + +92 +00:06:21,710 --> 00:06:26,710 +Và những gì nó làm là nó sẽ tạo ra một chuỗi mới kết hợp tất cả các phần tử trong có thể + +93 +00:06:27,920 --> 00:06:30,890 +lặp lại này, John, Peter và Vicky, và nó sẽ phân tách chúng theo + +94 +00:06:31,220 --> 00:06:35,360 +bất kỳ ký tự nào bạn đặt ở đây. Bây giờ, đây không thực + +95 +00:06:35,390 --> 00:06:37,850 +sự phải là một bộ giá trị. + +96 +00:06:37,880 --> 00:06:41,120 +Nó có thể là một cuốn từ điển và nó cũng có thể là một danh sách. + +97 +00:06:41,450 --> 00:06:43,760 +Hãy để tôi chuyển nó thành một danh sách. + +98 +00:06:45,230 --> 00:06:50,230 +Và bây giờ nếu tôi tiếp tục và sử dụng dấu thăng để tham gia danh sách của mình và chạy mã này, + +99 +00:06:52,330 --> 00:06:54,100 +bạn có thể thấy, 0: Tôi kết thúc + +100 +00:06:54,460 --> 00:06:57,220 +với cùng một kết quả. Bây giờ, điều gì sẽ + +101 +00:06:57,220 --> 00:07:01,780 +xảy ra nếu tôi thực sự xóa dấu thăng này và tôi chỉ có một chuỗi trống? + +102 +00:07:02,200 --> 00:07:05,350 +Chà, điều này cũng sẽ hoạt động. Và những gì nó làm, + +103 +00:07:05,410 --> 00:07:10,410 +nó sẽ kết hợp tất cả các phần tử trong danh sách đó mà không có sự phân tách. + +104 +00:07:11,770 --> 00:07:16,270 +Về cơ bản đó là những gì chúng tôi đang cố gắng làm ở đây, phải không? Vì vậy, thay vì tất cả những + +105 +00:07:17,080 --> 00:07:19,060 +điều này, tôi có thể chỉ + +106 +00:07:19,540 --> 00:07:22,360 +cần viết "". tham gia, và sau + +107 +00:07:22,840 --> 00:07:26,410 +đó chuyển vào danh sách của tôi, đó là password_list của tôi. + +108 +00:07:26,920 --> 00:07:29,800 +Và điều này sẽ tương đương với mật khẩu của tôi. + +109 +00:07:30,850 --> 00:07:35,560 +Và điều đó thay thế tất cả các dòng mã này. Ngay bây giờ nếu tôi chạy mã như hiện + +110 +00:07:35,590 --> 00:07:38,980 +tại, bạn có thể thấy tôi vẫn tạo mật khẩu của mình + +111 +00:07:39,040 --> 00:07:44,040 +và nó vẫn siêu an toàn và siêu dài và trên thực tế, bạn có thể sửa đổi điều + +112 +00:07:44,740 --> 00:07:49,450 +đó bằng cách thay đổi bao nhiêu ký tự mật khẩu bạn muốn, bao nhiêu ký hiệu, + +113 +00:07:49,450 --> 00:07:51,400 +cách nhiều số và bạn có + +114 +00:07:51,880 --> 00:07:55,390 +thể thay đổi những số này để làm cho nó an toàn hơn. + +115 +00:07:55,780 --> 00:08:00,780 +Nhưng chúng tôi đã rút ngắn rất nhiều mã này so với công việc của ngày thứ 5 bởi vì chúng tôi + +116 +00:08:00,970 --> 00:08:03,190 +hiện biết những thứ như hiểu danh sách và + +117 +00:08:03,340 --> 00:08:05,830 +bây giờ chúng tôi cũng đã học được phương pháp nối. + +118 +00:08:06,550 --> 00:08:11,050 +Vì vậy, toàn bộ phần này là cơ chế tạo mật khẩu của chúng tôi. + +119 +00:08:11,530 --> 00:08:15,520 +Nếu chúng ta nhúng tất cả điều này vào bên trong một hàm + +120 +00:08:15,550 --> 00:08:19,330 +để chúng ta có thể gọi nó là create_password, đó là những + +121 +00:08:19,390 --> 00:08:21,490 +gì nó sẽ làm khá nhiều, + +122 +00:08:22,000 --> 00:08:27,000 +thì chúng ta có thể gọi hàm này khi người dùng nhấn vào nút tạo mật + +123 +00:08:27,280 --> 00:08:28,113 +khẩu đó. + +124 +00:08:28,300 --> 00:08:33,299 +Vì vậy, hãy thêm một lệnh khác và thêm vào hàm create_password của chúng ta tại đây. + +125 +00:08:35,799 --> 00:08:39,789 +Bây giờ, điều chúng tôi không muốn là chúng tôi không muốn in ra mật khẩu, + +126 +00:08:39,789 --> 00:08:44,049 +điều đó không hữu ích lắm cho người dùng đang sử dụng giao diện người dùng đồ họa. + +127 +00:08:44,500 --> 00:08:48,580 +Thay vào đó, chúng tôi muốn điền mục nhập này bằng mật khẩu. + +128 +00:08:49,000 --> 00:08:50,260 +Bạn có nhớ làm thế nào để làm điều đó? + +129 +00:08:50,620 --> 00:08:53,680 +Nếu bạn làm vậy, hãy tạm dừng video và hoàn thành việc này như một thử thách. + +130 +00:08:54,100 --> 00:08:56,100 +Nếu bạn không, tôi sẽ chỉ cho bạn cách làm điều đó. + +131 +00:08:58,020 --> 00:09:01,890 +Vì vậy, nó giống như những gì chúng tôi đã làm với email của mình. + +132 +00:09:02,280 --> 00:09:06,750 +Hãy nhớ cách chúng tôi muốn mục nhập email của mình có giá trị bắt + +133 +00:09:07,080 --> 00:09:10,110 +đầu, email của người dùng. Chà, chúng ta sẽ làm điều tương tự ở đây. + +134 +00:09:10,470 --> 00:09:15,390 +Vì vậy, chúng tôi có thể nhấn vào mục nhập mật khẩu của mình và chúng tôi gọi phương thức chèn. + +135 +00:09:15,900 --> 00:09:19,650 +Bây giờ vị trí mà chúng ta muốn chèn văn bản của mình sẽ + +136 +00:09:19,650 --> 00:09:20,220 +ở ngay + +137 +00:09:20,220 --> 00:09:25,220 +đầu, vì vậy ký tự số 0 và văn bản mà chúng ta muốn chèn vào đó tất nhiên là + +138 +00:09:25,410 --> 00:09:29,160 +mật khẩu mới tạo của chúng ta. Vì vậy, bây giờ nếu tôi + +139 +00:09:29,160 --> 00:09:32,640 +chạy mã của mình, bạn có thể thấy ngay khi tôi nhấp + +140 +00:09:32,940 --> 00:09:37,940 +vào nút này, một mật khẩu phức tạp và ngẫu nhiên sẽ được tạo và điền vào đây. + +141 +00:09:39,120 --> 00:09:42,180 +Bây giờ, bất cứ khi nào tôi đăng ký một trang web + +142 +00:09:42,960 --> 00:09:45,390 +mới, tôi có thể chỉ cần nhập tên + +143 +00:09:45,660 --> 00:09:49,770 +của trang web đó, tạo mật khẩu và nhấn thêm, và tôi đã hoàn tất. + +144 +00:09:50,490 --> 00:09:54,390 +Bây giờ chúng tôi đã kết hợp chức năng tạo mật khẩu của mình, chúng tôi + +145 +00:09:54,660 --> 00:09:58,050 +có thể lưu tất cả dữ liệu vào tệp dữ liệu của mình. + +146 +00:09:58,350 --> 00:10:00,270 +Điều cuối cùng tôi muốn cho + +147 +00:10:00,270 --> 00:10:05,270 +bạn thấy đó là một thủ thuật thực sự gọn gàng mà bạn có thể làm với Python + +148 +00:10:05,430 --> 00:10:10,430 +là khả năng đặt các chuỗi vào khay nhớ tạm để một khi chúng ta nhấp vào create_password, + +149 +00:10:11,280 --> 00:10:12,570 +toàn bộ chuỗi này, + +150 +00:10:12,600 --> 00:10:17,250 +tôi thực sự không phải tiếp tục và đánh dấu nó và sau đó sao chép + +151 +00:10:17,250 --> 00:10:21,150 +nó và sau đó nắm giữ nó. Bởi vì trong hầu hết các trường hợp, khi + +152 +00:10:21,210 --> 00:10:25,620 +tôi đã tạo mật khẩu của mình, tôi muốn có thể ngay lập tức dán nó vào nơi nào đó mà tôi + +153 +00:10:25,620 --> 00:10:27,930 +đang đăng ký, phải không? Tôi muốn có thể chỉ + +154 +00:10:28,550 --> 00:10:29,383 +cần nhấn dán. + +155 +00:10:30,410 --> 00:10:33,830 +0: Vậy làm thế nào chúng ta có thể làm điều đó? Chà, chúng ta có thể sử + +156 +00:10:34,130 --> 00:10:38,840 +dụng một dự án Python được gọi là pyperclip. Và đây là một mô-đun Python đa nền + +157 +00:10:39,170 --> 00:10:43,580 +tảng giúp bạn dễ dàng làm việc với việc sao chép và dán cho + +158 +00:10:43,580 --> 00:10:47,870 +các chức năng khay nhớ tạm. Tất cả những gì chúng tôi phải làm là + +159 +00:10:48,260 --> 00:10:52,490 +nhập nó và sau đó chúng tôi nói, sao chép, và chúng tôi chuyển văn bản cần sao chép vào. + +160 +00:10:52,880 --> 00:10:56,510 +Hoặc bạn có thể nhấn dán và nó sẽ dán bất cứ thứ gì có trong khay nhớ tạm. + +161 +00:10:56,990 --> 00:10:59,420 +Chúng tôi chỉ thực sự quan tâm đến hai phần này. + +162 +00:10:59,540 --> 00:11:04,310 +Vì vậy, hai dòng mã cung cấp cho chúng ta chức năng đó. Quay lại mã của chúng ta, + +163 +00:11:04,340 --> 00:11:05,630 +cuộn lên + +164 +00:11:05,690 --> 00:11:09,680 +đầu, hãy tiếp tục và nhập pyperclip của chúng ta. + +165 +00:11:09,710 --> 00:11:13,640 +Hãy chắc chắn rằng bạn đã viết đúng chính tả. Bạn có thể kiểm tra nó dựa trên liên kết + +166 +00:11:13,670 --> 00:11:15,500 +này mà tôi có trong tài nguyên khóa học. + +167 +00:11:16,370 --> 00:11:20,780 +Và khi chúng tôi nhập, bạn có thể thấy rằng PyCharm đã thông báo cho chúng tôi biết rằng + +168 +00:11:20,780 --> 00:11:23,330 +bạn không có gói này. Vì vậy, hãy tiếp tục và cài đặt nó. + +169 +00:11:23,990 --> 00:11:27,320 +Khi nó đã được cài đặt thành công (nó là một mô-đun rất nhỏ) thì chúng + +170 +00:11:27,620 --> 00:11:28,880 +ta có thể sử dụng nó. + +171 +00:11:29,420 --> 00:11:33,440 +Và phần mà chúng ta sẽ sử dụng nó là khi chúng ta tạo mật khẩu của mình. + +172 +00:11:33,950 --> 00:11:38,600 +Vì vậy, khi chúng tôi đã tạo mật khẩu của mình, chúng tôi sẽ gọi pyperclip và chúng + +173 +00:11:41,360 --> 00:11:45,410 +tôi sẽ gọi phương thức sao chép. Bây giờ, bên trong đây, chúng ta phải + +174 +00:11:45,410 --> 00:11:48,440 +đặt văn bản mà chúng ta muốn sao chép vào khay nhớ + +175 +00:11:48,680 --> 00:11:50,660 +tạm, đó sẽ là mật khẩu. + +176 +00:11:51,860 --> 00:11:56,860 +Vì vậy, bây giờ khi chúng tôi chạy và tôi tạo một mật khẩu mới, ngay bây giờ mật khẩu đó đã có trong khay nhớ + +177 +00:11:57,160 --> 00:11:59,170 +tạm của tôi và tôi có thể hiển thị + +178 +00:11:59,230 --> 00:12:04,230 +cho bạn chỉ bằng cách dán nó vào đây bằng lệnh + v. Điều đó làm cho việc làm việc với trình quản + +179 +00:12:04,330 --> 00:12:07,450 +lý mật khẩu của chúng tôi dễ dàng hơn rất nhiều vì + +180 +00:12:07,750 --> 00:12:12,750 +tất cả những gì chúng tôi phải làm khi muốn đăng ký một tài khoản mới là chỉ cần chỉ + +181 +00:12:12,820 --> 00:12:15,430 +định tên trang web và sau đó chúng tôi đã + +182 +00:12:15,730 --> 00:12:20,080 +lưu email của mình và chúng tôi có mật khẩu của chúng tôi đã được tạo, sẵn + +183 +00:12:20,320 --> 00:12:21,940 +sàng để dán vào đây. + +184 +00:12:22,870 --> 00:12:27,870 +Vì vậy, điều đó sẽ giúp bạn dễ dàng hơn rất nhiều để có những mật khẩu rất an toàn và + +185 +00:12:28,000 --> 00:12:31,930 +cũng là nơi để kiểm tra những mật khẩu đó là gì khi bạn quên. + +186 +00:12:32,740 --> 00:12:35,230 +Tôi hy vọng bạn thích xây dựng dự án này với tôi + +187 +00:12:35,590 --> 00:12:39,010 +ngày hôm nay và bạn sẽ sử dụng tốt dự án này và đảm bảo rằng + +188 +00:12:39,010 --> 00:12:44,010 +tất cả các trang web và tất cả dữ liệu cũng như tất cả tài khoản của bạn đều được bảo mật bằng mật + +189 +00:12:44,650 --> 00:12:45,610 +khẩu chất lượng tốt. + +190 +00:12:45,630 --> 00:12:45,930 +1: Được rồi. + diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Pyperclip-documentation-on-PyPi.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Pyperclip-documentation-on-PyPi.url new file mode 100644 index 0000000000000000000000000000000000000000..88b61b3036d01b63cd74d6b4bbfc52de587ae936 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Pyperclip-documentation-on-PyPi.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pypi.org/project/pyperclip/ \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Solution-password-manager-end.zip b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Solution-password-manager-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..0935563f98d0c0c35b1e9b0d0ef042f8f5dc6e60 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 Solution-password-manager-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24b182beb206e3079ab33c46d442db564aeeaee4fcf6d6b49b7f7271c2b0d84e +size 16020 diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 w3schools-Python-join-method-Documentation.url b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 w3schools-Python-join-method-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..647a8306584064bec88f0c66ef651df68dea9f74 --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/007 w3schools-Python-join-method-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/ref_string_join.asp \ No newline at end of file diff --git a/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/external-links.txt b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..c848f72bcdb912b9d24c5d2fb46705be0f69a20d --- /dev/null +++ b/part3/29 - Day 29 - Intermediate - Building a Password Manager GUI App with Tkinter/external-links.txt @@ -0,0 +1,21 @@ + +002 Canvas-Documentation-on-tkdocs.com +https://tkdocs.com/tutorial/canvas.html + +003 Tkinter-Grid-columnspan-Demo-Repl +https://repl.it/@appbrewery/grid-columnspan-demo#main.py + +005 w3schools-Python-Writing-to-File-Documentation +https://www.w3schools.com/python/python_file_write.asp + +005 Entry-Widget-Docs-on-tkdocs.com +https://tkdocs.com/tutorial/widgets.html#entry + +007 w3schools-Python-join-method-Documentation +https://www.w3schools.com/python/ref_string_join.asp + +007 Pyperclip-documentation-on-PyPi +https://pypi.org/project/pyperclip/ + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/001 Day 30 Goals what you will make by the end of the day.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/001 Day 30 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fa8f3d5058875a71368a246e2e38042bee556a1c --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/001 Day 30 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61c48556387fe1027a9310d17932c6348a5ce14aea8ac09d93d789481427d407 +size 6236062 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/001 Day 30 Goals what you will make by the end of the day_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/001 Day 30 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..77f19d402f6f489e1b44f258cf97e9f8c9bd5e0a --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/001 Day 30 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,116 @@ +1 +00:00:00,150 --> 00:00:01,560 +Xin chào các bạn, chào + +2 +00:00:01,560 --> 00:00:05,610 +mừng bạn trở lại với 100 Ngày viết mã. Hôm nay là ngày 30 và để + +3 +00:00:05,700 --> 00:00:07,590 +đánh dấu cột mốc quan + +4 +00:00:07,620 --> 00:00:11,430 +trọng này, chúng ta sẽ tìm hiểu về một số chủ đề Python + +5 +00:00:11,730 --> 00:00:14,280 +nâng cao hơn, chẳng hạn như lỗi, ngoại + +6 +00:00:14,610 --> 00:00:18,570 +lệ và chúng ta cũng sẽ học cách lưu và tải dữ liệu JSON. + +7 +00:00:19,050 --> 00:00:23,400 +Vì vậy, đó là tất cả vẫn chưa đến. Đầu tiên, chúng ta sẽ xem xét một số + +8 +00:00:23,400 --> 00:00:28,400 +lỗi mà chúng ta đang gặp phải và cách tránh sự cố ứng dụng của chúng ta bằng cách xử lý + +9 +00:00:28,950 --> 00:00:29,783 +những lỗi đó. + +10 +00:00:30,120 --> 00:00:34,500 +Sau đó, chúng ta sẽ xem xét định dạng dữ liệu cụ thể này được gọi + +11 +00:00:34,530 --> 00:00:35,363 +là JSON + +12 +00:00:35,640 --> 00:00:40,020 +và đây có lẽ là một trong những định dạng dữ liệu được sử dụng rộng + +13 +00:00:40,020 --> 00:00:43,110 +rãi nhất để truyền dữ liệu qua internet giữa các ứng dụng. + +14 +00:00:43,410 --> 00:00:46,050 +Và đây sẽ là một thứ gì đó sẽ + +15 +00:00:46,080 --> 00:00:50,550 +hữu ích, không chỉ trong Python, mà còn trong rất nhiều ngôn ngữ lập trình khác. + +16 +00:00:51,120 --> 00:00:54,630 +Và khi chúng ta đã hiểu tất cả những điều đó, chúng ta sẽ tổng hợp lại, + +17 +00:00:54,870 --> 00:00:58,560 +chúng ta sẽ sử dụng nó để cải thiện trình quản lý mật khẩu hiện có của mình. + +18 +00:00:59,040 --> 00:01:03,630 +Vào cuối ngày hôm nay, chúng tôi không chỉ có thể lưu các trang web, + +19 +00:01:04,080 --> 00:01:09,080 +tạo mật khẩu và thêm nó vào cơ sở dữ liệu mật khẩu của mình mà còn + +20 +00:01:09,690 --> 00:01:13,080 +có thể tìm kiếm thông qua cơ sở dữ liệu đó. + +21 +00:01:13,080 --> 00:01:16,170 +Vì vậy, chúng tôi có thể nhập tên của một trang web, nhấn tìm kiếm + +22 +00:01:16,260 --> 00:01:20,760 +và nó sẽ cho chúng tôi biết email và mật khẩu mà chúng tôi cần sử dụng để đăng nhập vào trang + +23 +00:01:20,760 --> 00:01:22,560 +web đó là gì. Ngoài ra, chúng + +24 +00:01:22,590 --> 00:01:26,010 +tôi sẽ làm cho điều này an toàn hơn rất nhiều bằng cách xử lý + +25 +00:01:26,010 --> 00:01:30,000 +một số trường hợp ngoại lệ có thể xảy ra và đảm bảo rằng trong mọi trường hợp, + +26 +00:01:30,360 --> 00:01:33,390 +ứng dụng của chúng tôi sẽ hoạt động chính xác như mong đợi. + +27 +00:01:34,050 --> 00:01:36,180 +Vì vậy, tất cả những điều đó và hơn thế nữa đang tiếp tục diễn ra. + +28 +00:01:36,570 --> 00:01:40,500 +Hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu bằng cách tìm hiểu về các lỗi + +29 +00:01:40,500 --> 00:01:41,190 +và ngoại lệ. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/002 Catching Exceptions The try catch except finally Pattern.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/002 Catching Exceptions The try catch except finally Pattern.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e0236951c8d4ae0a5a2b2491d225ed4f23d55973 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/002 Catching Exceptions The try catch except finally Pattern.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f62c9ae8c12730588708553b520f62ec0663ff4607f8460981dfd3bccdd79604 +size 77705491 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/002 Catching Exceptions The try catch except finally Pattern_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/002 Catching Exceptions The try catch except finally Pattern_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c2f2aa3c43343854de42cb93521abcdf7cf23ef8 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/002 Catching Exceptions The try catch except finally Pattern_vi.srt @@ -0,0 +1,928 @@ +1 +00:00:00,390 --> 00:00:03,780 +Trong bài học này, chúng ta sẽ nói về lỗi và ngoại lệ. + +2 +00:00:04,170 --> 00:00:06,810 +Tôi sẽ chỉ cho bạn điều gì sẽ xảy ra khi một chương + +3 +00:00:06,840 --> 00:00:10,980 +trình gặp các loại lỗi khác nhau và cách bạn có thể viết mã để xử lý những tình huống này. + +4 +00:00:12,060 --> 00:00:15,810 +Để bắt đầu, tôi đã tạo một dự án hoàn toàn mới có tên là day-30 và + +5 +00:00:16,020 --> 00:00:20,760 +tôi đã tạo chính của mình. tệp py. Bây giờ hãy để ý xem bên trong + +6 +00:00:20,790 --> 00:00:24,990 +dự án của tôi, chỉ có một tệp mã vào lúc này. Không có tệp dữ liệu, không có tệp + +7 +00:00:24,990 --> 00:00:28,140 +văn bản, không có gì. Trong tình huống này nếu + +8 +00:00:28,170 --> 00:00:33,170 +tôi cố gắng mở một tệp cụ thể không tồn tại và tôi cố đọc nó, bạn + +9 +00:00:33,330 --> 00:00:35,100 +nghĩ điều gì sẽ xảy ra? + +10 +00:00:35,670 --> 00:00:38,610 +Vì vậy, chúng ta sẽ sử dụng cú pháp bình thường của chúng ta với open, và chúng + +11 +00:00:38,910 --> 00:00:42,480 +ta chỉ cần tạo một tên tệp. Vì vậy, a_file. txt. + +12 +00:00:42,990 --> 00:00:45,360 +Và tôi sẽ lưu nó dưới dạng tệp và + +13 +00:00:45,630 --> 00:00:50,630 +tôi sẽ lấy tệp này và cố gắng đọc từ nó. Ngay bây giờ nếu tôi + +14 +00:00:51,120 --> 00:00:55,710 +chạy mã này, thì đây là những gì sẽ xảy ra. + +15 +00:00:56,100 --> 00:00:59,520 +Tôi lấy lại dấu vết và gặp lỗi, đó là lỗi + +16 +00:00:59,550 --> 00:01:03,570 +không tìm thấy tệp, điều này hợp lý khi thực sự không có + +17 +00:01:03,570 --> 00:01:08,570 +tệp nào như vậy tồn tại bên trong thư mục của chúng tôi nơi chúng tôi yêu + +18 +00:01:08,820 --> 00:01:11,520 +cầu nó tìm kiếm. Điều đó không tuyệt vời. + +19 +00:01:11,820 --> 00:01:15,900 +Và nếu điều này xảy ra ở đâu đó trong chương trình thực tế của chúng + +20 +00:01:15,900 --> 00:01:20,100 +tôi, vì vậy ở đây tôi đã hoàn thành dự án quản lý mật khẩu từ hôm qua. + +21 +00:01:20,640 --> 00:01:24,840 +Nếu trong trường hợp này, tôi đã mắc lỗi đánh máy trong từ này + +22 +00:01:24,870 --> 00:01:29,190 +thay vì dữ liệu. txt, tôi đã viết daata. txt. + +23 +00:01:29,850 --> 00:01:34,170 +Và thay vì chế độ nối thêm, tôi đã có chế độ đọc. Chà, trong trường hợp này, + +24 +00:01:34,170 --> 00:01:37,500 +điều gì sẽ xảy ra cũng chính xác như vậy. + +25 +00:01:37,500 --> 00:01:40,530 +Vì vậy, tôi có thể có một trang web, có mật + +26 +00:01:40,680 --> 00:01:44,400 +khẩu, nhưng ngay sau khi tôi nhấn thêm, sau đó chúng tôi nhận được + +27 +00:01:44,400 --> 00:01:48,510 +lỗi không tìm thấy tệp của mình. Và hãy chú ý ngay khi lỗi đó + +28 +00:01:48,840 --> 00:01:52,620 +xảy ra, nó thực sự không tiếp tục vì trong vài dòng tiếp theo, + +29 +00:01:52,650 --> 00:01:54,480 +chúng ta thực sự có hai + +30 +00:01:54,780 --> 00:01:59,490 +dòng mã này xóa mục nhập bên trong mục nhập trang web và cả mục nhập mật khẩu. + +31 +00:01:59,610 --> 00:02:04,200 +Nhưng những dòng mã đó không được thực hiện vì nó gặp phải một trở + +32 +00:02:04,200 --> 00:02:04,830 +ngại. + +33 +00:02:04,830 --> 00:02:09,389 +Nó không tìm thấy tệp mà chúng tôi đang cố mở và chúng tôi đang cố đọc. + +34 +00:02:10,080 --> 00:02:12,630 +Vì vậy, tôi sẽ khôi phục mã về như trước + +35 +00:02:12,990 --> 00:02:16,950 +đây, nhưng đây là một điểm tốt để bắt đầu suy nghĩ về lỗi vì chúng + +36 +00:02:16,950 --> 00:02:21,450 +ta đã gặp rất nhiều lỗi, phải không? Kể cả các lỗi như lỗi phím. + +37 +00:02:22,710 --> 00:02:23,730 +Vì vậy, ví + +38 +00:02:23,730 --> 00:02:28,730 +dụ: nếu chúng tôi có một từ điển chỉ có một cặp khóa-giá trị và bằng cách nào đó + +39 +00:02:29,280 --> 00:02:31,620 +chúng tôi cố gắng lấy một giá trị từ + +40 +00:02:31,860 --> 00:02:34,830 +từ điển đó bằng cách nhấn vào một khóa không tồn + +41 +00:02:36,660 --> 00:02:40,890 +tại, thì khi chúng tôi chạy mã này, chúng tôi sẽ nhận được lỗi phím, phải không? + +42 +00:02:41,070 --> 00:02:45,600 +Nó thực sự không thể chọn giá trị từ từ điển này vì khóa này mà chúng tôi đã cung + +43 +00:02:45,600 --> 00:02:49,740 +cấp không tồn tại trong từ điển đó. Bây giờ, một số lỗi + +44 +00:02:49,770 --> 00:02:53,550 +phổ biến khác mà bạn đã thấy là lỗi chỉ mục. + +45 +00:02:54,690 --> 00:02:55,620 +Vì vậy, trong + +46 +00:02:55,620 --> 00:03:00,620 +trường hợp này, chúng tôi có một danh sách và về cơ bản chúng tôi đang cố gắng lấy một mục từ + +47 +00:03:02,230 --> 00:03:06,880 +danh sách này tại một chỉ mục không tồn tại. Vì vậy, hãy nhớ chỉ mục bắt đầu từ + +48 +00:03:06,880 --> 00:03:11,110 +0, 1, 2 và 3. Không có gì ở 3. Vì vậy, một lần nữa, khi + +49 +00:03:11,170 --> 00:03:14,110 +tôi chạy điều này, chúng tôi gặp lỗi và đây là lỗi chỉ mục. + +50 +00:03:15,700 --> 00:03:20,200 +Và lỗi cuối cùng mà chúng ta có thể đã quen với việc gặp phải là lỗi kiểu trong đó chúng + +51 +00:03:20,500 --> 00:03:23,800 +ta đang cố gắng thực hiện điều gì đó với một phần dữ liệu cụ + +52 +00:03:24,130 --> 00:03:27,550 +thể, nhưng chúng ta không thể làm điều đó với một kiểu dữ liệu cụ thể. + +53 +00:03:28,150 --> 00:03:30,580 +Giả sử chúng ta có một đoạn văn bản + +54 +00:03:30,760 --> 00:03:35,550 +abc và chúng ta cố gắng in đoạn văn bản này cộng với số năm, do đó, một + +55 +00:03:35,760 --> 00:03:39,870 +chuỗi cộng với một số nguyên. Và một lần nữa, khi tôi nhấn chạy + +56 +00:03:39,870 --> 00:03:42,300 +nó, một lần nữa chúng tôi lại gặp lỗi loại. + +57 +00:03:43,110 --> 00:03:47,250 +Tất cả những loại lỗi này chúng tôi đã thực sự gặp phải và tất cả những gì + +58 +00:03:47,310 --> 00:03:48,600 +chúng tôi đã làm cho + +59 +00:03:48,960 --> 00:03:53,460 +đến nay là chúng tôi chỉ sử dụng nó như một chỉ báo để cho chúng tôi biết, đợi một + +60 +00:03:53,460 --> 00:03:56,640 +chút, có gì đó không ổn lắm. Chúng tôi phải đi và sửa mã của chúng tôi. + +61 +00:03:57,270 --> 00:03:59,760 +Nhưng cuộc sống không thực sự diễn ra gọn + +62 +00:03:59,760 --> 00:04:04,680 +gàng như vậy hầu hết thời gian. Trong nhiều trường hợp, nó thực sự tuân theo định luật Morphy, + +63 +00:04:04,980 --> 00:04:09,300 +trong đó nói rằng bất cứ điều gì có thể xảy ra sai lầm có thể sẽ xảy ra, cuối cùng tại + +64 +00:04:09,300 --> 00:04:10,410 +một số điểm, sai lầm. + +65 +00:04:10,800 --> 00:04:15,210 +Vì vậy, chúng tôi phải lập kế hoạch cho những trường hợp cuối cùng này, như bạn biết đấy, chiếc xe + +66 +00:04:15,210 --> 00:04:17,279 +của bạn có thể sẽ không bị hỏng, nhưng + +67 +00:04:17,550 --> 00:04:22,550 +bạn cần có vỏ bọc đề phòng sự cố xảy ra. Trong lập trình, những gì chúng ta có thể làm là chúng + +68 +00:04:23,310 --> 00:04:28,310 +ta có thể bắt gặp những trường hợp ngoại lệ này. Khi có sự cố xảy ra và trong thời + +69 +00:04:28,410 --> 00:04:31,710 +điểm đó chúng ta bắt gặp trường hợp ngoại lệ đó, thì + +70 +00:04:31,980 --> 00:04:34,380 +nó không phải thất bại thảm hại. + +71 +00:04:34,890 --> 00:04:39,690 +Chúng ta thực sự có thể thất bại một cách duyên dáng hơn hoặc chúng ta có thể quyết định rằng điều gì đó + +72 +00:04:39,690 --> 00:04:40,523 +khác sẽ xảy ra. + +73 +00:04:40,800 --> 00:04:45,060 +Đây là mã trông như thế nào khi chúng tôi xử lý các trường hợp ngoại lệ này. + +74 +00:04:45,360 --> 00:04:48,120 +Chúng tôi đã thử, ngoại trừ, khác và cuối cùng. + +75 +00:04:48,120 --> 00:04:52,680 +Đây là bốn từ khóa thực sự quan trọng khi nói đến việc xử lý các trường + +76 +00:04:52,680 --> 00:04:53,513 +hợp ngoại lệ. + +77 +00:04:54,000 --> 00:04:59,000 +Bây giờ, thử từ khóa đầu tiên dành cho một khối mã mà bạn đang thực thi một + +78 +00:05:00,510 --> 00:05:03,210 +cái gì đó có thể gây ra ngoại lệ. + +79 +00:05:03,570 --> 00:05:07,590 +Vì vậy, về cơ bản bạn đang cố gắng thực thi một đoạn dòng. Trong hầu hết các trường hợp, nó + +80 +00:05:07,590 --> 00:05:10,980 +có thể sẽ hoạt động, nhưng đôi khi nó có thể không. + +81 +00:05:11,760 --> 00:05:15,060 +Bây giờ bước tiếp theo là xác định khối ngoại trừ. + +82 +00:05:15,510 --> 00:05:19,170 +Vì vậy, đây là khối mã mà bạn muốn máy tính thực thi nếu + +83 +00:05:19,440 --> 00:05:21,060 +có thêm một ngoại lệ. + +84 +00:05:21,090 --> 00:05:25,860 +Nếu điều gì đó xảy ra sai lầm nghiêm trọng và nó không theo + +85 +00:05:25,860 --> 00:05:29,730 +cách bạn mong đợi, thì hãy thực hiện đoạn mã này. + +86 +00:05:30,780 --> 00:05:35,130 +Bây giờ từ khóa else cho phép bạn tìm một số mã để thực + +87 +00:05:35,400 --> 00:05:39,720 +thi nếu không có ngoại lệ. Nếu bạn đã thử điều này có thể thất bại + +88 +00:05:39,930 --> 00:05:43,560 +nhưng thực sự nó không thất bại. Bạn đã thành công và không có vấn đề gì. + +89 +00:05:43,800 --> 00:05:47,430 +Vậy thì, trong trường hợp này, bạn sẽ làm bất cứ điều gì bên trong khối khác. + +90 +00:05:47,970 --> 00:05:50,520 +Và cuối cùng, chúng ta có từ khóa + +91 +00:05:50,850 --> 00:05:55,020 +cuối cùng về cơ bản chỉ là khối mã để thực hiện + +92 +00:05:55,230 --> 00:05:59,870 +bất kể điều gì xảy ra. Nếu điều này mà bạn đã thử không + +93 +00:05:59,900 --> 00:06:04,880 +thành công hoặc nếu nó thành công, thì ý tôi là Honeybadger cuối cùng không thực sự quan tâm. + +94 +00:06:05,630 --> 00:06:08,870 +Vì vậy, không có vấn đề gì xảy ra với việc thử + +95 +00:06:09,140 --> 00:06:12,470 +dòng mã này, khối cuối cùng này sẽ luôn được thực thi + +96 +00:06:12,770 --> 00:06:17,750 +và nó thường được sử dụng để dọn dẹp mọi thứ hoặc thu dọn mọi thứ khi kết + +97 +00:06:17,960 --> 00:06:22,520 +thúc một số loại thực thi mã. Hãy lấy tệp không tìm thấy ngoại lệ của chúng tôi + +98 +00:06:22,610 --> 00:06:27,260 +và hãy xem cách chúng tôi có thể làm cho điều này an toàn hơn rất nhiều bằng cách bắt ngoại lệ đó. + +99 +00:06:27,710 --> 00:06:32,710 +Điều mà chúng tôi sẽ thử là mở tệp này. Thay vì sử dụng định dạng with, + +100 +00:06:33,290 --> 00:06:34,370 +tôi thực sự + +101 +00:06:34,400 --> 00:06:39,400 +sẽ tạo một tệp và đặt nó để mở đường dẫn tệp cụ thể + +102 +00:06:39,500 --> 00:06:42,470 +này. Vì vậy, a_file. txt. + +103 +00:06:43,010 --> 00:06:48,010 +Bây giờ đây là dòng mã có thể gây ra lỗi và nó sẽ gây ra lỗi trong trường hợp của chúng tôi vì + +104 +00:06:48,530 --> 00:06:52,700 +chúng tôi không có tệp được gọi là a_file. txt. + +105 +00:06:53,270 --> 00:06:57,620 +Vì vậy, dòng mã này sẽ đi vào bên trong một khối thử. + +106 +00:06:58,040 --> 00:07:02,840 +Vì vậy, hãy thụt lề đó. Vì vậy, đây là dòng mã mà chúng tôi sẽ thử. Bây giờ, điều tiếp theo + +107 +00:07:02,840 --> 00:07:07,340 +chúng ta sẽ xác định là khối ngoại trừ. Về cơ bản, khi chúng tôi đã + +108 +00:07:07,340 --> 00:07:10,220 +thử chạy dòng mã này và nếu có một ngoại + +109 +00:07:10,610 --> 00:07:15,610 +lệ nào đó xảy ra khi chúng tôi chạy nó như lỗi loại hoặc trong trường hợp này, + +110 +00:07:15,710 --> 00:07:19,340 +thì đó sẽ là lỗi không tìm thấy tệp, thì trường hợp, chúng + +111 +00:07:19,580 --> 00:07:22,310 +tôi sẽ làm một cái gì đó khác nhau. + +112 +00:07:22,310 --> 00:07:26,210 +Chúng ta sẽ giả sử in, đã xảy ra lỗi. + +113 +00:07:27,530 --> 00:07:31,190 +Vì vậy, bây giờ chúng ta hãy chạy đoạn mã này và bạn có thể + +114 +00:07:31,220 --> 00:07:34,430 +thấy ngay rằng, đã xảy ra lỗi vì tệp này không tồn tại. + +115 +00:07:34,460 --> 00:07:38,810 +Vì vậy, điều này không thành công và do đó dòng mã này đã được thực thi. + +116 +00:07:39,200 --> 00:07:42,680 +Nó gần giống như chúng ta có một câu lệnh if và + +117 +00:07:42,680 --> 00:07:47,030 +câu lệnh if đang kiểm tra xem có điều gì không thành công hay không, trong + +118 +00:07:47,030 --> 00:07:50,900 +trường hợp đó, đây là nơi để xem nó nên làm gì tiếp theo. + +119 +00:07:51,500 --> 00:07:55,310 +Bây giờ chỉ cần in mà có một lỗi là loại vô nghĩa. + +120 +00:07:55,520 --> 00:08:00,520 +Những gì chúng ta thực sự muốn làm là đảm bảo rằng chúng ta không thực sự thất bại để dù có + +121 +00:08:01,220 --> 00:08:05,690 +chuyện gì xảy ra, chúng ta vẫn thành công. Vì vậy, nếu có một giải pháp thay thế tốt, + +122 +00:08:05,750 --> 00:08:08,930 +thì đó là những gì chúng ta sẽ đưa vào bên trong khối ngoại trừ. + +123 +00:08:09,530 --> 00:08:11,240 +Thay vào đó, chúng tôi sẽ làm + +124 +00:08:11,420 --> 00:08:15,830 +gì nếu tệp này không tồn tại và chúng tôi không thể mở nó là chúng tôi chỉ đơn + +125 +00:08:15,830 --> 00:08:18,440 +giản là tạo ra nó. Để tạo một tệp mới, + +126 +00:08:18,650 --> 00:08:21,140 +hãy nhớ rằng bạn có thể mở tệp và + +127 +00:08:23,810 --> 00:08:28,810 +bạn có thể mở bằng chế độ ghi vì khi bạn đang ở trong chế độ ghi, thì những + +128 +00:08:29,900 --> 00:08:33,919 +gì phương pháp mở này sẽ làm là nó sẽ thử và tìm tệp này. + +129 +00:08:33,919 --> 00:08:36,380 +và mở nó. Nhưng nếu nó + +130 +00:08:36,409 --> 00:08:41,090 +không tồn tại, nó sẽ tạo ra nó. Ngay bây giờ nếu tôi chạy + +131 +00:08:41,120 --> 00:08:46,040 +lại mã này, tôi muốn bạn xem bên trong thư mục day-30 vì ngay khi tôi + +132 +00:08:46,250 --> 00:08:51,250 +nhấn run, bạn sẽ nhận thấy rằng a_file. txt được tạo bởi vì chúng tôi đã thử mở nó. + +133 +00:08:51,650 --> 00:08:52,670 +Nó không tồn tại. + +134 +00:08:52,940 --> 00:08:57,940 +Vì vậy, nó đã đi vào khối ngoại trừ và nó thực sự tiếp tục và tạo + +135 +00:08:58,050 --> 00:08:59,490 +tệp này từ đầu. + +136 +00:08:59,820 --> 00:09:03,900 +Bây giờ tệp này tất nhiên là hoàn toàn trống vì chúng tôi không yêu cầu nó làm bất + +137 +00:09:03,900 --> 00:09:08,520 +cứ điều gì, nhưng trên thực tế, chúng tôi có thể lấy tệp của mình và viết một cái gì đó vào nó. + +138 +00:09:09,600 --> 00:09:14,460 +Chúng ta có thể đặt tất cả những thứ đó bên trong khối ngoại trừ nếu chúng ta muốn. Bây giờ, một trong những điều đang đưa + +139 +00:09:14,460 --> 00:09:19,460 +ra cảnh báo cho chúng tôi ở đây với từ khóa ngoại trừ là nếu bạn di chuột qua + +140 +00:09:19,560 --> 00:09:23,910 +nó, nó sẽ cho bạn biết rằng đây là một điều khoản ngoại lệ quá rộng. + +141 +00:09:24,360 --> 00:09:27,270 +Và theo các khuyến nghị của PEP 8, nó cho chúng ta biết rằng + +142 +00:09:27,540 --> 00:09:30,510 +bạn không bao giờ nên sử dụng một điều khoản ngoại trừ trần và lý + +143 +00:09:30,960 --> 00:09:34,320 +do cho điều này là vì khi bạn có một điều khoản ngoại trừ, thì nó thực + +144 +00:09:34,680 --> 00:09:38,580 +sự sẽ bỏ qua tất cả các lỗi. Ví dụ, nếu bên trong đây, giả + +145 +00:09:38,670 --> 00:09:39,870 +sử tôi quyết + +146 +00:09:40,020 --> 00:09:43,740 +định làm điều gì đó cũng sẽ tạo ra lỗi, nhưng không + +147 +00:09:43,770 --> 00:09:45,480 +phải cùng một loại lỗi. + +148 +00:09:46,110 --> 00:09:50,490 +Vì vậy, bây giờ tôi có một từ điển với một khóa và một giá trị, + +149 +00:09:50,850 --> 00:09:55,170 +nhưng giả sử tôi đã cố gắng in một số loại giá trị từ từ điển + +150 +00:09:55,590 --> 00:09:58,440 +đó và tôi sử dụng một khóa không tồn tại. + +151 +00:09:58,890 --> 00:10:03,360 +Vì vậy, bạn có thể thấy rằng từ điển này không có khóa được đặt tên như vậy + +152 +00:10:03,660 --> 00:10:07,410 +nên dòng này sẽ thực sự cung cấp cho chúng ta một lỗi khóa. + +153 +00:10:07,740 --> 00:10:10,830 +Nhưng bây giờ, hãy chú ý những gì sẽ xảy ra khi tôi nhấn run. + +154 +00:10:11,700 --> 00:10:14,460 +Hoàn toàn không có gì. Tôi không nhận được bất kỳ lỗi nào. + +155 +00:10:14,670 --> 00:10:17,820 +Và lý do cho điều này là bởi vì bên trong + +156 +00:10:18,150 --> 00:10:23,150 +khối try, lần đầu tiên nó cố gắng mở tệp này và thực sự là tệp đó tồn tại. + +157 +00:10:23,550 --> 00:10:28,020 +Vì vậy, nó chuyển sang dòng tiếp theo. Nó tạo ra một từ điển có tên + +158 +00:10:28,080 --> 00:10:32,430 +là a_dictionary và nó cố gắng nắm giữ giá trị này bằng khóa này từ + +159 +00:10:32,430 --> 00:10:33,390 +từ điển đó. + +160 +00:10:33,810 --> 00:10:37,500 +Bây giờ dòng này thực sự bị lỗi và tạo ra một ngoại lệ, nhưng ngoại lệ đó được + +161 +00:10:37,830 --> 00:10:40,500 +bắt ngay tại đây và nó chỉ đơn giản là yêu cầu nó + +162 +00:10:40,920 --> 00:10:45,360 +tiếp tục và tạo một tệp có tên là a_file. txt mà nó + +163 +00:10:45,630 --> 00:10:50,130 +sẽ tiếp tục và làm. Vì vậy, đây không phải là những gì chúng tôi muốn ở tất cả. + +164 +00:10:50,910 --> 00:10:51,660 +Thay vào + +165 +00:10:51,660 --> 00:10:56,130 +đó, chúng tôi muốn ngoại lệ của chúng tôi nắm bắt một tình huống cụ thể. + +166 +00:10:56,460 --> 00:11:01,460 +Chúng tôi muốn nói rằng trong trường hợp ngoại lệ rằng chúng tôi có lỗi không tìm thấy tệp, thì + +167 +00:11:01,950 --> 00:11:06,300 +đây là những gì chúng tôi muốn làm. Và bây giờ nếu tôi chạy lại mã, bạn + +168 +00:11:06,360 --> 00:11:08,850 +có thể biết khi nào gặp lỗi khóa đó và + +169 +00:11:08,910 --> 00:11:13,560 +nó cho chúng tôi biết rằng thứ này đã hoạt động, vì vậy nó không tạo ra lỗi không + +170 +00:11:13,560 --> 00:11:14,430 +tìm thấy tệp. + +171 +00:11:14,730 --> 00:11:18,240 +Nhưng điều tiếp theo mà nó đã thử khi cố gắng in giá trị + +172 +00:11:18,390 --> 00:11:19,770 +này, nó bị lỗi khóa. + +173 +00:11:21,150 --> 00:11:26,150 +Vì vậy, chúng tôi thực sự có thể có nhiều ngoại lệ. Thay vì chỉ ngoại trừ tệp không tìm thấy, + +174 +00:11:26,670 --> 00:11:30,960 +tôi cũng có thể nói ngoại trừ lỗi khóa và trong trường hợp này, tôi + +175 +00:11:30,960 --> 00:11:35,850 +sẽ in khóa đó không tồn tại. Bây giờ, nếu tôi nhấn run, tôi + +176 +00:11:36,150 --> 00:11:39,810 +không gặp lỗi, nhưng tôi bắt được ngoại lệ đó và tôi + +177 +00:11:40,170 --> 00:11:45,170 +có câu lệnh in này đang thực thi. Ngoài việc chỉ đơn giản là bắt một + +178 +00:11:46,770 --> 00:11:48,060 +ngoại lệ bằng + +179 +00:11:48,060 --> 00:11:52,860 +cách sử dụng ngoại lệ, bạn cũng có thể nắm giữ thông báo lỗi mà thường + +180 +00:11:52,870 --> 00:11:56,290 +được in nếu chúng tôi không có ngoại lệ được gọi. + +181 +00:11:56,650 --> 00:12:00,910 +Thông thường, bạn sẽ gặp lỗi khóa và nó sẽ cung cấp cho bạn một thông báo cho bạn + +182 +00:12:00,910 --> 00:12:02,500 +biết khóa nào là vấn đề. + +183 +00:12:03,130 --> 00:12:07,810 +Nếu chúng tôi bắt gặp ngoại lệ của mình và chúng tôi vẫn muốn nắm giữ thông + +184 +00:12:08,110 --> 00:12:08,943 +báo lỗi + +185 +00:12:08,950 --> 00:12:13,150 +đó, thì chúng tôi có thể nói ngoại trừ lỗi khóa dưới dạng thông báo lỗi. + +186 +00:12:13,660 --> 00:12:18,490 +Và điều này có nghĩa là chúng ta có thể nắm được thông báo lỗi được tạo ra + +187 +00:12:18,490 --> 00:12:23,050 +từ ngoại lệ này nếu nó xảy ra. Thay vì nói rằng khóa không tồn tại, bây giờ + +188 +00:12:23,110 --> 00:12:28,110 +chúng ta có thể coi đây là một chuỗi f và chúng ta có thể nói, khóa và chúng ta chuyển vào thông + +189 +00:12:29,590 --> 00:12:30,820 +báo lỗi ngay tại đây. + +190 +00:12:31,270 --> 00:12:36,270 +Vì vậy, bây giờ tôi nhấn run một lần nữa và nó cho tôi biết khóa 'sdfsdf' không tồn tại, điều + +191 +00:12:37,300 --> 00:12:41,200 +này hữu ích hơn rất nhiều so với việc chỉ nói rằng khóa không tồn tại. + +192 +00:12:41,950 --> 00:12:46,930 +Vì vậy, bạn có thể thử, bạn có thể bắt các ngoại lệ, bạn có thể bắt các + +193 +00:12:47,230 --> 00:12:51,370 +ngoại lệ khác, bạn cũng có thể nắm giữ thông báo lỗi và sử dụng + +194 +00:12:51,370 --> 00:12:56,050 +nó khi bạn bắt được ngoại lệ. Bây giờ, từ khóa tiếp theo mà chúng + +195 +00:12:56,620 --> 00:13:01,620 +tôi đề cập là từ khóa khác và khối mã này sẽ thực thi khi điều + +196 +00:13:01,840 --> 00:13:05,830 +bạn đang thử thành công. Vì vậy, nếu nó quản lý + +197 +00:13:05,830 --> 00:13:08,710 +để mở tệp, nó đã quản lý để in mục này + +198 +00:13:08,980 --> 00:13:13,150 +từ từ điển và không có ngoại lệ nào được ném ra từ khối mã + +199 +00:13:13,210 --> 00:13:17,440 +này, thì nó sẽ chuyển sang khối khác. Vậy bạn còn muốn làm gì nữa? + +200 +00:13:18,100 --> 00:13:21,940 +Chà, có lẽ tôi thực sự muốn đọc từ tệp này, vì + +201 +00:13:22,000 --> 00:13:23,860 +vậy tệp. đọc, và chúng + +202 +00:13:24,310 --> 00:13:27,130 +tôi lưu nó dưới dạng nội dung của chúng tôi. + +203 +00:13:27,850 --> 00:13:31,930 +Và sau đó chúng tôi tiếp tục và in nội dung của chúng tôi. Bây giờ, hãy nhớ rằng, nếu + +204 +00:13:31,960 --> 00:13:34,960 +tệp này không thực sự tồn tại, thì khối khác + +205 +00:13:35,080 --> 00:13:37,630 +này sẽ không bao giờ được kích hoạt. + +206 +00:13:37,990 --> 00:13:40,780 +Vì vậy, nếu tôi tiếp tục và chỉ cần xóa tệp + +207 +00:13:43,630 --> 00:13:44,830 +này và nhấn chạy, + +208 +00:13:45,190 --> 00:13:50,190 +bạn có thể thấy rằng khối khác này không xảy ra bởi vì nó đã cố gắng thực hiện + +209 +00:13:50,980 --> 00:13:51,940 +điều này, nó + +210 +00:13:52,300 --> 00:13:57,300 +không thành công và vì vậy nó đã chuyển sang khối ngoại trừ và nó tạo ra tệp đó. + +211 +00:13:58,570 --> 00:14:02,530 +Nhưng bây giờ tệp đó đã được tạo, lần tiếp theo tôi + +212 +00:14:02,800 --> 00:14:07,800 +nhấn chạy, thì dòng mã này sẽ thành công và bây giờ nó bắt lỗi + +213 +00:14:08,560 --> 00:14:12,700 +tiếp theo trong khối thử đó. Vì vậy, nếu tôi thay đổi điều + +214 +00:14:12,700 --> 00:14:17,560 +này thành một khóa mà nó thực sự sẽ nhận ra, thì dòng tiếp theo + +215 +00:14:17,920 --> 00:14:22,920 +đó cũng thành công và cuối cùng nó đến khối này và nó thực sự in + +216 +00:14:23,500 --> 00:14:27,250 +ra thứ bên trong a_file. txt chỉ là một từ gì đó. + +217 +00:14:28,120 --> 00:14:31,510 +Vì vậy, bây giờ chúng tôi đã thử, ngoại trừ, khác, + +218 +00:14:31,870 --> 00:14:35,950 +và điều cuối cùng tôi muốn cho bạn thấy cuối cùng là từ khóa. + +219 +00:14:36,460 --> 00:14:41,460 +Vì vậy, về cơ bản đây là một số mã sẽ chạy bất kể điều gì xảy ra. + +220 +00:14:41,980 --> 00:14:42,813 +Và trong trường + +221 +00:14:42,820 --> 00:14:47,800 +hợp của chúng tôi, điều thích hợp nhất cần làm ở đây là thực sự đóng tệp vì chúng tôi không sử dụng + +222 +00:14:47,800 --> 00:14:49,450 +từ khóa with để tệp của chúng tôi + +223 +00:14:49,750 --> 00:14:54,750 +thực sự vẫn mở nếu chúng tôi thực sự có ngoại lệ. Và tôi sẽ tiếp tục + +224 +00:14:56,000 --> 00:14:57,650 +và in 1: + +225 +00:14:57,970 --> 00:14:59,890 +Tệp đã được đóng. + +226 +00:15:00,790 --> 00:15:04,780 +0: Bây giờ mã của chúng tôi về cơ bản sẽ mở tệp + +227 +00:15:05,170 --> 00:15:08,890 +này và bất kể nó thành công hay thất bại, nó sẽ + +228 +00:15:09,220 --> 00:15:14,220 +đóng tệp đó để chúng tôi không kết thúc với một tệp đang mở mà chúng + +229 +00:15:14,530 --> 00:15:18,400 +tôi không làm gì cả. Vì vậy, cuối cùng không thường được + +230 +00:15:18,730 --> 00:15:22,750 +sử dụng, nhưng đôi khi nó có thể hữu ích khi bạn muốn một số mã thực thi + +231 +00:15:22,990 --> 00:15:27,990 +bất kể mã bạn đang thử thành công hay thất bại. Trong bài học tiếp theo, tôi sẽ chỉ cho bạn cách + +232 +00:15:29,440 --> 00:15:32,170 +bạn có thể nêu ra các trường hợp ngoại lệ của riêng mình. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Completed-Day-30-Practice-Code.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Completed-Day-30-Practice-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..d6c0c7cc0dc8b2ba4d02af9b5a729b5f38b913dc --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Completed-Day-30-Practice-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-30-end#main.py \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Raising your own Exceptions.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Raising your own Exceptions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..defe7409209f120e4296b02ec96200d538df382d --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Raising your own Exceptions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40d9fb63e2f1e0ffa61f7c88ca796a3faf01f322cec585cc6d768e45b755d229 +size 21040575 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Raising your own Exceptions_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Raising your own Exceptions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1d6c209b8322e8286733d1f0288c2db30a6ee50f --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/003 Raising your own Exceptions_vi.srt @@ -0,0 +1,240 @@ +1 +00:00:00,630 --> 00:00:04,580 +Trong bài học này, tôi sẽ chỉ cho bạn cách bạn có thể tạo các ngoại lệ của riêng mình + +2 +00:00:04,580 --> 00:00:07,470 +trong trường hợp mã của bạn gặp phải các tình huống không mong muốn. + +3 +00:00:08,250 --> 00:00:13,140 +Vì vậy, đây là bốn từ khóa quan trọng nhất khi nói đến xử lý lỗi + +4 +00:00:13,140 --> 00:00:15,360 +và bắt các trường hợp ngoại lệ. + +5 +00:00:15,870 --> 00:00:20,790 +Từ khóa cuối cùng có liên quan là một từ khóa được gọi là tăng. + +6 +00:00:21,450 --> 00:00:25,890 +Và những gì điều này cho phép chúng tôi làm là nâng cao các ngoại lệ của riêng chúng tôi. + +7 +00:00:27,090 --> 00:00:27,930 +Ví dụ: + +8 +00:00:27,960 --> 00:00:32,729 +giả sử tôi quyết định rằng ở cuối tất cả tệp của chúng tôi, bất + +9 +00:00:32,970 --> 00:00:37,140 +kể tệp này đã được xử lý hay chưa, nếu có lỗi nếu không + +10 +00:00:37,140 --> 00:00:38,160 +có lỗi, tôi + +11 +00:00:38,520 --> 00:00:43,110 +vẫn sẽ nêu ra một ngoại lệ. Và để nâng cao một ngoại lệ, tất + +12 +00:00:43,140 --> 00:00:47,460 +cả những gì bạn phải làm là nhấn vào một trong các lớp ngoại lệ đã biết. + +13 +00:00:47,670 --> 00:00:52,020 +Vì vậy, giả sử tôi vừa quyết định nêu ra một lỗi chính. Bây giờ, khi tôi nhấn run, bạn có + +14 +00:00:52,050 --> 00:00:56,250 +thể thấy bất kể điều gì đã xảy ra và trên thực tế, không có lỗi. + +15 +00:00:56,490 --> 00:01:00,270 +Tôi đã quyết định nêu ra lỗi này và đó là những gì tôi thấy ngay tại đây. + +16 +00:01:00,570 --> 00:01:02,760 +Tôi có thể thay đổi điều đó thành lỗi + +17 +00:01:03,150 --> 00:01:05,640 +loại và đó là điều sẽ làm hỏng mã của tôi. + +18 +00:01:06,150 --> 00:01:10,230 +Và tôi thậm chí có thể chỉ định một thông báo cùng với lỗi này. + +19 +00:01:10,230 --> 00:01:14,670 +Vì vậy, tôi có thể nói nâng lỗi loại và giả sử thông báo là vậy, và bạn có thể thấy + +20 +00:01:17,250 --> 00:01:21,510 +bây giờ khi nó chạy, nó gặp lỗi loại đó. Và nó nói rằng, đây là + +21 +00:01:21,570 --> 00:01:26,490 +một lỗi mà tôi đã tạo ra. Vì vậy, khi nào bạn có thể muốn nêu ra lỗi? + +22 +00:01:27,210 --> 00:01:27,630 +Chà, + +23 +00:01:27,630 --> 00:01:31,620 +hãy bình luận về tất cả mã mà chúng ta có vì chúng ta có lỗi kiểu đó ở + +24 +00:01:31,620 --> 00:01:34,320 +cuối nên nó sẽ luôn gặp sự cố mã bất kể thế nào. + +25 +00:01:34,590 --> 00:01:37,200 +Vì vậy, chúng ta hãy bình luận nó ra và hãy bắt đầu lại từ đầu. + +26 +00:01:37,560 --> 00:01:41,550 +Giả sử rằng tôi quyết định tính toán chỉ số khối cơ thể hoặc chỉ số BMI + +27 +00:01:41,550 --> 00:01:46,080 +của một người nào đó và tôi đang yêu cầu họ nhập chiều cao của họ như một chiếc phao. + +28 +00:01:46,140 --> 00:01:50,340 +Vì vậy, đây sẽ là chiều cao của chúng tính bằng mét và cân nặng của chúng dưới dạng số nguyên. + +29 +00:01:50,880 --> 00:01:55,880 +Bây giờ tôi có thể tính chỉ số BMI bằng cách lấy cân nặng / chiều cao * chiều cao. + +30 +00:02:00,360 --> 00:02:05,360 +Và bạn có thể làm điều này và bọc nó bên trong một số dấu ngoặc đơn, hoặc bạn có + +31 +00:02:05,700 --> 00:02:09,240 +thể sử dụng hàm lũy thừa hoặc tốt hơn nữa là bạn có + +32 +00:02:09,240 --> 00:02:13,950 +thể thực sự sử dụng số mũ nội sẵn, vì vậy chiều cao bằng lũy thừa của 2. + +33 +00:02:15,270 --> 00:02:18,870 +Bất kể chúng ta sử dụng cách nào, chúng ta có thể in ra chỉ số BMI. + +34 +00:02:19,140 --> 00:02:24,140 +Nhưng nếu tôi cung cấp một chiều cao chỉ là chiều cao phi thực tế của con người, + +35 +00:02:24,270 --> 00:02:27,180 +thì hãy nói rằng có cao hơn 45 mét, giống + +36 +00:02:27,270 --> 00:02:29,880 +như một tòa nhà bốn tầng nào đó. + +37 +00:02:30,390 --> 00:02:35,070 +Và sau đó tôi đưa cho họ một quả cân, vậy giả sử chúng là 67 kg. + +38 +00:02:35,400 --> 00:02:39,360 +Sau đó, rõ ràng là một sai lầm đã được thực hiện ở đâu đó trong chiều cao, phải không? + +39 +00:02:39,360 --> 00:02:42,210 +Bởi vì điều này không nằm trong phạm vi bình thường của con người. + +40 +00:02:42,210 --> 00:02:45,990 +Đây giống như chiều cao của Godzilla. Nếu tôi tiếp tục và nhấn + +41 +00:02:46,260 --> 00:02:50,190 +enter, bạn có thể thấy rằng chúng tôi đạt được BMI và nó + +42 +00:02:50,520 --> 00:02:54,870 +được tính toán chính xác và không có sai số vì mọi thứ đều hoàn toàn + +43 +00:02:54,870 --> 00:02:59,040 +hợp lệ ngoài thực tế là chiều cao này không thực sự quá 3 mét. + +44 +00:02:59,740 --> 00:03:03,100 +Trong trường hợp này, chúng tôi có thể muốn nêu ra ngoại lệ của riêng mình. + +45 +00:03:03,520 --> 00:03:08,520 +Vì vậy, chúng ta có thể tiếp tục và nói rằng nếu chiều cao lớn hơn 3 mét, tốt, trong trường hợp + +46 +00:03:11,050 --> 00:03:13,720 +đó, nó có thể không phải là chiều cao hợp lệ. + +47 +00:03:14,020 --> 00:03:17,560 +Vì vậy, chúng tôi có thể tiếp tục và nâng cao một lỗi giá trị. + +48 +00:03:17,950 --> 00:03:22,210 +Vì vậy, đây là một lỗi cho biết rằng bất kỳ giá trị nào được + +49 +00:03:22,570 --> 00:03:25,210 +nhập vào làm đối số có thể là sai. + +50 +00:03:25,720 --> 00:03:28,300 +Và chúng tôi có thể đi kèm với điều đó bằng một thông điệp. + +51 +00:03:29,410 --> 00:03:33,310 +Chiều cao của con người không được quá 3 mét. + +52 +00:03:34,780 --> 00:03:38,920 +Bây giờ, khi chúng tôi chạy mã của mình và người dùng nhập nhầm chiều + +53 +00:03:38,980 --> 00:03:43,540 +cao, thì nó sẽ thực sự cung cấp cho chúng tôi lỗi này và nó sẽ không + +54 +00:03:43,570 --> 00:03:47,290 +tiếp tục cung cấp cho họ một chỉ số BMI không chính xác. + +55 +00:03:47,980 --> 00:03:51,310 +Vì vậy, đây là cách bạn có thể nêu ra các ngoại + +56 +00:03:51,640 --> 00:03:55,360 +lệ của riêng mình khi có một số thứ nhất định không bị mã + +57 +00:03:55,360 --> 00:04:00,340 +bắt vì mã đó hoàn toàn hợp lệ, nhưng trên thực tế nó sẽ tạo ra kết quả sai. + +58 +00:04:01,960 --> 00:04:05,950 +Bây giờ chúng ta đã thấy tất cả các khía cạnh này của các trường hợp ngoại + +59 +00:04:06,400 --> 00:04:10,300 +lệ, tôi muốn bạn tìm hiểu kỹ một số trường hợp ngoại lệ thường xảy ra. + +60 +00:04:10,810 --> 00:04:13,840 +Vì vậy, hãy chuyển sang bài học tiếp theo, nơi tôi có một bài tập cho bạn. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 Exercise-33.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 Exercise-33.url new file mode 100644 index 0000000000000000000000000000000000000000..959c055b025785fb122fad117e200609c2d98898 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 Exercise-33.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/64aebca1-8823-40fd-8560-b5b64c80a318 \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 How-to-join-Auditorium.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 [Interactive Coding Exercise] IndexError Handling.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 [Interactive Coding Exercise] IndexError Handling.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..26b2f51714ecaa7430c7195cd0654e68fed942a9 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 [Interactive Coding Exercise] IndexError Handling.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebce367ac9ecb0c90f61bd5a2c95aab318c7b4adf57d755f6e02ee12551dd5d3 +size 13806116 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 [Interactive Coding Exercise] IndexError Handling_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 [Interactive Coding Exercise] IndexError Handling_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2a819d47721382a8ecf19aecaa993575c5a9836b --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/004 [Interactive Coding Exercise] IndexError Handling_vi.srt @@ -0,0 +1,360 @@ +1 +00:00:00,840 --> 00:00:02,160 +Người hướng dẫn: Trong bài + +2 +00:00:02,160 --> 00:00:04,920 +tập này, chúng ta sẽ nướng một số chiếc bánh nướng. + +3 +00:00:04,920 --> 00:00:07,770 +Nếu bạn nhìn vào mã bắt đầu, bạn sẽ thấy + +4 +00:00:07,770 --> 00:00:12,770 +rằng chúng tôi đang lấy dữ liệu đầu vào là danh sách các loại trái + +5 +00:00:13,140 --> 00:00:16,379 +cây và đưa nó vào mã của mình, và ở dòng 11, + +6 +00:00:16,379 --> 00:00:21,380 +chúng tôi gọi hàm làm bánh và nói với nó chiếc bánh nào trong danh + +7 +00:00:22,410 --> 00:00:27,410 +sách các loại trái cây của chúng tôi để làm. + +8 +00:00:27,840 --> 00:00:32,790 +Vì vậy, nếu tạo ra chiếc bánh bằng 0, thì đó sẽ là làm bánh táo, + +9 +00:00:32,790 --> 00:00:35,310 +làm bánh một, đó sẽ là bánh lê, làm + +10 +00:00:35,310 --> 00:00:37,830 +bánh hai, đó sẽ là bánh cam. + +11 +00:00:37,830 --> 00:00:40,530 +Thật không may, hiện tại chúng tôi đang cung cấp + +12 +00:00:40,530 --> 00:00:44,820 +một chỉ mục nằm ngoài phạm vi danh sách các loại trái cây của chúng tôi. + +13 +00:00:44,820 --> 00:00:46,230 +Giống như chúng ta đang cố gắng + +14 +00:00:46,230 --> 00:00:49,200 +làm một chiếc bánh với một loại trái cây không hề tồn tại. + +15 +00:00:49,200 --> 00:00:51,052 +Điều này thường làm hỏng + +16 +00:00:51,052 --> 00:00:54,450 +mã của chúng tôi và thực tế, nếu bạn chỉ thử + +17 +00:00:54,450 --> 00:00:55,770 +chạy mã giống như + +18 +00:00:55,770 --> 00:01:00,000 +mã bắt đầu, bạn sẽ thấy lỗi ở vùng đầu ra. + +19 +00:01:00,000 --> 00:01:04,709 +Công việc của bạn là cập nhật chức năng làm bánh để trong trường hợp người + +20 +00:01:04,709 --> 00:01:06,810 +dùng làm điều gì đó ngớ ngẩn như thế + +21 +00:01:06,810 --> 00:01:09,390 +này trên dòng 11 khi họ cố gắng chọn một + +22 +00:01:09,390 --> 00:01:12,600 +loại trái cây không tồn tại trong danh sách các loại + +23 +00:01:12,600 --> 00:01:14,580 +trái cây của chúng tôi, thì thay + +24 +00:01:14,580 --> 00:01:17,010 +vì làm hỏng chương trình, chúng tôi sẽ + +25 +00:01:17,010 --> 00:01:19,710 +sắp in "bánh trái cây". + +26 +00:01:19,710 --> 00:01:21,690 +Vì vậy, chúng tôi không biết bạn muốn loại trái + +27 +00:01:21,690 --> 00:01:24,210 +cây nào, chúng tôi sẽ nói với bạn rằng chúng tôi vừa làm một + +28 +00:01:24,210 --> 00:01:26,490 +ít bánh trái cây và yêu cầu người dùng rời đi. + +29 +00:01:26,490 --> 00:01:28,770 +Nhưng đây là một kỹ năng thực sự + +30 +00:01:28,770 --> 00:01:31,050 +quan trọng, là cách chúng ta có + +31 +00:01:31,050 --> 00:01:35,430 +thể xử lý lỗi thay vì để nó làm hỏng ứng dụng của mình. + +32 +00:01:35,430 --> 00:01:37,380 +Hãy xem trong khung mô + +33 +00:01:37,380 --> 00:01:39,300 +tả, xem đầu vào của ví + +34 +00:01:39,300 --> 00:01:42,750 +dụ và đầu ra của ví dụ được mong đợi, đồng + +35 +00:01:42,750 --> 00:01:47,223 +thời viết một số mã để nắm bắt ngoại lệ này. + +36 +00:01:48,060 --> 00:01:48,893 +Hãy đi ngay bây giờ. + +37 +00:01:56,340 --> 00:01:59,760 +Điều đầu tiên chúng tôi làm là sử dụng khối thử, + +38 +00:01:59,760 --> 00:02:01,260 +chúng tôi phát hiện dòng + +39 +00:02:01,260 --> 00:02:05,880 +mã có khả năng gây ra lỗi và trong trường hợp này, đó là dòng trên + +40 +00:02:05,880 --> 00:02:09,150 +dòng thứ bảy nơi chúng tôi cố gắng truy cập danh + +41 +00:02:09,150 --> 00:02:12,150 +sách các loại trái cây tại một thời điểm. + +42 +00:02:12,150 --> 00:02:15,630 +chỉ số có thể tồn tại hoặc không. + +43 +00:02:15,630 --> 00:02:18,930 +Khi chúng ta gọi dòng 13, tạo ra chiếc bánh số bốn, + +44 +00:02:18,930 --> 00:02:21,810 +chúng ta chuyển số bốn vào dòng bảy và cố + +45 +00:02:21,810 --> 00:02:26,070 +gắng truy cập danh sách các loại trái cây ở chỉ số bốn. + +46 +00:02:26,070 --> 00:02:27,750 +Vì vậy, điều đó rõ ràng là không tồn tại. + +47 +00:02:27,750 --> 00:02:29,520 +Chỉ số ba thậm chí không tồn tại. + +48 +00:02:29,520 --> 00:02:32,340 +Chỉ có ba mục trong danh sách của chúng tôi. + +49 +00:02:32,340 --> 00:02:34,230 +Vì vậy, dòng này, dòng thứ bảy, + +50 +00:02:34,230 --> 00:02:36,840 +là dòng gây ra lỗi chỉ mục và đó là lỗi mà + +51 +00:02:36,840 --> 00:02:38,580 +chúng tôi đang xử lý trong + +52 +00:02:38,580 --> 00:02:41,463 +môi trường an toàn này đang được thử. + +53 +00:02:43,050 --> 00:02:46,830 +Phần tiếp theo là nơi chúng ta có ngoại lệ. + +54 +00:02:46,830 --> 00:02:48,750 +Chúng tôi biết khi chạy mã, loại + +55 +00:02:48,750 --> 00:02:51,870 +ngoại lệ mà chúng tôi nhận được là lỗi chỉ mục và đây là + +56 +00:02:51,870 --> 00:02:55,320 +ngoại lệ mà chúng tôi muốn xử lý trong trường hợp này. + +57 +00:02:55,320 --> 00:02:57,780 +Bây giờ, có thể có rất nhiều loại lỗi + +58 +00:02:57,780 --> 00:02:59,310 +và ngoại lệ khác. + +59 +00:02:59,310 --> 00:03:02,040 +Chúng tôi không muốn xử lý tất cả chúng theo cách này bởi + +60 +00:03:02,040 --> 00:03:03,150 +vì có thể có những điều + +61 +00:03:03,150 --> 00:03:05,580 +mà chúng tôi thậm chí không dự đoán được là sai. + +62 +00:03:05,580 --> 00:03:07,950 +Điều duy nhất chúng tôi biết có thể xảy ra sai + +63 +00:03:07,950 --> 00:03:10,260 +sót mà chúng tôi muốn xử lý là lỗi chỉ mục. + +64 +00:03:10,260 --> 00:03:12,870 +Vì vậy, chúng tôi có lỗi ngoại trừ chỉ + +65 +00:03:12,870 --> 00:03:14,880 +mục và khi lỗi này xảy ra, chúng + +66 +00:03:14,880 --> 00:03:17,520 +tôi sẽ in bánh trái cây thay vì làm hỏng + +67 +00:03:17,520 --> 00:03:19,983 +ứng dụng của mình. + +68 +00:03:21,690 --> 00:03:23,580 +Cuối cùng, chúng ta có một khối + +69 +00:03:23,580 --> 00:03:27,450 +else để xử lý trường hợp không có ngoại lệ, và trong trường + +70 +00:03:27,450 --> 00:03:30,120 +hợp này, chúng ta sẽ làm như thường lệ, + +71 +00:03:30,120 --> 00:03:33,810 +đó là in tên của loại trái cây từ danh sách được chọn cùng + +72 +00:03:33,810 --> 00:03:36,153 +với từ đó. bánh. + +73 +00:03:37,050 --> 00:03:40,290 +Và khối mã hiện có trong make pie + +74 +00:03:40,290 --> 00:03:44,700 +hiện đã an toàn trước lỗi chỉ mục tiềm ẩn. + +75 +00:03:44,700 --> 00:03:46,854 +Nếu người dùng thay đổi dòng + +76 +00:03:46,854 --> 00:03:49,860 +13 thành make pie one, make pie two, + +77 +00:03:49,860 --> 00:03:52,410 +nó sẽ hoạt động như mong đợi, in + +78 +00:03:52,410 --> 00:03:55,500 +ra tên trái cây và từ pie, nhưng nếu họ + +79 +00:03:55,500 --> 00:03:57,060 +mắc lỗi và vô tình vượt + +80 +00:03:57,060 --> 00:04:00,900 +quá phạm vi, của danh sách, thì chúng ta sẽ in + +81 +00:04:00,900 --> 00:04:03,330 +bánh trái cây. + +82 +00:04:03,330 --> 00:04:06,270 +Không có sự cố, không có chuông báo động, + +83 +00:04:06,270 --> 00:04:09,900 +mọi thứ đều an toàn và được xử lý, đó là điểm mấu chốt + +84 +00:04:09,900 --> 00:04:12,960 +trong việc xử lý ngoại lệ của chúng tôi. + +85 +00:04:12,960 --> 00:04:14,700 +Và đây là một kỹ năng thực sự quan trọng, + +86 +00:04:14,700 --> 00:04:17,370 +nếu không muốn nói là bị các nhà phát triển bỏ qua một chút + +87 +00:04:17,370 --> 00:04:19,890 +vì việc nghĩ về các trường hợp nguy hiểm và xử lý chúng + +88 +00:04:19,890 --> 00:04:21,630 +mỗi lần không hề thú vị. + +89 +00:04:21,630 --> 00:04:23,970 +Nhưng đây là một kỹ năng quan trọng trên con đường trở + +90 +00:04:23,970 --> 00:04:26,073 +thành một nhà phát triển chuyên nghiệp. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 Exercise-34.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 Exercise-34.url new file mode 100644 index 0000000000000000000000000000000000000000..5e4eae3d8fdfabcdda9f8b9ff7c5ec9b861420e1 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 Exercise-34.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/186be9d3-20af-425c-8965-54631ab59d2e \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 How-to-join-Auditorium.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 [Interactive Coding Exercise] KeyError Handling.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 [Interactive Coding Exercise] KeyError Handling.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cb10f4940790cea53a34869c6dceedf9e7c99da0 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 [Interactive Coding Exercise] KeyError Handling.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a99afd91fa0258301a132c9ba00e0cdb8a74bb3818bc50f48692e953e4cf017 +size 12211815 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 [Interactive Coding Exercise] KeyError Handling_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 [Interactive Coding Exercise] KeyError Handling_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..29e55e4b2b3c4b97734a3edaec1bb7288cf542ec --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/005 [Interactive Coding Exercise] KeyError Handling_vi.srt @@ -0,0 +1,296 @@ +1 +00:00:00,600 --> 00:00:01,500 +Người hướng dẫn: + +2 +00:00:01,500 --> 00:00:03,990 +Trong bài tập này, chúng ta sẽ viết một số + +3 +00:00:03,990 --> 00:00:07,890 +mã xử lý ngoại lệ để xử lý một loại ngoại lệ khác, KeyError. + +4 +00:00:07,890 --> 00:00:10,380 +Khi bạn nghe thấy các phím, có thể bạn đang nghĩ + +5 +00:00:10,380 --> 00:00:11,910 +đến từ điển và bạn đã đúng. + +6 +00:00:11,910 --> 00:00:13,980 +Vì vậy, trong trường hợp này, trong khu + +7 +00:00:13,980 --> 00:00:15,780 +vực nhập liệu, bạn có thể thấy chúng + +8 +00:00:15,780 --> 00:00:18,390 +tôi có danh sách từ điển chứa một số dữ liệu về một + +9 +00:00:18,390 --> 00:00:20,400 +số bài đăng trên Facebook. + +10 +00:00:20,400 --> 00:00:23,040 +Như bạn có thể biết, các bài đăng trên Facebook có thể có + +11 +00:00:23,040 --> 00:00:24,870 +lượt thích, có thể có bình luận, có thể + +12 +00:00:24,870 --> 00:00:27,840 +có lượt chia sẻ, có thể có nhiều thuộc tính khác nhau được gán cho + +13 +00:00:27,840 --> 00:00:30,660 +chúng và điều này có thể được thu thập trong từ điển. + +14 +00:00:30,660 --> 00:00:34,161 +Bây giờ, sự cố xảy ra ở dòng thứ bảy của + +15 +00:00:34,161 --> 00:00:38,820 +mã bắt đầu nơi chúng tôi cố gắng truy cập, vào từng + +16 +00:00:38,820 --> 00:00:43,820 +từ điển, bài đăng, số lượt thích mà bài đăng đó có. + +17 +00:00:44,340 --> 00:00:46,410 +Bây giờ, vấn đề ở đây là nếu bạn nhìn vào + +18 +00:00:46,410 --> 00:00:49,530 +thông tin đầu vào hoặc nếu bạn nhìn vào các bài đăng trên + +19 +00:00:49,530 --> 00:00:52,650 +Facebook theo cách có cấu trúc tốt hơn trong khung mô + +20 +00:00:52,650 --> 00:00:54,420 +tả, bạn sẽ thấy rằng một số bài đăng + +21 +00:00:54,420 --> 00:00:58,260 +đó, một số từ điển đó không có giá trị cho lượt thích. + +22 +00:00:58,260 --> 00:01:00,450 +Những bài đăng đó không hề được yêu thích. + +23 +00:01:00,450 --> 00:01:04,800 +Họ bị ghét hoặc họ có những phản ứng khác nhau. + +24 +00:01:04,800 --> 00:01:07,680 +Nhưng dù thế nào đi nữa, nếu chúng ta cố gắng + +25 +00:01:07,680 --> 00:01:10,275 +truy cập một khóa từ một từ điển không + +26 +00:01:10,275 --> 00:01:12,840 +tồn tại, chúng ta sẽ gặp KeyError và bạn + +27 +00:01:12,840 --> 00:01:14,640 +sẽ thấy điều đó nếu bạn cố chạy + +28 +00:01:14,640 --> 00:01:17,520 +mã mà không thay đổi mã bắt đầu. + +29 +00:01:17,520 --> 00:01:20,670 +Bây giờ, mục tiêu là bạn sử dụng những gì đã học + +30 +00:01:20,670 --> 00:01:22,080 +về xử lý ngoại lệ để ngăn + +31 +00:01:22,080 --> 00:01:24,513 +chặn chương trình bị lỗi. + +32 +00:01:25,380 --> 00:01:28,980 +Và thay vào đó, chúng tôi sẽ in ra tổng số lượt thích + +33 +00:01:28,980 --> 00:01:31,830 +cho các bài đăng trên Facebook của người + +34 +00:01:31,830 --> 00:01:36,830 +dùng này và chúng tôi sẽ bỏ qua những bài không có lượt thích cho + +35 +00:01:37,020 --> 00:01:39,360 +bài đăng cụ thể đó. + +36 +00:01:39,360 --> 00:01:42,330 +Hãy nhìn vào khung mô tả, đọc qua nó, xem mã bắt đầu + +37 +00:01:42,330 --> 00:01:43,980 +và xem liệu bạn có thể tìm ra + +38 +00:01:43,980 --> 00:01:45,360 +cách để vượt qua tất cả các + +39 +00:01:45,360 --> 00:01:48,243 +bài kiểm tra trong bài tập này hay không. + +40 +00:01:53,910 --> 00:01:55,770 +Điều đầu tiên chúng tôi + +41 +00:01:55,770 --> 00:02:00,770 +làm, như mọi khi, là đặt mã có vấn đề vào trong một nhà tù nhỏ, + +42 +00:02:00,810 --> 00:02:02,490 +một nhà tù thử. + +43 +00:02:02,490 --> 00:02:05,850 +Và trong trường hợp này, bên trong vòng lặp for, chúng + +44 +00:02:05,850 --> 00:02:08,550 +ta có một khối khác, đó là khối try. + +45 +00:02:08,550 --> 00:02:12,270 +Bên trong khối thử, chúng tôi có dòng mã vi phạm, + +46 +00:02:12,270 --> 00:02:15,870 +Total_likes bằng Total_likes cộng với bài đăng, + +47 +00:02:15,870 --> 00:02:18,480 +truy cập từng từ điển mà chúng tôi + +48 +00:02:18,480 --> 00:02:22,923 +gọi là bài đăng và truy cập nó bằng phím lượt thích. + +49 +00:02:23,760 --> 00:02:26,430 +Bây giờ, đây là dòng mà chúng ta biết gây + +50 +00:02:26,430 --> 00:02:30,180 +ra lỗi và đây là dòng mà chúng ta sẽ thử thực thi. + +51 +00:02:30,180 --> 00:02:33,240 +Điều gì xảy ra nếu lần thử của chúng tôi thất bại? + +52 +00:02:33,240 --> 00:02:36,570 +Chà, chúng ta sẽ thêm một khối chấp nhận và chúng + +53 +00:02:36,570 --> 00:02:38,160 +ta sẽ xác định khối chấp + +54 +00:02:38,160 --> 00:02:40,740 +nhận đó là một ngoại lệ KeyError. + +55 +00:02:40,740 --> 00:02:44,970 +Viết chấp nhận KeyError: có nghĩa là nếu KeyError + +56 +00:02:44,970 --> 00:02:48,060 +xảy ra khi chúng ta cố chạy dòng thứ + +57 +00:02:48,060 --> 00:02:53,060 +bảy, thì hành động sẽ bỏ qua dòng đó, và thay vào đó, chúng + +58 +00:02:53,070 --> 00:02:56,400 +ta sẽ chạy pass, dòng này bên trong vòng + +59 +00:02:56,400 --> 00:02:59,280 +lặp sẽ bỏ qua dòng này và đi tới mục + +60 +00:02:59,280 --> 00:03:02,280 +tiếp theo trong vòng lặp. + +61 +00:03:02,280 --> 00:03:04,415 +Vì vậy, chúng ta sẽ duyệt qua tất + +62 +00:03:04,415 --> 00:03:08,670 +cả các từ điển trong danh sách có tên facebook_posts. + +63 +00:03:08,670 --> 00:03:11,730 +Nếu một trong số họ không có lượt thích nào, chúng + +64 +00:03:11,730 --> 00:03:15,090 +tôi sẽ chuyển cái đó và tiếp tục với cái tiếp theo. + +65 +00:03:15,090 --> 00:03:19,290 +Và cuối cùng, chúng tôi tích lũy được tổng + +66 +00:03:19,290 --> 00:03:21,540 +số lượt thích và in nó ra, + +67 +00:03:21,540 --> 00:03:25,350 +và đó là giải pháp cho thử thách này. + +68 +00:03:25,350 --> 00:03:27,870 +Xử lý ngoại lệ cực kỳ hiệu quả và vô cùng + +69 +00:03:27,870 --> 00:03:29,370 +hữu ích, mặc dù đôi khi + +70 +00:03:29,370 --> 00:03:32,790 +nó bị các nhà phát triển bỏ qua nhưng hy vọng tìm hiểu + +71 +00:03:32,790 --> 00:03:36,660 +thêm các ngoại lệ và suy nghĩ về việc xử lý ngoại lệ bằng cách + +72 +00:03:36,660 --> 00:03:39,360 +sử dụng các khối thử/chấp nhận, bạn sẽ nắm + +73 +00:03:39,360 --> 00:03:42,450 +bắt được một phần thực sự quan trọng của quá trình + +74 +00:03:42,450 --> 00:03:45,933 +phát triển, đó là lỗi. và xử lý ngoại lệ. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Code Exercise Exception Handling in the NATO Phonetic Alphabet Project.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Code Exercise Exception Handling in the NATO Phonetic Alphabet Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..dfcbf45b68162fe5eb4506144102f961c2d0e7e3 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Code Exercise Exception Handling in the NATO Phonetic Alphabet Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:730b39bc3f1abdd83263768309f4cb2c29cf05bb184c03b6dbe40008f48805dc +size 42302769 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Code Exercise Exception Handling in the NATO Phonetic Alphabet Project_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Code Exercise Exception Handling in the NATO Phonetic Alphabet Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..61058b1425a4fb705ab5653d63424e0d4a3b78b7 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Code Exercise Exception Handling in the NATO Phonetic Alphabet Project_vi.srt @@ -0,0 +1,380 @@ +1 +00:00:00,180 --> 00:00:02,340 +Bây giờ đối với bài tập viết mã cuối + +2 +00:00:02,370 --> 00:00:06,060 +cùng, chúng tôi thực sự sẽ chuyển sang một dự án trước đó mà chúng tôi đã tạo. + +3 +00:00:06,480 --> 00:00:10,230 +Đây là dự án bảng chữ cái NATO mà chúng tôi đã tạo ra cách đây vài ngày. + +4 +00:00:10,770 --> 00:00:12,150 +Và nó khá đơn giản. + +5 +00:00:12,300 --> 00:00:16,590 +Tất cả những gì nó làm là lấy dữ liệu bên trong nato_phonetic_alphabet này. + +6 +00:00:16,590 --> 00:00:17,423 +csv và + +7 +00:00:17,730 --> 00:00:22,730 +nó sử dụng điều đó để tạo từ điển để chúng ta có từng chữ cái làm + +8 +00:00:25,230 --> 00:00:30,230 +khóa và bảng chữ cái phiên âm thực tế làm giá trị cho mỗi khóa đó. + +9 +00:00:32,189 --> 00:00:34,140 +Bây giờ, nếu tôi tiếp tục và nhấn run, + +10 +00:00:35,250 --> 00:00:39,240 +bạn có thể thấy rằng toàn bộ từ điển bảng chữ cái phiên âm được in ở đây và đây + +11 +00:00:39,510 --> 00:00:42,570 +là cấu trúc của từ điển đó. Bây giờ, điều tiếp + +12 +00:00:42,570 --> 00:00:47,570 +theo nó yêu cầu chúng ta là nhập một từ và nó lấy từ đó và tạo + +13 +00:00:49,140 --> 00:00:54,140 +một danh sách mới bằng cách sử dụng khả năng hiểu danh sách khớp từng chữ cái + +14 +00:00:55,860 --> 00:01:00,420 +với bảng chữ cái phiên âm chính xác. Vì vậy, Angela trở thành Alpha Tháng Mười Một Golf + +15 +00:01:00,420 --> 00:01:01,320 +Echo Lima Alpha. + +16 +00:01:01,680 --> 00:01:05,970 +Vì vậy, bạn nên nhớ tất cả những điều này khi tạo dự án này vài ngày trước. + +17 +00:01:06,600 --> 00:01:06,870 +Bây + +18 +00:01:06,870 --> 00:01:11,870 +giờ, những gì chúng tôi sẽ làm là chúng tôi sẽ cập nhật và làm mới dự án này để nó + +19 +00:01:12,780 --> 00:01:15,840 +thậm chí còn tốt hơn trước. Bây giờ, nếu bạn + +20 +00:01:15,870 --> 00:01:20,870 +không có quyền truy cập vào dự án cuối cùng của dự án bảng chữ cái + +21 +00:01:21,330 --> 00:01:25,110 +NATO này, thì đừng lo lắng. Chỉ cần truy cập tài nguyên khóa học cho + +22 +00:01:25,440 --> 00:01:29,880 +các bài học hôm nay và bạn sẽ tìm thấy tệp bắt đầu khớp chính xác với những gì bạn thấy ở đây. + +23 +00:01:30,990 --> 00:01:35,990 +Bây giờ công việc của bạn là giải quyết một tình huống cụ thể vì chúng tôi đang + +24 +00:01:37,080 --> 00:01:39,630 +dựa vào người dùng để nhập một từ. + +25 +00:01:40,260 --> 00:01:44,670 +Sau đó, nếu họ nhập một thứ gì đó thực sự không có trong từ điển + +26 +00:01:44,940 --> 00:01:48,010 +này, giả sử họ chỉ nhập một số, 1234, thì + +27 +00:01:48,510 --> 00:01:52,740 +chúng tôi sẽ gặp sự cố và chúng tôi gặp lỗi khóa trong trường hợp này. + +28 +00:01:53,220 --> 00:01:58,220 +Bây giờ những gì chúng ta muốn xảy ra thay vào đó là chúng ta nhập một từ và chúng ta nhập + +29 +00:01:58,440 --> 00:02:01,260 +một thứ hoàn toàn vô nghĩa. Chúng tôi nhấn enter. + +30 +00:02:01,410 --> 00:02:05,190 +Và nó cho chúng ta biết rằng xin lỗi, xin vui lòng chỉ có các chữ cái trong bảng chữ cái. + +31 +00:02:05,520 --> 00:02:08,940 +Và sau đó nó quay trở lại để cung cấp cho chúng tôi cùng một lời nhắc. + +32 +00:02:09,449 --> 00:02:12,540 +Và nếu chúng ta tiếp tục từ chối và chúng ta tiếp tục + +33 +00:02:12,840 --> 00:02:17,340 +nhập số, thì nó sẽ liên tục cung cấp cho chúng ta phản hồi này cho đến khi chúng ta + +34 +00:02:17,370 --> 00:02:20,970 +thực sự nhập một thứ gì đó chỉ chứa các chữ cái trong bảng chữ cái + +35 +00:02:21,390 --> 00:02:24,660 +và nó thực sự tạo ra bảng chữ cái phiên âm cho chúng ta. + +36 +00:02:25,230 --> 00:02:29,160 +Đây là mục tiêu mà chúng tôi đang cố gắng đạt được. Và để làm được điều này, bạn + +37 +00:02:29,280 --> 00:02:32,400 +sẽ phải sử dụng các kỹ năng xử lý ngoại lệ của mình. + +38 +00:02:33,000 --> 00:02:35,160 +Hãy suy nghĩ về cách bạn có thể đạt + +39 +00:02:35,520 --> 00:02:38,190 +được điều này, tạm dừng video và hoàn thành thử thách này. + +40 +00:02:41,520 --> 00:02:46,350 +Bây giờ chúng tôi biết mình đang hướng tới điều gì, bước tiếp theo là thực + +41 +00:02:46,350 --> 00:02:50,670 +sự cố gắng đạt được điều đó. Bây giờ chúng tôi biết rằng phần mã + +42 +00:02:51,030 --> 00:02:54,780 +dễ bị lỗi hoặc đôi khi có thể có vấn đề là dòng này ngay + +43 +00:02:55,350 --> 00:03:00,070 +tại đây, bởi vì chúng tôi đang xem qua từ điển phiên âm này và chúng tôi chuyển nó một + +44 +00:03:00,070 --> 00:03:04,480 +khóa và khóa đó phụ thuộc hoàn toàn vào những gì người dùng đưa vào đầu vào này. + +45 +00:03:04,960 --> 00:03:09,760 +Vì vậy, điều đó có nghĩa là nếu họ đặt một thứ gì đó là một con số và nó không tồn tại bên trong + +46 +00:03:09,760 --> 00:03:12,700 +từ điển phiên âm, đó là lúc chúng tôi nhận được lỗi chính của mình. + +47 +00:03:13,270 --> 00:03:17,500 +Vì vậy, đây là dòng mà chúng tôi muốn đặt sau một khối thử. + +48 +00:03:19,000 --> 00:03:19,930 +Như thế này. + +49 +00:03:20,560 --> 00:03:25,560 +Và khi chúng tôi thử dòng này và nếu nó thực sự không thành công và chúng tôi kết thúc với một + +50 +00:03:26,050 --> 00:03:28,840 +ngoại lệ, thì chúng tôi muốn nắm bắt ngoại lệ đó. + +51 +00:03:29,140 --> 00:03:34,030 +Nhưng chúng tôi muốn bắt một ngoại lệ cụ thể, đó là lỗi chính. Bây giờ, chúng ta muốn làm + +52 +00:03:34,030 --> 00:03:38,470 +gì khi chúng ta thực sự có một ngoại lệ khi + +53 +00:03:38,470 --> 00:03:43,180 +khóa đó không tồn tại? Chà, điều đó có nghĩa là người dùng đã nhập một + +54 +00:03:43,270 --> 00:03:46,390 +thứ gì đó vào đầu vào không phải là một chữ cái trong bảng chữ cái. + +55 +00:03:46,930 --> 00:03:48,700 +Vì vậy, chúng tôi sẽ cung cấp cho họ một số phản hồi. + +56 +00:03:48,730 --> 00:03:53,020 +Chúng tôi chỉ đơn giản sử dụng một câu lệnh in để in 'Xin lỗi, làm ơn + +57 +00:03:53,080 --> 00:03:57,850 +chỉ các chữ cái trong bảng chữ cái. 'Hy vọng rằng cách đó chúng sẽ học được + +58 +00:03:57,970 --> 00:04:02,590 +và chúng sẽ chỉ viết các chữ cái thay vì cố gắng gõ những thứ khác + +59 +00:04:02,590 --> 00:04:05,950 +như ký hiệu hoặc số. Bây giờ, nếu mọi thứ + +60 +00:04:05,980 --> 00:04:09,430 +diễn ra tốt đẹp, vậy trong trường hợp khác, thì chúng tôi + +61 +00:04:09,460 --> 00:04:12,430 +thực sự muốn in ra danh sách đầu ra. + +62 +00:04:12,700 --> 00:04:14,500 +Bởi vì nếu dòng này thành công, thì + +63 +00:04:14,800 --> 00:04:19,750 +chúng tôi sẽ có cái đó để in ra cho người dùng. Bây giờ, vấn đề duy nhất ở đây là + +64 +00:04:19,779 --> 00:04:23,560 +nếu chúng tôi chạy mã như hiện tại, chúng tôi có thể nhập một từ, + +65 +00:04:23,980 --> 00:04:27,580 +vì vậy hãy thử một cái gì đó không phải là một từ và + +66 +00:04:28,150 --> 00:04:31,660 +chúng tôi nhận được phản hồi đó, nhưng mã của chúng tôi kết thúc. + +67 +00:04:32,110 --> 00:04:37,110 +Vì vậy, nếu chúng ta muốn mã của mình lặp lại để chúng ta yêu cầu người dùng một từ + +68 +00:04:37,990 --> 00:04:42,160 +một lần nữa, thì chúng ta sẽ phải có một số loại cơ chế như vòng + +69 +00:04:42,160 --> 00:04:44,530 +lặp hoặc một hàm. Vì vậy, tôi nghĩ + +70 +00:04:44,530 --> 00:04:49,530 +trong trường hợp này, điều tốt nhất cần làm là tạo một hàm mà tôi sẽ gọi là + +71 +00:04:51,310 --> 00:04:52,180 +create_ phonetic. + +72 +00:04:53,230 --> 00:04:57,550 +Và hàm này sẽ chứa tất cả mã này. + +73 +00:04:58,090 --> 00:05:00,310 +Vì vậy, để chạy hàm này, + +74 +00:05:00,400 --> 00:05:03,640 +tất nhiên chúng ta phải gọi nó bên ngoài hàm. + +75 +00:05:03,910 --> 00:05:06,580 +Vì vậy, khi mã chạy xuống đây, nó + +76 +00:05:06,910 --> 00:05:11,110 +nhìn thấy dòng này và nó sẽ chạy tất cả mã bên trong hàm này. + +77 +00:05:11,860 --> 00:05:16,860 +Nhưng những gì chúng tôi cũng muốn làm là nếu có trường hợp lỗi phím mà + +78 +00:05:18,400 --> 00:05:19,750 +người dùng nhập sai, + +79 +00:05:20,020 --> 00:05:23,440 +thì chúng tôi muốn cho họ cơ hội để nhập lại. + +80 +00:05:23,560 --> 00:05:26,950 +Vì vậy, chúng tôi muốn có thể chạy lại dòng mã này. + +81 +00:05:27,730 --> 00:05:32,730 +Cách dễ nhất để làm điều đó là chỉ cần gọi hàm này ngay tại đây. + +82 +00:05:33,550 --> 00:05:37,660 +Vì vậy, theo cách đó, nếu họ nhập sai, chúng tôi cung cấp cho họ một số phản hồi và + +83 +00:05:37,930 --> 00:05:40,870 +sau đó chúng tôi chuyển đến phần bắt đầu của chức năng này một + +84 +00:05:41,200 --> 00:05:44,980 +lần nữa, và chúng tôi yêu cầu họ nhập từ mới bằng cách sử dụng đầu vào này. + +85 +00:05:45,580 --> 00:05:50,580 +Và sau đó chúng tôi có thể xem liệu điều đó có hợp lệ hay không và giải + +86 +00:05:50,830 --> 00:05:54,220 +quyết điều đó cho phù hợp. Vì vậy, bây giờ khi chúng tôi chạy + +87 +00:05:54,310 --> 00:05:56,290 +mã của mình, nó sẽ không tạo ra bất kỳ + +88 +00:05:56,560 --> 00:06:01,220 +lỗi nào, mà thay vào đó, nó cung cấp cho tôi một số phản hồi và yêu cầu tôi nhập một từ khác. + +89 +00:06:02,300 --> 00:06:06,290 +Vì vậy, đây là một triển khai thực tế của việc xử lý lỗi, đảm + +90 +00:06:06,620 --> 00:06:11,620 +bảo rằng chúng tôi đang xác thực và kiểm tra đầu vào của người dùng và giải quyết + +91 +00:06:12,410 --> 00:06:15,980 +những tình huống này trước khi sử dụng xử lý ngoại lệ. + +92 +00:06:17,390 --> 00:06:21,530 +Bây giờ chúng ta đã xem xét kỹ việc xử lý ngoại lệ, trong bài học tiếp theo, chúng + +93 +00:06:21,650 --> 00:06:25,940 +ta sẽ quay lại dự án trình quản lý mật khẩu của mình và sử dụng các kỹ năng mà chúng + +94 +00:06:25,940 --> 00:06:28,190 +ta đã học được để cải thiện nó hơn nữa. + +95 +00:06:28,880 --> 00:06:31,280 +Vì vậy, về tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 NATO-Phonetic-Alphabet-for-the-Code-Exercise.zip b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 NATO-Phonetic-Alphabet-for-the-Code-Exercise.zip new file mode 100644 index 0000000000000000000000000000000000000000..5e866b43cea27f1adbcee1c43c3cd19681bd38bc --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 NATO-Phonetic-Alphabet-for-the-Code-Exercise.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dc1072a0691ab58498b1cc8915ab705e021c1a494665fb42ee431602ccfba65 +size 3908 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Solution-NATO-alphabet-improved-end.zip b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Solution-NATO-alphabet-improved-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..aa9ce015834415546fdc3cc5f55314fb1fb187c2 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/006 Solution-NATO-alphabet-improved-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fca5d4e9a9abfac6d1f915157aec93cebf685ea1b9af4f9c6db7d3974a5cadef +size 3874 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Password-Manager-End-of-Day-29.zip b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Password-Manager-End-of-Day-29.zip new file mode 100644 index 0000000000000000000000000000000000000000..4d5476d863e97145d6be3d59b13226706b57a005 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Password-Manager-End-of-Day-29.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9ae6c18b0c2a3b0c44e142d529724ff95346fcad87e3b9018ae73ba22e99105 +size 16020 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Python-JSON-Module-Documentation.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Python-JSON-Module-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..0d9ecc1649099d12ab793fc3e1e754685c62f0c9 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Python-JSON-Module-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/json.html \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Write, read and update JSON data in the Password Manager.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Write, read and update JSON data in the Password Manager.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c4b3695a7fa60f20b362be7198f18d8c1b315012 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Write, read and update JSON data in the Password Manager.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35b1edd2b258ec28a533cc45a3f28ff95d762cb759d9fc90b86c400ab0dd2361 +size 86217104 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Write, read and update JSON data in the Password Manager_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Write, read and update JSON data in the Password Manager_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b966f38f509014ec16838c5563e77b9f2f7fa2f9 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/007 Write, read and update JSON data in the Password Manager_vi.srt @@ -0,0 +1,796 @@ +1 +00:00:00,180 --> 00:00:04,560 +Mục tiêu là đưa trình quản lý mật khẩu của chúng tôi lên cấp độ tiếp theo. + +2 +00:00:04,980 --> 00:00:09,150 +Và để làm được điều đó, chúng ta cần thêm chức năng tìm kiếm. + +3 +00:00:09,240 --> 00:00:12,930 +Nó không đủ tốt nếu chỉ xem qua tệp dữ liệu nữa. + +4 +00:00:13,470 --> 00:00:18,180 +Những gì chúng tôi muốn có thể làm là nhập một trang web vào mục nhập trang web, sau + +5 +00:00:18,420 --> 00:00:19,560 +đó nhấn tìm kiếm + +6 +00:00:19,590 --> 00:00:24,540 +và chúng tôi nhận được một cửa sổ bật lên hiển thị email của chúng tôi và mật khẩu đã được + +7 +00:00:24,540 --> 00:00:27,060 +lưu cho trang web đó. Vì vậy, đây là mục tiêu. + +8 +00:00:28,050 --> 00:00:32,070 +Nhưng nơi chúng tôi hiện đang ở, chúng tôi có một + +9 +00:00:32,520 --> 00:00:36,870 +tệp văn bản chứa tên của trang web, email và mật khẩu. + +10 +00:00:37,230 --> 00:00:39,480 +Điều này rất khó tìm kiếm và + +11 +00:00:39,510 --> 00:00:42,840 +đây là một định dạng thực sự khủng khiếp để làm việc. + +12 +00:00:43,350 --> 00:00:48,090 +Vì vậy, chúng tôi sẽ nâng cấp khả năng lưu trữ dữ liệu của mình trong trình quản lý + +13 +00:00:48,420 --> 00:00:53,420 +mật khẩu và chúng tôi sẽ chuyển từ lưu dữ liệu thẳng vào tệp văn bản sang định dạng dữ + +14 +00:00:54,090 --> 00:00:57,720 +liệu lạ hơn, được gọi là JSON. Không, đây không + +15 +00:00:57,780 --> 00:01:01,770 +phải là DJ hot nhất mới nhất trong khối. + +16 +00:01:01,800 --> 00:01:04,019 +Nó thực sự là + +17 +00:01:04,080 --> 00:01:06,930 +JSON, viết tắt của JavaScript Object Notation. + +18 +00:01:07,620 --> 00:01:11,370 +Đây là thứ được thiết kế ban đầu cho JavaScript nhưng vì + +19 +00:01:11,700 --> 00:01:16,080 +nó có cấu trúc đơn giản và rất dễ hiểu và dễ làm việc nên + +20 +00:01:16,080 --> 00:01:19,620 +nó đã được rất nhiều lĩnh vực khác nhau áp dụng, bao + +21 +00:01:19,710 --> 00:01:20,880 +gồm cả Python. + +22 +00:01:21,480 --> 00:01:25,290 +Đây có lẽ là một trong những cách phổ biến nhất để truyền dữ liệu, + +23 +00:01:25,590 --> 00:01:28,500 +đặc biệt là khi bạn đang truyền dữ liệu qua internet. + +24 +00:01:29,010 --> 00:01:30,990 +Vì vậy, đây là những gì chúng ta sẽ tìm hiểu. + +25 +00:01:31,260 --> 00:01:33,780 +Và đối với những người trong số các bạn đang xem trang + +26 +00:01:34,080 --> 00:01:37,800 +trình bày này, bạn có thể đã nhận ra rằng nó giống với các từ điển mà + +27 +00:01:37,800 --> 00:01:40,080 +chúng tôi đang làm việc bằng Python, phải không? + +28 +00:01:40,890 --> 00:01:45,890 +Về cơ bản, JSON bao gồm một loạt các danh sách và từ điển lồng nhau và + +29 +00:01:46,920 --> 00:01:50,550 +nó có cấu trúc dữ liệu cặp giá trị khóa đó. + +30 +00:01:51,090 --> 00:01:56,090 +Về cơ bản, đây là những gì chúng tôi đang hướng tới để chúng tôi có thể lưu trữ dữ liệu của + +31 +00:01:56,520 --> 00:01:57,353 +mình ở định + +32 +00:01:57,420 --> 00:02:02,420 +dạng này và chúng tôi sẽ có thể dễ dàng tải lên dữ liệu này và tìm kiếm thông qua trang + +33 +00:02:02,730 --> 00:02:07,730 +web cụ thể mà chúng tôi muốn có thông tin. Để làm việc với dữ liệu JSON bằng + +34 +00:02:08,610 --> 00:02:12,090 +Python, chúng ta có thể sử dụng thư viện JSON có sẵn và + +35 +00:02:12,660 --> 00:02:15,690 +chúng ta sẽ sử dụng nó để ghi, đọc và cập + +36 +00:02:15,900 --> 00:02:19,830 +nhật dữ liệu vào tệp JSON. Để bắt đầu. + +37 +00:02:19,890 --> 00:02:22,170 +Tôi sẽ đơn giản hóa mã của chúng ta một chút. + +38 +00:02:22,260 --> 00:02:26,640 +Tôi sẽ loại bỏ hộp thông báo này, hộp này yêu cầu + +39 +00:02:26,640 --> 00:02:30,540 +người dùng OK hoặc hủy. Chúng tôi chỉ giả định rằng một khi họ + +40 +00:02:30,840 --> 00:02:33,180 +nhấp vào thêm, thì họ hài lòng với email và mật khẩu. + +41 +00:02:33,900 --> 00:02:36,450 +Vì vậy, bây giờ chúng tôi đã cắt giảm một chút mã + +42 +00:02:36,480 --> 00:02:38,970 +đó, nó làm cho điều này dễ hiểu hơn một chút. + +43 +00:02:39,540 --> 00:02:43,740 +Tất cả những gì chúng tôi đang làm ở đây là chúng tôi đang kiểm tra để + +44 +00:02:43,740 --> 00:02:48,390 +đảm bảo rằng độ dài của mục nhập trang web và độ dài của mục nhập mật khẩu bằng không. + +45 +00:02:48,900 --> 00:02:52,620 +Và bạn có thể vẫn phải kiểm tra độ dài cho mục nhập email, nhưng + +46 +00:02:52,920 --> 00:02:55,680 +hãy nhớ rằng ở cuối các bài học trước, + +47 +00:02:55,980 --> 00:02:58,770 +chúng tôi thực sự đã chèn một giá trị mặc định. + +48 +00:02:59,110 --> 00:03:02,560 +Vì vậy, chúng tôi thực sự cũng có thể bỏ qua kiểm tra đó nếu bạn muốn. + +49 +00:03:03,820 --> 00:03:07,510 +Lý do tại sao chúng tôi muốn mã của mình càng đơn giản càng tốt là để khi chúng tôi + +50 +00:03:07,510 --> 00:03:11,260 +làm việc với JSON và chúng tôi đang tìm hiểu về cách làm việc với nó, miễn là mọi thứ + +51 +00:03:11,620 --> 00:03:13,270 +khác đơn giản, thì chúng tôi có thể + +52 +00:03:13,450 --> 00:03:17,410 +tập trung vào những điều mới mà chúng tôi đang học. Trong trường hợp này, thay vì + +53 +00:03:17,440 --> 00:03:20,590 +mở một dữ liệu. tệp txt, tôi sẽ thay + +54 +00:03:20,950 --> 00:03:24,820 +đổi định dạng dữ liệu thành a. json. + +55 +00:03:25,750 --> 00:03:28,450 +Và thay vì sử dụng chế độ nối + +56 +00:03:28,810 --> 00:03:33,810 +thêm, tôi sẽ sử dụng chế độ ghi vì tôi sẽ ghi vào dữ liệu này. + +57 +00:03:34,990 --> 00:03:38,950 +tệp json. Bây giờ, để ghi vào tệp JSON, chúng tôi + +58 +00:03:39,010 --> 00:03:42,100 +không sử dụng dòng mã này. Thay vào đó, chúng tôi sử dụng + +59 +00:03:42,340 --> 00:03:45,400 +một phương thức gọi là json. dump, và điều đó, + +60 +00:03:46,420 --> 00:03:50,860 +tất nhiên, yêu cầu chúng tôi nhập mô-đun JSON nên được xây dựng sẵn + +61 +00:03:51,400 --> 00:03:55,030 +sang Python để bạn thực sự không phải cài đặt nó. + +62 +00:03:55,840 --> 00:03:58,840 +Bây giờ, khi chúng tôi đã nhập mô-đun JSON của mình, chúng + +63 +00:03:58,870 --> 00:04:01,570 +tôi có thể nói json. bãi rác. + +64 +00:04:02,200 --> 00:04:06,310 +Và điều này cần một số đầu vào, nhưng quan trọng nhất là những + +65 +00:04:06,670 --> 00:04:10,450 +thứ bạn muốn kết xuất và tệp bạn muốn kết xuất nó. + +66 +00:04:10,960 --> 00:04:14,590 +Dữ liệu mà chúng tôi muốn đưa vào đây sẽ được đưa vào như một từ điển. + +67 +00:04:15,220 --> 00:04:18,790 +Về cơ bản, những gì chúng tôi muốn tạo là một từ điển + +68 +00:04:18,820 --> 00:04:23,050 +mới mà tôi sẽ gọi là new_data và nó sẽ là một từ điển lồng nhau. + +69 +00:04:23,560 --> 00:04:26,530 +Vì vậy, chìa khóa cấp đầu tiên sẽ là trang web, bởi vì + +70 +00:04:26,740 --> 00:04:29,470 +đây là những gì chúng ta sẽ tìm kiếm cuối cùng. + +71 +00:04:30,100 --> 00:04:33,640 +Và bản thân trang web sẽ chứa một từ điển. + +72 +00:04:34,360 --> 00:04:38,140 +Bây giờ từ điển này chứa hai khóa, + +73 +00:04:38,650 --> 00:04:41,080 +email và mật khẩu. + +74 +00:04:42,490 --> 00:04:45,580 +Các giá trị cho mỗi giá trị này khá dễ hiểu, + +75 +00:04:45,580 --> 00:04:50,580 +đó là email mà chúng tôi nhận được từ dòng mã này và mật khẩu là mật khẩu + +76 +00:04:50,680 --> 00:04:53,380 +mà chúng tôi nhận được từ dòng mã này. + +77 +00:04:55,720 --> 00:04:59,110 +Bây giờ chúng tôi đã tạo từ điển mới này có tên là new_data, + +78 +00:04:59,530 --> 00:05:03,610 +đó là những gì chúng tôi sẽ sử dụng để kết xuất vào tệp JSON của chúng tôi. + +79 +00:05:04,060 --> 00:05:08,830 +Hãy tiếp tục và kết xuất dữ liệu mới của chúng tôi. Vì vậy, đó là đầu vào đầu tiên. Bây giờ, đầu vào + +80 +00:05:08,830 --> 00:05:13,390 +tiếp theo sẽ là tệp dữ liệu mà chúng ta muốn đưa nó vào. + +81 +00:05:13,870 --> 00:05:17,230 +Vì vậy, đó sẽ là tệp mà chúng tôi đã mở bên trong dòng này. + +82 +00:05:18,190 --> 00:05:21,940 +Hãy cung cấp tệp dữ liệu của chúng tôi làm vị trí để kết xuất dữ liệu này. + +83 +00:05:22,570 --> 00:05:25,540 +Và bây giờ nếu tôi tiếp tục và nhấn run và tôi tạo + +84 +00:05:27,040 --> 00:05:32,040 +một mục nhập mới cho mật khẩu trang web Amazon của mình, tạo mật khẩu, nhấn thêm, thì bạn có thể + +85 +00:05:32,680 --> 00:05:33,520 +thấy rằng chúng + +86 +00:05:34,600 --> 00:05:38,770 +tôi đã có dữ liệu hoàn toàn mới. tệp json vừa + +87 +00:05:38,800 --> 00:05:42,070 +được tạo. Vì vậy, giống như một lời nhắc + +88 +00:05:42,100 --> 00:05:45,880 +nhanh, khi bạn mở một tệp ở chế độ ghi, nếu tệp đó không tồn tại, nó + +89 +00:05:45,910 --> 00:05:50,590 +sẽ thực sự tạo ra nó. Vì vậy, chúng tôi đã tạo tệp, dữ liệu mới này. json, và chúng tôi + +90 +00:05:50,770 --> 00:05:54,910 +đã kết xuất dữ liệu mà chúng tôi đã nhập vào tệp đó. + +91 +00:05:55,030 --> 00:05:56,500 +Vì vậy, bây giờ nếu tôi + +92 +00:05:56,740 --> 00:06:01,740 +mở nó ra, bạn có thể thấy chúng tôi có định dạng JSON ở đây và chúng tôi có trang web Amazon của chúng + +93 +00:06:02,390 --> 00:06:04,370 +tôi và tất cả dữ liệu liên quan của nó. + +94 +00:06:05,540 --> 00:06:09,500 +Lưu ý rằng dữ liệu này không dễ đọc đối với con người. + +95 +00:06:10,100 --> 00:06:14,210 +Vì vậy, chúng tôi thực sự có thể cải thiện điều đó bằng cách thêm một đối số khác. + +96 +00:06:14,690 --> 00:06:17,240 +Và đó là một đối số được gọi là thụt lề. Điều này, chúng tôi + +97 +00:06:17,240 --> 00:06:22,240 +có thể cung cấp số lượng khoảng trắng để thụt lề tất cả dữ liệu JSON để nó + +98 +00:06:22,460 --> 00:06:24,350 +trở nên dễ đọc hơn nhiều. + +99 +00:06:24,680 --> 00:06:29,030 +Vì vậy, tôi sẽ tiếp tục và xóa mọi thứ có trong đây và + +100 +00:06:29,060 --> 00:06:32,300 +tôi sẽ chạy lại mã. Và lần này, một khi tôi + +101 +00:06:32,660 --> 00:06:36,770 +lưu dữ liệu này vào dữ liệu của mình. json, bạn có thể thấy + +102 +00:06:37,040 --> 00:06:41,510 +mọi thứ đều được thụt vào và con người dễ đọc + +103 +00:06:41,510 --> 00:06:42,343 +hơn nhiều. + +104 +00:06:43,070 --> 00:06:47,210 +Bây giờ chúng ta đã thấy cách chúng ta có thể ghi dữ liệu vào tệp + +105 +00:06:47,780 --> 00:06:52,780 +JSON, bước tiếp theo tôi muốn cho bạn thấy là cách bạn có thể tải dữ liệu từ tệp JSON + +106 +00:06:53,420 --> 00:06:57,200 +hoặc cách đọc từ tệp đó. Để đọc dữ liệu JSON, hãy + +107 +00:06:57,230 --> 00:07:00,440 +sử dụng mô-đun JSON và chúng tôi gọi là phương thức tải. + +108 +00:07:01,010 --> 00:07:03,650 +Vì vậy, tôi sẽ tiếp tục và bình luận về dòng mã này. + +109 +00:07:04,160 --> 00:07:08,840 +Và bây giờ tôi đã thực sự có một số dữ liệu trong dữ liệu của mình. tệp json, tôi sẽ thử + +110 +00:07:09,080 --> 00:07:11,030 +và đọc từ nó. + +111 +00:07:11,480 --> 00:07:16,430 +Chúng tôi gọi là json. phương thức tải và chúng tôi chuyển vào đường dẫn tệp, + +112 +00:07:16,520 --> 00:07:18,380 +hoặc bạn có thể xem ở đây fp. + +113 +00:07:18,950 --> 00:07:21,590 +Vì vậy, đó là đầu vào bắt buộc duy nhất. + +114 +00:07:22,040 --> 00:07:25,820 +Tệp mà chúng tôi sẽ chuyển vào là tệp dữ liệu của chúng + +115 +00:07:25,850 --> 00:07:28,040 +tôi mà chúng tôi đã mở ở đây + +116 +00:07:28,700 --> 00:07:33,700 +quảng cáo những gì chúng tôi sẽ làm là chúng tôi sẽ thay đổi tệp này từ chế + +117 +00:07:35,150 --> 00:07:39,230 +độ ghi sang chế độ đọc. Khi chúng tôi đã tải xong dữ liệu, + +118 +00:07:39,230 --> 00:07:41,930 +chúng tôi sẽ lưu nó bên trong một biến được gọi là + +119 +00:07:42,230 --> 00:07:46,400 +dữ liệu và sau đó tôi sẽ in nó ra. Vì vậy, khi tôi nhấn run ngay + +120 +00:07:47,510 --> 00:07:50,120 +bây giờ, và tôi chỉ cần thêm bất kỳ loại gobbledy + +121 +00:07:50,390 --> 00:07:52,730 +nào, nhưng miễn là tôi có thể nhấn nút + +122 +00:07:52,970 --> 00:07:55,130 +thêm, nó sẽ kích hoạt phần này của mã. + +123 +00:07:55,700 --> 00:07:58,370 +Và bây giờ nếu chúng ta nhìn vào bên trong bảng điều khiển của + +124 +00:07:58,580 --> 00:08:02,180 +mình, bạn có thể thấy rằng dữ liệu đang được in ở đây, nhưng không có bất kỳ thụt + +125 +00:08:02,420 --> 00:08:07,250 +lề nào trong số này hoặc bất kỳ định dạng nào. Thay vào đó, những gì phương + +126 +00:08:07,370 --> 00:08:12,370 +thức tải đó làm là về cơ bản nó lấy dữ liệu JSON này và + +127 +00:08:13,370 --> 00:08:16,310 +chuyển đổi nó thành một từ điển Python. + +128 +00:08:17,060 --> 00:08:18,530 +Vì vậy, dữ liệu này, + +129 +00:08:19,760 --> 00:08:22,100 +nếu chúng tôi thực sự kiểm tra loại trên + +130 +00:08:22,250 --> 00:08:24,890 +nó, bạn có thể thấy nó có một loại từ điển. + +131 +00:08:24,890 --> 00:08:27,680 +Đây chỉ là một từ điển Python bình thường. + +132 +00:08:28,430 --> 00:08:33,429 +Vì vậy, về cơ bản chúng ta có thể sử dụng json. dump và json. tải để tuần tự + +133 +00:08:33,710 --> 00:08:38,150 +hóa và giải mã hóa từ dữ liệu JSON sang từ điển Python. + +134 +00:08:38,600 --> 00:08:41,720 +Và nó cho phép chúng tôi trao đổi thông tin miễn phí. + +135 +00:08:42,500 --> 00:08:44,540 +Chúng tôi thay đổi nó thành một JSON để lưu trữ, + +136 +00:08:44,720 --> 00:08:48,530 +sau đó chúng tôi lấy nó ra khỏi bộ nhớ và biến nó thành một từ điển Python để dễ + +137 +00:08:48,530 --> 00:08:50,570 +dàng làm việc với nó trong mã của chúng tôi. + +138 +00:08:51,740 --> 00:08:53,750 +Bây giờ chúng ta đã thấy cách + +139 +00:08:53,870 --> 00:08:58,440 +viết, cách đọc, điều cuối cùng tôi muốn chỉ cho bạn là cách cập nhật dữ liệu. + +140 +00:08:58,980 --> 00:09:02,040 +Bởi vì nếu chúng ta có một phần dữ liệu mới, + +141 +00:09:02,370 --> 00:09:06,390 +chúng ta muốn thêm vào JSON này nhưng chúng ta không muốn ghi đè nó. + +142 +00:09:06,960 --> 00:09:09,930 +Nhưng chúng tôi cũng không muốn chỉ thêm vào phần cuối của nó, vì như bạn + +143 +00:09:10,140 --> 00:09:14,070 +có thể tưởng tượng nếu chúng tôi có thứ gì đó mà chúng tôi chỉ thêm vào phần cuối, đó không + +144 +00:09:14,400 --> 00:09:16,950 +phải là cấu trúc dữ liệu hợp lệ và đó là lý do tại + +145 +00:09:17,040 --> 00:09:21,510 +sao chúng tôi gặp phải tất cả những lỗi này . Thay vì làm điều đó theo cách thủ công, chúng ta + +146 +00:09:21,540 --> 00:09:24,810 +sẽ sử dụng phương thức nội trang json. cập nhật. + +147 +00:09:25,350 --> 00:09:30,210 +Và đây là cách nó hoạt động. Vì vậy, chúng tôi đã có một số dữ liệu bên trong dữ liệu của mình. + +148 +00:09:30,240 --> 00:09:34,830 +tệp json và tôi sẽ thay đổi điều này từ đọc lại, quay lại ghi. + +149 +00:09:35,430 --> 00:09:40,320 +Và những gì chúng tôi muốn làm là chúng tôi muốn lấy dữ liệu đó và chúng tôi muốn cập nhật những gì + +150 +00:09:40,350 --> 00:09:45,350 +hiện có trong đó với dữ liệu mới được chuyển vào. Để làm điều đó, trước tiên chúng ta phải + +151 +00:09:46,560 --> 00:09:51,480 +tải dữ liệu lên, vì vậy tôi sẽ bỏ ghi chú dòng này, và khi chúng + +152 +00:09:51,930 --> 00:09:54,210 +ta đã nắm được dữ liệu, chúng + +153 +00:09:54,480 --> 00:09:58,500 +ta sẽ nói đến dữ liệu. cập nhật. + +154 +00:10:00,570 --> 00:10:05,570 +Và chúng tôi cập nhật nó với dữ liệu mới. Điều đã xảy ra cho đến nay là chúng tôi đã + +155 +00:10:07,530 --> 00:10:10,020 +tải dữ liệu của mình vào một từ điển, + +156 +00:10:10,530 --> 00:10:15,530 +chúng tôi sử dụng phương pháp cập nhật để cập nhật từ điển đó với một số phần dữ liệu mới. + +157 +00:10:16,980 --> 00:10:17,550 +Bây giờ, + +158 +00:10:17,550 --> 00:10:22,550 +điều tiếp theo chúng tôi muốn làm là chúng tôi muốn thực sự ghi dữ liệu đó trở + +159 +00:10:22,650 --> 00:10:23,490 +lại tệp này. + +160 +00:10:23,850 --> 00:10:28,620 +Vì vậy, chúng ta phải sử dụng dòng mã này bằng cách sử dụng json. bãi rác. + +161 +00:10:30,960 --> 00:10:33,270 +Nhưng thay vì kết xuất dữ liệu mới, chúng + +162 +00:10:33,330 --> 00:10:36,750 +tôi sẽ kết xuất dữ liệu mà chúng tôi đã cập nhật ngay tại đây. + +163 +00:10:38,370 --> 00:10:42,150 +Về cơ bản những gì chúng tôi đang làm ở đây là cách tiếp cận ba bước. + +164 +00:10:42,480 --> 00:10:47,480 +Chúng tôi đang đọc dữ liệu cũ, chúng tôi đang cập nhật dữ liệu cũ bằng dữ liệu mới và cuối cùng + +165 +00:10:50,940 --> 00:10:55,230 +chúng tôi đang lưu dữ liệu đã cập nhật. Ở đây chúng tôi có hai + +166 +00:10:55,230 --> 00:10:59,070 +điều đang xảy ra. Chúng tôi đã đọc và chúng tôi đã viết. + +167 +00:10:59,460 --> 00:11:04,080 +Vì vậy, chúng ta có thể chia đoạn mã này thành hai phần. Đầu tiên, chúng tôi mở + +168 +00:11:04,440 --> 00:11:08,700 +tệp ở chế độ đọc, chúng tôi nắm giữ dữ liệu, chúng + +169 +00:11:08,730 --> 00:11:13,730 +tôi cập nhật dữ liệu và sau đó chúng tôi mở lại tệp. + +170 +00:11:14,700 --> 00:11:17,370 +Nhưng trong trường hợp này, chúng tôi mở nó ở chế độ ghi. + +171 +00:11:18,960 --> 00:11:23,960 +Lần này, chúng tôi sẽ kết xuất dữ liệu mà chúng tôi đã cập nhật ở đây vào tệp dữ + +172 +00:11:24,780 --> 00:11:28,200 +liệu đó bằng cách sử dụng định dạng thụt lề cụ thể này. + +173 +00:11:29,640 --> 00:11:31,260 +Và sau khi chúng tôi ghi vào + +174 +00:11:31,320 --> 00:11:36,180 +tệp, và chúng tôi xóa tất cả văn bản khỏi trang web và các mục nhập mật khẩu và những dòng + +175 +00:11:36,180 --> 00:11:41,180 +mã này hiện thay thế chức năng trước đây của chúng tôi, nơi chúng tôi chỉ lưu văn bản thuần túy + +176 +00:11:41,220 --> 00:11:45,660 +vào dữ liệu của mình. txt. Hãy tiếp tục và chạy nó và kiểm tra nó. + +177 +00:11:46,170 --> 00:11:50,040 +Hiện tại, chúng tôi có một mục nhập duy nhất bên trong dữ liệu của chúng tôi. json. + +178 +00:11:50,520 --> 00:11:53,250 +Vì vậy, nếu chúng tôi tiếp tục và thêm một mục nhập + +179 +00:11:53,290 --> 00:11:56,830 +mới, chẳng hạn như cho eBay, và chúng tôi tạo mật khẩu, hãy nhấp vào thêm. + +180 +00:11:57,670 --> 00:12:02,620 +Nếu chúng ta quay trở lại dữ liệu của mình. json, bạn có thể thấy nó hiện đã được cập nhật như thế nào. + +181 +00:12:03,190 --> 00:12:08,190 +Toàn bộ JSON này hiện đã được cập nhật để có hai mục + +182 +00:12:08,560 --> 00:12:12,430 +là Amazon và eBay. Nó không chỉ thêm vào. + +183 +00:12:12,460 --> 00:12:15,520 +Nó thực sự đã thêm nó vào từ điển và đó là + +184 +00:12:15,820 --> 00:12:18,340 +tất cả nhờ vào phương pháp cập nhật đó. + +185 +00:12:18,820 --> 00:12:20,920 +Và sau khi nó cập nhật dữ + +186 +00:12:21,160 --> 00:12:26,160 +liệu đó, sau đó chúng tôi yêu cầu nó lưu dữ liệu đã cập nhật trở lại tệp dữ + +187 +00:12:26,740 --> 00:12:31,180 +liệu và xóa tất cả dữ liệu trước đó. Vì vậy, bây giờ chúng ta có + +188 +00:12:31,210 --> 00:12:33,670 +thể đọc, ghi và cập nhật dữ liệu JSON, + +189 +00:12:34,090 --> 00:12:39,070 +bước tiếp theo là suy nghĩ về những tình huống mà điều này có thể không thành công. + +190 +00:12:39,820 --> 00:12:44,820 +Và một trong những vấn đề lớn nhất mà chúng tôi gặp phải lúc này là chúng tôi đang + +191 +00:12:45,550 --> 00:12:49,090 +cố gắng mở tệp này, tải dữ liệu lên và cập nhật nó. + +192 +00:12:49,600 --> 00:12:52,420 +Nhưng nếu chúng tôi thực sự không có dữ liệu ở đây, hãy nói + +193 +00:12:52,510 --> 00:12:55,570 +lần đầu tiên chúng tôi chạy chương trình của mình, hoặc thực sự, nếu chúng tôi + +194 +00:12:55,570 --> 00:12:58,870 +thực sự không có dữ liệu này. tệp json, sau đó bạn + +195 +00:12:59,470 --> 00:13:04,420 +có thể thấy rằng lần đầu tiên tôi chạy nó và tôi đã cố lưu mật khẩu, sau đó + +196 +00:13:06,580 --> 00:13:11,110 +nó sẽ bị phá hủy và chúng tôi nhận được một số ngoại lệ được ném ra. + +197 +00:13:11,620 --> 00:13:15,340 +Nhưng bây giờ chúng ta biết tất cả về các trường hợp ngoại lệ. Vì vậy, trong bài học tiếp theo, đó là những + +198 +00:13:15,610 --> 00:13:18,460 +gì chúng ta sẽ giải quyết. Đối với tất cả những điều đó, + +199 +00:13:18,790 --> 00:13:20,650 +và hơn thế nữa, hãy chuyển sang bài học tiếp theo. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/008 Challenge 1 - Handling Exceptions in the Password Manager.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/008 Challenge 1 - Handling Exceptions in the Password Manager.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..efa726775802a8be8030ca48716808f0f9323f84 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/008 Challenge 1 - Handling Exceptions in the Password Manager.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12447f57ac2f8ca577df179f3f47457498147140ad3ac1612bba3dc94647498b +size 38861026 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/008 Challenge 1 - Handling Exceptions in the Password Manager_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/008 Challenge 1 - Handling Exceptions in the Password Manager_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4b411f5cf3b07d3892631a35309720c97583f324 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/008 Challenge 1 - Handling Exceptions in the Password Manager_vi.srt @@ -0,0 +1,368 @@ +1 +00:00:00,810 --> 00:00:02,160 +Vì vậy, trong bài học + +2 +00:00:02,190 --> 00:00:07,190 +trước, chúng ta đã xem xét cách chúng ta có thể sử dụng định dạng JSON này để lưu dữ liệu và + +3 +00:00:09,120 --> 00:00:11,070 +tải dữ liệu vào chương trình của mình. + +4 +00:00:11,730 --> 00:00:16,730 +Nhưng một trong những vấn đề mà chúng tôi gặp phải là nếu chúng tôi chạy chương trình của mình từ đầu + +5 +00:00:17,280 --> 00:00:21,600 +ở nơi chúng tôi không có dữ liệu đó. tệp json đã được tạo, sau + +6 +00:00:21,930 --> 00:00:26,930 +đó điều đầu tiên mà nó gặp phải khi nó đến bên trong đây là + +7 +00:00:27,120 --> 00:00:30,570 +nó sẽ thử và mở một tệp không tồn tại. + +8 +00:00:31,110 --> 00:00:34,050 +Và điều gì xảy ra sau đó? Chúng tôi gặp lỗi không tìm + +9 +00:00:34,050 --> 00:00:38,490 +thấy tệp vì không có dữ liệu tệp như vậy. json. + +10 +00:00:39,030 --> 00:00:41,400 +Vậy chúng ta có thể làm gì? Chà, chúng ta + +11 +00:00:41,640 --> 00:00:46,640 +đã học về cách đối phó với các trường hợp ngoại lệ và xử lý chúng để + +12 +00:00:47,160 --> 00:00:49,380 +không gặp phải những tình huống này. + +13 +00:00:49,980 --> 00:00:54,980 +Vì vậy, bây giờ là lúc để đưa kiến thức của bạn vào thực tế bên trong một dự án thực tế. + +14 +00:00:55,650 --> 00:01:00,650 +Và tôi muốn bạn nghĩ về cách bạn có thể bắt được ngoại lệ cụ thể đó, cách + +15 +00:01:01,380 --> 00:01:06,060 +bạn có thể làm cho nó hoạt động để nếu điều này không thành công, thì chúng + +16 +00:01:06,330 --> 00:01:09,780 +ta chỉ cần tạo một tệp dữ liệu hoàn toàn mới. + +17 +00:01:10,200 --> 00:01:13,530 +Nhưng nếu nó hoạt động, thì chúng ta chỉ cần tải dữ liệu lên, + +18 +00:01:13,860 --> 00:01:16,050 +cập nhật dữ liệu và ghi dữ liệu. + +19 +00:01:16,680 --> 00:01:19,830 +Vì vậy, việc triển khai thực tế, tôi sẽ để lại cho bạn. + +20 +00:01:20,220 --> 00:01:25,220 +Nhưng điều bạn muốn là không thể có dữ liệu. tệp json và chạy mã của bạn, và nó sẽ + +21 +00:01:26,190 --> 00:01:28,380 +không bị lỗi và thay vào đó + +22 +00:01:28,500 --> 00:01:33,500 +nó sẽ tạo ra một dữ liệu hoàn toàn mới. tệp json với dữ liệu mới. + +23 +00:01:35,640 --> 00:01:40,640 +Nhưng nếu bạn đã có một số dữ liệu cũ, thì bạn chỉ cần cập + +24 +00:01:40,770 --> 00:01:45,600 +nhật và ghi nó vào tệp. Tạm dừng video và xem liệu bạn có thể hoàn thành việc này như + +25 +00:01:45,720 --> 00:01:46,590 +một thử thách không. + +26 +00:01:50,970 --> 00:01:55,200 +Điều này luôn bắt đầu với việc phân tích phần nào trong mã của chúng tôi là phần sẽ thất bại hoặc có + +27 +00:01:55,200 --> 00:01:59,400 +khả năng thất bại vào một thời điểm nào đó. Và trong trường hợp của chúng tôi, đó là + +28 +00:01:59,460 --> 00:02:00,960 +dòng này ngay tại đây, + +29 +00:02:01,140 --> 00:02:06,140 +việc mở dòng này ở chế độ đọc là rất nguy hiểm vì nếu điều này không tồn tại, thì + +30 +00:02:07,260 --> 00:02:09,720 +chúng tôi sẽ gặp lỗi không tìm thấy tệp đó. + +31 +00:02:10,259 --> 00:02:15,090 +Vì vậy, những gì chúng ta có thể làm là chúng ta có thể đặt điều này bên trong một câu lệnh thử. + +32 +00:02:15,660 --> 00:02:20,010 +Hãy thử mở tệp này và thử đọc dữ liệu bên trong. + +33 +00:02:20,790 --> 00:02:24,630 +Tuy nhiên, nếu điều này không thành công thì chúng ta có thể bắt được nó + +34 +00:02:25,110 --> 00:02:28,230 +và chúng ta sẽ bắt một loại ngoại lệ rất cụ thể, đó + +35 +00:02:28,260 --> 00:02:32,250 +là ngoại lệ lỗi không tìm thấy tệp. Bây giờ, khi ngoại lệ này + +36 +00:02:32,250 --> 00:02:34,050 +xảy ra, những gì chúng tôi + +37 +00:02:34,230 --> 00:02:38,490 +muốn làm là chúng tôi muốn tạo một tệp mới sẽ là dữ + +38 +00:02:38,820 --> 00:02:43,740 +liệu của chúng tôi. json. Vì vậy, tại thời điểm + +39 +00:02:43,740 --> 00:02:48,090 +này, hãy nhớ nó vẫn chưa tồn tại. Và chúng tôi sẽ mở nó ở chế độ ghi. + +40 +00:02:48,750 --> 00:02:53,490 +Và tệp dữ liệu này sẽ được sử dụng để chúng ta có thể ghi vào nó + +41 +00:02:53,520 --> 00:02:57,810 +và chúng ta có thể kết xuất dữ liệu mới tạo của mình lên đây. + +42 +00:02:58,350 --> 00:03:01,480 +Hãy nhớ rằng, khi người dùng nhấn vào nút thêm, thì + +43 +00:03:01,780 --> 00:03:06,190 +mọi thứ họ đã nhập trong các mục này sẽ được tổng hợp vào từ + +44 +00:03:06,190 --> 00:03:07,023 +điển này + +45 +00:03:07,210 --> 00:03:11,710 +và từ điển đó là thứ chúng tôi muốn đưa vào tệp dữ liệu mới này. + +46 +00:03:12,340 --> 00:03:16,900 +Vì vậy, chúng tôi sẽ nắm giữ dữ liệu mới đó và chúng tôi sẽ đưa nó vào tệp dữ liệu. + +47 +00:03:17,830 --> 00:03:18,550 +Và một lần + +48 +00:03:18,550 --> 00:03:23,550 +nữa, chúng tôi sẽ giữ thụt lề đến bốn dấu cách để chúng tôi có thể đọc nó dễ dàng hơn. + +49 +00:03:25,030 --> 00:03:28,750 +Bây giờ đây là những gì sẽ xảy ra nếu tệp không được tìm thấy. + +50 +00:03:29,380 --> 00:03:33,250 +Nhưng nếu tệp được tìm thấy và nó đã tồn tại, thì chúng ta + +51 +00:03:33,340 --> 00:03:37,240 +sẽ khai thác câu lệnh khác. Và trong một tuyên bố khác, những gì + +52 +00:03:37,270 --> 00:03:42,070 +chúng tôi sẽ làm là chúng tôi sẽ nắm giữ dữ liệu mà chúng tôi quản lý để có được vì + +53 +00:03:42,070 --> 00:03:46,270 +khối mã này đã thành công và trong khối khác, những gì chúng tôi sẽ làm là chúng tôi + +54 +00:03:46,270 --> 00:03:50,950 +' sẽ cập nhật dữ liệu với dữ liệu mới. Bây giờ, khối khác này + +55 +00:03:51,100 --> 00:03:53,500 +sẽ chỉ được kích hoạt nếu + +56 +00:03:53,530 --> 00:03:56,650 +mọi thứ bên trong khối thử thành công. + +57 +00:03:57,070 --> 00:03:59,260 +Vì vậy, điều đó có nghĩa là vào + +58 +00:03:59,290 --> 00:04:04,290 +cuối khối này, chúng tôi có dữ liệu này giữ tất cả dữ liệu hiện có từ tệp dữ liệu + +59 +00:04:05,020 --> 00:04:09,670 +đó và chúng tôi cập nhật dữ liệu đó với dữ liệu mới là từ điển này tại đây. + +60 +00:04:10,360 --> 00:04:13,210 +Bây giờ, sau khi chúng tôi đã cập nhật dữ liệu đó, + +61 +00:04:13,270 --> 00:04:17,560 +chúng tôi muốn có thể mở dữ liệu. jason ở chế độ ghi và + +62 +00:04:17,950 --> 00:04:22,950 +sau đó kết xuất dữ liệu cập nhật này từ đây vào tệp dữ liệu đó. + +63 +00:04:25,480 --> 00:04:27,940 +Và sau khi tất cả những điều này + +64 +00:04:28,570 --> 00:04:32,980 +được thực hiện, bất kể có ngoại lệ hay không có vấn đề gì, + +65 +00:04:33,280 --> 00:04:37,840 +chúng tôi vẫn cần xóa mọi thứ bên trong trang web và mục nhập + +66 +00:04:37,840 --> 00:04:38,800 +mật khẩu. + +67 +00:04:39,220 --> 00:04:43,240 +Vì vậy, chúng tôi thậm chí có thể thêm một từ khóa cuối cùng ngay tại đây. + +68 +00:04:44,560 --> 00:04:49,360 +Vì vậy, đây là mã cuối cùng xử lý ngoại lệ của chúng tôi. + +69 +00:04:49,690 --> 00:04:54,460 +Chúng tôi có khối thử có thể không thành công, chúng tôi có khối ngoại trừ + +70 +00:04:54,490 --> 00:04:58,720 +xử lý bất kỳ lỗi nào xảy ra, chúng tôi có khối khác của + +71 +00:04:58,780 --> 00:05:03,010 +chúng tôi có mã cần được chạy nếu không có vấn đề gì + +72 +00:05:03,370 --> 00:05:07,810 +và cuối cùng, không không cần biết có vấn đề hay không, chúng tôi có + +73 +00:05:08,140 --> 00:05:12,640 +một khối mã xóa các mục nhập trang web và mật khẩu của chúng tôi. + +74 +00:05:13,240 --> 00:05:16,660 +Bây giờ bạn có thể nhận thấy có một chút lặp lại ở đây với + +75 +00:05:16,690 --> 00:05:19,090 +việc ghi vào tệp. Vì vậy, nếu bạn muốn, + +76 +00:05:19,120 --> 00:05:22,660 +trên thực tế, bạn có thể tạo một phương thức riêng biệt ở đâu đó ở đây. + +77 +00:05:23,110 --> 00:05:26,980 +Nhưng tôi thực sự sẽ giữ điều này vì nó chỉ vì tôi nghĩ khi + +78 +00:05:26,980 --> 00:05:30,550 +bạn nhìn vào đoạn mã này, nếu bạn có bất kỳ vấn đề + +79 +00:05:31,060 --> 00:05:35,920 +nào và bạn muốn xem lại nó, điều này dễ hiểu và dễ hiểu hơn nhiều so với một + +80 +00:05:35,920 --> 00:05:36,753 +hàm riêng biệt. + +81 +00:05:37,330 --> 00:05:40,930 +Hãy cấu trúc lại mã này và làm cho nó ngắn như bạn muốn. + +82 +00:05:41,380 --> 00:05:43,210 +Nhưng đây là phiên bản tôi sẽ giữ + +83 +00:05:43,450 --> 00:05:46,690 +lại để nếu bạn có bất kỳ vấn đề nào và bạn muốn + +84 +00:05:46,960 --> 00:05:47,860 +xem xét nó, + +85 +00:05:47,950 --> 00:05:52,950 +nó ở đó cho bạn và thật dễ dàng để xem thử, ngoại trừ, khác và cuối cùng là chặn tất + +86 +00:05:54,070 --> 00:05:55,660 +cả của mã cùng một nơi. + +87 +00:05:58,130 --> 00:05:59,330 +Bây giờ trong bài học tiếp + +88 +00:05:59,390 --> 00:06:02,750 +theo, chúng ta sẽ hoàn thiện chức năng của trình quản lý mật khẩu của chúng ta. + +89 +00:06:03,110 --> 00:06:06,380 +Chúng tôi sẽ thêm rằng tất cả chức năng tìm kiếm quan trọng + +90 +00:06:06,740 --> 00:06:11,510 +sẽ xem qua JSON của chúng tôi, tìm nạp kết quả cho một trang web cụ thể và sau + +91 +00:06:11,510 --> 00:06:14,630 +đó hiển thị nó cho chúng tôi trong cửa sổ bật lên. + +92 +00:06:15,050 --> 00:06:18,380 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Challenge 2 - Search for a Website in the Password Manager.mp4 b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Challenge 2 - Search for a Website in the Password Manager.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..61d8e3b8c0934f44112447c5ac713a204ffcc273 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Challenge 2 - Search for a Website in the Password Manager.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ab731f718b7059bdde822027a4d37ab341c5902af2e6d83b4458a6c693e7160 +size 199332743 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Challenge 2 - Search for a Website in the Password Manager_vi.srt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Challenge 2 - Search for a Website in the Password Manager_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..49eaf522d3a0c42faf218a8411822d6f68cd285f --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Challenge 2 - Search for a Website in the Password Manager_vi.srt @@ -0,0 +1,1080 @@ +1 +00:00:00,360 --> 00:00:02,100 +Trong các bài học trước ngày hôm nay, + +2 +00:00:02,250 --> 00:00:07,250 +chúng ta đã xem xét cách chúng ta có thể sử dụng định dạng JSON để lưu trữ và tải dữ liệu vào chương + +3 +00:00:08,880 --> 00:00:09,713 +trình của mình. + +4 +00:00:10,050 --> 00:00:15,050 +Chúng tôi cũng đã xem xét cách chúng tôi có thể sử dụng các từ khóa thử, ngoại trừ, khác và cuối + +5 +00:00:15,750 --> 00:00:20,750 +cùng để xử lý các ngoại lệ trong chương trình của mình để đảm bảo rằng nó không bị lỗi và kết + +6 +00:00:21,540 --> 00:00:26,010 +thúc sự cố chương trình của chúng tôi để người dùng có trải nghiệm người dùng không tốt. + +7 +00:00:26,430 --> 00:00:30,810 +Thay vào đó, chúng ta có thể lường trước những điều có thể xảy ra. Ví dụ: lần đầu tiên khi chúng tôi + +8 +00:00:30,810 --> 00:00:32,640 +chạy chương trình của mình, + +9 +00:00:32,850 --> 00:00:37,740 +chúng tôi có thể không có dữ liệu. tệp json và chúng tôi giải quyết nó cho phù hợp. + +10 +00:00:38,520 --> 00:00:42,720 +Bây giờ, tất cả những gì còn lại phải làm là đưa vào chức năng cuối cùng, đó + +11 +00:00:42,840 --> 00:00:45,960 +là chức năng tìm kiếm, bởi vì sau tất cả, chúng tôi không + +12 +00:00:45,960 --> 00:00:49,680 +muốn đào qua tệp JSON để tìm ra tất cả các kết hợp email và + +13 +00:00:49,680 --> 00:00:52,800 +mật khẩu cho các trang web. mà chúng tôi đã lưu trữ. + +14 +00:00:53,460 --> 00:00:57,300 +Vì vậy, những gì chúng tôi muốn có thể làm là thêm một nút + +15 +00:00:57,540 --> 00:01:02,160 +tìm kiếm và nó sẽ có kích thước rất giống với nút tạo mật khẩu và nó sẽ + +16 +00:01:02,520 --> 00:01:06,210 +nằm trong cùng một cột lưới. Bây giờ, khi chúng ta nhập + +17 +00:01:06,240 --> 00:01:09,660 +một trang web và nhấn tìm kiếm, nó sẽ xem qua + +18 +00:01:09,870 --> 00:01:13,110 +JSON của chúng ta, tìm dữ liệu đó, tải dữ + +19 +00:01:13,650 --> 00:01:18,650 +liệu đó lên và xem qua nó để tìm khóa khớp với khóa mà người dùng + +20 +00:01:19,680 --> 00:01:21,750 +đã nhập. Nếu họ tìm thấy + +21 +00:01:21,900 --> 00:01:26,900 +nó, thì chúng tôi sẽ nhận được một cửa sổ bật lên hiển thị và nó cho chúng tôi biết email và + +22 +00:01:27,030 --> 00:01:29,040 +mật khẩu được liên kết với tài khoản đó. + +23 +00:01:30,060 --> 00:01:35,040 +Vì vậy, bạn đã thực sự làm tất cả những điều này trước đây. Tạo các widget tkinter, bố trí các widget + +24 +00:01:35,310 --> 00:01:37,350 +tkinter, tạo các hộp thông báo + +25 +00:01:37,650 --> 00:01:42,650 +hoặc các cửa sổ bật lên này và đặt tiêu đề cho nó, đưa cho nó + +26 +00:01:42,840 --> 00:01:44,160 +một thông điệp. + +27 +00:01:44,520 --> 00:01:49,520 +Bạn cũng đã thấy cách bạn có thể tải dữ liệu JSON và lấy dữ liệu ở + +28 +00:01:52,260 --> 00:01:55,920 +định dạng từ điển Python. Bây giờ, khi bạn đã có từ điển + +29 +00:01:55,980 --> 00:02:00,660 +Python, thì bạn có thể sử dụng các phương pháp từ điển thông thường của mình để thử và nắm bắt + +30 +00:02:00,660 --> 00:02:02,880 +dữ liệu bên trong. Và cuối cùng, + +31 +00:02:02,910 --> 00:02:06,030 +bạn cũng biết cách đối phó với những trường hợp ngoại lệ. + +32 +00:02:06,330 --> 00:02:10,020 +Vì vậy, hãy nhớ rằng, cũng có thể có một ngoại lệ trong trường hợp + +33 +00:02:10,410 --> 00:02:15,120 +này, bởi vì nếu đây là lần đầu tiên chúng tôi chạy trình quản lý mật khẩu này và trên + +34 +00:02:15,480 --> 00:02:16,110 +thực tế, + +35 +00:02:16,110 --> 00:02:21,110 +chúng tôi đã không lưu trữ bất kỳ trang web hoặc bất kỳ email hoặc mật khẩu nào trong cơ sở + +36 +00:02:21,450 --> 00:02:25,230 +dữ liệu của mình, thì nếu bạn nhấn tìm kiếm, nó thực sự có thể chỉ + +37 +00:02:25,230 --> 00:02:29,820 +cung cấp cho bạn lỗi không tìm thấy tệp. Vì vậy, có khá nhiều thành phần liên quan, nhưng + +38 +00:02:29,910 --> 00:02:33,060 +tôi khá chắc chắn rằng bạn thực sự có thể làm cho điều này hoạt động. + +39 +00:02:33,690 --> 00:02:38,040 +Vì vậy, kết quả cuối cùng mà bạn đang tìm kiếm trông giống như thế này + +40 +00:02:38,040 --> 00:02:38,873 +về mặt bố + +41 +00:02:39,120 --> 00:02:44,120 +cục và bạn sẽ có thể kiểm tra điều này để khi bạn bắt đầu mà không có dữ liệu. tệp json và bạn nhấn tìm kiếm, nó sẽ cho bạn + +42 +00:02:45,150 --> 00:02:49,290 +biết lỗi, Không tìm thấy tệp dữ liệu nào. + +43 +00:02:49,530 --> 00:02:50,970 +Tuy nhiên, nếu bạn đã lưu một + +44 +00:02:51,450 --> 00:02:56,310 +mật khẩu dưới tên đó và bạn đã thêm nó vào cơ sở dữ liệu, sau đó bạn cố gắng tìm nó, thì nó + +45 +00:02:56,310 --> 00:02:58,770 +sẽ tìm cho bạn email và mật khẩu mà bạn đã lưu. + +46 +00:02:59,080 --> 00:03:02,200 +Vì vậy, đây là điều bạn đang hướng tới và tôi khá chắc chắn + +47 +00:03:02,590 --> 00:03:04,180 +rằng bạn có thể làm được điều + +48 +00:03:04,330 --> 00:03:07,900 +đó chỉ với một chút suy nghĩ và một chút thời gian giải quyết vấn đề. Khi bạn đã sẵn sàng, hãy tạm dừng video và + +49 +00:03:07,900 --> 00:03:11,590 +thực hiện thử thách cuối + +50 +00:03:11,710 --> 00:03:15,910 +cùng này để hoàn thành dự án trình quản lý mật khẩu + +51 +00:03:15,910 --> 00:03:16,380 +1:. Chúc may mắn. + +52 +00:03:16,380 --> 00:03:18,030 +Được rồi, tôi hy + +53 +00:03:22,440 --> 00:03:23,440 +vọng 0: bạn đã làm tốt. Và như tôi vẫn luôn + +54 +00:03:23,880 --> 00:03:27,750 +nói, nếu không có đấu tranh, thì sẽ không có học hỏi. + +55 +00:03:27,750 --> 00:03:28,620 +Vì vậy, hãy + +56 +00:03:28,920 --> 00:03:33,900 +đảm bảo rằng bạn đã dành ít nhất 20 phút để thử mọi thứ và tìm ra mọi thứ + +57 +00:03:33,900 --> 00:03:38,790 +cũng như gỡ lỗi và chỉ tự làm rối với mã trước khi đi đến giải pháp. Nhưng được rồi, tôi sẽ cùng bạn tìm hiểu + +58 +00:03:38,790 --> 00:03:41,280 +giải pháp. + +59 +00:03:41,340 --> 00:03:43,530 +Và điều đầu tiên chúng tôi sẽ + +60 +00:03:44,130 --> 00:03:49,050 +làm là chúng tôi sẽ thêm một nút bên cạnh mục nhập trang web của chúng tôi. + +61 +00:03:49,050 --> 00:03:50,280 +Vì vậy, ngay tại đây. Bây giờ hãy chú ý cách chúng ta có ba cột trong hệ thống lưới của chúng ta. + +62 +00:03:51,360 --> 00:03:56,360 +Vì vậy, nút tìm kiếm của chúng tôi + +63 +00:03:57,450 --> 00:04:02,450 +sẽ đi vào khá nhiều trong cùng một cột với nút tạo mật khẩu của chúng tôi. Vì vậy, hãy tiếp tục và tạo nút tìm kiếm + +64 +00:04:02,490 --> 00:04:07,350 +1: của chúng tôi. + +65 +00:04:07,530 --> 00:04:09,120 +0: Đây sẽ + +66 +00:04:10,470 --> 00:04:14,850 +là một nút có dòng chữ 1: Tìm kiếm. + +67 +00:04:15,300 --> 00:04:16,132 +0: Bây giờ, + +68 +00:04:17,519 --> 00:04:21,630 +khi chúng ta đã tạo xong, hãy tiếp tục và bố trí nó bằng cách sử dụng hệ thống lưới. + +69 +00:04:21,630 --> 00:04:23,250 +Bây giờ nút tìm kiếm + +70 +00:04:23,970 --> 00:04:28,970 +sẽ đi vào lưới ở cùng hàng với nhãn trang web và mục nhập trang web. Vì vậy, đó là hàng 1. + +71 +00:04:29,550 --> 00:04:34,290 +Vì vậy, hãy tiếp tục và thêm + +72 +00:04:34,560 --> 00:04:38,940 +hàng bằng 1 và theo cột, nó sẽ đi cùng cột với mật khẩu tạo. + +73 +00:04:38,970 --> 00:04:42,600 +Vì vậy, đó là một cột 2. Bây giờ, nếu chúng tôi chạy mã của mình, tuy nhiên, bạn sẽ thấy rằng + +74 +00:04:42,990 --> 00:04:47,730 +nút tìm kiếm dường như đang ở bên trong + +75 +00:04:47,730 --> 00:04:48,450 +mục nhập. + +76 +00:04:48,450 --> 00:04:53,280 +Và lý do là bởi vì ban đầu khi chúng tôi tạo mục này, chúng tôi + +77 +00:04:53,790 --> 00:04:57,210 +đã cho nó khoảng cột là 2 để nó kéo dài + +78 +00:04:57,240 --> 00:04:59,520 +cột thứ hai và thứ ba này. + +79 +00:04:59,880 --> 00:05:03,690 +Vì vậy, chúng ta phải thay đổi điều đó. + +80 +00:05:04,260 --> 00:05:05,670 +Hãy đi và tìm mục nhập trang web của chúng tôi và xóa khoảng cột này bằng 2. + +81 +00:05:06,150 --> 00:05:11,150 +Vì vậy, bây giờ bạn có thể thấy rằng cột này có khoảng cột là 1, vì vậy nó + +82 +00:05:12,150 --> 00:05:16,260 +chỉ nằm ở cột giữa này, nhưng nó lớn đến mức đẩy phần còn lại của + +83 +00:05:16,260 --> 00:05:18,300 +bố cục của chúng ta ra ngoài. + +84 +00:05:18,660 --> 00:05:23,010 +Vì vậy, những gì chúng ta cần làm là chúng ta cần làm cho mục nhập này + +85 +00:05:23,580 --> 00:05:26,520 +có cùng chiều rộng với mục nhập mật khẩu để nó thực + +86 +00:05:26,700 --> 00:05:29,220 +sự phù hợp với bố cục của chúng ta. + +87 +00:05:29,490 --> 00:05:31,860 +Vì vậy, mục nhập mật khẩu của chúng tôi có chiều rộng là 21. + +88 +00:05:32,490 --> 00:05:35,550 +Vì vậy, mục nhập trang web của chúng tôi cũng sẽ cần phải thay đổi xuống kích thước nhỏ hơn. + +89 +00:05:35,850 --> 00:05:40,850 +Bây giờ bạn có thể thấy mục nhập hiện có cùng kích thước và trông đẹp hơn rất nhiều. Nếu bạn muốn, và điều này thực sự không cần thiết nhưng tôi nghĩ + +90 +00:05:42,750 --> 00:05:47,750 +nó khá gọn gàng, bạn có + +91 +00:05:47,970 --> 00:05:51,540 +thể tinh chỉnh và điều chỉnh độ rộng của + +92 +00:05:51,570 --> 00:05:56,520 +nút tìm kiếm này sao cho nó gần giống với nút tạo mật khẩu. + +93 +00:05:56,520 --> 00:06:00,440 +Bây giờ nút này có chiều rộng này vì nó là thứ cần + +94 +00:06:01,130 --> 00:06:05,540 +thiết để chứa tất cả các từ trong nút đó, nhưng chúng ta có thể thay + +95 +00:06:05,540 --> 00:06:09,710 +đổi nút tìm kiếm theo cách thủ công để nó có cùng chiều rộng. + +96 +00:06:09,950 --> 00:06:11,990 +Và trong trường hợp này, tôi thực sự chỉ sử dụng thử và sai để tìm ra nó. Chiều rộng là 10 + +97 +00:06:13,790 --> 00:06:18,770 +có thể hơi nhỏ, hãy + +98 +00:06:18,770 --> 00:06:23,210 +thử chiều rộng là 13 và nó trông vừa phải. Bây giờ tôi đã hoàn thành bố cục của mình, đó là phần + +99 +00:06:23,750 --> 00:06:28,280 +tiếp theo là thêm chức năng. + +100 +00:06:28,490 --> 00:06:32,420 +Bây giờ, chức năng sẽ xuất hiện khi nhấn nút tìm kiếm. + +101 +00:06:33,110 --> 00:06:36,890 +Vì vậy, tôi sẽ thêm một lệnh vào điều này và lệnh sẽ gọi một + +102 +00:06:37,250 --> 00:06:39,620 +phương thức mà tôi sẽ gọi là find_password. Chúng tôi đã có create_password và + +103 +00:06:40,280 --> 00:06:45,280 +bây giờ chúng tôi sẽ có find_password. + +104 +00:06:46,370 --> 00:06:49,970 +Bây giờ tôi sẽ bắt đầu tạo find_password của mình. + +105 +00:06:50,690 --> 00:06:54,680 +Và chỉ vì chúng tôi đã thiết lập tất cả các phần này, tôi + +106 +00:06:56,090 --> 00:06:59,450 +sẽ thêm một phần khác mà tôi gọi là find_password. Bên trong phần này là nơi chúng + +107 +00:06:59,450 --> 00:07:04,450 +ta sẽ tạo chức + +108 +00:07:05,270 --> 00:07:08,270 +năng find_ password của chúng ta. Và find_password này, chúng ta hãy kiểm tra để đảm bảo + +109 +00:07:08,300 --> 00:07:12,980 +rằng không có lỗi nào ở đây và chúng + +110 +00:07:13,040 --> 00:07:15,380 +ta đã đánh vần theo cùng một cách. + +111 +00:07:15,380 --> 00:07:16,910 +Và hàm find_password + +112 +00:07:17,720 --> 00:07:22,720 +này sẽ cần nắm giữ mục nhập bên trong mục nhập trang web. + +113 +00:07:23,360 --> 00:07:25,550 +Vì vậy, trang web mà chúng tôi đang tìm kiếm đến từ website_entry. get, và sau đó chúng tôi + +114 +00:07:26,480 --> 00:07:31,480 +sẽ có thể nhận được giá trị + +115 +00:07:32,000 --> 00:07:36,440 +của bất kỳ thứ gì người dùng nhập vào bên trong mục nhập này. + +116 +00:07:36,440 --> 00:07:37,273 +Và sau đó chúng tôi sẽ sử dụng nó để tìm kiếm thông qua dữ liệu của chúng tôi. json. + +117 +00:07:37,640 --> 00:07:42,050 +Bây giờ, cách dễ nhất để điều này hoạt động thực sự là trước tiên hãy thêm một trang web. + +118 +00:07:42,890 --> 00:07:47,890 +Vì vậy, tôi sẽ tạo một trang web bằng email và mật khẩu của mình + +119 +00:07:48,020 --> 00:07:53,020 +và thêm nó vào để nó được lưu vào bên trong dữ liệu của tôi. json. + +120 +00:07:53,660 --> 00:07:56,510 +Bằng cách này, tôi sẽ có thể + +121 +00:07:56,960 --> 00:08:00,320 +in mọi thứ và tôi có thể làm việc với dữ liệu dễ dàng hơn một chút. + +122 +00:08:00,320 --> 00:08:01,160 +Và sau đó chúng tôi sẽ giải quyết ngoại lệ bắt một chút sau đó. + +123 +00:08:01,730 --> 00:08:04,490 +Chính xác thì chúng ta đang tìm kiếm điều gì? Chà, chúng tôi đang tìm cách tải dữ liệu bên + +124 +00:08:05,120 --> 00:08:07,400 +trong tệp JSON này. + +125 +00:08:07,430 --> 00:08:11,960 +Vì vậy, chúng tôi sẽ mở tệp đó. + +126 +00:08:12,470 --> 00:08:14,780 +Vì vậy, với mở và sau đó tên tệp là dữ liệu. json, và sau đó chúng tôi sẽ + +127 +00:08:14,780 --> 00:08:19,250 +lưu nó dưới dạng data_file. + +128 +00:08:19,610 --> 00:08:22,520 +Bây giờ, khi chúng ta đã có tệp dữ liệu của mình, + +129 +00:08:24,350 --> 00:08:26,660 +sau đó chúng ta có thể sử dụng mô-đun + +130 +00:08:26,660 --> 00:08:30,830 +JSON của mình để tải tệp đó lên và chúng ta sẽ nắm giữ dữ liệu bên trong. + +131 +00:08:31,340 --> 00:08:34,970 +Vì vậy, chúng tôi có thể lưu điều này vào một biến được gọi là dữ liệu. + +132 +00:08:35,240 --> 00:08:38,720 +Bây giờ dữ liệu này, nếu tôi tiếp tục và in nó ra, + +133 +00:08:39,350 --> 00:08:42,559 +bạn nên nhớ về cơ bản chỉ là một từ điển. + +134 +00:08:43,370 --> 00:08:47,570 +Vì vậy, ngay sau khi tôi nhấn tìm kiếm, điều đó sẽ kích hoạt find_password + +135 +00:08:48,020 --> 00:08:51,770 +này và bây giờ tôi đã in từ điển của mình ở đây. + +136 +00:08:52,100 --> 00:08:54,800 +Vậy chúng ta muốn làm gì với cuốn từ điển này? Chà, chúng tôi muốn xem qua nó và kiểm tra + +137 +00:08:55,500 --> 00:08:58,740 +xem liệu trang web mà + +138 +00:08:58,740 --> 00:09:03,740 +chúng tôi đang tìm kiếm này có thực sự tồn tại bên trong từ điển đó hay không. + +139 +00:09:04,020 --> 00:09:07,320 +Cách chúng tôi làm điều đó là chúng tôi nói nếu + +140 +00:09:07,950 --> 00:09:12,950 +trang web trong dữ liệu, tốt, trong trường hợp đó, nó thực sự thành công, phải không? + +141 +00:09:15,030 --> 00:09:18,300 +Chúng tôi đã quản lý để tìm thấy nó bên trong dữ liệu và bây giờ + +142 +00:09:18,300 --> 00:09:21,030 +chúng tôi chỉ cần nắm giữ các giá trị email và mật khẩu. + +143 +00:09:21,300 --> 00:09:25,170 +Vì vậy, hãy tạo một biến có tên là email + +144 +00:09:26,580 --> 00:09:31,580 +và chúng tôi muốn chọn giá trị cụ thể này từ từ điển này. + +145 +00:09:31,860 --> 00:09:34,050 +Nếu đây là toàn bộ từ điển, thì + +146 +00:09:34,740 --> 00:09:36,930 +chúng tôi muốn nắm giữ từ điển + +147 +00:09:37,230 --> 00:09:42,230 +và chọn mục có khóa khớp với trang web mà chúng tôi đang tìm kiếm, như thế này. + +148 +00:09:42,900 --> 00:09:47,280 +Bây giờ, khi chúng ta đã nắm được điều này, đây sẽ + +149 +00:09:47,880 --> 00:09:50,490 +là một từ điển lồng nhau. + +150 +00:09:50,550 --> 00:09:53,220 +Vì vậy, về cơ bản nó tương đương với phần này của từ điển. + +151 +00:09:53,250 --> 00:09:57,690 +Vì vậy, bản thân đây là từ điển, bạn có thể lưu vào + +152 +00:09:58,290 --> 00:10:00,210 +một biến riêng biệt, nhưng + +153 +00:10:00,240 --> 00:10:02,190 +tôi nghĩ thực sự đủ + +154 +00:10:02,490 --> 00:10:07,380 +dễ hiểu rằng chúng ta có thể gắn thẻ trên một khóa khác ở + +155 +00:10:07,380 --> 00:10:08,213 +đây là + +156 +00:10:08,310 --> 00:10:13,310 +từ email để nắm giữ giá trị được liên kết với chìa khóa đó. Vì vậy, theo cách đó, biến email này hiện lưu giá trị này + +157 +00:10:13,830 --> 00:10:15,480 +ở đây. + +158 +00:10:15,480 --> 00:10:18,840 +Và theo cách tương tự, chúng ta + +159 +00:10:19,590 --> 00:10:23,880 +có thể lấy mật khẩu từ dữ liệu nhận dữ liệu + +160 +00:10:24,060 --> 00:10:29,060 +dưới khóa trang web và sau đó chuyển vào khóa mật khẩu. Bây giờ chúng tôi đã có email và mật khẩu, chúng tôi có thể tiếp tục và tạo hộp thư của mình + +161 +00:10:29,850 --> 00:10:33,780 +bằng cách sử dụng thông tin chương trình. Và chúng tôi sẽ + +162 +00:10:33,840 --> 00:10:38,840 +đặt tiêu đề là trang web + +163 +00:10:39,210 --> 00:10:43,020 +mà người dùng đang tìm kiếm và thư sẽ là + +164 +00:10:43,470 --> 00:10:46,320 +một chuỗi f, có email được liệt kê. + +165 +00:10:46,710 --> 00:10:49,950 +Và sau đó trên một dòng mới, nó cũng có + +166 +00:10:50,640 --> 00:10:52,710 +mật khẩu sẽ được liệt kê. + +167 +00:10:52,740 --> 00:10:57,000 +2: Như vậy. + +168 +00:10:58,400 --> 00:10:59,233 +0: Hãy tiếp tục và chạy mã này và đảm bảo rằng nó hoạt động. + +169 +00:11:01,160 --> 00:11:04,460 +Giả sử rằng chúng tôi có một vài mật khẩu nữa mà chúng tôi lưu tại đây. + +170 +00:11:05,690 --> 00:11:10,310 +Bây giờ tôi sẽ có ba mục nhập, Amazon, eBay và Twitter, và + +171 +00:11:11,900 --> 00:11:15,590 +tôi muốn tìm kiếm mật khẩu của mình cho eBay. + +172 +00:11:15,980 --> 00:11:19,460 +Khi tôi nhấn nút tìm kiếm, nó sẽ đi + +173 +00:11:19,940 --> 00:11:24,770 +vào hàm find_password đó và nếu nó phát hiện thấy một trong số này + +174 +00:11:25,130 --> 00:11:28,880 +có khóa eBay, thì nó sẽ tìm nạp tất cả + +175 +00:11:29,210 --> 00:11:34,130 +các phần dữ liệu có liên quan mà tôi muốn từ tệp JSON đó. + +176 +00:11:34,160 --> 00:11:35,540 +Vì vậy, bây giờ những gì + +177 +00:11:37,010 --> 00:11:42,010 +chúng tôi phải làm là đảm bảo rằng chúng tôi nắm bắt được bất kỳ trường hợp ngoại lệ nào có thể xảy + +178 +00:11:42,740 --> 00:11:47,740 +ra và bạn có thể đã nhận ra rằng điều này thực sự hoạt động tốt ngay bây giờ vì chúng tôi có + +179 +00:11:48,110 --> 00:11:50,240 +dữ liệu và vì chúng tôi có dữ liệu này. tệp json. + +180 +00:11:50,630 --> 00:11:53,260 +Nhưng lần đầu tiên + +181 +00:11:53,860 --> 00:11:57,250 +tôi chạy chương trình của mình, điều này sẽ không tồn tại. + +182 +00:11:57,490 --> 00:11:59,140 +Vì vậy, đây là một phiên + +183 +00:11:59,650 --> 00:12:04,600 +bản thực tế hơn về những gì chương trình sẽ trông giống như lần đầu tiên chúng tôi chạy nó. Và lần đầu tiên chúng tôi tiếp tục chạy nó và tôi tìm kiếm thứ gì đó sẽ tìm + +184 +00:12:04,660 --> 00:12:09,340 +kiếm một tệp không tồn tại ngay lập + +185 +00:12:09,430 --> 00:12:13,870 +tức, chương trình của chúng tôi bị treo và chúng tôi gặp lỗi không tìm thấy tệp. + +186 +00:12:14,110 --> 00:12:18,340 +Vì vậy, những gì chúng ta cần làm là chúng ta cần + +187 +00:12:18,970 --> 00:12:23,740 +nhận thức đủ rằng những việc này như mở tệp có thể bị lỗi. + +188 +00:12:23,770 --> 00:12:26,020 +Vì vậy, những gì chúng ta phải làm là chúng ta phải bắt các trường hợp ngoại lệ và xử lý chúng. + +189 +00:12:26,440 --> 00:12:31,420 +Hãy tiếp tục và thụt lề toàn bộ khối này và đặt nó vào bên trong thử. + +190 +00:12:32,080 --> 00:12:37,000 +Bây giờ, phần có nhiều khả năng bị lỗi nhất trên thực tế, lần đầu tiên chương trình + +191 +00:12:37,570 --> 00:12:40,300 +bắt đầu, phần này chắc chắn sẽ thất bại. + +192 +00:12:40,330 --> 00:12:44,050 +Nhưng những gì chúng tôi muốn làm là chúng tôi + +193 +00:12:44,710 --> 00:12:48,640 +muốn bắt một ngoại lệ là lỗi không tìm thấy tệp. Và trong tình huống, những gì chúng tôi muốn làm là + +194 +00:12:48,670 --> 00:12:53,020 +chúng tôi muốn tạo một hộp + +195 +00:12:53,050 --> 00:12:57,820 +thông báo cho người dùng biết rằng tệp dữ liệu này không tồn tại. + +196 +00:12:58,120 --> 00:13:00,430 +Đây chỉ là một showinfo đơn giản và chúng tôi sẽ + +197 +00:13:01,060 --> 00:13:03,340 +đặt tiêu đề lỗi và chúng tôi sẽ đưa ra + +198 +00:13:03,700 --> 00:13:08,700 +thông báo không tìm thấy tệp dữ liệu nào hoặc bạn có thể đặt bất kỳ thông báo nào khác mà bạn có + +199 +00:13:12,730 --> 00:13:13,563 +thể nghĩ đến. Tuy nhiên, nếu + +200 +00:13:15,220 --> 00:13:19,420 +chúng tôi mở thành công tệp này, thì + +201 +00:13:19,420 --> 00:13:22,060 +đây là phần mã mà chúng tôi muốn triển khai. + +202 +00:13:22,420 --> 00:13:25,720 +Vì vậy, chúng ta hãy tiếp tục và đưa nó đến đúng thụt lề. + +203 +00:13:26,140 --> 00:13:29,230 +Và chúng tôi đã tìm kiếm thông qua dữ liệu của mình, tìm kiếm trang web này và sau đó cung cấp cho + +204 +00:13:29,680 --> 00:13:31,360 +người dùng một cửa sổ bật lên nếu nó tồn tại. + +205 +00:13:31,690 --> 00:13:36,690 +Bây giờ, nếu chúng tôi chạy lại mã của mình và chúng tôi tìm kiếm thứ gì đó mặc dù chúng tôi không + +206 +00:13:37,620 --> 00:13:41,910 +có tệp dữ liệu, chúng tôi chưa lưu bất kỳ thứ gì, thì chúng tôi nhận được cửa sổ bật + +207 +00:13:42,060 --> 00:13:45,720 +lên lỗi này và nó cho chúng tôi biết không tìm thấy tệp dữ liệu nào. + +208 +00:13:46,050 --> 00:13:49,830 +Và hy vọng người dùng sẽ nhận ra, thực ra là tôi chưa thực sự + +209 +00:13:50,160 --> 00:13:51,930 +lưu bất kỳ mật khẩu nào. + +210 +00:13:51,930 --> 00:13:54,060 +Tuy nhiên, có một tình huống khác mà chúng tôi chưa giải quyết. + +211 +00:13:54,900 --> 00:13:58,620 +Nếu tôi có, ừm, giả sử Amazon, ừm, eBay và + +212 +00:13:59,280 --> 00:14:02,820 +Twitter đã lưu trong tệp JSON của tôi, nhưng + +213 +00:14:02,970 --> 00:14:07,970 +tôi quyết định tìm kiếm thứ gì đó mà tôi chưa bao giờ lưu. + +214 +00:14:10,680 --> 00:14:13,680 +Hãy nói chi tiết của tôi cho Facebook. Trong tình huống này, thực sự không có + +215 +00:14:13,830 --> 00:14:18,780 +gì thực sự xảy ra. Và nó hơi khó hiểu vì đối với người dùng, có vẻ + +216 +00:14:18,810 --> 00:14:23,220 +như chương trình của chúng tôi không hoạt động. Nhưng trên thực tế, chúng tôi với tư cách là + +217 +00:14:23,220 --> 00:14:27,300 +những lập trình viên biết vấn đề là gì. Về cơ bản đây là câu lệnh + +218 +00:14:27,300 --> 00:14:31,350 +if được đưa ra là sai. Trang web không tồn tại trong dữ liệu. + +219 +00:14:31,560 --> 00:14:36,510 +Vì vậy, không có điều nào trong số này được thực hiện và chức năng kết thúc. + +220 +00:14:36,960 --> 00:14:40,920 +Đó có lẽ không phải là trải nghiệm người dùng tốt nhất. Thay vào đó, chúng tôi có thể muốn bắt nó bằng + +221 +00:14:41,460 --> 00:14:45,030 +một câu lệnh else + +222 +00:14:45,060 --> 00:14:49,560 +và chúng tôi muốn sử dụng một hộp thông báo để nói + +223 +00:14:49,560 --> 00:14:52,430 +lại điều đó, có một lỗi trong + +224 +00:14:52,670 --> 00:14:55,010 +trường hợp này nhưng lý do + +225 +00:14:55,850 --> 00:14:59,090 +cho lỗi này là vì không có chi + +226 +00:15:01,940 --> 00:15:06,380 +tiết nào hiện có cho trang web mà họ đang tìm kiếm. Bằng cách đó, họ không phải ngồi đó bối rối tại sao + +227 +00:15:06,380 --> 00:15:08,030 +tìm kiếm + +228 +00:15:08,060 --> 00:15:13,060 +một số loại trang web không thực sự tìm ra bất cứ điều gì. + +229 +00:15:13,910 --> 00:15:15,410 +Nó cho họ biết rằng không có + +230 +00:15:15,680 --> 00:15:19,070 +chi tiết và họ sẽ phải thêm nó nếu họ muốn tìm thấy nó trong cơ sở dữ liệu. + +231 +00:15:19,280 --> 00:15:21,410 +Nhiều sinh viên có thể tự hỏi vào thời điểm này, tại + +232 +00:15:22,400 --> 00:15:24,770 +sao chúng ta không nắm bắt điều này với một số loại ngoại lệ? + +233 +00:15:24,950 --> 00:15:27,680 +Và trên thực tế, chúng tôi có thể tạo ra một ngoại lệ. + +234 +00:15:29,240 --> 00:15:32,570 +Chúng tôi có thể nêu ra một ngoại lệ ở đây và sau + +235 +00:15:32,570 --> 00:15:36,890 +đó chúng tôi có thể bắt nó ở một nơi khác và hiển thị hộp thông báo này. + +236 +00:15:36,920 --> 00:15:38,390 +Nhưng điều bạn muốn lưu ý là + +237 +00:15:38,780 --> 00:15:43,780 +nếu bạn có thể làm điều gì đó với if và else rất dễ dàng, thì bạn nên kiên trì sử dụng if và else. + +238 +00:15:44,000 --> 00:15:47,690 +Nếu bạn không thể làm điều đó với if và else rất dễ dàng và đó + +239 +00:15:48,170 --> 00:15:52,460 +thực sự là một lỗi sẽ xảy ra mà bạn không có bất kỳ cách nào khác để xử + +240 +00:15:52,460 --> 00:15:55,910 +lý, thì bạn nên sử dụng thử, ngoại trừ, cuối cùng, , từ khóa. + +241 +00:15:56,210 --> 00:16:00,950 +Và trên thực tế, nếu bạn nghĩ về điều này, tôi không có cách + +242 +00:16:01,670 --> 00:16:03,500 +nào dễ dàng để kiểm + +243 +00:16:03,920 --> 00:16:08,920 +tra xem liệu tệp dữ liệu này có cuối cùng không được tìm thấy hay không. Nhưng tôi gặp lỗi không tìm thấy tệp này sẽ xuất hiện + +244 +00:16:10,490 --> 00:16:14,660 +mỗi khi tôi cố + +245 +00:16:14,660 --> 00:16:18,230 +gắng mở tệp và tệp đó không tồn tại. + +246 +00:16:18,230 --> 00:16:19,010 +Cách khác + +247 +00:16:19,010 --> 00:16:24,010 +để nghĩ về nó là một ngoại lệ là một cái gì đó có nghĩa là đặc biệt. Đó là điều rất hiếm khi xảy ra. + +248 +00:16:24,020 --> 00:16:27,560 +Trong khi if và else nắm bắt những thứ thường xuyên xảy ra. + +249 +00:16:28,100 --> 00:16:32,120 +Thông thường, người dùng của bạn có thể tìm kiếm trên trang web với suy + +250 +00:16:32,420 --> 00:16:36,290 +nghĩ rằng họ đã lưu một số loại chi tiết cho một trang web. Nhưng trên thực tế, họ đã + +251 +00:16:36,530 --> 00:16:40,550 +không làm vậy. Hãy nghĩ về điều này khi bạn đang + +252 +00:16:40,580 --> 00:16:43,970 +viết mã của mình và nhớ + +253 +00:16:44,090 --> 00:16:49,090 +rằng chỉ sử dụng xử lý ngoại lệ khi bạn không có một giải pháp thay thế dễ dàng. Đây là bạn có nó. + +254 +00:16:49,520 --> 00:16:52,100 +Đó là mã đã hoàn thành cho trình quản lý mật khẩu được nâng cấp của chúng tôi. + +255 +00:16:52,430 --> 00:16:56,990 +Nếu bạn muốn xem bất kỳ mã nào trong số này, thì, như mọi khi, hãy truy cập tài nguyên + +256 +00:16:57,500 --> 00:16:59,750 +khóa học và bạn sẽ thấy một liên + +257 +00:16:59,810 --> 00:17:02,570 +kết đến mã đã hoàn thành mà bạn có thể xem lại. + +258 +00:17:02,870 --> 00:17:06,319 +Nhưng trong các bài học ngày hôm nay, chúng tôi đã bổ sung thêm + +259 +00:17:06,859 --> 00:17:08,150 +nhiều kiến thức về + +260 +00:17:08,390 --> 00:17:13,369 +những thứ như xử lý lỗi và lưu dữ liệu ở định dạng JSON, xử lý và tải và cập + +261 +00:17:13,369 --> 00:17:18,369 +nhật và xử lý tất cả dữ liệu đó để tạo dự án trình quản lý mật khẩu hoàn chỉnh này. + +262 +00:17:18,530 --> 00:17:23,530 +Bây giờ, tôi chắc rằng bạn có thể thêm rất nhiều cải tiến cho phần này, nhưng nó sẽ vượt + +263 +00:17:24,829 --> 00:17:27,920 +quá thời gian được phân bổ cho các bài học hôm nay. + +264 +00:17:28,160 --> 00:17:31,880 +Vì vậy, nếu bạn muốn, vui lòng tiếp tục xử lý mã + +265 +00:17:32,330 --> 00:17:33,163 +và cải + +266 +00:17:33,170 --> 00:17:37,550 +thiện nó và thực hiện các tùy chỉnh và sửa đổi của riêng bạn. + +267 +00:17:37,550 --> 00:17:39,590 +Nếu bạn tạo ra thứ gì đó mà bạn cho là thú vị, + +268 +00:17:39,920 --> 00:17:41,810 +hãy nhớ chia sẻ nó với chúng tôi trong phần Hỏi / + +269 +00:17:41,840 --> 00:17:46,340 +Đáp bên dưới bài học để tất cả chúng tôi có thể ngưỡng mộ công việc khó khăn của bạn và có thể cải thiện mã của chính chúng tôi. + +270 +00:17:46,340 --> 00:17:50,810 +Vì vậy, hãy vui chơi với chương trình này và hẹn gặp lại bạn vào ngày mai. + diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Course-Fixes-Report-an-Issue.url b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Solution-password-manager-improved-end.zip b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Solution-password-manager-improved-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..84a33ab333653591ba014401b4fd6293de04966d --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/009 Solution-password-manager-improved-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:781b2999a57ab547f74277fef26b0a7a44633daf7c265ba57f35cc4e68bae50b +size 16261 diff --git a/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/external-links.txt b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..e30dff87278a6e53cf2cd02182f86e7034ca4b4f --- /dev/null +++ b/part3/30 - Day 30 - Intermediate - Errors, Exceptions and JSON Data Improving the Password/external-links.txt @@ -0,0 +1,21 @@ + +003 Completed-Day-30-Practice-Code +https://repl.it/@appbrewery/day-30-end#main.py + +004 Exercise-33 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/64aebca1-8823-40fd-8560-b5b64c80a318 + +004 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +005 Exercise-34 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/186be9d3-20af-425c-8965-54631ab59d2e + +005 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Python-JSON-Module-Documentation +https://docs.python.org/3/library/json.html + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 2018-Frequency-Lists-from-Hermit-Dave.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 2018-Frequency-Lists-from-Hermit-Dave.url new file mode 100644 index 0000000000000000000000000000000000000000..a8c86dc1ed001889f48b546626750fc9ec406ecf --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 2018-Frequency-Lists-from-Hermit-Dave.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/hermitdave/FrequencyWords/tree/master/content/2018 \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Day 31 Goals what you will make by the end of the day.mp4 b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Day 31 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9131dcf05f3225ff6e37abc16526ac129e5e5906 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Day 31 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23cca7051bb66c4d9f6d6b667d5805b19b7af780a422d1a3eccb697c23fd669c +size 121057722 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Day 31 Goals what you will make by the end of the day_vi.srt b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Day 31 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e220512b6c709433c351929b6bafaebcec4f8b97 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Day 31 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,616 @@ +1 +00:00:00,150 --> 00:00:02,160 +Xin chào các bạn, chào mừng + +2 +00:00:02,160 --> 00:00:07,080 +đến với ngày 31 của 100 Ngày viết mã. Và bây giờ bạn đã học + +3 +00:00:07,080 --> 00:00:10,470 +được khá nhiều thứ. Chúng tôi đã xem xét + +4 +00:00:10,770 --> 00:00:15,120 +việc xử lý các trường hợp ngoại lệ, sử dụng định dạng dữ liệu JSON, chuyển + +5 +00:00:15,120 --> 00:00:19,950 +và đọc CSV bằng cách sử dụng gấu trúc, mở và ghi vào tệp và hơn thế nữa. + +6 +00:00:20,310 --> 00:00:24,270 +Vì vậy, đã đến lúc cho dự án capstone của bạn. + +7 +00:00:24,960 --> 00:00:26,490 +Và trong dự án capstone + +8 +00:00:26,550 --> 00:00:30,210 +này, chúng tôi sẽ xây dựng một chương trình flashcard để giúp bạn học tập. + +9 +00:00:30,810 --> 00:00:35,490 +Và nó đặc biệt tuyệt vời với việc học ngôn ngữ. Bây giờ, khi tôi còn đi học, tôi + +10 +00:00:35,550 --> 00:00:36,540 +học tiếng + +11 +00:00:36,570 --> 00:00:41,570 +Pháp và rất nhiều từ vựng mà chúng tôi phải học để làm bài kiểm tra. + +12 +00:00:42,780 --> 00:00:46,070 +Pomme là Apple, và tôi sẽ ghi nhớ tất cả những từ này, + +13 +00:00:47,000 --> 00:00:50,900 +tất cả các bảng ngữ pháp, nhưng sau bốn hoặc năm năm, tôi thực sự không + +14 +00:00:51,290 --> 00:00:53,150 +thể nói được nhiều tiếng Pháp. + +15 +00:00:53,810 --> 00:00:58,100 +Vì vậy, tôi quyết định học ngôn ngữ nhập vai. + +16 +00:00:58,220 --> 00:00:59,390 +Tôi đến + +17 +00:00:59,810 --> 00:01:04,810 +Pháp, đi chơi với bạn bè và cố gắng hòa mình vào ngôn + +18 +00:01:06,500 --> 00:01:10,520 +ngữ và văn hóa. Nhưng điều đó cũng không thành công. Tôi đã có rất nhiều + +19 +00:01:10,520 --> 00:01:13,670 +niềm vui, nhưng tiếng Pháp của tôi dường như không được cải thiện nhiều. + +20 +00:01:14,420 --> 00:01:19,420 +Nhưng sau đó tôi đã khám phá ra một cách học ngôn ngữ mới và tất cả bắt đầu bằng + +21 +00:01:20,030 --> 00:01:24,710 +việc nhìn vào các ký tự Trung Quốc. Có rất nhiều ký tự Trung Quốc ngoài kia. + +22 +00:01:24,710 --> 00:01:29,710 +Tổng cộng có 50.000 ký tự Trung Quốc từ lịch sử đến nay. + +23 +00:01:31,790 --> 00:01:34,940 +Có rất nhiều ký tự mà bạn có thể học. Chúng có một ý nghĩa khác + +24 +00:01:34,940 --> 00:01:37,670 +nhau và mỗi chúng có một cách phát âm khác nhau. + +25 +00:01:38,450 --> 00:01:43,250 +Tưởng tượng rằng. Đang cố gắng học 50.000 ký tự. Đó không phải là một kỳ tích dễ dàng. + +26 +00:01:43,490 --> 00:01:48,350 +Nhưng sau đó một người bạn nói với tôi rằng thực ra bạn không + +27 +00:01:48,380 --> 00:01:52,850 +thực sự cần 50.000 ký tự. Giáo sư trung bình của bạn, một người + +28 +00:01:53,180 --> 00:01:56,150 +rất hùng biện, có thể viết rất nhiều ký tự và sử + +29 +00:01:56,510 --> 00:02:01,510 +dụng chúng một cách dễ dàng, chỉ biết khoảng 10.000 và người bình thường của bạn có thể chỉ sử + +30 +00:02:03,470 --> 00:02:08,240 +dụng khoảng 8.000 trong cuộc sống hàng ngày của họ. Và nếu về cơ bản bạn chỉ muốn vượt qua + +31 +00:02:08,300 --> 00:02:12,950 +trong cuộc sống, bạn có thể dựa khá nhiều vào 3000 từ mà một thiếu niên bình thường sẽ biết. + +32 +00:02:13,880 --> 00:02:18,020 +Và cuối cùng, nếu bạn thực sự chỉ muốn có thể xem một số bộ phim đơn giản, + +33 +00:02:18,050 --> 00:02:19,520 +đọc một số cuốn sách đơn + +34 +00:02:19,760 --> 00:02:24,320 +giản, thì bạn có thể sử dụng vốn từ vựng trung bình của trẻ em khoảng 1000 ký tự đó. + +35 +00:02:24,920 --> 00:02:28,700 +Và tại thời điểm này, tôi tự nghĩ là 1000. Điều đó khá khả thi. + +36 +00:02:28,970 --> 00:02:32,330 +Tôi có thể làm 1000. Nếu tôi học chỉ 10 ký tự mỗi + +37 +00:02:32,720 --> 00:02:35,720 +ngày, tôi sẽ mất chưa đến một năm để học tất cả các ký tự này. + +38 +00:02:36,530 --> 00:02:39,980 +Nhưng nó cũng không chỉ là 1000 ký tự ngẫu nhiên. + +39 +00:02:40,550 --> 00:02:42,920 +Có một thứ như một từ điển tần số. + +40 +00:02:42,950 --> 00:02:46,310 +Vì vậy, một từ điển không được liệt kê ở đây theo A, B, + +41 +00:02:46,640 --> 00:02:51,640 +C, D, nhưng nó thực sự được liệt kê theo tần suất mà một từ cụ thể xuất hiện trong cách + +42 +00:02:51,740 --> 00:02:54,170 +sử dụng phổ biến. Ví dụ, nếu + +43 +00:02:54,410 --> 00:02:59,410 +bạn lấy 1000 ký tự đầu tiên được sử dụng phổ biến nhất, thì bạn có thể đọc + +44 +00:03:00,280 --> 00:03:03,160 +hầu hết các tờ báo, bạn có thể xem hầu + +45 +00:03:03,160 --> 00:03:06,160 +hết các chương trình truyền hình vì đây là những từ + +46 +00:03:06,160 --> 00:03:10,870 +là bánh mì và bơ của ngôn ngữ. Nó giống như trong tiếng Anh, a, + +47 +00:03:11,110 --> 00:03:14,530 +the, of, from, why, yes, no, đây là những từ mà + +48 +00:03:14,740 --> 00:03:17,920 +chúng ta sử dụng hàng ngày, lặp đi lặp lại. + +49 +00:03:18,430 --> 00:03:23,430 +Những từ điên rồ như chống thành lập hoặc u nguyên bào thần kinh đệm. + +50 +00:03:24,640 --> 00:03:28,870 +Đây không phải là những từ mà bạn cần thực sự biết trong cuộc sống hàng ngày. + +51 +00:03:29,770 --> 00:03:32,080 +Vì vậy, hãy để tôi chỉ cho bạn chương trình mà bạn sẽ + +52 +00:03:32,110 --> 00:03:35,530 +xây dựng, nơi bạn có thể học những từ được sử dụng thường xuyên nhất trong bất kỳ ngôn ngữ nào. + +53 +00:03:36,130 --> 00:03:38,080 +Đó là một chương trình thẻ nhớ và nó + +54 +00:03:38,620 --> 00:03:43,360 +hiển thị cho bạn mặt trước và mặt sau của thẻ. Vì vậy, ví dụ, tiếng + +55 +00:03:43,390 --> 00:03:48,390 +Pháp, nhu cầu. Trong tiếng Anh có nghĩa là yêu cầu. Sau ba giây, thẻ sẽ lật + +56 +00:03:48,850 --> 00:03:52,990 +và tôi có thể kiểm tra xem mình có biết câu trả lời đúng hay không. + +57 +00:03:53,500 --> 00:03:57,070 +Nếu tôi đúng, tôi sẽ nhấn dấu tích và nếu tôi sai, + +58 +00:03:57,100 --> 00:04:00,370 +tôi sẽ nhấn dấu thập. Vì vậy, chúng ta hãy thử một từ khác. + +59 +00:04:00,700 --> 00:04:04,840 +Parti có nghĩa là rời đi hoặc rời đi. Attendez có nghĩa là + +60 +00:04:04,840 --> 00:04:07,360 +chờ đợi và tôi nghĩ rằng + +61 +00:04:07,960 --> 00:04:12,490 +tôi đã biết từ đó. Vì vậy, tôi sẽ nhấp vào dấu kiểm. + +62 +00:04:12,880 --> 00:04:16,750 +Và điều cần làm là nó sẽ lấy flashcard ra khỏi tất cả danh sách + +63 +00:04:16,750 --> 00:04:20,589 +các flashcard để nó không hiển thị cho tôi những thứ tôi đã biết. + +64 +00:04:21,339 --> 00:04:24,070 +Và thay vào đó, nó chỉ cho tôi thấy những điều tôi + +65 +00:04:24,280 --> 00:04:28,840 +không biết để tôi có thể xem lại và nói, Ồ, tôi không chắc thăn nghĩa là gì nên tôi sẽ + +66 +00:04:28,900 --> 00:04:30,490 +nói chéo, và điều đó sẽ + +67 +00:04:30,790 --> 00:04:35,380 +quay trở lại bộ bài và nó có thể xảy ra lên một lần nữa vào một thời điểm nào đó. + +68 +00:04:36,100 --> 00:04:40,480 +Vì vậy, phần mềm tuyệt đẹp này là những gì chúng tôi sẽ tạo ra. + +69 +00:04:40,960 --> 00:04:42,190 +Nhưng cụ thể hơn, + +70 +00:04:42,220 --> 00:04:46,930 +bạn sẽ tạo ra bởi vì suy cho cùng, đây là dự án capstone của bạn. + +71 +00:04:47,380 --> 00:04:48,070 +Nhưng đừng + +72 +00:04:48,070 --> 00:04:53,070 +lo lắng, tôi đã chia thành bốn bước và tôi sẽ có một số hướng dẫn từng bước + +73 +00:04:53,140 --> 00:04:57,400 +cho bạn trong bài học tiếp theo. Bây giờ, nếu bạn đang tự hỏi, làm + +74 +00:04:57,520 --> 00:05:00,970 +thế nào bạn có được những từ thường xuyên nhất cho ứng dụng flashcard + +75 +00:05:00,970 --> 00:05:02,890 +ngay từ đầu? Để tôi chỉ cho bạn. + +76 +00:05:03,520 --> 00:05:08,520 +Có một Wiki cho danh sách tần suất của các ngôn ngữ khác nhau và nó liệt kê hầu + +77 +00:05:09,010 --> 00:05:12,790 +hết các ngôn ngữ phổ biến. Nếu chúng ta sử dụng tiếng + +78 +00:05:12,820 --> 00:05:17,320 +Pháp, bạn có thể thấy rằng có vô số danh sách khác nhau mà mọi người đã + +79 +00:05:17,530 --> 00:05:21,040 +biên soạn, liệt kê những từ hàng đầu, xuất hiện thường xuyên nhất. + +80 +00:05:21,700 --> 00:05:26,700 +Và một trong những điều tôi nghĩ là thực sự có liên quan là các từ dựa + +81 +00:05:26,710 --> 00:05:27,610 +trên phụ đề. + +82 +00:05:28,120 --> 00:05:33,120 +Những phụ đề này đến từ tất cả các loại chương trình và phim phù hợp + +83 +00:05:33,730 --> 00:05:37,360 +với văn hóa hiện đại. Và khi bạn nhìn vào một trong các phụ + +84 +00:05:37,660 --> 00:05:39,370 +đề, nhân tiện đây là một trong + +85 +00:05:39,700 --> 00:05:43,720 +những chương trình yêu thích của tôi, bạn có thể thấy rằng phụ đề được liệt kê theo ngôn ngữ. + +86 +00:05:44,110 --> 00:05:48,490 +Và nếu chúng tôi chọn ra một từ bằng tiếng Anh và xem xét nó, thì bạn + +87 +00:05:49,960 --> 00:05:51,130 +có thể thấy nó + +88 +00:05:51,190 --> 00:05:55,960 +về cơ bản chỉ là tất cả những từ được nói trong phim hoặc trong chương trình và nó + +89 +00:05:56,410 --> 00:05:59,780 +đã được phiên âm thành phụ đề. Bây giờ, nếu chúng ta + +90 +00:05:59,780 --> 00:06:04,010 +lấy tất cả những từ này từ các bộ phim và chương trình được xem phổ + +91 +00:06:04,010 --> 00:06:07,550 +biến nhất, chúng ta sẽ kết thúc với danh sách tần suất này. + +92 +00:06:08,000 --> 00:06:09,620 +Vì vậy, nếu chúng ta + +93 +00:06:09,620 --> 00:06:14,620 +nhìn vào đây, nó sẽ hiển thị các từ phổ biến nhất từ 1 đến 5.000. + +94 +00:06:16,280 --> 00:06:17,330 +Và ngay từ + +95 +00:06:17,330 --> 00:06:22,330 +đầu, đó là cái tôi của bạn, là, tất cả những điều này thực sự phổ biến. + +96 +00:06:22,550 --> 00:06:25,610 +Và sau đó khi bạn cuộn xuống, bạn sẽ đến một số từ dài hơn. + +97 +00:06:26,090 --> 00:06:28,100 +Và nếu bạn cuộn xuống dưới cùng, bạn + +98 +00:06:28,340 --> 00:06:31,460 +có thể thấy bạn đang nhận được ngày càng nhiều từ thích hợp. + +99 +00:06:32,600 --> 00:06:37,600 +Các danh sách tần suất này được biên soạn bởi một người dùng có tên Hermitd và + +100 +00:06:38,750 --> 00:06:41,480 +Hermitdis a Hermit Dave Và anh ta có + +101 +00:06:41,900 --> 00:06:46,900 +một kho lưu trữ GitHub nơi anh ta tổng hợp tất cả các từ tần suất và + +102 +00:06:48,980 --> 00:06:52,190 +bạn có thể xem phiên bản mới nhất từ năm 2018. + +103 +00:06:52,910 --> 00:06:56,840 +Bây giờ anh ấy có tất cả các từ tần số cho nhiều ngôn ngữ và + +104 +00:06:56,930 --> 00:06:58,970 +nó được liệt kê theo mã ngôn + +105 +00:06:59,330 --> 00:07:01,940 +ngữ, vì vậy tiếng Pháp sẽ là FR chẳng hạn. + +106 +00:07:02,600 --> 00:07:07,600 +Và ở đây bạn có thể thấy 50.000 danh sách thường xuyên nhất hoặc toàn bộ danh sách. + +107 +00:07:09,950 --> 00:07:13,460 +Có lẽ chúng ta sẽ không học nhiều hơn 1000, và chắc + +108 +00:07:13,700 --> 00:07:16,250 +chắn tôi sẽ không học đến 50.000. + +109 +00:07:16,730 --> 00:07:21,620 +Nhưng dữ liệu này ở đây liệt kê tất cả các từ mà anh ấy tìm thấy trong các phụ đề này + +110 +00:07:21,620 --> 00:07:23,390 +và tần suất xuất hiện của chúng. + +111 +00:07:23,930 --> 00:07:27,260 +Và một khi chúng đã được sắp xếp theo thứ tự tần suất, đây + +112 +00:07:27,560 --> 00:07:29,000 +là kết quả của bạn. + +113 +00:07:30,860 --> 00:07:33,710 +Vì vậy, tôi đã nghiên cứu một số trong 200 từ đầu tiên. + +114 +00:07:34,220 --> 00:07:37,340 +Vì vậy, nếu tôi lấy một trăm từ từ từ điển tần số này và + +115 +00:07:37,820 --> 00:07:42,200 +tôi đưa nó vào một trang tính của Google, thì tôi sẽ kết thúc với một cái gì đó như thế này. + +116 +00:07:42,890 --> 00:07:47,180 +Bây giờ, những gì tôi muốn có thể làm là tạo một flashcard trong đó + +117 +00:07:47,180 --> 00:07:49,670 +mặt trước của flashcard là từ bằng tiếng + +118 +00:07:50,000 --> 00:07:54,170 +Pháp, sau đó ở mặt sau của flashcard là câu trả lời bằng tiếng + +119 +00:07:54,170 --> 00:07:58,460 +Anh cho nghĩa của từ đó. Thay vì phải lướt qua từ điển để + +120 +00:07:58,460 --> 00:08:00,620 +tìm ra nghĩa của từng từ này, thực sự có + +121 +00:08:00,920 --> 00:08:03,920 +một mẹo rất hay trong Google sheet mà tôi muốn chỉ cho bạn. + +122 +00:08:04,610 --> 00:08:06,500 +Nếu bạn nhấn bằng để bắt + +123 +00:08:06,530 --> 00:08:10,820 +đầu một công thức mới và bạn nhập vào Google dịch, bạn có thể thấy + +124 +00:08:11,630 --> 00:08:13,760 +nó yêu cầu một số đầu vào. + +125 +00:08:14,180 --> 00:08:16,880 +Đầu tiên là đoạn văn bản mà bạn muốn + +126 +00:08:16,880 --> 00:08:20,810 +dịch, vì vậy tôi sẽ nhấp vào ô này, sau đó là ngôn ngữ nguồn. + +127 +00:08:20,810 --> 00:08:24,380 +Vì vậy, đây là ngôn ngữ như một mã. Vì vậy, ví dụ, tiếng Tây + +128 +00:08:24,530 --> 00:08:29,530 +Ban Nha là ES và tiếng Pháp là FR. Và sau đó là đầu vào cuối cùng. + +129 +00:08:30,590 --> 00:08:34,340 +nó mong đợi là mã ngôn ngữ mà bạn muốn dịch nó sang. + +130 +00:08:34,730 --> 00:08:38,900 +Vì vậy, trong trường hợp này, tôi muốn dịch nó sang tiếng Anh. Vì vậy, tôi sẽ sử dụng en. + +131 +00:08:39,559 --> 00:08:41,570 +Và sau đó chúng ta có thể đóng dấu ngoặc + +132 +00:08:41,570 --> 00:08:44,690 +đơn, nhấn enter và sau một thời gian ngắn với Internet tốt, bạn sẽ thấy + +133 +00:08:44,930 --> 00:08:48,500 +bản dịch tiếng Anh cho từ này. Và tất nhiên, bởi vì chúng + +134 +00:08:48,500 --> 00:08:49,520 +tôi là một + +135 +00:08:49,520 --> 00:08:54,520 +Excel, chúng tôi chỉ cần kéo dấu gạch chéo này xuống tất cả các từ của chúng tôi. + +136 +00:08:54,900 --> 00:08:56,550 +Và sau một thời gian ngắn, bam! + +137 +00:08:57,240 --> 00:09:00,660 +Nó được dịch tất cả những từ đó sang tiếng Anh. + +138 +00:09:01,680 --> 00:09:06,540 +Vì vậy, đây là một thủ thuật thực sự gọn gàng và tôi sẽ liên kết đến các tài liệu cho công thức + +139 +00:09:06,540 --> 00:09:07,373 +cụ thể này. + +140 +00:09:07,740 --> 00:09:12,740 +Và bạn cũng có thể xem hỗ trợ ngôn ngữ mà dịch vụ dịch thuật của Google + +141 +00:09:12,990 --> 00:09:17,400 +có và bạn có thể xem mã ngôn ngữ cho từng ngôn ngữ này. + +142 +00:09:17,550 --> 00:09:21,450 +Vì vậy, nếu bạn muốn thử học tiếng Macedonian hoặc Malay, và đây sẽ + +143 +00:09:21,720 --> 00:09:23,700 +là lựa chọn tốt nhất cho bạn. + +144 +00:09:24,390 --> 00:09:27,450 +Vì vậy, bây giờ tôi đã tạo trang tính Excel của mình + +145 +00:09:27,480 --> 00:09:29,940 +về cơ bản gồm các từ tiếng Pháp và tiếng + +146 +00:09:30,330 --> 00:09:35,330 +Anh, tôi có thể có hàng trăm thẻ flashcard với dữ liệu mặt trước và mặt sau đã được lưu bên + +147 +00:09:35,790 --> 00:09:38,700 +trong trang tính Google này. Bây giờ, tất cả những gì + +148 +00:09:38,700 --> 00:09:42,570 +tôi phải làm chỉ đơn giản là tải nó xuống dưới dạng CSV và chúng tôi sẽ có + +149 +00:09:42,930 --> 00:09:46,110 +thể làm việc với nó rất dễ dàng. Bây giờ, bạn không phải + +150 +00:09:46,140 --> 00:09:50,430 +lo lắng về việc tải xuống hoặc nắm giữ điều này vì tôi đã + +151 +00:09:50,430 --> 00:09:55,430 +bao gồm dữ liệu CSV cuối cùng trong dự án bắt đầu để bạn có thể + +152 +00:09:55,800 --> 00:09:56,633 +sử dụng. + +153 +00:09:57,270 --> 00:10:02,270 +Vì vậy, hãy chuyển sang bài học tiếp theo và bắt đầu xây dựng công cụ hỗ trợ học + +154 +00:10:02,730 --> 00:10:05,460 +tập của riêng bạn, ứng dụng flashcard hào nhoáng. + diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Sheets.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Sheets.url new file mode 100644 index 0000000000000000000000000000000000000000..862731f8927912f469c98bbb60400c1476260722 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Sheets.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.google.co.uk/sheets/about/ \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Translate-Language-Codes.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Translate-Language-Codes.url new file mode 100644 index 0000000000000000000000000000000000000000..4292a0537dd21889dc0e4f977927ff68008c8372 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Translate-Language-Codes.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://cloud.google.com/translate/docs/languages?hl=en \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Translate-for-Google-Sheets.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Translate-for-Google-Sheets.url new file mode 100644 index 0000000000000000000000000000000000000000..41209de7e8aebbc40e4c7e05fba52b5ed72dbda3 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Google-Translate-for-Google-Sheets.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://support.google.com/docs/answer/3093331?hl=en-GB \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Open-Subtitles.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Open-Subtitles.url new file mode 100644 index 0000000000000000000000000000000000000000..0cd9b0fd7aff58fcfbc63b22d61ba236b63cf608 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Open-Subtitles.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.opensubtitles.org/en/search/subs \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Wiktionary-Frequency-Lists.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Wiktionary-Frequency-Lists.url new file mode 100644 index 0000000000000000000000000000000000000000..ca13d904180948ff14eccdd604219bb13baee8e5 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 Wiktionary-Frequency-Lists.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wiktionary.org/wiki/Wiktionary:Frequency_lists \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 flash-card-project-start.zip b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 flash-card-project-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..5d66392d28bad44eb884edf2adc6e2ddb8b20e0c --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/001 flash-card-project-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2696625dbbb4c316f8de872c7db2951349fc619c58a8fab5afc8a27c466b266f +size 46972 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/002 Step 1 - Create the User Interface (UI) with Tkinter.html b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/002 Step 1 - Create the User Interface (UI) with Tkinter.html new file mode 100644 index 0000000000000000000000000000000000000000..495afa0621a217d0e0cf13634aa399880d07145a --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/002 Step 1 - Create the User Interface (UI) with Tkinter.html @@ -0,0 +1,2 @@ +

1. Download the starting files from the course resources.

2. Use the images in the image folder, to create the following user interface. The and are buttons. You can add images to buttons like this:

my_image = PhotoImage(file="path/to/image_file.png")
+button = Button(image=my_image, highlightthickness=0)

3. Here are some hints for the fonts, measurements and positioning.

HINTS:

1. You will need a 2 X 2 grid, with the flash card taking up 2 columns.

2. The flash card is a Canvas with 1 image and 2 pieces of text.

3. The image is card_front.png, created from the PhotoImage class. Be careful about the full image path as the image is inside the image folder.

\ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/003 Solution & Walkthrough for Creating the UI.mp4 b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/003 Solution & Walkthrough for Creating the UI.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a77e929f7e462fd636c98b44c3d97834ccf15e0d --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/003 Solution & Walkthrough for Creating the UI.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4aa8dd38f99e26fc108cdcb60e06ddb5c4abf9f634ebfd9f969076ca38e3a84f +size 95364434 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/003 Solution & Walkthrough for Creating the UI_vi.srt b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/003 Solution & Walkthrough for Creating the UI_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ca5a1790fd739c4123dc236124a77233f17db76c --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/003 Solution & Walkthrough for Creating the UI_vi.srt @@ -0,0 +1,688 @@ +1 +00:00:00,390 --> 00:00:00,780 +Được rồi. + +2 +00:00:00,780 --> 00:00:04,770 +Vì vậy, hy vọng bạn đã xem qua các tài nguyên của khóa học và tải xuống + +3 +00:00:04,770 --> 00:00:09,480 +tệp zip bắt đầu cho dự án hôm nay. Vì vậy, hãy tiếp tục và giải nén nó. + +4 +00:00:09,660 --> 00:00:12,780 +Và sau đó, hãy mở thư mục này bằng PyCharm. + +5 +00:00:16,700 --> 00:00:16,910 +1: Được rồi. + +6 +00:00:16,910 --> 00:00:20,900 +0: Ở đây bạn đã có hai thư mục, dữ liệu và hình ảnh. + +7 +00:00:21,260 --> 00:00:26,030 +Chúng tôi sẽ sử dụng tất cả những hình ảnh này bên trong thư mục hình ảnh để + +8 +00:00:26,090 --> 00:00:29,630 +tạo dự án của chúng tôi. Vì vậy, đây là mặt + +9 +00:00:29,960 --> 00:00:33,860 +trước của thẻ flashcard, mặt sau của thẻ flashcard, nút đúng và nút sai. + +10 +00:00:35,210 --> 00:00:40,100 +Và chúng ta sẽ viết mã bên trong main. py Vì vậy, hãy chú ý + +11 +00:00:40,100 --> 00:00:43,280 +ở đây, chúng tôi đã xác định mã hex màu nền. + +12 +00:00:43,310 --> 00:00:47,870 +Vì vậy, chúng tôi cũng có thể sử dụng nó trong mã hóa của mình. Đây là những gì chúng tôi đang hướng tới. + +13 +00:00:47,900 --> 00:00:50,570 +Đây là giao diện người dùng cho chương trình này. + +14 +00:00:51,110 --> 00:00:56,110 +Nó sẽ có một cửa sổ có tiêu đề và bên trong cửa sổ này, chúng + +15 +00:00:56,390 --> 00:01:00,980 +ta sẽ có hình ảnh mặt trước của thẻ ở đây hiển thị. + +16 +00:01:01,220 --> 00:01:04,489 +Và trên thẻ đó, chúng ta sẽ có hai đoạn + +17 +00:01:04,970 --> 00:01:09,140 +văn bản, một từ ghi tiêu đề và một đoạn văn bản chỉ nói từ. + +18 +00:01:09,680 --> 00:01:13,340 +Và chúng sẽ được định dạng theo hướng dẫn, vì vậy về + +19 +00:01:13,370 --> 00:01:17,450 +phông chữ và kích thước, v.v. Cuối cùng, ở dưới cùng, chúng + +20 +00:01:17,450 --> 00:01:21,140 +ta có hai nút, một dấu chéo và một dấu kiểm. + +21 +00:01:21,560 --> 00:01:26,560 +Và về cơ bản chúng là những nút có hình ảnh đúng và sai bên trong chúng. + +22 +00:01:27,410 --> 00:01:30,260 +Bắt đầu nào. Bên trong main. py, điều + +23 +00:01:30,290 --> 00:01:34,640 +đầu tiên tôi sẽ làm là tiếp tục và nhập tkinter. + +24 +00:01:35,390 --> 00:01:38,360 +Vì vậy, tôi sẽ nhập tất cả các lớp từ tkinter và sau đó tôi + +25 +00:01:38,810 --> 00:01:41,540 +sẽ có thể sử dụng nó để tạo cửa sổ của mình. + +26 +00:01:45,200 --> 00:01:45,590 +1: Được rồi. + +27 +00:01:45,590 --> 00:01:50,590 +0: Tôi sẽ đặt tiêu đề cho cửa sổ của mình và tôi sẽ đặt cho nó tên ứng dụng của chúng tôi + +28 +00:01:50,870 --> 00:01:51,260 +sẽ + +29 +00:01:51,260 --> 00:01:56,260 +được gọi là Flashy hoặc bất cứ thứ gì bạn muốn gọi. Tiếp theo, tôi sẽ cung cấp cho + +30 +00:01:56,630 --> 00:01:58,370 +cửa sổ này, ừm, + +31 +00:01:58,400 --> 00:02:03,400 +một cấu hình và tôi sẽ đặt vùng đệm của cửa sổ thành 50 pixel + +32 +00:02:04,310 --> 00:02:07,310 +trong chữ X và 50 pixel trong chữ Y. + +33 +00:02:08,960 --> 00:02:12,290 +Bây giờ cửa sổ này cũng sẽ có màu + +34 +00:02:12,320 --> 00:02:15,680 +nền sẽ được đặt thành hằng số BACKGROUND_COLOR mà chúng + +35 +00:02:15,680 --> 00:02:17,450 +ta có ở đây. + +36 +00:02:18,650 --> 00:02:21,230 +Vì vậy, bây giờ tôi đã hoàn tất việc định + +37 +00:02:21,260 --> 00:02:26,260 +cấu hình cửa sổ của mình, tôi có thể tiếp tục và bắt đầu cửa sổ của mình trong vòng lặp chính. + +38 +00:02:26,720 --> 00:02:31,010 +Và bây giờ tôi có thể chạy mã này và chỉ cần kiểm tra xem nó có hoạt động hay không. + +39 +00:02:31,580 --> 00:02:34,550 +Đây là cửa sổ của chúng ta với màu nền và đã + +40 +00:02:34,820 --> 00:02:38,030 +có một số phần đệm trong đó và làm cho cửa sổ này lớn + +41 +00:02:38,030 --> 00:02:39,710 +hơn một chút. Bây giờ, điều + +42 +00:02:39,740 --> 00:02:44,740 +tiếp theo cần làm là bằng cách nào đó đưa hình ảnh mặt trước của thẻ này lên cửa sổ của chúng ta. + +43 +00:02:46,490 --> 00:02:48,860 +Tôi sẽ sử dụng một đối tượng canvas. + +44 +00:02:49,400 --> 00:02:54,400 +Và nếu bạn nhớ, đối tượng canvas cho phép chúng ta xếp nhiều + +45 +00:02:54,740 --> 00:02:57,890 +thứ lên nhau. Vì vậy, đây là một hình ảnh và trên + +46 +00:02:57,890 --> 00:02:59,770 +đó, chúng ta có một số văn bản đang được tạo. + +47 +00:03:00,190 --> 00:03:03,730 +Và miễn là chúng ta chỉ định vị trí cho từng mục này, tất + +48 +00:03:04,000 --> 00:03:06,610 +cả đều có thể được xếp chồng lên nhau. + +49 +00:03:07,420 --> 00:03:11,020 +Vì vậy, chúng tôi đang tạo canvas của chúng tôi từ lớp canvas và sau đó + +50 +00:03:11,440 --> 00:03:14,680 +tôi sẽ cung cấp cho canvas của mình chiều rộng và chiều cao. + +51 +00:03:15,190 --> 00:03:19,240 +Vì vậy, tôi sẽ đặt chiều rộng và chiều cao bằng với chiều rộng và chiều cao + +52 +00:03:19,270 --> 00:03:20,380 +của thẻ của tôi. + +53 +00:03:20,740 --> 00:03:24,400 +Vậy chiều rộng là 800 và chiều cao là 526. + +54 +00:03:25,600 --> 00:03:30,070 +Bạn cũng nên thấy những con số này trong hướng dẫn. Tiếp theo, chúng ta sẽ + +55 +00:03:30,100 --> 00:03:34,030 +tạo hình ảnh của mình từ lớp hình ảnh. + +56 +00:03:34,360 --> 00:03:38,080 +Vì vậy, chúng ta hãy gọi nó là card_front_img và nó + +57 +00:03:38,560 --> 00:03:41,980 +sẽ được tạo từ lớp ảnh photo, nơi chúng ta + +58 +00:03:42,220 --> 00:03:45,910 +phải chỉ định tên tệp. Bây giờ, trước đây, tất cả những + +59 +00:03:45,940 --> 00:03:49,600 +gì chúng tôi đã làm là chúng tôi chỉ nói tên thực của tệp, + +60 +00:03:49,630 --> 00:03:54,610 +trong trường hợp này là card_front. png. Nhưng trong trường hợp của + +61 +00:03:54,880 --> 00:03:59,530 +chúng tôi, tệp cụ thể này thực sự nằm trong thư mục hình ảnh của chúng tôi. + +62 +00:03:59,950 --> 00:04:04,950 +Vì vậy, chúng tôi phải chỉ định đường dẫn tệp đầy đủ để điều này hoạt động; hình ảnh / card_ + +63 +00:04:05,560 --> 00:04:06,550 +mặt trước. png. + +64 +00:04:07,210 --> 00:04:11,620 +Và sau đó chúng ta có thể xem canvas của chúng ta và tạo hình ảnh của chúng ta bên trong. + +65 +00:04:12,160 --> 00:04:16,420 +Vì vậy, hình ảnh sẽ được đặt thành card_front_img của chúng tôi và sau đó chúng tôi phải chỉ + +66 +00:04:16,990 --> 00:04:21,990 +định các giá trị X và Y của hình ảnh đó. Bởi vì nó cần phải đi vào trung tâm của + +67 +00:04:22,120 --> 00:04:24,040 +canvas, chúng tôi sẽ chỉ tăng + +68 +00:04:24,250 --> 00:04:28,270 +một nửa chiều rộng cho chữ X và một nửa chiều cao cho chữ Y. + +69 +00:04:28,750 --> 00:04:30,760 +Vì vậy, điều này diễn + +70 +00:04:31,030 --> 00:04:34,630 +ra dưới dạng một bộ giá trị để một nửa + +71 +00:04:35,470 --> 00:04:40,470 +của 526 là 263 và sau đó tôi sẽ đặt canvas của chúng tôi lên + +72 +00:04:41,110 --> 00:04:45,550 +lưới và tôi sẽ đặt hàng thành 0 và cột cũng bằng 0. + +73 +00:04:46,240 --> 00:04:50,080 +Bây giờ, chỉ cần cẩn thận khi bạn đang viết các chuỗi như thế này, vì khá + +74 +00:04:50,110 --> 00:04:55,110 +dễ mắc lỗi chính tả như tôi có ở đây. Thay vào đó, tôi thích sử dụng tính + +75 +00:04:56,980 --> 00:04:59,440 +năng tự động điền của PyCharm hơn. + +76 +00:04:59,470 --> 00:05:02,140 +Vì vậy, khi bạn có một đường dẫn + +77 +00:05:02,170 --> 00:05:07,030 +tệp, bạn có thể nhập tên của thư mục dấu gạch chéo ngược và + +78 +00:05:07,060 --> 00:05:11,770 +sau đó là tên của tệp. Và chúng ta có thể nhấn enter để nó tự động chèn nó cho chúng ta. + +79 +00:05:12,880 --> 00:05:15,100 +Bây giờ, nếu tôi tiếp tục và + +80 +00:05:16,630 --> 00:05:21,430 +nhấn run, sau đó tôi sẽ thấy rằng tôi đã có một nền có màu + +81 +00:05:21,910 --> 00:05:26,910 +nền và sau đó là 50 pixel đệm ở cả bốn phía, ở giữa tôi đã + +82 +00:05:27,310 --> 00:05:29,650 +có canvas của mình hiển thị điều + +83 +00:05:29,650 --> 00:05:34,650 +này mặt tiền thẻ. png. Điều duy nhất về thẻ này là + +84 +00:05:35,380 --> 00:05:39,220 +nó vẫn có nền trắng. Làm thế nào để chúng ta thoát khỏi điều đó? Chà, chúng + +85 +00:05:39,250 --> 00:05:44,140 +ta có thể thay đổi nền thành cùng màu với mọi thứ khác, + +86 +00:05:44,170 --> 00:05:48,070 +vì vậy màu nền này. Hãy tiếp tục và lấy canvas + +87 +00:05:48,100 --> 00:05:51,850 +của chúng ta và sau đó hãy cấu hình nó để có + +88 +00:05:52,150 --> 00:05:56,110 +màu nền được đặt bằng hằng số của chúng ta như thế này. + +89 +00:05:56,870 --> 00:05:59,270 +Bây giờ màu nền giống nhau, + +90 +00:05:59,780 --> 00:06:04,780 +nhưng bây giờ chúng ta có một đường thẳng bao quanh canvas của chúng ta. + +91 +00:06:05,930 --> 00:06:08,510 +Nếu bạn nhớ từ các bài học trước, + +92 +00:06:08,870 --> 00:06:13,870 +tôi đã nói với bạn rằng bạn có thể đơn giản loại bỏ độ dày vùng + +93 +00:06:14,810 --> 00:06:18,920 +sáng và đặt nó về 0. Và về cơ bản điều đó chỉ thoát khỏi biên giới đó. + +94 +00:06:19,430 --> 00:06:24,430 +Vì vậy, bây giờ chúng tôi có một cửa sổ với thẻ flashcard của chúng tôi hiển thị và + +95 +00:06:25,580 --> 00:06:29,000 +hình ảnh có bóng mà tôi đã tạo trong illustrator để bạn có + +96 +00:06:29,270 --> 00:06:33,530 +thể xem nó như một thẻ 3D. Bây giờ, bên trong thẻ, chúng + +97 +00:06:33,560 --> 00:06:36,800 +ta không chỉ có một hình ảnh, mà chúng ta + +98 +00:06:37,100 --> 00:06:39,440 +còn muốn có một số văn bản. + +99 +00:06:39,770 --> 00:06:44,770 +Vì vậy, hãy tiếp tục và tạo một số văn bản. Và chúng ta có thể đặt văn bản để nói Tiêu đề. + +100 +00:06:46,820 --> 00:06:50,150 +Vì vậy, đây là phần đầu tiên của văn bản. Ngoài ra, tôi + +101 +00:06:50,180 --> 00:06:54,020 +sẽ đặt phông chữ thành một tuple sẽ sử dụng phông + +102 +00:06:54,050 --> 00:06:58,850 +chữ Arial, sau đó nó sẽ có kích thước 40 và cuối cùng tôi + +103 +00:06:59,060 --> 00:07:03,350 +sẽ đặt nó thành chữ nghiêng. Bây giờ, trước khi chúng ta có + +104 +00:07:03,380 --> 00:07:04,520 +thể nhấn run, + +105 +00:07:04,550 --> 00:07:09,140 +chúng ta cũng phải chỉ định vị trí X và Y cho văn bản của mình. + +106 +00:07:09,440 --> 00:07:13,190 +Vì vậy, hình ảnh của chúng ta đã được tạo ở 400 + +107 +00:07:13,190 --> 00:07:18,190 +X, 263 Y, văn bản của chúng ta sẽ được tạo ở 400 X và 150 Y. + +108 +00:07:19,700 --> 00:07:23,720 +Bây giờ hãy nhớ rằng các vị trí này là liên quan đến canvas. + +109 +00:07:24,020 --> 00:07:27,920 +Vì vậy, 400 làm cho nó một nửa dọc theo chiều rộng và sau + +110 +00:07:28,400 --> 00:07:32,510 +đó 150 này sẽ làm cho nó một chút về phía trên để đó là một + +111 +00:07:32,810 --> 00:07:36,470 +vị trí tốt cho tiêu đề. Tiếp theo, chúng ta sẽ + +112 +00:07:36,500 --> 00:07:38,900 +tạo một đoạn văn bản khác và đoạn + +113 +00:07:39,020 --> 00:07:44,020 +văn bản này sẽ là một từ thực tế, sao cho từ tiếng Pháp hoặc từ + +114 +00:07:44,210 --> 00:07:45,043 +tiếng Anh. + +115 +00:07:45,530 --> 00:07:49,580 +Vì vậy, chúng tôi sẽ đặt nó ở trung tâm của canvass của + +116 +00:07:49,910 --> 00:07:52,100 +chúng tôi sao cho chính xác trung + +117 +00:07:52,520 --> 00:07:57,520 +tâm của hình ảnh, và sau đó chúng tôi sẽ nói rằng văn bản sẽ giống + +118 +00:07:59,270 --> 00:08:01,820 +như từ bây giờ. Sau này có lẽ chúng tôi sẽ thay đổi nó. + +119 +00:08:02,240 --> 00:08:05,420 +Và sau đó phông chữ một lần nữa cũng là Arial. + +120 +00:08:06,680 --> 00:08:11,680 +Và lần này nó sẽ lớn hơn một chút và cũng sẽ đậm. Vì vậy, chúng tôi + +121 +00:08:12,110 --> 00:08:16,130 +đã có nó. Chúng tôi đã trình bày khá nhiều thẻ flashcard. + +122 +00:08:16,790 --> 00:08:21,080 +Bây giờ chúng ta chỉ cần thêm hai nút của chúng ta. Bên dưới canvas của chúng + +123 +00:08:21,110 --> 00:08:25,520 +tôi, tôi sẽ tạo hai nút. Đầu tiên, sẽ có một nút không xác định. + +124 +00:08:26,780 --> 00:08:29,750 +Đây sẽ là X mà người dùng nhấn vì họ không + +125 +00:08:29,780 --> 00:08:32,360 +biết có gì ở mặt sau của thẻ flashcard. + +126 +00:08:33,020 --> 00:08:37,250 +Và nút này sẽ có một thuộc tính đặc biệt, + +127 +00:08:37,610 --> 00:08:42,230 +thuộc tính hình ảnh và hình ảnh đó sẽ là một hình ảnh. + +128 +00:08:42,559 --> 00:08:45,290 +Vì vậy, hãy đặt nó là cross_image, và + +129 +00:08:45,890 --> 00:08:47,870 +nó sẽ là một hình ảnh + +130 +00:08:48,080 --> 00:08:50,960 +sẽ được tạo từ thư mục hình ảnh và + +131 +00:08:51,440 --> 00:08:54,650 +điều đó là sai. png. + +132 +00:08:55,830 --> 00:09:00,090 +Và hình ảnh đó là những gì sẽ đi vào bên trong nút không xác định của chúng ta. + +133 +00:09:00,840 --> 00:09:05,010 +Hãy tiếp tục và bố trí nút không xác định của chúng ta trên lưới để nó + +134 +00:09:05,010 --> 00:09:07,350 +thực sự hiển thị. Hàng sẽ là + +135 +00:09:07,350 --> 00:09:11,190 +1, vì vậy bên dưới canvas và cột sẽ là 0. + +136 +00:09:12,960 --> 00:09:16,500 +Vì vậy, bây giờ bạn có thể thấy nút X của chúng tôi hiển thị ở đây. + +137 +00:09:17,340 --> 00:09:22,050 +Tiếp theo, tôi sẽ tạo check_image. Đây sẽ là dấu kiểm. + +138 +00:09:22,650 --> 00:09:24,480 +Và trong trường hợp này, + +139 +00:09:24,510 --> 00:09:29,010 +một lần nữa, một hình ảnh được tạo từ một tệp nằm trong hình + +140 +00:09:29,010 --> 00:09:33,450 +ảnh của chúng tôi / bên phải. png. + +141 +00:09:34,110 --> 00:09:38,100 +Và tất nhiên, bạn luôn có thể chỉ cần nhấp đúp vào từng hình ảnh này và xem chúng + +142 +00:09:38,100 --> 00:09:41,190 +và chỉ cần đảm bảo rằng chúng là những hình bạn muốn sử dụng. + +143 +00:09:42,480 --> 00:09:46,020 +Vì vậy, khi chúng ta đã có hình ảnh của mình, chúng ta có thể tạo nút known_button của mình. + +144 +00:09:46,800 --> 00:09:51,800 +Và bây giờ sẽ có một thuộc tính hình ảnh được đặt thành hình ảnh kiểm tra này. + +145 +00:09:56,550 --> 00:10:01,380 +Và sau đó, chúng ta cũng có thể đặt nút đã biết của mình vào lưới. + +146 +00:10:01,620 --> 00:10:06,000 +Vì vậy, hàng = 1 và cột cũng sẽ bằng 1. + +147 +00:10:06,300 --> 00:10:08,550 +Vì vậy, nó nằm trên cùng một hàng với nút không xác định, + +148 +00:10:08,850 --> 00:10:12,630 +nhưng nó chỉ dịch chuyển một chút sang bên phải. Bây giờ tại thời điểm này nếu + +149 +00:10:12,630 --> 00:10:13,710 +tôi chạy mã, + +150 +00:10:13,740 --> 00:10:18,740 +bạn có thể thấy rằng nút kiểm tra của chúng tôi nằm ở phía bên phải trong khi canvas của + +151 +00:10:19,350 --> 00:10:22,650 +chúng tôi và nút chéo của chúng tôi ở cột bên trái nhất. + +152 +00:10:23,130 --> 00:10:25,980 +Vì vậy, bạn biết những gì bạn cần phải làm. Bạn phải + +153 +00:10:26,250 --> 00:10:31,200 +thay đổi lưới canvas này để có khoảng cột là 2. + +154 +00:10:31,590 --> 00:10:35,160 +Vì vậy, nó bắt đầu ở cột 0 nhưng kết thúc ở cột 1. + +155 +00:10:36,450 --> 00:10:37,620 +Bây giờ khi + +156 +00:10:37,620 --> 00:10:42,390 +bạn chạy nó, bạn có thể thấy nó được đặt độc đáo trên màn + +157 +00:10:42,390 --> 00:10:46,680 +hình theo cách chúng ta muốn. Bây giờ, nếu bạn muốn loại bỏ + +158 +00:10:47,040 --> 00:10:49,560 +đường viền xung quanh các nút, thì cách đơn giản + +159 +00:10:49,590 --> 00:10:52,440 +nhất là thay đổi lại độ dày vùng sáng thành 0. + +160 +00:10:52,920 --> 00:10:56,520 +Vì vậy, hãy thêm điều đó ở đây và ở đây. + +161 +00:10:57,900 --> 00:10:59,640 +Nhưng cả trên Mac và Windows, bạn + +162 +00:10:59,690 --> 00:11:04,690 +sẽ thấy đường nhỏ này xung quanh nút và không dễ dàng để loại bỏ nó bởi vì nó + +163 +00:11:04,920 --> 00:11:09,720 +là của chúng để bạn có thể nhấp vào nút và bạn có thể thấy vết lõm có + +164 +00:11:09,750 --> 00:11:11,190 +thể nhìn thấy này. + +165 +00:11:11,580 --> 00:11:16,080 +Bằng cách đó, nó cho phép người dùng biết rằng thao tác nhấn nút đã thực sự thành công. + +166 +00:11:17,280 --> 00:11:18,300 +Nhưng điều đó không sao cả. + +167 +00:11:18,720 --> 00:11:23,720 +Và bây giờ chúng tôi đã hoàn thành khá nhiều việc với giao diện người dùng của mình. Trong bước tiếp theo, chúng tôi sẽ loại + +168 +00:11:24,360 --> 00:11:28,830 +bỏ các trình giữ chỗ, tiêu đề và từ này, và chúng tôi sẽ bắt + +169 +00:11:28,830 --> 00:11:33,600 +đầu chọn các từ từ french_words này. csv, chọn ra các bản ghi ngẫu + +170 +00:11:33,900 --> 00:11:38,900 +nhiên như thế này hoặc thế này để chúng tôi có thể đặt từ tiếng Pháp + +171 +00:11:39,750 --> 00:11:43,620 +vào ngay tại đây và thay đổi tiêu đề để nói tiếng Pháp. + +172 +00:11:44,310 --> 00:11:48,600 +Đối với tất cả những điều đó và hơn thế nữa, hãy chuyển sang bài học tiếp theo và xem hướng dẫn. + diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/004 Step 2 - Create New Flash Cards.html b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/004 Step 2 - Create New Flash Cards.html new file mode 100644 index 0000000000000000000000000000000000000000..05d20b9d08e710fc2f3eb55d8fc2b17b8d1e752b --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/004 Step 2 - Create New Flash Cards.html @@ -0,0 +1 @@ +

1. Read the data from the french_words.csv file in the data folder.

2. Pick a random French word/translation and put the word into the flashcard. Every time you press the or buttons, it should generate a new random word to display. e.g.


HINT:

1. You'll need to use pandas to access the CSV file and generate a data frame. To get all the words/translation rows out as a list of dictionaries e.g. [{french_word: english_word}, {french_word2: english_word2}, {french_word3: english_word3}]

You could use:

DataFrame.to_dict(orient="records")

Documentation: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_dict.html

\ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/005 Solution & Walkthrough for Creating New Flash Cards.mp4 b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/005 Solution & Walkthrough for Creating New Flash Cards.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..350e6f86c9ca32edeb049166357ce4b16990409a --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/005 Solution & Walkthrough for Creating New Flash Cards.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e268a8d5d8a8c5b61b3a5b79200de0cf3291155a8dd5a8280a5bc62856796be9 +size 104740358 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/005 Solution & Walkthrough for Creating New Flash Cards_vi.srt b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/005 Solution & Walkthrough for Creating New Flash Cards_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e68b7a85e9d3b005ccb8c9f32d7dcdcaa454a102 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/005 Solution & Walkthrough for Creating New Flash Cards_vi.srt @@ -0,0 +1,460 @@ +1 +00:00:00,630 --> 00:00:02,430 +Bây giờ chúng ta đã tạo + +2 +00:00:02,640 --> 00:00:07,640 +xong giao diện người dùng, bước tiếp theo hoặc bước 2 là thử và làm cho các nút bắt đầu + +3 +00:00:09,750 --> 00:00:12,300 +hoạt động để khi chúng ta nhấn dấu thập hoặc + +4 +00:00:12,570 --> 00:00:16,650 +nút đánh dấu, chúng ta sẽ thấy một từ tiếng Pháp mới được hiển thị ở giữa + +5 +00:00:16,950 --> 00:00:21,750 +ở đây, và tiêu đề chuyển sang từ tiếng Pháp. Vì vậy, làm thế nào để chúng tôi làm điều này? + +6 +00:00:22,050 --> 00:00:24,930 +Trước tiên, đối với cả hai nút này, nút + +7 +00:00:24,960 --> 00:00:27,090 +chưa biết và nút đã + +8 +00:00:27,450 --> 00:00:32,450 +biết, chúng ta sẽ thêm một lệnh. Và hãy nhớ lệnh liên kết đến một + +9 +00:00:32,850 --> 00:00:35,220 +hàm cụ thể sẽ được gọi. + +10 +00:00:35,340 --> 00:00:40,340 +Vì vậy, chúng tôi sẽ gọi đó là next_card và chúng tôi sẽ thêm nó vào cả các nút đã biết + +11 +00:00:41,520 --> 00:00:42,510 +và chưa biết. + +12 +00:00:44,670 --> 00:00:47,430 +Bây giờ chúng ta đã thêm next_card + +13 +00:00:47,520 --> 00:00:51,540 +ở đây, bây giờ hãy tiếp tục và tạo hàm next_card này. + +14 +00:00:52,530 --> 00:00:55,770 +Chính xác thì chức năng này sẽ làm gì? Chà, nó sẽ + +15 +00:00:55,800 --> 00:01:00,630 +lấy các từ từ french_words. csv và nó sẽ + +16 +00:01:01,110 --> 00:01:06,110 +nắm được một số từ này và bản dịch của chúng. + +17 +00:01:06,840 --> 00:01:07,680 +Vì vậy, về + +18 +00:01:07,890 --> 00:01:11,760 +cơ bản, bạn có thể tưởng tượng đây là những hàng đơn lẻ mà chúng ta muốn nắm bắt. + +19 +00:01:12,690 --> 00:01:14,610 +Bây giờ, điều chúng ta cần + +20 +00:01:14,610 --> 00:01:19,610 +làm trước tiên là chúng ta cần sử dụng gấu trúc để đọc từ CSV đó. + +21 +00:01:20,430 --> 00:01:25,430 +Vì vậy, trước tiên chúng ta sẽ nhập gấu trúc và nó đã được cài đặt sẵn + +22 +00:01:25,920 --> 00:01:28,950 +trong dự án của bạn. Nếu không, bạn sẽ thấy một bóng đèn + +23 +00:01:29,010 --> 00:01:32,400 +màu đỏ và sau đó bạn có thể chỉ cần nhấp vào nó và sau đó cài đặt mô-đun đó. + +24 +00:01:33,000 --> 00:01:34,890 +Tuy nhiên, khi chúng tôi đã bật pandas, chúng tôi + +25 +00:01:34,920 --> 00:01:39,920 +sẽ sử dụng panders để đọc từ CSV và CSV là french_words của chúng tôi. csv từ + +26 +00:01:43,110 --> 00:01:45,810 +thư mục dữ liệu. + +27 +00:01:46,590 --> 00:01:49,650 +Bây giờ chúng ta sẽ đặt giá trị này bằng với dữ liệu. + +28 +00:01:50,070 --> 00:01:54,240 +Vì vậy, đây sẽ là một khung dữ liệu. Và trên thực tế, nếu tôi tiếp tục + +29 +00:01:54,240 --> 00:01:55,860 +và in nó 1: bây giờ + +30 +00:01:55,880 --> 00:01:56,713 +là 0: + +31 +00:02:00,410 --> 00:02:05,410 +bạn có thể thấy rằng gấu trúc sẽ định dạng bảng của chúng tôi một cách độc đáo + +32 +00:02:07,010 --> 00:02:09,050 +với các tiêu đề cột và cũng + +33 +00:02:09,380 --> 00:02:14,120 +ghi lại số và mỗi hàng này về cơ bản là các phần dữ liệu mà chúng + +34 +00:02:14,120 --> 00:02:16,910 +tôi quan tâm. Trong. Bây giờ chúng ta đã có + +35 +00:02:17,030 --> 00:02:20,750 +một khung dữ liệu, chúng ta có thể chuyển đổi khung dữ liệu đó thành một từ điển. + +36 +00:02:21,290 --> 00:02:25,310 +Hãy tiếp tục và tạo một từ điển mà chúng ta sẽ gọi là + +37 +00:02:25,580 --> 00:02:27,710 +to_learn, vì vậy đó là từ mà chúng + +38 +00:02:28,220 --> 00:02:32,630 +ta cần học và đây sẽ là một từ điển được tạo từ dữ liệu + +39 +00:02:32,900 --> 00:02:37,430 +này từ french_words này. csv. Nhưng hãy để ý xem + +40 +00:02:37,430 --> 00:02:41,570 +tại thời điểm hiện tại, nếu chúng ta chỉ sử dụng phương pháp mặc + +41 +00:02:42,170 --> 00:02:46,430 +định để tạo từ điển, thì to_learn của chúng ta sẽ trông như thế này. + +42 +00:02:46,670 --> 00:02:49,580 +Chúng ta có tiếng Pháp và bên trong chúng ta + +43 +00:02:49,610 --> 00:02:54,140 +có tất cả các từ tiếng Pháp và sau đó chúng ta có một chiếc chìa khóa sau + +44 +00:02:54,260 --> 00:02:58,010 +này được gọi là tiếng Anh và tất cả các từ tiếng Anh tương ứng. + +45 +00:02:58,490 --> 00:03:03,250 +Bây giờ, đó là những gì chúng tôi muốn. Thay vào đó, chúng ta muốn thay đổi một trong các tham số + +46 +00:03:03,310 --> 00:03:04,480 +được định hướng, vậy chúng + +47 +00:03:04,810 --> 00:03:09,810 +ta muốn định hướng bảng để tạo từ điển này như thế nào? Bây giờ trong gợi ý cho bước 2, tôi + +48 +00:03:11,200 --> 00:03:14,620 +đã cho bạn thấy rằng bạn có thể sử dụng bộ định hướng + +49 +00:03:14,620 --> 00:03:19,620 +này để ghi và bằng cách này, nó sẽ cung cấp cho bạn các giá trị của mỗi cột + +50 +00:03:21,670 --> 00:03:24,490 +dưới dạng danh sách. Hãy để tôi cho bạn thấy nó trông như thế nào. + +51 +00:03:24,820 --> 00:03:27,640 +Vì vậy, hãy thay đổi hướng tham số này và + +52 +00:03:27,970 --> 00:03:30,820 +chúng ta sẽ đặt nó bằng với các bản ghi chuỗi. + +53 +00:03:31,870 --> 00:03:33,700 +Hãy nhớ rằng có một 's' ở cuối. + +54 +00:03:34,720 --> 00:03:39,040 +Và bây giờ chúng ta có thể so sánh phiên bản trước của + +55 +00:03:39,040 --> 00:03:43,330 +từ điển được tạo từ dữ liệu với phiên bản mới. + +56 +00:03:43,360 --> 00:03:48,070 +Vì vậy, hãy để tôi chạy lại mã và bạn có thể thấy bây giờ về cơ bản chúng + +57 +00:03:48,070 --> 00:03:52,390 +ta đã có một danh sách các từ điển và mỗi từ điển có một từ khóa, + +58 +00:03:52,750 --> 00:03:54,880 +tiếng Pháp, từ tiếng Pháp, một từ khóa + +59 +00:03:54,940 --> 00:03:59,830 +tiếng Anh và sau đó là từ tiếng Anh, v.v. Điều này thực sự, thực sự hữu ích cho + +60 +00:03:59,830 --> 00:04:04,830 +chúng tôi vì về cơ bản chúng tôi có thể chọn một mục nhập ngẫu nhiên từ danh sách + +61 +00:04:05,800 --> 00:04:10,390 +này và chúng tôi sẽ có thể khai thác giá trị tiếng Pháp và giá trị tiếng + +62 +00:04:10,390 --> 00:04:15,190 +Anh sau này khi chúng tôi lật thẻ. Đó là từ điển to_learn của chúng tôi đã hoàn thành. + +63 +00:04:15,760 --> 00:04:18,040 +Vì vậy, khi hàm next_card được + +64 +00:04:18,519 --> 00:04:23,320 +gọi, thì chúng ta sẽ cần chọn một số dữ liệu từ từ điển này và + +65 +00:04:23,320 --> 00:04:25,690 +cách chúng ta chọn nó là ngẫu nhiên. + +66 +00:04:25,720 --> 00:04:30,640 +Vì vậy, chúng tôi sẽ nhập mô-đun ngẫu nhiên và chúng tôi sẽ sử dụng ngẫu nhiên. + +67 +00:04:30,640 --> 00:04:35,640 +lựa chọn để chọn ra một mục ngẫu nhiên từ danh sách các từ cần học này. + +68 +00:04:38,650 --> 00:04:43,120 +Và khi chúng ta có một lựa chọn ngẫu nhiên mà chúng ta sẽ gọi + +69 +00:04:44,200 --> 00:04:49,200 +là current_card, thì chúng ta có thể nắm giữ dữ liệu từ current_card này bằng cách + +70 +00:04:51,070 --> 00:04:55,510 +nói current_card [tiếng Pháp]. Hãy nhớ điều đó trong french_words này. csv chúng ta + +71 +00:04:55,510 --> 00:04:58,540 +có chữ F viết hoa và chữ E. + +72 +00:04:58,570 --> 00:05:01,450 +Vì vậy, các khóa của chúng tôi phải khớp chính xác. + +73 +00:05:02,140 --> 00:05:04,660 +Vì vậy, hãy tiếp tục và in cái này + +74 +00:05:04,960 --> 00:05:09,960 +đi và bạn có thể thấy bây giờ khi tôi nhấn vào một trong những nút này, + +75 +00:05:11,200 --> 00:05:13,060 +dấu thập hoặc dấu tích, nó + +76 +00:05:13,300 --> 00:05:18,300 +sẽ chọn ra một từ tiếng Pháp ngẫu nhiên từ danh sách các từ của tôi + +77 +00:05:18,550 --> 00:05:22,390 +trong french_words này. csv. Vì vậy, bây giờ thay + +78 +00:05:22,810 --> 00:05:26,950 +vì in nó, hãy tiếp tục và đặt nó vào các phần văn bản này trên canvas của chúng tôi. + +79 +00:05:27,670 --> 00:05:28,690 +Để làm + +80 +00:05:28,750 --> 00:05:33,750 +điều đó, tôi sẽ tạo một biến có tên là card_title để + +81 +00:05:37,300 --> 00:05:41,680 +giữ tiêu đề và thẻ_word để giữ văn bản từ. + +82 +00:05:42,340 --> 00:05:47,020 +Và bây giờ tôi có thể tiếp tục và nhấn vào canvas của mình và + +83 +00:05:47,620 --> 00:05:52,390 +nói itemconfig và mục mà chúng tôi muốn định cấu hình trước hết là card_title + +84 +00:05:52,420 --> 00:05:53,830 +của chúng tôi và + +85 +00:05:54,460 --> 00:05:59,460 +điều chúng tôi muốn cấu hình về nó là thay đổi văn bản thành nói tiếng Pháp. + +86 +00:06:00,680 --> 00:06:04,670 +Vì vậy, đó là tiêu đề ghi nhớ, đó là phần ở đây. + +87 +00:06:05,360 --> 00:06:12,830 +Và sau đó chúng ta sẽ làm điều tương tự bằng cách sử dụng canvas. + +88 +00:06:13,820 --> 00:06:22,900 +itemconfig. + +89 +00:06:25,130 --> 00:06:27,620 +Vì vậy, bây giờ khi tôi nhấn run lần nữa, + +90 +00:06:27,830 --> 00:06:30,440 +bạn có thể thấy rằng khi tôi nhấn một trong hai + +91 +00:06:30,770 --> 00:06:34,610 +nút này, tôi sẽ nhận được một từ tiếng Pháp ngẫu nhiên hiển thị ngay tại đây. + +92 +00:06:36,020 --> 00:06:39,050 +Nhưng hãy để ý xem khi tôi chạy ứng dụng lần + +93 +00:06:39,110 --> 00:06:43,850 +đầu, bạn có thể thấy rằng nó vẫn có tiêu đề trình giữ chỗ và từ hiển thị. + +94 +00:06:44,330 --> 00:06:47,930 +Thay vào đó, chúng tôi muốn nó hiển thị thẻ tiếp theo. + +95 +00:06:48,290 --> 00:06:52,220 +Vì vậy, chúng ta phải gọi hàm này khi chúng ta đã tạo tất cả giao diện người dùng của mình nhưng trước + +96 +00:06:52,490 --> 00:06:54,410 +khi chúng ta đi đến vòng lặp chính của mình. + +97 +00:06:54,890 --> 00:06:59,300 +Vì vậy, chúng tôi sẽ gọi thẻ tiếp theo của chúng tôi. Và theo cách này, khi chúng tôi đã tạo + +98 +00:06:59,300 --> 00:07:03,200 +tất cả hình ảnh của mình và mọi thứ khác, sau đó chúng tôi có thể + +99 +00:07:03,440 --> 00:07:05,540 +tạo thẻ tiếp theo, lấy dữ liệu + +100 +00:07:05,570 --> 00:07:10,310 +và đặt nó vào tiêu đề thẻ và từ thẻ. Vì vậy, nếu muốn, bạn thực sự + +101 +00:07:10,310 --> 00:07:11,000 +có + +102 +00:07:11,000 --> 00:07:15,020 +thể xóa hai đoạn văn bản này vì chúng sẽ không thực + +103 +00:07:15,020 --> 00:07:19,670 +sự làm được gì vào lúc này. Và bây giờ ngay sau khi chúng tôi nhấn + +104 +00:07:19,700 --> 00:07:23,660 +run, bạn có thể thấy điều đầu tiên chúng tôi thấy đã là một từ tiếng Pháp và + +105 +00:07:23,810 --> 00:07:27,860 +nó sẽ tiếp tục đi qua tất cả các từ mà chúng tôi có trong CSV của mình. + +106 +00:07:28,850 --> 00:07:32,540 +Đây là bạn có nó. Bây giờ chúng tôi đã quản lý + +107 +00:07:32,930 --> 00:07:37,930 +để đọc từ CSV, lấy từ điển của tất cả các bản ghi trong CSV và lấy ngẫu nhiên từ tiếng + +108 +00:07:38,300 --> 00:07:43,010 +Pháp hiển thị trong thẻ flashcard của chúng tôi. Flashcard của chúng tôi hiện tại, + +109 +00:07:43,010 --> 00:07:46,370 +không thực sự flash. Nó không thay đổi, phải không? + +110 +00:07:46,640 --> 00:07:49,910 +Chúng tôi cần một cách để chúng tôi có thể đặt một số loại bộ + +111 +00:07:50,240 --> 00:07:51,740 +đếm thời gian, nói bộ hẹn + +112 +00:07:52,040 --> 00:07:57,040 +giờ 3 giây, sau đó để thẻ của chúng tôi hiển thị cho chúng tôi mặt đối diện hoặc mặt sau và hiển + +113 +00:07:57,650 --> 00:08:00,230 +thị cho chúng tôi bản dịch tiếng Anh của các từ. + +114 +00:08:00,890 --> 00:08:03,260 +Đó là những gì chúng ta sẽ giải quyết trong bài học tiếp theo. + +115 +00:08:03,500 --> 00:08:06,920 +Vì vậy, hãy chuyển sang bước 3 và đọc các hướng dẫn. + diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/006 Step 3 - Flip the Cards!.html b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/006 Step 3 - Flip the Cards!.html new file mode 100644 index 0000000000000000000000000000000000000000..d168617d77e0ec1576fdfc9eaa4fd852e33b3676 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/006 Step 3 - Flip the Cards!.html @@ -0,0 +1,5 @@ +

1. After a delay of 3s (3000ms), the card should flip and display the English translation for the current word.

2. The card image should change to the card_back.png and the text colour should change to white. The title of the card should change to "English" from "French".

e.g.


HINTS:

1. To change the canvas image, you'll need a reference to the image, like what you have with the text created in the canvas. Then you can set the image attribute using itemconfig(). e.g.

new_image = PhotoImage(file="new_image.png")
+old_image = PhotoImage(file="old_image.png")
+canvas_image = canvas.create_image(300, 300, image=old_image)
+#To change the image:
+canvas.itemconfig(canvas_image, image=new_image)

IMPORTANT: PhotoImage objects should not be created inside a function. Otherwise, it will not work.

2. To change the color of the text in a canvas element, use the fill parameter. e.g. https://stackoverflow.com/questions/41030973/how-can-i-change-the-color-of-text-in-tkinter

3. Remember in the mainloop() you should not create additional delayed loops e.g. with time.sleep() but instead, use window.after() e.g. Tkinter Reference Manual: .after() method

4. You can cancel a window.after() loop using window.after_cancel() e.g. Tkinter Reference Manual: .after_cancel() method

\ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/007 Solution & Walkthrough for Flipping Cards.mp4 b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/007 Solution & Walkthrough for Flipping Cards.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4e6e2f8d8912c5e93e570197307ab65812944ac8 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/007 Solution & Walkthrough for Flipping Cards.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3173da6ff4e6de028d9191f518c3f57557c5b635a200a1a6db9bfa4e80e0105 +size 112173515 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/007 Solution & Walkthrough for Flipping Cards_vi.srt b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/007 Solution & Walkthrough for Flipping Cards_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..debe2e678690baee1516f1e19e389d412fb98abe --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/007 Solution & Walkthrough for Flipping Cards_vi.srt @@ -0,0 +1,528 @@ +1 +00:00:00,450 --> 00:00:03,750 +Bây giờ chúng tôi đã có các từ của chúng tôi hiển thị bằng + +2 +00:00:04,110 --> 00:00:09,110 +tiếng Pháp, đã đến lúc xem mặt kia của thẻ và xem phần tương đương tiếng Anh để chúng tôi có thể + +3 +00:00:09,240 --> 00:00:12,420 +kiểm tra kiến thức của mình. Để làm được điều + +4 +00:00:12,480 --> 00:00:17,480 +này, chúng tôi sẽ phải thực hiện một số cách thay đổi thẻ này sau một + +5 +00:00:18,660 --> 00:00:22,110 +khoảng thời gian nhất định. Vì vậy, chúng tôi sẽ lật thẻ + +6 +00:00:22,290 --> 00:00:25,110 +sau khi hết ba giây. Để làm điều đó, chúng + +7 +00:00:25,170 --> 00:00:28,470 +ta sẽ sử dụng cửa sổ. sau khi phương pháp. + +8 +00:00:29,040 --> 00:00:32,310 +Ngay sau đây, nơi chúng ta đã tạo một cửa sổ, chúng ta sẽ + +9 +00:00:32,610 --> 00:00:34,620 +nói đến cửa sổ. sau. + +10 +00:00:35,130 --> 00:00:38,340 +Và sau đó chúng ta có thể chỉ định lượng thời gian tính bằng mili giây. + +11 +00:00:38,400 --> 00:00:41,790 +Vì vậy, tôi sẽ nói ba giây hoặc 3000 mili giây. + +12 +00:00:42,450 --> 00:00:45,360 +Và sau đó, hàm mà chúng ta sẽ gọi là + +13 +00:00:45,360 --> 00:00:49,530 +một hàm sẽ được gọi là flip_card. Và nếu chúng ta muốn nó hoạt động, thì chúng + +14 +00:00:49,560 --> 00:00:52,680 +ta sẽ phải tạo ra nó. Vì vậy, tôi sẽ tạo ngay tại đây, + +15 +00:00:52,710 --> 00:00:53,543 +ngay phía trên. + +16 +00:00:53,850 --> 00:00:58,850 +Vì vậy, tôi sẽ gọi nó là flip_card và hàm này sẽ xử lý việc + +17 +00:00:59,520 --> 00:01:03,630 +thay đổi thẻ để hiển thị từ tiếng Anh cho thẻ + +18 +00:01:04,050 --> 00:01:08,550 +hiện tại và cũng sẽ thay đổi hình ảnh từ card_front thành card_back, + +19 +00:01:08,550 --> 00:01:12,930 +và chúng tôi cũng sẽ thay đổi cả màu sắc của văn bản. + +20 +00:01:13,620 --> 00:01:14,790 +Trong thẻ lật của chúng tôi, + +21 +00:01:14,820 --> 00:01:19,350 +chúng tôi sẽ nắm giữ canvas và chúng tôi sẽ đến mục đầu tiên. cấu hình + +22 +00:01:19,380 --> 00:01:24,270 +tiêu đề thẻ. Vì vậy, chúng tôi sẽ thay đổi + +23 +00:01:24,270 --> 00:01:26,790 +card_title thành, thay vì nói tiếng Pháp, chúng tôi + +24 +00:01:26,790 --> 00:01:29,340 +sẽ nói, tốt, đây bây giờ là bản dịch + +25 +00:01:30,030 --> 00:01:33,180 +tiếng Anh, sau đó chúng tôi sẽ định cấu hình từ + +26 +00:01:33,750 --> 00:01:36,960 +thẻ, và đây sẽ là vẫn từ thẻ hiện tại, nhưng thay + +27 +00:01:37,260 --> 00:01:40,770 +vào đó chúng tôi muốn nhận được giá trị theo khóa tiếng Anh. + +28 +00:01:41,400 --> 00:01:46,320 +Hiện tại, thẻ hiện tại này đang bị khóa bên trong next_card. + +29 +00:01:46,590 --> 00:01:51,590 +Vì vậy, chúng tôi thực sự không thể nắm bắt được nó nếu không tạo ra một lựa chọn ngẫu nhiên mới. + +30 +00:01:52,650 --> 00:01:56,340 +Vì vậy, những gì chúng tôi có thể làm là chúng tôi có thể tạo thẻ hiện tại + +31 +00:01:58,680 --> 00:02:01,680 +của mình và chúng tôi có thể đặt nó thành một từ điển trống. + +32 +00:02:02,280 --> 00:02:07,280 +Và sau đó, chúng tôi có thể thay đổi thẻ này thành toàn cầu và nhấn vào thẻ hiện tại đó để sửa + +33 +00:02:08,880 --> 00:02:13,880 +đổi thẻ và lưu lựa chọn ngẫu nhiên này từ danh sách các cặp tiếng Pháp và tiếng Anh của chúng tôi. + +34 +00:02:15,720 --> 00:02:17,760 +Vì vậy, khi chúng ta đã có + +35 +00:02:17,760 --> 00:02:22,500 +nó bên trong đó, sau đó chúng ta có thể nhấn vào nó bên trong flip_card và chúng ta có + +36 +00:02:22,710 --> 00:02:26,370 +thể nói rằng thẻ hiện tại được giữ nguyên giá trị theo khóa tiếng Anh. + +37 +00:02:27,270 --> 00:02:32,220 +Và bằng cách đó, chúng tôi cập nhật văn bản của cả hai. Vì vậy, ngay bây giờ nếu tôi nhấn run, + +38 +00:02:32,250 --> 00:02:35,310 +bạn có thể thấy rằng ngay lập tức sau ba giây, + +39 +00:02:35,640 --> 00:02:40,110 +chúng tôi chuyển sang phía đối diện và chúng tôi có tiếng Anh và từ tương đương + +40 +00:02:40,140 --> 00:02:44,970 +tiếng Anh của cùng một từ hiển thị. Vì vậy, ví dụ, trong tiếng Pháp + +41 +00:02:44,970 --> 00:02:47,940 +matin, trong tiếng Anh có nghĩa là buổi sáng. + +42 +00:02:48,120 --> 00:02:51,900 +Vì vậy, đó là cách chúng tôi có thể xác minh rằng chúng tôi thực sự biết ý nghĩa của thẻ. + +43 +00:02:52,710 --> 00:02:57,450 +Ngoài việc thay đổi từ ngữ, tôi cũng sẽ thay đổi hình ảnh. + +44 +00:02:57,750 --> 00:03:01,000 +Vì vậy, hãy chú ý cách chúng tôi lưu các từ với một biến. + +45 +00:03:01,240 --> 00:03:04,330 +Chúng ta có thể làm điều tương tự đối với phương thức tạo ảnh này. + +46 +00:03:04,810 --> 00:03:09,810 +Có thể nói card_background giống như canvas tạo ảnh. + +47 +00:03:10,390 --> 00:03:14,140 +Và ngoài cách tạo hình mặt trước thẻ, chúng ta cũng + +48 +00:03:14,350 --> 00:03:17,170 +có thể tạo hình ảnh mặt sau thẻ. + +49 +00:03:17,800 --> 00:03:20,350 +Bây giờ, bạn phải thực sự cẩn + +50 +00:03:20,380 --> 00:03:23,440 +thận ở đây vì nếu bạn tạo hình ảnh mặt + +51 +00:03:23,740 --> 00:03:27,310 +sau thẻ này là hình ảnh được tạo từ tệp, nếu + +52 +00:03:27,730 --> 00:03:31,960 +bạn tạo nó bên trong một trong các hàm này, vào cuối lệnh gọi + +53 +00:03:31,960 --> 00:03:35,680 +hàm, tham chiếu đến hình ảnh cụ thể đó sẽ biến mất. + +54 +00:03:35,980 --> 00:03:40,980 +Và nó sẽ không hoạt động nếu bạn tạo hình ảnh này bên trong thẻ lật và cố + +55 +00:03:41,380 --> 00:03:45,940 +gắng đặt nó bên trong phương pháp này. Vì vậy, bạn phải tạo nó bên ngoài bất kỳ chức năng nào. + +56 +00:03:46,630 --> 00:03:51,630 +Vì vậy, hãy thay đổi tệp thành hình ảnh / card_back. png và bây giờ + +57 +00:03:53,830 --> 00:03:58,300 +chúng ta sẽ lấy lại canvas của mình, + +58 +00:03:58,300 --> 00:03:59,890 +gọi itemconfig. + +59 +00:04:00,400 --> 00:04:03,310 +Và lần này chúng ta đang định cấu hình card_background. + +60 +00:04:04,000 --> 00:04:08,350 +Và thuộc tính mà chúng ta muốn cấu hình là thuộc tính hình ảnh. + +61 +00:04:08,860 --> 00:04:12,670 +Vì vậy, chúng tôi sẽ thay đổi điều đó thành card_back_img mà chúng + +62 +00:04:12,700 --> 00:04:14,770 +tôi đã tạo ngay tại đây. + +63 +00:04:15,910 --> 00:04:17,769 +Vì vậy, bây giờ chúng ta chỉ cần kiểm tra lại. + +64 +00:04:18,250 --> 00:04:21,490 +Hãy đợi ba giây và sau đó nó được thay đổi ở + +65 +00:04:21,519 --> 00:04:24,370 +mặt sau của thẻ. Ở mặt sau của + +66 +00:04:24,400 --> 00:04:28,840 +thẻ, chúng tôi muốn hai đoạn văn bản này thực sự có màu khác nhau. + +67 +00:04:28,870 --> 00:04:32,380 +Chúng tôi muốn nó có màu trắng, chỉ để nó nổi bật so với nền. + +68 +00:04:33,040 --> 00:04:37,000 +Và để làm điều đó, chúng tôi có thể thêm nó cùng với cấu hình mục của chúng tôi. + +69 +00:04:37,300 --> 00:04:39,100 +Chúng tôi không chỉ thay đổi + +70 +00:04:39,370 --> 00:04:43,090 +văn bản mà còn thay đổi màu tô của văn bản thành màu trắng. + +71 +00:04:44,310 --> 00:04:45,143 +Được chứ. + +72 +00:04:47,550 --> 00:04:50,670 +0: Và bây giờ khi lật thẻ của chúng tôi, bạn + +73 +00:04:50,940 --> 00:04:54,390 +có thể thấy thẻ màu xanh lá cây với dòng chữ màu trắng. + +74 +00:04:55,770 --> 00:04:56,100 +Bây + +75 +00:04:56,100 --> 00:05:01,100 +giờ, một trong những điều chúng ta phải làm là mỗi khi chúng ta nhấp vào một trong những nút + +76 +00:05:01,980 --> 00:05:05,040 +này, nó sẽ lật trở lại mặt trước của thẻ, phải không? + +77 +00:05:05,040 --> 00:05:09,330 +Có nghĩa là thay đổi màu văn bản và thay đổi hình ảnh nền đó. + +78 +00:05:09,840 --> 00:05:13,200 +Vì vậy, điều đó xảy ra khi chúng ta chuyển sang thẻ tiếp theo. + +79 +00:05:13,680 --> 00:05:17,730 +Vì vậy, ngoài việc cấu hình văn bản và các từ, + +80 +00:05:18,000 --> 00:05:23,000 +chúng ta cũng phải cấu hình lại itemconfig của card_background để chúng ta có + +81 +00:05:23,400 --> 00:05:28,170 +thể thay đổi hình ảnh trở lại hình ảnh mặt trước của thẻ. + +82 +00:05:28,890 --> 00:05:33,540 +Ngoài ra, chúng ta phải thay đổi những màu văn bản này để có một màu tô khác, vì + +83 +00:05:33,780 --> 00:05:36,360 +vậy chúng ta sẽ đổi nó trở lại màu đen. + +84 +00:05:39,450 --> 00:05:39,750 +Đúng. + +85 +00:05:39,750 --> 00:05:43,650 +0: Theo cách này, khi lật thẻ, nó chuyển sang màu xanh lá cây, màu + +86 +00:05:43,980 --> 00:05:47,040 +trắng trên màu xanh lục. Và sau đó khi chúng ta đi đến + +87 +00:05:47,130 --> 00:05:49,200 +mặt trước của thẻ, nó sẽ chuyển sang màu đen trên nền trắng. + +88 +00:05:50,670 --> 00:05:53,490 +Bây giờ hãy để ý xem khi chúng ta chuyển đến thẻ + +89 +00:05:53,790 --> 00:05:58,790 +tiếp theo, cơ chế lật thẻ đó đã hoạt động như thế nào vì chúng ta chỉ gọi cửa sổ này + +90 +00:05:59,150 --> 00:06:01,700 +sau lần đầu tiên chúng ta tạo cửa sổ. + +91 +00:06:02,270 --> 00:06:05,900 +Vì vậy, chúng tôi thực sự cần điều này xảy ra một vài lần. Trên thực tế, chúng ta cần + +92 +00:06:05,900 --> 00:06:09,590 +nó xảy ra mỗi khi chúng ta chuyển sang lá bài tiếp theo. + +93 +00:06:10,070 --> 00:06:12,950 +Vì vậy, sau khi chúng tôi đã định cấu hình tất cả những thứ trên thẻ + +94 +00:06:13,010 --> 00:06:16,760 +của mình, chúng tôi sẽ gọi một cửa sổ. sau ba giây, thẻ lật. + +95 +00:06:17,240 --> 00:06:21,710 +Vì vậy, theo cách này, ngay cả khi chúng ta chuyển đến lá bài tiếp theo và chúng ta đợi ba + +96 +00:06:21,830 --> 00:06:23,990 +giây, nó một lần nữa trở lại mặt sau. + +97 +00:06:24,950 --> 00:06:29,570 +Bây giờ một trong những lỗi bạn có thể gặp phải là nếu bạn nhấp vào + +98 +00:06:29,600 --> 00:06:33,440 +nút này nhiều lần và bạn lướt qua nhiều từ khác nhau, bạn + +99 +00:06:33,740 --> 00:06:37,130 +sẽ thấy ngay lập tức, thẻ đó thực sự bị lật. + +100 +00:06:37,700 --> 00:06:41,690 +Và đó là bởi vì cửa sổ đó. sau ba giây là đếm ngược trong + +101 +00:06:41,690 --> 00:06:45,350 +nền, chờ đợi, chờ đợi, đợi cho đến khi ba giây tại thời + +102 +00:06:45,590 --> 00:06:47,300 +điểm đó nó sẽ lật thẻ. + +103 +00:06:47,690 --> 00:06:52,310 +Nó không quan tâm rằng bạn thực sự vừa chuyển sang một thẻ mới và bạn + +104 +00:06:52,310 --> 00:06:56,900 +muốn đợi một lần nữa, ba giây. Để điều này hoạt động, chúng + +105 +00:06:57,080 --> 00:07:02,080 +ta thực sự phải cung cấp cho dòng mã này một biến để chúng + +106 +00:07:02,720 --> 00:07:06,710 +ta gọi nó là flip_timer. Và đây bây giờ là một toàn + +107 +00:07:06,890 --> 00:07:11,890 +cầu mà chúng ta có thể khai thác và chúng ta có thể thêm nó sau dấu phẩy + +108 +00:07:13,430 --> 00:07:15,890 +ở đây, flip_timer. Ngoài ra, bạn + +109 +00:07:15,890 --> 00:07:19,730 +cũng có thể chuyển sang một dòng mới và nói flip_timer toàn cầu. + +110 +00:07:20,060 --> 00:07:23,450 +Nó không thực sự tạo ra sự khác biệt ngoài thực tế là điều + +111 +00:07:23,690 --> 00:07:27,920 +này có thể tốn ít dòng mã hơn. Bây giờ, khi chúng tôi đã có quyền truy cập vào + +112 +00:07:28,190 --> 00:07:31,580 +flip_timer của mình, chúng tôi có thể nói rằng mỗi khi chúng tôi chuyển đến một thẻ mới, + +113 +00:07:32,180 --> 00:07:36,350 +khi chúng tôi nhấp vào một trong các nút này, chúng tôi sẽ làm mất hiệu lực bộ đếm thời gian này. + +114 +00:07:36,890 --> 00:07:39,140 +Vì vậy, chúng ta có thể nói cửa sổ. after_ hủy + +115 +00:07:39,170 --> 00:07:43,550 +bỏ và sau đó chuyển ID của flip_timer của chúng tôi. + +116 +00:07:44,300 --> 00:07:46,670 +Và sau khi chúng tôi thiết lập thẻ + +117 +00:07:46,760 --> 00:07:51,760 +này, chúng tôi có thể thiết lập một flip_timer mới để nó đợi ba giây một lần nữa. + +118 +00:07:53,270 --> 00:07:57,260 +Và bây giờ khi tôi đã thêm đoạn mã đó, nó sẽ sửa được lỗi này. + +119 +00:07:57,650 --> 00:08:02,650 +Vì vậy, bây giờ bất cứ khi nào tôi tiếp tục hoặc tôi nhấn vào séc hoặc dấu thập, điều đó không thực + +120 +00:08:03,170 --> 00:08:04,040 +sự quan trọng. + +121 +00:08:04,040 --> 00:08:09,040 +Nó sẽ không lật cho đến khi tôi hạ cánh trên một thẻ và đợi ba giây + +122 +00:08:09,620 --> 00:08:13,760 +trước khi nó lật. Đây là bạn có nó. Chúng tôi đã + +123 +00:08:13,790 --> 00:08:16,940 +thêm công nghệ lật thẻ vào mã của mình. + +124 +00:08:17,660 --> 00:08:22,430 +Bây giờ tất cả những gì còn lại là loại bỏ các thẻ mà người + +125 +00:08:22,430 --> 00:08:23,263 +dùng nói + +126 +00:08:23,570 --> 00:08:28,570 +rằng họ biết và tạo một CSV mới sẽ chứa tất cả các thẻ từ từ + +127 +00:08:30,440 --> 00:08:34,700 +điển to_learn này và xóa các thẻ mà người dùng nói rằng họ biết. + +128 +00:08:35,240 --> 00:08:38,480 +Và theo cách đó, lần sau khi chúng tôi chạy ứng dụng + +129 +00:08:38,720 --> 00:08:43,610 +của mình, ứng dụng sẽ ghi nhớ những từ chúng tôi đã học và những từ nào chúng tôi + +130 +00:08:43,610 --> 00:08:47,120 +chưa học để chúng tôi chỉ tải lên những từ chúng tôi chưa học. + +131 +00:08:47,870 --> 00:08:52,370 +Vì vậy, hãy chuyển sang bài học tiếp theo, nơi chúng ta đã có bước cuối cùng + +132 +00:08:52,370 --> 00:08:53,510 +của dự án flashcard. + diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/008 Step 4 - Save Your Progress.html b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/008 Step 4 - Save Your Progress.html new file mode 100644 index 0000000000000000000000000000000000000000..b387e96f046ddaebbedf13be2f240df7bdd820e5 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/008 Step 4 - Save Your Progress.html @@ -0,0 +1,4 @@ +

1. When the user presses on the button, it means that they know the current word on the flashcard and that word should be removed from the list of words that might come up.

e.g. If french_words.csv had only 3 records:

chaque,each
+parl,speak
+arriv,come

After the user has seen parl,speak  it should be removed from the list of words that can come up again.

2. The updated data should be saved to a new file called words_to_learn.csv

e.g. words_to_learn.csv

chaque,each
+arriv,come

3. The next time the program is run, it should check if there is a words_to_learn.csv file. If it exists, the program should use those words to put on the flashcards. If the words_to_learn.csv does not exist (i.e., the first time the program is run), then it should use the words in the french_words.csv

We want our flashcard program to only test us on things we don't know. So if the user presses the button, that means the current card should not come up again.

e.g.

HINTS:

1. The remove() method can remove elements from a list. e.g. https://www.w3schools.com/python/ref_list_remove.asp

2. You can create a new csv file from a dictionary using DataFrame.to_csv() e.g. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

3. If you don't want to create an index for the new csv, you can set the index parameter to False. e.g.

data.to_csv("filename.csv", index=False)

\ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Course-Fixes-Report-an-Issue.url b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution & Walkthrough for Saving Progress.mp4 b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution & Walkthrough for Saving Progress.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c860f6ecdd466f729234130eeef7bdbf98eccfab --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution & Walkthrough for Saving Progress.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05377df3e776df5319b4564756b2f0010fd3eafef9df1a50215db648a9fe0387 +size 98902437 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution & Walkthrough for Saving Progress_vi.srt b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution & Walkthrough for Saving Progress_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fd6b200b294ad23190b4c4a6320b7b8b2eb92d3d --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution & Walkthrough for Saving Progress_vi.srt @@ -0,0 +1,540 @@ +1 +00:00:00,300 --> 00:00:04,680 +Bây giờ chúng tôi đang ở trong tầm nhìn của vạch đích. Chúng ta đang ở bước cuối cùng. + +2 +00:00:04,710 --> 00:00:09,240 +Vì vậy, đây là giải pháp cho bước 4. Và trong bước 4, chúng tôi + +3 +00:00:09,270 --> 00:00:14,270 +muốn có thể cải thiện chương trình của mình để những từ mà người dùng + +4 +00:00:14,910 --> 00:00:18,780 +nhấp vào dấu kiểm có nghĩa là họ đã biết từ đó. + +5 +00:00:18,810 --> 00:00:23,040 +Họ biết ý nghĩa của nó và họ không muốn gặp lại nó trong danh sách này. + +6 +00:00:23,580 --> 00:00:28,580 +Vì vậy, những gì chúng tôi muốn có thể làm là xóa những từ mà người dùng + +7 +00:00:29,010 --> 00:00:33,510 +biết khỏi từ điển từ này to_learn. Và để làm được điều đó, + +8 +00:00:33,630 --> 00:00:38,610 +chúng ta phải thay đổi lệnh này. Khi người dùng nhấp vào nút không xác định, + +9 +00:00:38,880 --> 00:00:41,340 +chúng tôi sẽ chỉ đưa cho họ thẻ + +10 +00:00:41,370 --> 00:00:44,700 +tiếp theo, là một từ ngẫu nhiên trong danh sách các từ. + +11 +00:00:45,210 --> 00:00:47,850 +Nhưng khi họ sử dụng nó, hãy nhấp vào nút + +12 +00:00:48,000 --> 00:00:52,440 +đã biết, thay vì nhấp vào thẻ tiếp theo, chúng ta sẽ gọi một hàm khác + +13 +00:00:52,710 --> 00:00:56,610 +mà tôi sẽ gọi là is_known. Bây giờ is_known sẽ là + +14 +00:00:56,640 --> 00:00:58,050 +một hàm sẽ xóa + +15 +00:00:58,110 --> 00:01:03,110 +thẻ hiện tại khỏi các thẻ nằm trong danh sách các từ cần + +16 +00:01:06,300 --> 00:01:07,170 +học. + +17 +00:01:07,830 --> 00:01:12,120 +Vì vậy, những gì chúng tôi sẽ làm là chúng tôi sẽ nắm giữ danh sách của chúng + +18 +00:01:13,470 --> 00:01:17,070 +tôi để tìm hiểu, và sau đó chúng tôi sẽ gọi phương thức loại bỏ. + +19 +00:01:17,610 --> 00:01:20,460 +Và sau đó chúng tôi sẽ xóa một phần tử cụ thể khỏi nó. + +20 +00:01:20,880 --> 00:01:24,240 +Và đó là thẻ hiện tại. + +21 +00:01:25,410 --> 00:01:28,770 +Vì vậy, hãy nhớ rằng, thẻ hiện tại là một từ điển + +22 +00:01:29,040 --> 00:01:33,480 +mà chúng tôi nhận được bằng cách chọn ngẫu nhiên từ danh sách của chúng tôi để học. + +23 +00:01:34,080 --> 00:01:36,990 +Vì vậy, bây giờ, khi người dùng nói is_known, + +24 +00:01:37,320 --> 00:01:41,670 +thì thẻ hiện tại sẽ bị xóa khỏi danh sách các từ cần học. + +25 +00:01:42,120 --> 00:01:43,560 +Và sau khi chúng tôi đã làm điều + +26 +00:01:43,920 --> 00:01:48,920 +đó, chúng tôi sẽ gọi thẻ tiếp theo từ phương thức cụ thể này. Hiện tại, nếu chúng tôi chạy mã + +27 +00:01:49,440 --> 00:01:53,250 +này và tôi tiếp tục nhấp vào dấu kiểm, cuối cùng, + +28 +00:01:53,670 --> 00:01:58,670 +chúng tôi sẽ có một danh sách rất nhỏ các từ mà chúng tôi + +29 +00:01:59,370 --> 00:02:01,260 +sẽ chọn. Trên thực + +30 +00:02:01,290 --> 00:02:06,290 +tế, nếu tôi tiếp tục và in độ dài danh sách của mình, to_learn, bạn + +31 +00:02:08,190 --> 00:02:13,190 +có thể thấy rằng lần đầu tiên tôi chạy mã này và nhấp vào nút + +32 +00:02:14,640 --> 00:02:19,020 +is_known, chúng ta có một trăm từ. Nhưng nếu tôi tiếp tục nhấp vào đây, + +33 +00:02:19,050 --> 00:02:21,090 +thì bạn sẽ thấy rằng mỗi + +34 +00:02:21,090 --> 00:02:25,050 +lần, tôi chỉ giảm danh sách đó bởi vì tôi đang nói, tôi đã + +35 +00:02:25,080 --> 00:02:27,660 +biết từ này có nghĩa là gì và từ + +36 +00:02:28,110 --> 00:02:31,950 +đó hiện đã được đưa ra khỏi danh sách những từ để học. + +37 +00:02:32,250 --> 00:02:36,630 +Vì vậy, bây giờ danh sách đó nhỏ hơn một mục nhập. + +38 +00:02:37,530 --> 00:02:41,670 +Bây giờ điều này hoạt động ngay bây giờ, nhưng nếu tôi chạy lại ứng dụng, + +39 +00:02:41,700 --> 00:02:45,540 +thì bạn có thể thấy nó quay trở lại ngay từ đầu và nó có + +40 +00:02:45,750 --> 00:02:47,550 +hàng trăm từ một lần nữa. + +41 +00:02:48,150 --> 00:02:52,950 +Vì vậy, để lưu giữ những từ mà tôi vẫn cần học, tôi + +42 +00:02:53,280 --> 00:02:57,540 +phải lưu danh sách này vào một tệp vĩnh viễn mới mỗi + +43 +00:02:57,840 --> 00:03:01,000 +khi người dùng nhấp vào nút is_known này. + +44 +00:03:01,780 --> 00:03:06,220 +Vì vậy, cách mà tôi sẽ làm điều đó là sử dụng lại gấu trúc. + +45 +00:03:06,790 --> 00:03:10,900 +Tôi sẽ sử dụng gấu trúc để tạo khung dữ liệu mới. + +46 +00:03:11,530 --> 00:03:15,970 +Và khung dữ liệu đó sẽ được tạo từ danh sách to_learn của chúng tôi. + +47 +00:03:17,230 --> 00:03:19,540 +Bây giờ, tôi sẽ lưu dữ liệu này làm dữ liệu + +48 +00:03:20,170 --> 00:03:25,170 +của chúng tôi, và sau đó tôi có thể nói là dữ liệu. to_csv để lưu nó dưới dạng tệp CSV. + +49 +00:03:26,350 --> 00:03:31,350 +Vì vậy, tôi sẽ gọi đây là words_to_learn. csv. + +50 +00:03:32,860 --> 00:03:37,860 +Vì vậy, bây giờ, nếu tôi nhấn dấu kiểm và xem xét + +51 +00:03:38,980 --> 00:03:41,740 +các tệp của mình, bạn có + +52 +00:03:41,770 --> 00:03:44,980 +thể thấy words_to_learn. csv được tạo. + +53 +00:03:45,490 --> 00:03:50,380 +Và hiện tại nó có 89 mục. Nhưng nếu tôi tiếp tục nhấp vào đây một + +54 +00:03:50,620 --> 00:03:52,570 +vài lần, nó sẽ giảm mỗi lần. + +55 +00:03:52,960 --> 00:03:57,250 +Vì vậy, đây là nơi lưu trữ vĩnh viễn tất cả các từ mà tôi chưa học được. + +56 +00:03:57,940 --> 00:04:01,510 +Nhưng tôi không thực sự muốn nó ngẫu nhiên ở giữa dự án của mình. + +57 +00:04:01,750 --> 00:04:05,170 +Tôi muốn nó được lưu cùng với french_words của mình. csv. + +58 +00:04:05,740 --> 00:04:08,200 +Vì vậy, tôi phải thay đổi điều này thành một đường dẫn + +59 +00:04:08,230 --> 00:04:11,110 +tệp sẽ là data / words_to_learn. csv. + +60 +00:04:11,620 --> 00:04:16,620 +Vì vậy, hãy tiếp tục và xóa tệp này và thực hiện cấu trúc lại. + +61 +00:04:17,110 --> 00:04:18,760 +Và sau đó chúng tôi sẽ chạy lại điều này. + +62 +00:04:18,880 --> 00:04:22,630 +Và lần sau, bạn sẽ thấy rằng nó xuất hiện ở đúng nơi. + +63 +00:04:23,530 --> 00:04:26,590 +Bây giờ, ngoài việc lưu nó vào CSV, chúng tôi + +64 +00:04:26,620 --> 00:04:31,620 +cũng phải đọc từ CSV đó vì thay vì sử dụng các từ từ danh sách ban đầu + +65 +00:04:32,680 --> 00:04:35,860 +là french_words của chúng tôi. csv, tôi thực sự + +66 +00:04:36,400 --> 00:04:41,400 +muốn có thể đọc từ words_to_learn của mình. csv thay vào đó, bởi vì theo + +67 +00:04:42,100 --> 00:04:45,460 +cách đó, mỗi lần tôi chạy lại ứng dụng, nó sẽ + +68 +00:04:45,760 --> 00:04:49,570 +luôn cung cấp cho tôi tất cả các từ mà tôi chưa học. + +69 +00:04:50,020 --> 00:04:53,320 +Vì vậy, hiện tại chúng tôi đang ở trên 87. Nếu tôi chạy lại điều này, + +70 +00:04:53,560 --> 00:04:55,840 +bạn có thể thấy rằng lần đầu tiên tôi + +71 +00:04:55,930 --> 00:04:59,560 +nhấp vào nó, nó sẽ chuyển đến 86 thay vì quay trở lại 100. + +72 +00:05:00,220 --> 00:05:01,750 +Nhưng có một vấn đề + +73 +00:05:02,080 --> 00:05:07,080 +ở đây vì nếu tôi xóa tệp này, words_to_learn. csv, và tôi tiếp tục và chạy cái này, + +74 +00:05:09,250 --> 00:05:13,540 +lần đầu tiên chạy nó sẽ gặp sự cố và chúng tôi gặp lỗi không tìm + +75 +00:05:13,540 --> 00:05:16,810 +thấy tệp quen thuộc đó. Vì vậy, chúng tôi biết làm thế nào để đối phó với điều đó. + +76 +00:05:16,840 --> 00:05:21,280 +Chúng ta cần nắm bắt ngoại lệ này. Ngoại lệ xảy ra ngay tại đây. + +77 +00:05:21,940 --> 00:05:26,940 +Nó xảy ra khi chúng tôi cố gắng nắm giữ phần dữ liệu + +78 +00:05:27,640 --> 00:05:32,290 +có thể tồn tại hoặc không. Vì vậy, nếu nó không tồn tại, vì vậy chúng tôi sẽ + +79 +00:05:32,470 --> 00:05:36,820 +bắt lỗi này ngoại trừ lỗi không tìm thấy tệp. Trong trường hợp đó, + +80 +00:05:36,820 --> 00:05:40,390 +chúng tôi sẽ sử dụng dữ liệu gốc + +81 +00:05:41,050 --> 00:05:45,970 +lấy từ french_words. csv. Vì vậy, chúng tôi sẽ nói những con gấu trúc. + +82 +00:05:46,000 --> 00:05:47,050 +read_csv và sau + +83 +00:05:47,140 --> 00:05:52,090 +đó chúng tôi sẽ đọc tệp này, data / french_words. csv. + +84 +00:05:52,660 --> 00:05:56,890 +Vì vậy, điều này sẽ luôn ở đó bởi vì nó đã được cài đặt sẵn trong dự án của chúng tôi. + +85 +00:05:57,500 --> 00:06:01,070 +Nhưng nếu chúng ta quản lý để tìm từ_to_learn của mình. csv, thì điều đó có + +86 +00:06:01,130 --> 00:06:05,810 +nghĩa là chương trình này đã được chạy trước đó và chúng tôi đã xóa + +87 +00:06:05,810 --> 00:06:10,610 +một số từ mà chúng tôi đã biết. Vì vậy, chúng ta có thể nắm bắt điều đó bằng + +88 +00:06:10,610 --> 00:06:11,900 +một câu lệnh khác và + +89 +00:06:12,260 --> 00:06:16,130 +chúng ta có thể nói, tốt, trong trường hợp này, chúng ta sẽ đặt một biến toàn cục + +90 +00:06:16,310 --> 00:06:18,770 +có tên là to_learn bắt đầu như một từ điển trống. + +91 +00:06:19,250 --> 00:06:23,780 +Và chúng tôi đặt nó thành dữ liệu đến từ CSV này. + +92 +00:06:24,620 --> 00:06:27,620 +Tuy nhiên, nếu tệp đó không được tìm thấy, thì to_learn + +93 +00:06:27,950 --> 00:06:32,950 +này sẽ được đặt thành dữ liệu gốc. to_dict và chúng + +94 +00:06:34,790 --> 00:06:39,410 +tôi cũng sẽ định hướng theo hồ sơ. + +95 +00:06:43,510 --> 00:06:43,660 +1: Được rồi. + +96 +00:06:43,660 --> 00:06:47,590 +0: Bây giờ, khi chúng tôi chạy mã của mình, bạn có thể thấy chúng tôi không có lỗi. + +97 +00:06:48,010 --> 00:06:49,870 +Và lần đầu tiên nó chạy, nó sẽ + +98 +00:06:49,900 --> 00:06:54,310 +chọn từ french_words của chúng tôi. csv. Bây giờ, khi tôi bắt đầu + +99 +00:06:54,310 --> 00:06:58,480 +nói rằng tôi đã học được điều này, tôi đã học được điều này, tôi đã học được + +100 +00:06:58,480 --> 00:07:03,130 +điều này, sau đó nó sẽ tạo ra một words_to_learn. csv. + +101 +00:07:03,580 --> 00:07:05,560 +Và lần sau khi tôi chạy mã + +102 +00:07:05,860 --> 00:07:10,860 +này, nó sẽ bắt đầu sử dụng words_to_learn đó. csv và bắt đầu từ nơi tôi đã dừng lại. + +103 +00:07:11,800 --> 00:07:15,430 +Bây giờ, có một lỗi nhỏ kỳ lạ đối với điều này. + +104 +00:07:15,820 --> 00:07:19,060 +Khi bạn xem qua words_to_learn. csv, nó thêm + +105 +00:07:19,750 --> 00:07:23,590 +số bản ghi vào cột đầu tiên mỗi + +106 +00:07:23,950 --> 00:07:27,850 +khi tôi chạy mã. Vì vậy, nếu tôi chạy lại mã này, + +107 +00:07:28,210 --> 00:07:31,960 +bạn có thể thấy bây giờ tôi có ba cột của tất cả các bản ghi. + +108 +00:07:32,500 --> 00:07:37,330 +Vì vậy, về cơ bản khi chúng tôi đọc từ CSV cụ thể này, chúng + +109 +00:07:37,780 --> 00:07:42,580 +tôi tạo ra một khung dữ liệu. Và khi tôi đọc từ khung dữ + +110 +00:07:42,940 --> 00:07:47,800 +liệu đó, vì vậy hãy xóa cái này và chạy lại mã của chúng tôi, bạn + +111 +00:07:49,090 --> 00:07:53,860 +có thể thấy rằng gấu trúc được tự động thêm vào các số kỷ lục này. + +112 +00:07:54,280 --> 00:07:59,280 +Vì vậy, điều đó sau đó sẽ được thêm lại vào words_to_learn của chúng tôi. csv khi nó lưu + +113 +00:08:02,860 --> 00:08:06,790 +nó vào tệp. Nếu chúng ta muốn loại bỏ những số bản ghi + +114 +00:08:07,000 --> 00:08:10,330 +này, tất cả những gì chúng ta phải làm là khi chúng ta lưu nó vào CSV, chúng + +115 +00:08:10,870 --> 00:08:15,870 +ta có thể đặt một thuộc tính gọi là chỉ mục thành false. Bằng cách này, nó chỉ không thêm số chỉ + +116 +00:08:16,150 --> 00:08:20,800 +mục vào danh sách mới tạo của chúng tôi và bây giờ nếu tôi chạy lại mã + +117 +00:08:21,160 --> 00:08:22,990 +này, bạn có thể thấy rằng + +118 +00:08:23,440 --> 00:08:26,260 +words_to_learn của chúng tôi. csv không thực + +119 +00:08:26,560 --> 00:08:31,560 +sự bao gồm một chỉ mục. Nó chỉ bao gồm các bản ghi thực tế + +120 +00:08:31,660 --> 00:08:34,480 +hoặc các từ thực tế và bản dịch tiếng Anh của chúng. + +121 +00:08:36,700 --> 00:08:37,059 +Đó + +122 +00:08:37,059 --> 00:08:41,770 +là 0: về cơ bản là nó. Đó là tất cả các giải pháp cho dự án capstone của chúng tôi. + +123 +00:08:42,309 --> 00:08:47,140 +Và bây giờ bạn đã xây dựng một thẻ flashcard hoàn chỉnh mà bạn có thể sử dụng để + +124 +00:08:47,140 --> 00:08:48,160 +học ngôn ngữ. + +125 +00:08:48,190 --> 00:08:52,370 +Vì vậy, bạn có thể có mặt trước với bất kỳ ngôn ngữ nào bạn muốn và mặt sau là + +126 +00:08:52,440 --> 00:08:56,790 +bản dịch tiếng Anh hoặc bạn có thể sử dụng nó để tìm hiểu các thông tin cơ bản về Lập trình. + +127 +00:08:56,790 --> 00:09:01,500 +Bạn có thể có mặt trước là một từ Lập trình và mặt sau là nghĩa của + +128 +00:09:01,500 --> 00:09:02,520 +từ Lập trình. + +129 +00:09:02,780 --> 00:09:05,540 +2: Bạn có thể sử dụng nó để học Lịch sử hoặc Địa lý. + +130 +00:09:06,050 --> 00:09:10,520 +0: Và chương trình này sẽ giúp bạn quản lý tất cả những thứ bạn không nhớ và tiếp + +131 +00:09:10,520 --> 00:09:15,520 +tục hiển thị cho bạn cho đến khi bạn làm. Chúc bạn vui vẻ khi sửa đổi ứng dụng + +132 +00:09:16,520 --> 00:09:20,300 +flashcard này và tôi hy vọng nó cũng sẽ hữu ích trong việc học của bạn. + +133 +00:09:21,170 --> 00:09:24,080 +Nếu bạn đã xây dựng một thứ gì đó đặc biệt thú vị, một lần + +134 +00:09:24,140 --> 00:09:28,370 +nữa, hãy nhớ chia sẻ với chúng tôi trong phần Hỏi / Đáp để tất cả chúng tôi có thể ngưỡng mộ và + +135 +00:09:28,370 --> 00:09:30,350 +chúc mừng bạn vì công việc khó khăn của bạn. + diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution-flash-card-project-end.zip b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution-flash-card-project-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..98584f31e8ddeb6a62ac1a83beae08b3cf798bde --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/009 Solution-flash-card-project-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:117af96267d05b5a17831fd7a483f27a442a98b78c7431b5ff5763eaa52efb70 +size 47750 diff --git a/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/external-links.txt b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..b3eb48b5625f158038633ac977ee9b6403abcd4a --- /dev/null +++ b/part3/31 - Day 31 - Intermediate - Flash Card App Capstone Project/external-links.txt @@ -0,0 +1,21 @@ + +001 Wiktionary-Frequency-Lists +https://en.wiktionary.org/wiki/Wiktionary:Frequency_lists + +001 2018-Frequency-Lists-from-Hermit-Dave +https://github.com/hermitdave/FrequencyWords/tree/master/content/2018 + +001 Google-Sheets +https://www.google.co.uk/sheets/about/ + +001 Open-Subtitles +https://www.opensubtitles.org/en/search/subs + +001 Google-Translate-for-Google-Sheets +https://support.google.com/docs/answer/3093331?hl=en-GB + +001 Google-Translate-Language-Codes +https://cloud.google.com/translate/docs/languages?hl=en + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/001 Day 32 Goals what we will make by the end of the day.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/001 Day 32 Goals what we will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..114fd377bf038206255af86643c16997c2923d80 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/001 Day 32 Goals what we will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07044429379cd53949f7cce39838a6812fdef2e329dc2990f25d7951b632890b +size 11509847 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/001 Day 32 Goals what we will make by the end of the day_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/001 Day 32 Goals what we will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e2b2e17f92711d5475e38aa0152f2fa1aaf4dc8c --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/001 Day 32 Goals what we will make by the end of the day_vi.srt @@ -0,0 +1,144 @@ +1 +00:00:00,180 --> 00:00:05,040 +Xin chào, chào mừng bạn đến với ngày thứ 32 của 100 Ngày viết mã. Bây giờ, hôm nay chúng + +2 +00:00:05,040 --> 00:00:05,670 +ta + +3 +00:00:05,670 --> 00:00:10,560 +sẽ tìm hiểu về SMTP email và mô-đun ngày giờ. + +4 +00:00:11,130 --> 00:00:15,930 +Về cơ bản, chúng ta sẽ tìm hiểu cách gửi email bằng mã Python. + +5 +00:00:16,350 --> 00:00:20,430 +Và chúng tôi sẽ xác định thời điểm chúng tôi gửi email bằng mô-đun + +6 +00:00:20,430 --> 00:00:23,850 +thời gian ban ngày này. Và một khi chúng tôi đã học + +7 +00:00:24,150 --> 00:00:29,150 +được tất cả những kỹ năng đó, chúng tôi sẽ xây dựng một công cụ thực sự thú vị và có thể hữu ích, + +8 +00:00:29,850 --> 00:00:34,850 +nơi chúng tôi có thể tự động gửi email chúc mừng sinh nhật cho tất cả bạn bè và gia đình của chúng tôi. + +9 +00:00:36,870 --> 00:00:41,870 +Vì vậy, có lẽ tôi chỉ nhớ thuộc lòng một số email của mọi người và phần + +10 +00:00:42,900 --> 00:00:47,010 +còn lại, tôi dựa khá nhiều vào Facebook để nói với tôi rằng + +11 +00:00:47,010 --> 00:00:51,600 +đó là ngày sinh nhật của tôi. Và tôi kết thúc việc viết trên dòng thời gian của họ. + +12 +00:00:52,080 --> 00:00:56,490 +Nhưng nếu Facebook không cho tôi biết, có lẽ tôi sẽ không nhớ. + +13 +00:00:57,060 --> 00:01:01,860 +Bây giờ tôi biết một số người bạn của tôi thực sự giỏi trong việc ghi nhớ sinh nhật của mọi người, + +14 +00:01:02,060 --> 00:01:02,893 +ngay cả khi + +15 +00:01:03,110 --> 00:01:06,860 +họ không lên Facebook và họ sẽ gửi cho bạn một tin nhắn mỗi năm cho + +16 +00:01:07,280 --> 00:01:09,530 +thấy họ tốt như thế nào về một người bạn. + +17 +00:01:09,620 --> 00:01:12,770 +Và nó luôn làm cho tôi cảm thấy một chút tồi tệ trong lòng. + +18 +00:01:13,280 --> 00:01:16,850 +Vậy giải pháp của chúng tôi là gì? Để nhớ ngày sinh của mọi người? + +19 +00:01:17,180 --> 00:01:20,750 +Không. Chúng tôi sẽ xây dựng một chương trình Python. + +20 +00:01:21,410 --> 00:01:26,360 +Và chương trình Python này sẽ trở thành ứng dụng sinh nhật tự động. + +21 +00:01:27,110 --> 00:01:28,100 +Tất cả những gì chúng + +22 +00:01:28,220 --> 00:01:33,020 +tôi phải làm là tạo một bảng tính về tất cả các ngày sinh nhật của bạn bè chúng tôi, sau + +23 +00:01:33,020 --> 00:01:33,680 +đó tạo + +24 +00:01:33,680 --> 00:01:38,240 +một loạt các email và chúng tôi sẽ chọn ngẫu nhiên một email để gửi cho từng người bạn này. + +25 +00:01:38,990 --> 00:01:42,830 +Và chương trình này sẽ dạy chúng ta một số kỹ năng trong Python để giúp chúng + +26 +00:01:43,100 --> 00:01:45,140 +ta thăng cấp trở thành một lập trình viên. + +27 +00:01:45,350 --> 00:01:49,730 +Nhưng nó cũng khiến chúng ta trở thành những người tốt hơn vì bạn bè của chúng ta sẽ cảm + +28 +00:01:49,730 --> 00:01:54,410 +thấy như chúng ta nhớ đến ngày sinh của họ và giúp bạn bè của chúng ta cảm thấy được trân trọng hơn. + +29 +00:01:55,880 --> 00:02:00,080 +Email SMTP là một mô-đun đi kèm với Python và + +30 +00:02:00,440 --> 00:02:04,370 +nó giúp chúng tôi gửi email bằng mã Python. + +31 +00:02:05,210 --> 00:02:10,210 +Và ban ngày là một mô-đun Python khác giúp chúng ta tìm ra ngày hôm nay là gì hoặc + +32 +00:02:10,820 --> 00:02:15,710 +cách định dạng một ngày và giờ cụ thể. Và trong trường hợp của chúng tôi, nó sẽ giúp chúng + +33 +00:02:15,740 --> 00:02:20,330 +tôi tìm ra liệu hôm nay có phải là ngày sinh nhật của một trong những người bạn của chúng tôi hay + +34 +00:02:20,330 --> 00:02:23,900 +không, trong trường hợp đó, chúng tôi sẽ gửi cho họ một email chúc mừng sinh nhật. + +35 +00:02:24,500 --> 00:02:27,320 +Vì vậy, đó là kế hoạch. Hãy chuyển sang bài học + +36 +00:02:27,530 --> 00:02:30,650 +tiếp theo và chúng ta sẽ bắt đầu bằng cách học cách gửi email. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/002 A Note About the Next Lesson Google SMTP Port.html b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/002 A Note About the Next Lesson Google SMTP Port.html new file mode 100644 index 0000000000000000000000000000000000000000..e48c25a7ff16026247c4e2beb6cae88611db351a --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/002 A Note About the Next Lesson Google SMTP Port.html @@ -0,0 +1 @@ +

In the next lesson, I'll show you how to send email using the smtplib module and Python. If you are getting the error Connection unexpectedly closed, it might be due to a number of things. You can come back to this lesson to debug.

1. Make sure you've got the correct smtp address for your email provider:

Gmail: smtp.gmail.com

Hotmail: smtp.live.com

Outlook: outlook.office365.com

Yahoo: smtp.mail.yahoo.com

If you use another email provider, just Google for your email provider e.g. "Gmail SMTP address"


Below are steps specific to users sending email from Gmail addresses.

2. Go to https://myaccount.google.com/

Select Security on the left and scroll down to How you sign in to Google.

Enable 2-Step Verification


3. Click on 2-Step Verification again, and scroll to the bottom.

There you can add an App password.

Select Other from the dropdown list and enter an app name, e.g. Python Mail, then click Generate.

COPY THE PASSWORD - This is the only time you will ever see the password. It is 16 characters with no spaces.

Use this App password in your Python code instead of your normal password.


4. Add a port number by changing your code to this:

smtplib.SMTP("smtp.gmail.com", port=587)

\ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 Birthday-Wisher-Day-32-start.zip b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 Birthday-Wisher-Day-32-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..b26d31e0d10496443925c0be23a0cce751504af8 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 Birthday-Wisher-Day-32-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50a5647c16e847e54992e0ef8cc596dc6e8b9c911d97cbe6ba05aa80ef6772b0 +size 6341 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 How to Send Emails with Python using SMTP.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 How to Send Emails with Python using SMTP.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..843c833cb9bb5741234f2b1852808c155cbfa021 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 How to Send Emails with Python using SMTP.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60a63ece5e79291c31317e0f9525329c9491068741913a95c6877585cedc9683 +size 160574229 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 How to Send Emails with Python using SMTP_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 How to Send Emails with Python using SMTP_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a6d1c29841fe4b7903f9000a6309706b5b60d0a2 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 How to Send Emails with Python using SMTP_vi.srt @@ -0,0 +1,672 @@ +1 +00:00:00,750 --> 00:00:05,880 +Điều đầu tiên chúng ta phải tìm ra là email hoạt động chính xác như thế nào? + +2 +00:00:06,300 --> 00:00:11,960 +Tất cả chúng ta đều biết rằng chúng ta có thể đăng nhập vào Gmail hoặc Yahoo dot com và chúng ta có thể bắt đầu điền email. + +3 +00:00:11,970 --> 00:00:14,820 +Bây giờ nó gần như là bản chất thứ hai đối với mọi người. + +4 +00:00:15,030 --> 00:00:18,050 +Nhưng những gì thực sự xảy ra đằng sau hậu trường? + +5 +00:00:18,060 --> 00:00:25,290 +Chà, giả sử rằng chúng ta có một người gửi Angela trong gmail. com và một người nhận Timmy tại Yahoo dot com. + +6 +00:00:25,500 --> 00:00:32,400 +Bây giờ để gửi email này từ tài khoản Gmail của tôi đến một tài khoản email khác, điều xảy ra đằng + +7 +00:00:32,400 --> 00:00:39,330 +sau hậu trường là có một máy chủ thư Gmail sẽ nhận thư của tôi và sau đó có một máy chủ Yahoo Mail + +8 +00:00:39,330 --> 00:00:46,950 +sẽ lưu trữ thư cho đến khi Timmy đăng nhập vào máy tính của anh ấy và đăng nhập vào Yahoo dot com, dịch vụ + +9 +00:00:46,950 --> 00:00:50,910 +này sẽ tải xuống email từ máy chủ Yahoo Mail. + +10 +00:00:51,540 --> 00:00:56,340 +Vì vậy, email này sẽ di chuyển giữa tất cả các bước này. + +11 +00:00:56,430 --> 00:01:03,540 +Và để làm được điều này, nó dựa vào một thứ gọi là SMTP, giao thức chuyển thư đơn giản. + +12 +00:01:04,200 --> 00:01:11,400 +Và điều này chứa tất cả các quy tắc xác định cách máy chủ thư nhận được email được chuyển đến + +13 +00:01:11,400 --> 00:01:16,140 +máy chủ thư tiếp theo và cách gửi email trên Internet. + +14 +00:01:17,190 --> 00:01:25,440 +Bây giờ, một sự tương tự tốt cho SMTP là nếu bạn tưởng tượng các máy chủ thư này là một bưu điện và máy tính + +15 +00:01:25,440 --> 00:01:34,290 +của Timmy là hộp thư, thì SMTP về cơ bản là người đưa thư biết cách xử lý email và mang nó đến các bưu điện khác + +16 +00:01:34,290 --> 00:01:38,790 +nhau và cuối cùng đưa nó vào Máy tính của Timmy. + +17 +00:01:39,520 --> 00:01:48,280 +Vì vậy, trong Python có một mô-đun gọi là SMTP lib, cho phép chúng ta sử dụng SMTP để gửi email của mình đến bất kỳ địa chỉ + +18 +00:01:48,280 --> 00:01:49,930 +nào trên internet. + +19 +00:01:50,530 --> 00:01:57,010 +Để bắt đầu, tôi khuyên bạn nên thiết lập hai tài khoản email mới, tạo một tài khoản email mới với Gmail + +20 +00:01:57,010 --> 00:02:00,100 +và cũng tạo một tài khoản email mới với Yahoo! + +21 +00:02:00,190 --> 00:02:06,610 +Các tài khoản email mới này sẽ rất phù hợp để kiểm tra mã của bạn và làm theo hướng dẫn bằng video. + +22 +00:02:06,760 --> 00:02:11,360 +Ngoài ra, chúng tôi sẽ làm cho các tài khoản email đó kém an toàn hơn một chút để kiểm tra mã của chúng tôi. + +23 +00:02:11,380 --> 00:02:15,010 +Vì vậy, đó là một lý do khác để thiết lập một số địa chỉ email thử nghiệm ngay bây giờ. + +24 +00:02:15,670 --> 00:02:20,830 +Sau khi bạn đã thiết lập tài khoản email mới của mình, hãy truy cập tài nguyên khóa học và tải xuống + +25 +00:02:20,830 --> 00:02:23,290 +tệp zip có mã bắt đầu cho bài học hôm nay. + +26 +00:02:24,160 --> 00:02:26,920 +Và sau đó chúng ta sẽ mở nó ra bằng bùa PI. + +27 +00:02:27,280 --> 00:02:30,700 +Bây giờ, tôi muốn bạn nhìn vào bên trong dự án bắt đầu. + +28 +00:02:30,730 --> 00:02:35,980 +Có một tệp PI chính và cũng có một tệp văn bản trích dẫn. + +29 +00:02:36,010 --> 00:02:37,670 +Đừng lo lắng về tập tin này bây giờ. + +30 +00:02:37,690 --> 00:02:41,230 +Chúng ta sẽ quay lại vấn đề này khi khám phá mô-đun ngày giờ. + +31 +00:02:41,500 --> 00:02:44,590 +Hiện tại, chúng tôi sẽ làm việc trong PI chính. + +32 +00:02:44,620 --> 00:02:52,960 +Và tôi muốn chỉ cho bạn cách bạn có thể sử dụng thư viện lib SMTP này để bắt đầu gửi email trực tiếp từ mã Python + +33 +00:02:52,960 --> 00:02:53,980 +của mình. + +34 +00:02:54,610 --> 00:03:03,670 +Như mọi khi, chúng tôi nhập mô-đun SMTP lib và sau đó chúng tôi có thể bắt đầu sử dụng nó sau khi chúng tôi đã nhập thư viện + +35 +00:03:03,670 --> 00:03:04,460 +SMTP này. + +36 +00:03:04,480 --> 00:03:09,150 +Về cơ bản, chúng ta có thể sử dụng nó để tạo một đối tượng SMTP mới. + +37 +00:03:09,160 --> 00:03:15,160 +Vì vậy, chúng tôi sẽ gọi đối tượng đó là kết nối mới vì về cơ bản, đó là cách để chúng tôi có thể kết + +38 +00:03:15,160 --> 00:03:19,690 +nối với máy chủ email SMTP của nhà cung cấp dịch vụ email của mình. + +39 +00:03:19,900 --> 00:03:27,400 +Chúng ta sẽ làm điều này bằng cách nhấn vào lib SMTP và sau đó tạo một đối tượng từ lớp SMTP. + +40 +00:03:27,640 --> 00:03:35,350 +Bây giờ, khi chúng ta tạo đối tượng này, một trong những điều mà chúng ta nên chỉ định là vị trí của máy chủ SMTP của nhà cung + +41 +00:03:35,350 --> 00:03:37,630 +cấp dịch vụ email của chúng ta. + +42 +00:03:37,840 --> 00:03:42,900 +Giờ đây, đối với Gmail, nó chỉ đơn giản là SMTP gmail. com. + +43 +00:03:43,000 --> 00:03:45,580 +Nhưng nó khác nhau đối với mọi nhà cung cấp email. + +44 +00:03:45,760 --> 00:03:52,990 +Vì vậy, điều đó có nghĩa là nếu email của bạn kết thúc bằng gmail. com, thì đây sẽ là cách bạn kết nối với máy chủ email + +45 +00:03:52,990 --> 00:03:54,040 +của mình. + +46 +00:03:54,340 --> 00:04:01,750 +Trong trường hợp của chúng tôi, tôi đã tạo một email thử nghiệm có tên Thông tin nhà máy bia ứng dụng tại gmail. com. + +47 +00:04:01,960 --> 00:04:10,750 +Và phần nằm trước ký hiệu THÊM là danh tính tài khoản email của tôi và phần sau ký hiệu THÊM là + +48 +00:04:10,750 --> 00:04:14,620 +danh tính nhà cung cấp email của tôi. + +49 +00:04:14,710 --> 00:04:20,050 +Vì vậy, trong trường hợp của tôi, tôi cần kết nối với SMTP gmail. com. + +50 +00:04:20,290 --> 00:04:27,040 +Nhưng nếu bạn có một nhà cung cấp email khác, ví dụ nếu bạn với Hotmail, đó là SMTP, Mlive. com và nếu của bạn với Yahoo, đó + +51 +00:04:27,040 --> 00:04:31,810 +là SMTP mail, yahoo. com. + +52 +00:04:31,960 --> 00:04:38,530 +Và nếu bạn đang sử dụng một nhà cung cấp email hoàn toàn khác, thì chỉ cần Google nhà cung cấp + +53 +00:04:38,530 --> 00:04:45,250 +email của bạn và thông tin SMTP và bạn sẽ tìm thấy một bài báo ở đâu đó mô tả một URL giống như thế + +54 +00:04:45,250 --> 00:04:46,030 +này. + +55 +00:04:46,570 --> 00:04:54,790 +Khi tôi đã tạo kết nối của mình, điều tiếp theo tôi cần làm là tiếp tục và gọi bắt đầu TLS. + +56 +00:04:54,940 --> 00:04:58,720 +Bây giờ TLS là viết tắt của Transport Layer Security. + +57 +00:04:58,930 --> 00:05:03,950 +Và đó là một cách để bảo mật kết nối của chúng tôi với máy chủ email của chúng tôi. + +58 +00:05:03,970 --> 00:05:10,360 +Vì vậy, theo cách đó, khi chúng tôi đang gửi email, nếu ai đó chặn email của chúng tôi ở đâu đó + +59 +00:05:10,360 --> 00:05:17,710 +dọc theo dòng và họ cố đọc nó vì tính năng này được bật, thư đó sẽ được mã hóa và họ sẽ không thể đọc được nội dung + +60 +00:05:17,710 --> 00:05:20,950 +là gì. trong nội dung email của chúng tôi. + +61 +00:05:21,220 --> 00:05:24,610 +Vì vậy, dòng này về cơ bản sẽ làm cho kết nối này an toàn. + +62 +00:05:25,240 --> 00:05:30,820 +Bây giờ, khi chúng tôi đã bảo mật kết nối của mình, điều tiếp theo cần làm là thực sự đăng nhập. + +63 +00:05:30,820 --> 00:05:33,220 +Vì vậy, chúng tôi sẽ gọi kết nối, đăng nhập. + +64 +00:05:33,400 --> 00:05:38,290 +Và ở đây chúng tôi phải cung cấp tên người dùng và mật khẩu. + +65 +00:05:38,410 --> 00:05:44,710 +Vì vậy, tên người dùng chỉ đơn giản là email mà chúng tôi sử dụng để đăng nhập vào dịch vụ email của mình. + +66 +00:05:44,740 --> 00:05:49,540 +Vì vậy, trong trường hợp của tôi, đó chỉ là email và mật khẩu của tôi. + +67 +00:05:49,540 --> 00:05:52,570 +Tôi vừa tạo một mật khẩu mới. + +68 +00:05:52,960 --> 00:05:55,570 +Vì vậy, mật khẩu đã tạo của tôi là ABCD. + +69 +00:05:55,570 --> 00:05:56,830 +Một hai ba bốn. + +70 +00:05:56,950 --> 00:05:58,450 +Và sau đó là hai dấu ngoặc. + +71 +00:06:02,650 --> 00:06:11,530 +Và khi tôi đã đăng nhập vào nhà cung cấp dịch vụ email của mình, điều cuối cùng tôi muốn làm là thực sự gửi thư của mình. + +72 +00:06:11,830 --> 00:06:20,260 +Bây giờ địa chỉ gửi là email của tôi và địa chỉ đến là người mà tôi muốn gửi email. + +73 +00:06:20,380 --> 00:06:30,100 +Vì vậy, tôi đã thiết lập một tài khoản giả mới có tên là Thử nghiệm nhà máy bia ứng dụng tại Yahoo dot com và đảm + +74 +00:06:30,100 --> 00:06:39,550 +bảo rằng bạn không mắc lỗi chính tả nào trong email, mật khẩu, URL SMTP hoặc địa chỉ email người nhận. + +75 +00:06:39,940 --> 00:06:43,810 +Bây giờ, cuối cùng, điều cuối cùng chúng tôi muốn thêm vào là thông điệp. + +76 +00:06:43,810 --> 00:06:47,710 +Vì vậy, đây là những gì chúng tôi thực sự muốn gửi trong email của mình. + +77 +00:06:47,800 --> 00:06:53,980 +Và giống như chúng ta đã làm với tệp của mình khi chúng ta mở nó ở phần cuối cùng, sau khi hoàn thành, + +78 +00:06:53,980 --> 00:06:55,810 +chúng ta cũng sẽ đóng nó lại. + +79 +00:06:56,020 --> 00:06:58,600 +Vì vậy, bây giờ chúng ta có thể tiếp tục và nhấn chạy. + +80 +00:07:00,680 --> 00:07:03,980 +Và bạn có thể nhận được một số lỗi tại thời điểm này. + +81 +00:07:04,070 --> 00:07:10,070 +Bây giờ, điều quan trọng là nếu bạn gặp lỗi, thì trước tiên bạn hãy kiểm tra để đảm + +82 +00:07:10,070 --> 00:07:15,680 +bảo rằng bạn không có bất kỳ lỗi chính tả nào ở đây, ở đây, ở đây hoặc ở đây. + +83 +00:07:15,710 --> 00:07:21,020 +Nhưng khi bạn đã kiểm tra xong, điều tiếp theo bạn có thể làm là + +84 +00:07:21,020 --> 00:07:23,750 +xem mã lỗi này và theo dõi URL. + +85 +00:07:24,080 --> 00:07:32,150 +Bây giờ, trong trường hợp của chúng tôi, lý do là theo mặc định, Gmail không cho phép bất kỳ ai truy cập vào tài khoản email + +86 +00:07:32,150 --> 00:07:32,840 +của bạn. + +87 +00:07:33,200 --> 00:07:40,850 +Và bạn có những cách khác để làm cho tài khoản của mình an toàn hơn để gửi email từ tài khoản Gmail + +88 +00:07:40,850 --> 00:07:42,320 +bằng Python. + +89 +00:07:42,350 --> 00:07:46,880 +Điều đầu tiên bạn phải làm là tạo một mật khẩu đặc biệt cho ứng dụng của mình. + +90 +00:07:46,910 --> 00:07:52,850 +Điều này có nghĩa là bạn phải vào cài đặt bảo mật cho tài khoản Google của mình. + +91 +00:07:52,880 --> 00:07:57,650 +Vì vậy, nếu bạn đang ở trong Gmail, hãy tiếp tục và nhấp vào hồ sơ của bạn. + +92 +00:07:57,680 --> 00:08:02,270 +Chuyển đến quản lý tài khoản Google của bạn và sau đó chuyển đến bảo mật. + +93 +00:08:02,510 --> 00:08:07,100 +Bây giờ, khi bạn ở đây, trước tiên bạn phải bật xác minh từng bước. + +94 +00:08:13,390 --> 00:08:19,120 +Khi bạn đã xác nhận bằng điện thoại của mình, hãy tiếp tục và bật xác minh hai bước. + +95 +00:08:20,160 --> 00:08:24,300 +Và sau đó quay trở lại trang bảo mật. + +96 +00:08:24,300 --> 00:08:26,760 +Và bây giờ bạn sẽ có thể xem phần này. + +97 +00:08:26,790 --> 00:08:28,710 +Mật khẩu ứng dụng hiển thị. + +98 +00:08:28,740 --> 00:08:33,659 +Hãy tiếp tục và nhấp vào nó và nhập lại mật khẩu cho tài khoản Google của bạn. + +99 +00:08:38,020 --> 00:08:45,940 +Sau đó, hãy tiếp tục và tạo một loại ứng dụng khác và chúng tôi sẽ đặt tên là Birthday Wisher. + +100 +00:08:47,210 --> 00:08:48,710 +Và nhấp vào tạo. + +101 +00:08:49,790 --> 00:08:51,860 +Bây giờ, đây là phần thực sự quan trọng. + +102 +00:08:51,890 --> 00:08:55,080 +Bạn sẽ thấy mật khẩu ứng dụng của mình hiển thị ở đây. + +103 +00:08:55,160 --> 00:08:58,760 +Tôi muốn bạn chọn tất cả và sao chép nó. + +104 +00:09:00,110 --> 00:09:04,370 +Và sau đó bạn sẽ có thể dán nó vào bên trong mã của mình. + +105 +00:09:05,660 --> 00:09:10,810 +Khi chúng tôi đã hoàn thành tất cả những điều này, chúng tôi có thể quay lại và nhấn chạy lại. + +106 +00:09:10,820 --> 00:09:17,630 +Và bạn sẽ thấy lần này chúng ta thấy quá trình kết thúc với mã thoát bằng 0, có nghĩa là tất cả mã đã + +107 +00:09:17,630 --> 00:09:19,070 +chạy thành công. + +108 +00:09:19,400 --> 00:09:25,880 +Và bây giờ nếu tôi nhìn vào hộp đã gửi của mình, bạn có thể thấy rằng tôi đã nhận được tin nhắn này đã được gửi. + +109 +00:09:26,000 --> 00:09:32,660 +Và nếu tôi nhìn vào địa chỉ email mà email được gửi đến, thì bạn có thể thấy rằng trong hộp thư đến của tôi + +110 +00:09:32,660 --> 00:09:34,570 +thực sự không có gì ở đây. + +111 +00:09:34,580 --> 00:09:42,050 +Nhưng nếu bạn xem bên trong thư rác, thì có một email tuyệt vời đến từ mã Python của chúng tôi. + +112 +00:09:43,410 --> 00:09:48,930 +Vì vậy, điều đầu tiên tôi sẽ làm là thay đổi điều đó thành không spam, để đảm bảo rằng nó sẽ đi vào hộp thư + +113 +00:09:48,930 --> 00:09:49,780 +đến thực sự. + +114 +00:09:49,800 --> 00:09:55,530 +Và điều tiếp theo chúng tôi muốn có thể làm là làm thế nào để làm cho email của mình trông ít giống thư rác hơn? + +115 +00:09:55,800 --> 00:10:02,160 +Vì vậy, một email không có tiêu đề chủ đề là mục tiêu chính để bị lọc là thư rác. + +116 +00:10:02,280 --> 00:10:07,320 +Vì vậy, hãy vào email của chúng tôi và xem cách chúng tôi có thể thêm dòng tiêu đề. + +117 +00:10:07,590 --> 00:10:08,870 +Nó khá đơn giản. + +118 +00:10:08,880 --> 00:10:16,590 +Nó nằm bên trong thông số tin nhắn và tất cả những gì chúng ta phải làm chỉ là viết từ chủ đề dấu hai chấm và sau đó chúng + +119 +00:10:16,590 --> 00:10:21,960 +ta có thể nhập bất cứ thứ gì chúng ta muốn sử dụng làm chủ đề của email như thế này. + +120 +00:10:22,350 --> 00:10:25,740 +Bây giờ, làm thế nào để bạn đưa vào nội dung hoặc nội dung của email? + +121 +00:10:25,740 --> 00:10:32,430 +Chà, bạn thêm hai dòng mới bằng dấu gạch chéo ngược và dấu gạch chéo ngược n, sau đó bạn có thể đặt nội dung. + +122 +00:10:32,430 --> 00:10:41,220 +Vì vậy, đây là nội dung email của tôi và chúng ta hãy chia nhỏ phần này để dễ đọc hơn một chút. + +123 +00:10:43,530 --> 00:10:46,470 +Và bây giờ tôi có thể nhấn chạy một lần nữa. + +124 +00:10:46,680 --> 00:10:54,360 +Và sau khi hoàn tất, bạn có thể thấy rằng trong Gmail của tôi trong thư mục đã gửi, thư này hiện + +125 +00:10:54,360 --> 00:10:56,820 +có dòng tiêu đề và nội dung. + +126 +00:10:56,880 --> 00:11:00,120 +Và đó là điều tương tự khi tôi đến my. + +127 +00:11:05,990 --> 00:11:12,140 +Và khi tôi xem qua email mới này, bạn có thể thấy dòng chủ đề và nội dung của + +128 +00:11:12,140 --> 00:11:14,390 +email được tách biệt. + +129 +00:11:15,050 --> 00:11:22,460 +Bây giờ chúng ta thực sự có thể tránh phải viết kết nối dòng này nếu chúng ta thực hiện thủ thuật tương tự + +130 +00:11:22,460 --> 00:11:31,640 +như chúng ta đã làm với việc mở tệp, chúng ta sử dụng từ khóa with, vì vậy chúng ta có thể nói điều đó với SMTP, SMTP để tạo kết nối, + +131 +00:11:31,640 --> 00:11:34,730 +và sau đó chúng ta lưu điều đó như kết nối. + +132 +00:11:34,790 --> 00:11:39,540 +Sau đó, chúng ta có thể thụt lề tất cả phần còn lại của mã bên trong khối này. + +133 +00:11:39,560 --> 00:11:46,700 +Và sau khi hoàn tất việc gửi email, nó sẽ tự động ngắt kết nối đó. + +134 +00:11:47,060 --> 00:11:51,650 +Vì vậy, đây là cách bạn có thể gửi email bằng Python và SMTP lib. + +135 +00:11:51,680 --> 00:11:57,770 +Bây giờ, có khá nhiều thứ ở đây dễ bị lỗi, đặc biệt là khi chúng ta đang nhập rất nhiều thứ + +136 +00:11:57,770 --> 00:12:04,310 +ở dạng văn bản thuần túy, chẳng hạn như email hoặc mật khẩu của chúng ta và nhiều thứ khác. + +137 +00:12:04,310 --> 00:12:10,940 +Vì vậy, nếu bạn gặp lỗi khi đang chạy mã của mình hoặc nếu nó không hoạt động như những gì bạn mong + +138 +00:12:10,970 --> 00:12:17,810 +đợi thì hãy đảm bảo rằng bạn đã kiểm tra tất cả các chuỗi này và đó thực sự là những gì bạn mong đợi. + +139 +00:12:18,080 --> 00:12:23,990 +Thứ hai, đảm bảo rằng bất kỳ tài khoản nào bạn đang gửi từ tài khoản đó, bạn thực sự truy + +140 +00:12:23,990 --> 00:12:27,170 +cập vào tài khoản đó và sửa đổi cài đặt bảo mật. + +141 +00:12:27,410 --> 00:12:33,860 +Ví dụ: giả sử tôi muốn gửi từ địa chỉ email này, vì vậy tôi sẽ đặt địa chỉ đó vào đây. + +142 +00:12:33,980 --> 00:12:41,180 +Và trong trường hợp này, máy chủ email mà tôi cần kết nối sẽ là máy chủ email + +143 +00:12:41,180 --> 00:12:49,460 +của Yahoo, nằm dưới URL mà tôi đã chỉ cho bạn trước SMTP dot mail, dot, Yahoo dot com. + +144 +00:12:50,030 --> 00:12:52,550 +Và điều đó thực sự là không đủ. + +145 +00:12:52,550 --> 00:12:54,890 +Vì vậy, hãy để tôi thay đổi người nhận của mình. + +146 +00:12:58,290 --> 00:12:59,880 +Và tôi nhấn chạy. + +147 +00:12:59,910 --> 00:13:02,070 +Đây là lỗi mà bạn sẽ thấy. + +148 +00:13:02,190 --> 00:13:07,440 +Nó báo kết nối bị ngắt kết nối máy chủ SMTP bị đóng đột ngột. + +149 +00:13:07,470 --> 00:13:10,200 +Bây giờ, điều này có thể là do một số lý do. + +150 +00:13:10,200 --> 00:13:18,660 +Ví dụ: lỗi đánh máy trong phần này, cũng như nếu tài khoản của bạn không thực sự cho phép các ứng dụng kém an toàn hơn. + +151 +00:13:18,660 --> 00:13:19,920 +Vì vậy, trên Yahoo! + +152 +00:13:19,950 --> 00:13:21,540 +Quá trình này hơi khác một chút. + +153 +00:13:21,540 --> 00:13:27,210 +Bạn phải truy cập vào tài khoản của mình, chuyển đến thông tin tài khoản, sau đó chuyển đến bảo mật tài khoản. + +154 +00:13:28,600 --> 00:13:31,060 +Và bạn sẽ phải đăng nhập lại. + +155 +00:13:33,710 --> 00:13:37,070 +Và tạo một mật khẩu ứng dụng mới. + +156 +00:13:37,220 --> 00:13:43,610 +Vì vậy, chúng tôi sẽ tạo một ứng dụng mới và chúng tôi sẽ đặt cho nó một tên tùy chỉnh, mã Python, sau + +157 +00:13:43,610 --> 00:13:44,930 +đó nhấp vào tạo. + +158 +00:13:44,930 --> 00:13:50,630 +Và bây giờ chúng tôi có mật khẩu ứng dụng để sử dụng cho mã Python của mình. + +159 +00:13:50,930 --> 00:13:57,470 +Vì vậy, bây giờ quay lại đây, chúng tôi thay đổi mật khẩu này thành mật khẩu mà chúng tôi vừa sao chép. + +160 +00:13:57,770 --> 00:14:04,280 +Và bây giờ nếu tôi nhấn chạy, lỗi đó sẽ biến mất và chúng tôi sẽ được xử lý, kết thúc với mã thoát bằng + +161 +00:14:04,280 --> 00:14:04,910 +không. + +162 +00:14:05,180 --> 00:14:08,960 +Và khi tôi xem qua đây trong hộp thư đến của mình. + +163 +00:14:11,330 --> 00:14:15,500 +Tôi đã nhận được email từ thử nghiệm của Apple tại Yahoo. com. + +164 +00:14:17,250 --> 00:14:19,450 +Vì vậy, hãy kiểm tra cài đặt bảo mật của bạn. + +165 +00:14:19,470 --> 00:14:24,210 +Kiểm tra thư rác của bạn và đảm bảo rằng bạn không mắc lỗi chính tả nào. + +166 +00:14:24,990 --> 00:14:29,880 +Và nếu không có cách nào hiệu quả, thì bạn chỉ cần thử làm mọi thứ tôi đã làm trong video. + +167 +00:14:30,060 --> 00:14:34,650 +Nhưng với một tài khoản email mới mà bạn đã thiết lập với Gmail. + +168 +00:14:34,920 --> 00:14:41,280 +Sau đó, bạn có thể sử dụng cùng một địa chỉ SMTP và cùng một quy trình mà bạn đã thấy trong video để thử điều này. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 Python-smtplib-Documentation.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 Python-smtplib-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..8b9ced3e00059ce447d50b2a4873a5ab6c790c40 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/003 Python-smtplib-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/smtplib.html \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Python-datetime-Documentation.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Python-datetime-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..c08288c91eb265392e916040f6ed04dc2f37c82d --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Python-datetime-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/datetime.html \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Working with the datetime Module.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Working with the datetime Module.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..175340968fa41f65993a550ec79e6138bbf7f019 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Working with the datetime Module.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3ed8e730aca8a8f044e3400820d3afd84e59d7a8af73078b6b2f1131f300858 +size 22682601 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Working with the datetime Module_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Working with the datetime Module_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e300ab37be0052846f7ea12b3961c9742aa706b7 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/004 Working with the datetime Module_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,390 --> 00:00:04,410 +Trong bài học này, tôi muốn nói với bạn về mô-đun datetime trong Python. + +2 +00:00:04,920 --> 00:00:09,920 +Đây là một mô-đun thực sự hữu ích giúp chúng ta làm việc với ngày và giờ. + +3 +00:00:11,400 --> 00:00:14,550 +Quay trở lại với dự án bắt đầu ngày 32 của chúng ta, + +4 +00:00:14,640 --> 00:00:16,950 +tôi sẽ bình luận về mọi thứ ở đó. + +5 +00:00:18,360 --> 00:00:23,310 +Và sau đó tôi sẽ nhập mô-đun datetime của chúng tôi. Bây giờ, một lần nữa, đây là mô-đun + +6 +00:00:23,370 --> 00:00:26,010 +được tải sẵn Python nên bạn không cần phải + +7 +00:00:26,070 --> 00:00:28,800 +cài đặt nó. Bây giờ, một trong + +8 +00:00:28,800 --> 00:00:33,800 +những thứ hữu ích nhất để có được ban ngày là ngày và giờ hiện tại. + +9 +00:00:35,820 --> 00:00:40,820 +Và bạn có thể viết mã Python để lấy nó từ máy tính. Bên trong mô-đun thời gian ngày này, + +10 +00:00:40,950 --> 00:00:41,783 +có một + +11 +00:00:41,790 --> 00:00:46,770 +lớp được gọi là datetime như được biểu thị bằng chữ c ở đây. + +12 +00:00:47,610 --> 00:00:51,870 +Và đây là cách bạn đến lớp đó. Vì vậy, để đến + +13 +00:00:51,900 --> 00:00:54,540 +lớp đó, bạn nhấn vào mô-đun datetime + +14 +00:00:55,050 --> 00:00:57,900 +và sau đó bạn vào lớp datetime. + +15 +00:00:58,380 --> 00:01:00,210 +Bây giờ điều này thực sự khó hiểu. + +16 +00:01:00,240 --> 00:01:05,239 +Vì vậy, tôi muốn đổi tên mô-đun datetime và đặt tên cho nó để chúng tôi có thể rút ngắn + +17 +00:01:07,020 --> 00:01:08,370 +nó xuống chỉ còn dt. + +18 +00:01:09,180 --> 00:01:12,300 +Và theo cách đó chúng ta có thể nói dt. datetime và điều đó trông + +19 +00:01:12,480 --> 00:01:16,920 +dễ hiểu hơn một chút so với trước đây. Không, bên trong lớp datetime + +20 +00:01:16,950 --> 00:01:21,330 +này, có một phương thức được gọi là now, và điều + +21 +00:01:21,960 --> 00:01:25,590 +này cho bạn biết ngày và giờ hiện tại. + +22 +00:01:26,070 --> 00:01:30,810 +Vì vậy, nếu chúng tôi lưu nó vào một biến có tên là now, và chúng tôi tiếp + +23 +00:01:30,840 --> 00:01:33,270 +tục và in ngay bây giờ, sau đó khi tôi + +24 +00:01:33,300 --> 00:01:38,070 +chạy mã này, bạn có thể thấy nó in ra một chuỗi rất dài hiển thị cho bạn + +25 +00:01:38,100 --> 00:01:38,850 +năm, tháng, + +26 +00:01:38,850 --> 00:01:43,850 +ngày hiện tại cũng như thời gian trong múi giờ địa phương của tôi với mức độ chính xác + +27 +00:01:44,520 --> 00:01:45,353 +cao ở đây. + +28 +00:01:46,880 --> 00:01:49,700 +Làm việc với chuỗi cụ thể đó không phải là rất dễ dàng. + +29 +00:01:49,730 --> 00:01:54,730 +Nếu bạn muốn kiểm tra một cái gì đó như bây giờ là năm 2020, thì bạn không thể + +30 +00:01:56,810 --> 00:02:00,110 +thực sự làm điều đó chỉ với một chuỗi như vậy. + +31 +00:02:00,740 --> 00:02:03,530 +Đó là lý do tại sao khi bạn đã lấy đối + +32 +00:02:03,590 --> 00:02:08,590 +tượng now ra khỏi phương thức này vì phương thức này tất nhiên sẽ trả về và nó được lưu bên + +33 +00:02:09,770 --> 00:02:13,760 +trong đây, sau đó chúng ta có thể khai thác một số thuộc tính của nó. + +34 +00:02:13,940 --> 00:02:17,330 +Vì vậy, chẳng hạn, chúng ta có thể khai thác năm. + +35 +00:02:18,440 --> 00:02:22,610 +Vì vậy, chúng ta hãy tiết kiệm mà có năm. Và nếu tôi in nó, bạn có thể + +36 +00:02:22,610 --> 00:02:26,000 +thấy nó chỉ cung cấp cho chúng ta năm dưới dạng một con số. + +37 +00:02:26,780 --> 00:02:29,210 +Và nếu tôi kiểm tra kiểu trên + +38 +00:02:29,750 --> 00:02:32,720 +đó, bạn có thể thấy rằng nó có một lớp + +39 +00:02:33,350 --> 00:02:36,020 +số nguyên trong khi nếu tôi kiểm tra + +40 +00:02:36,230 --> 00:02:39,350 +kiểu bây giờ thì nó có một lớp đối tượng datetime. + +41 +00:02:40,580 --> 00:02:45,290 +Vì vậy, theo cách này, nếu chúng ta cố gắng nắm được năm dưới dạng một con số, + +42 +00:02:45,320 --> 00:02:46,970 +thì chúng ta có thể + +43 +00:02:46,970 --> 00:02:50,960 +nói điều gì đó như, nếu năm hiện tại bằng năm 2020, thì chúng ta + +44 +00:02:51,350 --> 00:02:53,630 +sẽ in ra một cái gì đó như + +45 +00:02:55,670 --> 00:03:00,310 +thế nào, và bởi vì điều này xảy ra là đúng, sau đó nó được in ra. + +46 +00:03:01,180 --> 00:03:06,010 +Ngoài năm, chúng ta còn có tháng, + +47 +00:03:06,190 --> 00:03:10,930 +ngày, giờ, phút. Vì vậy, về cơ bản bạn có thể khai thác bất kỳ thứ gì trong + +48 +00:03:10,930 --> 00:03:14,800 +chuỗi ngày giờ đó khi bạn cần. Vì vậy, khi bạn viết 'bây giờ. 'bạn có + +49 +00:03:14,800 --> 00:03:19,690 +thể thấy rằng có năm, ngày, tháng, giờ, phút, micro giây, giây + +50 +00:03:19,720 --> 00:03:22,000 +và bạn có thể đi + +51 +00:03:22,450 --> 00:03:26,530 +đến phần cụ thể của ngày giờ mà bạn cần. + +52 +00:03:27,160 --> 00:03:31,510 +Bạn thậm chí có thể gọi các phương thức khác như ngày trong tuần. Ví dụ: nếu chúng ta muốn biết + +53 +00:03:33,220 --> 00:03:37,870 +đó là ngày nào trong tuần, vậy là Thứ Hai, Thứ Ba, Thứ Tư, thì chúng ta có + +54 +00:03:38,170 --> 00:03:42,460 +thể chỉ cần nhấn vào ngay bây giờ và gọi phương thức ngày trong tuần này. + +55 +00:03:43,270 --> 00:03:46,390 +Và bây giờ nếu chúng ta in ra ngày này trong tuần, bạn + +56 +00:03:46,420 --> 00:03:49,210 +có thể thấy rằng nó cho chúng ta một con số. + +57 +00:03:49,600 --> 00:03:54,310 +Vì vậy, hãy nhớ rằng máy tính bắt đầu đếm từ 0 đến 1 có nghĩa là + +58 +00:03:54,340 --> 00:03:57,850 +ngày thứ hai trong tuần, là ngày thứ Ba như bạn có thể + +59 +00:03:57,880 --> 00:03:58,930 +thấy ở đây. + +60 +00:04:00,280 --> 00:04:04,540 +Vì vậy, chúng tôi đã thấy cách chúng tôi có thể nắm bắt ngày, năm, tháng + +61 +00:04:04,540 --> 00:04:08,680 +hiện tại và bất kỳ tài sản nào bạn quan tâm cho ngày hôm nay. + +62 +00:04:09,040 --> 00:04:14,040 +Nhưng điều gì sẽ xảy ra nếu chúng ta muốn tạo một đối tượng ban ngày của riêng chúng ta, đặt nó vào một + +63 +00:04:14,800 --> 00:04:17,740 +ngày cụ thể mà chúng ta chọn? Vâng, giả sử + +64 +00:04:17,769 --> 00:04:22,770 +rằng tôi muốn tạo một đối tượng lưu trữ ngày sinh của tôi. + +65 +00:04:25,390 --> 00:04:30,390 +Sau đó, tôi sẽ khai thác vào mô-đun dt và tạo một đối tượng + +66 +00:04:31,300 --> 00:04:35,080 +datetime mới từ lớp đó. Bây giờ tôi phải xác định, + +67 +00:04:35,080 --> 00:04:38,770 +tốt, năm là gì? Tháng là gì? + +68 +00:04:39,250 --> 00:04:41,200 +Là ngày gì? + +69 +00:04:41,830 --> 00:04:46,830 +Và tôi thậm chí có thể đi cụ thể hơn như tôi sinh vào giờ nào? + +70 +00:04:48,190 --> 00:04:52,750 +Và bạn sẽ nhận thấy rằng ở đây, khi bạn nhìn vào các tham số, năm yêu + +71 +00:04:53,140 --> 00:04:55,300 +cầu một số nguyên, tháng yêu cầu + +72 +00:04:55,360 --> 00:04:58,390 +một số xen kẽ và ngày yêu cầu một số nguyên. + +73 +00:04:58,780 --> 00:05:03,730 +Nhưng sau một giờ, chúng tôi có cái này ... cũng như phút và giây và điều này là + +74 +00:05:04,060 --> 00:05:07,960 +do chúng có giá trị mặc định. Vì vậy, nếu tôi xóa điều này, + +75 +00:05:09,790 --> 00:05:14,790 +những thứ duy nhất tôi cần cung cấp khi tạo một đối tượng datetime mới là năm, + +76 +00:05:15,490 --> 00:05:16,570 +tháng và ngày. + +77 +00:05:17,260 --> 00:05:22,260 +Giả sử rằng tôi sinh năm 1995 và tôi sinh vào ngày 15 tháng 12. + +78 +00:05:26,880 --> 00:05:27,713 +1: Được rồi. + +79 +00:05:30,300 --> 00:05:30,840 +0: + +80 +00:05:30,840 --> 00:05:35,840 +Bây giờ, nếu tôi in đối tượng ngày tháng năm sinh này, bạn có thể thấy rằng chúng tôi + +81 +00:05:38,190 --> 00:05:39,690 +nhận được 1995, 12, 15 và + +82 +00:05:40,080 --> 00:05:45,080 +thời gian tính theo giờ, phút và giây được đặt thành các giá trị mặc định bằng 0. + +83 +00:05:46,890 --> 00:05:51,030 +Nếu tôi muốn cụ thể hơn và tôi muốn đặt giờ sinh của mình, + +84 +00:05:51,060 --> 00:05:53,520 +giả sử tôi sinh lúc 4:00 sáng, + +85 +00:05:53,970 --> 00:05:58,700 +sau đó chúng tôi có thể đặt giờ và cập nhật giá trị mặc định đó. + +86 +00:05:59,450 --> 00:06:04,450 +Vì vậy, bây giờ chúng ta đã thấy cách chúng ta có thể khai + +87 +00:06:05,210 --> 00:06:07,150 +thác ngày giờ hiện tại + +88 +00:06:07,510 --> 00:06:12,310 +và cũng có thể tạo bất kỳ đối tượng datetime nào từ đầu. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 101-Monday-Motivational-Quotes-from-the-Positivity-Blog.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 101-Monday-Motivational-Quotes-from-the-Positivity-Blog.url new file mode 100644 index 0000000000000000000000000000000000000000..8bf6c2f8b2848bfd0929060b1fb8e0a4de1e9b58 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 101-Monday-Motivational-Quotes-from-the-Positivity-Blog.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.positivityblog.com/monday-motivation-quotes/ \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Challenge 1 - Send Motivational Quotes on Mondays via Email.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Challenge 1 - Send Motivational Quotes on Mondays via Email.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cc6b9b64b9e604415d822f0f04728945a09a3c01 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Challenge 1 - Send Motivational Quotes on Mondays via Email.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39245011f8a9bc131e5a528ca4d8492f3b0f84c4cdfafff9658768ff77ac6251 +size 112324226 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Challenge 1 - Send Motivational Quotes on Mondays via Email_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Challenge 1 - Send Motivational Quotes on Mondays via Email_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3dafde5c835a780aabc173c4f41404354a63357b --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Challenge 1 - Send Motivational Quotes on Mondays via Email_vi.srt @@ -0,0 +1,480 @@ +1 +00:00:00,270 --> 00:00:04,740 +Bây giờ, hãy áp dụng những gì bạn đã học được vào thực tế bằng cách tạo một ứng dụng email + +2 +00:00:04,740 --> 00:00:08,700 +báo giá tạo động lực cho Thứ Hai. Để khởi động, chúng tôi + +3 +00:00:08,850 --> 00:00:13,850 +sẽ tạo một ứng dụng xem ngày và giờ hiện tại và nếu đó + +4 +00:00:15,270 --> 00:00:19,260 +là một ngày cụ thể trong tuần, giả sử là thứ + +5 +00:00:19,650 --> 00:00:21,360 +Ba, sau đó chúng + +6 +00:00:21,510 --> 00:00:26,370 +tôi sẽ tự gửi email cho mình một trích dẫn động lực . + +7 +00:00:27,240 --> 00:00:32,240 +Vì vậy, tôi đã tìm thấy 101 động lực vào Thứ Hai! bình chọn từ một nơi được gọi là blog + +8 +00:00:33,090 --> 00:00:35,910 +tích cực và tôi cũng sẽ liên kết đến trang này. + +9 +00:00:36,240 --> 00:00:41,190 +Nhưng ý tưởng là tất cả chúng ta cần một chút khởi sắc vào sáng thứ Hai và nhận + +10 +00:00:41,190 --> 00:00:45,510 +được email từ Albert Einstein có thể chỉ là một động lực nhỏ mà chúng ta + +11 +00:00:45,510 --> 00:00:48,870 +cần để thúc đẩy chúng ta có một tuần thành công. + +12 +00:00:49,350 --> 00:00:50,550 +Vì vậy, đó là ý tưởng. + +13 +00:00:51,000 --> 00:00:55,590 +Và nếu bạn nhìn vào dự án bắt đầu mà bạn đã tải xuống và mở ra, đó + +14 +00:00:55,590 --> 00:00:58,980 +sẽ là một dấu ngoặc kép. tệp txt. + +15 +00:00:59,580 --> 00:01:02,010 +Và ở đây trên mỗi dòng, + +16 +00:01:02,070 --> 00:01:05,880 +tôi đã đặt câu trích dẫn từ blog tích cực, + +17 +00:01:06,270 --> 00:01:10,950 +và nó có câu trích dẫn và con người trên cùng một dòng. + +18 +00:01:11,580 --> 00:01:16,470 +Vì vậy, bạn có thể sử dụng những gì bạn đã học trước khi chúng ta đi vào + +19 +00:01:16,470 --> 00:01:17,430 +cách đọc tệp, + +20 +00:01:17,730 --> 00:01:22,730 +cách mở tệp, cách tạo danh sách tất cả các dòng bên trong một tệp văn bản cụ thể. + +21 +00:01:25,410 --> 00:01:30,410 +Và bạn có thể sử dụng điều đó cùng với những gì bạn đã học về cách gửi email để + +22 +00:01:30,750 --> 00:01:35,750 +kiểm tra và đảm bảo rằng ngày trong tuần là ngày hiện tại trong tuần của bạn vì rõ + +23 +00:01:36,420 --> 00:01:40,440 +ràng bạn cần kiểm tra điều này. Thay vì đặt nó để kiểm tra cho + +24 +00:01:40,440 --> 00:01:43,770 +Thứ Hai, tôi muốn bạn kiểm tra ngày hiện tại mà bạn đang ở. + +25 +00:01:44,190 --> 00:01:47,580 +Vì vậy, nếu nó xảy ra là thứ Ba, thì hãy kiểm tra thứ + +26 +00:01:47,580 --> 00:01:51,600 +Ba, nếu là thứ Bảy, thì hãy kiểm tra thứ Bảy và tôi muốn mã Python của + +27 +00:01:51,990 --> 00:01:54,840 +bạn thực hiện kiểm tra đó và nếu nó khớp + +28 +00:01:55,170 --> 00:01:59,940 +với ngày hôm nay trong tuần, thì hãy gửi email với một trích dẫn ngẫu nhiên từ dấu ngoặc kép. txt. Đó là mục tiêu. + +29 +00:01:59,940 --> 00:02:02,010 +Vì vậy, tôi muốn bạn tạm dừng video và thử xem. + +30 +00:02:02,340 --> 00:02:05,100 +1: Vâng. + +31 +00:02:11,450 --> 00:02:11,900 +0: Được rồi. Vì + +32 +00:02:11,900 --> 00:02:15,170 +vậy, để hoàn thành dự án nhỏ + +33 +00:02:15,200 --> 00:02:19,910 +này, trước tiên chúng ta phải nhập hai mô-đun mà chúng ta đã học về; smtplib và cả mô-đun ngày giờ. Và một lần nữa, tôi sẽ nhập nó dưới dạng dt, vì vậy hãy đặt + +34 +00:02:20,210 --> 00:02:23,510 +cho nó một bí danh. Tiếp theo, chúng ta + +35 +00:02:23,540 --> 00:02:27,950 +sẽ khai thác vào mô-đun dt + +36 +00:02:28,010 --> 00:02:32,750 +và chúng ta sẽ nhận được ngày và giờ của ngày hôm nay. Vì vậy, chúng ta sẽ sử dụng phương pháp này ngay bây giờ. + +37 +00:02:32,750 --> 00:02:35,750 +Nếu bây giờ bằng với điều này, + +38 +00:02:36,380 --> 00:02:38,540 +thì hôm nay trong ngày trong tuần bằng với bây giờ. ngày trong tuần. + +39 +00:02:38,930 --> 00:02:43,930 +Và một khi chúng tôi đã nắm được + +40 +00:02:45,830 --> 00:02:49,190 +điều đó, thì chúng tôi có thể kiểm tra tốt, nếu ngày + +41 +00:02:49,220 --> 00:02:53,000 +trong tuần bằng với thứ Hai, tức là thứ hai sẽ bằng 0, + +42 +00:02:53,060 --> 00:02:54,500 +thì điều đó có + +43 +00:02:55,040 --> 00:03:00,040 +nghĩa là chúng tôi sẽ kích hoạt phần còn lại của mã và gửi email cho chính mình. Nhưng tất nhiên, để kiểm tra mã của chúng tôi, trừ khi bạn có đủ kiên nhẫn + +44 +00:03:00,190 --> 00:03:03,820 +để đợi đến thứ Hai tới + +45 +00:03:04,150 --> 00:03:08,920 +và kiểm tra mã của mình mỗi tuần một lần, thì chúng tôi có thể muốn + +46 +00:03:08,920 --> 00:03:09,730 +đặt giá + +47 +00:03:09,730 --> 00:03:14,200 +trị này bằng với ngày trong tuần mà chúng tôi đang làm hôm nay. Vì vậy, trong trường hợp của tôi, tôi đang ở thứ Ba nên tôi sẽ đặt giá trị đó bằng 1, ít + +48 +00:03:14,200 --> 00:03:18,700 +nhất là trong khi tôi đang kiểm tra mã của mình. Và khi tôi đã hoàn thành mọi thứ, tôi có thể + +49 +00:03:19,000 --> 00:03:22,390 +đặt lại về 0 cho Thứ Hai. + +50 +00:03:22,420 --> 00:03:24,820 +Nếu ngày trong tuần bằng 1, thì chúng + +51 +00:03:25,750 --> 00:03:28,540 +tôi sẽ bắt đầu sứ mệnh gửi email của mình. + +52 +00:03:29,020 --> 00:03:32,260 +Nhưng trước tiên chúng ta phải tìm ra những gì chúng ta sẽ gửi. + +53 +00:03:32,860 --> 00:03:36,010 +Vì vậy, chúng tôi sẽ mở ra các báo giá của chúng tôi. txt và tôi sẽ sử dụng with và sau đó tôi sẽ sử + +54 +00:03:36,520 --> 00:03:41,520 +dụng phương thức open để mở dấu ngoặc kép. tệp txt mà tôi + +55 +00:03:42,310 --> 00:03:47,310 +có ngay tại đây. + +56 +00:03:48,550 --> 00:03:49,510 +Và tôi sẽ gọi đây là quote_file. Bên cạnh quote_file này, tôi + +57 +00:03:49,900 --> 00:03:54,900 +có một loạt các dấu ngoặc kép, mỗi dấu ngoặc kép trên mỗi dòng. + +58 +00:03:55,600 --> 00:03:59,500 +Vì vậy, chúng ta có thể sử dụng phương thức được gọi là readlines + +59 +00:03:59,920 --> 00:04:04,920 +để lấy danh sách tất cả các dòng trong quote_file này và tôi sẽ lưu nó vào all_quotes. + +60 +00:04:07,630 --> 00:04:11,380 +Bây giờ chúng ta có thể nhập mô-đun ngẫu nhiên và chúng ta có thể khai thác một báo giá ngẫu nhiên. + +61 +00:04:12,280 --> 00:04:17,279 +Vì vậy, chúng tôi sẽ sử dụng ngẫu nhiên. lựa chọn và chúng tôi sẽ nhận được một báo giá ngẫu nhiên từ + +62 +00:04:20,200 --> 00:04:25,200 +danh sách các báo giá này. + +63 +00:04:26,890 --> 00:04:27,723 +Bây giờ chúng + +64 +00:04:28,840 --> 00:04:32,800 +tôi đã tạo báo giá của chúng tôi bên trong này với khối, chúng tôi thực sự có + +65 +00:04:33,040 --> 00:04:37,360 +thể đi ra bên ngoài với khối và chúng tôi vẫn có thể truy cập báo giá của mình. Vì vậy, nếu tôi tiếp tục và in báo giá của chúng tôi, bạn có thể thấy chúng tôi đã + +66 +00:04:37,360 --> 00:04:40,630 +chọn ra một báo giá ngẫu nhiên. Nếu bạn muốn thực hiện một công việc dễ dàng + +67 +00:04:40,870 --> 00:04:44,590 +có vẻ khó, hãy tiếp tục thực hiện nó bởi Olin Miller. + +68 +00:04:44,590 --> 00:04:48,730 +Và đây là những gì chúng tôi sẽ thử và gửi cho chính mình bằng cách sử dụng smtplib. + +69 +00:04:49,300 --> 00:04:54,300 +Một lần nữa, bên trong cùng một câu lệnh if, chúng ta sẽ + +70 +00:04:55,120 --> 00:05:00,040 +tạo một kết nối mới được tạo từ smtplib và lớp SMTP. + +71 +00:05:00,460 --> 00:05:05,460 +Bây giờ, khi chúng ta tạo lớp này, chúng ta phải cung cấp một máy chủ lưu trữ. + +72 +00:05:06,160 --> 00:05:10,390 +Vì vậy, đó là URL của máy chủ email mà chúng tôi sẽ sử dụng. + +73 +00:05:10,630 --> 00:05:14,800 +Một lần nữa, tôi sẽ sử dụng email của mình + +74 +00:05:15,370 --> 00:05:19,870 +làm Gmail thử nghiệm của tôi, đó là appbreweryinfo @ gmail. com. + +75 +00:05:20,230 --> 00:05:25,230 +Và sau đó tôi sẽ nhập mật khẩu + +76 +00:05:26,080 --> 00:05:31,080 +của mình cũng như một hằng số để đây là abcd1234, sau đó là dấu ngoặc. + +77 +00:05:31,720 --> 00:05:35,770 +Và sau đó chúng tôi có thể thêm URL SMTP của mình. Vì chúng tôi biết rằng chúng tôi đang gửi nó từ dịch vụ email Gmail nên + +78 +00:05:36,550 --> 00:05:41,550 +tôi sẽ truy cập vào máy chủ SMTP của Gmail + +79 +00:05:42,820 --> 00:05:44,200 +để đó là smtp. gmail. com. + +80 +00:05:44,530 --> 00:05:49,530 +Và thay vì lưu nó dưới dạng + +81 +00:05:53,230 --> 00:05:56,200 +kết nối, tôi sẽ sử dụng phương thức width với SMTP làm kết nối. + +82 +00:05:56,260 --> 00:06:01,260 +Sau đó, bằng cách sử dụng kết nối này, trước tiên tôi sẽ bảo mật nó. + +83 +00:06:03,230 --> 00:06:07,900 +Vì vậy, tôi sẽ bắt đầu và sau đó tôi sẽ nhận được kết + +84 +00:06:08,230 --> 00:06:11,050 +nối này để đăng nhập cho tôi. + +85 +00:06:11,740 --> 00:06:15,640 +Vì vậy, tên người dùng là email của tôi và mật khẩu là mật khẩu của tôi. + +86 +00:06:16,180 --> 00:06:21,180 +Khi tôi đã đăng nhập vào kết nối này, rồi cuối cùng + +87 +00:06:23,830 --> 00:06:26,560 +tôi sẽ gửi email của mình. Bây giờ, trong trường hợp này, địa chỉ + +88 +00:06:26,590 --> 00:06:31,150 +từ sẽ là email của + +89 +00:06:31,180 --> 00:06:34,570 +tôi và địa chỉ đến cũng là email của tôi. + +90 +00:06:35,050 --> 00:06:38,350 +Tôi chỉ đang gửi một email từ chính tôi cho chính mình, nhưng nó + +91 +00:06:38,350 --> 00:06:41,230 +sẽ có một phần nội dung khác nhau mỗi khi nó gửi. + +92 +00:06:41,590 --> 00:06:44,770 +Và tin nhắn đó sẽ chứa nội dung đó. + +93 +00:06:45,370 --> 00:06:49,690 +Vì vậy, tôi sẽ thay đổi điều này thành một chuỗi f vì trước tiên, tôi muốn + +94 +00:06:50,200 --> 00:06:53,770 +có một chủ đề mà tôi sẽ gọi là Động lực Thứ Hai và + +95 +00:06:53,770 --> 00:06:58,570 +sau đó chúng tôi biết rằng chúng tôi có thể thêm nội dung bằng cách thêm hai dấu ngắt dòng. + +96 +00:06:59,080 --> 00:07:04,080 +Vì vậy, hãy định dạng nó để bạn dễ nhìn hơn. + +97 +00:07:05,260 --> 00:07:09,010 +Và tôi sẽ đặt nó trên hai dòng riêng biệt như thế này. + +98 +00:07:10,570 --> 00:07:13,270 +Bây giờ sau khi hai dòng mới này xuất hiện, + +99 +00:07:13,870 --> 00:07:17,260 +nội dung của tôi về cơ bản sẽ là chuỗi f của tôi + +100 +00:07:17,560 --> 00:07:20,200 +sẽ chèn trích dẫn của tôi ngay tại đây. + +101 +00:07:20,240 --> 00:07:23,140 +Vì vậy, bây giờ với tất cả những điều đó đã hoàn + +102 +00:07:23,800 --> 00:07:28,800 +thành và đảm bảo rằng ngày trong tuần của chúng ta được đặt giống ngày hôm nay, vì vậy ngày + +103 +00:07:29,230 --> 00:07:31,420 +trong tuần == 1, tức là thứ Ba. ngày trong tuần == 0 có nghĩa là thứ Hai. + +104 +00:07:31,450 --> 00:07:35,440 +Sau đó, chúng ta có thể chắc chắn rằng mã này thực sự sẽ chạy. + +105 +00:07:35,860 --> 00:07:39,490 +Vì vậy, bây giờ nếu chúng tôi chạy mã của mình, bạn có thể thấy trích + +106 +00:07:40,390 --> 00:07:42,700 +dẫn được in ra tại đây bởi Bertrand Russell. + +107 +00:07:42,850 --> 00:07:47,850 +Và nếu chúng tôi truy cập email của chúng tôi, bạn có thể thấy + +108 +00:07:48,490 --> 00:07:50,740 +email đó từ chính chúng tôi. Thứ hai động lực. + +109 +00:07:50,770 --> 00:07:54,520 +Một trong những triệu chứng của suy nhược thần + +110 +00:07:54,910 --> 00:07:58,360 +kinh đang đến gần là niềm tin rằng công việc của một người là vô cùng quan trọng. + +111 +00:07:58,360 --> 00:07:59,950 +Vì vậy, tôi đoán động lực của ngày hôm nay là không quá coi trọng bản thân. + +112 +00:08:00,310 --> 00:08:04,390 +Nhưng về cơ bản đây là những gì chúng tôi đang tìm cách đạt được. + +113 +00:08:05,110 --> 00:08:08,650 +Vì vậy, hy vọng bạn quản lý để làm cho nó hoạt động. Nếu không, bạn có thể xem mã đã hoàn thành của tôi bao gồm + +114 +00:08:09,190 --> 00:08:12,220 +tất cả các hành + +115 +00:08:12,280 --> 00:08:14,350 +động trước đó trên smtplib gửi email cũng + +116 +00:08:14,590 --> 00:08:18,040 +như ngày giờ trong mã kết thúc ngày 32 mà bạn sẽ tìm + +117 +00:08:18,070 --> 00:08:19,990 +thấy trên trang tài nguyên khóa học. + +118 +00:08:19,990 --> 00:08:24,990 +Bây giờ chúng tôi đã sẵn sàng để giải quyết dự án cuối cùng của + +119 +00:08:26,920 --> 00:08:30,070 +mình, đó là dự án sinh nhật tự động. Vì vậy, cho điều đó, và hơn thế nữa, tôi sẽ + +120 +00:08:30,160 --> 00:08:34,900 +gặp bạn trong bài học tiếp theo. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Day-32-Ending-Code.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Day-32-Ending-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..24bceb926e640356583fb4d378961b7aeb15bf43 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Day-32-Ending-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-32-end#main.py \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Day-32-Starting-Code.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Day-32-Starting-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..a544a00f3e15d50e2a9d0edffb341604f07420d4 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/005 Day-32-Starting-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/day-32-start?v=1 \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 Automated Birthday Wisher Project Challenge.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 Automated Birthday Wisher Project Challenge.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4316754965809b0c289135fe1da5773863750319 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 Automated Birthday Wisher Project Challenge.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ea702ecb52bb9bc7712be8fdc91fc09003ccfae03d8eb2c66cce1f203407a38 +size 38065486 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 Automated Birthday Wisher Project Challenge_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 Automated Birthday Wisher Project Challenge_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d12bdb0e85adbdfb1c5d4a9fe24dce88ba4e0c4e --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 Automated Birthday Wisher Project Challenge_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:00,420 --> 00:00:05,420 +Giờ đây, cuối cùng đã đến lúc sử dụng tất cả các kỹ năng của chúng tôi bằng cách + +2 +00:00:05,850 --> 00:00:06,870 +tạo ứng dụng + +3 +00:00:07,200 --> 00:00:10,920 +thông minh sinh nhật tự động sẽ tự động gửi cho gia đình hoặc + +4 +00:00:11,340 --> 00:00:15,660 +bạn bè của chúng tôi email "Chúc mừng sinh nhật" vào ngày sinh nhật của họ. + +5 +00:00:15,960 --> 00:00:20,970 +Bây giờ ý tưởng cho dự án này thực sự đến từ mẹ tôi. Chà, vô tình. + +6 +00:00:21,360 --> 00:00:25,350 +Bây giờ tôi yêu mẹ tôi đến chết và bà là nguồn động lực và + +7 +00:00:25,380 --> 00:00:28,590 +cảm hứng lớn nhất của tôi. Nhưng vào ngày sinh nhật + +8 +00:00:28,830 --> 00:00:33,830 +của cô ấy, cô ấy luôn mong tôi gửi cho cô ấy một vài hình thức "Chúc mừng + +9 +00:00:37,710 --> 00:00:38,120 +sinh + +10 +00:00:38,120 --> 00:00:42,380 +nhật" trước 8 giờ sáng Và nếu tôi gửi cho cô ấy một tin nhắn + +11 +00:00:42,380 --> 00:00:44,600 +vào lúc, 8:05 hoặc 9 giờ, thì xin + +12 +00:00:44,630 --> 00:00:47,900 +Chúa cấm. Tôi bị coi là * đứa trẻ hư *. + +13 +00:00:48,350 --> 00:00:51,470 +Tôi không biết điều này có đúng với bạn không. Ừm, có thể những đứa + +14 +00:00:51,530 --> 00:00:55,010 +trẻ châu Á khác ngoài kia cũng có thể liên tưởng, + +15 +00:00:55,040 --> 00:01:00,040 +nhưng mẹ tôi có điều này là được chúc "sinh nhật vui vẻ" ngay trong ngày + +16 +00:01:00,170 --> 00:01:02,870 +sinh nhật của bà. Và bạn biết đấy, tôi luôn + +17 +00:01:02,870 --> 00:01:07,790 +nhớ sinh nhật của cô ấy, nhưng tôi có thể chỉ nhớ nó vào lúc 10 giờ hoặc, bạn biết đấy, vào giờ ăn trưa. + +18 +00:01:07,820 --> 00:01:12,080 +Và tôi luôn luôn hoảng sợ, ừm, nghĩ rằng tôi đã + +19 +00:01:12,110 --> 00:01:16,580 +quên hoặc bỏ lỡ khoảng thời gian quan trọng tám giờ sáng. + +20 +00:01:17,180 --> 00:01:19,130 +1: Vậy tôi đã quyết định làm gì? + +21 +00:01:19,160 --> 00:01:19,700 +0: Ừm, + +22 +00:01:19,700 --> 00:01:24,700 +tôi quyết định sử dụng Python để tạo ra một cách tự động để chúc cô ấy sinh nhật vui vẻ lúc 8:00 sáng + +23 +00:01:25,280 --> 00:01:30,280 +ngay tại chỗ hoặc thậm chí bảy giờ hoặc năm giờ. Bằng cách đó, cô ấy sẽ nghĩ rằng tôi thức + +24 +00:01:31,640 --> 00:01:33,830 +dậy thật sớm và 1: Tôi đang làm + +25 +00:01:34,310 --> 00:01:38,300 +việc rất chăm chỉ trong cuộc sống. Nhưng 0: hãy để tôi chứng minh cho + +26 +00:01:38,630 --> 00:01:43,610 +bạn thấy ứng dụng này sẽ làm được những gì. Đây là bản demo sinh nhật khôn ngoan hơn và + +27 +00:01:43,610 --> 00:01:44,510 +tôi sẽ không + +28 +00:01:44,630 --> 00:01:48,500 +cho bạn thấy mã trong chính của tôi. py vì đó là những gì + +29 +00:01:48,500 --> 00:01:49,640 +bạn sẽ tạo. + +30 +00:01:50,120 --> 00:01:55,100 +Nhưng những gì tôi có ở đây là một tệp CSV được gọi là sinh nhật. csv. + +31 +00:01:56,240 --> 00:02:01,220 +Bây giờ, ở đây, tôi sẽ thay đổi một trong những hàng dữ liệu này để kiểm tra nó. + +32 +00:02:01,610 --> 00:02:05,570 +Và tôi sẽ thay đổi tháng thành tháng hiện tại + +33 +00:02:05,600 --> 00:02:09,889 +là tháng 7 và ngày thành ngày hiện tại, có 14. + +34 +00:02:10,009 --> 00:02:11,210 +Vì vậy, tôi sẽ + +35 +00:02:11,450 --> 00:02:16,450 +thay đổi điều này tương ứng với cột dữ liệu này thành 7 và sau đó ngày thành 14. + +36 +00:02:18,350 --> 00:02:21,410 +Và sau đó tôi sẽ nhấn lưu để lưu dữ liệu đó. + +37 +00:02:21,980 --> 00:02:24,560 +Và bây giờ tôi sẽ chạy mã này và những + +38 +00:02:24,920 --> 00:02:29,920 +gì nó sẽ làm là nó sẽ kiểm tra tất cả những ngày này trong ngày sinh của + +39 +00:02:30,530 --> 00:02:31,580 +tôi. csv, + +40 +00:02:31,910 --> 00:02:36,910 +nó sẽ thấy rằng một trong những hàng dữ liệu này thực sự có tháng và ngày khớp + +41 +00:02:36,980 --> 00:02:38,150 +với ngày hôm nay. + +42 +00:02:38,540 --> 00:02:43,540 +Và nó sẽ chọn một chữ cái ngẫu nhiên từ một trong các tệp văn + +43 +00:02:44,300 --> 00:02:44,840 +bản + +44 +00:02:44,840 --> 00:02:49,840 +này và thay thế trình giữ chỗ tên này bằng tên của hàng dữ liệu + +45 +00:02:50,450 --> 00:02:55,010 +thực sự khớp với ngày hôm nay. Và sau đó nó sẽ gửi nó dưới dạng một email đến email này. + +46 +00:02:55,700 --> 00:02:58,040 +Vì vậy, bây giờ nếu tôi tiếp tục + +47 +00:02:58,870 --> 00:03:03,610 +và nhấn run, và khi quá trình đó hoàn tất, chúng tôi có thể kiểm tra email của mình. + +48 +00:03:05,650 --> 00:03:10,650 +Và bạn có thể thấy email đó hiển thị ở đây với dòng tiêu đề Chúc mừng sinh nhật! và nó đã thay thế tên của người có ngày sinh của nó ngay tại đây + +49 +00:03:11,200 --> 00:03:16,200 +bên trong trình giữ chỗ tên đó, nó đã gửi phần còn lại của tin + +50 +00:03:18,040 --> 00:03:21,760 +nhắn và tất cả điều này được thực hiện tự động. Như bạn có thể tưởng tượng, nếu tôi thay đổi điều này trở lại một + +51 +00:03:22,120 --> 00:03:26,560 +ngày ngẫu nhiên, nếu mã của chúng tôi + +52 +00:03:26,560 --> 00:03:29,140 +chạy trong nền mỗi ngày, hãy kiểm tra xem liệu + +53 +00:03:29,620 --> 00:03:32,740 +ngày hôm nay có khớp với một trong những ngày này hay + +54 +00:03:33,010 --> 00:03:36,790 +không, sau đó là ngày thực sự khớp hoặc vào ngày sinh nhật của họ, + +55 +00:03:36,970 --> 00:03:40,390 +nó sẽ chọn ra tên của họ, chèn nó vào một trong những + +56 +00:03:40,660 --> 00:03:44,500 +chữ cái này một cách ngẫu nhiên, và sau đó gửi cho họ dưới dạng email. + +57 +00:03:44,860 --> 00:03:46,780 +Và lý do tại sao + +58 +00:03:47,260 --> 00:03:50,710 +chúng ta có ba bức thư chỉ là vì chúng + +59 +00:03:51,310 --> 00:03:56,050 +không thực sự hiểu rằng đó là cùng một bức thư được gửi mỗi năm. + +60 +00:03:56,050 --> 00:03:56,883 +Đạo đức của toàn bộ dự án này thực sự do bạn quyết định. Ừm, tôi không + +61 +00:03:57,640 --> 00:04:01,780 +thực sự làm điều này trong thực tế. Ừm, tôi chỉ sống với việc bị nói + +62 +00:04:01,840 --> 00:04:05,200 +rằng tôi là một đứa + +63 +00:04:05,230 --> 00:04:10,230 +trẻ hư bằng cách chúc mẹ tôi sinh nhật vui vẻ lúc 10:00 sáng thay vì 8:00 sáng. Nhưng về mặt Lập trình Python, đây sẽ là một dự án thực sự thú vị + +64 +00:04:10,480 --> 00:04:14,290 +vì nó sẽ sử dụng rất + +65 +00:04:14,320 --> 00:04:18,850 +nhiều thứ mà bạn đã học trước đây như gấu trúc để đọc CSV + +66 +00:04:18,850 --> 00:04:20,470 +hoặc thay thế văn + +67 +00:04:20,470 --> 00:04:24,970 +bản, thực hiện trộn thư, sử dụng các cách được xây dựng bằng Python + +68 +00:04:25,030 --> 00:04:28,150 +mở và đọc tệp, và tất nhiên cả những + +69 +00:04:28,150 --> 00:04:32,530 +gì chúng ta đã học gần đây, đó là mô-đun datetime và smtplib. + +70 +00:04:32,530 --> 00:04:35,260 +Bây giờ dự án bắt đầu, tôi đã chia thành ba cấp độ khó khăn. + +71 +00:04:36,460 --> 00:04:41,020 +Vì vậy, tùy thuộc vào mức độ thoải mái của bạn với những điều bạn đã + +72 +00:04:41,380 --> 00:04:46,180 +học được trong tất cả 32 ngày này, bạn có thể chọn cấp độ bắt đầu dự + +73 +00:04:46,180 --> 00:04:47,890 +án mà bạn muốn sử dụng. + +74 +00:04:48,070 --> 00:04:52,660 +Rõ ràng, nếu bạn bắt đầu dự án khởi đầu khó khăn + +75 +00:04:53,200 --> 00:04:57,430 +hơn, nó sẽ không có nhiều gợi ý trong đó. + +76 +00:04:57,730 --> 00:04:59,680 +Nó sẽ cho bạn biết một cách tổng quát + +77 +00:04:59,710 --> 00:05:03,190 +những gì chương trình cần làm và nhiệm vụ của bạn là tìm ra cách thực sự + +78 +00:05:03,310 --> 00:05:08,020 +triển khai nó bằng cách sử dụng tìm kiếm của Google hoặc Stack Overflow hoặc xem qua một số bài học về đường dẫn. + +79 +00:05:08,020 --> 00:05:12,100 +Đây sẽ là phiên bản khó hơn. + +80 +00:05:12,250 --> 00:05:15,340 +Và sau đó là phiên bản khó với một số gợi ý, nhưng không nhiều. + +81 +00:05:15,790 --> 00:05:19,240 +Và có phiên bản bình thường mà tôi đã đưa ra nhiều + +82 +00:05:19,630 --> 00:05:23,650 +gợi ý hơn sẽ giúp bạn viết ra tất cả mã dễ dàng hơn một chút. + +83 +00:05:23,650 --> 00:05:26,560 +Vì vậy, tùy thuộc vào mức độ tự tin của bạn, + +84 +00:05:27,250 --> 00:05:31,600 +hãy xem các tài nguyên của khóa học, xác định mức độ khó khăn cho dự án bắt + +85 +00:05:31,960 --> 00:05:36,010 +đầu của bạn và sau đó tiếp tục và cố gắng hoàn thành dự án này. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-extrahard-start.zip b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-extrahard-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..6fee9d52a7a411f8bd6933881c971280229520ca --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-extrahard-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fb54b33d5d54b57d189859b54e8055d712cea3123489b92033a3ce7da06d7bc +size 1207 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-hard-start.zip b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-hard-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..df935edee88a720317e1f6ae49977644fc8946dd --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-hard-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b70b5accae2c56a5ca9c659e064e22022d25d3bf97a8988d02ccc2c7e6aa6d6 +size 1523 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-normal-start.zip b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-normal-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..a53bf8277f27fa21b26929b59eb5909350dbe040 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/006 birthday-wisher-normal-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afa47d53b0eee8947be616fd421c159d5a22c392f33f4e79c182847a0c7a8006 +size 2020 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution & Walkthrough for the Automated Birthday Wisher.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution & Walkthrough for the Automated Birthday Wisher.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..44ef2c6c8d0e9a7d65d3d4f1193fd3fa2affbb6e --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution & Walkthrough for the Automated Birthday Wisher.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60a4f618927c9bd2f04e114d15fa0056483bb24e74c263d9db5d1c3034e44665 +size 241309782 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution & Walkthrough for the Automated Birthday Wisher_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution & Walkthrough for the Automated Birthday Wisher_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..065d8790ac324360ed34d60fa31fd39c856e02f0 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution & Walkthrough for the Automated Birthday Wisher_vi.srt @@ -0,0 +1,1012 @@ +1 +00:00:00,630 --> 00:00:04,770 +Bây giờ tôi hy vọng bạn đã thực hiện tốt dự án này bởi vì bây giờ tôi sẽ đi + +2 +00:00:04,770 --> 00:00:08,910 +qua giải pháp cho dự án bắt đầu bình thường. Bây giờ, điều quan trọng cần + +3 +00:00:08,940 --> 00:00:13,770 +nhấn mạnh ở đây là nếu bạn đã sử dụng một trong những dự án khởi đầu khó + +4 +00:00:13,770 --> 00:00:16,140 +khăn hoặc dự án khởi đầu khó khăn hơn, + +5 +00:00:16,500 --> 00:00:20,850 +bạn có thể đã kết thúc với một phương pháp khác để làm điều tương tự. + +6 +00:00:21,450 --> 00:00:24,360 +Và tôi thường nhận được các sinh viên hỏi + +7 +00:00:24,360 --> 00:00:26,520 +tôi, đâu là cách làm đúng? + +8 +00:00:26,820 --> 00:00:31,050 +Và đây không thực sự là điều mà bạn nên tập trung vào. Thay vào đó, 1: sử dụng sự + +9 +00:00:31,160 --> 00:00:33,950 +sáng tạo của bạn, bạn sử dụng các kỹ năng 0: + +10 +00:00:34,430 --> 00:00:38,090 +và đảm bảo rằng chương trình của bạn làm được những gì bạn muốn. + +11 +00:00:38,510 --> 00:00:40,760 +Không có câu trả lời thực sự đúng. + +12 +00:00:40,880 --> 00:00:45,880 +Nó thực sự phụ thuộc vào sở thích của bạn hoặc thậm chí là những gì bạn biết + +13 +00:00:45,890 --> 00:00:46,670 +cách làm. + +14 +00:00:46,670 --> 00:00:51,500 +Nếu bạn có thể làm cho dự án này hoạt động chỉ bằng kỹ năng của riêng + +15 +00:00:51,500 --> 00:00:55,550 +bạn và một chút Google Googling, một chút Stack Overflow, miễn là bạn + +16 +00:00:55,580 --> 00:01:00,200 +có thể làm cho nó hoạt động, điều quan trọng hơn là cách làm đúng đắn. + +17 +00:01:00,680 --> 00:01:04,129 +Vì vậy, tất cả những điều đó, tôi đang cố gắng nói rằng tôi sẽ tìm ra + +18 +00:01:04,370 --> 00:01:08,870 +giải pháp, nhưng đừng xem đây là giải pháp cuối cùng. Và nếu bạn làm theo cách khác, điều đó hoàn + +19 +00:01:08,900 --> 00:01:13,850 +toàn ổn miễn là nó hoạt động. Được rồi, chúng ta hãy bắt đầu. Vì vậy, ở đây, tôi đã có + +20 +00:01:13,850 --> 00:01:17,420 +những tệp bắt đầu này cho dự án bắt đầu bình thường và tôi + +21 +00:01:17,960 --> 00:01:22,340 +sẽ xem xét từng dòng từng dòng một để tạo dự án sinh nhật cuối cùng của chúng + +22 +00:01:22,400 --> 00:01:23,750 +ta khôn ngoan hơn. + +23 +00:01:24,320 --> 00:01:28,610 +Điều đầu tiên mà hướng dẫn yêu cầu chúng ta phải làm là đi vào ngày sinh nhật này. csv và cập nhật điều này với một số sinh nhật của bạn bè và gia đình của chúng tôi. + +24 +00:01:28,610 --> 00:01:33,610 +Vì vậy, tôi sẽ thay thế tất cả dữ liệu hiện có ở đây và tôi sẽ + +25 +00:01:34,670 --> 00:01:37,100 +thêm một số dữ liệu của riêng mình. Bây giờ, việc chúng ta phải làm để + +26 +00:01:37,550 --> 00:01:41,660 +kiểm tra mã này là đảm + +27 +00:01:41,720 --> 00:01:45,980 +bảo rằng một trong những hàng dữ liệu này thực sự khớp với một + +28 +00:01:45,980 --> 00:01:50,390 +email mà chúng ta có thể truy cập và cả tháng và ngày hôm nay. + +29 +00:01:50,780 --> 00:01:53,330 +Vì vậy, hôm nay là ngày 14 tháng + +30 +00:01:53,840 --> 00:01:56,090 +7 nên tôi sẽ cập nhật hai + +31 +00:01:56,120 --> 00:02:00,140 +con số đó và năm không quan trọng lắm trong trường hợp này. Sau khi làm xong, tôi sẽ nhấn lưu, lệnh + s hoặc chỉ cần truy cập tệp + +32 +00:02:00,140 --> 00:02:02,480 +và lưu tất cả. + +33 +00:02:02,480 --> 00:02:07,340 +Và bạn cũng có thể thấy phím tắt + +34 +00:02:08,270 --> 00:02:13,270 +cho hệ điều hành cụ thể của mình ở đó. Bây giờ, bên trong chính của tôi. py, bây giờ tôi đã hoàn thành bước + +35 +00:02:13,310 --> 00:02:16,490 +này. Vì vậy, tôi sẽ tiếp tục và xóa nó. + +36 +00:02:16,490 --> 00:02:20,300 +Bây giờ, bước 2 là khó nhất. + +37 +00:02:22,220 --> 00:02:24,080 +Và ở đây chúng ta phải + +38 +00:02:24,410 --> 00:02:29,410 +kiểm tra xem ngày hôm nay có khớp với ngày sinh trong CSV sinh nhật hay không. + +39 +00:02:30,170 --> 00:02:31,003 +Điều đầu + +40 +00:02:31,400 --> 00:02:35,540 +tiên tôi sẽ làm là nhập ngày giờ vì điều đó rất quan trọng + +41 +00:02:35,990 --> 00:02:39,830 +để tôi có thể tìm ra ngày hôm nay thực sự là gì. Và trên thực tế, đó là những gì gợi ý mà người ta nói. + +42 +00:02:39,830 --> 00:02:43,880 +Nó cho biết tạo một bộ + +43 +00:02:44,300 --> 00:02:48,530 +giá trị từ tháng và ngày hôm nay bằng cách sử dụng mô-đun datetime. Đây thực chất là những gì chúng tôi muốn tạo ra. + +44 +00:02:48,530 --> 00:02:51,200 +Vì vậy, làm thế nào để chúng ta nắm giữ tháng hôm nay? Chà, chúng ta có thể sử dụng mô-đun + +45 +00:02:51,440 --> 00:02:53,840 +datetime và sau đó là lớp + +46 +00:02:53,870 --> 00:02:57,650 +datetime, sau đó chúng ta có thể gọi ngay bây giờ và chúng ta có thể nắm giữ tháng như thế này. + +47 +00:02:57,710 --> 00:03:02,710 +Bây giờ chúng ta có thể đơn giản hóa điều này theo một số cách. + +48 +00:03:04,870 --> 00:03:07,230 +Chúng ta có thể tạo bí danh cho datetime dưới dạng dt. + +49 +00:03:07,250 --> 00:03:11,680 +Vì vậy, sau đó chúng ta có thể rút ngắn điều này một + +50 +00:03:12,040 --> 00:03:15,610 +chút hoặc bạn có thể rút ngắn nó hơn nữa + +51 +00:03:15,610 --> 00:03:20,610 +chỉ bằng cách nói, từ mô-đun datetime, hãy tiếp tục và chỉ nhập lớp datetime. + +52 +00:03:20,650 --> 00:03:24,220 +Bằng cách đó, bạn thực sự có thể đặt nó thành datetime. bây giờ. tháng. + +53 +00:03:24,790 --> 00:03:29,790 +Sau đó, chúng ta phải nắm bắt + +54 +00:03:31,450 --> 00:03:36,250 +ngày hôm nay để chúng ta có thể sao chép điều này và thay vì lấy tháng, chúng ta có thể lấy ngày. + +55 +00:03:36,310 --> 00:03:38,920 +Vì vậy, bây giờ chúng tôi đã tạo ra ngày hôm nay. Bây giờ tất nhiên bạn có thể chia điều này thành + +56 +00:03:39,640 --> 00:03:44,620 +hai phần nếu bạn thấy nó dễ hiểu hơn. + +57 +00:03:44,620 --> 00:03:46,510 +Bạn có thể nói rằng ngày hôm nay cũng tương đương với ngày giờ. bây giờ, + +58 +00:03:46,840 --> 00:03:51,010 +và sau đó today_tuple + +59 +00:03:51,670 --> 00:03:55,000 +bằng với một tuple ngày nay. tháng, ngày hôm nay. ngày. + +60 +00:03:55,030 --> 00:04:00,030 +Vì vậy, đây là một + +61 +00:04:00,760 --> 00:04:04,600 +biến thể khác và tất nhiên có hàng triệu biến thể ngoài kia. Vì vậy, tôi nghĩ bây giờ chúng ta đã hoàn thành gợi ý 1, vì vậy chúng ta hãy đi và xóa nó. + +62 +00:04:04,600 --> 00:04:08,860 +Bây giờ chúng ta đang ở gợi ý 2. + +63 +00:04:09,340 --> 00:04:10,870 +Chúng tôi sẽ sử dụng gấu trúc để đọc từ CSV sinh nhật. + +64 +00:04:11,050 --> 00:04:14,260 +Vì vậy, chúng tôi sẽ nhập khẩu gấu trúc. Và khi chúng tôi đã nhập tệp đó, chúng tôi + +65 +00:04:14,620 --> 00:04:19,480 +sẽ sử dụng gấu trúc để + +66 +00:04:19,510 --> 00:04:24,510 +đọc CSV và sau đó cung cấp tên tệp của chúng tôi là sinh nhật. csv. + +67 +00:04:25,030 --> 00:04:27,490 +Vì vậy, tôi sẽ lưu nó dưới dạng một biến được gọi là dữ liệu. Và hãy nhớ rằng, + +68 +00:04:28,000 --> 00:04:31,720 +đây là khung dữ liệu gấu trúc + +69 +00:04:31,750 --> 00:04:33,910 +mà chúng ta có thể sử dụng để thực + +70 +00:04:34,420 --> 00:04:39,280 +hiện một số việc, bao gồm cả việc sử dụng các hướng dẫn này để tạo từ điển ngày sinh. + +71 +00:04:39,280 --> 00:04:42,610 +Vì vậy, những gì chúng ta sẽ làm là chúng ta sẽ + +72 +00:04:43,330 --> 00:04:47,530 +tạo ra một cách hiểu từ điển và tôi đã cung cấp mẫu ở đây cho bạn. Vì vậy, bạn có thể sử dụng iterrows đó để + +73 +00:04:48,100 --> 00:04:52,960 +lặp qua khung dữ liệu + +74 +00:04:53,050 --> 00:04:58,050 +của chúng tôi đã được tạo ở đây, vì vậy dữ liệu. iterrows, và sau đó chúng ta sẽ nắm giữ chỉ mục + +75 +00:04:58,480 --> 00:05:00,100 +của + +76 +00:05:00,310 --> 00:05:05,260 +mỗi hàng đó và cả dữ liệu trong mỗi hàng. + +77 +00:05:05,260 --> 00:05:06,160 +Và sau đó, chúng + +78 +00:05:06,760 --> 00:05:11,760 +tôi có thể tạo một từ điển mới với khóa mới và giá trị mới từ tất cả những thứ mà chúng tôi đã lặp lại. + +79 +00:05:12,040 --> 00:05:14,470 +Chìa khóa mới đó sẽ là gì? Chà, nó sẽ trông giống như + +80 +00:05:15,130 --> 00:05:19,450 +thế này, phải không? + +81 +00:05:19,480 --> 00:05:20,313 +Chúng tôi hy vọng tạo ra từ điển ngày sinh này bằng cách sử dụng định dạng cụ thể này. + +82 +00:05:20,590 --> 00:05:25,570 +Bây giờ, khóa sẽ là một bộ giá trị bao gồm tháng sinh nhật + +83 +00:05:26,140 --> 00:05:31,140 +và ngày sinh nhật, vì vậy hãy thay thế khóa mới đó bằng một bộ + +84 +00:05:31,600 --> 00:05:32,433 +giá trị. Và tháng sinh + +85 +00:05:32,830 --> 00:05:37,830 +nhật tất nhiên sẽ đến từ hàng dữ liệu của chúng ta. Vì vậy, chúng ta sẽ nói data_row và sau đó chúng ta có thể sử dụng + +86 +00:05:38,050 --> 00:05:41,710 +dấu ngoặc vuông hoặc chúng ta có thể sử dụng ký + +87 +00:05:42,040 --> 00:05:43,930 +hiệu dấu chấm để nắm giữ dữ liệu trong cột tháng này. + +88 +00:05:43,960 --> 00:05:48,960 +Vì vậy, bạn có thể nói data_row. tháng hoặc dấu ngoặc vuông data_row và sau đó là + +89 +00:05:50,440 --> 00:05:55,440 +tháng, như thế này. Vì vậy, nó hoàn toàn phụ thuộc vào bạn. + +90 +00:05:56,050 --> 00:05:59,540 +Và sau đó, mục tiếp theo trong bộ + +91 +00:06:00,200 --> 00:06:04,790 +giá trị vẫn nằm trong khóa, vì vậy chúng ta vẫn ở trước dấu hai chấm ở đây, sẽ là ngày sinh nhật. + +92 +00:06:04,790 --> 00:06:09,080 +Vì vậy, đó sẽ là data_row và sau đó chúng ta + +93 +00:06:09,110 --> 00:06:10,970 +phải chuyển vào tên + +94 +00:06:11,330 --> 00:06:14,540 +của cột ngày, đó chỉ là từ ngày. + +95 +00:06:14,570 --> 00:06:16,670 +Bây giờ, khi chúng ta đã hoàn thành + +96 +00:06:19,370 --> 00:06:20,600 +việc đó, thì chúng + +97 +00:06:20,720 --> 00:06:25,720 +ta phải cung cấp giá trị cho mỗi cặp giá trị chính này trong từ điển của mình là gì. Chà, những gì chúng tôi thực sự muốn là hàng dữ liệu, vì vậy toàn bộ hàng dữ liệu và chúng tôi + +98 +00:06:26,000 --> 00:06:29,690 +muốn nó trông giống như thế này. + +99 +00:06:29,690 --> 00:06:34,400 +Vì vậy, chúng tôi có bộ giá trị của chúng tôi với tháng và ngày của chúng tôi làm + +100 +00:06:34,430 --> 00:06:37,730 +khóa và sau đó giá trị chỉ là toàn bộ hàng dữ liệu. + +101 +00:06:38,060 --> 00:06:40,820 +Vì vậy, chúng tôi có thể chỉ cần thay thế giá trị này bằng hàng dữ liệu của chúng tôi như thế này. + +102 +00:06:41,270 --> 00:06:46,070 +Bây giờ chúng ta đã hoàn thành khá nhiều việc với phần này và chúng ta có thể xóa + +103 +00:06:46,730 --> 00:06:51,730 +tất cả các bit gợi ý và nhận xét này, đồng thời tôi cũng có thể xóa mã ví dụ này. + +104 +00:06:51,950 --> 00:06:56,420 +Bây giờ chúng ta đã có từ điển ngày sinh của mình, điều tiếp theo chúng ta + +105 +00:06:57,080 --> 00:06:59,300 +muốn làm là chúng ta muốn kiểm + +106 +00:06:59,390 --> 00:07:04,390 +tra xem ngày hôm nay có khớp với ngày sinh nhật trong các ngày sinh nhật hay không. csv. + +107 +00:07:04,490 --> 00:07:06,170 +Vì vậy, bạn muốn + +108 +00:07:06,470 --> 00:07:11,120 +kiểm tra xem tuple này có tồn tại bên trong birthday_dict này không và nếu nó khớp với một trong những ngày và tháng sinh nhật thực tế. + +109 +00:07:11,510 --> 00:07:15,830 +Vì vậy, chúng tôi có thể làm một cái gì đó như thế + +110 +00:07:16,310 --> 00:07:20,720 +này; nếu today_month, today_ day có trong từ điển sinh nhật của chúng tôi. + +111 +00:07:20,720 --> 00:07:23,660 +Bây giờ hôm nay_tháng_ngày_ngày tất + +112 +00:07:24,200 --> 00:07:28,580 +nhiên sẽ là ngày_của chúng ta hôm nay. Và theo cách này với câu lệnh if này, chúng ta có thể + +113 +00:07:28,670 --> 00:07:31,940 +kiểm tra xem today_tuple + +114 +00:07:31,970 --> 00:07:36,970 +này với tháng và ngày có thực sự tồn tại như một trong những sinh nhật + +115 +00:07:37,400 --> 00:07:42,200 +của bạn bè và gia đình của chúng ta bên trong birthday_dict này hay không. Và khi chúng ta đã hoàn thành việc đó, thì chúng ta có thể thoát khỏi bước + +116 +00:07:42,200 --> 00:07:45,890 +2 và chuyển sang bước 3. Ở bước 3, chúng ta đang nói, + +117 +00:07:46,010 --> 00:07:51,010 +nếu có sự trùng khớp, vì vậy nếu câu lệnh + +118 +00:07:51,290 --> 00:07:55,130 +if này là đúng, thì chúng ta sẽ chọn một chữ cái ngẫu nhiên trong số + +119 +00:07:55,580 --> 00:07:58,970 +chữ cái_1, 2, 3, từ các mẫu chữ cái của chúng ta bên trong đây. Để làm điều đó, chúng ta sẽ cần phải suy + +120 +00:07:58,970 --> 00:08:03,970 +nghĩ về đường dẫn tệp tương đối. + +121 +00:08:04,070 --> 00:08:06,830 +Vì vậy, chúng ta phải truy + +122 +00:08:06,830 --> 00:08:10,850 +cập vào thư mục mẫu thư để đến từng tệp này. + +123 +00:08:10,850 --> 00:08:11,960 +Đường dẫn tệp sẽ trông giống như thế này. + +124 +00:08:12,440 --> 00:08:17,440 +Nó sẽ là letter_template / một trong những + +125 +00:08:17,870 --> 00:08:21,740 +chữ cái này, ví dụ: letter_1. txt hoặc letter_2 hoặc 3. Trên thực tế, con số cụ thể này sẽ là thứ mà chúng + +126 +00:08:21,740 --> 00:08:25,910 +ta sẽ tạo ra + +127 +00:08:25,940 --> 00:08:30,380 +một cách ngẫu nhiên và chúng ta sẽ đưa vào đó dưới dạng một chuỗi f. + +128 +00:08:30,440 --> 00:08:33,559 +Vì vậy, bây giờ tôi cần nhập mô-đun ngẫu nhiên cùng với mọi thứ khác. + +129 +00:08:34,159 --> 00:08:38,780 +Và chúng ta có thể tiếp tục và gọi + +130 +00:08:39,320 --> 00:08:44,320 +mô-đun ngẫu nhiên và nhận một randint từ một đến ba. + +131 +00:08:46,490 --> 00:08:47,323 +Như thế này. + +132 +00:08:47,410 --> 00:08:48,820 +Vì vậy, bây giờ chúng ta đã + +133 +00:08:50,140 --> 00:08:53,320 +hoàn thành hai gợi ý này và cuối cùng, chúng ta sẽ sử dụng phương thức + +134 +00:08:53,350 --> 00:08:58,350 +Replace () để thay thế trình giữ chỗ tên bên trong mỗi chữ cái này ngay tại đây bằng tên thực của người có ngày sinh. + +135 +00:08:58,740 --> 00:09:03,740 +Ở đây tôi đã liên kết nó với tài liệu cho từ + +136 +00:09:04,830 --> 00:09:09,030 +khóa thay thế và nó trông như thế nào. Ví dụ, nếu chúng ta có một chuỗi như thế này, thì chúng + +137 +00:09:09,960 --> 00:09:14,550 +ta có thể nói văn bản. thay thế, lấy từ mà chúng ta muốn lấy ra và + +138 +00:09:14,580 --> 00:09:18,930 +sau đó là từ chúng ta muốn đưa vào. Trong trường hợp của chúng tôi, chúng + +139 +00:09:18,990 --> 00:09:22,140 +tôi sẽ phải đọc + +140 +00:09:22,290 --> 00:09:26,730 +văn bản từ tệp này với tệp mở của chúng tôi, sau đó đường dẫn + +141 +00:09:26,730 --> 00:09:31,110 +tệp đi vào đây, và sau đó chúng tôi sẽ gọi đây là letter_file. + +142 +00:09:31,440 --> 00:09:34,290 +Và sau đó từ letter_file này, chúng ta sẽ lấy nội dung + +143 +00:09:35,700 --> 00:09:37,200 +bằng cách đọc từ letter_file này. + +144 +00:09:37,200 --> 00:09:42,000 +3: Đúng. + +145 +00:09:42,380 --> 00:09:43,213 +0: Bây giờ, khi chúng ta đã có nội dung, thì chúng ta có thể nói nội dung. thay thế + +146 +00:09:44,990 --> 00:09:49,340 +và thứ mà chúng tôi muốn + +147 +00:09:49,730 --> 00:09:54,500 +thay thế là trình giữ chỗ tên được mã hóa cứng đó và thứ + +148 +00:09:54,980 --> 00:09:59,750 +chúng tôi muốn thay thế nó đến từ ngày sinh phù hợp hiện tại. + +149 +00:09:59,780 --> 00:10:00,613 +Nếu today_tuple + +150 +00:10:02,120 --> 00:10:06,800 +tồn tại trong từ điển ngày sinh của chúng tôi, thì chúng tôi có thể + +151 +00:10:07,250 --> 00:10:10,100 +nắm giữ toàn bộ hàng dữ liệu 3: ... + +152 +00:10:10,550 --> 00:10:11,383 +0: bằng + +153 +00:10:14,660 --> 00:10:19,660 +cách lấy từ điển ngày sinh của chúng tôi và sau đó giữ mục ở khóa khớp với today_tuple. + +154 +00:10:21,380 --> 00:10:23,240 +Hãy nhớ rằng today_tuple là tháng và ngày dưới + +155 +00:10:24,650 --> 00:10:29,240 +dạng một tuple và các từ điển sinh nhật đều có các khóa là tháng sinh nhật và ngày sinh nhật dưới dạng một tuple. + +156 +00:10:29,240 --> 00:10:34,240 +Vì vậy, chúng tôi đã kiểm tra xem tuple này có tồn tại dưới dạng một khóa + +157 +00:10:35,030 --> 00:10:39,260 +bên trong từ điển ngày sinh hay không và sau đó chúng tôi sử dụng + +158 +00:10:39,260 --> 00:10:40,093 +dấu ngoặc + +159 +00:10:40,250 --> 00:10:45,200 +vuông để thực sự truy cập vào hàng dữ liệu cho kết quả khớp cụ thể đó. Và sau đó chúng tôi có sinh nhật_ người, vì vậy từ sinh + +160 +00:10:45,200 --> 00:10:49,130 +nhật_ người đó, chúng + +161 +00:10:49,490 --> 00:10:51,740 +tôi sẽ giữ tên của họ. + +162 +00:10:52,100 --> 00:10:54,740 +Và tên nằm dưới cột tên ở đây. + +163 +00:10:55,190 --> 00:10:58,940 +Miễn là chúng ta đặt tên dưới dạng một chuỗi, thì chúng ta sẽ có thể nắm + +164 +00:10:59,570 --> 00:11:01,610 +được tên thực của chúng ngay tại đây. + +165 +00:11:01,970 --> 00:11:05,510 +Và đó là kết thúc của bước 3. + +166 +00:11:06,770 --> 00:11:09,920 +Vì vậy, bây giờ cuối cùng chúng ta chuyển sang bước 4, nơi chúng + +167 +00:11:10,550 --> 00:11:13,130 +ta sẽ gửi bức thư của chúng ta đã được tạo + +168 +00:11:13,370 --> 00:11:15,380 +ở đây trong nội dung của chúng ta + +169 +00:11:15,380 --> 00:11:18,650 +và chúng ta sẽ gửi nó đến địa chỉ email của người sinh nhật đó. + +170 +00:11:19,010 --> 00:11:22,400 +Vì vậy, điều đầu tiên chúng ta cần là tạo một kết + +171 +00:11:23,840 --> 00:11:27,470 +nối và chúng ta sẽ sử dụng thư viện smtplib để làm điều đó. + +172 +00:11:27,470 --> 00:11:30,770 +Vì vậy, hãy nhập smtplib. Và sau đó chúng ta sẽ + +173 +00:11:31,130 --> 00:11:35,750 +nói với smtp lib. SMTP, hãy tạo một đối tượng từ đó và chúng + +174 +00:11:35,750 --> 00:11:39,830 +ta phải cung cấp chuỗi máy chủ. Vì vậy, như tôi đã đề cập trước đây, tùy thuộc + +175 +00:11:40,130 --> 00:11:44,480 +vào nhà cung cấp email bạn sử dụng, nó sẽ khác nhau. + +176 +00:11:44,480 --> 00:11:48,350 +Bây giờ tôi sẽ đặt email và mật khẩu của mình ở trên cùng dưới dạng hằng số. + +177 +00:11:48,860 --> 00:11:53,270 +Tất nhiên, điều này sẽ không hiệu quả với bạn vì vậy bạn sẽ phải sử dụng email + +178 +00:11:53,770 --> 00:11:55,420 +và mật khẩu của riêng mình. + +179 +00:11:55,420 --> 00:11:58,450 +Và tùy thuộc vào nhà cung cấp email bạn sử + +180 +00:11:59,020 --> 00:12:01,660 +dụng, bạn sẽ phải chọn SMTP chính xác. Vì vậy, tôi đang gửi email bằng Gmail, vì vậy + +181 +00:12:01,690 --> 00:12:06,010 +tôi sẽ thay đổi điều này thành smtp. gmail. com. + +182 +00:12:06,010 --> 00:12:10,120 +Và tôi sẽ lưu kết nối này mà tôi tạo làm kết nối. + +183 +00:12:10,690 --> 00:12:15,690 +Bước 2 là tiếp tục và gọi các starrttls. + +184 +00:12:16,630 --> 00:12:21,630 +Vì vậy, chúng tôi sẽ nhận được kết nối của mình và sau đó gọi starttls. + +185 +00:12:23,050 --> 00:12:27,190 +Và sau đó bước 3 là đăng nhập vào kết nối của chúng tôi bằng cách gọi đăng nhập. + +186 +00:12:27,670 --> 00:12:32,670 +Và sau đó chúng ta phải cung cấp email mà chúng ta + +187 +00:12:35,530 --> 00:12:40,150 +muốn đăng nhập và mật khẩu cho tài khoản email đó. Cuối cùng, chúng ta sẽ thiết lập chủ đề và nội dung + +188 +00:12:40,180 --> 00:12:44,920 +bằng cách gọi kết nối. + +189 +00:12:44,980 --> 00:12:49,980 +gửi thư. Và địa chỉ từ là MY_EMAIL, địa chỉ đến sẽ là + +190 +00:12:50,350 --> 00:12:55,060 +email của người sinh nhật. + +191 +00:12:55,630 --> 00:13:00,280 +Vì vậy, chúng ta sẽ lấy sinh nhật của mình và sau đó chúng + +192 +00:13:00,730 --> 00:13:03,130 +ta sẽ nắm giữ email của họ + +193 +00:13:03,820 --> 00:13:08,710 +bằng cách xem tên của cột email, thực ra chỉ là email như thế này. + +194 +00:13:08,740 --> 00:13:12,460 +Và cuối cùng, chúng ta có thể thêm vào tin nhắn thực tế. + +195 +00:13:12,970 --> 00:13:16,870 +Tôi sẽ định dạng lại nó để bạn dễ đọc hơn + +196 +00:13:18,880 --> 00:13:19,690 +một chút. + +197 +00:13:19,690 --> 00:13:23,230 +Và sau đó chúng ta sẽ thiết lập thông điệp của mình. + +198 +00:13:25,480 --> 00:13:27,550 +Đây sẽ là một chuỗi f và chủ đề sẽ luôn giống nhau. + +199 +00:13:27,760 --> 00:13:32,760 +Nó sẽ được sinh nhật hạnh phúc. + +200 +00:13:33,130 --> 00:13:35,110 +Và sau hai trong số những dòng mới này, chúng ta có thể thêm nội dung thư thực. + +201 +00:13:36,280 --> 00:13:40,840 +Bây giờ nội dung thư sẽ là nội dung mà chúng tôi đã tạo bởi vì, + +202 +00:13:41,350 --> 00:13:45,970 +hãy nhớ rằng, lấy một ký tự ngẫu nhiên, đọc nó và sau đó thay thế + +203 +00:13:45,970 --> 00:13:49,360 +trong phần giữ chỗ tên bằng tên của người sinh nhật. + +204 +00:13:49,420 --> 00:13:53,500 +Vì vậy, đó là những gì chúng tôi sẽ đưa vào đây. + +205 +00:13:54,130 --> 00:13:55,870 +Và bây giờ bước 4 cũng đã + +206 +00:13:56,440 --> 00:13:59,860 +hoàn thành và bây giờ chúng ta có thể tiếp tục và chạy tệp này. + +207 +00:14:00,220 --> 00:14:04,150 +Và hy vọng rằng nó sẽ cho chúng ta thấy quá trình kết + +208 +00:14:04,630 --> 00:14:09,250 +thúc với mã thoát bằng 0, đó là điều tốt nhất mà chúng ta có thể thấy. Điều đó có nghĩa là mọi thứ đã diễn ra tốt đẹp. + +209 +00:14:09,280 --> 00:14:13,030 +Và hãy nhớ rằng ngày sinh mà tôi + +210 +00:14:13,510 --> 00:14:15,610 +đặt để kiểm tra là hàng dữ liệu này. + +211 +00:14:15,610 --> 00:14:19,840 +Vì vậy, đáng lẽ nó phải thay thế chỗ dành sẵn của một bức thư + +212 +00:14:20,320 --> 00:14:25,320 +ngẫu nhiên bằng tên của mẹ và đáng lẽ nó phải gửi email đó đến appbreweryinfo @ gmail. com. Vì vậy, bây giờ nếu tôi xem xét appbreweryinfo @ + +213 +00:14:26,650 --> 00:14:31,540 +gmail của mình. com, bạn có thể thấy email được gửi qua, + +214 +00:14:31,540 --> 00:14:34,870 +nhưng bạn có thể nhận thấy một lỗi ở đây. + +215 +00:14:35,380 --> 00:14:39,280 +Tên thực sự không bao giờ được thay thế. Thay vào đó, chúng tôi vẫn thấy trình + +216 +00:14:39,700 --> 00:14:42,820 +giữ chỗ này. + +217 +00:14:42,880 --> 00:14:44,710 +Vì vậy, đây là một sai lầm thực sự phổ biến + +218 +00:14:45,100 --> 00:14:48,550 +mà rất nhiều người mắc phải và lý do là bởi vì sự thay thế văn bản đi ra làm đầu ra. + +219 +00:14:48,850 --> 00:14:53,850 +Vì vậy, nó không thực sự thay đổi văn bản gốc chỉ bằng cách gọi phương thức đó. + +220 +00:14:54,620 --> 00:14:58,880 +Thay vào đó, bạn phải lưu nó vào một biến mới để xem văn bản được + +221 +00:14:59,240 --> 00:14:59,810 +thay thế. + +222 +00:14:59,810 --> 00:15:04,760 +Vì vậy, trong trường hợp của chúng tôi, điều đó có nghĩa là chúng tôi không thể chỉ nói nội dung. thay thế. + +223 +00:15:05,720 --> 00:15:10,250 +Chúng tôi thực sự phải nói nội dung = nội dung. thay thế. + +224 +00:15:10,520 --> 00:15:14,660 +Vì vậy, chúng tôi thay thế nội dung và sau đó chúng tôi lưu nó trở lại biến ban đầu. + +225 +00:15:14,690 --> 00:15:19,690 +Vì vậy, bây giờ nếu tôi chạy lại điều này, bạn có thể thấy + +226 +00:15:21,260 --> 00:15:25,460 +rằng lần này thư của chúng tôi thực sự có tên + +227 +00:15:25,490 --> 00:15:28,940 +được thay thế ở đây, nó có một ký + +228 +00:15:29,270 --> 00:15:34,270 +tự ngẫu nhiên được tạo và nó đã gửi đến đúng địa chỉ email. Nếu bạn muốn xem mã đã hoàn thành, thì bạn sẽ tìm thấy mã này trong + +229 +00:15:34,490 --> 00:15:39,140 +tài nguyên khóa học dưới dạng mã + +230 +00:15:39,200 --> 00:15:44,180 +kết thúc cho dự án sinh nhật khôn ngoan hơn và điều này chứa rất nhiều + +231 +00:15:44,180 --> 00:15:45,140 +thứ mà + +232 +00:15:45,530 --> 00:15:49,220 +chúng ta đã nói đến cho đến nay, bao gồm cả + +233 +00:15:49,520 --> 00:15:53,180 +khả năng hiểu từ điển , đọc CSV, tạo khung dữ + +234 +00:15:53,210 --> 00:15:57,590 +liệu từ gấu trúc, sử dụng và tạo bộ dữ liệu, làm việc + +235 +00:15:57,980 --> 00:16:02,780 +với từ điển, đường dẫn tệp, mở tệp, thay thế tệp, đọc chúng và tất + +236 +00:16:02,840 --> 00:16:05,870 +nhiên, viết và gửi email cũng như mô-đun datetime. + +237 +00:16:05,930 --> 00:16:09,920 +Vì vậy, nếu bạn gặp khó khăn về bất kỳ khía cạnh nào trong số này, hãy + +238 +00:16:10,550 --> 00:16:13,370 +nhớ xem lại bài học trước mà chúng tôi đã trình bày + +239 +00:16:13,760 --> 00:16:18,590 +về chúng vì chúng tôi đã trình bày rất chi tiết tất cả các khái niệm này trong các bài học trước. + +240 +00:16:18,650 --> 00:16:23,650 +Vì vậy, hãy đảm bảo rằng bạn không bỏ qua nếu thực sự gặp khó khăn. + +241 +00:16:24,530 --> 00:16:28,070 +Có lẽ đây là một dấu hiệu cho thấy đây + +242 +00:16:28,160 --> 00:16:33,160 +là thời điểm thích hợp để xem lại và xem xét một số khái niệm này. Ví dụ: nếu bạn gặp khó khăn trong việc hiểu từ điển, hãy quay lại các bài học mà chúng + +243 +00:16:33,800 --> 00:16:37,910 +tôi đã liệt kê và hiểu từ + +244 +00:16:38,180 --> 00:16:42,140 +điển và thử lại một số bài tập, chỉ để làm mới tâm trí của bạn. Bây giờ, nếu bạn gặp khó khăn khi làm việc với cỏ dại hoặc + +245 +00:16:42,440 --> 00:16:46,490 +dữ liệu đến từ khung dữ + +246 +00:16:46,520 --> 00:16:51,520 +liệu gấu trúc của chúng tôi, thì hãy quay lại những bài học mà chúng ta đã + +247 +00:16:52,520 --> 00:16:57,020 +nói về CSV và chúng ta đã nói về gấu trúc vì ở đây không có + +248 +00:16:57,020 --> 00:17:00,770 +gì là mới, nhưng nó đòi hỏi bạn phải hiểu và khả + +249 +00:17:01,070 --> 00:17:06,069 +năng của bạn để biết cách áp dụng những kiến thức mà bạn đã học trước đó. Bây giờ, điều cuối cùng tôi muốn cho bạn thấy trong bài học tiếp theo + +250 +00:17:06,890 --> 00:17:10,550 +là làm thế nào để + +251 +00:17:10,640 --> 00:17:15,640 +mã này thực sự chạy hàng ngày để nó thực sự có thể kiểm tra + +252 +00:17:16,310 --> 00:17:21,310 +mỗi ngày để xem liệu nó có cần gửi email sinh nhật hay không. + +253 +00:17:22,190 --> 00:17:24,500 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution-birthday-wisher-end.zip b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution-birthday-wisher-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..f4afed8f5549c042fe442c4f3e6ee002cfc6dcb0 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/007 Solution-birthday-wisher-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aec54dea77f0078784e0c7cf64c2f3c80ecf6a41be7062a65be4ebcd3178578d +size 1678 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Course-Fixes-Report-an-Issue.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Host-your-Code-in-the-Cloud-with-pythonanywhere.url b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Host-your-Code-in-the-Cloud-with-pythonanywhere.url new file mode 100644 index 0000000000000000000000000000000000000000..ae57e20b12686f76fd33e8c74fbb68ceb04aa1f7 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Host-your-Code-in-the-Cloud-with-pythonanywhere.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.pythonanywhere.com/ \ No newline at end of file diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Run Your Python Code in the Cloud!.mp4 b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Run Your Python Code in the Cloud!.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9e6b70cbfc8d3e41b0232ffd31ad09ebf81961d5 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Run Your Python Code in the Cloud!.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb540e0cb2ff4e5edbd4db223e82303bbeee9eeb332e24b57c09b5689bac80a1 +size 78093820 diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Run Your Python Code in the Cloud!_vi.srt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Run Your Python Code in the Cloud!_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..81b608f973fcdb9056a1b9d48979b0ce9d3b0dca --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/008 Run Your Python Code in the Cloud!_vi.srt @@ -0,0 +1,368 @@ +1 +00:00:00,060 --> 00:00:01,170 +Trong các bài + +2 +00:00:01,200 --> 00:00:05,700 +học trước, chúng tôi đã hoàn thành dự án Python sinh nhật tự động của mình + +3 +00:00:06,000 --> 00:00:10,110 +và cũng như các trích dẫn động lực về dự án Python hôm thứ Hai. + +4 +00:00:10,620 --> 00:00:11,700 +Nhưng hiện tại, + +5 +00:00:11,700 --> 00:00:16,700 +bạn sẽ nhận thấy rằng mã này sẽ hoạt động liên tục để kiểm tra xem + +6 +00:00:17,250 --> 00:00:20,970 +nó hiện đang là ngày nào, so sánh với ngày sinh và + +7 +00:00:21,300 --> 00:00:22,710 +sau đó chạy mã + +8 +00:00:23,070 --> 00:00:26,610 +nếu mã này thực sự chạy liên tục trong nền. + +9 +00:00:27,210 --> 00:00:30,990 +Tất nhiên, bây giờ bạn có thể mở dự án của mình trong + +10 +00:00:31,050 --> 00:00:35,730 +PyCharm, nhấn chạy mỗi ngày và đảm bảo rằng nó hoạt động, nhưng đó thực sự là nỗ + +11 +00:00:36,000 --> 00:00:39,840 +lực hơn là chúc ai đó sinh nhật vui vẻ theo cách thủ công. + +12 +00:00:40,380 --> 00:00:42,330 +Vậy thay vào đó chúng ta phải làm gì? Chà, chúng tôi + +13 +00:00:42,330 --> 00:00:47,330 +muốn một số cách mà chúng tôi có thể lưu trữ mã của mình trên đám mây và chạy mã + +14 +00:00:49,290 --> 00:00:50,670 +của chúng tôi mỗi ngày. + +15 +00:00:51,390 --> 00:00:55,380 +Vì vậy, một cách để làm điều đó là sử dụng một dịch vụ có tên là Python ở bất + +16 +00:00:55,830 --> 00:01:00,270 +cứ đâu và họ có một cấp miễn phí để chúng ta có thể thực hiện chính xác điều đó mà không + +17 +00:01:00,270 --> 00:01:03,030 +phải trả bất kỳ khoản nào. Đi tới + +18 +00:01:03,030 --> 00:01:07,020 +python ở bất cứ đâu. com và hãy tiếp tục và đăng ký một tài khoản mới. + +19 +00:01:07,830 --> 00:01:09,960 +Bây giờ, khi bạn đã đăng ký + +20 +00:01:10,230 --> 00:01:13,710 +và đăng nhập, bạn muốn tiếp tục và bắt đầu thêm một số tệp. + +21 +00:01:14,250 --> 00:01:16,320 +Đi tới tab tệp ngay tại đây + +22 +00:01:16,740 --> 00:01:21,740 +và chúng tôi sẽ tải lên các tệp hiện nằm trong dự án sinh nhật khôn ngoan hơn + +23 +00:01:22,080 --> 00:01:26,310 +của chúng tôi. Vì vậy, đó là chính của chúng tôi. y, sinh nhật của chúng tôi. csv, và + +24 +00:01:27,480 --> 00:01:29,640 +cả các mẫu thư của chúng tôi. + +25 +00:01:30,150 --> 00:01:34,530 +Bây giờ chúng tôi muốn các mẫu thư của chúng tôi nằm trong một thư mục, vì + +26 +00:01:34,530 --> 00:01:38,340 +vậy chúng tôi sẽ tạo một thư mục mới có tên là letter_templates. + +27 +00:01:38,760 --> 00:01:40,470 +Đảm bảo không có lỗi chính tả ở đó. + +28 +00:01:41,130 --> 00:01:45,360 +Và bên trong thư mục này là nơi chúng tôi sẽ tải lên ba tệp này. + +29 +00:01:45,840 --> 00:01:47,850 +Vì vậy, chữ 1, 2 và 3. + +30 +00:01:48,870 --> 00:01:53,700 +Vì vậy, bây giờ chúng tôi đã có các bức thư của chúng tôi bên trong các mẫu hom / AppBrewery / + +31 +00:01:53,700 --> 00:01:55,980 +letter_, và bên trong AppBrewery, chúng tôi có ngày sinh + +32 +00:01:55,980 --> 00:01:58,740 +của chúng tôi. csv và chính của chúng tôi. py + +33 +00:01:59,400 --> 00:02:04,400 +Vì vậy, bây giờ chúng ta sẽ đi vào bảng điều khiển của chúng tôi và chúng tôi sẽ tạo một + +34 +00:02:05,430 --> 00:02:08,280 +bảng điều khiển bash mới. Vì vậy, chúng tôi sẽ nhấp vào + +35 +00:02:09,570 --> 00:02:13,470 +liên kết này ngay tại đây, và sau khi tất cả những thứ đó được tải và bạn thấy ký hiệu đô + +36 +00:02:13,740 --> 00:02:17,550 +la này ngay tại đây, chúng tôi sẽ nhập python3 main. py + +37 +00:02:18,960 --> 00:02:23,820 +Bây giờ bạn có thể thấy lỗi này ngay tại đây, lỗi xác thực SMTP. + +38 +00:02:24,360 --> 00:02:29,360 +Và đây là điều xảy ra bởi vì chương trình Python của chúng tôi đang cố gắng đăng nhập + +39 +00:02:29,370 --> 00:02:33,510 +vào email của chúng tôi và nhà cung cấp email của chúng tôi trong trường hợp + +40 +00:02:33,540 --> 00:02:38,540 +này, đó là Google, đang thực sự chặn nó. Vì vậy, chúng tôi có thể sao chép URL này và bạn + +41 +00:02:39,510 --> 00:02:40,590 +có thể thấy nó kết + +42 +00:02:40,590 --> 00:02:45,590 +thúc ngay tại đây vì có một khoảng trống ở đó và chúng tôi có thể dán nó vào thanh địa chỉ và chúng tôi + +43 +00:02:45,930 --> 00:02:47,220 +sẽ giải quyết vấn đề này. + +44 +00:02:47,400 --> 00:02:52,200 +Tôi không thể đăng nhập vào ứng dụng email của mình và đây về cơ bản là những gì mã Python của chúng tôi đang + +45 +00:02:52,200 --> 00:02:53,033 +cố gắng thực hiện. + +46 +00:02:53,400 --> 00:02:58,400 +Vì vậy, những gì chúng tôi cần làm là nhấp vào liên kết này để hiển thị chụp mở khóa, chúng + +47 +00:02:58,830 --> 00:03:03,670 +tôi nhấp vào tiếp tục và bây giờ nó đã kích hoạt mã của chúng tôi để đăng nhập lại. + +48 +00:03:04,120 --> 00:03:08,830 +Vì vậy, chúng ta phải quay lại và nhập chính xác như chúng ta đã làm trước đó, python3 + +49 +00:03:09,190 --> 00:03:10,120 +main. py + +50 +00:03:11,050 --> 00:03:14,980 +Nhưng lần này nó sẽ hoàn thành mà không cho chúng tôi bất kỳ lỗi nào và nó thực hiện + +51 +00:03:15,280 --> 00:03:19,000 +điều đó bằng cách hiển thị lại ký hiệu đô la và lời nhắc của chúng tôi. + +52 +00:03:19,570 --> 00:03:22,600 +Và bây giờ nếu tôi quay lại email của + +53 +00:03:22,810 --> 00:03:27,810 +mình, bạn có thể thấy rằng email này thực sự đã được gửi vì mã + +54 +00:03:29,290 --> 00:03:33,340 +được khởi tạo bên trong Pythonanywhere. Vì vậy, quay trở lại bảng điều + +55 +00:03:33,340 --> 00:03:34,570 +khiển Python ở bất + +56 +00:03:35,080 --> 00:03:39,040 +kỳ đâu, chúng ta có thể chuyển đến phần tác vụ để thực sự + +57 +00:03:39,280 --> 00:03:43,210 +lên lịch cho một tác vụ chạy. Bây giờ để thiết lập một tác vụ đã + +58 +00:03:43,270 --> 00:03:46,930 +lên lịch, chúng ta sẽ gõ lệnh tương tự mà chúng ta đã làm trong bảng + +59 +00:03:47,170 --> 00:03:49,870 +điều khiển là python3 main. py + +60 +00:03:50,560 --> 00:03:53,590 +Và sau đó chúng tôi sẽ lên lịch cho việc này vào một thời điểm cụ thể. + +61 +00:03:54,010 --> 00:03:56,650 +Và thời gian máy chủ dựa trên UTC. + +62 +00:03:57,160 --> 00:04:01,180 +Vì vậy, bạn có thể xem giờ hiện tại theo giờ UTC bằng cách + +63 +00:04:01,210 --> 00:04:03,790 +nhập giờ UTC vào Google và bạn có thể + +64 +00:04:04,120 --> 00:04:06,310 +thấy ngay bây giờ là 12:09. + +65 +00:04:06,910 --> 00:04:10,900 +Vì vậy, nếu tôi tiếp tục và lên lịch cho việc này vào lúc + +66 +00:04:11,440 --> 00:04:13,030 +12:10 và tôi nhấn tạo, + +67 +00:04:13,540 --> 00:04:17,200 +thì tại thời điểm thời gian cụ thể này đạt đến, khi nó + +68 +00:04:17,470 --> 00:04:21,970 +trở thành 12:10, thì lệnh của chúng tôi sẽ được chạy và chúng tôi sẽ thấy một + +69 +00:04:22,300 --> 00:04:26,560 +email chúc mừng sinh nhật hiển thị trong tài khoản Gmail thử nghiệm của chúng tôi. + +70 +00:04:27,460 --> 00:04:30,970 +Vì vậy, ngay bây giờ UTC đã chuyển sang 12:10. + +71 +00:04:31,720 --> 00:04:34,810 +Và vì vậy nếu chúng ta chờ đợi tác vụ + +72 +00:04:35,080 --> 00:04:40,080 +lịch trình này, chúng ta có thể nhấp vào nút này để xem nhật ký tác vụ + +73 +00:04:41,530 --> 00:04:46,530 +và bạn phải khá kiên nhẫn vì đôi khi có thể mất một lúc trước khi tác + +74 +00:04:46,810 --> 00:04:51,640 +vụ đó thực sự được thực thi. Vì vậy, chỉ cần tiếp tục kiểm tra nhật ký tác vụ cho đến khi bạn thấy điều này xảy ra. + +75 +00:04:51,940 --> 00:04:56,320 +Hoàn thành nhiệm vụ lúc 12:10:56, o vào cuối phút đó. + +76 +00:04:56,710 --> 00:05:01,630 +Lấy 16. 92 giây mã trả về là 0, có nghĩa là nó đã thành công. + +77 +00:05:02,110 --> 00:05:07,110 +Và bây giờ chúng ta có thể thấy email đó hiển thị trong tài khoản Gmail của chúng ta và + +78 +00:05:07,480 --> 00:05:11,770 +điều này hoàn toàn tự động và được thực hiện bởi Python ở bất kỳ đâu. + +79 +00:05:12,160 --> 00:05:16,210 +Vì vậy, bây giờ nếu chúng tôi có mã đó chạy trong nền hàng ngày, bạn + +80 +00:05:16,240 --> 00:05:21,010 +có thể yêu cầu nó chạy mã đó vào thời điểm cụ thể này hoặc thời điểm khác mà bạn + +81 +00:05:21,010 --> 00:05:23,440 +chọn trên thực tế. Nếu bạn không thử nghiệm nó, + +82 +00:05:23,530 --> 00:05:28,030 +bạn thực sự có thể làm cho nó chạy sớm hơn nhiều. Giả sử có thể là bảy giờ UTC. + +83 +00:05:28,930 --> 00:05:31,180 +Sau đó, nó sẽ gửi email vào buổi sáng. + +84 +00:05:31,780 --> 00:05:36,760 +Và hàng ngày, nó sẽ kiểm tra sinh nhật của ai trong CSV sinh nhật của bạn, sau đó gửi email + +85 +00:05:36,850 --> 00:05:40,210 +cho họ và thực hiện tất cả những điều thú vị đó bằng cách + +86 +00:05:40,330 --> 00:05:45,330 +sử dụng những gì chúng tôi đã làm với Python. Python ở bất cứ đâu đều có các diễn đàn thực sự tốt + +87 +00:05:46,210 --> 00:05:48,910 +để được trợ giúp và tư vấn. Và trên cấp miễn + +88 +00:05:48,940 --> 00:05:53,830 +phí, bạn chỉ có thể lập lịch chạy một tác vụ, vì vậy một cơ sở mã cụ thể. + +89 +00:05:54,190 --> 00:05:57,220 +Bây giờ tôi không làm việc cho họ và tôi không có quan + +90 +00:05:57,610 --> 00:06:02,050 +hệ gì với họ, nhưng tôi thấy thực sự hữu ích khi có một cách thực sự đơn giản để khiến + +91 +00:06:02,050 --> 00:06:05,260 +các tập lệnh Python của tôi chạy hàng ngày vào một thời điểm cụ thể. + +92 +00:06:05,500 --> 00:06:09,430 +Vì vậy, hãy xem nó và bạn có thể sử dụng nó nếu bạn thấy nó hữu ích. + diff --git a/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/external-links.txt b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..4d4c6c12312a0d3230d639301a4c32da8605bc53 --- /dev/null +++ b/part3/32 - Day 32 - Intermediate+ Send Email (smtplib) & Manage Dates (datetime)/external-links.txt @@ -0,0 +1,21 @@ + +003 Python-smtplib-Documentation +https://docs.python.org/3/library/smtplib.html + +004 Python-datetime-Documentation +https://docs.python.org/3/library/datetime.html + +005 101-Monday-Motivational-Quotes-from-the-Positivity-Blog +https://www.positivityblog.com/monday-motivation-quotes/ + +005 Day-32-Ending-Code +https://repl.it/@appbrewery/day-32-end#main.py + +005 Day-32-Starting-Code +https://replit.com/@appbrewery/day-32-start?v=1 + +008 Host-your-Code-in-the-Cloud-with-pythonanywhere +https://www.pythonanywhere.com/ + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 Day 33 Goals what you will make by the end of the day.mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 Day 33 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6259b5160d1915ecc78c8535679a2014560bc71b --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 Day 33 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd3a2c12c07b1da67bb110911d699f9b5494d2f03717b4571f1d5bbd4a4a8be9 +size 26162389 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 Day 33 Goals what you will make by the end of the day_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 Day 33 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d645b469bd363945e6a27638e18b234c289ab38a --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 Day 33 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,68 @@ +1 +00:00:00,540 --> 00:00:01,080 +Xin chào + +2 +00:00:01,080 --> 00:00:06,080 +các bạn, Chào mừng đến với Ngày thứ 33 của 100 Ngày viết mã. Đó là Angela ở đây và hôm + +3 +00:00:06,720 --> 00:00:11,490 +nay chúng ta sẽ tìm hiểu về các giao diện lập trình ứng dụng, còn + +4 +00:00:11,820 --> 00:00:16,110 +được gọi là API. Chúng ta sẽ sử dụng nó để làm gì? Chà, chúng ta sẽ + +5 +00:00:16,110 --> 00:00:21,110 +tìm hiểu công nghệ này để có thể tạo ra một bộ theo dõi + +6 +00:00:21,390 --> 00:00:22,223 +ISS. + +7 +00:00:22,440 --> 00:00:26,880 +Vì vậy, đây là trạm vũ trụ quốc tế và nó lơ lửng trên cao trên bầu trời và + +8 +00:00:26,970 --> 00:00:29,610 +nó quay quanh trái đất nhiều, nhiều lần trong ngày. + +9 +00:00:30,210 --> 00:00:35,040 +Đây là video được quay từ ISS và bạn có thể thấy trái đất + +10 +00:00:35,070 --> 00:00:38,550 +trông huy hoàng như thế nào trong mắt của ISS. + +11 +00:00:39,000 --> 00:00:43,860 +Và những gì chúng tôi sẽ cố gắng làm là chúng tôi sẽ thử và theo dõi vị trí của + +12 +00:00:44,100 --> 00:00:47,700 +ISS hiện đang ở trên bầu trời. Và vào thời điểm khi + +13 +00:00:47,970 --> 00:00:52,860 +ISS ở trên bầu trời đêm, ngay phía trên nơi chúng ta đang ở, thì chúng ta + +14 +00:00:53,220 --> 00:00:55,350 +sẽ tự gửi cho mình một email + +15 +00:00:55,440 --> 00:00:59,760 +yêu cầu chúng ta tìm kiếm và phát hiện ISS đang di chuyển nhanh. + +16 +00:01:00,600 --> 00:01:04,590 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu tìm + +17 +00:01:04,590 --> 00:01:05,430 +hiểu về API. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 What-is-the-ISS-.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 What-is-the-ISS-.url new file mode 100644 index 0000000000000000000000000000000000000000..d625cc2e7f2027f7b648fa9e8c1e4a78ead225a4 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/001 What-is-the-ISS-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/International_Space_Station \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 Application-Programming-Interface-Wikipedia-Entry.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 Application-Programming-Interface-Wikipedia-Entry.url new file mode 100644 index 0000000000000000000000000000000000000000..7fe6c3c00ff0b6dfd0c189c84f51cbdcd155001c --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 Application-Programming-Interface-Wikipedia-Entry.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/Application_programming_interface \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 What are Application Programming Interfaces (APIs).mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 What are Application Programming Interfaces (APIs).mp4 new file mode 100644 index 0000000000000000000000000000000000000000..102410e4e7dad9d33cfcd5b05ce3e66e4f498d34 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 What are Application Programming Interfaces (APIs).mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b86ec918d3c080577f652cec58bf7c653b1f7214bc5068d630e30e18c413147 +size 31681571 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 What are Application Programming Interfaces (APIs)_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 What are Application Programming Interfaces (APIs)_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a01ddfb594625093c6bf86d1a69a2c1eb85a37e2 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/002 What are Application Programming Interfaces (APIs)_vi.srt @@ -0,0 +1,248 @@ +1 +00:00:00,690 --> 00:00:05,010 +Trước tiên, chúng ta hãy xem giao diện lập trình ứng dụng là gì và sau + +2 +00:00:05,070 --> 00:00:10,070 +đó chúng ta sẽ xem cách chúng ta có thể sử dụng chúng để bắt đầu lấy một số + +3 +00:00:10,560 --> 00:00:13,290 +dữ liệu từ internet. Vì vậy, khi bạn đang duyệt + +4 +00:00:13,320 --> 00:00:17,070 +web, bạn có thể nhận ra rằng có rất nhiều trang web trên mạng chứa cả + +5 +00:00:17,070 --> 00:00:19,140 +đống dữ liệu. Ví dụ: bạn + +6 +00:00:19,140 --> 00:00:24,140 +có thể vào Yahoo thời tiết và xem dự đoán thời tiết trong tuần tới cho bất kỳ thành + +7 +00:00:24,390 --> 00:00:25,650 +phố nào trên thế giới, + +8 +00:00:26,100 --> 00:00:31,100 +bạn có thể vào Coinbase và xem giá trị thị trường hiện tại của các loại tiền điện + +9 +00:00:31,650 --> 00:00:34,500 +tử khác nhau như Bitcoin và Ethereum là bao nhiêu. + +10 +00:00:35,130 --> 00:00:39,600 +Bạn cũng có thể truy cập trang web MBA và xem các số liệu thống kê khác nhau về các cầu thủ + +11 +00:00:39,600 --> 00:00:42,330 +bóng rổ yêu thích của bạn. Bây giờ, điều gì sẽ + +12 +00:00:42,480 --> 00:00:45,540 +xảy ra nếu chúng ta muốn sử dụng dữ liệu mà họ có? + +13 +00:00:45,780 --> 00:00:50,250 +Làm thế nào chúng ta có thể khai thác nó và sử dụng nó trong các chương trình của riêng mình? Chà, đó là lúc các + +14 +00:00:50,280 --> 00:00:53,790 +giao diện lập trình ứng dụng phát huy tác dụng. + +15 +00:00:54,390 --> 00:00:58,320 +Tất cả chúng đều là một tập hợp các lệnh, chức năng, giao thức và đối + +16 +00:00:58,680 --> 00:01:03,680 +tượng mà người lập trình có thể sử dụng để tạo phần mềm hoặc tương tác với một hệ thống bên ngoài. + +17 +00:01:05,430 --> 00:01:06,720 +Trong các bài học sắp + +18 +00:01:06,750 --> 00:01:11,280 +tới, điều chúng ta sẽ tập trung vào đó là sự tương tác với các hệ thống bên ngoài. + +19 +00:01:11,970 --> 00:01:12,510 +Cụ thể, + +20 +00:01:12,510 --> 00:01:17,510 +chúng tôi sẽ thử và tương tác với các trang web khác nhau và lấy dữ liệu trực tiếp từ + +21 +00:01:17,910 --> 00:01:20,010 +các trang web đó. Về cơ bản, API + +22 +00:01:20,010 --> 00:01:25,010 +là một giao diện hay đúng hơn là một loại rào cản giữa chương trình của bạn và hệ + +23 +00:01:26,940 --> 00:01:27,900 +thống bên ngoài. + +24 +00:01:28,530 --> 00:01:33,530 +Và những gì bạn đang cố gắng làm là bạn đang cố gắng sử dụng các quy tắc mà API đã + +25 +00:01:33,810 --> 00:01:38,810 +quy định để đưa ra yêu cầu đối với hệ thống bên ngoài đối với một số phần dữ liệu. + +26 +00:01:40,650 --> 00:01:42,810 +Và nếu bạn đã cấu trúc yêu cầu + +27 +00:01:43,080 --> 00:01:48,080 +của mình theo tất cả các yêu cầu mà hệ thống bên ngoài này đã đặt ra trong API + +28 +00:01:48,090 --> 00:01:48,923 +của họ, thì + +29 +00:01:49,200 --> 00:01:54,200 +họ sẽ phản hồi bạn một cách thích hợp và cung cấp cho bạn dữ liệu mà bạn muốn. + +30 +00:01:56,940 --> 00:01:58,830 +Nhưng nếu bạn không tuân theo các + +31 +00:01:59,040 --> 00:02:03,090 +quy tắc, thì yêu cầu của bạn sẽ không hợp lệ và họ sẽ bảo bạn biến đi. + +32 +00:02:04,260 --> 00:02:09,120 +Vì vậy, nếu chúng ta nghĩ về các trang web mà chúng ta đã xem trước đây, Yahoo weather có + +33 +00:02:09,120 --> 00:02:10,050 +API thời tiết + +34 +00:02:10,110 --> 00:02:14,700 +của Yahoo mà bạn có thể khai thác bằng cách sử dụng các chương trình hoặc ứng dụng + +35 +00:02:14,700 --> 00:02:18,330 +của mình và nhận những thứ như dự báo 10 ngày, gió, khí quyển, + +36 +00:02:18,750 --> 00:02:21,360 +điều kiện thiên văn và Coinbase có API riêng của + +37 +00:02:21,420 --> 00:02:26,420 +họ , cho phép bạn khai thác giá trực tiếp hiện tại của nhiều loại tiền điện tử khác nhau. + +38 +00:02:28,020 --> 00:02:32,310 +Và tất nhiên, MBA cũng có một API để bạn có thể nhận được nhiều thông + +39 +00:02:32,310 --> 00:02:37,310 +tin khác nhau mà bạn quan tâm về các giải đấu, đội, cầu thủ, trò chơi và nhiều + +40 +00:02:37,830 --> 00:02:38,663 +hơn nữa. + +41 +00:02:39,630 --> 00:02:44,630 +Vì vậy, về cơ bản, bạn có thể hình dung những trang web này giống như một loại nhà hàng, phải + +42 +00:02:44,910 --> 00:02:45,330 +không? + +43 +00:02:45,330 --> 00:02:50,330 +Và dữ liệu cung cấp năng lượng cho các trang web này như là nhà bếp đằng sau hậu trường. + +44 +00:02:51,570 --> 00:02:56,570 +Chúng ta không thể thực sự đến một nhà hàng với tư cách là một thành viên của công chúng và chỉ vào bếp + +45 +00:02:57,660 --> 00:03:01,150 +và bắt đầu lục tung tủ của họ. Bạn không thể, bạn biết đấy, + +46 +00:03:01,810 --> 00:03:05,830 +hãy tưởng tượng đến nhà hàng Nhật Bản yêu thích của bạn và vào thẳng bếp + +47 +00:03:05,830 --> 00:03:08,830 +để thưởng thức một ít sốt mayonnaise Kewpie yêu thích của bạn. + +48 +00:03:08,980 --> 00:03:12,160 +Điều đó không thực sự thích hợp. Trong một nhà hàng, + +49 +00:03:12,190 --> 00:03:17,190 +chúng tôi có một menu và menu này giống như giao diện giữa bạn và + +50 +00:03:18,670 --> 00:03:19,503 +nhà hàng. + +51 +00:03:19,690 --> 00:03:24,400 +Đó là thứ cho bạn biết những gì bạn có thể đặt hàng và những gì bạn không thể. + +52 +00:03:24,760 --> 00:03:28,420 +Vì vậy, có thể bạn có thể mua một chiếc bánh ngọt, một chiếc bánh sandwich hoặc trà từ + +53 +00:03:28,720 --> 00:03:32,380 +nhà hàng, nhưng bạn không thể chỉ vào bếp và yêu cầu bất cứ thứ gì bạn muốn. + +54 +00:03:33,180 --> 00:03:37,170 +Về cơ bản, một API chính xác là như vậy. Đó là menu. + +55 +00:03:37,530 --> 00:03:41,850 +Đó là tất cả những điều bạn có thể làm để tương tác với + +56 +00:03:42,210 --> 00:03:45,240 +một hệ thống bên ngoài, chẳng hạn như một trang + +57 +00:03:45,240 --> 00:03:47,430 +web truyền dữ liệu như Yahoo thời + +58 +00:03:47,430 --> 00:03:51,330 +tiết hoặc trang web MBA. Trong các bài học sắp tới, + +59 +00:03:51,360 --> 00:03:56,360 +chúng ta sẽ xem xét cách chúng ta có thể đọc tài liệu cho API và tương tác + +60 +00:03:56,520 --> 00:03:59,820 +với chúng để có thể lấy các phần dữ liệu mà chúng + +61 +00:03:59,880 --> 00:04:04,880 +ta muốn vào thời điểm chúng ta muốn. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ xem + +62 +00:04:05,310 --> 00:04:06,360 +trong bài học tiếp theo. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 API Endpoints and Making API Calls.mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 API Endpoints and Making API Calls.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..dd92fd0c1fdbe980643d31af47b1476a00585a92 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 API Endpoints and Making API Calls.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:971f3fbc678825bc10d42cdd6b737839a5391302cbe43ba63e88242bf2ddd0ee +size 53092372 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 API Endpoints and Making API Calls_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 API Endpoints and Making API Calls_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..74ebab26ea3796777eb6e5e6d5280bce15148616 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 API Endpoints and Making API Calls_vi.srt @@ -0,0 +1,476 @@ +1 +00:00:00,150 --> 00:00:05,360 +Bây giờ, một trong những khía cạnh quan trọng nhất của API là điểm cuối API. + +2 +00:00:07,110 --> 00:00:10,710 +Và bạn có thể tưởng tượng đó là một địa điểm, phải không? + +3 +00:00:10,740 --> 00:00:15,740 +Vì vậy, chúng tôi đã nói rằng nếu chúng tôi muốn lấy dữ liệu từ một dịch vụ bên ngoài cụ thể, thì chúng + +4 +00:00:16,079 --> 00:00:20,940 +tôi cần biết vị trí dữ liệu đó được lưu trữ. Vì vậy, ví dụ, nếu bạn muốn lấy tiền + +5 +00:00:20,970 --> 00:00:22,710 +từ một ngân hàng, thì + +6 +00:00:22,950 --> 00:00:27,360 +bạn cần biết ngân hàng đó ở đâu và địa chỉ của nó là gì. + +7 +00:00:28,200 --> 00:00:30,090 +Và điều đó, khi nói đến + +8 +00:00:30,090 --> 00:00:35,090 +biệt ngữ API, được gọi là điểm cuối API. Và đó thường chỉ là một URL. + +9 +00:00:35,940 --> 00:00:38,580 +Vì vậy, ví dụ: nếu bạn muốn lấy dữ liệu tiền điện tử, bạn + +10 +00:00:38,610 --> 00:00:41,700 +có thể sử dụng api. cơ sở tiền xu. com. + +11 +00:00:42,270 --> 00:00:46,740 +Đây là vị trí mà dữ liệu Coinbase có thể được tìm thấy. + +12 +00:00:47,940 --> 00:00:51,630 +Bây giờ, ngoài việc biết điểm cuối API, bạn cũng + +13 +00:00:51,720 --> 00:00:54,900 +phải thực hiện yêu cầu qua internet. + +14 +00:00:55,530 --> 00:01:00,530 +Yêu cầu API này tương tự như đến ngân hàng và cố gắng lấy một số tiền ra, vì vậy + +15 +00:01:00,870 --> 00:01:04,530 +hãy cố gắng rút một số dữ liệu từ kho tiền của họ. + +16 +00:01:05,400 --> 00:01:09,270 +Như bạn có thể tưởng tượng, thế giới sẽ hoàn toàn hỗn loạn nếu mọi + +17 +00:01:09,270 --> 00:01:12,900 +người được phép vào ngân hàng và lấy ra số tiền họ cần mà + +18 +00:01:12,900 --> 00:01:15,810 +không cần bất kỳ loại séc và số dư nào. + +19 +00:01:16,380 --> 00:01:20,490 +Vì vậy, đó là lý do tại sao, trong ngân hàng, bạn có một giao dịch viên ngân hàng để ai đó ở đó sẽ + +20 +00:01:20,550 --> 00:01:25,550 +hỏi bạn, "Tôi có thể giúp gì cho bạn? Bạn muốn gì? "và để ngăn bạn + +21 +00:01:26,730 --> 00:01:30,420 +đến kho tiền một mình. Và cũng có thể gọi cảnh + +22 +00:01:30,420 --> 00:01:35,190 +sát nếu bạn cố gắng làm điều đó. Giờ đây, giao dịch viên ngân hàng này hoạt động giống như API. + +23 +00:01:35,520 --> 00:01:40,520 +Đó là giao diện giữa bạn và hệ thống bên ngoài hoặc giữa bạn + +24 +00:01:41,310 --> 00:01:45,510 +và kho tiền ngân hàng. Và bạn có thể đưa ra một số yêu cầu với người phụ nữ này. + +25 +00:01:45,900 --> 00:01:48,540 +Tất nhiên, bạn có thể yêu cầu cô ấy đưa cho bạn một + +26 +00:01:48,570 --> 00:01:51,390 +số tiền, nhưng điều đó rõ ràng là sẽ liên quan đến việc + +27 +00:01:51,630 --> 00:01:55,860 +kiểm tra ID của bạn, đảm bảo rằng bạn có số tài khoản của mình và cô ấy sẽ phải kiểm + +28 +00:01:55,860 --> 00:01:56,693 +tra toàn bộ. + +29 +00:01:57,150 --> 00:02:01,230 +Nhưng bạn cũng có thể đến ngân hàng và hỏi nhân viên giao dịch ngân hàng những thứ + +30 +00:02:01,230 --> 00:02:06,000 +không yêu cầu bất kỳ hình thức xác thực nào. Ví dụ, bạn có thể nói, giờ mở + +31 +00:02:06,030 --> 00:02:07,830 +cửa của bạn là gì? + +32 +00:02:08,370 --> 00:02:11,370 +Và điều này tương đương với việc thực hiện một yêu cầu nhận + +33 +00:02:11,370 --> 00:02:16,370 +rất rất đơn giản, trong đó bạn chỉ cố gắng lấy một phần dữ liệu từ một trang web bằng cách sử + +34 +00:02:17,550 --> 00:02:19,890 +dụng API của họ. Bây giờ, một + +35 +00:02:19,890 --> 00:02:23,970 +trong những API đơn giản nhất mà tôi muốn giới thiệu với sinh viên + +36 +00:02:23,970 --> 00:02:27,570 +là API vị trí hiện tại của trạm vũ trụ quốc tế. + +37 +00:02:28,350 --> 00:02:30,660 +Đây là điểm cuối và bạn + +38 +00:02:31,080 --> 00:02:35,850 +có thể thấy rằng nó trả về kết quả đầu ra ở dạng JSON, cái + +39 +00:02:35,880 --> 00:02:38,400 +mà chúng ta đã thử nghiệm một chút. + +40 +00:02:39,870 --> 00:02:42,990 +Nếu bạn muốn đưa ra yêu cầu đối với API này, tất nhiên bạn có + +41 +00:02:43,320 --> 00:02:47,880 +thể sử dụng trình duyệt của mình để thực hiện. Chỉ cần dán điểm + +42 +00:02:47,880 --> 00:02:51,180 +cuối, là một URL vào thanh địa chỉ. + +43 +00:02:51,510 --> 00:02:54,660 +Và khi bạn nhấn enter, bạn có thể thấy + +44 +00:02:54,690 --> 00:02:57,750 +kết quả quay lại ở định dạng JSON. + +45 +00:02:58,380 --> 00:03:03,380 +Và điều này mô tả vị trí ISS hiện tại về kinh độ và + +46 +00:03:04,570 --> 00:03:07,750 +vĩ độ của nó. Nếu tôi làm mới điều + +47 +00:03:07,870 --> 00:03:10,840 +này, thì tôi sẽ thực hiện một yêu cầu mới cho + +48 +00:03:11,230 --> 00:03:16,210 +điểm cuối này và tôi sẽ nhận được một phần dữ liệu hơi khác vì ISS thực sự + +49 +00:03:16,300 --> 00:03:20,040 +di chuyển khá nhanh trong không khí. Vì vậy, mỗi khi bạn có thể thấy rằng + +50 +00:03:20,130 --> 00:03:23,000 +1: nó di chuyển một chút. Bây giờ, nếu 0: đọc + +51 +00:03:23,160 --> 00:03:25,500 +dữ liệu như thế này là một chút + +52 +00:03:25,650 --> 00:03:30,270 +khó khăn, tôi khuyên bạn nên cài đặt báo giá plugin trình duyệt Chrome miễn phí, + +53 +00:03:30,300 --> 00:03:31,133 +JSON Viewer Awesome + +54 +00:03:31,410 --> 00:03:36,090 +và điều nó sẽ làm là bất cứ khi nào nó thấy dữ liệu JSON được hiển + +55 +00:03:36,090 --> 00:03:36,923 +thị trong trình + +56 +00:03:36,960 --> 00:03:41,960 +duyệt, nó sẽ hiển thị trong một cấu trúc cây đẹp và nó sẽ trông giống như thế + +57 +00:03:42,240 --> 00:03:42,990 +này. + +58 +00:03:42,990 --> 00:03:47,370 +Vì vậy, bạn có thể thu gọn từng phần này và bạn có thể thấy rằng + +59 +00:03:47,400 --> 00:03:52,020 +đây là một từ điển hiệu quả với ba mục, dấu thời gian, thông báo, vị trí ISS. + +60 +00:03:52,380 --> 00:03:54,570 +Và sau đó khi bạn chạm vào vị trí ISS, bạn + +61 +00:03:54,780 --> 00:03:56,640 +có thể nhận được kinh độ và vĩ độ. + +62 +00:03:57,570 --> 00:04:00,240 +Bây giờ chúng ta đã thấy định dạng + +63 +00:04:01,020 --> 00:04:04,020 +dữ liệu JSON và chúng ta biết rằng nó ban + +64 +00:04:04,320 --> 00:04:09,320 +đầu được tạo cho JavaScript, nhưng sau đó gần như trở thành cách tiêu chuẩn để truyền + +65 +00:04:09,330 --> 00:04:12,120 +dữ liệu qua internet. Và lý do cho nó thực sự đơn giản. + +66 +00:04:12,420 --> 00:04:15,930 +Nếu bạn lấy một cái gì đó giống như từ điển Python, giả sử bạn có một + +67 +00:04:15,960 --> 00:04:19,160 +tủ quần áo, phải không? Nó giống như bạn đang đến Ikea. Bạn phát hiện ra + +68 +00:04:19,170 --> 00:04:23,460 +một chiếc tủ quần áo mà bạn muốn, nhưng bạn không muốn mang nguyên bộ nó về nhà. + +69 +00:04:23,820 --> 00:04:28,260 +Nó thậm chí có thể không vừa với ô tô của bạn. Chà, bạn làm nghề gì? Ở Ikea, ít nhất là + +70 +00:04:28,320 --> 00:04:31,980 +cách họ đã giải quyết nó, là họ bán cho bạn một gói phẳng. + +71 +00:04:32,250 --> 00:04:36,630 +Vì vậy, tất cả các mảnh phẳng đối với nhau và bạn về nhà và + +72 +00:04:36,630 --> 00:04:41,430 +bạn tự xây dựng nó. Điều này tương đương với một JSON. Nó rất tối giản, nó + +73 +00:04:41,730 --> 00:04:44,550 +không có nhiều khoảng trống và nhiều vết lõm. + +74 +00:04:44,850 --> 00:04:48,240 +Nó chỉ có một vài ký hiệu để biểu thị đâu + +75 +00:04:48,270 --> 00:04:51,840 +là khóa, đâu là giá trị, là cặp khóa-giá trị riêng biệt. + +76 +00:04:52,230 --> 00:04:55,650 +Và điều này có thể được vận chuyển qua internet rất, rất nhanh vì + +77 +00:04:55,650 --> 00:04:59,640 +nó nhỏ và bằng phẳng như thế nào. Bây giờ, khi bạn nhận được JSON + +78 +00:04:59,670 --> 00:05:01,620 +này, sau đó bạn có + +79 +00:05:01,710 --> 00:05:06,710 +thể khôi phục nó trở lại từ điển Python ban đầu của mình hoặc một đối tượng + +80 +00:05:07,200 --> 00:05:11,010 +JavaScript tùy thuộc vào ngôn ngữ lập trình bạn đang làm việc. + +81 +00:05:11,370 --> 00:05:15,510 +Và điều này tương đương với việc lấy một chiếc tuốc nơ vít và lắp nó lại với nhau đó + +82 +00:05:15,510 --> 00:05:16,620 +là đồ nội thất Ikea. + +83 +00:05:17,130 --> 00:05:22,130 +Nhưng may mắn cho bạn, quá trình này ít đau hơn nhiều so với việc xếp đồ + +84 +00:05:22,470 --> 00:05:25,440 +đạc Ikea lại với nhau. Nó thực sự siêu dễ dàng. + +85 +00:05:26,010 --> 00:05:27,750 +Hãy để tôi chứng minh. Ở đây, tôi đã tạo + +86 +00:05:27,780 --> 00:05:32,780 +một dự án hoàn toàn mới từ đầu ngày 33 và bên trong chính của tôi. py Tôi sẽ thử và + +87 +00:05:34,740 --> 00:05:39,740 +đưa ra yêu cầu đối với API vị trí ISS. + +88 +00:05:41,430 --> 00:05:45,840 +Vì vậy, điều đầu tiên tôi cần làm là tôi cần nhập một thư viện để giúp tôi thực + +89 +00:05:45,840 --> 00:05:46,590 +hiện điều đó. + +90 +00:05:46,590 --> 00:05:51,590 +Và cái mà tôi sắp nhập được gọi là các yêu cầu và lưu ý rằng có một + +91 +00:05:51,720 --> 00:05:52,680 +'s' ở cuối. + +92 +00:05:53,310 --> 00:05:58,310 +Và điều này phải được cài đặt vì nó không được tạo sẵn với Python. + +93 +00:05:58,880 --> 00:06:01,940 +Vì vậy, bạn có thể nhấp vào nó, và sau đó khi bạn nhìn + +94 +00:06:01,970 --> 00:06:06,140 +thấy bóng đèn màu đỏ, hãy nhấp vào nó và để nó cài đặt gói được gọi là yêu cầu. + +95 +00:06:06,710 --> 00:06:09,800 +Sau khi hoàn tất, bạn sẽ có thể sử dụng nó. Bây giờ, những gì chúng ta + +96 +00:06:09,800 --> 00:06:13,820 +sẽ làm khi sử dụng gói yêu cầu này là chúng ta sẽ gọi một trong các + +97 +00:06:13,820 --> 00:06:15,740 +phương thức của nó có tên là get. + +98 +00:06:16,130 --> 00:06:20,450 +Vì vậy, điều này sẽ giúp chúng tôi có được dữ liệu mà chúng tôi muốn từ điểm cuối. + +99 +00:06:21,110 --> 00:06:24,710 +Điểm cuối đi vào một đối số được gọi là URL và + +100 +00:06:25,280 --> 00:06:29,390 +chúng tôi có quyền kiểm tra tài liệu để biết điểm cuối là gì. + +101 +00:06:29,990 --> 00:06:33,890 +Vì vậy, trong trường hợp này, nếu chúng ta muốn nắm giữ vị trí + +102 +00:06:34,190 --> 00:06:36,770 +hiện tại, thì đây là URL điểm cuối. + +103 +00:06:37,130 --> 00:06:41,690 +Vì vậy, chúng tôi chỉ cần sao chép nó và dán nó vào đây dưới dạng một chuỗi. + +104 +00:06:43,100 --> 00:06:46,340 +Bây giờ, khi chúng tôi đã nhận được dữ liệu từ điều này, sau + +105 +00:06:46,520 --> 00:06:51,050 +đó nó sẽ được trả về và chúng tôi có thể nắm bắt nó bên trong một biến mới mà + +106 +00:06:51,050 --> 00:06:52,850 +chúng tôi sẽ gọi là phản hồi. + +107 +00:06:53,540 --> 00:06:57,440 +Vì vậy, điều này sẽ tương đương với phản hồi mà chúng tôi nhận được từ API + +108 +00:06:57,440 --> 00:06:59,120 +của trang web cụ thể này. + +109 +00:06:59,900 --> 00:07:02,630 +Bây giờ chúng ta hãy tiếp tục và in phản hồi này. + +110 +00:07:02,900 --> 00:07:07,310 +Vì vậy, hãy chạy dự án của chúng tôi và đảm bảo rằng bạn được kết nối + +111 +00:07:07,580 --> 00:07:11,630 +với internet vì dòng mã này sẽ đi qua internet và tìm nạp dữ liệu + +112 +00:07:11,630 --> 00:07:14,450 +này cho chúng tôi. Chúng tôi nhận được phản hồi. + +113 +00:07:15,830 --> 00:07:20,630 +Bây giờ chúng tôi đã thực hiện thành công yêu cầu API đầu tiên của mình từ bên trong + +114 +00:07:20,630 --> 00:07:23,600 +mã Python của chúng tôi. Tuy nhiên, khi chúng tôi + +115 +00:07:23,660 --> 00:07:28,660 +in phản hồi, chúng tôi không thấy dữ liệu JSON giống như khi chúng tôi thực hiện yêu cầu + +116 +00:07:28,670 --> 00:07:33,230 +trực tiếp bên trong trình duyệt của mình. Thay vào đó, chúng ta thấy số 200 này được in ở đây. + +117 +00:07:33,950 --> 00:07:37,250 +Đó là mã phản hồi của chúng tôi. Và trong bài học tiếp theo, chúng + +118 +00:07:37,340 --> 00:07:41,570 +ta sẽ đi sâu hơn vào cách làm việc với những phản hồi này và ý nghĩa chính xác của + +119 +00:07:41,570 --> 00:07:42,800 +những mã phản hồi này. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 ISS-Current-Location-API-Documentation.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 ISS-Current-Location-API-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..f05645fb4187e8c9d733446374ee993277bd82c4 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 ISS-Current-Location-API-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://open-notify.org/Open-Notify-API/ISS-Location-Now/ \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 JSON-Viewer-Extension.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 JSON-Viewer-Extension.url new file mode 100644 index 0000000000000000000000000000000000000000..5d18014aed6d86575dc37c8e47e78c8a5d273ed5 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 JSON-Viewer-Extension.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 or-just-use-Firefox-to-view-JSON-.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 or-just-use-Firefox-to-view-JSON-.url new file mode 100644 index 0000000000000000000000000000000000000000..abed9a87d39a8f7ae60703905b101bd01cd32f20 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/003 or-just-use-Firefox-to-view-JSON-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.mozilla.org/en-GB/exp/firefox/new/ \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 HTTP-Status-Codes.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 HTTP-Status-Codes.url new file mode 100644 index 0000000000000000000000000000000000000000..0e976c0c8d862b37fc4bd205f1b953513ee7fce7 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 HTTP-Status-Codes.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://httpstatuses.com/ \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Latitude-and-Longitude-to-Address-Tool.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Latitude-and-Longitude-to-Address-Tool.url new file mode 100644 index 0000000000000000000000000000000000000000..f0c91fe2601eb986cd2e3aa1b9ca1f2e97aa9ba8 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Latitude-and-Longitude-to-Address-Tool.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.latlong.net/Show-Latitude-Longitude.html \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Python-Requests-Module-Documentation.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Python-Requests-Module-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..fdccc10604e4f1e4cd27cf4161bfb0da3bdca01c --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Python-Requests-Module-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python-requests.org/en/latest/ \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Working with Responses HTTP Codes, Exceptions & JSON Data.mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Working with Responses HTTP Codes, Exceptions & JSON Data.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8df81a37e51a9fc8955f97e115d49b8fffb69ce6 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Working with Responses HTTP Codes, Exceptions & JSON Data.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d1f683129ceb474f31aa62a15a17bfc860ab90cf1ece2bd56a56d614ce5942f +size 71563829 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Working with Responses HTTP Codes, Exceptions & JSON Data_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Working with Responses HTTP Codes, Exceptions & JSON Data_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3d119fd366a6f398515a25bdeda4da79de9a2c9e --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/004 Working with Responses HTTP Codes, Exceptions & JSON Data_vi.srt @@ -0,0 +1,512 @@ +1 +00:00:00,900 --> 00:00:04,350 +Vậy mã phản hồi mà chúng ta có thể nhận được từ API là gì? + +2 +00:00:04,890 --> 00:00:08,220 +Mã phản hồi thực sự có một ý nghĩa rất cụ thể, nhưng + +3 +00:00:08,400 --> 00:00:12,290 +điều quan trọng nhất mà chúng cho chúng tôi biết là yêu cầu của chúng + +4 +00:00:12,590 --> 00:00:16,010 +tôi có thành công hay không. Bây giờ, nếu bạn đã sử dụng Internet + +5 +00:00:16,010 --> 00:00:20,630 +một thời gian, có thể bạn đã bắt gặp mã phản hồi 404. Và mã phản hồi + +6 +00:00:20,630 --> 00:00:24,230 +404 về cơ bản có nghĩa là thứ bạn + +7 +00:00:24,230 --> 00:00:28,880 +đang tìm kiếm không tồn tại. Và bạn có thể thấy nhiều trang web vui vẻ với + +8 +00:00:28,880 --> 00:00:29,713 +trang 404 này. + +9 +00:00:29,960 --> 00:00:33,530 +Về cơ bản, khi bạn đang cố gắng truy xuất thứ gì đó từ một trang web và nó + +10 +00:00:33,530 --> 00:00:36,650 +không thực sự có thứ bạn đang tìm, thì đây là mã bạn nhận được. + +11 +00:00:37,100 --> 00:00:41,150 +Nhưng thực tế có rất nhiều mã phản hồi khác ngoài mã 404. + +12 +00:00:41,690 --> 00:00:42,650 +Và trên thực tế, + +13 +00:00:42,680 --> 00:00:46,700 +bạn có thể tóm tắt các mã trạng thái này chỉ bằng cách nhìn vào số đầu tiên. + +14 +00:00:47,240 --> 00:00:51,620 +Nếu nó là 100 và một cái gì đó, thì nó nói với bạn, chờ đợi, điều gì + +15 +00:00:51,800 --> 00:00:54,050 +đó đang xảy ra. Đây không phải là cuối cùng. + +16 +00:00:54,410 --> 00:00:58,790 +Nếu đó là 200 cái gì đó thì nó đang nói, của bạn đây. Mọi thứ đều thành công. + +17 +00:00:58,940 --> 00:01:00,980 +Bạn sẽ nhận được dữ liệu bạn mong đợi. + +18 +00:01:01,940 --> 00:01:06,800 +Nếu đó là 300 cái gì đó thì nó thường có nghĩa là bạn không thực sự được phép + +19 +00:01:06,800 --> 00:01:11,600 +lấy cái này, vì vậy hãy biến đi. 400 cái gì đó, nó có nghĩa là + +20 +00:01:11,630 --> 00:01:15,020 +bạn đã sai lầm. Hoặc nó có thể là 404 có nghĩa + +21 +00:01:15,380 --> 00:01:16,910 +là bạn đã bị hỏng và + +22 +00:01:16,970 --> 00:01:19,130 +thứ bạn đang tìm kiếm thậm chí không tồn tại hoặc + +23 +00:01:19,610 --> 00:01:22,700 +nó có thể là 500 thứ gì đó, có nghĩa là tôi, cũng như trong + +24 +00:01:22,760 --> 00:01:27,760 +máy chủ mà bạn đang đưa ra yêu cầu, đã bị hỏng lên. Và có thể máy chủ không hoạt động, + +25 +00:01:28,370 --> 00:01:32,720 +có thể trang web bị lỗi hoặc có thể có một số vấn đề khác. + +26 +00:01:33,620 --> 00:01:34,940 +Vì vậy, đó chỉ là + +27 +00:01:34,970 --> 00:01:38,870 +một cách nhanh chóng, trong nháy mắt, một cách ghi nhớ những gì đang thực sự xảy ra + +28 +00:01:38,870 --> 00:01:40,970 +khi bạn nhận được các mã phản hồi này. + +29 +00:01:42,110 --> 00:01:46,640 +Bây giờ bạn thực sự có thể tìm hiểu sâu hơn về đối tượng phản hồi này và bạn có thể + +30 +00:01:46,640 --> 00:01:49,310 +nhận được nhiều thứ từ nó. Ví dụ: nếu bạn + +31 +00:01:49,310 --> 00:01:54,020 +muốn biết mã trạng thái thực tế thay vì chỉ một đối tượng phản hồi, thì bạn + +32 +00:01:54,350 --> 00:01:57,230 +có thể nói phản hồi. status_code, và bạn thực + +33 +00:01:57,560 --> 00:02:01,040 +sự chỉ nhận được mã trạng thái. Nhưng hãy lưu ý cách + +34 +00:02:01,040 --> 00:02:04,910 +nếu tôi thay đổi URL này và tôi mắc lỗi đánh máy ở đây, + +35 +00:02:05,240 --> 00:02:07,220 +thay vì tôi có là Iss, thì + +36 +00:02:07,580 --> 00:02:11,600 +bây giờ tôi nhận được 404 làm mã trạng thái phản hồi của mình. + +37 +00:02:12,860 --> 00:02:17,300 +ĐƯỢC RỒI. Vì vậy, nếu chúng ta nhận được mã trạng thái 200 thì có nghĩa là chúng ta đã thành công. + +38 +00:02:17,780 --> 00:02:20,150 +Nhưng chúng ta phải làm gì khi nhận được mã trạng thái khác? + +39 +00:02:20,420 --> 00:02:23,150 +Chương trình của chúng ta phải làm gì khi yêu cầu không thành công? + +40 +00:02:23,690 --> 00:02:28,690 +Chúng tôi có thể bị cám dỗ để viết mã như thế này. Bằng cách kiểm tra xem liệu phản hồi. status_code không bằng 200, chúng tôi thực sự có thể + +41 +00:02:30,170 --> 00:02:33,620 +xác định rõ, điều này có nghĩa là có thể đã xảy ra lỗi. + +42 +00:02:33,920 --> 00:02:38,570 +Bây giờ không thực sự có ý nghĩa nếu chỉ in ra một lỗi vì người + +43 +00:02:39,260 --> 00:02:44,260 +dùng đang sử dụng chương trình của chúng tôi có thể đang mong đợi điều gì đó xảy ra. + +44 +00:02:44,480 --> 00:02:47,930 +Vì vậy, trong hầu hết các trường hợp, bạn có thể muốn nêu ra một ngoại lệ để thay thế. + +45 +00:02:48,350 --> 00:02:52,700 +Bạn có thể nói phản hồi không tốt từ API ISS. + +46 +00:02:52,700 --> 00:02:57,700 +Nhưng chúng tôi đã học được từ mô-đun của mình về các lỗi + +47 +00:02:58,730 --> 00:03:02,230 +và ngoại lệ, điều này không tốt lắm. Thứ nhất, đây không phải là một ngoại lệ rất cụ thể. + +48 +00:03:02,560 --> 00:03:06,730 +Nó sẽ nêu ra một loại ngoại lệ rất chung chung. Và thứ hai, tất cả những gì chúng ta đang bắt + +49 +00:03:07,090 --> 00:03:11,230 +gặp là khi mã trạng thái không phải là 200. + +50 +00:03:11,260 --> 00:03:14,650 +Điều gì sẽ xảy ra nếu chúng tôi muốn bạn biết cụ thể mã trạng thái mà chúng tôi đã lấy lại? Tất nhiên, chúng tôi có thể kiểm tra kỹ + +51 +00:03:14,980 --> 00:03:19,240 +xem mã trạng thái phản hồi + +52 +00:03:19,240 --> 00:03:20,830 +có bằng 404 + +53 +00:03:20,840 --> 00:03:24,730 +hay không, sau đó chúng tôi sẽ nêu ra một + +54 +00:03:24,730 --> 00:03:29,730 +loại ngoại lệ cụ thể cho biết tài nguyên đó không tồn tại. Và sau đó, chúng ta có thể có, ừm, một câu lệnh nói, tốt, nếu + +55 +00:03:31,870 --> 00:03:36,670 +mã trạng thái phản hồi là 401, + +56 +00:03:36,700 --> 00:03:38,830 +thì điều đó có nghĩa + +57 +00:03:38,830 --> 00:03:42,940 +là bạn nên đưa ra một ngoại lệ vì mã cụ thể + +58 +00:03:43,210 --> 00:03:48,210 +này chỉ xảy ra khi bạn không được phép truy cập vào dữ liệu này. + +59 +00:03:50,170 --> 00:03:55,170 +Bây giờ có rất nhiều mã trạng thái mà bạn có thể lấy lại. + +60 +00:03:58,660 --> 00:04:02,710 +Và trong các tài nguyên của khóa học, tôi sẽ liên kết đến trang web cụ + +61 +00:04:03,040 --> 00:04:04,060 +thể này, nơi nó + +62 +00:04:04,060 --> 00:04:08,680 +cho bạn biết tất cả các mã khả thi mà bạn có thể nhận được và ý nghĩa của nó. Như bạn có thể tưởng tượng, chúng tôi không thể viết + +63 +00:04:08,680 --> 00:04:13,680 +nhiều câu lệnh if này + +64 +00:04:13,990 --> 00:04:16,959 +để kiểm tra mọi khả năng. Thay vào đó chúng ta phải làm gì? + +65 +00:04:16,959 --> 00:04:21,880 +Bạn thực sự có thể loại bỏ tất + +66 +00:04:22,540 --> 00:04:26,680 +cả điều này bằng cách yêu cầu mô-đun yêu cầu tạo ngoại lệ thay thế. + +67 +00:04:26,950 --> 00:04:29,200 +Mô-đun yêu cầu là cách + +68 +00:04:29,860 --> 00:04:34,860 +phổ biến nhất để các nhà phát triển Python làm việc với các API. Và bạn có thể thấy trong thống kê của họ chỉ số sao, số nhánh và từ + +69 +00:04:37,450 --> 00:04:42,310 +những thống kê này, bạn có thể thấy mức + +70 +00:04:42,340 --> 00:04:43,240 +độ phát + +71 +00:04:43,870 --> 00:04:48,190 +triển tích cực ở đó và mức độ phổ biến của mô-đun cụ thể này. Bây giờ, nếu bạn muốn xem tài liệu, thì bạn sẽ được đưa + +72 +00:04:48,220 --> 00:04:51,370 +đến trang web của + +73 +00:04:51,400 --> 00:04:53,560 +họ và nó cho bạn biết + +74 +00:04:53,830 --> 00:04:58,240 +tất cả những điều mà nó có thể làm, thực tế là khá nhiều. + +75 +00:04:58,240 --> 00:05:01,750 +Bây giờ tôi sẽ không đọc qua tất cả những điều này với + +76 +00:05:02,500 --> 00:05:04,450 +bạn, nhưng nếu chúng ta xem xét + +77 +00:05:04,720 --> 00:05:08,170 +một trong các phần, Lỗi và Ngoại lệ, bạn thực sự có thể + +78 +00:05:08,530 --> 00:05:13,530 +gọi tăng trạng thái trên phản hồi mà bạn nhận được để tăng lỗi HTTP nếu yêu cầu trả + +79 +00:05:13,540 --> 00:05:15,490 +về mã trạng thái không thành công. + +80 +00:05:15,610 --> 00:05:18,790 +Về cơ bản, thay vì chúng tôi cố gắng đưa ra một + +81 +00:05:19,600 --> 00:05:24,600 +ngoại lệ cho mọi mã trạng thái có thể có và cho nhà phát triển biết lý do có + +82 +00:05:24,670 --> 00:05:29,670 +thể là gì, chúng tôi có thể chỉ cần sử dụng mô-đun yêu cầu bằng cách nói phản hồi. raise_for_status. + +83 +00:05:30,520 --> 00:05:35,520 +Vì vậy, bây giờ những gì bạn sẽ thấy + +84 +00:05:36,070 --> 00:05:40,840 +là nếu chúng tôi không nhận được 200, đó là điểm - Hãy nói rằng tôi làm sai điểm + +85 +00:05:40,900 --> 00:05:45,220 +kết thúc này một lần nữa, sau đó bạn sẽ thấy một ngoại lệ được nêu ra + +86 +00:05:45,610 --> 00:05:49,270 +và nó cho chúng tôi biết, hãy nhìn xem, đó là lỗi máy khách 404. URL này không được tìm thấy. + +87 +00:05:49,270 --> 00:05:53,590 +Vì vậy, mô-đun yêu cầu này thực sự rất mạnh + +88 +00:05:54,970 --> 00:05:59,720 +mẽ và chúng ta sẽ xem cách sử dụng các khía cạnh khác nhau của nó trong các bài học sắp tới. + +89 +00:05:59,750 --> 00:06:03,170 +Nhưng hiện tại, điều đầu tiên chúng ta + +90 +00:06:03,680 --> 00:06:08,510 +cần nắm bắt là dữ liệu thực tế từ API cụ thể này. Để làm điều đó, chúng tôi nhấn vào phản hồi của mình và chúng tôi nhận + +91 +00:06:08,510 --> 00:06:11,270 +được dữ liệu JSON. + +92 +00:06:11,450 --> 00:06:15,650 +Vì vậy, đây là dữ liệu thực tế. Và khi tôi in nó ra, bạn có thể thấy rằng nó trông giống hệt như những gì chúng + +93 +00:06:16,010 --> 00:06:19,640 +tôi có trong trình duyệt của mình. + +94 +00:06:19,910 --> 00:06:24,320 +Quay lại mã của chúng tôi, nơi chúng tôi có JSON này, chúng tôi có thể khai thác + +95 +00:06:25,160 --> 00:06:28,730 +nó giống như chúng tôi làm với bất kỳ từ điển Python nào. + +96 +00:06:29,150 --> 00:06:33,440 +Chúng tôi có thể sử dụng một số dấu ngoặc + +97 +00:06:33,740 --> 00:06:38,740 +vuông và sau đó nhập tên của khóa mà chúng tôi quan tâm. Ví dụ: nếu đây là một từ điển Python và chúng ta muốn biết hàm + +98 +00:06:39,170 --> 00:06:41,720 +Iss_position, thì chúng + +99 +00:06:41,720 --> 00:06:46,720 +ta sẽ thêm các dấu ngoặc vuông và sau đó chuyển vào vị trí Iss_. + +100 +00:06:47,360 --> 00:06:52,360 +Và bây giờ khi chúng tôi in dữ liệu, bạn có thể thấy nó bây giờ được + +101 +00:06:54,170 --> 00:06:56,450 +thu hẹp lại và được khoan + +102 +00:06:56,480 --> 00:07:01,370 +sâu vào vị trí để cung cấp cho chúng tôi kinh độ và vĩ độ này. + +103 +00:07:01,370 --> 00:07:02,540 +Vì vậy, chúng ta có + +104 +00:07:02,960 --> 00:07:07,880 +thể đi xa hơn nữa và gắn thẻ trên một bộ dấu ngoặc vuông khác và cố gắng nắm bắt, giả sử kinh độ. + +105 +00:07:07,880 --> 00:07:10,370 +Và bây giờ chúng tôi nhận được phần dữ liệu thực tế đó. Đây là bạn có nó. + +106 +00:07:11,390 --> 00:07:16,040 +Chúng tôi có quyền truy cập vào kinh độ + +107 +00:07:16,070 --> 00:07:21,070 +bằng cách khai thác vào dữ liệu của chúng tôi ở định dạng JSON và sau đó nhận được Iss_position. Và bên trong từ điển đó, chúng ta có thể + +108 +00:07:22,610 --> 00:07:27,380 +nắm được kinh độ. Và chúng ta có thể làm + +109 +00:07:27,560 --> 00:07:32,560 +điều tương tự để nắm được vĩ + +110 +00:07:33,050 --> 00:07:35,090 +độ, 1: phải không? + +111 +00:07:37,480 --> 00:07:38,170 +0: Nhưng tất nhiên chúng tôi sẽ thay đổi khóa thành vĩ độ. + +112 +00:07:38,170 --> 00:07:41,350 +Vì vậy, bây giờ tôi sẽ tạo một bộ tuple với kinh độ và vĩ độ. + +113 +00:07:43,510 --> 00:07:48,510 +Và bây giờ nếu tôi in nó ra, bạn có thể thấy cách tôi quản lý để định dạng mã + +114 +00:07:49,660 --> 00:07:51,850 +của mình một cách độc đáo và lấy + +115 +00:07:51,880 --> 00:07:56,880 +các phần dữ liệu mà tôi muốn để có thể làm việc với nó trong dự án của mình. Bây giờ, nếu bạn muốn xem vĩ độ và kinh độ cụ thể đó ở + +116 +00:07:57,370 --> 00:08:02,320 +đâu trên bản đồ thế giới, thì + +117 +00:08:02,350 --> 00:08:06,970 +chúng ta có thể sử dụng một công cụ có tên là độ dài. mạng lưới. + +118 +00:08:06,970 --> 00:08:10,390 +Vì vậy, nếu bạn truy cập + +119 +00:08:10,750 --> 00:08:15,580 +công cụ địa lý và chuyển đến vĩ độ và kinh độ để giải quyết, thì bạn có + +120 +00:08:15,850 --> 00:08:20,850 +thể dán các giá trị kinh độ và vĩ độ mà chúng tôi nhận được từ API của mình. Và khi chúng tôi nhấp vào chuyển đổi, sau đó bạn sẽ thấy trên bản đồ, nó hiển thị + +121 +00:08:22,060 --> 00:08:26,470 +ISS hiện đang ở đâu trên thế giới. + +122 +00:08:26,560 --> 00:08:30,340 +Vì vậy, hiện tại, nó đang ở đâu đó về phía Đông của Nhật Bản trên Thái Bình Dương. + +123 +00:08:31,120 --> 00:08:35,799 +Và tất nhiên, nó cho bạn biết là không tìm thấy địa chỉ + +124 +00:08:36,039 --> 00:08:40,120 +bởi vì tôi không nghĩ có ai sống ở đó. + +125 +00:08:40,120 --> 00:08:40,953 +Vì vậy, hãy chơi + +126 +00:08:41,830 --> 00:08:45,310 +với điều đó và đảm bảo rằng bạn hoàn toàn hiểu những gì đang xảy ra trong + +127 +00:08:45,340 --> 00:08:50,340 +vài dòng mã này và cách chúng tôi sử dụng điểm cuối API để lấy dữ liệu mà chúng tôi đang hiển thị ngay tại đây. Trong bài học tiếp theo, tôi có một thử + +128 +00:08:50,710 --> 00:08:54,490 +thách cho bạn. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Challenge - Build a Kanye Quotes App using the Kanye Rest API.mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Challenge - Build a Kanye Quotes App using the Kanye Rest API.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b37838e4dc981869593cc5159ceca55e066e0d0a --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Challenge - Build a Kanye Quotes App using the Kanye Rest API.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a70174167d7e3b89e1bb5340a3011acbcb1e09488a755adf29ab62ae755e7041 +size 33873534 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Challenge - Build a Kanye Quotes App using the Kanye Rest API_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Challenge - Build a Kanye Quotes App using the Kanye Rest API_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2e34ccd5b9ec8916c6912cd127318f1de5367538 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Challenge - Build a Kanye Quotes App using the Kanye Rest API_vi.srt @@ -0,0 +1,264 @@ +1 +00:00:00,270 --> 00:00:05,130 +Bây giờ bạn đã thấy cách bạn có thể thực hiện loại yêu cầu cơ bản nhất + +2 +00:00:05,130 --> 00:00:09,600 +tới điểm cuối API, tôi muốn bạn xây dựng một máy báo giá Kanye. + +3 +00:00:09,960 --> 00:00:14,880 +Đây là những gì nó sẽ trông như thế nào và đây là những câu trích dẫn thực sự của Kanye. + +4 +00:00:15,300 --> 00:00:17,970 +Vì vậy, mỗi khi bạn nhấp vào nút có + +5 +00:00:18,000 --> 00:00:21,690 +biểu tượng cảm xúc Kanye này, bạn có thể thấy anh ấy sẽ + +6 +00:00:21,690 --> 00:00:23,220 +nói những điều khác nhau. + +7 +00:00:24,000 --> 00:00:29,000 +Và một số điều anh ấy nói là vô cùng sâu sắc và những điều + +8 +00:00:29,730 --> 00:00:33,810 +khác thì hơi kỳ lạ. Nhưng chúng tôi đã tạo tệp bắt đầu cho việc + +9 +00:00:34,080 --> 00:00:37,110 +này để bạn không phải mất nhiều thời gian xây dựng giao diện người dùng. + +10 +00:00:37,470 --> 00:00:41,850 +Tất cả những gì tôi muốn bạn làm là tìm ra cách sử dụng API + +11 +00:00:41,880 --> 00:00:43,950 +có tại kanye. phần còn + +12 +00:00:44,370 --> 00:00:49,020 +lại và đây là điểm cuối API. Vì vậy, tất nhiên bạn có thể kiểm tra + +13 +00:00:49,020 --> 00:00:52,110 +nó trong trình duyệt của mình chỉ bằng cách đưa nó vào thanh URL. + +14 +00:00:52,560 --> 00:00:57,560 +Và bạn có thể thấy bạn lấy lại một JSON rất đơn giản chỉ với + +15 +00:00:58,530 --> 00:01:03,060 +một khóa và một giá trị. Và mỗi khi bạn chạy nó, nó sẽ cung cấp cho bạn một báo giá ngẫu nhiên. + +16 +00:01:03,900 --> 00:01:08,100 +Truy cập tài nguyên khóa học và tải xuống tệp bắt + +17 +00:01:08,130 --> 00:01:12,060 +đầu trích dẫn Kanye. Và khi bạn đã giải nén nó và mở nó lên, + +18 +00:01:12,330 --> 00:01:16,290 +bạn có thể thấy rằng có nền. png, kanye. png và có + +19 +00:01:16,650 --> 00:01:21,650 +tất cả mã hiện có cần thiết để tạo giao diện người + +20 +00:01:22,830 --> 00:01:26,220 +dùng này trong tkinter. Vấn đề ở đây + +21 +00:01:26,520 --> 00:01:28,530 +là, tôi biết bạn có thể + +22 +00:01:28,830 --> 00:01:33,570 +tạo ứng dụng tkinter, nhưng tôi muốn bạn sử dụng mô-đun yêu cầu mà bạn + +23 +00:01:33,570 --> 00:01:38,400 +đã tìm hiểu vừa rồi để chức năng này hoạt động sao cho mỗi khi + +24 +00:01:38,550 --> 00:01:43,080 +nhấn nút Kanye, nút này, sau đó chúng tôi kích hoạt hàm get_quote này. + +25 +00:01:43,500 --> 00:01:48,500 +Và điều này sẽ lấy báo giá từ API Kanye ở đây và điền + +26 +00:01:51,780 --> 00:01:56,490 +nó vào quote_text này trên canvas. Sử dụng những gì bạn đã học trước đây, tôi nghĩ + +27 +00:01:56,850 --> 00:02:00,990 +bạn có thể làm điều này khá nhanh chóng. Vì vậy, hãy tạm dừng video ngay bây giờ và thử xem. + +28 +00:02:05,300 --> 00:02:05,810 +1: Vâng. + +29 +00:02:05,810 --> 00:02:07,070 +0: Được rồi. Vì vậy, + +30 +00:02:07,130 --> 00:02:11,660 +để bắt đầu, tất nhiên, chúng tôi cần nhập mô-đun yêu cầu rất quan trọng của mình và bạn + +31 +00:02:12,290 --> 00:02:15,890 +cần cài đặt nó nếu bạn thấy một số dòng chữ nguệch ngoạc màu đỏ. + +32 +00:02:16,310 --> 00:02:20,210 +Nhưng nếu bạn thấy nó chuyển sang màu xám như thế này thì có nghĩa là chúng tôi đã cài + +33 +00:02:20,210 --> 00:02:23,210 +đặt nó vào các tệp bắt đầu. Bây giờ, khi chúng ta + +34 +00:02:23,210 --> 00:02:25,580 +đã nắm được mô-đun đó, thì chúng ta có + +35 +00:02:25,640 --> 00:02:30,080 +thể viết một số mã ở đây để chúng ta làm cho chức năng của mình hoạt động. + +36 +00:02:30,620 --> 00:02:35,540 +Bây giờ, điều gì sẽ xảy ra khi người dùng nhấn vào nút Kanye? Chà, chúng ta phải tìm + +37 +00:02:35,780 --> 00:02:38,690 +nạp một trích dẫn mới từ API. + +38 +00:02:39,290 --> 00:02:41,360 +Đây là điểm cuối API và chúng + +39 +00:02:41,660 --> 00:02:46,660 +tôi sẽ sử dụng mô-đun yêu cầu để thực hiện yêu cầu và nhận một số dữ + +40 +00:02:47,930 --> 00:02:49,490 +liệu từ API này. + +41 +00:02:50,240 --> 00:02:54,170 +Vì vậy, đây là mã mà chúng tôi đã sử dụng trước đây để tìm ra vị trí của ISS. + +42 +00:02:54,680 --> 00:02:59,170 +Và chúng tôi sẽ lưu điều này làm phản hồi. Bây giờ, khi chúng tôi đã nhận + +43 +00:02:59,170 --> 00:03:01,060 +được phản hồi của mình, + +44 +00:03:01,120 --> 00:03:05,260 +chúng tôi sẽ gọi phản hồi. raise_for_status. + +45 +00:03:05,290 --> 00:03:09,880 +Vì vậy, nếu chúng tôi không nhận được 200, mà mọi thứ vẫn ổn, thì chúng tôi thực sự + +46 +00:03:10,120 --> 00:03:13,300 +muốn nâng cao một ngoại lệ. Bây giờ, điều tiếp theo + +47 +00:03:13,360 --> 00:03:17,830 +chúng tôi sẽ làm là tôi sẽ nhận được phản hồi của tôi để hiển + +48 +00:03:17,890 --> 00:03:21,370 +thị cho tôi dữ liệu JSON. Và tôi sẽ lưu nó dưới dạng dữ liệu. + +49 +00:03:22,030 --> 00:03:25,930 +Và sau đó, nếu chúng ta xem xét phản hồi trông như + +50 +00:03:26,230 --> 00:03:30,160 +thế nào, thì bạn có thể thấy nó chỉ là một cặp khóa-giá trị + +51 +00:03:30,520 --> 00:03:35,050 +duy nhất và khóa là dấu ngoặc kép và giá trị là báo giá ngẫu nhiên. + +52 +00:03:35,680 --> 00:03:40,680 +Vì vậy, chúng tôi có thể nắm được báo giá thực tế bằng cách chỉ cần chạm vào dữ liệu của chúng + +53 +00:03:41,260 --> 00:03:45,730 +tôi và sau đó sử dụng dấu ngoặc vuông để tìm nạp giá trị bên dưới báo giá chính. + +54 +00:03:46,570 --> 00:03:48,610 +Và khi chúng ta đã có đoạn + +55 +00:03:48,700 --> 00:03:53,080 +văn bản đó, thì chúng ta muốn đưa nó vào quote_text trên canvas của chúng ta. + +56 +00:03:53,560 --> 00:03:55,120 +Và như bạn đã thấy trước đây, + +57 +00:03:55,150 --> 00:03:59,290 +cách chúng tôi làm điều này là chúng tôi nói canvas. itemconfig. + +58 +00:03:59,620 --> 00:04:03,700 +Và mục chúng tôi muốn cấu hình, tất nhiên, là quote_text của chúng tôi. + +59 +00:04:04,240 --> 00:04:07,810 +Và thứ mà chúng tôi muốn cấu hình về nó là văn bản của nó. + +60 +00:04:08,170 --> 00:04:11,860 +Và chúng tôi sẽ đặt nó bằng với câu trích dẫn mà chúng tôi đã tìm nạp vừa rồi. + +61 +00:04:13,060 --> 00:04:15,610 +Vì vậy, bây giờ nếu tôi chạy mã của mình, bạn + +62 +00:04:16,000 --> 00:04:19,120 +có thể thấy ứng dụng Kanye nói của tôi đang hiển thị và + +63 +00:04:19,540 --> 00:04:22,029 +đây là nơi mà báo giá Kanye sẽ xuất hiện. + +64 +00:04:22,510 --> 00:04:27,510 +Vì vậy, nếu tôi nhấp vào Kanye, bạn có thể thấy nó hiển thị tất cả các trích dẫn của anh ấy như thế nào. + +65 +00:04:29,230 --> 00:04:34,060 +Vì vậy, bạn đã quản lý để có được điều đó? Nếu không, hãy nhớ quay lại bài học trước + +66 +00:04:34,120 --> 00:04:38,680 +và xem xét kỹ hơn cách chúng tôi định dạng yêu cầu và phản hồi của chúng tôi. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Kanye-Quotes-API.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Kanye-Quotes-API.url new file mode 100644 index 0000000000000000000000000000000000000000..4133e01189f3c11e05fea461f195b2a9be179337 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Kanye-Quotes-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://kanye.rest/ \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Solution-kanye-quotes-end.zip b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Solution-kanye-quotes-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..629e10452a110be72212f697786670c80894e8ca --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 Solution-kanye-quotes-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:645ef52669acb4151f7d2427189843271f504da12325a4b4db48607f3d8fa893 +size 46687 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 kanye-quotes-start.zip b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 kanye-quotes-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..1fd436401d41bd44dc2839d47137938860a4d38a --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/005 kanye-quotes-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:488d1ec1496ab1911dcc31c7fca2d6d918659927d2d367643908a6b2f84ab96a +size 46618 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Sunrise-and-Sunset-Times-API.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Sunrise-and-Sunset-Times-API.url new file mode 100644 index 0000000000000000000000000000000000000000..c1dfc22214e6844e158fa3104640a4395d6b76f1 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Sunrise-and-Sunset-Times-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://sunrise-sunset.org/api \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Understand API Parameters Match Sunset Times with the Current Time.mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Understand API Parameters Match Sunset Times with the Current Time.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ebd8efe0e230b19241bfb1b05302136bee3b3ae4 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Understand API Parameters Match Sunset Times with the Current Time.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a947f1edaa9bed2435cee2c170382b5713a39f37e60eeff32fb86c23f00c2e70 +size 95421412 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Understand API Parameters Match Sunset Times with the Current Time_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Understand API Parameters Match Sunset Times with the Current Time_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a4b0afeba326195b05cffe9c4cd8adc2fc476ed0 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 Understand API Parameters Match Sunset Times with the Current Time_vi.srt @@ -0,0 +1,876 @@ +1 +00:00:00,120 --> 00:00:03,930 +Chúng tôi đã thấy cách các API có thể có điểm cuối và chúng + +2 +00:00:03,930 --> 00:00:08,820 +tôi đã nói rằng địa chỉ đó tương đương với địa chỉ của nơi bạn muốn lấy một số + +3 +00:00:08,820 --> 00:00:10,860 +dữ liệu hoặc bạn muốn giao tiếp. + +4 +00:00:11,430 --> 00:00:14,310 +Nhưng các API cũng có một thứ gọi là tham số. + +5 +00:00:14,760 --> 00:00:19,760 +Và đây là một cách cho phép bạn cung cấp đầu vào khi bạn thực hiện yêu cầu API của mình + +6 +00:00:19,830 --> 00:00:23,310 +để bạn có thể lấy lại các phần dữ liệu khác nhau, tùy thuộc + +7 +00:00:23,460 --> 00:00:28,140 +vào đầu vào của bạn theo cùng một cách mà chúng tôi đã cung cấp các đầu vào khác nhau + +8 +00:00:28,140 --> 00:00:31,170 +cho cùng một hàm trong để có được một kết quả khác. + +9 +00:00:32,040 --> 00:00:36,570 +Quay trở lại với sự tương tự về ngân hàng của chúng tôi, điều đó tương tự + +10 +00:00:36,570 --> 00:00:40,740 +như đến ngân hàng và thay vì chỉ hỏi họ về giờ mở cửa của + +11 +00:00:40,800 --> 00:00:45,060 +bạn, một loại câu hỏi tổng quát, bạn cũng có thể chuyển vào một tham số. + +12 +00:00:45,480 --> 00:00:48,750 +Ví dụ, bạn có thể nói, bạn đóng cửa lúc mấy giờ vào Thứ Hai? + +13 +00:00:49,110 --> 00:00:51,720 +Hoặc mấy giờ bạn đóng cửa vào Thứ Ba? + +14 +00:00:52,320 --> 00:00:56,010 +Và điều này cho phép bạn nhận được những thông tin cụ thể + +15 +00:00:56,010 --> 00:01:00,870 +mà bạn quan tâm tùy thuộc vào đầu vào mà bạn đã cung cấp dưới dạng tham số. + +16 +00:01:01,980 --> 00:01:06,510 +Bây giờ, không phải tất cả các API đều có tham số. Một số cực kỳ đơn giản, + +17 +00:01:06,540 --> 00:01:08,700 +như API vị trí ISS. + +18 +00:01:09,270 --> 00:01:12,240 +Nhưng những cái khác cho phép bạn cung cấp các thông số. + +19 +00:01:12,660 --> 00:01:17,660 +Và đây là API mặt trời mọc và lặn cung cấp cho bạn thời gian mặt + +20 +00:01:19,020 --> 00:01:21,630 +trời mọc và lặn ở bất kỳ đâu. + +21 +00:01:22,110 --> 00:01:27,110 +Vì vậy, bạn phải cung cấp rõ ràng một vị trí để họ có thể cho bạn biết khi + +22 +00:01:27,390 --> 00:01:30,480 +nào mặt trời mọc và lặn ở vị trí của bạn. + +23 +00:01:31,080 --> 00:01:35,490 +Chúng ta có thể làm điều đó thông qua hai tham số, vĩ độ và kinh độ. + +24 +00:01:36,030 --> 00:01:38,790 +Và bạn sẽ nhận thấy rằng trong tài liệu API, họ + +25 +00:01:39,090 --> 00:01:42,810 +thường sẽ cho bạn biết bạn nên cấu trúc tham số của mình như thế nào. + +26 +00:01:42,990 --> 00:01:44,160 +Vì vậy, ví + +27 +00:01:44,160 --> 00:01:48,210 +dụ, ở đây vĩ độ có thể được chỉ định bằng cách sử + +28 +00:01:48,630 --> 00:01:52,620 +dụng khóa vĩ độ và kinh độ là lng là kinh độ. + +29 +00:01:53,100 --> 00:01:57,750 +Và họ muốn những phần đầu vào đó là số dấu phẩy động. Bây giờ, bạn cũng thấy rằng một số tham số + +30 +00:01:57,750 --> 00:02:02,750 +là bắt buộc và những tham số khác là tùy chọn. Cũng giống như chúng ta có thể có các tham + +31 +00:02:03,840 --> 00:02:07,680 +số tùy chọn và bắt buộc khi chúng ta tạo các hàm, bạn cũng + +32 +00:02:07,950 --> 00:02:10,169 +có điều tương tự trong các API. + +33 +00:02:11,039 --> 00:02:14,550 +Các tùy chọn đều có giá trị mặc định. + +34 +00:02:15,180 --> 00:02:17,970 +Ví dụ: ngày bạn có thể cung cấp, giả + +35 +00:02:18,030 --> 00:02:23,030 +sử bạn muốn biết mặt trời mọc và lặn vào một ngày cụ thể trong tương lai + +36 +00:02:23,130 --> 00:02:26,730 +hoặc trong quá khứ, nhưng bạn cũng có thể để trống và nó + +37 +00:02:27,090 --> 00:02:29,370 +sẽ mặc định là ngày hiện tại. + +38 +00:02:30,360 --> 00:02:34,680 +Bây giờ điểm cuối trong trường hợp này là URL cụ + +39 +00:02:35,100 --> 00:02:39,990 +thể này, api. bình Minh Hoàng hôn. org / json. Nhưng đừng lo lắng. + +40 +00:02:40,020 --> 00:02:44,580 +Tôi cũng sẽ liên kết đến tài liệu này trong tài nguyên khóa học. + +41 +00:02:45,390 --> 00:02:47,370 +Hãy xem làm thế nào chúng ta có thể làm cho điều này hoạt động. + +42 +00:02:47,820 --> 00:02:52,820 +Tôi sẽ nhận xét tất cả những thứ liên quan đến vị trí ISS của chúng tôi + +43 +00:02:53,610 --> 00:02:58,610 +và tôi sẽ sử dụng mô-đun yêu cầu này để lấy thời gian mặt trời mọc và + +44 +00:02:59,560 --> 00:03:00,393 +lặn vì điều + +45 +00:03:00,460 --> 00:03:04,150 +này sẽ thực sự quan trọng khi chúng tôi tạo dự án cuối + +46 +00:03:04,150 --> 00:03:04,983 +cùng của chúng + +47 +00:03:05,290 --> 00:03:10,290 +tôi vì hầu như không thể phát hiện ISS trên bầu trời trừ khi trời thực sự + +48 +00:03:11,260 --> 00:03:12,040 +tối. + +49 +00:03:12,040 --> 00:03:15,940 +Vì vậy, chúng ta cần biết khi nào mặt trời lặn và khi nào + +50 +00:03:15,940 --> 00:03:18,040 +mặt trời lặn để chúng ta + +51 +00:03:18,100 --> 00:03:22,720 +biết được bầu trời có thực sự đủ tối để chúng ta có thể phát hiện ISS + +52 +00:03:22,780 --> 00:03:27,040 +đang di chuyển trên bầu trời hay không. Hãy tiếp tục và thiết lập một phản + +53 +00:03:27,100 --> 00:03:29,650 +hồi khác sẽ được thiết lập cho một yêu cầu. + +54 +00:03:30,040 --> 00:03:35,040 +Và yêu cầu này sẽ nhận được một số thông tin từ điểm cuối cụ thể này. + +55 +00:03:35,710 --> 00:03:40,360 +Vì vậy, hãy sao chép điều đó và đảm bảo rằng bạn bỏ qua điểm dừng cuối + +56 +00:03:40,600 --> 00:03:41,433 +cùng này. + +57 +00:03:41,530 --> 00:03:45,070 +Đó chỉ là một phần của câu và không phải là một phần của điểm cuối API. + +58 +00:03:45,970 --> 00:03:48,400 +Vì vậy, nó sẽ trông giống như thế này. + +59 +00:03:49,180 --> 00:03:53,530 +Và sau đó chúng tôi sẽ nhận được phản hồi của mình để đưa ra một ngoại lệ + +60 +00:03:53,560 --> 00:03:58,300 +nếu có mã trạng thái lỗi. Vì vậy, bất cứ điều gì khác hơn 200, về cơ bản. Bây giờ, nếu tôi chạy nó + +61 +00:03:58,300 --> 00:04:01,600 +như vậy, bạn có thể thấy tôi đã nhận được một ngoại lệ. + +62 +00:04:02,080 --> 00:04:04,630 +Và ngoại lệ là 400, nếu + +63 +00:04:05,110 --> 00:04:08,500 +bạn nhớ, có nghĩa là yêu cầu xấu. + +64 +00:04:08,650 --> 00:04:13,650 +Máy chủ này không thể hoặc sẽ không xử lý yêu cầu do họ cho + +65 +00:04:13,750 --> 00:04:17,200 +rằng lỗi của bạn. Trong trường hợp của chúng tôi, + +66 +00:04:17,320 --> 00:04:22,320 +điều chúng tôi đã làm không tốt là chúng tôi đã không cung cấp các thông số cần thiết. + +67 +00:04:23,320 --> 00:04:26,440 +Vậy làm thế nào nó có thể cho chúng ta biết thời gian mặt trời mọc và lặn nếu + +68 +00:04:26,830 --> 00:04:30,550 +chúng ta không cho nó biết vị trí của chúng ta? Hãy sửa lỗi này. + +69 +00:04:31,030 --> 00:04:36,030 +Hãy tạo một tập hợp các tham số và bạn có thể thực hiện việc này bằng cách tạo một + +70 +00:04:38,170 --> 00:04:39,003 +từ điển Python. + +71 +00:04:39,400 --> 00:04:44,400 +Bây giờ các khóa cho các tham số phải khớp với các khóa được chỉ định trong + +72 +00:04:44,800 --> 00:04:45,760 +tài liệu API. + +73 +00:04:46,180 --> 00:04:49,960 +Vì vậy, nó là vĩ độ cho vĩ độ và lng cho kinh độ. + +74 +00:04:50,560 --> 00:04:53,530 +Vì vậy, hãy tạo các khóa đó dưới dạng chuỗi + +75 +00:04:54,100 --> 00:04:58,420 +và sau đó chúng ta có thể cung cấp vĩ độ và kinh độ của mình. + +76 +00:04:59,830 --> 00:05:03,100 +Vì vậy, làm thế nào để chúng ta biết vĩ độ và kinh độ của chúng tôi là gì? Chà, chúng ta có một người bạn + +77 +00:05:03,100 --> 00:05:05,680 +cũ tốt của chúng ta. mạng lưới. + +78 +00:05:06,160 --> 00:05:11,110 +Vì vậy, ở đây tôi có thể nhập một tên địa điểm cụ thể. Vì vậy, ngay bây giờ tôi đang ở London. + +79 +00:05:11,470 --> 00:05:16,470 +Và nếu tôi nhấp vào tìm, nó sẽ tìm thấy tôi trên bản đồ và nó sẽ cho tôi biết vĩ + +80 +00:05:17,530 --> 00:05:19,720 +độ và kinh độ của tôi là gì. + +81 +00:05:20,140 --> 00:05:24,490 +Vì vậy, hãy sao chép chúng và tạo chúng dưới dạng hằng số. + +82 +00:05:24,730 --> 00:05:27,430 +Vì vậy, tôi sẽ có MY_LAT bằng + +83 +00:05:28,180 --> 00:05:31,750 +với giá trị này dưới dạng số dấu phẩy động. + +84 +00:05:32,200 --> 00:05:34,180 +Và sau đó là kinh độ của tôi-- + +85 +00:05:35,200 --> 00:05:38,710 +Hãy nhớ bao gồm bất kỳ dấu hiệu tiêu cực nào nếu bạn nhìn thấy nó. + +86 +00:05:39,250 --> 00:05:42,850 +Đó thực sự là một phần của mã hóa kinh độ vĩ độ. + +87 +00:05:43,480 --> 00:05:47,890 +Vì vậy, bây giờ tôi có thể đặt khóa kinh độ của + +88 +00:05:47,920 --> 00:05:52,360 +mình thành hằng số MY_LAT và khóa kinh độ thành hằng số MY_LONG. + +89 +00:05:52,390 --> 00:05:56,410 +Vì vậy, đây là những giá trị mà tôi nhận được từ thời gian dài của mình. net search và sau đó tôi + +90 +00:05:57,200 --> 00:06:02,200 +đã định dạng tất cả những thứ này thành một từ điển bằng cách sử dụng + +91 +00:06:02,360 --> 00:06:05,780 +các khóa được chỉ định trong tài liệu API ở đây. + +92 +00:06:06,470 --> 00:06:09,260 +Đó là hai tham số bắt buộc duy nhất. + +93 +00:06:09,710 --> 00:06:14,710 +Vì vậy, nếu bây giờ chúng tôi thêm điều này vào các yêu cầu nhận của chúng tôi dưới đối số được gọi là + +94 +00:06:17,060 --> 00:06:20,330 +params, thì bây giờ chúng tôi có thể chạy lại yêu cầu này và bạn sẽ + +95 +00:06:20,660 --> 00:06:23,870 +thấy rằng lần này chúng tôi không nhận được bất kỳ ngoại lệ nào. + +96 +00:06:24,200 --> 00:06:27,050 +Vì vậy, chúng ta có thể giả định rằng mọi thứ đã trôi chảy. + +97 +00:06:28,130 --> 00:06:32,570 +Dữ liệu mà chúng tôi lấy lại nằm trong phản hồi. json. + +98 +00:06:32,930 --> 00:06:36,830 +Vì vậy, hãy tiếp tục và in ra dữ liệu đó và xem những gì chúng tôi đã quản lý để có được. + +99 +00:06:37,760 --> 00:06:42,760 +Chúng tôi nhận được một JSON như thường lệ và JSON chứa thời gian mặt trời mọc và thời + +100 +00:06:43,700 --> 00:06:47,360 +gian hoàng hôn, ngoài ra còn có những thứ khác như khi nào + +101 +00:06:47,510 --> 00:06:51,890 +là buổi trưa theo mặt trời, ngày bao lâu, độ dài ngày là bao nhiêu, v.v. + +102 +00:06:52,280 --> 00:06:57,260 +Vì vậy, bạn có thể thấy cái này dài hơn rất nhiều so với những gì chúng ta có trước đây. Bây giờ, hai thông tin mà chúng + +103 +00:06:57,290 --> 00:07:02,090 +tôi quan tâm chỉ là thời gian mặt trời mọc và mặt + +104 +00:07:02,090 --> 00:07:03,260 +trời lặn. + +105 +00:07:03,860 --> 00:07:08,210 +Nếu chúng ta muốn xem dữ liệu JSON này theo một cách được định dạng độc đáo, thì chúng ta có thể làm điều đó + +106 +00:07:08,690 --> 00:07:13,690 +bằng cách đặt yêu cầu đầy đủ vào thanh URL của trình duyệt. Và cách bạn định dạng các + +107 +00:07:15,350 --> 00:07:18,950 +tham số trong một chuỗi URL trông giống + +108 +00:07:19,340 --> 00:07:22,640 +như thế này. Trong các yêu cầu + +109 +00:07:22,670 --> 00:07:26,660 +mẫu, họ đã cho bạn thấy rằng phần này là URL điểm cuối. + +110 +00:07:27,110 --> 00:07:31,100 +Và sau đó, bạn có thể thêm dấu chấm hỏi để biểu thị rằng bạn sẽ + +111 +00:07:31,100 --> 00:07:32,660 +thêm một số tham số. + +112 +00:07:33,200 --> 00:07:37,640 +Và sau đó, bạn thêm từng tham số với dấu bằng chính và sau đó là giá trị + +113 +00:07:38,030 --> 00:07:42,950 +và sau đó bạn có thể gắn thẻ cho nhiều tham số hơn bằng ký hiệu và hoặc ký hiệu và. + +114 +00:07:44,300 --> 00:07:47,570 +Vì vậy, chúng ta hãy thử đưa nó vào thanh trình duyệt của chúng ta. + +115 +00:07:48,020 --> 00:07:51,290 +Vì vậy, đây là vĩ độ mà chúng tôi sẽ + +116 +00:07:51,620 --> 00:07:55,940 +dán vào đây và đây là kinh độ mà chúng tôi sẽ dán vào đây. + +117 +00:07:57,530 --> 00:08:01,040 +Vì vậy, bây giờ hãy nhấn enter và bạn có thể thấy ở đó Trình + +118 +00:08:01,040 --> 00:08:05,750 +xem tuyệt vời JSON của chúng tôi mà chúng tôi đã cài đặt ở đầu các bài học hôm nay hiện + +119 +00:08:06,020 --> 00:08:10,760 +đang hoạt động và nó hiển thị cho chúng ta tất cả dữ liệu này ở định dạng đẹp hơn nhiều. + +120 +00:08:11,720 --> 00:08:16,720 +Vì vậy, chúng ta có thể thấy rằng thời gian mặt trời mọc mà chúng ta quan tâm này là giá trị cho + +121 +00:08:16,730 --> 00:08:21,260 +thời gian mặt trời mọc chính sau đó nằm bên trong một khóa khác được gọi là kết quả. + +122 +00:08:22,400 --> 00:08:26,900 +Vì vậy, chúng tôi có thể sử dụng hai phím này để lấy ra các phần dữ liệu cụ + +123 +00:08:26,900 --> 00:08:29,960 +thể mà chúng tôi quan tâm. Vì vậy, chúng ta có thể + +124 +00:08:29,990 --> 00:08:34,070 +nhận được mặt trời mọc bằng với dữ liệu, và sau đó dấu ngoặc vuông + +125 +00:08:34,130 --> 00:08:35,330 +chúng ta đặt + +126 +00:08:35,440 --> 00:08:37,570 +vào khóa đầu tiên 1: là kết quả + +127 +00:08:37,720 --> 00:08:40,960 +0: với một s và sau đó chúng ta có thể thêm + +128 +00:08:40,990 --> 00:08:42,760 +khóa tiếp theo là mặt trời mọc. + +129 +00:08:43,360 --> 00:08:47,290 +Và chúng ta có thể làm điều tương tự cho thời gian mặt trời lặn. + +130 +00:08:48,910 --> 00:08:53,590 +Và bây giờ nếu chúng tôi in ra thời gian mặt trời mọc hoặc lặn của + +131 +00:08:53,860 --> 00:08:58,110 +chúng tôi, bạn có thể thấy nó thực sự là phần thông tin chính + +132 +00:08:58,110 --> 00:09:02,010 +xác mà chúng tôi quan tâm. Lưu ý cách dữ liệu này + +133 +00:09:02,520 --> 00:09:06,480 +được định dạng và nó cho chúng ta thời gian ở định dạng 12 giờ. + +134 +00:09:06,810 --> 00:09:09,960 +Vì vậy, nó sẽ có gắn thẻ AM hoặc PM ở cuối. + +135 +00:09:10,650 --> 00:09:15,650 +Bây giờ những gì chúng tôi muốn làm là chúng tôi muốn có được thời gian hiện tại + +136 +00:09:16,590 --> 00:09:21,590 +để chúng tôi có thể sử dụng mô-đun datetime. Từ mô-đun datetime, chúng tôi sẽ nhập ngày + +137 +00:09:23,040 --> 00:09:24,000 +giờ vào lớp. + +138 +00:09:24,480 --> 00:09:29,480 +Và sau đó chúng ta có thể lấy thời gian ngay bây giờ bằng cách khai thác vào lớp đó và sau đó + +139 +00:09:31,290 --> 00:09:32,310 +gọi phương thức now. + +140 +00:09:33,000 --> 00:09:38,000 +Nhưng bạn sẽ nhận thấy rằng định dạng thời gian bây giờ rất khác với thời gian mặt trời mọc + +141 +00:09:38,940 --> 00:09:42,060 +và lặn của chúng ta. Thời gian mặt trời mọc và + +142 +00:09:42,090 --> 00:09:44,370 +lặn của chúng ta ở định dạng 12 + +143 +00:09:44,700 --> 00:09:49,500 +giờ trong khi thời gian mà chúng ta lấy lại từ ngày giờ ở định dạng đồng hồ + +144 +00:09:49,710 --> 00:09:50,543 +24 giờ. + +145 +00:09:51,150 --> 00:09:55,860 +Vậy làm cách nào chúng ta có thể thay đổi dữ liệu mà chúng ta đang lấy lại từ API + +146 +00:09:55,860 --> 00:09:58,950 +mặt trời mọc và lặn này? Chà, quay + +147 +00:09:58,950 --> 00:10:03,360 +lại API chúng ta đi. Chú ý trong một trong các tham + +148 +00:10:03,630 --> 00:10:06,810 +số, có một tham số được gọi là định dạng là + +149 +00:10:07,260 --> 00:10:10,770 +một tham số tùy chọn, nhưng nó có thể được tắt hoặc bật. + +150 +00:10:11,310 --> 00:10:12,540 +Bật là theo mặc + +151 +00:10:12,660 --> 00:10:17,660 +định, có nghĩa là nó sẽ định dạng nó theo một cách cụ thể với đồng hồ 12 giờ. + +152 +00:10:18,330 --> 00:10:20,940 +Nhưng nếu bạn tắt định dạng, thì nó + +153 +00:10:21,330 --> 00:10:26,330 +sẽ cung cấp cho bạn thời gian Unix ở định dạng cụ thể này và + +154 +00:10:28,470 --> 00:10:33,270 +đây sẽ là đồng hồ 24 giờ. Vì vậy, đây là thách thức của bạn. + +155 +00:10:33,690 --> 00:10:38,690 +Hãy tiếp tục và thay đổi các tham số mà bạn có và đảm bảo rằng dữ liệu + +156 +00:10:39,510 --> 00:10:44,070 +mà chúng tôi lấy lại không được định dạng, vì vậy nó được đặt thành 0. + +157 +00:10:44,610 --> 00:10:49,350 +Tạm dừng video và hoàn thành thử thách này. Được rồi, tất cả những gì chúng + +158 +00:10:49,590 --> 00:10:54,590 +ta phải làm là thêm một tham số nữa vào từ điển này và tham + +159 +00:10:54,630 --> 00:10:59,630 +số phải có khóa khớp với khóa được chỉ định trong tài liệu, vì vậy + +160 +00:11:00,480 --> 00:11:05,070 +tôi sẽ sao chép lại, sau đó chúng ta sẽ đặt giá trị này + +161 +00:11:05,100 --> 00:11:08,790 +thành 0 để tắt. Vì vậy, bây giờ nếu chúng tôi + +162 +00:11:08,970 --> 00:11:13,050 +chạy lại mã của mình, bạn có thể thấy dữ liệu mà chúng tôi đang lấy + +163 +00:11:13,260 --> 00:11:16,320 +lại hiện theo giờ Unix, là thời gian định dạng 12 giờ. + +164 +00:11:16,920 --> 00:11:19,620 +Vì vậy, hiện tại nơi tôi đang ở + +165 +00:11:20,070 --> 00:11:25,050 +London, thời gian mặt trời mọc thực sự khá sớm, đó là lúc bốn giờ sáng. + +166 +00:11:25,590 --> 00:11:28,500 +Vì vậy, hãy chú ý phần đầu tiên là ngày như thế + +167 +00:11:28,830 --> 00:11:32,220 +nào và sau đó chúng ta có chữ T và sau đó là thời gian. + +168 +00:11:33,420 --> 00:11:38,070 +Những gì chúng tôi muốn có thể làm là so sánh phần này từ + +169 +00:11:38,070 --> 00:11:42,750 +API mặt trời mọc của chúng tôi với phần này từ API datetime của chúng tôi. + +170 +00:11:43,170 --> 00:11:47,730 +Vậy làm thế nào chúng ta có thể tách số giờ khỏi mỗi số này? + +171 +00:11:48,930 --> 00:11:52,500 +Chà, chúng ta có thể sử dụng một phương thức Python được gọi là phân tách, và + +172 +00:11:53,320 --> 00:11:55,030 +bạn đã thấy điều này trước đây. + +173 +00:11:55,360 --> 00:12:00,360 +Về cơ bản, bạn phải cung cấp một dấu phân tách và nó sẽ chia một chuỗi bởi dấu + +174 +00:12:01,960 --> 00:12:06,760 +phân tách đó tạo ra một danh sách. Vì vậy, nếu bạn nhấp vào điều này, hãy tự + +175 +00:12:07,030 --> 00:12:12,030 +mình thử điều này, bạn có thể thấy rằng chuỗi này trở thành danh sách này bằng cách tách chuỗi đó + +176 +00:12:13,630 --> 00:12:17,080 +bằng dấu phân tách dấu thăng. Bây giờ, trong trường hợp của + +177 +00:12:17,110 --> 00:12:21,550 +chúng ta, dấu phân tách mà chúng ta muốn phân tách trước hết là chia nó + +178 +00:12:21,610 --> 00:12:23,620 +theo T này, điều này sẽ cung + +179 +00:12:24,220 --> 00:12:29,220 +cấp cho chúng ta phần này là mục đầu tiên trong danh sách và phần này là mục + +180 +00:12:29,770 --> 00:12:31,330 +thứ hai trong danh sách. + +181 +00:12:31,900 --> 00:12:36,900 +Và sau đó chúng ta có thể lấy phần thứ hai và sau đó chia nó bằng dấu hai chấm và sau đó chúng ta có + +182 +00:12:37,150 --> 00:12:41,080 +thể lấy phần đầu tiên này của danh sách. Vì vậy, đây là cách chúng tôi sẽ làm điều đó. + +183 +00:12:41,590 --> 00:12:44,650 +Vì vậy, chúng ta có thể nói mặt trời mọc. tách và sau đó + +184 +00:12:45,340 --> 00:12:49,270 +dấu phân tách chúng tôi muốn sử dụng là vốn T đó. + +185 +00:12:49,930 --> 00:12:51,340 +Bây giờ nếu tôi + +186 +00:12:51,370 --> 00:12:56,370 +nhấn in, bạn có thể thấy chúng tôi có một danh sách hiện được phân tách bằng + +187 +00:12:57,040 --> 00:13:01,360 +hai thứ ở hai bên của chữ T. Vì vậy, hãy để tôi chỉ nhận xét về thời + +188 +00:13:01,660 --> 00:13:05,320 +gian bây giờ và chúng ta đã có mặt trời mọc và mặt trời mọc ở cạnh nhau. + +189 +00:13:05,770 --> 00:13:07,300 +Vì vậy, T bị loại bỏ + +190 +00:13:07,450 --> 00:13:11,770 +và hai thứ ở hai bên đã trở thành hai mục trong danh sách của chúng tôi. + +191 +00:13:12,460 --> 00:13:14,740 +Bây giờ chúng tôi muốn chia nhỏ phần này hơn nữa. + +192 +00:13:15,130 --> 00:13:19,330 +Chúng ta có thể lấy mục này bằng cách chạm vào mục ở chỉ mục một, vì vậy + +193 +00:13:19,360 --> 00:13:20,193 +0, 1, và + +194 +00:13:20,740 --> 00:13:25,480 +sau đó chúng ta có thể tách mục này hơn nữa bằng cách gắn thẻ trên một chức năng tách khác. + +195 +00:13:26,200 --> 00:13:31,120 +Ở đây, chúng ta có thể chia nó bằng dấu hai chấm. Vì vậy, hãy tiếp tục và cung cấp + +196 +00:13:31,120 --> 00:13:32,980 +dữ liệu đó làm đầu vào. + +197 +00:13:33,610 --> 00:13:38,610 +Và bây giờ bạn có thể thấy kết quả mà chúng tôi nhận lại là thế này. Chúng ta đã chia phần đứng + +198 +00:13:40,330 --> 00:13:44,560 +sau chữ T bằng dấu hai chấm và chúng ta có 04, + +199 +00:13:44,560 --> 00:13:47,860 +03, 32 + 00, và sau đó là 00. + +200 +00:13:48,310 --> 00:13:50,200 +Đây rõ ràng là mục chúng tôi muốn + +201 +00:13:50,230 --> 00:13:53,890 +vì vậy tất cả những gì chúng tôi phải làm là thêm một số 0 vào cuối. + +202 +00:13:54,490 --> 00:13:56,650 +Và bây giờ chúng ta đã có giờ + +203 +00:13:56,740 --> 00:14:01,420 +thực tế trong đồng hồ 24 giờ được định dạng từ thời gian mặt trời mọc của chúng ta. + +204 +00:14:02,260 --> 00:14:03,700 +Trên thực tế, bạn + +205 +00:14:03,760 --> 00:14:08,760 +có thể chỉ cần lấy tất cả phần này sau khi mặt trời mọc và gắn + +206 +00:14:08,950 --> 00:14:13,950 +nó vào cuối dòng này và cả dòng này để chúng tôi thực sự có được + +207 +00:14:14,350 --> 00:14:19,000 +thời gian mặt trời mọc và lặn trên đồng hồ 24 giờ, như thế này. + +208 +00:14:20,380 --> 00:14:25,380 +Bây giờ chúng tôi đã hoàn toàn sẵn sàng để bắt đầu so sánh nó với thời gian mà chúng tôi đang + +209 +00:14:26,230 --> 00:14:27,310 +có ngay bây giờ. + +210 +00:14:27,970 --> 00:14:32,740 +Vì vậy, chúng ta có thể dành thời gian của mình ngay bây giờ và nhấn vào giờ thực + +211 +00:14:33,310 --> 00:14:37,300 +tế, và bạn có thể thấy bây giờ chúng ta đã có mặt trời mọc, + +212 +00:14:37,630 --> 00:14:39,730 +đó là số đầu tiên này, hoàng + +213 +00:14:40,120 --> 00:14:45,120 +hôn, là số thứ hai và số thứ ba là giờ đồng hồ hiện tại về đồng hồ 24 giờ. + +214 +00:14:46,540 --> 00:14:49,810 +Vì vậy, để tìm ra đó là ngày hay đêm, tất cả + +215 +00:14:50,110 --> 00:14:54,200 +những gì chúng ta phải làm là so sánh con số này với hai con số kia. + +216 +00:14:55,160 --> 00:14:56,360 +Bây giờ trong bài + +217 +00:14:56,390 --> 00:15:00,920 +học tiếp theo, chúng ta sẽ kết thúc dự án này và tổng hợp mọi thứ + +218 +00:15:00,920 --> 00:15:05,870 +lại với nhau để nhận được email khi ISS đang hoạt động và hiện đang là ban đêm. + +219 +00:15:06,320 --> 00:15:08,630 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 w3schools-Python-split-method-Documentation.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 w3schools-Python-split-method-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..3b5b928398b2c2af87a2c97349a10b53df8526b6 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/006 w3schools-Python-split-method-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/ref_string_split.asp \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Course-Fixes-Report-an-Issue.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Find-Your-Current-Latitude-and-Longitude-Tool.url b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Find-Your-Current-Latitude-and-Longitude-Tool.url new file mode 100644 index 0000000000000000000000000000000000000000..cea26adee6aaeaf1e115331eafe8fa7283aecc09 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Find-Your-Current-Latitude-and-Longitude-Tool.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.latlong.net \ No newline at end of file diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 ISS Overhead Notifier Project - Challenge & Solution.mp4 b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 ISS Overhead Notifier Project - Challenge & Solution.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..611cf811bc190bc10a8370e0cffdb865dfba7c76 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 ISS Overhead Notifier Project - Challenge & Solution.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a8671460d1850725a10ec130060d40d35f00a32b10e592725efc050fd636b7d +size 128035099 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 ISS Overhead Notifier Project - Challenge & Solution_vi.srt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 ISS Overhead Notifier Project - Challenge & Solution_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2c4ba5b30a10401baf25a3f24adc33f154fffd69 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 ISS Overhead Notifier Project - Challenge & Solution_vi.srt @@ -0,0 +1,596 @@ +1 +00:00:00,180 --> 00:00:03,390 +Được rồi. Chúc mừng bạn đã đạt được dự án cuối cùng trong ngày. + +2 +00:00:03,719 --> 00:00:08,010 +Truy cập tài nguyên khóa học và tải xuống các tệp bắt đầu cho dự + +3 +00:00:08,039 --> 00:00:09,900 +án thông báo chi phí ISS. + +4 +00:00:10,650 --> 00:00:13,230 +Nếu bạn đã theo dõi tất cả các bài học + +5 +00:00:13,290 --> 00:00:18,290 +ngày hôm nay, thì bạn đã thấy cách chúng tôi có thể lấy dữ liệu từ một API cụ + +6 +00:00:19,860 --> 00:00:24,720 +thể chỉ bằng cách cung cấp một điểm cuối. Vì vậy, đây là loại lệnh gọi API đơn giản nhất. + +7 +00:00:25,500 --> 00:00:30,450 +Và sau đó, bạn đã thấy cách chúng tôi có thể chuyển, cùng với lệnh gọi API, một tập hợp + +8 +00:00:30,720 --> 00:00:35,720 +các tham số ở dạng từ điển Python để lấy một phần dữ liệu cụ thể mà chúng tôi muốn dựa + +9 +00:00:35,760 --> 00:00:40,320 +trên các tham số mà chúng tôi truyền qua. Vì vậy, trong trường hợp này, đó là + +10 +00:00:40,320 --> 00:00:44,220 +thời gian mặt trời mọc và lặn của khu vực địa phương của chúng tôi. + +11 +00:00:45,150 --> 00:00:45,930 +Bây giờ, sau + +12 +00:00:45,930 --> 00:00:50,340 +này, tôi đã chỉ cho bạn cách chúng ta có thể chia chuỗi mà chúng ta lấy + +13 +00:00:50,340 --> 00:00:54,840 +lại từ thời gian mặt trời mọc và mặt trời lặn để có được những con số cụ + +14 +00:00:55,140 --> 00:01:00,140 +thể mà chúng ta quan tâm, đó là thời gian mặt trời mọc và lặn trong 24- dạng đồng hồ giờ. + +15 +00:01:01,290 --> 00:01:03,450 +Bây giờ là lúc để tập hợp tất cả những điều này lại với nhau. + +16 +00:01:03,720 --> 00:01:08,370 +Nếu ISS gần với vị trí hiện tại của tôi và hiện tại trời tối, vì vậy + +17 +00:01:08,430 --> 00:01:13,140 +về cơ bản là ban đêm, thì hãy gửi email cho tôi để yêu cầu tôi tìm kiếm. + +18 +00:01:13,650 --> 00:01:17,310 +Đó là mục tiêu của thử thách. Tuy nhiên, là một thử thách bổ sung, + +19 +00:01:17,460 --> 00:01:21,480 +hãy xem liệu bạn có thể sửa đổi thêm mã để mã chạy sau mỗi 60 giây + +20 +00:01:21,600 --> 00:01:23,400 +nếu ISS ở trên cao hay không. + +21 +00:01:24,300 --> 00:01:29,130 +Đây là ba điều mà chúng ta cần đạt được. Và chỉ là một mẹo nhanh trước khi + +22 +00:01:29,130 --> 00:01:30,240 +bạn bắt đầu, + +23 +00:01:30,540 --> 00:01:35,540 +hãy nhớ rằng thời gian mặt trời mọc và mặt trời lặn đều ở định dạng chuỗi. + +24 +00:01:36,630 --> 00:01:40,650 +Vì vậy, nếu bạn muốn có thể làm việc với chúng để so sánh với + +25 +00:01:40,650 --> 00:01:44,760 +thời gian bây giờ, bạn cũng phải thay đổi giá trị này thành một số nguyên. + +26 +00:01:45,900 --> 00:01:50,520 +Bây giờ, mẹo thứ hai mà tôi có là vị trí ISS, kinh độ + +27 +00:01:50,580 --> 00:01:54,840 +và vĩ độ mà bạn lấy lại, sẽ là số thập phân, nhưng + +28 +00:01:55,110 --> 00:01:57,360 +nó hiện ở định dạng chuỗi. + +29 +00:01:57,750 --> 00:02:01,500 +Vì vậy, bạn sẽ cần chuyển nó thành một số dấu phẩy động nếu bạn muốn + +30 +00:02:01,830 --> 00:02:06,660 +so sánh nó với vị trí hiện tại của mình. Bây giờ, khi chúng tôi đang kiểm + +31 +00:02:06,690 --> 00:02:09,449 +tra xem ISS có hoạt động không, chúng tôi + +32 +00:02:09,660 --> 00:02:14,070 +muốn có một khoảng sai số. Nó không nhất thiết phải ở ngay phía + +33 +00:02:14,460 --> 00:02:19,380 +trên tôi, chính xác đến số điểm thập phân này. Nó có thể là cộng hoặc trừ năm. + +34 +00:02:19,380 --> 00:02:24,380 +Vì vậy, nếu vĩ độ của ISS với bất kỳ đâu giữa 56 + +35 +00:02:24,990 --> 00:02:28,890 +và, ừm, 51 trừ năm, là 46, thì điều + +36 +00:02:29,190 --> 00:02:32,940 +đó hoàn toàn ổn. Điều đó có nghĩa là tôi sẽ vẫn có thể nhìn thấy nó. + +37 +00:02:33,510 --> 00:02:37,380 +Hãy xem và tìm vĩ độ và kinh độ của riêng bạn và xem liệu bạn có + +38 +00:02:37,740 --> 00:02:42,120 +thể tìm ra cách so sánh vĩ độ và kinh độ đó với vĩ độ và kinh độ của ISS + +39 +00:02:42,120 --> 00:02:46,980 +và thêm vào mức độ sai số đó hay không. Trên thực tế, hãy xem xét việc + +40 +00:02:47,010 --> 00:02:51,450 +tạo một hàm trả về true nếu vị trí của bạn nằm trong khoảng + +41 +00:02:51,780 --> 00:02:56,280 +cộng năm hoặc trừ năm độ của vị trí ISS và nếu không thì false. + +42 +00:02:57,150 --> 00:03:02,150 +Vì vậy, bây giờ bạn sẽ có tất cả các khả năng để hoàn thành thử thách này. + +43 +00:03:02,740 --> 00:03:03,573 +Hãy tạm dừng + +44 +00:03:03,880 --> 00:03:07,570 +video, suy nghĩ một chút và xem liệu bạn có thể hoàn thành thử thách hay không. + +45 +00:03:08,970 --> 00:03:09,803 +1: Cảm ơn bạn. + +46 +00:03:12,600 --> 00:03:13,140 +0: Được rồi. + +47 +00:03:13,140 --> 00:03:18,140 +Điều chúng tôi muốn làm ở đây là chúng tôi muốn so sánh vị trí của ISS với vị trí + +48 +00:03:19,140 --> 00:03:20,580 +của chúng tôi. Bây giờ, + +49 +00:03:20,580 --> 00:03:25,580 +những gì chúng tôi muốn kiểm tra là xem vị trí của chúng tôi nằm trong phạm vi + +50 +00:03:27,570 --> 00:03:32,250 +cộng hay trừ năm độ của vị trí ISS. Vì vậy, hãy lấy một phần của vị trí + +51 +00:03:32,280 --> 00:03:33,810 +đó, vĩ độ của ISS + +52 +00:03:34,350 --> 00:03:38,670 +và chúng tôi muốn kiểm tra xem nó có gần với vĩ độ của tôi hay không. + +53 +00:03:39,300 --> 00:03:41,550 +Nếu vĩ độ của tôi hiện + +54 +00:03:41,910 --> 00:03:45,210 +là 51, thì 51 trừ năm sẽ là 46. + +55 +00:03:45,570 --> 00:03:50,570 +Vì vậy, chúng tôi có thể kiểm tra xem 46 có nhỏ hơn hoặc bằng vĩ độ ISIS hay không. + +56 +00:03:51,540 --> 00:03:56,130 +Và sau đó nếu vĩ độ ISS nhỏ hơn hoặc bằng 51 cộng với + +57 +00:03:56,130 --> 00:03:59,520 +năm, thì đó là 56. Sau đó, nếu điều này + +58 +00:03:59,760 --> 00:04:03,810 +là đúng, có nghĩa là giá trị này nằm giữa hai giá trị này. + +59 +00:04:04,260 --> 00:04:07,920 +Vì vậy, hãy thay thế những con số này bằng vĩ độ thực tế của tôi. + +60 +00:04:08,280 --> 00:04:10,260 +Vì vậy MY_LAT - + +61 +00:04:10,560 --> 00:04:13,440 +5 và sau đó MY_LAT + 5. + +62 +00:04:15,150 --> 00:04:19,350 +Và sau đó chúng ta phải đảm bảo rằng nó cũng đúng với kinh độ. + +63 +00:04:19,709 --> 00:04:21,720 +Vì vậy, về cơ bản chúng ta sẽ làm + +64 +00:04:21,720 --> 00:04:24,120 +điều tương tự, nhưng lần này sử dụng kinh độ của tôi. + +65 +00:04:24,450 --> 00:04:29,100 +Vì vậy, trong kinh độ của tôi trừ đi năm là nhỏ hơn hoặc bằng kinh độ + +66 +00:04:29,580 --> 00:04:30,990 +của ISS và kinh + +67 +00:04:31,010 --> 00:04:35,190 +độ của ISS phải nhỏ hơn hoặc bằng kinh độ của tôi cộng với năm. + +68 +00:04:35,850 --> 00:04:37,740 +Nếu cả hai điều này đều + +69 +00:04:37,770 --> 00:04:42,660 +đúng, thì vị trí của tôi nằm trong khoảng cộng hoặc trừ năm độ của ISS. + +70 +00:04:44,550 --> 00:04:48,030 +Tại thời điểm này, có lẽ tôi nên tạo một số loại hàm cho việc này. + +71 +00:04:48,030 --> 00:04:52,380 +Vì vậy, tôi có thể nói is_iss_overhead. + +72 +00:04:53,520 --> 00:04:58,260 +Và tôi có thể thụt lề tất cả những điều này vào hàm đó. + +73 +00:04:58,620 --> 00:05:02,610 +Và nếu điều này trở thành sự thật, tôi sẽ trở lại sự thật. + +74 +00:05:03,660 --> 00:05:05,460 +Phần này đề cập đến việc kiểm + +75 +00:05:05,490 --> 00:05:09,990 +tra xem ISS có ở vị trí tương tự như vị trí của tôi hay không, phần tiếp theo đề + +76 +00:05:10,620 --> 00:05:14,250 +cập đến việc tìm hiểu xem liệu đó có phải là ban đêm hay không. + +77 +00:05:14,790 --> 00:05:15,540 +Vì vậy, + +78 +00:05:15,540 --> 00:05:20,190 +một lần nữa, hãy tạo một hàm và tôi sẽ gọi nó là is_night. + +79 +00:05:21,330 --> 00:05:26,190 +Và hàm này sẽ trả về true khi nó thực sự là ban đêm. Để tìm hiểu xem liệu đó có phải + +80 +00:05:26,190 --> 00:05:28,290 +là ban đêm hay không, thì + +81 +00:05:28,890 --> 00:05:33,870 +chúng tôi sẽ nhận được phản hồi - vì vậy có một lỗi đánh máy ở + +82 +00:05:36,210 --> 00:05:40,020 +đó - từ yêu cầu của chúng tôi đến API Sunrise-Sunset sẽ + +83 +00:05:40,290 --> 00:05:44,400 +chuyển tất cả các thông số này chứa vị trí hiện tại của tôi. + +84 +00:05:44,970 --> 00:05:46,860 +Và sau đó từ dữ liệu + +85 +00:05:46,890 --> 00:05:51,330 +chúng tôi lấy lại được, chúng tôi tìm ra thời gian mặt trời mọc và lặn bằng + +86 +00:05:51,600 --> 00:05:53,820 +cách định dạng chuỗi đó và sau đó biến + +87 +00:05:54,090 --> 00:05:59,090 +nó thành một số nguyên sẽ đại diện cho giờ hiện tại ở định dạng thời gian 24 giờ. + +88 +00:05:59,870 --> 00:06:01,670 +Vì vậy, sau đó chúng + +89 +00:06:01,670 --> 00:06:06,200 +tôi tìm ra, thời gian hiện tại bằng cách sử dụng mô-đun datetime là bao nhiêu? + +90 +00:06:06,680 --> 00:06:09,080 +Và chúng ta có thể kiểm tra để xem, + +91 +00:06:09,350 --> 00:06:14,350 +nếu thời gian hiện tại lớn hơn hoặc bằng thời gian mặt trời lặn, hoặc nếu thời gian hiện + +92 +00:06:14,900 --> 00:06:18,470 +tại nhỏ hơn hoặc bằng thời gian mặt trời mọc, thì điều đó + +93 +00:06:18,770 --> 00:06:20,420 +có nghĩa là trời tối. + +94 +00:06:22,550 --> 00:06:27,550 +Vì vậy, bây giờ chúng tôi nhận được một cảnh báo cho chúng tôi biết rằng thời điểm này là + +95 +00:06:28,280 --> 00:06:33,080 +một đối tượng ngày giờ, nhưng hoàng hôn và mặt trời mọc là số nguyên hoặc số nguyên. + +96 +00:06:33,680 --> 00:06:37,340 +Vì vậy, những gì đã xảy ra tốt? Trên thực tế, ngày giờ hiện tại + +97 +00:06:37,370 --> 00:06:38,960 +là ngày và giờ hiện tại, + +98 +00:06:39,320 --> 00:06:44,320 +nhưng những gì chúng ta thực sự muốn là giờ hiện tại và chuyển đổi nó thành một số nguyên + +99 +00:06:44,360 --> 00:06:46,670 +làm cho phép so sánh này có giá trị. + +100 +00:06:47,270 --> 00:06:50,360 +Vì vậy, nếu hiện tại là ban đêm, thì + +101 +00:06:50,600 --> 00:06:55,370 +chúng ta sẽ trả về true. Và nếu ISS ở trên cao, + +102 +00:06:55,430 --> 00:07:00,290 +thì chúng ta cũng sẽ trả về true. Vì vậy, bây giờ chúng ta đã thực hiện xong hai + +103 +00:07:00,410 --> 00:07:04,070 +phần này, tất cả những gì còn lại cần làm là một khi cả hai điều này + +104 +00:07:04,430 --> 00:07:08,060 +đều đúng, chúng ta có thể gửi cho mình một email để bảo chúng tôi tra cứu. + +105 +00:07:08,660 --> 00:07:13,660 +Vì vậy, nếu ISS ở trên cao và hiện đang là ban đêm, thì chúng + +106 +00:07:15,260 --> 00:07:18,020 +tôi sẽ bắt đầu gửi email của mình, + +107 +00:07:18,110 --> 00:07:21,020 +việc này sẽ yêu cầu smtplib của chúng tôi. + +108 +00:07:21,590 --> 00:07:25,850 +Và tôi cũng sẽ thêm email và mật khẩu của mình dưới dạng hằng số ở đây. + +109 +00:07:27,950 --> 00:07:30,230 +Và bây giờ chúng tôi có thể tạo kết + +110 +00:07:33,050 --> 00:07:35,630 +nối của mình và tôi đang sử dụng lại máy chủ Gmail. + +111 +00:07:35,660 --> 00:07:40,340 +Vì vậy, nó sẽ được smtp. gmail. com. + +112 +00:07:40,790 --> 00:07:44,450 +Vì vậy, chúng tôi đã trải qua tất cả những điều này khi chúng tôi nói chi tiết về email. + +113 +00:07:44,720 --> 00:07:46,850 +Vì vậy, tôi sẽ không lãng phí thời gian để nói về nó một + +114 +00:07:47,680 --> 00:07:48,513 +lần nữa, 2: phải không? + +115 +00:07:50,080 --> 00:07:55,080 +0: Tôi sẽ gửi email này từ địa chỉ của chính tôi và cũng đến địa chỉ của chính tôi vì sau + +116 +00:07:55,780 --> 00:08:00,780 +cùng thì tôi chỉ đang tạo thông báo cho chính mình. Và thông báo trong trường hợp này sẽ có + +117 +00:08:02,080 --> 00:08:07,080 +dòng tiêu đề tra cứu và tôi thậm chí có thể thêm một biểu tượng cảm xúc + +118 +00:08:09,910 --> 00:08:10,743 +vào đây. + +119 +00:08:12,970 --> 00:08:16,570 +Và sau đó nội dung sẽ + +120 +00:08:16,570 --> 00:08:20,740 +nói ISS ở trên bầu trời của bạn. + +121 +00:08:22,780 --> 00:08:25,690 +Đó là nó. Đó là tất cả những gì cần làm. Bây giờ, sẽ + +122 +00:08:25,720 --> 00:08:30,220 +khá khó để kiểm tra mã này vì chúng ta phải đợi điều kiện hoàn hảo trước khi + +123 +00:08:30,250 --> 00:08:35,250 +tất cả những điều này thực sự thành sự thật. Mặc dù đây là phần cuối của thử thách + +124 +00:08:36,190 --> 00:08:37,600 +dành cho bạn, nhưng có một + +125 +00:08:37,900 --> 00:08:41,380 +điều tôi muốn thay đổi với mã này để làm cho nó tốt hơn + +126 +00:08:41,380 --> 00:08:42,212 +một chút. + +127 +00:08:42,429 --> 00:08:46,450 +Chúng ta thực sự có thể đặt câu lệnh if này bên trong vòng lặp while. + +128 +00:08:46,900 --> 00:08:50,380 +Vì vậy, chúng tôi có thể nói trong khi true, có nghĩa là vòng lặp + +129 +00:08:50,440 --> 00:08:53,860 +này sẽ lặp đi lặp lại, và một lần nữa, kiểm tra xem ISS có + +130 +00:08:53,890 --> 00:08:56,730 +hoạt động trên cao hay không và nó vào ban đêm. + +131 +00:08:57,090 --> 00:09:00,750 +Bây giờ điều này sẽ xảy ra khá thường xuyên vì nó trong vòng lặp while, nhưng + +132 +00:09:01,050 --> 00:09:04,260 +chúng ta có thể làm chậm nó bằng cách sử dụng mô-đun thời gian. + +133 +00:09:04,590 --> 00:09:09,590 +Vì vậy, chúng tôi có thể nhập mô-đun thời gian và sau đó nói thời gian. ngủ và chúng tôi có thể đưa + +134 +00:09:11,130 --> 00:09:11,630 +nó + +135 +00:09:11,630 --> 00:09:16,630 +vào chế độ ngủ trong 60 giây hoặc bao lâu bạn muốn đợi giữa + +136 +00:09:17,480 --> 00:09:20,990 +khi chạy tập lệnh. Vì vậy, bây giờ nếu bạn nhấn + +137 +00:09:21,740 --> 00:09:25,850 +run, bạn sẽ không thấy mã cuối cùng mà nó cho bạn biết rằng chương trình của bạn + +138 +00:09:25,850 --> 00:09:26,683 +đã chạy xong. + +139 +00:09:26,780 --> 00:09:31,400 +Nó thực sự liên tục chạy trong nền và nó sẽ thực thi + +140 +00:09:31,400 --> 00:09:33,800 +mã này sau mỗi 60 giây. + +141 +00:09:34,160 --> 00:09:37,250 +Vì vậy, miễn là bạn bật máy tính của mình và cài đặt này đang chạy, thì + +142 +00:09:37,610 --> 00:09:41,180 +bạn có thể chạy nó trong cả 24 giờ. Và tôi cá với bạn vào một thời + +143 +00:09:41,180 --> 00:09:42,290 +điểm nào đó trong + +144 +00:09:42,320 --> 00:09:46,070 +đêm, bạn sẽ nhận được hai hoặc ba email cho bạn biết rằng ISS đang hoạt động. + +145 +00:09:46,280 --> 00:09:50,600 +Vì vậy, tất cả những gì bạn phải theo dõi chỉ là bật thông báo trên + +146 +00:09:50,990 --> 00:09:54,530 +điện thoại và khi email đó đến, hãy nhìn lên bầu trời. + +147 +00:09:55,850 --> 00:09:58,760 +Vì vậy, tôi hy vọng bạn thích xây dựng dự án này với + +148 +00:09:58,880 --> 00:10:02,240 +tôi và tôi hy vọng rằng bạn sẽ có thể phát hiện ra ISS tối nay. + +149 +00:10:02,900 --> 00:10:05,930 +Nếu bạn làm vậy, hãy quay video và cho chúng tôi biết nó trông như thế nào. + diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Solution-issoverhead-end.zip b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Solution-issoverhead-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..765922d79643719d7abaf914afb3b993e72aee73 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 Solution-issoverhead-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:814abea543c3e053d6868b91682bfb195c0984e8aa6837d2e1f0157704101a36 +size 846 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 issoverhead-start.zip b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 issoverhead-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..76d6d41c38f70c0b8526560aeebcf0c2d13d1675 --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/007 issoverhead-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f0dc411a1f3d8f948aaa5005a2289793a58524fae42c47b03ea1d93d9ff2175 +size 720 diff --git a/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/external-links.txt b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..f12ca81b628b534017a29dd9d180822bdb9535fe --- /dev/null +++ b/part3/33 - Day 33 - Intermediate+ API Endpoints & API Parameters - ISS Overhead Notifier/external-links.txt @@ -0,0 +1,39 @@ + +001 What-is-the-ISS- +https://en.wikipedia.org/wiki/International_Space_Station + +002 Application-Programming-Interface-Wikipedia-Entry +https://en.wikipedia.org/wiki/Application_programming_interface + +003 ISS-Current-Location-API-Documentation +http://open-notify.org/Open-Notify-API/ISS-Location-Now/ + +003 JSON-Viewer-Extension +https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh + +003 or-just-use-Firefox-to-view-JSON- +https://www.mozilla.org/en-GB/exp/firefox/new/ + +004 HTTP-Status-Codes +https://httpstatuses.com/ + +004 Latitude-and-Longitude-to-Address-Tool +https://www.latlong.net/Show-Latitude-Longitude.html + +004 Python-Requests-Module-Documentation +https://docs.python-requests.org/en/latest/ + +005 Kanye-Quotes-API +https://kanye.rest/ + +006 Sunrise-and-Sunset-Times-API +https://sunrise-sunset.org/api + +006 w3schools-Python-split-method-Documentation +https://www.w3schools.com/python/ref_string_split.asp + +007 Find-Your-Current-Latitude-and-Longitude-Tool +https://www.latlong.net + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 Day 34 Goals what you will make by the end of the day.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 Day 34 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0c8a4780d25d4ddd2bb6b505a17ee7a2a0699fc3 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 Day 34 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b2c55b989dd23fdfc55943cc88e6a34384eb8a995d0899af29e53b4d50714dd +size 30645211 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 Day 34 Goals what you will make by the end of the day_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 Day 34 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..71e49a6c840797f6bb1125985b6b37de2a130385 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 Day 34 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,140 @@ +1 +00:00:00,300 --> 00:00:00,930 +Xin chào các bạn, + +2 +00:00:00,930 --> 00:00:05,930 +đây là Angela và chào mừng bạn đến với Ngày thứ 34 của 100 Ngày viết mã. Hôm nay chúng ta sẽ thực hiện một + +3 +00:00:07,410 --> 00:00:09,510 +bài đánh giá nhỏ và chúng ta + +4 +00:00:09,870 --> 00:00:14,870 +sẽ làm việc với một API đố để tạo ra một ứng dụng trắc nghiệm có tên + +5 +00:00:15,360 --> 00:00:16,193 +là Quizzler. + +6 +00:00:16,590 --> 00:00:21,590 +Bây giờ chúng ta sẽ sử dụng một API mà chúng ta đã thấy cách đây rất lâu + +7 +00:00:22,170 --> 00:00:23,790 +được gọi là cơ sở + +8 +00:00:23,940 --> 00:00:27,840 +dữ liệu câu đố mở, chứa hơn 3000 câu hỏi đã được xác + +9 +00:00:28,170 --> 00:00:33,170 +minh mà chúng ta có thể chọn ngẫu nhiên để điền vào ứng dụng câu đố của mình. + +10 +00:00:34,320 --> 00:00:39,590 +Bây giờ, mục đích của việc xây dựng ứng dụng này là để xem lại những gì chúng ta đã học được về + +11 +00:00:40,170 --> 00:00:45,170 +cách sử dụng điểm cuối API và gửi yêu cầu đến một điểm cuối cụ thể để yêu cầu một số + +12 +00:00:46,410 --> 00:00:47,243 +phần dữ liệu. + +13 +00:00:47,550 --> 00:00:51,300 +Và chúng tôi cũng sẽ xem xét những gì chúng tôi đã học được + +14 +00:00:51,570 --> 00:00:56,340 +về các tham số API, chuyển đổi và chuyển đổi các đầu vào khác nhau để nhận các + +15 +00:00:56,340 --> 00:01:00,390 +phần dữ liệu khác nhau từ API. Và với những thứ đó kết hợp + +16 +00:01:00,450 --> 00:01:03,330 +lại, chúng tôi sẽ có thể xây dựng ứng dụng Quizzler của + +17 +00:01:03,780 --> 00:01:06,450 +chúng tôi, ứng dụng này sẽ được xây dựng bằng tkinter. + +18 +00:01:06,990 --> 00:01:08,760 +Vì vậy, đây là những gì nó + +19 +00:01:08,820 --> 00:01:13,820 +sẽ trông như thế nào và chúng tôi có thể theo dõi điểm số của mình và xem câu hỏi đúng / sai + +20 +00:01:14,220 --> 00:01:17,460 +hiển thị ở giữa và sau đó chúng tôi có thể chọn đúng hoặc sai. + +21 +00:01:18,060 --> 00:01:22,080 +Vì vậy, tôi không biết câu trả lời cho điều này là gì. Vì vậy, tôi chỉ sẽ đoán. + +22 +00:01:23,210 --> 00:01:28,040 +1: Rất tiếc! Có thể không. Ừm, 0: hơi do thuốc lá điện tử + +23 +00:01:28,130 --> 00:01:32,120 +tạo ra thực chất là nước. Tôi nghĩ vậy. Không. + +24 +00:01:32,780 --> 00:01:37,250 +Tôi thực sự rất tệ trong câu đố này nên tôi chỉ đoán từ bây giờ. + +25 +00:01:38,750 --> 00:01:41,750 +Vậy là xong. Tôi đã làm đúng và điểm của tôi đã tăng lên. + +26 +00:01:42,290 --> 00:01:45,020 +Đây là một câu hỏi liên quan đến máy tính, vì vậy tôi biết câu hỏi đó. + +27 +00:01:46,190 --> 00:01:48,650 +Nhưng về cơ bản đây là những gì chúng tôi sẽ xây dựng. + +28 +00:01:48,800 --> 00:01:53,240 +Và những câu hỏi mà chúng tôi đang trả lời ở đây đến từ cơ sở dữ liệu + +29 +00:01:53,480 --> 00:01:55,760 +câu đố mở chứa vô số câu hỏi. + +30 +00:01:55,760 --> 00:02:00,760 +Vì vậy, chúng tôi không cần phải tạo ra các câu hỏi và thậm chí chúng tôi có thể chọn + +31 +00:02:01,580 --> 00:02:05,930 +danh mục câu hỏi mà chúng tôi muốn cũng như số lượng câu hỏi chúng tôi muốn và + +32 +00:02:06,260 --> 00:02:10,280 +chúng tôi sẽ sử dụng API này để điền các câu hỏi vào ứng dụng câu + +33 +00:02:10,280 --> 00:02:12,890 +hỏi của chúng tôi. Đó là những gì chúng tôi sẽ xây dựng. + +34 +00:02:13,040 --> 00:02:14,900 +Vì vậy, nếu bạn chuyển sang bài học tiếp + +35 +00:02:15,140 --> 00:02:17,780 +theo, chúng ta sẽ bắt đầu bằng cách khai thác vào API đó. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 The-Open-Trivia-Database.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 The-Open-Trivia-Database.url new file mode 100644 index 0000000000000000000000000000000000000000..3efba4ac7084fc31455d928954018ceb884f3471 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/001 The-Open-Trivia-Database.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://opentdb.com/ \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 Trivia Question API Challenge.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 Trivia Question API Challenge.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2a327a6ca9c66e305c0c94f0a647c40abece6bed --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 Trivia Question API Challenge.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5ce7cf0da982090a09866592c14e1b0ffa6f889025a9040a75ca8351779444a +size 63967860 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 Trivia Question API Challenge_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 Trivia Question API Challenge_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..76442c893956899f0823bcb69655aab0ab51fb5a --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 Trivia Question API Challenge_vi.srt @@ -0,0 +1,344 @@ +1 +00:00:00,570 --> 00:00:05,570 +Để bắt đầu, hãy truy cập tài nguyên khóa học như mọi khi và tải xuống tệp zip bắt đầu + +2 +00:00:06,060 --> 00:00:10,200 +cho dự án bắt đầu ngày hôm nay. Và khi bạn đã hoàn thành việc đó, hãy + +3 +00:00:10,200 --> 00:00:14,910 +tiếp tục giải nén tệp và mở nó bên trong PyCharm. Bây giờ, nếu chúng ta nhìn vào + +4 +00:00:14,940 --> 00:00:17,790 +bên trong thư mục dự án, bạn có thể + +5 +00:00:17,910 --> 00:00:20,430 +thấy chúng ta có một loạt các + +6 +00:00:20,730 --> 00:00:23,550 +hình ảnh sẽ được sử dụng cho các + +7 +00:00:24,060 --> 00:00:29,060 +nút và chúng ta cũng có rất nhiều mã mà chúng ta đã tạo trong + +8 +00:00:30,540 --> 00:00:34,650 +dự án đố trước đó. Có vẻ như đó là một thời gian dài + +9 +00:00:34,770 --> 00:00:36,720 +trước đây, nhưng trở lại ngày 17, chúng tôi + +10 +00:00:36,990 --> 00:00:41,990 +đã học về cách tạo các lớp và dự án mà chúng tôi xây dựng để làm điều đó là một bài kiểm + +11 +00:00:42,570 --> 00:00:45,270 +tra dựa trên văn bản. Và trên thực tế, + +12 +00:00:45,300 --> 00:00:49,740 +khi bạn đã tải xuống và mở tệp bắt đầu cho dự án hôm nay, bạn + +13 +00:00:50,010 --> 00:00:52,080 +thực sự có thể chạy chương trình này. + +14 +00:00:52,470 --> 00:00:55,500 +Vì vậy, hãy mở main lên. py và chạy nó. + +15 +00:00:55,770 --> 00:01:00,770 +Sau đó, bạn có thể thấy định dạng ban đầu của ứng dụng câu đố đang + +16 +00:01:01,590 --> 00:01:06,000 +hoạt động bên trong bảng điều khiển. Chúng tôi có thể nhập đúng hoặc sai và + +17 +00:01:07,170 --> 00:01:10,530 +nó sẽ cung cấp cho chúng tôi một số phản hồi, liệu chúng tôi có đúng + +18 +00:01:10,560 --> 00:01:13,950 +hay sai nếu chúng tôi nhập sai và cả điểm số hiện tại của chúng tôi. + +19 +00:01:16,020 --> 00:01:18,720 +Bây giờ điều này thật tuyệt vời vào ngày 17, + +20 +00:01:18,810 --> 00:01:23,490 +nhưng bây giờ chúng ta đã biết tất cả về cách tạo giao diện người dùng đồ họa bằng tkinter + +21 +00:01:23,970 --> 00:01:27,840 +cũng như toàn bộ những thứ chúng ta đã học về API ngay bây giờ, chúng + +22 +00:01:27,840 --> 00:01:31,560 +tôi sẽ nâng cấp ứng dụng bài kiểm tra này lên cấp độ tiếp theo. + +23 +00:01:32,700 --> 00:01:35,610 +Điều đầu tiên chúng tôi muốn nâng cấp là tại thời điểm này, + +24 +00:01:35,640 --> 00:01:37,920 +những câu hỏi này đã được mã hóa khó. + +25 +00:01:38,220 --> 00:01:40,920 +Vì vậy, bên trong dữ liệu của chúng tôi. py, bạn có thể + +26 +00:01:41,220 --> 00:01:46,220 +xem tất cả các câu hỏi này dưới dạng danh sách các đối tượng từ điển. + +27 +00:01:46,800 --> 00:01:48,660 +Và vào thời điểm đó, nơi + +28 +00:01:48,960 --> 00:01:52,590 +mà chúng tôi nhận được tất cả những câu hỏi này thực tế là, + +29 +00:01:52,620 --> 00:01:54,510 +cơ sở dữ liệu câu đố mở. + +30 +00:01:54,900 --> 00:01:59,010 +Nhưng những gì chúng tôi đã làm ở đây là chúng tôi chọn số lượng câu hỏi + +31 +00:01:59,340 --> 00:02:01,890 +chúng tôi muốn, chúng tôi chọn danh mục mà chúng + +32 +00:02:02,220 --> 00:02:07,170 +tôi muốn, sau đó chúng tôi thay đổi loại thành true và false và chúng tôi đã nói, tạo URL API. + +33 +00:02:07,590 --> 00:02:09,780 +Và sau đó khi URL đó được tạo, tất cả những + +34 +00:02:10,080 --> 00:02:15,080 +gì chúng tôi làm là đưa nó vào trình duyệt của mình và chúng tôi nhận được dữ liệu này và chúng tôi đưa nó + +35 +00:02:15,810 --> 00:02:18,960 +vào dữ liệu câu hỏi của mình. Bây giờ, điều này, được + +36 +00:02:18,990 --> 00:02:22,710 +mã hóa cứng, rõ ràng là sẽ không bao giờ thay đổi. + +37 +00:02:23,220 --> 00:02:28,220 +Vì vậy, những gì chúng tôi muốn làm thay vào đó là chúng tôi muốn nhận 10 câu hỏi từ cơ sở + +38 +00:02:29,040 --> 00:02:30,090 +dữ liệu câu đố + +39 +00:02:30,720 --> 00:02:35,720 +mở, nhưng lần này chúng tôi muốn đưa ra một yêu cầu đối với API để chúng tôi luôn nhận được + +40 +00:02:36,480 --> 00:02:39,360 +các câu hỏi khác nhau và các câu trả lời khác nhau. + +41 +00:02:40,710 --> 00:02:45,710 +Ý tưởng của thử thách này là sửa đổi mã trong dữ liệu. tệp py để nhận 10 câu hỏi mới + +42 +00:02:46,380 --> 00:02:51,210 +bằng cách sử dụng cơ sở dữ liệu câu đố mở mỗi khi chương trình được chạy. + +43 +00:02:51,750 --> 00:02:55,140 +Đây là những gì mã của bạn phải làm sau khi bạn + +44 +00:02:55,140 --> 00:02:59,860 +đã hoàn thành thử thách thành công. Bạn sẽ vẫn nhận được một câu đố dựa trên bảng + +45 +00:02:59,890 --> 00:03:04,890 +điều khiển, nhưng lần này, văn bản và câu trả lời chính xác đến từ cơ sở dữ liệu câu đố mở thông qua + +46 +00:03:05,470 --> 00:03:06,303 +lệnh gọi API. + +47 +00:03:06,310 --> 00:03:10,120 +Bạn sẽ thấy rằng bất kỳ ký hiệu nào như dấu ngoặc kép đơn sẽ không + +48 +00:03:10,120 --> 00:03:11,230 +được hiển thị chính xác, + +49 +00:03:11,500 --> 00:03:15,520 +nhưng làm cho lệnh gọi API hoạt động là bước đầu tiên và là mục tiêu của + +50 +00:03:15,520 --> 00:03:16,353 +thử thách này. + +51 +00:03:17,050 --> 00:03:22,050 +Vì vậy, những gì tôi muốn bạn làm là đặt số lượng câu hỏi thành 10 + +52 +00:03:22,330 --> 00:03:25,480 +và để trống danh mục, để trống khó khăn, nhưng + +53 +00:03:25,780 --> 00:03:30,780 +hãy đảm bảo rằng loại được đặt thành true-false và sau đó tạo URL API này. + +54 +00:03:32,830 --> 00:03:37,830 +Bây giờ hãy nhớ những gì tôi đã nói trước đây rằng điểm kết thúc API + +55 +00:03:38,920 --> 00:03:43,360 +là mọi thứ trước dấu chấm hỏi. Vì vậy, đây là URL cơ sở mà chúng tôi sẽ làm việc với. + +56 +00:03:43,810 --> 00:03:47,500 +Và sau dấu chấm hỏi, chúng tôi có các thông số khác nhau. + +57 +00:03:47,890 --> 00:03:50,290 +Vì vậy, chúng tôi có một tham số gọi + +58 +00:03:50,350 --> 00:03:55,030 +là số tiền được đặt thành 10 và chúng tôi có một tham số khác được gọi + +59 +00:03:55,270 --> 00:03:57,340 +là loại được đặt thành từ boolean. + +60 +00:03:57,940 --> 00:04:01,270 +Vì vậy, bạn sẽ phải nghĩ lại những gì bạn đã học được + +61 +00:04:01,270 --> 00:04:02,103 +trong các + +62 +00:04:02,320 --> 00:04:07,320 +bài học ngày hôm qua và sử dụng mô-đun yêu cầu để đưa ra yêu cầu đối với API này + +63 +00:04:09,940 --> 00:04:11,740 +và chuyển các tham số cần thiết. + +64 +00:04:12,250 --> 00:04:16,240 +Và khi bạn đã tạo dữ liệu từ API đó, thì tôi + +65 +00:04:16,660 --> 00:04:21,660 +muốn bạn đảm bảo rằng bạn tiếp cận với dữ liệu mà bạn lấy lại + +66 +00:04:21,760 --> 00:04:24,970 +và lấy dữ liệu ở định dạng này. + +67 +00:04:25,690 --> 00:04:30,310 +Và chúng tôi sẽ thay thế question_data này bằng các câu hỏi thực tế mà chúng tôi + +68 +00:04:30,310 --> 00:04:33,520 +nhận được từ API cơ sở dữ liệu câu đố mở. + +69 +00:04:34,060 --> 00:04:38,020 +Khi chúng tôi thực hiện yêu cầu đối với API trong trình duyệt của mình, chúng + +70 +00:04:38,410 --> 00:04:41,140 +tôi nhận được một thứ trông giống như thế này. + +71 +00:04:41,560 --> 00:04:45,610 +Vì vậy, chúng tôi có một từ điển hai mục; một là mã phản hồi + +72 +00:04:45,940 --> 00:04:47,590 +và một là kết quả. + +73 +00:04:47,920 --> 00:04:52,920 +Bây giờ giá trị cho kết quả chính này là danh sách các đối tượng từ điển mà chúng + +74 +00:04:54,310 --> 00:04:58,540 +ta thực sự muốn và nó có cấu trúc rất giống với cấu trúc này. + +75 +00:04:58,930 --> 00:05:03,220 +Vì vậy, đó là những gì chúng tôi muốn. Vì vậy, mọi thứ bên trong đây, về cơ bản. + +76 +00:05:03,970 --> 00:05:08,950 +Bây giờ chúng ta sẽ vẫn gọi nó là question_data vì ở những nơi khác trong chính của chúng ta. py chúng tôi đang khai + +77 +00:05:08,950 --> 00:05:11,680 +thác dữ liệu này ở đây. + +78 +00:05:12,160 --> 00:05:13,990 +Vì vậy, hãy chắc chắn rằng bạn đặt tên nó giống nhau. + +79 +00:05:14,170 --> 00:05:17,410 +Và khi bạn đã thực hiện điều này thành công, thì bạn + +80 +00:05:17,710 --> 00:05:21,370 +sẽ có thể nhận xét tất cả mã này ở đây, 1: phải + +81 +00:05:24,480 --> 00:05:25,050 +không? + +82 +00:05:25,050 --> 00:05:30,050 +0: Và sau đó chỉ cần chạy chương trình từ chính. py mà không có bất kỳ thay đổi nào + +83 +00:05:30,840 --> 00:05:32,220 +và nó sẽ vẫn + +84 +00:05:32,430 --> 00:05:37,350 +hoạt động nhưng lần này nó sẽ sử dụng các câu hỏi và câu trả lời mà bạn + +85 +00:05:37,350 --> 00:05:42,030 +đã tìm nạp từ API. Đây là một thách thức cho bạn. Vì vậy, tôi muốn bạn tạm + +86 +00:05:42,090 --> 00:05:46,080 +dừng video, suy nghĩ về cách bạn có thể làm điều đó và hoàn thành thử thách. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 quizzler-app-start.zip b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 quizzler-app-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..11424541765e3c7880bf416fea9231478251fb53 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/002 quizzler-app-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c76c4c5ec76869359e68f73634df089344283fc9cc51352606af3dd9aac870 +size 7555 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/003 Solution & Walkthrough for getting Trivia Questions.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/003 Solution & Walkthrough for getting Trivia Questions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b6d6dd943eb63e67c194cc8231cf64312bfff120 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/003 Solution & Walkthrough for getting Trivia Questions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c62388746d361cb425b941a53f718b3e728f6261c2ded54c2d5cab878ae90a3 +size 21485884 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/003 Solution & Walkthrough for getting Trivia Questions_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/003 Solution & Walkthrough for getting Trivia Questions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a0429da9574141e983d7a62e09699b06cf809494 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/003 Solution & Walkthrough for getting Trivia Questions_vi.srt @@ -0,0 +1,204 @@ +1 +00:00:00,990 --> 00:00:01,350 +Được rồi. + +2 +00:00:01,350 --> 00:00:06,350 +Vì vậy, điều đầu tiên chúng ta cần làm mà chúng ta đã học để làm việc + +3 +00:00:06,510 --> 00:00:08,910 +với API là nhập mô-đun yêu cầu. + +4 +00:00:09,390 --> 00:00:11,520 +Và khi chúng tôi đã nhập + +5 +00:00:11,640 --> 00:00:16,640 +xong, chúng tôi cần nhận được phản hồi từ URL mà chúng tôi đã thấy ở đây. + +6 +00:00:18,270 --> 00:00:22,440 +Như tôi đã đề cập, điểm kết thúc là mọi thứ trước dấu chấm hỏi. + +7 +00:00:22,890 --> 00:00:26,760 +Vì vậy, hãy đặt nó làm URL cho yêu cầu nhận của chúng tôi. + +8 +00:00:27,270 --> 00:00:30,180 +Và sau đó, chúng ta cần thêm một số tham số. + +9 +00:00:30,690 --> 00:00:35,040 +Vì vậy, hãy đặt các tham số của chúng ta thành một từ điển Python + +10 +00:00:35,760 --> 00:00:40,110 +và khóa phải khớp với khóa được hiển thị ở đây và giá trị cũng + +11 +00:00:40,500 --> 00:00:43,830 +phải khớp với giá trị được đưa ra ở đây. + +12 +00:00:44,250 --> 00:00:46,770 +Vì vậy, chúng tôi có hai chìa khóa; số lượng và loại. + +13 +00:00:47,220 --> 00:00:49,680 +Vì vậy, cả hai đều sẽ là + +14 +00:00:49,710 --> 00:00:53,340 +chuỗi, nhưng giá trị có thể là số nếu nó phù hợp. + +15 +00:00:53,850 --> 00:00:58,170 +Vì vậy, số lượng đặt số lượng câu hỏi mà chúng tôi muốn trả lại từ API, sau đó + +16 +00:00:58,770 --> 00:01:03,270 +loại đặt loại câu hỏi mà chúng tôi muốn. Vì vậy, trong trường hợp của + +17 +00:01:03,300 --> 00:01:08,220 +chúng tôi, chúng tôi muốn kiểu dữ liệu boolean khớp với mục nhập chính xác này. + +18 +00:01:08,520 --> 00:01:11,160 +Vì vậy, theo cách đó chúng tôi nhận lại các câu hỏi đúng-sai. + +19 +00:01:11,940 --> 00:01:16,410 +Bây giờ chúng ta đã làm xong, chúng ta có thể sử dụng từ điển tham số này + +20 +00:01:16,410 --> 00:01:17,243 +làm tham số, + +21 +00:01:17,700 --> 00:01:22,700 +và sau đó chúng ta muốn phản hồi của mình đưa ra một ngoại lệ nếu có bất kỳ lỗi nào. + +22 +00:01:23,460 --> 00:01:27,750 +Và sau đó chúng tôi sẽ nhận được phản hồi của mình để cung cấp cho chúng tôi dữ liệu + +23 +00:01:27,750 --> 00:01:31,290 +bằng cách sử dụng phương thức JSON. Nếu đây là dữ liệu của chúng + +24 +00:01:31,320 --> 00:01:34,650 +tôi, hãy tiếp tục và in nó ra và xem nó trông như thế nào. + +25 +00:01:35,100 --> 00:01:40,100 +Chúng tôi có thể chạy tệp, dữ liệu cụ thể này. py, bằng cách nhấp chuột phải và + +26 +00:01:40,170 --> 00:01:44,940 +chỉ nói chạy dữ liệu. Và sau khi hoàn tất, bạn có thể + +27 +00:01:45,450 --> 00:01:50,450 +thấy chúng tôi đã in ra dữ liệu và phần mà chúng tôi quan tâm là giá trị + +28 +00:01:51,300 --> 00:01:55,050 +của kết quả quan trọng này, vì nó chứa danh sách các câu hỏi. + +29 +00:01:55,590 --> 00:01:59,760 +Đó là phần duy nhất chúng tôi quan tâm. Vì vậy, để khai thác điều đó, chúng + +30 +00:02:00,060 --> 00:02:03,750 +ta phải thêm một tập hợp các dấu ngoặc vuông và sau đó chuyển + +31 +00:02:04,260 --> 00:02:08,100 +vào khóa được gọi là kết quả. Vì vậy, hãy đặt điều đó làm chìa khóa. + +32 +00:02:08,400 --> 00:02:13,400 +Và bây giờ chúng tôi đang tìm nạp tất cả các mục là kết quả từ đối tượng dữ + +33 +00:02:14,430 --> 00:02:19,140 +liệu này mà chúng tôi lấy lại được. Vì vậy, bây giờ, nếu tôi chạy lại điều này, + +34 +00:02:19,140 --> 00:02:22,560 +bạn có thể thấy bây giờ chúng ta có một danh sách các đối tượng + +35 +00:02:22,890 --> 00:02:25,080 +câu hỏi mà mỗi đối tượng chứa một từ + +36 +00:02:25,350 --> 00:02:29,520 +điển và nó bây giờ trông khá giống với cấu trúc này mà chúng ta đã có trước đây. + +37 +00:02:30,300 --> 00:02:34,890 +Bây giờ, thay vì in cái này, chúng ta có thể lưu nó dưới dạng question_data. + +38 +00:02:36,450 --> 00:02:40,200 +Vì vậy, bây giờ câu hỏi_data này và đã thay thế câu hỏi_data này, và + +39 +00:02:40,620 --> 00:02:41,760 +như tôi đã đề + +40 +00:02:41,790 --> 00:02:46,790 +cập, chúng tôi có thể chạy chính của chúng tôi. py và bây giờ nó sẽ hoạt động giống như trước đây. + +41 +00:02:49,200 --> 00:02:54,200 +Nhưng lần này nó sẽ sử dụng các câu hỏi đến từ API của chúng tôi. + +42 +00:02:54,840 --> 00:02:58,890 +Chiến tranh lạnh kết thúc với cái chết của Joseph Stalin, đúng hay sai. + +43 +00:02:59,170 --> 00:03:03,430 +Tôi nghĩ điều đó thực sự sai. Nhưng hãy lưu ý cách khi chúng + +44 +00:03:03,430 --> 00:03:05,830 +tôi lấy lại dữ liệu từ API, nó được + +45 +00:03:06,160 --> 00:03:11,160 +định dạng theo cách mà chúng tôi có một số ký hiệu nhất định đã được mã hóa bằng + +46 +00:03:11,290 --> 00:03:14,290 +cách sử dụng định dạng cụ thể này bởi vì tất cả + +47 +00:03:14,650 --> 00:03:19,650 +điều này nhằm đại diện cho một dấu nháy đơn. Trong bài học tiếp theo, tôi sẽ chỉ + +48 +00:03:19,900 --> 00:03:20,350 +cho + +49 +00:03:20,350 --> 00:03:25,120 +bạn cách chúng ta có thể định dạng văn bản mà chúng ta lấy lại + +50 +00:03:25,120 --> 00:03:28,030 +để biến bảng mã này thành các ký tự + +51 +00:03:28,180 --> 00:03:32,650 +thực sự mà nó nên có. Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Documentation-on-HTML-Entities.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Documentation-on-HTML-Entities.url new file mode 100644 index 0000000000000000000000000000000000000000..df832937a8cf9aa2c57dcf108f7ac286f232a7d5 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Documentation-on-HTML-Entities.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/html/html_entities.asp \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 FreeFormatter-HTML-Unescape-Tool.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 FreeFormatter-HTML-Unescape-Tool.url new file mode 100644 index 0000000000000000000000000000000000000000..a6572d2600462531ac4068226f766cd7256b8135 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 FreeFormatter-HTML-Unescape-Tool.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.freeformatter.com/html-escape.html \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 StackOverflow-Answer-on-Unescaping-HTML-Entities-in-Python.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 StackOverflow-Answer-on-Unescaping-HTML-Entities-in-Python.url new file mode 100644 index 0000000000000000000000000000000000000000..cc6abcca1d0681332f9404b8df5217d9a65920a5 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 StackOverflow-Answer-on-Unescaping-HTML-Entities-in-Python.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://stackoverflow.com/questions/2087370/decode-html-entities-in-python-string \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Unescaping HTML Entities.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Unescaping HTML Entities.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ee0cac62515c60d58952e4b0a2b288728935071c --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Unescaping HTML Entities.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58ea4929fc4b3d941c0e47eb6ed1e44166eaa188fc2297078168f04506b8b493 +size 29658676 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Unescaping HTML Entities_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Unescaping HTML Entities_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c8f2ac91a09360c8f77fd3cdf6a3892c45c900f1 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/004 Unescaping HTML Entities_vi.srt @@ -0,0 +1,236 @@ +1 +00:00:00,630 --> 00:00:01,740 +Trong bài học trước, + +2 +00:00:01,800 --> 00:00:06,800 +chúng tôi đã quản lý để API của mình hoạt động và chúng tôi đã nhận lại một số dữ liệu trực tiếp. + +3 +00:00:07,800 --> 00:00:08,910 +Nhưng khi chúng + +4 +00:00:09,030 --> 00:00:13,500 +tôi chạy nó, chúng tôi thấy rằng một số văn bản mà chúng tôi lấy lại + +5 +00:00:13,500 --> 00:00:17,970 +được định dạng thực sự kỳ lạ với những dấu thăng và ký hiệu và đó + +6 +00:00:18,090 --> 00:00:21,290 +không phải là văn bản thực tế mà chúng tôi thấy. + +7 +00:00:21,920 --> 00:00:24,290 +Vậy điều gì đang xảy ra ở đây? Chà, những gì + +8 +00:00:24,380 --> 00:00:28,310 +chúng ta thực sự thấy ở đây được gọi là các thực thể + +9 +00:00:28,880 --> 00:00:33,880 +HTML và có một cách thay thế các ký tự nhất định trong HTML để nó không + +10 +00:00:35,060 --> 00:00:38,990 +bị nhầm lẫn với mã HTML. Vì vậy, ví dụ, + +11 +00:00:39,020 --> 00:00:44,020 +ký hiệu less than có thể là một phần của mã HTML. + +12 +00:00:44,600 --> 00:00:48,590 +Và thay vì sử dụng điều đó, chúng ta phải sử dụng + +13 +00:00:48,650 --> 00:00:51,890 +& lt và sau đó là dấu chấm phẩy. + +14 +00:00:52,850 --> 00:00:55,100 +Vì vậy, nếu chúng ta nhìn xuống bảng này, + +15 +00:00:55,370 --> 00:01:00,370 +chúng ta thực sự có thể thấy điều này & quot; thực sự là viết tắt của một dấu ngoặc kép. + +16 +00:01:01,940 --> 00:01:05,930 +Và điều đó sẽ hợp lý vì nó đang nói + +17 +00:01:05,930 --> 00:01:07,400 +"Mario Kart 64" + +18 +00:01:08,060 --> 00:01:11,570 +và số 039 này, nếu chúng ta tìm kiếm + +19 +00:01:11,570 --> 00:01:16,570 +trong danh sách này, thực sự là một dấu ngoặc kép duy nhất. + +20 +00:01:17,570 --> 00:01:20,960 +Và điều đó cũng có ý nghĩa, vì nó sẽ là cái chết của Stalin. + +21 +00:01:21,740 --> 00:01:26,270 +Vậy làm thế nào để chúng ta nắm được văn bản thực tế mà con người có thể đọc được? Chà, chúng ta có thể sử + +22 +00:01:26,420 --> 00:01:30,740 +dụng công cụ được gọi là trình định dạng miễn phí này để hiển + +23 +00:01:31,160 --> 00:01:36,050 +thị các kết quả HTML mà chúng ta đang lấy lại từ API của mình. + +24 +00:01:36,890 --> 00:01:40,040 +Tôi đã sao chép và dán phần này mà chúng tôi có ở đây. + +25 +00:01:41,540 --> 00:01:43,790 +Và nếu tôi tiếp tục và nhấp vào unescape, + +26 +00:01:44,060 --> 00:01:49,060 +bạn có thể thấy rằng nó định dạng nó thành định dạng ban đầu con người có thể đọc được và + +27 +00:01:49,430 --> 00:01:53,480 +bây giờ nó nói trong "Mario Kart 64", Waluigi là một nhân vật có thể chơi được. + +28 +00:01:54,110 --> 00:01:58,580 +Và nếu tôi dán chiến tranh lạnh đã kết thúc với Joseph Stalin, blah, blah, blah, cái chết và + +29 +00:01:59,030 --> 00:02:02,120 +tôi nhấp vào unescape, thì bạn có thể thấy nó nói rằng Chiến + +30 +00:02:02,120 --> 00:02:06,500 +tranh lạnh đã kết thúc với cái chết của Joseph Stalin và nó thay thế nó bằng một + +31 +00:02:06,560 --> 00:02:08,449 +dấu nháy đơn. Bây giờ, về + +32 +00:02:08,449 --> 00:02:13,070 +cơ bản, chúng tôi biết Google phải làm gì và đó là bước đầu tiên để giải quyết + +33 +00:02:13,070 --> 00:02:14,240 +bất kỳ vấn đề nào. + +34 +00:02:14,720 --> 00:02:18,620 +Vì vậy, nếu bạn Google để thoát các thực thể HTML bằng Python, thì kết + +35 +00:02:18,860 --> 00:02:22,940 +quả đầu tiên chúng tôi nhận được trong Stack Overflow sẽ cho chúng tôi câu trả lời. + +36 +00:02:23,540 --> 00:02:28,340 +Chúng tôi phải nhập mô-đun HTML và sử dụng một trong các phương thức trong mô-đun đó + +37 +00:02:28,340 --> 00:02:33,110 +được gọi là unescape để hủy bố cục văn bản mà chúng tôi đang lấy lại. + +38 +00:02:33,950 --> 00:02:37,790 +Phần mà chúng tôi quan tâm đến vấn đề này nằm trong bộ não đố vui của chúng + +39 +00:02:38,270 --> 00:02:42,260 +tôi, bởi vì đó là phần mà chúng tôi định dạng nó thành câu trả lời của người dùng. + +40 +00:02:43,130 --> 00:02:45,330 +Hãy thay đổi văn bản câu hỏi + +41 +00:02:45,380 --> 00:02:50,380 +để bằng với bản thân. câu hỏi_ hiện_ hành. text, vì vậy phần này mà + +42 +00:02:50,870 --> 00:02:52,640 +chúng ta có ở đây đang được + +43 +00:02:52,970 --> 00:02:57,970 +đưa vào đầu vào của chúng ta và chúng ta có thể sử dụng q_text này để thay thế. + +44 +00:02:59,800 --> 00:03:03,640 +Nhưng thay vì chỉ sử dụng văn bản mà chúng tôi lấy lại + +45 +00:03:03,970 --> 00:03:06,550 +từ API, chúng tôi sẽ nhập mô-đun HTML. + +46 +00:03:08,550 --> 00:03:08,970 +1: Vâng. + +47 +00:03:08,970 --> 00:03:13,970 +0: Và chúng tôi sẽ sử dụng phương thức bên trong mô-đun HTML này được gọi là unescape + +48 +00:03:14,700 --> 00:03:18,150 +để hủy bỏ chuỗi này mà chúng tôi nhận được từ API. + +49 +00:03:18,930 --> 00:03:23,700 +Và bây giờ nếu tôi chạy lại đoạn mã này, bạn có thể thấy rằng lần này, + +50 +00:03:23,730 --> 00:03:28,730 +bất kể thứ gì bên trong chuỗi, hãy nói dấu nháy đơn trong trường hợp này hoặc dấu + +51 +00:03:31,860 --> 00:03:35,580 +ngoặc kép trong trường hợp này, chúng đều được định dạng chính xác. + +52 +00:03:36,780 --> 00:03:37,613 +Đây là bạn có nó. + +53 +00:03:38,070 --> 00:03:42,270 +Chúng tôi bắt đầu với một số ký tự lạ và sau khi tìm hiểu kỹ trên Google, chúng tôi đã tìm ra giải + +54 +00:03:42,270 --> 00:03:47,190 +pháp để biến chúng thành văn bản có thể đọc được của con người. Là một lập trình viên, đây là một kỹ + +55 +00:03:47,220 --> 00:03:49,500 +năng mà bạn phải thực sự trau dồi. + +56 +00:03:49,800 --> 00:03:53,040 +Đây là thứ sẽ đưa bạn lên cấp độ tiếp theo + +57 +00:03:53,250 --> 00:03:55,680 +lên cấp độ ++ trung cấp này. + +58 +00:03:56,010 --> 00:03:59,040 +Bạn phải tìm ra giải pháp cho các vấn đề của chính mình và Google + +59 +00:03:59,340 --> 00:04:01,020 +là người bạn tốt nhất của bạn. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/005 Class based Tkinter UI.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/005 Class based Tkinter UI.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..37c275a80b0bfde39a764fa2b7bb8bbc825fd384 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/005 Class based Tkinter UI.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:499d33575225500f485eaa5888c730eefd9921ba026d279842f3b881e28c38b4 +size 159122282 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/005 Class based Tkinter UI_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/005 Class based Tkinter UI_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cc761fcc9d9fec05773c458e11f5fde5461cee9d --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/005 Class based Tkinter UI_vi.srt @@ -0,0 +1,888 @@ +1 +00:00:00,210 --> 00:00:04,710 +Vì vậy, bây giờ chương trình của chúng tôi hoạt động cho các câu hỏi + +2 +00:00:05,160 --> 00:00:10,160 +dựa trên văn bản, đã đến lúc nâng cấp chương trình này để nó thực sự có giao + +3 +00:00:10,530 --> 00:00:13,830 +diện người dùng đồ họa. Bạn sẽ nhận thấy rằng trong thư mục dự án, + +4 +00:00:14,150 --> 00:00:16,790 +có một tệp được gọi là ui. py, và hiện tại + +5 +00:00:17,420 --> 00:00:22,160 +nó trống khá nhiều, ngoài một hằng số duy nhất đặt màu + +6 +00:00:22,430 --> 00:00:24,950 +chủ đề. Bây giờ, những gì chúng + +7 +00:00:24,950 --> 00:00:28,310 +tôi đang cố gắng tạo ra là một thứ trông giống như thế này. + +8 +00:00:28,790 --> 00:00:31,850 +Vì vậy, chúng tôi có một số loại nhãn bảng + +9 +00:00:32,060 --> 00:00:36,110 +điểm, chúng tôi có một canvas với nền trắng, và sau đó trên canvas, + +10 +00:00:36,440 --> 00:00:37,670 +chúng tôi có + +11 +00:00:37,700 --> 00:00:42,020 +một số văn bản ở giữa và sau đó chúng tôi có một nút true + +12 +00:00:42,020 --> 00:00:46,820 +và một nút false mỗi lần sử dụng hình ảnh đúng và sai từ thư mục này. + +13 +00:00:47,480 --> 00:00:51,680 +Bây giờ chúng ta đã thấy cách chúng ta có thể tạo giao diện người dùng đồ họa bằng tkinter. + +14 +00:00:52,130 --> 00:00:55,190 +Nhưng trong trường hợp này, chúng ta sẽ làm điều gì đó hơi khác một chút. + +15 +00:00:55,790 --> 00:00:59,060 +Chúng tôi sẽ tạo giao diện người dùng của mình trong tkinter nhưng chúng + +16 +00:00:59,330 --> 00:01:01,730 +tôi sẽ làm điều đó bên trong một lớp. + +17 +00:01:02,210 --> 00:01:05,870 +Nếu bạn còn nhớ từ ngày 17 dự án này bắt nguồn từ + +18 +00:01:06,260 --> 00:01:09,170 +đâu, đó là khi chúng ta học về Lập trình hướng + +19 +00:01:09,530 --> 00:01:13,850 +đối tượng và chúng ta đã học về cách tách các mối quan tâm của mình + +20 +00:01:13,910 --> 00:01:18,110 +ra như phần tìm nạp dữ liệu hoặc phần mô hình hóa từng câu hỏi hoặc + +21 +00:01:18,380 --> 00:01:22,070 +phần xử lý chức năng bài kiểm tra thực tế và tất cả chúng + +22 +00:01:22,430 --> 00:01:27,430 +đều được tách biệt trong lớp riêng đó. Để tạo giao diện người dùng của chúng tôi, chúng tôi + +23 +00:01:27,530 --> 00:01:28,280 +cũng sẽ tạo + +24 +00:01:28,280 --> 00:01:33,280 +lớp rất riêng của chúng tôi bên trong ui này. py + +25 +00:01:34,370 --> 00:01:36,710 +Vì vậy, đã được một thời gian kể từ khi chúng tôi tạo các lớp học. + +26 +00:01:36,770 --> 00:01:40,910 +Vì vậy, tôi muốn thực hiện một phiên nhắc nhở nhanh về cách thực hiện điều đó. + +27 +00:01:41,330 --> 00:01:45,740 +Vì vậy, chúng tôi sử dụng từ khóa lớp và sau đó chúng tôi cung cấp tên của lớp. Bây giờ, trong trường hợp của + +28 +00:01:45,770 --> 00:01:48,890 +tôi, tôi sẽ gọi đây là Giao diện QuizInterface. + +29 +00:01:49,550 --> 00:01:56,000 +Và hãy nhớ rằng cách bạn đặt tên cho các lớp là cách mà nó được gọi. Trường hợp Pascal. + +30 +00:01:56,240 --> 00:02:01,240 +Vì vậy, một chữ cái viết hoa, và sau đó mỗi từ không được phân tách bằng bất kỳ dấu gạch dưới hoặc bất kỳ dấu gạch ngang nào. + +31 +00:02:01,880 --> 00:02:03,170 +Vì vậy, đây là lớp + +32 +00:02:03,260 --> 00:02:07,490 +của chúng ta và sau đó chúng ta sẽ tạo init của chúng ta bên trong lớp này. + +33 +00:02:08,060 --> 00:02:10,550 +Bây giờ, nếu bất kỳ điều nào trong số + +34 +00:02:10,550 --> 00:02:14,660 +này không quen thuộc với bạn, thì hãy đảm bảo rằng bạn chưa bỏ qua các bài học + +35 +00:02:14,660 --> 00:02:18,410 +về Lập trình hướng đối tượng cũng như tạo và sử dụng các lớp trong Python. + +36 +00:02:18,740 --> 00:02:21,890 +Chúng tôi đã đề cập đến điều đó trong ngày 17. Vì vậy, nếu bạn bỏ qua điều + +37 +00:02:22,040 --> 00:02:25,580 +đó, hãy nhớ quay lại trước khi tiếp tục, bởi vì nếu không, phần còn lại của + +38 +00:02:25,880 --> 00:02:29,780 +điều này sẽ không có ý nghĩa gì cả. Trong init lớp của chúng tôi, + +39 +00:02:29,840 --> 00:02:32,930 +chúng tôi sẽ tạo giao diện người dùng của chúng tôi. + +40 +00:02:33,140 --> 00:02:35,870 +Vì vậy, chúng tôi sẽ tạo tất cả các nút và tất cả các bố cục. + +41 +00:02:36,200 --> 00:02:40,670 +Và chúng tôi bắt đầu bằng cách đơn giản là tạo cửa sổ của chúng tôi. Tuy nhiên, bây giờ lần này, thay + +42 +00:02:40,700 --> 00:02:45,380 +vì tạo cửa sổ của chúng ta chỉ như một biến đơn giản, chúng ta sẽ + +43 +00:02:45,710 --> 00:02:48,500 +biến nó thành một thuộc tính của lớp này. + +44 +00:02:48,530 --> 00:02:50,480 +Vì vậy, chúng tôi sẽ thêm bản thân vào phía trước của nó. + +45 +00:02:51,050 --> 00:02:54,710 +Và sau đó chúng ta sẽ tạo nó từ mô-đun tkinter. + +46 +00:02:54,770 --> 00:02:59,180 +Vì vậy, hãy tiếp tục và nhập mọi thứ từ mô-đun tkinter, + +47 +00:03:01,450 --> 00:03:06,450 +và hãy đặt cửa sổ của chúng tôi làm đối tượng mới từ lớp tk. + +48 +00:03:07,780 --> 00:03:11,920 +Tiếp theo, tôi sẽ thay đổi một số khía cạnh của cửa sổ. Vì vậy, ví dụ, + +49 +00:03:11,920 --> 00:03:16,090 +tôi sẽ thay đổi tiêu đề. Vì vậy, tôi sẽ đặt nó thành, + +50 +00:03:16,420 --> 00:03:19,090 +ừm, Quizzler, đây sẽ là tên của ứng dụng này. + +51 +00:03:19,960 --> 00:03:23,470 +Chúng ta có thể tiếp tục như vậy bên trong hàm init, + +52 +00:03:23,800 --> 00:03:28,510 +hàm này sẽ được gọi bất cứ khi nào chúng ta tạo một đối tượng mới từ + +53 +00:03:28,510 --> 00:03:29,343 +lớp này. + +54 +00:03:29,590 --> 00:03:34,590 +Đây là nơi chúng ta cũng sẽ có bản ngã của mình. cửa sổ. mainloop và điều đó sẽ + +55 +00:03:36,340 --> 00:03:41,080 +thiết lập chương trình của chúng tôi để chạy. Để kiểm tra điều này, chúng ta sẽ quay lại phần + +56 +00:03:41,140 --> 00:03:43,180 +chính của chúng ta. py và + +57 +00:03:43,570 --> 00:03:46,000 +chúng tôi sẽ nhập lớp đó. + +58 +00:03:46,180 --> 00:03:49,870 +Vì vậy, từ ui nhập QuizInterface, và sau đó + +59 +00:03:50,290 --> 00:03:53,650 +chúng ta sẽ tạo QuizInterface đó ở đây. + +60 +00:03:55,210 --> 00:03:57,010 +Tôi sẽ gọi nó là quiz_ui và nó sẽ + +61 +00:03:57,550 --> 00:04:01,990 +được khởi tạo từ giao diện bài kiểm tra của chúng tôi. Bây giờ, nếu bạn còn nhớ, khi + +62 +00:04:02,020 --> 00:04:04,360 +chúng ta lần đầu tiên học về tkinter, + +63 +00:04:04,360 --> 00:04:09,360 +tôi đã nói với bạn rằng tkinter hoạt động bằng cách có vòng lặp vô tận này về + +64 +00:04:10,810 --> 00:04:13,090 +cơ bản được gọi là vòng lặp chính. + +65 +00:04:13,900 --> 00:04:16,630 +Và điều này giống như một vòng lặp while không bao giờ kết thúc. + +66 +00:04:16,899 --> 00:04:21,130 +Nó liên tục kiểm tra xem liệu nó có cần cập nhật thứ gì đó trong giao + +67 +00:04:21,130 --> 00:04:25,810 +diện người dùng đồ họa hay người dùng đã tương tác với nó theo một cách nào đó hay không. + +68 +00:04:26,410 --> 00:04:31,270 +Vì vậy, nó sẽ bị nhầm lẫn nếu bạn có một vòng lặp while khác ở đâu đó gần nó. + +69 +00:04:31,840 --> 00:04:34,060 +Vì vậy, chúng tôi thực sự phải nhận xét vòng lặp while này nếu + +70 +00:04:34,420 --> 00:04:38,560 +chúng tôi muốn giao diện người dùng này hoạt động bình thường. Bây giờ, bất cứ khi nào chúng tôi muốn thử nghiệm + +71 +00:04:38,590 --> 00:04:40,810 +giao diện người dùng của mình, tất cả những gì chúng tôi + +72 +00:04:40,840 --> 00:04:44,200 +phải làm là chạy chính của chúng tôi. py + +73 +00:04:44,860 --> 00:04:46,570 +Và khi nó chạm vào + +74 +00:04:46,600 --> 00:04:51,340 +dòng này, nó sẽ tạo một đối tượng mới từ QuizInterface của chúng ta ở đây. + +75 +00:04:51,850 --> 00:04:55,090 +Và một khi nó làm được điều đó, nó sẽ sử dụng phương thức init và + +76 +00:04:55,420 --> 00:04:57,310 +nó sẽ tạo GUI mới của chúng tôi. + +77 +00:04:57,940 --> 00:05:01,540 +Bạn có thể tiếp tục mã hóa giao diện người dùng của mình + +78 +00:05:01,840 --> 00:05:03,880 +bên trong init này và nó sẽ hoạt + +79 +00:05:04,030 --> 00:05:08,680 +động giống như trước đây khi bạn chỉ tạo một ứng dụng giao diện người dùng đồ + +80 +00:05:08,710 --> 00:05:12,100 +họa tkinter rất đơn giản. Đến đây là phần thử thách. + +81 +00:05:12,670 --> 00:05:15,790 +Tôi muốn bạn tạo giao diện người dùng cụ thể này + +82 +00:05:16,300 --> 00:05:21,300 +và tôi đã tạo một trang trình bày cho bạn thấy tất cả phần đệm, định cỡ, phông + +83 +00:05:21,610 --> 00:05:23,980 +chữ, màu nền và tất cả các + +84 +00:05:24,010 --> 00:05:26,440 +thành phần hiển thị trên màn hình này. + +85 +00:05:27,070 --> 00:05:31,840 +Tôi muốn bạn tạm dừng video ở đây và xem liệu bạn có thể tạo giao diện người dùng này + +86 +00:05:32,050 --> 00:05:35,380 +bên trong phương thức init của lớp giao diện câu đố hay không. + +87 +00:05:36,070 --> 00:05:38,020 +Hãy tạm dừng video ngay bây giờ và tiếp tục. + +88 +00:05:38,130 --> 00:05:38,963 +1: Được rồi. + +89 +00:05:42,780 --> 00:05:43,200 +0: Được rồi. + +90 +00:05:43,200 --> 00:05:46,770 +Vì vậy, chúng ta sẽ tiếp tục nơi chúng ta đã dừng lại ở đây bên trong phương thức init. + +91 +00:05:47,190 --> 00:05:50,160 +Và chúng tôi đã bắt đầu từ thuộc tính window của mình nên chúng + +92 +00:05:50,190 --> 00:05:53,100 +tôi sẽ tiếp tục làm cho điều đó tốt hơn một chút. + +93 +00:05:53,490 --> 00:05:56,940 +Vì vậy, chúng tôi sẽ gọi phương thức cấu hình trên chính nó. cửa sổ và chúng tôi + +94 +00:05:57,350 --> 00:06:02,210 +sẽ thay đổi padx và pady để chúng tôi thêm 20 pixel đệm trên + +95 +00:06:02,210 --> 00:06:05,420 +cả bốn trang web. Bây giờ, điều tiếp + +96 +00:06:05,450 --> 00:06:08,180 +theo tôi muốn cấu hình là màu nền. + +97 +00:06:08,540 --> 00:06:10,280 +Và như tôi đã đề cập trong slide + +98 +00:06:10,520 --> 00:06:13,610 +này, chúng tôi sẽ sử dụng màu chủ đề này mà tôi đã cung cấp ở + +99 +00:06:13,940 --> 00:06:16,070 +đây, đó là một loại màu xanh nửa đêm đẹp mắt. + +100 +00:06:16,580 --> 00:06:19,040 +Vì vậy, tôi sẽ nhấn vào thuộc tính nền và tôi sẽ + +101 +00:06:19,130 --> 00:06:22,700 +đặt nó thành màu chủ đề này. Bây giờ, nếu chúng ta tiếp + +102 +00:06:22,730 --> 00:06:25,130 +tục và chạy tệp chính của mình, thì chúng + +103 +00:06:25,490 --> 00:06:28,550 +ta có thể thấy giao diện người dùng của mình hiển thị. + +104 +00:06:30,830 --> 00:06:32,720 +Và bây giờ nó có màu nền và + +105 +00:06:32,900 --> 00:06:34,940 +nó lớn hơn một chút vì có phần đệm. + +106 +00:06:35,870 --> 00:06:39,800 +Bước tiếp theo là tạo nhãn này ở đây, đây chỉ là + +107 +00:06:39,860 --> 00:06:42,320 +một nhãn văn bản rất đơn giản. + +108 +00:06:42,950 --> 00:06:46,730 +Vì vậy, hãy tiếp tục và tạo nó như một thuộc tính của lớp này. + +109 +00:06:47,000 --> 00:06:48,890 +Vì vậy, tôi sẽ gọi nó là nhãn + +110 +00:06:49,400 --> 00:06:53,690 +điểm và tôi sẽ tạo nó từ lớp nhãn của tkinter. Tôi sẽ đặt văn + +111 +00:06:53,690 --> 00:06:56,300 +bản chỉ là Điểm: 0. + +112 +00:06:57,020 --> 00:07:00,050 +Và tôi sẽ thay đổi màu của văn + +113 +00:07:00,080 --> 00:07:03,410 +bản này, vốn là nền trước, thành màu trắng. + +114 +00:07:03,710 --> 00:07:07,580 +Bằng cách đó, nó sẽ thực sự có thể hiển thị trên nền tối này. + +115 +00:07:08,510 --> 00:07:10,790 +Bây giờ, để nhãn này hiển thị, tất nhiên, chúng ta + +116 +00:07:10,790 --> 00:07:13,040 +phải cung cấp cho nó một số loại bố cục. + +117 +00:07:13,340 --> 00:07:18,020 +Vì vậy, chúng tôi sẽ sử dụng lưới và tôi sẽ đặt hàng bằng + +118 +00:07:18,050 --> 00:07:21,980 +0 vì nó ở trên cùng và sau đó là cột. + +119 +00:07:22,490 --> 00:07:26,720 +Vì vậy, theo cách này nó dính vào bên phải. Tại thời điểm này khi chúng tôi chạy + +120 +00:07:26,750 --> 00:07:28,460 +nó, vì không có cột + +121 +00:07:28,760 --> 00:07:32,390 +số 0, nó sẽ vẫn chỉ hiển thị trên màn hình bên trái. + +122 +00:07:33,200 --> 00:07:38,200 +Và nó cũng có nền trắng khiến bạn không thể nhìn thấy văn bản màu trắng. + +123 +00:07:39,320 --> 00:07:44,030 +Hãy tiếp tục và thay đổi nền của nhãn này thành cùng một màu chủ đề. + +124 +00:07:44,570 --> 00:07:48,890 +Và theo cách đó, khi chúng tôi chạy nó, chúng tôi thực sự thấy nhãn của chúng tôi với văn bản màu trắng của nó. + +125 +00:07:49,880 --> 00:07:54,050 +Đó là nhãn hoàn thành. Và bước tiếp theo là tạo canvas của chúng ta. + +126 +00:07:54,470 --> 00:07:59,470 +Hãy nhớ rằng canvas của chúng tôi thực sự hữu ích vì nó cho phép chúng tôi xếp nhiều + +127 +00:07:59,540 --> 00:08:00,470 +thứ lên trên. + +128 +00:08:01,220 --> 00:08:05,120 +Và chúng tôi cũng có thể thiết lập nền và kích thước của nó rất dễ dàng. + +129 +00:08:05,630 --> 00:08:09,890 +Vì vậy, chúng tôi sẽ tạo canvas này từ lớp canvas và ngay lập tức, tôi sẽ + +130 +00:08:09,890 --> 00:08:11,660 +thiết lập chiều rộng và chiều cao. + +131 +00:08:12,020 --> 00:08:17,020 +Vì vậy, chiều rộng sẽ là 300 và chiều cao sẽ là 250 như chúng ta đã + +132 +00:08:19,490 --> 00:08:23,600 +chỉ định trong slide ở đây. Ngoài ra, tôi sẽ + +133 +00:08:23,600 --> 00:08:28,600 +thay đổi màu nền thành màu trắng để nó nổi bật gần giống + +134 +00:08:28,610 --> 00:08:33,610 +như một tấm thẻ trên nền. Sau khi tạo canvas, + +135 +00:08:33,740 --> 00:08:38,090 +tôi sẽ thêm một số question_text vào canvas. + +136 +00:08:38,299 --> 00:08:43,299 +Vì vậy, tôi sẽ tạo ra cái này với tư cách là chính mình. Tranh sơn dầu. create_text và điều này + +137 +00:08:44,750 --> 00:08:48,860 +sẽ có một thuộc tính duy nhất được gọi là văn + +138 +00:08:49,400 --> 00:08:54,400 +bản và tôi sẽ đặt văn bản thành Văn bản câu hỏi nào đó. + +139 +00:08:55,110 --> 00:08:58,170 +Vì vậy, chúng tôi không thực sự có điều đó vào lúc này. Chúng tôi sẽ chỉ đặt một trình giữ chỗ. + +140 +00:08:59,040 --> 00:09:02,610 +Và nếu bạn muốn, bạn thực sự có thể thay đổi màu tô của văn bản + +141 +00:09:02,640 --> 00:09:06,090 +này là màu của văn bản thành màu chủ đề cũng như chỉ để làm + +142 +00:09:06,210 --> 00:09:09,450 +cho tất cả đều giống nhau. Bây giờ, cuối cùng, chúng ta + +143 +00:09:09,480 --> 00:09:13,290 +sẽ đặt canvas của chúng ta lên màn hình bằng cách tạo lưới cho nó. + +144 +00:09:13,890 --> 00:09:18,540 +Và lần này chúng ta sẽ đặt hàng thành một, vì vậy bên dưới nhãn điểm, và sau + +145 +00:09:18,990 --> 00:09:21,390 +đó là cột, tôi sẽ đặt nó thành 0. + +146 +00:09:21,810 --> 00:09:26,810 +Nhưng sau đó tôi sẽ đặt khoảng cột thành hai để nó bắt đầu + +147 +00:09:27,210 --> 00:09:31,200 +từ cột 0 và kéo dài hai cột đến cột một. + +148 +00:09:31,620 --> 00:09:33,630 +Vì vậy, bây giờ khi tôi + +149 +00:09:33,780 --> 00:09:37,710 +chạy mã này, tôi thực sự gặp lỗi và lỗi này rất khó hiểu. + +150 +00:09:37,980 --> 00:09:41,520 +Cho tôi biết chỉ số tuple nằm ngoài phạm vi. Bây giờ, nếu bạn còn nhớ khi + +151 +00:09:41,520 --> 00:09:43,050 +chúng ta làm việc với + +152 +00:09:43,080 --> 00:09:46,470 +tkinter, bất cứ khi nào chúng ta thêm hình ảnh hoặc thêm thứ gì + +153 +00:09:46,800 --> 00:09:51,300 +đó vào canvas, chúng ta luôn phải cung cấp một vị trí là hai đối số đầu tiên. + +154 +00:09:51,840 --> 00:09:56,700 +Và đó là bộ giá trị đại diện cho vị trí X và Y của văn bản. + +155 +00:09:57,000 --> 00:09:58,920 +Chúng ta phải chắc chắn rằng chúng ta không quên điều đó. + +156 +00:09:59,370 --> 00:10:01,500 +Vì vậy, giá trị đầu tiên sẽ là X, + +157 +00:10:01,530 --> 00:10:05,160 +vì vậy đó sẽ là một nửa chiều rộng để nó được căn giữa trên canvas. + +158 +00:10:05,490 --> 00:10:07,920 +Vậy đó là 150, một nửa của 300. + +159 +00:10:08,280 --> 00:10:13,050 +Và khi đó giá trị Y sẽ là một nửa của 250, sẽ là 125. + +160 +00:10:14,430 --> 00:10:15,900 +Bây giờ, nếu chúng tôi + +161 +00:10:15,930 --> 00:10:20,930 +chạy lại lần nữa, hy vọng rằng chúng tôi sẽ không gặp phải lỗi tương tự và bây giờ bạn + +162 +00:10:21,480 --> 00:10:24,330 +có thể thấy thẻ này hiển thị và nhãn của chúng + +163 +00:10:24,360 --> 00:10:28,920 +tôi hiển thị ở bên phải, vì nó nằm trong cột thứ hai và đây là cột đầu + +164 +00:10:28,950 --> 00:10:33,450 +tiên và khung này kéo dài cả hai cột. Bây giờ văn bản này hơi nhỏ, + +165 +00:10:33,450 --> 00:10:38,400 +vì vậy chúng ta hãy nhìn vào slide và xem chúng ta cần thay đổi nó thành gì. + +166 +00:10:38,820 --> 00:10:42,810 +Vì vậy, chúng tôi muốn nó là phông chữ arial, kích thước 20 điểm và in nghiêng. + +167 +00:10:43,800 --> 00:10:48,800 +Hãy tiếp tục và thêm điều đó vào văn bản của chúng tôi. Và bởi vì nó được nhồi nhét một chút + +168 +00:10:48,960 --> 00:10:49,680 +ở đây, + +169 +00:10:49,680 --> 00:10:54,680 +tôi thực sự sẽ đặt nó trên hai dòng riêng biệt để tôi có thể đọc nó dễ + +170 +00:10:54,810 --> 00:10:56,790 +dàng hơn một chút như thế này. + +171 +00:10:58,530 --> 00:11:03,530 +Bây giờ chúng ta có thể thêm đối số phông chữ đó và chúng ta sẽ đặt nó thành một bộ + +172 +00:11:03,570 --> 00:11:05,520 +với mục đầu tiên là tên của phông + +173 +00:11:05,910 --> 00:11:07,770 +chữ và mục thứ hai là kích + +174 +00:11:07,950 --> 00:11:11,940 +thước của phông chữ và cuối cùng chúng tôi cũng sẽ làm cho văn bản nghiêng. . + +175 +00:11:12,450 --> 00:11:16,770 +Vì vậy, bây giờ chúng ta hãy chạy lại và bạn sẽ thấy văn bản bây giờ lớn hơn nhiều + +176 +00:11:16,770 --> 00:11:21,770 +và nó được định dạng theo cách mà chúng tôi muốn. Điều tiếp theo chúng tôi muốn làm + +177 +00:11:21,930 --> 00:11:25,950 +là thêm một chút khoảng đệm giữa khung vẽ này và điểm số. + +178 +00:11:26,400 --> 00:11:31,170 +Vì vậy, chúng tôi muốn thêm 50 điểm đệm ở đây và có lẽ là 50 ở đây nữa chỉ + +179 +00:11:31,170 --> 00:11:36,030 +để đẩy mọi thứ ra xa nhau hơn một chút. Để làm điều đó, tất cả những gì + +180 +00:11:36,390 --> 00:11:41,390 +chúng ta phải làm là chạm vào lưới canvas và sau đó thêm một miếng đệm duy nhất. + +181 +00:11:42,630 --> 00:11:45,330 +Chúng tôi không muốn thêm bất kỳ khoảng đệm nào trên trục X. + +182 +00:11:45,390 --> 00:11:50,040 +20 bản gốc là đủ từ cửa sổ. Nhưng chúng tôi muốn thêm 50 để bằng cách này canvas + +183 +00:11:50,250 --> 00:11:55,250 +có một số phần đệm ở trên và dưới như thế này. Và bây giờ nó trông rộng + +184 +00:11:56,380 --> 00:11:59,290 +hơn một chút và dễ đọc hơn. + +185 +00:12:00,370 --> 00:12:01,990 +Đó là khá nhiều canvas đã được thực hiện. + +186 +00:12:02,230 --> 00:12:04,840 +Điều cuối cùng chúng ta cần thêm là hai nút. + +187 +00:12:05,170 --> 00:12:09,910 +Vì vậy, chúng tôi sẽ thêm một nút true và một nút false, cả hai + +188 +00:12:09,970 --> 00:12:14,970 +đều được tạo từ lớp nút và cả hai đều không cần phải có bất kỳ văn + +189 +00:12:15,580 --> 00:12:16,413 +bản nào. + +190 +00:12:16,420 --> 00:12:21,420 +Thay vào đó, chúng ta sẽ tạo một true_image từ lớp PhotoImage, nhấn + +191 +00:12:22,420 --> 00:12:25,750 +vào tệp đến từ thư mục này. + +192 +00:12:26,230 --> 00:12:30,460 +Vì vậy, đó là hình ảnh / sự thật. png. + +193 +00:12:31,060 --> 00:12:34,990 +Và đó là hình ảnh mà chúng ta sẽ đưa vào nút này. + +194 +00:12:35,850 --> 00:12:36,683 +1: Đúng. + +195 +00:12:38,130 --> 00:12:39,090 +0: Bây giờ. Ngoài + +196 +00:12:39,090 --> 00:12:43,680 +ra, tôi sẽ đặt độ dày nổi bật bằng 0. Bằng cách này, nó không có + +197 +00:12:43,680 --> 00:12:46,620 +đường viền kỳ lạ, khó xử xung quanh nút. + +198 +00:12:47,430 --> 00:12:52,430 +Và tôi cũng sẽ đưa nút này lên màn hình bằng phương pháp lưới. + +199 +00:12:53,220 --> 00:12:55,830 +Vì vậy, bây giờ chúng ta đang ở + +200 +00:12:55,950 --> 00:12:59,580 +hàng hai, vì vậy bên dưới canvas, và cột chúng ta sẽ + +201 +00:12:59,610 --> 00:13:04,140 +đặt nó thành cột số không. Bây giờ, tùy thuộc vào những gì bạn thích, + +202 +00:13:04,140 --> 00:13:07,620 +bạn có thể có nút true ở bên trái hoặc nút true ở bên phải. + +203 +00:13:07,890 --> 00:13:11,070 +Nó không thực sự quan trọng vì nó quá lớn + +204 +00:13:11,070 --> 00:13:15,060 +và người dùng khá dễ nhìn. Tôi sẽ đặt nó ở bên trái, vì vậy cột số không. + +205 +00:13:15,270 --> 00:13:20,220 +Và khi tôi chạy đoạn mã này, bạn có thể thấy nó hiển thị. Vì vậy, bằng cách sử dụng cùng một phương + +206 +00:13:20,250 --> 00:13:22,350 +pháp, tôi sẽ tạo nút giả. + +207 +00:13:28,200 --> 00:13:28,950 +1: Đúng. + +208 +00:13:28,950 --> 00:13:33,870 +0: Bây giờ chúng tôi có một nút đúng và một nút sai và chúng tôi đã hoàn thành khá nhiều giao diện + +209 +00:13:33,870 --> 00:13:36,930 +người dùng cuối cùng của mình. Bây giờ, một trong những thứ + +210 +00:13:37,080 --> 00:13:41,250 +bạn thấy ở đây là hầu hết mọi thứ mà tôi đã tạo ra bên + +211 +00:13:41,250 --> 00:13:42,030 +trong init + +212 +00:13:42,030 --> 00:13:47,030 +của mình, tôi đã cho nó là 'bản thân'. 'Và hãy nhớ từ các bài học của chúng tôi trên + +213 +00:13:48,270 --> 00:13:52,590 +OOP, điều này biến nó thành một thuộc tính có thể được truy cập ở bất kỳ đâu trong lớp. + +214 +00:13:53,130 --> 00:13:57,060 +Bây giờ, một số thứ khác như hình ảnh thật và hình ảnh giả, tôi đã không làm + +215 +00:13:57,360 --> 00:14:01,050 +điều đó vì chúng tôi sẽ không sử dụng nó ở bất kỳ nơi nào khác + +216 +00:14:01,290 --> 00:14:04,050 +ngoài việc thiết lập nút của chúng tôi ngay tại đây. + +217 +00:14:04,770 --> 00:14:09,180 +Đây hy vọng sẽ là một bài đánh giá tốt về những gì chúng ta đã + +218 +00:14:09,180 --> 00:14:14,180 +học về Lập trình hướng đối tượng và các lớp và đối tượng cũng như tkinter và tất cả + +219 +00:14:14,820 --> 00:14:18,660 +những thứ mới xung quanh API. Nhưng điều này đã hoàn thiện giao diện người + +220 +00:14:18,930 --> 00:14:21,210 +dùng và bây giờ chúng ta đã sẵn sàng chuyển sang bài + +221 +00:14:21,310 --> 00:14:24,840 +học tiếp theo, nơi chúng ta sẽ điền một số văn bản vào khu vực câu hỏi này. + +222 +00:14:25,140 --> 00:14:27,810 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 How-to-Get-TKinter-Canvas-Text-to-Wrap.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 How-to-Get-TKinter-Canvas-Text-to-Wrap.url new file mode 100644 index 0000000000000000000000000000000000000000..7f5b28012e70280289f377099fe5879cbc4882c1 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 How-to-Get-TKinter-Canvas-Text-to-Wrap.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.google.com/search?q=how+to+get+tkinter+text+in+canvas+to+wrap&oq=how+to+get+tkinter+text+in+canvas+to+wrap&aqs=chrome..69i57j33.7303j0j1&sourceid=chrome&ie=UTF-8 \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 Python Typing & Showing the Next Question in the GUI.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 Python Typing & Showing the Next Question in the GUI.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..42160060f14263a63ef30da54cf64f5702727c77 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 Python Typing & Showing the Next Question in the GUI.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ce0fbee35fe8c3157556b44bf72cc74118473894e8d34d2dd5c78d363a14472 +size 54164568 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 Python Typing & Showing the Next Question in the GUI_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 Python Typing & Showing the Next Question in the GUI_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3d0b2e1b4c631522825cd7eb326d3d9bbc768625 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/006 Python Typing & Showing the Next Question in the GUI_vi.srt @@ -0,0 +1,428 @@ +1 +00:00:00,300 --> 00:00:02,670 +Bây giờ chúng tôi đã sắp xếp xong giao diện người + +2 +00:00:02,730 --> 00:00:07,730 +dùng, bước tiếp theo là điền vào điều này với một số câu hỏi mà chúng tôi nhận được từ lệnh gọi + +3 +00:00:09,510 --> 00:00:10,343 +API của mình. + +4 +00:00:10,590 --> 00:00:15,590 +Vì vậy, mọi thứ trong chương trình của chúng tôi đều được liên kết và nơi chúng tôi nắm bắt câu hỏi + +5 +00:00:15,930 --> 00:00:20,250 +tiếp theo là bên trong quiz_brain của chúng tôi. Hiện tại, quiz_brain, khi + +6 +00:00:20,250 --> 00:00:24,150 +phương thức next_question này được gọi, sẽ tìm câu + +7 +00:00:24,450 --> 00:00:28,830 +hỏi hiện tại từ danh sách các câu hỏi mà + +8 +00:00:28,830 --> 00:00:33,600 +nó nhận được từ dữ liệu. py, và sau đó nó sẽ phục vụ nó trong một đầu vào. + +9 +00:00:34,110 --> 00:00:35,430 +Đây là điều đã từng xảy + +10 +00:00:35,430 --> 00:00:38,970 +ra, ít nhất, khi chúng tôi vẫn đang tạo ứng dụng câu đố dựa trên văn bản của mình. + +11 +00:00:39,540 --> 00:00:40,440 +Nhưng trong trường + +12 +00:00:40,470 --> 00:00:45,470 +hợp này, chúng tôi thực sự muốn có thể xuất ra văn bản câu hỏi đó và sau đó nắm giữ nó bên + +13 +00:00:46,440 --> 00:00:48,510 +trong ui của chúng tôi. py + +14 +00:00:49,770 --> 00:00:54,770 +Vì vậy, hãy cập nhật quiz_brain của chúng tôi để câu hỏi này được trả về dưới dạng kết quả đầu ra. + +15 +00:00:56,790 --> 00:01:01,440 +Tôi sẽ nhận xét phần này của mã nơi chúng tôi kiểm tra câu trả lời của người dùng vì chúng tôi không còn nhận + +16 +00:01:01,470 --> 00:01:05,640 +được câu trả lời của người dùng từ đầu vào nữa. Thay vào đó, chúng tôi + +17 +00:01:05,700 --> 00:01:09,840 +sẽ lấy câu hỏi_text này và câu hỏi_số_số và chúng tôi + +18 +00:01:10,020 --> 00:01:12,480 +sẽ cung cấp nó làm đầu ra. + +19 +00:01:12,810 --> 00:01:16,080 +Vì vậy, hãy tiếp tục và trả về toàn bộ chuỗi này. + +20 +00:01:19,170 --> 00:01:21,510 +Và chúng ta có thể bình luận về dòng mã này. + +21 +00:01:22,440 --> 00:01:24,900 +Bây giờ bên trong ui của chúng tôi. py, chúng ta + +22 +00:01:25,020 --> 00:01:30,000 +có thể gọi phương thức đó và đặt nó vào đoạn văn bản này trong canvas. + +23 +00:01:30,630 --> 00:01:34,830 +Hãy tạo một phương thức ở đây, chúng ta + +24 +00:01:35,010 --> 00:01:37,650 +sẽ gọi là get_ _next_question. + +25 +00:01:38,430 --> 00:01:43,430 +Và phương thức này sẽ khai thác vào quiz_brain và gọi đây là next_question. + +26 +00:01:45,960 --> 00:01:50,960 +Vì vậy, làm thế nào để chúng ta nắm bắt được cùng một bộ não đố mà chúng ta tạo ra trong chính của chúng ta. py? + +27 +00:01:51,900 --> 00:01:52,140 +Chà, + +28 +00:01:52,140 --> 00:01:57,140 +chúng tôi có thể chuyển nó vào khi chúng tôi tạo giao diện người dùng câu đố của mình làm đầu vào. + +29 +00:01:57,660 --> 00:01:59,100 +Vì vậy, bài kiểm tra này, được sáng tạo + +30 +00:01:59,130 --> 00:02:03,870 +từ bộ não của bài kiểm tra, có thể được chuyển vào giao diện bài kiểm tra. Và để nắm bắt được nó, tất cả những + +31 +00:02:03,870 --> 00:02:06,600 +gì chúng ta phải làm chỉ là thêm một tham số + +32 +00:02:06,600 --> 00:02:09,330 +khác vào init của chúng ta mà chúng ta sẽ + +33 +00:02:10,199 --> 00:02:11,700 +gọi là bộ não đố. + +34 +00:02:12,300 --> 00:02:16,230 +Và sau đó, chúng ta có thể tạo một thuộc tính gọi là bài kiểm tra và chúng ta + +35 +00:02:16,560 --> 00:02:20,610 +có thể đặt nó bằng với bộ não bài kiểm tra mà chúng ta nhận được khi khởi tạo + +36 +00:02:20,880 --> 00:02:22,590 +giao diện bài kiểm tra mới này. + +37 +00:02:24,570 --> 00:02:28,260 +Vì vậy, bây giờ khi chúng ta có câu hỏi tiếp theo được gọi, chúng ta + +38 +00:02:28,530 --> 00:02:31,020 +sẽ khai thác bản thân. quiz, và + +39 +00:02:31,410 --> 00:02:34,590 +sau đó chúng ta sẽ gọi + +40 +00:02:34,710 --> 00:02:39,390 +phương thức quiz_ _next_question. Bây giờ, hãy chú ý khi tôi đang nhập, bạn thực + +41 +00:02:39,420 --> 00:02:41,370 +sự không thấy bất cứ thứ gì hiển thị. + +42 +00:02:41,850 --> 00:02:46,350 +Và lý do cho điều này là vì mặc dù chúng ta đang truyền bộ não + +43 +00:02:46,500 --> 00:02:49,560 +đố vui đó vào đây thông qua init, tệp này + +44 +00:02:49,560 --> 00:02:53,910 +thực sự không biết kiểu dữ liệu của đối tượng cụ thể này đang được truyền + +45 +00:02:53,910 --> 00:02:54,840 +vào là gì. + +46 +00:02:55,530 --> 00:03:00,430 +Vì vậy, một trong những điều bạn có thể làm là thêm kiểu dữ liệu khi bạn + +47 +00:03:00,430 --> 00:03:02,470 +tạo nó dưới dạng tham số. + +48 +00:03:02,950 --> 00:03:07,090 +Vì vậy, chúng ta có thể nói rằng thứ não đố này sẽ được chuyển vào + +49 +00:03:07,120 --> 00:03:11,020 +phải là não đố kiểu dữ liệu. Và để điều đó hoạt động, chúng ta + +50 +00:03:11,050 --> 00:03:13,270 +cần nhập nó. Vì vậy, + +51 +00:03:13,270 --> 00:03:17,380 +từ bộ não đố vui nhập lớp bộ não câu đố. + +52 +00:03:17,740 --> 00:03:21,790 +Và bây giờ chúng ta có thể tuyên bố rằng khi chúng ta khởi tạo một giao diện + +53 +00:03:22,060 --> 00:03:25,030 +bài kiểm tra mới, chúng ta phải chuyển vào một đối tượng bộ não + +54 +00:03:25,300 --> 00:03:29,740 +đố vui thuộc loại bộ não bài kiểm tra. Và một khi chúng tôi đã làm điều đó và + +55 +00:03:29,800 --> 00:03:31,150 +chúng tôi đã đảm bảo + +56 +00:03:31,300 --> 00:03:35,020 +điều này, sau đó khi chúng tôi cố gắng khởi tạo điều này và chúng tôi cố gắng + +57 +00:03:35,290 --> 00:03:38,440 +chuyển điều khác, giả sử tôi cố gắng vượt qua ngân hàng câu hỏi thì + +58 +00:03:39,250 --> 00:03:43,960 +điều này sẽ khiến tôi gặp lỗi và bạn có thể thấy nó cho biết loại bộ não đố vui được mong + +59 +00:03:43,960 --> 00:03:46,060 +đợi, nhưng thay vào đó lại có một danh sách. + +60 +00:03:46,990 --> 00:03:49,810 +Vì vậy, điều này cũng đảm bảo rằng chúng tôi không mắc phải bất kỳ + +61 +00:03:49,870 --> 00:03:51,910 +lỗi nào khi khởi tạo giao diện bài kiểm tra. + +62 +00:03:52,600 --> 00:03:56,710 +Quay lại đây và cuộn xuống, bây giờ, tại thời điểm này khi chúng ta đã biết kiểu dữ + +63 +00:03:56,740 --> 00:03:59,050 +liệu của bài kiểm tra, thì chúng ta có thể + +64 +00:03:59,320 --> 00:04:02,620 +bắt đầu nhập câu hỏi tiếp theo. Và bạn có thể + +65 +00:04:02,830 --> 00:04:06,070 +thấy, nó hiển thị tất cả các phương pháp có + +66 +00:04:06,070 --> 00:04:10,630 +sẵn cho đối tượng não đố. Chúng tôi biết rằng điều này sẽ cung cấp cho + +67 +00:04:10,630 --> 00:04:15,310 +chúng tôi đầu ra, vì vậy đây là văn bản câu hỏi. Và khi chúng tôi hiểu được điều đó, chúng + +68 +00:04:15,370 --> 00:04:17,560 +tôi muốn cập nhật canvas của mình. + +69 +00:04:17,589 --> 00:04:22,590 +Vì vậy, những gì khai thác vào bản thân của chúng ta. canvas và sau đó gọi phương thức cấu hình mục để thay + +70 +00:04:24,190 --> 00:04:28,210 +đổi mục, đó là bản thân của chúng ta. câu hỏi_text. + +71 +00:04:30,910 --> 00:04:33,460 +Và điều chúng tôi muốn thay đổi về nó là + +72 +00:04:33,580 --> 00:04:37,300 +văn bản và chúng tôi muốn đặt nó thành q_text mà chúng tôi nhận được từ đây. + +73 +00:04:39,100 --> 00:04:39,430 +Bây + +74 +00:04:39,430 --> 00:04:43,420 +giờ, tất cả những gì còn lại cần làm là thực sự gọi phương thức này và chúng ta phải thực hiện nó + +75 +00:04:43,720 --> 00:04:47,380 +trong init của mình để khi chúng ta khởi tạo giao diện người dùng lần đầu tiên, cuối cùng chúng ta + +76 +00:04:47,710 --> 00:04:51,250 +sẽ không nhìn thấy Văn bản Câu hỏi nào đó. Thay vào đó, chúng tôi thực sự + +77 +00:04:51,250 --> 00:04:54,580 +lấy câu hỏi đầu tiên từ danh sách các câu hỏi của chúng tôi. + +78 +00:04:55,090 --> 00:04:58,720 +Nhưng hãy nhớ rằng mọi thứ phải diễn ra trước vòng lặp chính vì + +79 +00:04:59,050 --> 00:05:03,520 +tất cả mã bạn viết sau dòng này sẽ không được thực thi cho đến khi cửa + +80 +00:05:03,520 --> 00:05:04,990 +sổ đó bị phá hủy. + +81 +00:05:05,710 --> 00:05:10,510 +Vì vậy, chúng ta hãy đặt nó ở đây và chúng ta có thể gọi là tự. get_next_question. + +82 +00:05:10,870 --> 00:05:12,670 +Và bây giờ nếu chúng tôi chạy mã + +83 +00:05:14,440 --> 00:05:17,170 +của mình, bạn có thể thấy rằng thay vì một số văn bản + +84 +00:05:17,200 --> 00:05:20,020 +giả, chúng tôi thực sự nhận được một câu hỏi thực sự ở đây. + +85 +00:05:20,500 --> 00:05:23,560 +Vấn đề duy nhất là nó không hiển thị đầy đủ. + +86 +00:05:24,100 --> 00:05:28,270 +Một trong những thủ thuật mà chúng ta có thể sử dụng là lấy văn bản trong canvas để + +87 +00:05:28,330 --> 00:05:33,330 +bọc bằng cách đặt thuộc tính chiều rộng văn bản. Sao lưu tại đây, nơi chúng tôi đã + +88 +00:05:34,510 --> 00:05:38,050 +tạo câu hỏi_text, chúng tôi có thể thêm một đối số + +89 +00:05:38,050 --> 00:05:40,360 +khác được gọi là chiều rộng. + +90 +00:05:40,900 --> 00:05:45,900 +Và nếu chúng ta đặt chiều rộng đó thành một số giá trị có thể nhỏ hơn một + +91 +00:05:46,810 --> 00:05:47,980 +chút so với chiều + +92 +00:05:48,400 --> 00:05:52,960 +rộng của canvas, thì câu hỏi_text này sẽ tự động đi trên hai dòng riêng biệt. + +93 +00:05:53,590 --> 00:05:57,800 +Tôi sẽ đặt nó thành 280 để nó nhỏ hơn 300 một chút. + +94 +00:05:58,220 --> 00:06:02,960 +Vì vậy, theo cách đó có một chút đệm ở hai bên. Và bây giờ nếu tôi nhấn run, bạn có thể thấy + +95 +00:06:03,200 --> 00:06:08,200 +câu hỏi bây giờ phù hợp với phần thực tế của thẻ. Đây là bạn + +96 +00:06:09,470 --> 00:06:13,610 +có nó. Bây giờ chúng tôi đã tạo ra phương pháp nhận + +97 +00:06:13,880 --> 00:06:17,930 +câu hỏi tiếp theo có thể lấy văn bản câu hỏi từ bộ não câu đố bằng cách trả + +98 +00:06:18,230 --> 00:06:22,070 +về văn bản câu hỏi mà nó có. Bây giờ, chúng tôi vẫn + +99 +00:06:22,100 --> 00:06:27,100 +duy trì các nguyên tắc của chúng tôi về Lập trình hướng đối tượng, trong đó + +100 +00:06:27,140 --> 00:06:30,170 +mỗi mô-đun chịu trách nhiệm về việc riêng của nó. + +101 +00:06:30,470 --> 00:06:34,820 +Vì vậy, bộ não của bài kiểm tra chịu trách nhiệm quản lý bài kiểm tra, nhận + +102 +00:06:35,000 --> 00:06:38,660 +câu hỏi, theo dõi điểm số và giao diện người dùng của chúng tôi + +103 +00:06:38,660 --> 00:06:43,130 +hoặc lớp giao diện bài kiểm tra của chúng tôi chịu trách nhiệm đưa những thứ đó lên + +104 +00:06:43,130 --> 00:06:46,310 +màn hình để hiển thị. Trong bài học tiếp theo, chúng + +105 +00:06:46,370 --> 00:06:49,430 +ta sẽ xem xét kỹ hơn các gợi ý về kiểu Python. + +106 +00:06:49,700 --> 00:06:52,880 +Và sau đó, chúng tôi sẽ tìm ra cách làm cho các nút của chúng tôi hoạt động. + +107 +00:06:53,120 --> 00:06:55,940 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Python Typing Type Hints and Arrows -.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Python Typing Type Hints and Arrows -.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d7233d480a6b70cc95d089fd8721c3ea87c0dd68 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Python Typing Type Hints and Arrows -.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7de3872be1fefd10f6ee8a7896032a78f5d98793bb732e09716b1e8e514d93c +size 17706883 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Python Typing Type Hints and Arrows -_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Python Typing Type Hints and Arrows -_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c7003cb3cc4151f00999f3bdae57cd5b3f8023c3 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Python Typing Type Hints and Arrows -_vi.srt @@ -0,0 +1,316 @@ +1 +00:00:00,090 --> 00:00:03,420 +Cách đây khá lâu, chúng ta đã nói về các kiểu dữ liệu Python. + +2 +00:00:03,540 --> 00:00:08,370 +Vì vậy, các kiểu dữ liệu mà chúng tôi đang làm việc bao gồm những + +3 +00:00:08,610 --> 00:00:12,180 +thứ như số nguyên, chuỗi, số dấu phẩy động và boolean. + +4 +00:00:12,720 --> 00:00:16,980 +Và chúng tôi đã thấy cách bạn có thể trao đổi giữa các loại dữ liệu khác nhau bằng cách truyền. + +5 +00:00:17,460 --> 00:00:21,780 +Và chúng ta cũng đã thấy rằng trong Python, các kiểu dữ liệu rất linh hoạt. + +6 +00:00:21,780 --> 00:00:25,800 +Vì vậy, bạn có thể tạo một biến và sau đó thay đổi kiểu dữ liệu của nó sau này. + +7 +00:00:26,220 --> 00:00:27,990 +Đây được gọi là nhập động. + +8 +00:00:28,890 --> 00:00:32,790 +Bây giờ tôi muốn cho bạn thấy một điều khác mà bạn có thể làm với các kiểu dữ liệu để + +9 +00:00:32,790 --> 00:00:34,530 +làm cho mã của bạn ít bị lỗi hơn. + +10 +00:00:35,160 --> 00:00:39,900 +Giả sử rằng chúng ta đã tạo một biến, ví dụ, một biến có tên là tuổi. + +11 +00:00:40,020 --> 00:00:42,720 +Bây giờ, thông thường chúng ta sẽ đặt nó bằng một dấu bằng. + +12 +00:00:43,140 --> 00:00:48,140 +Nhưng bạn cũng có thể chỉ cần khai báo kiểu dữ liệu của nó và sau đó để nguyên. + +13 +00:00:48,750 --> 00:00:51,210 +Vì vậy, điều này có nghĩa là sau này, tại một + +14 +00:00:51,240 --> 00:00:55,140 +thời điểm nào đó, khi bạn đã thực sự nắm được độ tuổi từ người dùng hoặc bạn đã + +15 +00:00:55,410 --> 00:01:00,390 +tìm ra nó, thì tại thời điểm đó, bạn có thể đặt nó. Và độ tuổi này bây giờ phải khớp với kiểu + +16 +00:01:00,390 --> 00:01:02,850 +dữ liệu ở đây. Vì vậy, ví dụ: nếu tôi + +17 +00:01:02,850 --> 00:01:07,850 +thay đổi giá trị này thành 12 bằng cách sử dụng một chuỗi, thì bạn có thể thấy rằng PyCharm của tôi, IDE + +18 +00:01:08,430 --> 00:01:08,910 +của + +19 +00:01:08,910 --> 00:01:13,910 +tôi, hiện đang rất hữu ích khi nói với tôi rằng tuổi này đã có từ trước khi bạn tạo ra nó, + +20 +00:01:13,950 --> 00:01:18,060 +bạn nói rằng nó nên là một số nguyên. Thay vào đó, tôi có một chuỗi. + +21 +00:01:18,600 --> 00:01:23,010 +Vì vậy, điều này là khá hữu ích. Bạn có thể làm điều này với tất cả các kiểu dữ liệu cơ bản. + +22 +00:01:23,010 --> 00:01:27,870 +Vì vậy, ví dụ, age là một int, name là + +23 +00:01:28,710 --> 00:01:33,710 +một chuỗi, height là một float và is_human là một boolean. + +24 +00:01:34,800 --> 00:01:39,800 +Bây giờ chúng ta cũng có thể chỉ định kiểu dữ liệu bên trong một hàm. + +25 +00:01:40,290 --> 00:01:41,490 +Vì vậy, ví dụ: + +26 +00:01:41,490 --> 00:01:46,490 +nếu tôi tạo một hàm ở đây có tên là Police_check và nó lấy tuổi làm đầu vào, + +27 +00:01:47,850 --> 00:01:52,800 +và sau đó bên trong hàm Police_check, tôi sẽ kiểm tra kỹ, nếu độ tuổi trên 18, + +28 +00:01:52,800 --> 00:01:55,170 +thì có lẽ chúng ta sẽ có một + +29 +00:01:55,470 --> 00:02:00,060 +số loại của biến được gọi là can_drive và chúng tôi có thể đặt điều đó + +30 +00:02:00,060 --> 00:02:01,050 +thành true. + +31 +00:02:01,650 --> 00:02:05,070 +Nhưng nếu không, chúng ta có thể đặt điều đó thành false 1: + +32 +00:02:05,630 --> 00:02:06,463 +phải không? + +33 +00:02:07,880 --> 00:02:10,669 +0: Bây giờ, chúng ta sẽ trả về cái này dưới dạng đầu ra. + +34 +00:02:11,510 --> 00:02:15,860 +Vì vậy, bây giờ tại một số điểm, chúng ta có thể gọi hàm Police_check + +35 +00:02:15,920 --> 00:02:19,550 +của mình, vượt qua độ tuổi và nếu chúng ta in + +36 +00:02:19,730 --> 00:02:24,260 +nó ra, bạn có thể thấy rằng nó sẽ cho tôi là false cho 12 tuổi. + +37 +00:02:24,710 --> 00:02:29,120 +Và nếu tôi quyết định nói rằng tôi 19 tuổi, thì chúng ta sẽ đúng. + +38 +00:02:29,810 --> 00:02:34,810 +Ví dụ, chúng ta thực sự có thể sử dụng đầu ra từ hàm này để tạo một câu + +39 +00:02:35,390 --> 00:02:36,223 +lệnh in. + +40 +00:02:38,420 --> 00:02:42,980 +Vì vậy, nếu cuộc kiểm tra của cảnh sát vượt qua, sau đó cảnh sát nói với bạn, bạn có thể vượt qua. + +41 +00:02:43,370 --> 00:02:46,700 +Nếu không, bạn có thể phải nộp phạt hoặc ngồi tù một đêm. + +42 +00:02:47,150 --> 00:02:48,500 +Vì vậy, đây là chức + +43 +00:02:49,100 --> 00:02:52,220 +năng của chúng tôi và nếu chúng tôi sử dụng hàm + +44 +00:02:52,220 --> 00:02:54,140 +này Police_check tại một thời điểm nào + +45 +00:02:54,380 --> 00:02:59,240 +đó xuống dòng mà chúng tôi đã quên những gì chúng tôi đã tạo cho hàm này và + +46 +00:02:59,530 --> 00:03:03,250 +chúng tôi không thể tra cứu nó rất dễ dàng nếu không cuộn + +47 +00:03:03,250 --> 00:03:08,020 +lên hàng trăm dòng mã , bây giờ, nếu tại thời điểm này, chúng tôi đã nhầm + +48 +00:03:08,080 --> 00:03:11,920 +lẫn kiểu đầu vào và chúng tôi nhập, ví dụ: 12 là một chuỗi, + +49 +00:03:12,250 --> 00:03:16,810 +thì điều này thực sự sẽ cung cấp cho chúng tôi lỗi loại và nó ném ra + +50 +00:03:16,840 --> 00:03:17,470 +một + +51 +00:03:17,470 --> 00:03:22,470 +ngoại lệ làm hỏng ứng dụng của chúng tôi. Một trong những cách mà chúng ta có thể làm cho cuộc sống của mình + +52 +00:03:22,480 --> 00:03:27,310 +dễ dàng hơn một chút là khai báo một kiểu cho đầu vào này. Vì vậy, chúng tôi làm điều đó theo cách tương tự như bạn thấy ở trên. + +53 +00:03:27,370 --> 00:03:32,370 +Chúng ta có thể thêm dấu hai chấm và sau đó chúng ta có thể chỉ định kiểu dữ + +54 +00:03:32,440 --> 00:03:36,190 +liệu của đầu vào cụ thể này. Vì vậy, bây giờ khi chúng tôi thực sự + +55 +00:03:36,250 --> 00:03:39,610 +viết dòng mã này, bạn có thể thấy ngay lập tức chúng tôi đánh dấu phần này. + +56 +00:03:40,000 --> 00:03:44,680 +Và nếu tôi di chuột qua nó, nó cho tôi biết rằng đầu vào này mong đợi một kiểu dữ liệu là + +57 +00:03:44,680 --> 00:03:48,130 +một số nguyên và thay vào đó tôi đã cung cấp cho nó một chuỗi. + +58 +00:03:48,400 --> 00:03:53,290 +Vì vậy, đây là một gợi ý nhanh để chúng tôi sửa mã của mình trước khi chúng tôi chạy nó + +59 +00:03:53,290 --> 00:03:54,580 +và gặp rắc rối và + +60 +00:03:54,630 --> 00:03:56,850 +tạo ra 2: lỗi. Ngoài ra, 0: + +61 +00:03:56,880 --> 00:04:01,880 +bạn cũng có thể chỉ định kiểu dữ liệu của đầu ra của một hàm và bạn làm + +62 +00:04:02,850 --> 00:04:07,740 +điều đó bằng cách tạo một mũi tên nhỏ với dấu gạch ngang và dấu ngoặc nhọn. + +63 +00:04:08,310 --> 00:04:13,310 +Vì vậy, bây giờ chúng ta có thể nói rằng hàm cụ thể này được mong đợi sẽ trả về kiểu + +64 +00:04:14,640 --> 00:04:15,473 +dữ liệu boolean. + +65 +00:04:15,840 --> 00:04:20,839 +Và câu lệnh trả về của tôi trên thực tế tuân thủ điều này vì can_drive + +66 +00:04:21,240 --> 00:04:25,560 +chỉ có thể đúng hoặc sai. Bây giờ, nếu tôi quên rằng đây là + +67 +00:04:25,650 --> 00:04:29,460 +những gì tôi cần và một lúc nào đó tôi quay lại, hãy nói một chuỗi, + +68 +00:04:30,570 --> 00:04:33,660 +thì tôi cũng nhận được điểm nhấn cảnh báo này ở đây. + +69 +00:04:33,720 --> 00:04:37,230 +Và khi tôi di chuột qua nó một lần nữa, nó đang mong đợi một boolean nhưng thay + +70 +00:04:37,290 --> 00:04:39,150 +vào đó tôi lại đưa cho nó một chuỗi. + +71 +00:04:39,840 --> 00:04:42,870 +Đây được gọi là gợi ý kiểu trong Python. + +72 +00:04:43,320 --> 00:04:46,680 +Và đó là một tính năng mà chúng tôi đã nhận được tương đối gần + +73 +00:04:47,100 --> 00:04:52,080 +đây từ Python và nó có rất nhiều lợi ích, đặc biệt là khi bạn muốn IDE của mình, ví dụ như PyCharm, + +74 +00:04:52,080 --> 00:04:52,913 +giúp bạn phát + +75 +00:04:52,980 --> 00:04:57,980 +hiện các lỗi tiềm ẩn và giữ cho mã của bạn an toàn hơn và tốn ít thời gian hơn để gỡ lỗi + +76 +00:04:58,500 --> 00:05:00,480 +và nhiều thời gian hơn để viết mã số. + +77 +00:05:01,170 --> 00:05:05,580 +Vì vậy, chúng ta đã thấy cách chúng ta có thể khai báo kiểu dữ liệu cho một biến như thế + +78 +00:05:05,910 --> 00:05:10,830 +này và chúng ta cũng đã thấy cách chúng ta có thể khai báo kiểu dữ liệu cho kiểu trả về như thế này. + +79 +00:05:11,430 --> 00:05:12,600 +2: Đó là tất cả những gì cần làm. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Type-Hints-demo-Day-34-end.zip b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Type-Hints-demo-Day-34-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..21e894508356ef47c6e9584659acee082d47c9a8 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/007 Type-Hints-demo-Day-34-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eacf891b2f52c8db95fb5413d7bdce09c4758e4207aa729d67d7fc826866492c +size 297 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/008 Check the Answer.mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/008 Check the Answer.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..40839e72e7d08d74b0cb6597a1a33153fd8a38c8 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/008 Check the Answer.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e12d14310f0fd17a824f269d61951a0a4bf22cd3743c1a7069c62f7f12db6085 +size 27540751 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/008 Check the Answer_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/008 Check the Answer_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bb20873c44b4d8b85c61d6b02e0a6796af37a95a --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/008 Check the Answer_vi.srt @@ -0,0 +1,216 @@ +1 +00:00:00,390 --> 00:00:01,380 +Trong bài học + +2 +00:00:01,410 --> 00:00:06,330 +trước, chúng tôi đã có ứng dụng bài kiểm tra để bắt đầu hiển thị các câu hỏi mà + +3 +00:00:06,360 --> 00:00:10,560 +chúng tôi nhận được từ API của mình. Câu hỏi này mà tôi đã đặt ra là khá thú vị. + +4 +00:00:10,650 --> 00:00:13,200 +Nintendo khởi nghiệp như một nhà sản xuất thẻ chơi? + +5 +00:00:13,560 --> 00:00:16,500 +Và tôi rất muốn biết điều đó thực sự đúng hay sai. + +6 +00:00:17,070 --> 00:00:20,310 +Vì vậy, tôi thực sự muốn các nút này hoạt động về cơ bản. + +7 +00:00:20,700 --> 00:00:22,560 +Nếu tôi nhấp vào một trong những + +8 +00:00:22,620 --> 00:00:27,090 +nút này, tôi muốn có thể kiểm tra câu trả lời của mình so với câu trả lời thực + +9 +00:00:27,090 --> 00:00:31,230 +mà chúng tôi nhận được từ API của mình. Vì vậy, trong bài học này, đó là những gì chúng ta sẽ bắt đầu làm việc. + +10 +00:00:32,070 --> 00:00:34,020 +Vì vậy, tôi muốn điều này là một chút thử thách cho bạn. + +11 +00:00:34,560 --> 00:00:39,560 +Chúng tôi biết rằng chúng tôi có thể thêm một đối số lệnh vào các nút của mình để nó gọi + +12 +00:00:41,490 --> 00:00:46,170 +một phương thức cụ thể khi nó được nhấn. Bây giờ, khi phương pháp đó được nhấn, + +13 +00:00:46,620 --> 00:00:51,620 +chúng tôi muốn đi vào bộ não đố của mình và gọi đây là câu trả lời kiểm tra. + +14 +00:00:52,530 --> 00:00:57,480 +Bây giờ phương pháp kiểm tra câu trả lời này mong đợi một câu trả lời để kiểm tra chống lại. + +15 +00:00:57,840 --> 00:01:02,700 +Hãy suy nghĩ về cách bạn có thể giải quyết vấn đề này và làm cho nó hoạt + +16 +00:01:02,700 --> 00:01:07,290 +động để chúng tôi có thể bắt đầu in ra xem liệu chúng tôi có câu + +17 +00:01:07,290 --> 00:01:10,860 +hỏi đúng hay câu hỏi sai. Tạm dừng video ngay bây giờ và cố gắng hoàn thành thử thách này. + +18 +00:01:10,910 --> 00:01:11,743 +1: Đi. + +19 +00:01:15,950 --> 00:01:17,360 +0: Được rồi. Đây là giải pháp. + +20 +00:01:18,080 --> 00:01:23,080 +Điều đầu tiên tôi sẽ làm là tạo một phương thức mới được gọi là + +21 +00:01:26,930 --> 00:01:30,050 +true_pressed và một phương thức được gọi là false_pressed. + +22 +00:01:31,430 --> 00:01:36,430 +True_pressed này rõ ràng sẽ là lệnh cho nút true + +23 +00:01:37,100 --> 00:01:40,820 +này và nó sẽ là chính nó. + +24 +00:01:40,820 --> 00:01:44,900 +true_pressed bởi vì chúng ta đang ở trong một lớp và chúng ta phải đảm bảo rằng + +25 +00:01:44,900 --> 00:01:49,280 +không có dấu ngoặc đơn ở cuối nó vì chúng ta chỉ muốn kích hoạt phương thức này khi + +26 +00:01:49,580 --> 00:01:54,530 +nút thực sự phát hiện ra một lần nhấp. Theo cách tương tự, chúng ta + +27 +00:01:54,530 --> 00:01:58,250 +sẽ thêm một lệnh vào nút false và nó sẽ + +28 +00:01:58,250 --> 00:02:02,360 +tự hoạt động. false_pression. Và một lần nữa, xóa dấu ngoặc đơn. + +29 +00:02:02,840 --> 00:02:05,210 +Và bây giờ chúng ta có thể tìm ra những gì cần làm ở đây. + +30 +00:02:05,930 --> 00:02:10,190 +Chúng tôi đã có quyền truy cập vào đối tượng bộ não đố vui của chúng tôi ở đây, + +31 +00:02:10,520 --> 00:02:13,700 +nó được lưu dưới bản thân. đố. + +32 +00:02:14,210 --> 00:02:16,280 +Khi một trong hai điều này được nhấn, sau + +33 +00:02:16,400 --> 00:02:21,400 +đó chúng ta có thể chỉ cần chạm vào chính mình. đố và chúng ta có thể gọi + +34 +00:02:22,190 --> 00:02:24,770 +phương thức check_ answer tồn tại ở đó. + +35 +00:02:25,310 --> 00:02:29,090 +Và chúng ta có thể chuyển true khi true_pressed được gọi và + +36 +00:02:29,480 --> 00:02:31,880 +sau đó khi false_pressed được gọi là + +37 +00:02:31,880 --> 00:02:32,713 +1: ... + +38 +00:02:34,760 --> 00:02:38,870 +0: chúng tôi sẽ chuyển sai. Bây giờ, nó sẽ đi vào check_answer + +39 +00:02:38,930 --> 00:02:43,040 +này, chuyển câu trả lời đó vào và nó sẽ in ra xem bạn + +40 +00:02:43,220 --> 00:02:45,950 +có đúng hay sai. Vì vậy, chúng ta hãy kiểm tra điều đó. + +41 +00:02:46,400 --> 00:02:51,400 +Hãy chạy lại mã và đảm bảo rằng chúng ta không mắc phải bất kỳ lỗi chính tả ngớ ngẩn + +42 +00:02:52,400 --> 00:02:53,300 +nào như comand. + +43 +00:02:53,630 --> 00:02:54,463 +1: Vâng. + +44 +00:02:56,330 --> 00:03:00,490 +0: Vì vậy, hãy chạy ứng dụng của chúng tôi và xem liệu có thể trả lời một số câu hỏi hay không. + +45 +00:03:01,450 --> 00:03:04,570 +Gumbo là một món hầm có nguồn gốc từ Louisiana. + +46 +00:03:05,260 --> 00:03:06,760 +Tôi nghĩ điều đó có thể đúng. + +47 +00:03:08,590 --> 00:03:10,540 +Và khi tôi nhấp vào nút, bạn + +48 +00:03:10,570 --> 00:03:14,230 +có thể thấy trong bảng điều khiển, nó được in cho dù tôi + +49 +00:03:14,230 --> 00:03:16,720 +hiểu đúng hay sai. Bây giờ, trong khi mã + +50 +00:03:16,720 --> 00:03:21,720 +của chúng tôi hoạt động và chúng tôi có thể biết liệu chúng tôi đã làm đúng hay sai trong bảng điều + +51 +00:03:22,060 --> 00:03:24,790 +khiển, đó không phải là điều mà người dùng sẽ thấy. + +52 +00:03:24,790 --> 00:03:28,120 +Đây chỉ là thứ có sẵn cho chúng tôi với tư cách là nhà phát triển. + +53 +00:03:28,630 --> 00:03:31,330 +Vì vậy, làm thế nào chúng tôi có thể cung cấp cho người dùng một số phản hồi? + +54 +00:03:31,900 --> 00:03:33,970 +Đó là những gì chúng ta sẽ tìm hiểu trong bài học tiếp theo. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Course-Fixes-Report-an-Issue.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Give Feedback to the Player, Keep Score and Fix the Bugs =).mp4 b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Give Feedback to the Player, Keep Score and Fix the Bugs =).mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d3c60e19ce1fed01078b86c29b637f2e1aaebe54 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Give Feedback to the Player, Keep Score and Fix the Bugs =).mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:354c11df20e5e3d2833ac6f0b1f13805b565a1d8735759de6ef09b8e145a9f3a +size 63409817 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Give Feedback to the Player, Keep Score and Fix the Bugs =)_vi.srt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Give Feedback to the Player, Keep Score and Fix the Bugs =)_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..25aeec3bf42b2574e99dd45e4a52c42cbf190949 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Give Feedback to the Player, Keep Score and Fix the Bugs =)_vi.srt @@ -0,0 +1,512 @@ +1 +00:00:00,240 --> 00:00:04,710 +Chúng ta đã biết trong bài học trước về cách chúng ta có thể xem phản hồi trong bảng điều khiển. + +2 +00:00:05,010 --> 00:00:08,039 +Nhưng nếu chúng ta muốn xem phản hồi trên màn hình thì sao? + +3 +00:00:08,730 --> 00:00:12,960 +Điều tôi muốn có thể xảy ra là khi người dùng nhấn vào true hoặc false như một + +4 +00:00:13,080 --> 00:00:15,990 +câu trả lời cho câu hỏi, tôi muốn thẻ này, là khung + +5 +00:00:16,050 --> 00:00:18,540 +của chúng tôi, cung cấp cho chúng tôi phản hồi. + +6 +00:00:18,900 --> 00:00:22,320 +Vì vậy, nếu tôi nhấp vào đây và nó chuyển sang màu xanh lục trong một giây, thì điều đó + +7 +00:00:22,350 --> 00:00:23,580 +có nghĩa là tôi đã chọn đúng. + +8 +00:00:24,000 --> 00:00:26,940 +Và sau đó nó đi thẳng vào câu hỏi tiếp theo. + +9 +00:00:27,360 --> 00:00:29,760 +Và khi tôi nhận được câu trả lời sai, nó sẽ nhấp nháy màu đỏ. + +10 +00:00:30,990 --> 00:00:35,280 +Thay vì nhận check_answer trong bộ não đố để in ra bạn đã + +11 +00:00:35,370 --> 00:00:39,480 +đúng hay bạn đã sai, chúng tôi muốn nó trả về true nếu + +12 +00:00:39,510 --> 00:00:40,860 +chúng tôi thực + +13 +00:00:41,100 --> 00:00:44,610 +sự hiểu đúng và trả về false khi chúng tôi sai. + +14 +00:00:47,400 --> 00:00:51,270 +Và chúng ta có thể xóa hai dòng mã cuối cùng này bằng các câu lệnh in. + +15 +00:00:51,990 --> 00:00:56,970 +Vì vậy, bây giờ chúng ta có thể hiểu điều đó khi chúng ta gọi mỗi phương thức này, check_answer + +16 +00:00:57,270 --> 00:00:59,880 +và check_answer một cái gì đó như thế này. + +17 +00:01:01,320 --> 00:01:05,700 +Điều chúng tôi muốn xảy ra là chúng tôi muốn kiểm tra xem người dùng hiểu đúng hay sai và tùy thuộc + +18 +00:01:05,700 --> 00:01:08,910 +vào điều đó, chúng tôi sẽ cung cấp cho họ những phản hồi khác nhau. + +19 +00:01:09,390 --> 00:01:12,300 +Vì vậy, chúng tôi sẽ tạo một phương thức mới có + +20 +00:01:13,740 --> 00:01:18,740 +tên là give_feedback và điều này sẽ nhận dữ liệu đầu vào ở dạng xem liệu họ có đúng hay không. + +21 +00:01:20,940 --> 00:01:25,020 +Bây giờ, tất cả những gì chúng ta phải làm là tự gọi mình. give_feedback và sau đó + +22 +00:01:25,410 --> 00:01:30,150 +chuyển đầu ra cho cuộc gọi phương thức này, như thế này. + +23 +00:01:30,540 --> 00:01:33,750 +Và chúng ta có thể xóa dòng này. Ngoài ra, bạn có thể sử + +24 +00:01:33,750 --> 00:01:35,520 +dụng hai dòng mã cho việc này và + +25 +00:01:36,030 --> 00:01:37,980 +bạn có thể chuyển giá trị vào biến này. + +26 +00:01:38,460 --> 00:01:40,560 +Hai dòng này làm hoàn toàn giống nhau. + +27 +00:01:42,000 --> 00:01:45,090 +Tuy nhiên, khi chúng ta sử dụng phương thức give_feedback này, + +28 +00:01:45,300 --> 00:01:49,650 +chúng ta cần thay đổi nền canvas thành màu đỏ hoặc xanh lá cây tùy thuộc + +29 +00:01:49,710 --> 00:01:52,140 +vào việc người dùng hiểu đúng hay sai. + +30 +00:01:52,770 --> 00:01:55,500 +Và sau đó sau một giây, chúng ta + +31 +00:01:55,530 --> 00:02:00,530 +cần chuyển nó trở lại màu trắng để có thể chuyển sang câu hỏi tiếp theo. + +32 +00:02:02,400 --> 00:02:06,120 +Bạn có thể nghĩ rằng chúng ta có thể đơn giản sử dụng một thứ gì đó như thời gian. ngủ và sau + +33 +00:02:06,120 --> 00:02:10,889 +đó ngủ trong một giây. Nhưng nếu bạn nhớ từ các bài học trước trên + +34 +00:02:11,100 --> 00:02:15,750 +tkinter, chúng tôi đã đề cập rằng chúng tôi không thể xáo trộn thời gian vì chúng tôi có + +35 +00:02:15,780 --> 00:02:20,490 +vòng lặp chính này diễn ra liên tục. Vì vậy, chúng ta phải sử dụng một + +36 +00:02:20,640 --> 00:02:24,720 +phương thức tkinter là cửa sổ. sau. + +37 +00:02:25,680 --> 00:02:30,510 +Và ở đây, chúng ta có thể đặt số mili giây chúng ta muốn trì hoãn, 1000 giây, + +38 +00:02:30,870 --> 00:02:33,030 +sau đó chúng ta muốn gọi hàm nào. + +39 +00:02:33,870 --> 00:02:38,670 +Hãy suy nghĩ về cách bạn có thể tạo give_feedback này để nó có chức năng cụ + +40 +00:02:38,730 --> 00:02:43,710 +thể này, nơi người dùng đưa ra câu trả lời của họ và nếu họ hiểu đúng thì + +41 +00:02:43,710 --> 00:02:48,060 +nó có màu xanh lá cây và nếu họ sai thì nó có màu đỏ. + +42 +00:02:48,840 --> 00:02:51,300 +Tạm dừng video và cố gắng hoàn thành thử thách này. + +43 +00:02:51,770 --> 00:02:52,603 +1: Đi. + +44 +00:02:55,910 --> 00:02:56,390 +0: Được rồi. + +45 +00:02:56,390 --> 00:03:01,390 +Điều đầu tiên chúng ta phải kiểm tra là liệu biến này đang được chuyển vào, is_ + +46 +00:03:01,990 --> 00:03:06,670 +right, thực sự là true hay false. Nếu người dùng hiểu đúng, thì trong + +47 +00:03:06,730 --> 00:03:08,020 +trường hợp đó, + +48 +00:03:08,290 --> 00:03:13,290 +chúng ta sẽ thay đổi canvas và gọi cấu hình trên đó để thay đổi + +49 +00:03:13,480 --> 00:03:17,560 +nền thành màu xanh lá cây. Tuy nhiên, nếu điều này + +50 +00:03:17,560 --> 00:03:20,170 +là sai, nếu họ hiểu sai, thì + +51 +00:03:20,320 --> 00:03:25,320 +chúng ta sẽ thay đổi khung vẽ. cấu hình để nền có + +52 +00:03:26,530 --> 00:03:29,530 +màu đỏ. Bây giờ, khi đã hoàn thành, + +53 +00:03:29,590 --> 00:03:31,720 +canvas của chúng ta sẽ có một màu khác. + +54 +00:03:32,080 --> 00:03:36,910 +Và đây là nơi chúng tôi thiết lập bộ đếm thời gian của mình. Vì vậy, sau 1000 mili giây, tức + +55 +00:03:36,940 --> 00:03:40,810 +là một giây, chúng tôi muốn chuyển sang câu hỏi tiếp theo. + +56 +00:03:42,100 --> 00:03:45,880 +Vì vậy, chúng ta hãy tiếp tục và gọi bản thân. get_next_question. + +57 +00:03:46,420 --> 00:03:50,320 +Nhưng cũng giống như việc chúng ta không thể có dấu ngoặc đơn khi + +58 +00:03:50,350 --> 00:03:54,940 +đặt phương thức lệnh, khi chúng ta sử dụng nó làm đầu vào, chúng ta cũng + +59 +00:03:55,180 --> 00:03:59,020 +cần loại bỏ dấu ngoặc đơn. Vì vậy, bây giờ nếu chúng + +60 +00:03:59,020 --> 00:04:03,250 +tôi chạy mã này và tôi chọn một câu trả lời, thì nó sẽ chuyển + +61 +00:04:03,850 --> 00:04:07,090 +sang màu đỏ khi nó cho thấy rằng tôi đã sai. + +62 +00:04:07,420 --> 00:04:11,410 +Và sau một giây một lần, nó chuyển sang câu hỏi tiếp theo. Bây giờ, khi nó chuyển sang + +63 +00:04:11,440 --> 00:04:16,180 +câu hỏi tiếp theo, đó là nơi chúng ta cần đặt lại canvas của mình. + +64 +00:04:16,450 --> 00:04:21,100 +Vì vậy, nếu chúng ta có thể nói tự. canvas và sau đó làm điều tương + +65 +00:04:21,100 --> 00:04:26,080 +tự để cấu hình nền trở lại màu trắng. Và hãy chạy lại lần nữa. + +66 +00:04:26,440 --> 00:04:29,140 +Tôi có thể thấy tôi đã sai. Và sau một giây, + +67 +00:04:29,230 --> 00:04:32,260 +nó trở lại màu trắng và chuyển sang câu hỏi tiếp theo. + +68 +00:04:33,370 --> 00:04:35,020 +Và điều đó hoàn thành thử thách. + +69 +00:04:36,760 --> 00:04:41,470 +Vì vậy, điều cuối cùng mà chúng ta cần bổ sung là khả năng giữ điểm của chúng ta. + +70 +00:04:42,130 --> 00:04:47,130 +Và tất cả những gì chúng ta cần làm là chọn ra giá trị của điểm số từ bộ não + +71 +00:04:48,340 --> 00:04:52,570 +câu đố và điền nó vào mỗi khi chúng ta nhận được câu hỏi tiếp theo. + +72 +00:04:53,350 --> 00:04:55,570 +Ngoài việc định cấu hình canvas, + +73 +00:04:55,600 --> 00:05:00,600 +chúng tôi sẽ đặt cấu hình của nhãn điểm để chúng tôi thay đổi + +74 +00:05:03,010 --> 00:05:06,940 +văn bản thành điểm mới. Đây sẽ là một chuỗi f và chúng + +75 +00:05:07,030 --> 00:05:09,040 +ta sẽ nói Score: và sau đó chúng + +76 +00:05:09,370 --> 00:05:12,280 +ta sẽ chèn bản thân. quiz, là đối tượng + +77 +00:05:12,310 --> 00:05:16,510 +não đố, và chúng ta sẽ nhận được điểm số hiện tại của nó. + +78 +00:05:17,230 --> 00:05:22,120 +Bây giờ bạn có thể thấy rằng mỗi khi chúng ta ghi được một điểm, thì giá + +79 +00:05:22,390 --> 00:05:24,310 +trị đó sẽ được cập nhật, 1: + +80 +00:05:26,700 --> 00:05:27,390 +phải không? + +81 +00:05:27,390 --> 00:05:31,350 +0: Trong khi nếu chúng tôi làm sai, thì số điểm đó không thay đổi chút nào. Bây giờ, điều mà chúng tôi chưa + +82 +00:05:31,350 --> 00:05:35,190 +thấy là điều gì sẽ xảy ra khi chúng tôi đi đến phần cuối của + +83 +00:05:35,190 --> 00:05:39,210 +bài kiểm tra, bởi vì chúng tôi biết rằng chúng tôi chỉ có 10 câu hỏi. + +84 +00:05:39,660 --> 00:05:41,730 +Và khi chúng ta đến câu hỏi thứ + +85 +00:05:42,030 --> 00:05:47,030 +10, bạn sẽ thấy rằng chúng ta thực sự nhận được một ngoại lệ: chỉ mục nằm ngoài phạm vi. + +86 +00:05:47,430 --> 00:05:50,550 +Và đó là bởi vì chúng tôi đã hoàn thành bài kiểm tra của mình, + +87 +00:05:50,880 --> 00:05:53,850 +nhưng chúng tôi vẫn đang cố gắng nắm bắt câu hỏi tiếp theo. + +88 +00:05:55,080 --> 00:06:00,080 +Vì vậy, những gì chúng ta cần làm là kiểm tra xem chúng ta có thể thực sự nhận được câu hỏi tiếp theo hay không. Và để làm được điều đó, tất cả những gì chúng ta cần là + +89 +00:06:00,650 --> 00:06:05,540 +một câu lệnh if khai thác vào bản thân của chúng ta. đố, đó là bộ não + +90 +00:06:05,570 --> 00:06:07,910 +đố. Và ở + +91 +00:06:07,940 --> 00:06:12,290 +đây, hãy nhớ rằng chúng ta có một phương thức gọi là + +92 +00:06:12,590 --> 00:06:15,470 +still_has_questions, đúng hoặc sai. Bây giờ, nếu chúng + +93 +00:06:15,530 --> 00:06:17,840 +ta vẫn còn câu hỏi, thì chúng ta + +94 +00:06:17,990 --> 00:06:21,560 +sẽ chuyển sang câu hỏi tiếp theo. Nhưng nếu không, những gì + +95 +00:06:21,560 --> 00:06:26,560 +chúng tôi sẽ làm là chúng tôi sẽ cập nhật văn bản canvas để chúng + +96 +00:06:26,810 --> 00:06:31,810 +tôi thay đổi văn bản câu hỏi để thực sự cho người dùng biết rằng + +97 +00:06:32,870 --> 00:06:37,670 +họ đã đến cuối bài kiểm tra. Bây giờ chỉ còn một vài lỗi nữa cần khắc phục. + +98 +00:06:38,000 --> 00:06:41,900 +Đầu tiên là khi chúng ta kết thúc bài kiểm tra, bạn có thể + +99 +00:06:42,350 --> 00:06:44,480 +thấy nó hiển thị dòng chữ này + +100 +00:06:44,840 --> 00:06:49,310 +nhưng chúng ta vẫn có thể nhấn vào các nút này và nó thay đổi nền + +101 +00:06:49,310 --> 00:06:52,700 +mà không có lý do. Vì vậy, chúng tôi muốn có thể tắt + +102 +00:06:52,760 --> 00:06:54,530 +các nút này sau khi chúng tôi kết + +103 +00:06:54,860 --> 00:06:58,610 +thúc bài kiểm tra và chúng tôi cũng muốn đảm bảo rằng nền canvas thực sự là màu + +104 +00:06:58,700 --> 00:06:59,533 +trắng trở lại. + +105 +00:06:59,630 --> 00:07:04,630 +Vì vậy, hãy di chuyển dòng mã này ra khỏi câu lệnh if để không có vấn đề gì xảy ra khi + +106 +00:07:05,060 --> 00:07:07,130 +chúng ta chuyển sang câu hỏi tiếp theo, + +107 +00:07:07,160 --> 00:07:11,990 +chúng ta luôn thay đổi nền canvas trở lại màu trắng. Bây giờ, ngoài ra, chúng tôi muốn vô hiệu hóa + +108 +00:07:11,990 --> 00:07:16,220 +các nút đúng và sai của chúng tôi. Để làm điều đó, tất cả những + +109 +00:07:16,310 --> 00:07:20,810 +gì chúng ta phải làm là nhấn vào một đối số từ khóa được gọi là trạng thái. + +110 +00:07:21,290 --> 00:07:24,950 +Và nếu chúng ta thay đổi trạng thái của nút + +111 +00:07:25,280 --> 00:07:30,280 +thành tắt, thì điều này sẽ ngăn các nút được nhấn hoặc kích hoạt. + +112 +00:07:30,910 --> 00:07:38,380 +1: [không nghe được] 0: Đây, bạn có nó. + +113 +00:07:38,380 --> 00:07:43,380 +Đây là một ứng dụng đố vui được nâng cấp hiện có giao diện người dùng đồ họa mà + +114 +00:07:43,780 --> 00:07:46,000 +chúng ta có thể tương tác với dữ + +115 +00:07:46,000 --> 00:07:51,000 +liệu được tạo hoàn toàn từ ngẫu nhiên và được tìm nạp từ cơ sở dữ liệu câu + +116 +00:07:51,370 --> 00:07:52,203 +đố mở. + +117 +00:07:52,450 --> 00:07:57,450 +Và chúng tôi thậm chí có thể sửa đổi các thông số này để thay đổi bài kiểm tra này theo ý thích của chúng tôi. + +118 +00:07:58,420 --> 00:08:02,980 +Vì vậy, ví dụ: nếu bạn muốn thay đổi danh mục để nói rằng máy tính, thì khi chúng + +119 +00:08:03,370 --> 00:08:06,040 +tôi tạo URL API của mình, bạn có thể thấy rằng + +120 +00:08:06,220 --> 00:08:10,300 +nó thêm một tham số khác được gọi là danh mục và chúng tôi có thể thay + +121 +00:08:10,540 --> 00:08:14,230 +đổi thông số đó thành 18. Vì vậy, chúng ta hãy thử điều đó. + +122 +00:08:16,270 --> 00:08:19,480 +Đặt danh mục thành số 18 và bây giờ khi chúng tôi chạy + +123 +00:08:19,960 --> 00:08:21,610 +mã của mình, tất cả các + +124 +00:08:21,820 --> 00:08:24,910 +câu hỏi của chúng tôi sẽ liên quan đến khoa học máy tính. + +125 +00:08:25,900 --> 00:08:28,570 +Vì vậy, hãy vui chơi với ứng dụng câu đố của bạn và + +126 +00:08:28,990 --> 00:08:33,429 +nếu bạn đã sửa đổi ứng dụng câu đố của mình để làm cho nó thú vị hơn hoặc thêm một số + +127 +00:08:33,460 --> 00:08:34,293 +tính năng khác, + +128 +00:08:34,480 --> 00:08:37,720 +thì hãy nhớ chia sẻ nó với những người còn lại trong phần Hỏi / Đáp. + diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 How-to-Disable-Tkinter-Buttons.url b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 How-to-Disable-Tkinter-Buttons.url new file mode 100644 index 0000000000000000000000000000000000000000..4f46b76527a28ee999e0c20106b5df18294a57a4 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 How-to-Disable-Tkinter-Buttons.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.google.com/search?q=how+to+disable+tkinter+buttons&oq=how+to+disable+tkinter+buttons&aqs=chrome..69i57j0l2.3868j0j4&sourceid=chrome&ie=UTF-8 \ No newline at end of file diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Solution-quizzler-app-end.zip b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Solution-quizzler-app-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..3d252fc641e0428014b9b6739e4278c012a215c3 --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/009 Solution-quizzler-app-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edcb3cf9590940d36110b44f6bbb0835b2754581a7b3796493afd342c2293963 +size 7752 diff --git a/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/external-links.txt b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..6af41bc87240c23a255a3f8bc55f9322dc7268cd --- /dev/null +++ b/part3/34 - Day 34 - Intermediate+ API Practice - Creating a GUI Quiz App/external-links.txt @@ -0,0 +1,21 @@ + +001 The-Open-Trivia-Database +https://opentdb.com/ + +004 Documentation-on-HTML-Entities +https://www.w3schools.com/html/html_entities.asp + +004 FreeFormatter-HTML-Unescape-Tool +https://www.freeformatter.com/html-escape.html + +004 StackOverflow-Answer-on-Unescaping-HTML-Entities-in-Python +https://stackoverflow.com/questions/2087370/decode-html-entities-in-python-string + +006 How-to-Get-TKinter-Canvas-Text-to-Wrap +https://www.google.com/search?q=how+to+get+tkinter+text+in+canvas+to+wrap&oq=how+to+get+tkinter+text+in+canvas+to+wrap&aqs=chrome..69i57j33.7303j0j1&sourceid=chrome&ie=UTF-8 + +009 How-to-Disable-Tkinter-Buttons +https://www.google.com/search?q=how+to+disable+tkinter+buttons&oq=how+to+disable+tkinter+buttons&aqs=chrome..69i57j0l2.3868j0j4&sourceid=chrome&ie=UTF-8 + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/001 Day 35 Goals what you will make by the end of the day.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/001 Day 35 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..69a7cc8d3579616b40704d0d5a52253651815389 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/001 Day 35 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e957e6275865ba3c1c5354f6e2ecf0b5ed975302c90eb1b27ff46a45768d438 +size 6534052 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/001 Day 35 Goals what you will make by the end of the day_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/001 Day 35 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ebf8e885fe118a4a81da5ee6465907fa7a54589e --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/001 Day 35 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,104 @@ +1 +00:00:00,060 --> 00:00:02,370 +Xin chào các bạn, chào mừng đến với ngày thứ + +2 +00:00:02,400 --> 00:00:05,730 +35 của 100 Ngày viết mã. Lại là Angela ở + +3 +00:00:05,850 --> 00:00:09,000 +đây và hôm nay chúng ta sẽ tìm hiểu + +4 +00:00:09,240 --> 00:00:11,580 +tất cả về khóa API, xác + +5 +00:00:11,940 --> 00:00:15,690 +thực, biến môi trường và cả cách gửi SMS bằng Python. + +6 +00:00:16,530 --> 00:00:20,190 +Đó sẽ là một ngày khá đông đúc và chúng ta sẽ học được + +7 +00:00:20,190 --> 00:00:21,023 +rất nhiều điều. + +8 +00:00:21,360 --> 00:00:26,360 +Và mục tiêu là xem xét các cách sử dụng API thậm chí nâng cao hơn và xem xét cách chúng + +9 +00:00:27,180 --> 00:00:31,710 +tôi có thể xác thực bản thân với nhà cung cấp API để chúng tôi có thể truy cập + +10 +00:00:31,710 --> 00:00:35,220 +vào nhiều dữ liệu quý giá hơn. Bây giờ chúng tôi cũng sẽ + +11 +00:00:35,220 --> 00:00:40,220 +xem xét cách chúng tôi có thể sử dụng một API như Twilio để gửi tin nhắn SMS cho chính chúng + +12 +00:00:41,370 --> 00:00:45,030 +tôi để chúng tôi có thể nhận được cảnh báo dù chúng tôi ở đâu. + +13 +00:00:45,750 --> 00:00:46,710 +Và cuối cùng, + +14 +00:00:46,740 --> 00:00:50,790 +chúng ta sẽ xem xét các biến môi trường nào có liên quan đến cách + +15 +00:00:50,790 --> 00:00:54,450 +chúng được sử dụng để lưu trữ các khóa API một cách an toàn. + +16 +00:00:55,140 --> 00:01:00,140 +Tất cả những kiến thức này sẽ là xây dựng một ứng dụng cảnh + +17 +00:01:00,750 --> 00:01:01,583 +báo mưa. + +18 +00:01:01,950 --> 00:01:06,930 +Vì vậy, chúng tôi sẽ viết mã Python sẽ gửi cho chúng tôi một tin nhắn văn bản vào + +19 +00:01:06,990 --> 00:01:11,310 +buổi sáng, ngay trước khi chúng tôi đi ra ngoài, yêu cầu chúng tôi mang theo ô + +20 +00:01:11,580 --> 00:01:13,350 +nếu trời sắp mưa trong ngày. + +21 +00:01:13,920 --> 00:01:15,960 +Vì vậy, bằng cách này chúng ta không phải kiểm tra thời tiết. + +22 +00:01:16,320 --> 00:01:21,320 +Chúng tôi biết rằng ứng dụng đáng tin cậy của chúng tôi sẽ luôn cảnh báo chúng tôi qua tin nhắn + +23 +00:01:21,420 --> 00:01:24,510 +SMS nếu chúng tôi cần mang theo ô trước khi rời nhà. + +24 +00:01:25,140 --> 00:01:28,260 +Vì vậy, đó là mục tiêu. Và nếu bạn chuyển sang bài + +25 +00:01:28,650 --> 00:01:33,570 +học tiếp theo, chúng ta sẽ bắt đầu xây dựng ứng dụng của mình và tìm hiểu về xác + +26 +00:01:33,570 --> 00:01:34,410 +thực API. + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 Create-a-free-account-on-OpenWeatherMap.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 Create-a-free-account-on-OpenWeatherMap.url new file mode 100644 index 0000000000000000000000000000000000000000..2c85d4be32e8004e096579869880a2793ecd37c4 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 Create-a-free-account-on-OpenWeatherMap.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://home.openweathermap.org/users/sign_up \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 What is API Authentication and Why Do We Need to Authenticate Ourselves.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 What is API Authentication and Why Do We Need to Authenticate Ourselves.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f81568f6a211814f49e86020f50415b1dc514761 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 What is API Authentication and Why Do We Need to Authenticate Ourselves.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bccc92bb31ccd2fa1c0f412429150abbca9ec774a900133393aafcb71e460f6e +size 59573455 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 What is API Authentication and Why Do We Need to Authenticate Ourselves_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 What is API Authentication and Why Do We Need to Authenticate Ourselves_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..792c1e3e0c01b5e7edf711f20f070ec7aeb55c5f --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/002 What is API Authentication and Why Do We Need to Authenticate Ourselves_vi.srt @@ -0,0 +1,268 @@ +1 +00:00:00,060 --> 00:00:05,060 +Điều đầu tiên chúng ta sẽ khám phá là cách xác thực bản thân với nhà cung + +2 +00:00:05,340 --> 00:00:10,340 +cấp API để chúng ta có thể truy cập dữ liệu an toàn hơn và có giá + +3 +00:00:11,310 --> 00:00:16,170 +trị hơn từ các nhà cung cấp API. Cho đến thời điểm này, chúng tôi đã tìm hiểu + +4 +00:00:16,230 --> 00:00:20,720 +về các điểm cuối API, vì vậy hãy tìm hiểu đâu là URL mà chúng tôi cần truy cập để + +5 +00:00:20,720 --> 00:00:24,830 +có được một phần dữ liệu cụ thể. Chúng tôi cũng đã xem xét các thông số + +6 +00:00:25,100 --> 00:00:29,600 +API, do đó, chuyển các đầu vào khác nhau để chúng tôi có thể lấy lại các phần dữ liệu + +7 +00:00:29,810 --> 00:00:31,460 +khác nhau từ nhà cung cấp API. + +8 +00:00:32,119 --> 00:00:36,530 +Bây giờ chúng ta sẽ tiến thêm một bước nữa và xem xét cách chúng ta có thể sử + +9 +00:00:36,530 --> 00:00:39,830 +dụng các API yêu cầu xác thực. Trước đây, tất cả các + +10 +00:00:39,830 --> 00:00:43,580 +API mà chúng tôi đã sử dụng đều là các API miễn phí. + +11 +00:00:43,850 --> 00:00:48,850 +Chúng được cung cấp hoàn toàn miễn phí và chúng tôi có thể truy cập tất cả các phần của nó mà không cần bất kỳ hình thức + +12 +00:00:49,040 --> 00:00:51,110 +thanh toán nào tại đây. Hiện tại, + +13 +00:00:51,140 --> 00:00:56,140 +điều này là do dữ liệu chứa trong các API đó rất đơn giản và + +14 +00:00:56,750 --> 00:01:01,750 +sẽ không ai sử dụng dữ liệu đó để xây dựng một ứng dụng thương + +15 +00:01:02,660 --> 00:01:05,630 +mại lớn hoặc lạ mắt. Mặt khác, có những loại dữ + +16 +00:01:05,640 --> 00:01:10,010 +liệu khác rất có giá trị, chẳng hạn như dữ liệu thời tiết, vì nó tốn rất + +17 +00:01:10,310 --> 00:01:10,880 +nhiều + +18 +00:01:10,880 --> 00:01:15,680 +năng lượng và thời gian để ai đó hoặc công ty nào đó thu thập tất cả dữ + +19 +00:01:15,680 --> 00:01:19,580 +liệu này và cung cấp cho bạn. Trong những trường hợp này, + +20 +00:01:19,610 --> 00:01:22,610 +một số API này có thể có cấp trả phí. + +21 +00:01:23,000 --> 00:01:27,110 +Vì vậy, bạn thực sự phải trả tiền nếu bạn đang chạy một ứng dụng + +22 +00:01:27,110 --> 00:01:32,090 +hoặc nếu bạn có một công ty cần nhận dữ liệu này rất thường xuyên và bạn cần nhận + +23 +00:01:32,090 --> 00:01:33,980 +được một lượng lớn dữ liệu. + +24 +00:01:34,820 --> 00:01:39,590 +Tại sao mọi người luôn tính phí API? Chà, nếu bạn nghĩ về một thứ đơn giản như thời tiết, + +25 +00:01:39,590 --> 00:01:43,850 +thì nó không thực sự đơn giản như vậy. Làm thế nào để bạn biết thời tiết + +26 +00:01:43,880 --> 00:01:44,270 +nếu + +27 +00:01:44,270 --> 00:01:49,270 +tôi yêu cầu bạn tìm hiểu thời tiết mà không sử dụng một số loại trang web hoặc công cụ? + +28 +00:01:50,660 --> 00:01:53,570 +Vâng, trong trường hợp cụ thể này, bản đồ thời tiết + +29 +00:01:53,780 --> 00:01:58,100 +mở, họ có quyền truy cập vào hơn 4.000 trạm thời tiết trên toàn cầu và sau + +30 +00:01:58,580 --> 00:02:03,580 +đó các nhà khoa học dữ liệu của họ sẽ lấy dữ liệu thời tiết đó và xem xét các + +31 +00:02:03,680 --> 00:02:08,680 +hình ảnh vệ tinh và xử lý dữ liệu đó để tìm ra thời tiết và dự đoán thời + +32 +00:02:08,720 --> 00:02:13,220 +tiết cho từng thành phố trên thế giới. Như bạn có thể tưởng tượng, điều + +33 +00:02:13,220 --> 00:02:16,610 +đó sẽ thực sự tiêu tốn nhiều tài nguyên và nó sẽ + +34 +00:02:16,610 --> 00:02:21,440 +đòi hỏi rất nhiều nhân viên cũng như bảo trì máy chủ và chi phí điện, phải không? + +35 +00:02:21,890 --> 00:02:26,000 +Vì vậy, đối với tất cả những rắc rối đó, nếu họ sẽ cung cấp dữ liệu này + +36 +00:02:26,270 --> 00:02:29,900 +cho bạn, thì điều hợp lý là bạn nên trả tiền cho nó, phải không? + +37 +00:02:30,380 --> 00:02:31,830 +Về cơ bản, bạn + +38 +00:02:31,940 --> 00:02:35,660 +có thể xem rất nhiều API như một cách để bán dữ liệu. + +39 +00:02:36,140 --> 00:02:40,820 +Nếu bạn sở hữu một số loại dữ liệu đặc quyền mà bạn liên tục cập + +40 +00:02:40,820 --> 00:02:44,720 +nhật hoặc bạn đang tích cực tạo, chẳng hạn như dữ liệu thời + +41 +00:02:44,720 --> 00:02:48,320 +tiết từ hình ảnh vệ tinh hoặc dữ liệu tài chính, + +42 +00:02:48,650 --> 00:02:52,940 +thì bạn nên tính phí cho dữ liệu này, đặc biệt là nếu ai + +43 +00:02:53,180 --> 00:02:57,260 +đó đang đi dựa nhiều vào nó để xây dựng một ứng dụng thương + +44 +00:02:57,290 --> 00:03:01,030 +mại hoặc một công ty. Nhưng may mắn thay, hầu hết + +45 +00:03:01,240 --> 00:03:06,240 +các API này đều cung cấp một cấp miễn phí cho phép bạn thử nghiệm + +46 +00:03:07,500 --> 00:03:08,333 +ứng dụng. + +47 +00:03:08,610 --> 00:03:12,150 +Và nếu bạn là một người mới chỉ học về dây thừng thì việc tính phí của bạn + +48 +00:03:12,150 --> 00:03:12,983 +là không hợp lý. + +49 +00:03:13,290 --> 00:03:18,090 +Nó chỉ có ý nghĩa khi ứng dụng hoặc dịch vụ của bạn có nhiều người dùng. + +50 +00:03:18,480 --> 00:03:22,860 +Và sau đó bạn bắt đầu đi vào các tầng trả phí. Bây giờ, bạn làm cách + +51 +00:03:22,890 --> 00:03:27,180 +nào để ngăn mọi người lạm dụng bậc miễn phí này? + +52 +00:03:27,210 --> 00:03:29,880 +Bởi vì ai cũng có thể nói, tôi chỉ đang học, bạn biết đấy. + +53 +00:03:30,360 --> 00:03:34,260 +Bạn có thể là ai đó đang điều hành một công ty 1000 nhân viên và bạn + +54 +00:03:34,260 --> 00:03:36,900 +có thể khẳng định rằng bạn chỉ đang học hỏi. + +55 +00:03:37,800 --> 00:03:42,240 +Vì vậy, cách mà họ ngăn mọi người lạm dụng dịch vụ của mình là thông + +56 +00:03:42,240 --> 00:03:44,640 +qua một thứ được gọi là khóa API. + +57 +00:03:45,180 --> 00:03:50,160 +Và đây gần giống như số tài khoản cá nhân và mật khẩu của bạn. + +58 +00:03:50,730 --> 00:03:55,730 +Đây là cách nhà cung cấp API có thể theo dõi mức độ bạn đang sử dụng API của họ + +59 +00:03:57,210 --> 00:04:01,110 +và cho phép bạn truy cập cũng như từ chối bạn truy cập khi bạn + +60 +00:04:01,110 --> 00:04:03,720 +đã vượt quá giới hạn. Giờ đây, các nhà cung + +61 +00:04:03,780 --> 00:04:08,160 +cấp API khác nhau có xu hướng có nhiều cách khác nhau để bạn có thể xác + +62 +00:04:08,160 --> 00:04:09,210 +thực bản thân + +63 +00:04:09,630 --> 00:04:13,350 +với họ, nhưng hầu hết chúng đều liên quan đến một số loại khóa API. + +64 +00:04:14,100 --> 00:04:18,149 +Trong bài học tiếp theo, tôi muốn chỉ cho bạn cách chúng tôi có + +65 +00:04:18,149 --> 00:04:19,140 +thể triển khai + +66 +00:04:19,500 --> 00:04:24,500 +API bản đồ thời tiết mở, xác thực bản thân bằng khóa API mà chúng tôi tạo + +67 +00:04:24,550 --> 00:04:28,500 +và nhận dữ liệu trực tiếp. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo, + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Find-Your-Latitude-longitude.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Find-Your-Latitude-longitude.url new file mode 100644 index 0000000000000000000000000000000000000000..69c6dce519d50c1386ecea6a1be52e4e8ce5e065 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Find-Your-Latitude-longitude.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.latlong.net/ \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Link-to-Your-OpenWeatherMap-API-Key-req.login.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Link-to-Your-OpenWeatherMap-API-Key-req.login.url new file mode 100644 index 0000000000000000000000000000000000000000..ca0ee62eeb11024b2f273c8da354b770eb417340 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Link-to-Your-OpenWeatherMap-API-Key-req.login.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://home.openweathermap.org/api_keys \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Online-JSON-Viewer.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Online-JSON-Viewer.url new file mode 100644 index 0000000000000000000000000000000000000000..b2aaba48d71e8009fe291b3dcd2beb5c2d5815da --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Online-JSON-Viewer.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://jsonviewer.stack.hu/ \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 OpenWeatherMap-Current-Weather-API-Documentation.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 OpenWeatherMap-Current-Weather-API-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..f725ddf2529216f097ed1a071240e63fc5e5ad8d --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 OpenWeatherMap-Current-Weather-API-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://openweathermap.org/current \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 OpenWeatherMap-Forecast-API-Documentation.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 OpenWeatherMap-Forecast-API-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..0740b8c95e78796a096433e5def5c641e62d0cd1 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 OpenWeatherMap-Forecast-API-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://openweathermap.org/forecast5 \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Using API Keys to Authenticate and Get the Weather from OpenWeatherMap.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Using API Keys to Authenticate and Get the Weather from OpenWeatherMap.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7cc95dcd5b29785c32669ab7d7cfa19aec79b609 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Using API Keys to Authenticate and Get the Weather from OpenWeatherMap.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a14fa1fecf2809cb6b826c42b9c44b32413c52797357a5ef86dc3324b44bf84f +size 160514651 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Using API Keys to Authenticate and Get the Weather from OpenWeatherMap_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Using API Keys to Authenticate and Get the Weather from OpenWeatherMap_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6fac86cb8d0e9efd132afe6964ae7bf45794d751 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/003 Using API Keys to Authenticate and Get the Weather from OpenWeatherMap_vi.srt @@ -0,0 +1,1112 @@ +1 +00:00:00,360 --> 00:00:03,840 +Người hướng dẫn: Bây giờ, bất cứ khi nào chúng ta bắt + +2 +00:00:03,840 --> 00:00:07,950 +đầu sử dụng một API mới, điều quan trọng nhất là đọc tài liệu. + +3 +00:00:07,950 --> 00:00:10,860 +Tôi biết việc bỏ qua phần hướng dẫn và bắt tay ngay + +4 +00:00:10,860 --> 00:00:12,750 +vào nó thực sự rất hấp dẫn. + +5 +00:00:12,750 --> 00:00:15,420 +Tôi cũng là loại người mua một chiếc + +6 +00:00:15,420 --> 00:00:18,090 +máy cắt cỏ và vứt sách hướng dẫn đi, rồi + +7 +00:00:18,090 --> 00:00:20,850 +hai ngày sau có thứ gì đó bị hỏng và tôi + +8 +00:00:20,850 --> 00:00:23,760 +chỉ muốn tự làm mình bị thương vì sẽ dễ dàng + +9 +00:00:23,760 --> 00:00:24,960 +hơn rất nhiều nếu + +10 +00:00:24,960 --> 00:00:27,810 +tôi thực sự đọc sách hướng dẫn. + +11 +00:00:27,810 --> 00:00:30,090 +Nhưng trong trường hợp này, nó thực sự quan trọng. + +12 +00:00:30,090 --> 00:00:33,420 +Vì vậy, hãy chuyển sang openweathermap. org cùng nhau + +13 +00:00:33,420 --> 00:00:36,270 +vào phần API để xem + +14 +00:00:36,270 --> 00:00:39,480 +tài liệu về API. + +15 +00:00:39,480 --> 00:00:40,500 +Như bạn có thể + +16 +00:00:40,500 --> 00:00:44,400 +thấy, nhà cung cấp API này thực sự có một số sản phẩm. + +17 +00:00:44,400 --> 00:00:47,370 +Vì vậy, bạn có thể xem dữ liệu thời tiết + +18 +00:00:47,370 --> 00:00:52,370 +hiện tại, dự báo hàng giờ, API Một cuộc gọi, dự báo hàng ngày + +19 +00:00:53,220 --> 00:00:55,530 +và nhiều thứ khác. + +20 +00:00:55,530 --> 00:00:58,470 +Vì vậy, mỗi trong số này có điểm cuối riêng của họ. + +21 +00:00:58,470 --> 00:01:00,390 +Và nếu chúng ta xem tài liệu API, + +22 +00:01:00,390 --> 00:01:02,160 +bạn có thể thấy tài liệu đầu tiên + +23 +00:01:02,160 --> 00:01:07,160 +này, API là api. openweathermap. org/data/2. 5/thời tiết. + +24 +00:01:09,840 --> 00:01:11,430 +Đó là điểm cuối. + +25 +00:01:11,430 --> 00:01:14,070 +Trong khi đó dự báo hàng giờ là chuyên + +26 +00:01:14,070 --> 00:01:19,070 +nghiệp. openweathermap. org/data/2. 5/dự báo/hàng giờ. + +27 +00:01:22,020 --> 00:01:24,510 +Vì vậy, tùy thuộc vào những gì chúng + +28 +00:01:24,510 --> 00:01:28,830 +ta cần, chúng ta có thể khai thác từng API khác nhau này. + +29 +00:01:28,830 --> 00:01:30,540 +Hãy bắt đầu với một điều dễ dàng. + +30 +00:01:30,540 --> 00:01:32,730 +Hãy thử lấy dữ liệu thời tiết hiện tại + +31 +00:01:32,730 --> 00:01:34,770 +của thành phố mà chúng ta đang ở. + +32 +00:01:34,770 --> 00:01:37,320 +Bạn có thể thấy phần này là điểm cuối, + +33 +00:01:37,320 --> 00:01:40,320 +tức là URL mà chúng ta sẽ truy cập. + +34 +00:01:40,320 --> 00:01:42,900 +Và sau đó chúng tôi có một số thông số. + +35 +00:01:42,900 --> 00:01:47,660 +Tham số nơi chúng ta có thể chỉ định tên thành phố là q. + +36 +00:01:48,540 --> 00:01:50,700 +Vì vậy, đó là tên của tham số và sau + +37 +00:01:50,700 --> 00:01:53,490 +đó chúng ta phải cung cấp một giá trị. + +38 +00:01:53,490 --> 00:01:55,680 +Ngoài ra, bây giờ còn có một + +39 +00:01:55,680 --> 00:02:00,060 +tham số khác mà chúng tôi phải đưa vào tất cả các lệnh + +40 +00:02:00,060 --> 00:02:04,140 +gọi API đến dịch vụ cụ thể này và đó là một appid. + +41 +00:02:04,140 --> 00:02:06,630 +Chúng tôi phải có khóa API + +42 +00:02:06,630 --> 00:02:09,360 +để sử dụng dịch vụ này. + +43 +00:02:09,360 --> 00:02:11,490 +Và họ cho bạn thấy một ví dụ ở đây. + +44 +00:02:11,490 --> 00:02:13,530 +Nếu chúng tôi nhấp vào URL này, chúng tôi sẽ + +45 +00:02:13,530 --> 00:02:17,610 +đưa chúng tôi đến các mẫu. openweathermap. org. + +46 +00:02:17,610 --> 00:02:19,770 +Và đây chỉ là một số dữ liệu + +47 +00:02:19,770 --> 00:02:23,130 +mẫu mà họ đã cung cấp một ứng dụng mẫu. + +48 +00:02:23,130 --> 00:02:26,160 +Giờ đây, chúng ta có thể tải ứng dụng của riêng mình + +49 +00:02:26,160 --> 00:02:29,580 +miễn phí bằng cách đăng ký dịch vụ thời tiết này. + +50 +00:02:29,580 --> 00:02:32,280 +Và khi bạn đăng ký và đăng nhập, đây + +51 +00:02:32,280 --> 00:02:34,350 +là trang bạn nhìn thấy. + +52 +00:02:34,350 --> 00:02:38,010 +Vì vậy, bây giờ chúng ta có thể đi vào phần này được gọi + +53 +00:02:38,010 --> 00:02:41,430 +là khóa API và lấy khóa API của chúng tôi tại đây. + +54 +00:02:41,430 --> 00:02:43,860 +Vì vậy, bạn có thể tạo bao nhiêu khóa + +55 +00:02:43,860 --> 00:02:45,600 +tùy thích và có thể cung cấp + +56 +00:02:45,600 --> 00:02:49,680 +tên liên quan đến mục đích sử dụng cuối cùng của khóa đó. + +57 +00:02:49,680 --> 00:02:51,360 +Vì vậy tôi đã đặt tên nó là Python. + +58 +00:02:51,360 --> 00:02:54,390 +Và bây giờ tôi sẽ sao chép khóa API + +59 +00:02:54,390 --> 00:02:57,390 +này và đặt nó vào dự án của mình. + +60 +00:02:57,390 --> 00:03:00,270 +Vì vậy, tôi đã bắt đầu một dự án mới có tên là + +61 +00:03:00,270 --> 00:03:05,160 +rain_alert và bên trong tệp main. py, tôi sẽ tạo một khóa API và + +62 +00:03:05,160 --> 00:03:09,390 +tôi sẽ lưu khóa đó mà tôi đã sao chép vào một tập hợp + +63 +00:03:09,390 --> 00:03:12,900 +các dấu ngoặc kép dưới dạng một chuỗi. + +64 +00:03:12,900 --> 00:03:15,360 +Bây giờ, khi tôi đã có khóa API, tôi thực + +65 +00:03:15,360 --> 00:03:18,153 +sự có thể kiểm tra lệnh gọi API này. + +66 +00:03:20,340 --> 00:03:24,150 +Vì vậy, tôi có thể thay thế phần này bằng tên thành phố của tôi, + +67 +00:03:24,150 --> 00:03:28,800 +đó là Luân Đôn, và sau đó tôi có thể thêm quốc gia của mình để đảm bảo rằng nó có + +68 +00:03:28,800 --> 00:03:31,290 +tên là Luân Đôn, U. K. chứ không phải + +69 +00:03:31,290 --> 00:03:34,860 +London, Ontario hay nơi nào khác. + +70 +00:03:34,860 --> 00:03:37,500 +Và cuối cùng, tôi sẽ dán khóa API + +71 +00:03:37,500 --> 00:03:39,900 +mà tôi vừa sao chép vào. + +72 +00:03:39,900 --> 00:03:42,180 +Và bây giờ, khi tôi nhấn Enter + +73 +00:03:42,180 --> 00:03:44,610 +và miễn là khóa API của tôi hợp lệ, + +74 +00:03:44,610 --> 00:03:49,530 +tôi sẽ nhận được kết quả ở định dạng dữ liệu thời tiết của mình. + +75 +00:03:49,530 --> 00:03:53,190 +Bây giờ, tôi muốn bạn đảm bảo rằng khóa API của bạn cũng hoạt + +76 +00:03:53,190 --> 00:03:55,290 +động bằng cách sử dụng cùng một phương + +77 +00:03:55,290 --> 00:03:59,010 +pháp. Nhưng hãy nhớ rằng bạn phải giữ khóa API của riêng mình + +78 +00:03:59,010 --> 00:04:03,600 +bằng cách đăng ký OpenWeatherMap nếu bạn muốn nó hoạt động. + +79 +00:04:03,600 --> 00:04:07,830 +Đảm bảo rằng bạn thay thế phần này bằng khóa API của riêng bạn. + +80 +00:04:07,830 --> 00:04:10,050 +Nếu không, nó sẽ không hoạt động. + +81 +00:04:10,050 --> 00:04:13,424 +Bây giờ chúng ta đã thấy rằng lệnh gọi API cụ thể + +82 +00:04:13,424 --> 00:04:15,420 +này thực sự hoạt động, hãy + +83 +00:04:15,420 --> 00:04:19,860 +xem điều gì sẽ xảy ra nếu chúng ta cung cấp khóa API sai. + +84 +00:04:19,860 --> 00:04:24,120 +Vì vậy, nếu tôi chỉ tạo một khóa API và nhấn Enter, + +85 +00:04:24,120 --> 00:04:26,820 +bạn có thể thấy chúng tôi nhận lại + +86 +00:04:26,820 --> 00:04:30,390 +được một mã, đó là mã HTTP có tên là 401. + +87 +00:04:30,390 --> 00:04:31,890 +Và chúng tôi cũng có thể nhận được + +88 +00:04:31,890 --> 00:04:35,010 +thông báo cho chúng tôi biết rằng đó là khóa API không hợp lệ và + +89 +00:04:35,010 --> 00:04:38,190 +chúng tôi có thể truy cập URL này để biết thêm thông tin. + +90 +00:04:38,190 --> 00:04:40,320 +Bây giờ, hãy nhớ rằng, trong các bài + +91 +00:04:40,320 --> 00:04:43,290 +học trước, tôi đã đề cập rằng mã trạng thái HTTP + +92 +00:04:43,290 --> 00:04:45,120 +là mã mà chúng tôi nhận được khi + +93 +00:04:45,120 --> 00:04:47,760 +cố gắng liên lạc với một máy chủ khác. + +94 +00:04:47,760 --> 00:04:51,390 +Vì vậy, trong trường hợp này, chúng tôi đã lấy lại được + +95 +00:04:51,390 --> 00:04:53,700 +mã 401, nghĩa là trái phép. + +96 +00:04:53,700 --> 00:04:55,320 +Và khi bạn lấy lại mã này + +97 +00:04:55,320 --> 00:04:56,730 +và bạn đang làm việc + +98 +00:04:56,730 --> 00:05:00,180 +với một API, điều đó thường có nghĩa là khóa API + +99 +00:05:00,180 --> 00:05:03,390 +hoặc cách ủy quyền bằng khóa API của bạn bằng + +100 +00:05:03,390 --> 00:05:05,730 +cách nào đó không hoạt động. + +101 +00:05:05,730 --> 00:05:08,253 +Vì vậy, đó là điều mà bạn nên kiểm tra. + +102 +00:05:09,570 --> 00:05:13,200 +Chúng ta có thể thấy rằng đối với nhà cung cấp API + +103 +00:05:13,200 --> 00:05:16,650 +cụ thể này, chúng ta phải xác thực chính mình với + +104 +00:05:16,650 --> 00:05:20,883 +máy chủ của họ bằng cách cung cấp khóa API làm tham số. + +105 +00:05:22,170 --> 00:05:24,450 +Vì vậy bây giờ tôi muốn đưa ra cho bạn một thử thách. + +106 +00:05:24,450 --> 00:05:27,840 +Tôi muốn bạn truy cập tài liệu API OpenWeatherMaps + +107 +00:05:27,840 --> 00:05:30,840 +để biết dự báo thời tiết trong 5 ngày của họ. + +108 +00:05:30,840 --> 00:05:32,190 +Dự báo thời tiết trong + +109 +00:05:32,190 --> 00:05:35,520 +năm ngày sẽ cung cấp cho bạn dự báo thời tiết ba giờ + +110 +00:05:35,520 --> 00:05:38,160 +một lần dựa trên vị trí bạn cung cấp. + +111 +00:05:38,160 --> 00:05:41,040 +Ý nghĩa của OpenWeatherMap khi dự báo ba giờ + +112 +00:05:41,040 --> 00:05:44,970 +là họ sẽ cung cấp cho bạn tám dự báo thời tiết mỗi ngày. + +113 +00:05:44,970 --> 00:05:47,220 +Dự báo sớm nhất sẽ là lúc 3:00 sáng, + +114 +00:05:47,220 --> 00:05:51,690 +dự báo tiếp theo là lúc 6:00 sáng và dự báo sau đó là lúc 9:00 sáng, + +115 +00:05:51,690 --> 00:05:55,470 +sau đó là dự báo vào giữa trưa, v.v. cho đến nửa đêm. + +116 +00:05:55,470 --> 00:05:59,430 +Thử thách của tôi dành cho bạn là thực hiện yêu cầu API từ PyCharm bằng + +117 +00:05:59,430 --> 00:06:01,740 +cách sử dụng dự báo thời tiết trong 5 ngày + +118 +00:06:01,740 --> 00:06:03,450 +và xác định dự báo thời tiết trong + +119 +00:06:03,450 --> 00:06:06,000 +phản hồi JSON mà bạn nhận được. + +120 +00:06:06,000 --> 00:06:08,010 +Bây giờ tôi có thể cho bạn biết chính + +121 +00:06:08,010 --> 00:06:10,650 +xác những gì cần làm, nhưng thực sự tốt nếu bạn + +122 +00:06:10,650 --> 00:06:12,870 +thực hành đọc tài liệu API vì xét cho cùng, + +123 +00:06:12,870 --> 00:06:14,430 +trong tương lai, bạn sẽ sử dụng + +124 +00:06:14,430 --> 00:06:16,770 +vô số API khác nhau và tất cả chúng đều có + +125 +00:06:16,770 --> 00:06:18,090 +cách làm việc khác nhau + +126 +00:06:18,090 --> 00:06:20,253 +với chúng. dịch vụ. + +127 +00:06:21,240 --> 00:06:22,560 +Hãy xem trang này. + +128 +00:06:22,560 --> 00:06:24,900 +Tôi sẽ liên kết với nó trong tài + +129 +00:06:24,900 --> 00:06:28,320 +nguyên khóa học và tôi muốn bạn triển khai lệnh + +130 +00:06:28,320 --> 00:06:30,870 +gọi API này bằng cách cung cấp vĩ độ + +131 +00:06:30,870 --> 00:06:33,210 +và vĩ độ của vị trí hiện tại của bạn + +132 +00:06:33,210 --> 00:06:37,020 +và đảm bảo rằng bạn thêm ứng dụng cá nhân của mình bằng + +133 +00:06:37,020 --> 00:06:39,660 +cách giữ khóa API. + +134 +00:06:39,660 --> 00:06:40,860 +Bây giờ, hãy nhớ rằng, + +135 +00:06:40,860 --> 00:06:42,870 +bạn có thể có được vĩ độ và kinh độ hiện + +136 +00:06:42,870 --> 00:06:47,040 +tại chỉ bằng cách truy cập latlong. net, sau đó nhập tên địa + +137 +00:06:47,040 --> 00:06:48,720 +điểm rồi bấm Tìm. + +138 +00:06:48,720 --> 00:06:51,090 +Đừng lo lắng nếu nó thông báo đã phát hiện + +139 +00:06:51,090 --> 00:06:53,940 +thấy bot, bạn chỉ cần quay lại trang web sau một + +140 +00:06:53,940 --> 00:06:55,320 +lúc và thử lại. + +141 +00:06:55,320 --> 00:06:56,153 +Tại một thời điểm + +142 +00:06:56,153 --> 00:06:58,980 +nào đó, nó sẽ hiển thị cho bạn vĩ độ và kinh độ + +143 +00:06:58,980 --> 00:07:01,740 +của bạn, sau đó bạn có thể cắm chúng làm tham + +144 +00:07:01,740 --> 00:07:04,200 +số cho lệnh gọi API cụ thể này. + +145 +00:07:04,200 --> 00:07:06,960 +Vì vậy, nếu bạn cố gắng học hết tất cả các bài học ngày hôm qua + +146 +00:07:06,960 --> 00:07:09,240 +thì đây sẽ là một miếng bánh dễ dàng đối với bạn. + +147 +00:07:09,240 --> 00:07:10,990 +Hãy tạm dừng video và thử xem. + +148 +00:07:17,430 --> 00:07:19,560 +Được rồi, vì vậy nếu điều đó khó khăn + +149 +00:07:19,560 --> 00:07:22,560 +chút nào, hãy đảm bảo rằng bạn không bỏ qua bài + +150 +00:07:22,560 --> 00:07:27,150 +học ngày hôm qua vì tôi sẽ trình bày chi tiết cách đạt được điểm cuối API, + +151 +00:07:27,150 --> 00:07:28,770 +cách cung cấp tham số và cách + +152 +00:07:28,770 --> 00:07:32,160 +hoàn thành thử thách này về cơ bản. + +153 +00:07:32,160 --> 00:07:33,840 +Nhưng hy vọng là bạn đã + +154 +00:07:33,840 --> 00:07:36,930 +ổn và bạn chỉ ở đây để kiểm tra giải pháp. + +155 +00:07:36,930 --> 00:07:38,550 +Như mọi khi, chúng ta sẽ + +156 +00:07:38,550 --> 00:07:41,643 +bắt đầu bằng cách nhập gói yêu cầu của mình. + +157 +00:07:42,750 --> 00:07:46,590 +Hãy nhớ rằng nếu bạn đang tạo tệp này từ đầu và chưa + +158 +00:07:46,590 --> 00:07:49,890 +tải xuống từ tệp zip thì bạn sẽ phải cài đặt + +159 +00:07:49,890 --> 00:07:52,950 +mô-đun này theo cách thủ công. + +160 +00:07:52,950 --> 00:07:54,990 +Vì vậy, nếu bạn nhấp vào nó trong PyCharm, bạn sẽ + +161 +00:07:54,990 --> 00:07:56,460 +nhận được một bóng đèn màu đỏ nhỏ. + +162 +00:07:56,460 --> 00:07:59,348 +Và sau đó khi bạn nhấp vào mũi tên xuống, + +163 +00:07:59,348 --> 00:08:02,580 +bạn có thể cài đặt gói đó, đơn giản. + +164 +00:08:02,580 --> 00:08:05,280 +Bây giờ, khi bạn đã cài đặt xong các yêu cầu, + +165 +00:08:05,280 --> 00:08:09,930 +chúng ta có thể sử dụng phương thức GET để chuyển vào điểm cuối của mình. + +166 +00:08:09,930 --> 00:08:12,520 +Bây giờ điểm cuối OpenWeatherMap là điểm + +167 +00:08:14,100 --> 00:08:16,980 +cuối mà chúng ta thấy trong tài liệu API. + +168 +00:08:16,980 --> 00:08:18,840 +Vậy là mọi thứ đã xong nhưng + +169 +00:08:18,840 --> 00:08:20,850 +không bao gồm dấu chấm hỏi. + +170 +00:08:20,850 --> 00:08:22,650 +Vì vậy, tất cả điều này. + +171 +00:08:22,650 --> 00:08:26,550 +Và chúng ta có thể dán nó vào và lưu nó dưới dạng một chuỗi. + +172 +00:08:26,550 --> 00:08:29,340 +Đó là những gì chúng tôi muốn thực hiện yêu cầu GET của mình. + +173 +00:08:29,340 --> 00:08:30,573 +Vì vậy, OWM_Endpoint. + +174 +00:08:31,800 --> 00:08:34,860 +Và ngoài ra, chúng tôi sẽ cung cấp một số thông số. + +175 +00:08:34,860 --> 00:08:38,669 +Vì vậy, điều này sẽ xác định loại dữ liệu chúng tôi nhận được. + +176 +00:08:38,669 --> 00:08:40,770 +Và trong trường hợp này, đó sẽ là + +177 +00:08:40,770 --> 00:08:44,370 +thời tiết ở một địa điểm cụ thể mà chúng ta quan tâm. + +178 +00:08:44,370 --> 00:08:46,793 +Hãy tạo các thông số thời tiết + +179 +00:08:48,510 --> 00:08:50,820 +và đây sẽ là một từ điển. + +180 +00:08:50,820 --> 00:08:53,700 +Và chúng tôi phải tuân theo các khóa + +181 +00:08:53,700 --> 00:08:56,670 +được cung cấp trong tài liệu API. + +182 +00:08:56,670 --> 00:09:00,720 +Vì vậy, các tham số mà chúng tôi có thể cung cấp cho API + +183 +00:09:00,720 --> 00:09:04,110 +này là lats, tức là vĩ độ, lon, là kinh độ. + +184 +00:09:04,110 --> 00:09:05,640 +Và rất nhiều người mắc lỗi chính + +185 +00:09:05,640 --> 00:09:08,610 +tả ở đây vì họ thêm chữ G. thực ra nó chỉ là L-O-N. + +186 +00:09:08,610 --> 00:09:11,730 +Đó là tên của khóa tham số. + +187 +00:09:11,730 --> 00:09:15,300 +Và cuối cùng, appid, là khóa API mà bạn đã + +188 +00:09:15,300 --> 00:09:16,533 +có trước đó. + +189 +00:09:17,940 --> 00:09:21,840 +Trong trường hợp của chúng tôi, chúng tôi muốn cung cấp vĩ + +190 +00:09:21,840 --> 00:09:26,040 +độ, vĩ độ, chúng tôi muốn cung cấp kinh độ, L-O-N, là kinh độ và + +191 +00:09:26,040 --> 00:09:29,550 +chúng tôi cũng muốn cung cấp ứng dụng của mình. + +192 +00:09:29,550 --> 00:09:31,110 +Bây giờ ứng dụng của chúng tôi rất đơn giản. + +193 +00:09:31,110 --> 00:09:34,470 +Nó chỉ đơn giản là khóa API mà chúng tôi đã nhận được trước đó. + +194 +00:09:34,470 --> 00:09:38,100 +Và một lần nữa, xin nhắc lại, chiếc chìa khóa này sẽ không hoạt động. + +195 +00:09:38,100 --> 00:09:41,790 +Bạn sẽ phải đăng ký và có được của riêng bạn để nó hoạt động. + +196 +00:09:41,790 --> 00:09:43,920 +Bây giờ chúng ta sẽ tính vĩ độ bằng cách + +197 +00:09:43,920 --> 00:09:45,900 +sử dụng latlong. mạng lưới. + +198 +00:09:45,900 --> 00:09:47,100 +Vì vậy, tôi đang cố gắng nắm + +199 +00:09:47,100 --> 00:09:50,430 +bắt thông tin thời tiết ở nơi tôi hiện đang cư trú, đó là London. + +200 +00:09:50,430 --> 00:09:55,230 +Vậy vĩ độ của tôi là giá trị này và kinh độ của tôi là giá trị này. + +201 +00:09:55,230 --> 00:09:57,120 +Đảm bảo rằng bạn sao chép mọi thứ, + +202 +00:09:57,120 --> 00:09:59,823 +kể cả mọi dấu hiệu tiêu cực như thế này. + +203 +00:10:01,380 --> 00:10:04,290 +Vì vậy, đây sẽ là số dấu phẩy động. + +204 +00:10:04,290 --> 00:10:07,530 +Và bây giờ chúng ta đã hoàn thành các thông số thời tiết, + +205 +00:10:07,530 --> 00:10:10,440 +chúng ta sẽ chuyển nó vào phương thức này. + +206 +00:10:10,440 --> 00:10:14,460 +Và bây giờ, chúng ta có thể lưu kết quả đầu ra + +207 +00:10:14,460 --> 00:10:16,620 +từ đây làm phản hồi. + +208 +00:10:16,620 --> 00:10:20,680 +Và chúng ta có thể in phản hồi. status_code để xem nó có + +209 +00:10:22,515 --> 00:10:24,330 +thành công không. + +210 +00:10:24,330 --> 00:10:27,240 +Vì vậy, bây giờ chúng ta hãy tiếp tục và chạy phần chính của chúng ta. py. + +211 +00:10:27,240 --> 00:10:30,480 +Và bạn có thể thấy mã phản hồi mà chúng tôi nhận được + +212 +00:10:30,480 --> 00:10:33,150 +là 200, nghĩa là mọi thứ đều A-OK. + +213 +00:10:33,150 --> 00:10:36,330 +Bây giờ, nếu bạn nhận được mã phản hồi là 401, điều + +214 +00:10:36,330 --> 00:10:39,600 +đó có nghĩa là khóa API của bạn có thể không hợp lệ + +215 +00:10:39,600 --> 00:10:42,930 +hoặc bạn đã viết sai chính tả tên của khóa đó. + +216 +00:10:42,930 --> 00:10:45,720 +Nó phải là appid, tất cả đều được viết bằng chữ thường, + +217 +00:10:45,720 --> 00:10:48,303 +như họ đã cho chúng tôi xem trong tài liệu của họ. + +218 +00:10:49,740 --> 00:10:51,690 +Tuy nhiên, nếu bạn nhận được 200, + +219 +00:10:51,690 --> 00:10:53,700 +điều đó có nghĩa là mọi thứ đã thành + +220 +00:10:53,700 --> 00:10:57,000 +công và giờ đây chúng ta có thể khai thác dữ liệu thực tế. + +221 +00:10:57,000 --> 00:10:59,722 +Vì vậy, hãy khai thác phản ứng. json và hãy + +222 +00:10:59,722 --> 00:11:01,893 +in nó ra. + +223 +00:11:03,690 --> 00:11:04,770 +Vì vậy, bạn có nó. + +224 +00:11:04,770 --> 00:11:06,960 +Chúng tôi đã có tất cả dữ liệu ở + +225 +00:11:06,960 --> 00:11:09,600 +đây được lấy lại từ lệnh gọi API đó. + +226 +00:11:09,600 --> 00:11:11,070 +Và nếu bạn cuộn, + +227 +00:11:11,070 --> 00:11:14,253 +thực sự có khá nhiều dữ liệu ở đó. + +228 +00:11:17,100 --> 00:11:19,110 +Bây giờ, để xem được điều này, không + +229 +00:11:19,110 --> 00:11:21,570 +dễ dàng gì để xem nó trong bảng điều khiển. + +230 +00:11:21,570 --> 00:11:24,360 +Vì vậy, tôi sẽ nhấp ba lần vào đây + +231 +00:11:24,360 --> 00:11:26,730 +và sao chép tất cả chuỗi đó. + +232 +00:11:26,730 --> 00:11:30,960 +Và tôi sẽ xem nó trong trình xem JSON trực tuyến. + +233 +00:11:30,960 --> 00:11:32,670 +Vì vậy, tôi cũng sẽ liên kết đến cái + +234 +00:11:32,670 --> 00:11:34,980 +này, nhưng bạn muốn dán JSON mà bạn đã lấy lại vào + +235 +00:11:34,980 --> 00:11:37,470 +đây và bạn có thể thấy, ồ, thật là một mớ hỗn độn. + +236 +00:11:37,470 --> 00:11:39,060 +Rất nhiều dữ liệu. + +237 +00:11:39,060 --> 00:11:40,980 +Nhưng nếu bạn nhấp vào Trình + +238 +00:11:40,980 --> 00:11:44,100 +xem, bạn có thể thấy nó đã định dạng tốt tất cả dữ + +239 +00:11:44,100 --> 00:11:45,660 +liệu đó cho chúng tôi. + +240 +00:11:45,660 --> 00:11:47,880 +Vì vậy chúng ta có thể dễ dàng xem dự báo + +241 +00:11:47,880 --> 00:11:49,710 +thời tiết trong 5 ngày tới. + +242 +00:11:49,710 --> 00:11:52,020 +Dự báo được thực hiện ba giờ một lần, + +243 +00:11:52,020 --> 00:11:54,660 +bắt đầu từ thời điểm bạn đưa ra yêu cầu. + +244 +00:11:54,660 --> 00:11:58,020 +Vì có tám dự báo riêng lẻ mỗi ngày trong + +245 +00:11:58,020 --> 00:11:59,550 +cả năm ngày nên bạn + +246 +00:11:59,550 --> 00:12:02,493 +sẽ nhận được tổng cộng 40 dự báo. + +247 +00:12:03,390 --> 00:12:04,860 +Ở cuối JSON, bạn sẽ + +248 +00:12:04,860 --> 00:12:07,350 +thấy tên vị trí gần nhất với vĩ + +249 +00:12:07,350 --> 00:12:10,590 +độ và kinh độ mà bạn đã cung cấp. + +250 +00:12:10,590 --> 00:12:11,730 +Đối với tọa độ của + +251 +00:12:11,730 --> 00:12:15,420 +tôi, đó là Abbey Wood ở London, Vương quốc Anh. + +252 +00:12:15,420 --> 00:12:18,540 +Trở lại phần trên, tôi có thể nhìn vào thời tiết thực tế. + +253 +00:12:18,540 --> 00:12:20,580 +Nếu tôi mở rộng điểm dữ liệu đầu tiên ở đây, + +254 +00:12:20,580 --> 00:12:23,370 +bạn có thể thấy rằng nó mang lại cho tôi dấu thời gian. + +255 +00:12:23,370 --> 00:12:24,840 +Định dạng dấu thời + +256 +00:12:24,840 --> 00:12:27,390 +gian này là số giây đã trôi qua + +257 +00:12:27,390 --> 00:12:30,600 +kể từ ngày 1 tháng 1 năm 1970, con số này + +258 +00:12:30,600 --> 00:12:32,940 +rất khó đọc được. + +259 +00:12:32,940 --> 00:12:37,940 +Vì vậy, OpenWeatherMap cũng đã cung cấp cho chúng tôi trường dt_txt. + +260 +00:12:38,760 --> 00:12:42,990 +Nếu mở rộng main, bạn sẽ thấy nhiệt độ tính bằng Kelvins, + +261 +00:12:42,990 --> 00:12:47,310 +áp suất, độ ẩm cũng như thời tiết thực tế. + +262 +00:12:47,310 --> 00:12:49,320 +Như bạn có thể thấy trong dấu ngoặc + +263 +00:12:49,320 --> 00:12:52,230 +vuông, dữ liệu thời tiết có dạng danh sách. + +264 +00:12:52,230 --> 00:12:56,490 +Nhìn vào bên trong, chúng ta thấy danh sách này chỉ có một mục duy nhất. + +265 +00:12:56,490 --> 00:12:58,800 +Đây là nơi chúng tôi có mô tả + +266 +00:12:58,800 --> 00:13:00,720 +về dự báo thời tiết. + +267 +00:13:00,720 --> 00:13:05,340 +Nó cho chúng ta biết rằng dự báo thời tiết sẽ có mây u ám, điều + +268 +00:13:05,340 --> 00:13:09,060 +này khá bình thường nếu bạn đã từng đến London. + +269 +00:13:09,060 --> 00:13:10,360 +Ít nhất thì trời không mưa. + +270 +00:13:11,460 --> 00:13:15,720 +Hiện chúng tôi đã quản lý để sử dụng API ứng dụng OpenWeather + +271 +00:13:15,720 --> 00:13:18,720 +này, tự xác thực bằng khóa API và lấy + +272 +00:13:18,720 --> 00:13:22,680 +lại dữ liệu cần thiết từ dịch vụ này. + +273 +00:13:22,680 --> 00:13:23,940 +Vì vậy, trong bài học tiếp + +274 +00:13:23,940 --> 00:13:26,310 +theo, chúng ta sẽ đi sâu vào dữ liệu mà chúng ta thu + +275 +00:13:26,310 --> 00:13:27,600 +được và sẽ sử dụng dữ liệu đó + +276 +00:13:27,600 --> 00:13:30,150 +để tìm hiểu xem hôm nay trời có mưa hay không. + +277 +00:13:30,150 --> 00:13:31,860 +Vì vậy, với tất cả những điều đó và hơn thế nữa, + +278 +00:13:31,860 --> 00:13:33,460 +tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Challenge - Check if it Will Rain in the Next 12 Hours.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Challenge - Check if it Will Rain in the Next 12 Hours.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8e21b251e5c8e199ccb9010a62a2423858edc15c --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Challenge - Check if it Will Rain in the Next 12 Hours.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ded2cbe1909751e0ad873649563c764ebda916d219f679db456f6e1e9c62a76 +size 229453006 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Challenge - Check if it Will Rain in the Next 12 Hours_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Challenge - Check if it Will Rain in the Next 12 Hours_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..99db2fdfe48bbc42bdd6fe8576dff6d140cfb74b --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Challenge - Check if it Will Rain in the Next 12 Hours_vi.srt @@ -0,0 +1,1324 @@ +1 +00:00:00,720 --> 00:00:03,630 +Trình tường thuật: Để tạo một ứng dụng cảnh báo mưa hữu ích. + +2 +00:00:03,630 --> 00:00:04,920 +Chúng tôi muốn tập lệnh + +3 +00:00:04,920 --> 00:00:08,640 +của mình phát hiện xem trời có mưa trong vòng 12 giờ tiếp theo kể từ + +4 +00:00:08,640 --> 00:00:11,130 +khi tập lệnh Python được chạy hay không. + +5 +00:00:11,130 --> 00:00:13,680 +Giả sử hàng ngày bạn rời nhà lúc 8 + +6 +00:00:13,680 --> 00:00:15,150 +giờ sáng để đi làm, + +7 +00:00:15,150 --> 00:00:18,990 +sau đó đến 5 giờ hoặc 6 giờ chiều, bạn có thể xong việc + +8 +00:00:18,990 --> 00:00:21,240 +và trên đường trở về nhà. + +9 +00:00:21,240 --> 00:00:24,000 +Do API OpenWeatherMap miễn phí cung cấp cho + +10 +00:00:24,000 --> 00:00:27,990 +chúng tôi dự báo thời tiết trong khoảng thời gian ba giờ, chúng + +11 +00:00:27,990 --> 00:00:30,120 +tôi có thể chạy tập lệnh lúc 6:00 sáng + +12 +00:00:30,120 --> 00:00:33,240 +và kiểm tra thời tiết trong 12 giờ tiếp theo. + +13 +00:00:33,240 --> 00:00:34,560 +Nếu dự báo có mưa trong + +14 +00:00:34,560 --> 00:00:36,690 +thời gian bạn vắng nhà, bạn muốn + +15 +00:00:36,690 --> 00:00:39,630 +tập lệnh Python gửi cho bạn một tin nhắn văn + +16 +00:00:39,630 --> 00:00:42,060 +bản, nhắc bạn mang theo ô. + +17 +00:00:42,060 --> 00:00:45,270 +Bằng cách đó, bạn sẽ nhận được thông báo trước khi rời khỏi nhà + +18 +00:00:45,270 --> 00:00:47,133 +và biết cách chuẩn bị cho ngày mới. + +19 +00:00:48,450 --> 00:00:50,700 +Trong bài học trước, chúng ta đã thấy + +20 +00:00:50,700 --> 00:00:53,010 +rằng dữ liệu mà chúng ta lấy về từ OpenWeatherMap + +21 +00:00:53,010 --> 00:00:55,830 +chứa dự báo thời tiết ba giờ một lần trong năm ngày + +22 +00:00:55,830 --> 00:00:57,720 +tiếp theo. + +23 +00:00:57,720 --> 00:01:00,960 +Có dự báo cho 40 dấu thời gian khác + +24 +00:01:00,960 --> 00:01:04,950 +nhau, bắt đầu từ 0 và tăng dần lên 39. + +25 +00:01:04,950 --> 00:01:07,650 +Bây giờ, tôi không biết bạn thế nào, nhưng quyết + +26 +00:01:07,650 --> 00:01:09,420 +định có mang theo ô hay không của + +27 +00:01:09,420 --> 00:01:11,640 +tôi thực sự chỉ phụ thuộc vào dự báo thời + +28 +00:01:11,640 --> 00:01:13,530 +tiết trong 12 giờ tới. + +29 +00:01:13,530 --> 00:01:16,410 +Trong JSON mà chúng tôi lấy lại từ OpenWeatherMap, + +30 +00:01:16,410 --> 00:01:20,250 +đó chỉ là bốn dự báo đầu tiên trong danh sách. + +31 +00:01:20,250 --> 00:01:22,410 +Nếu tập lệnh chạy lúc 6:00 sáng thì + +32 +00:01:22,410 --> 00:01:26,520 +khung thời gian 12 giờ sẽ đưa chúng ta đến 6:00 chiều. Lúc đó, hy + +33 +00:01:26,520 --> 00:01:29,430 +vọng chúng ta đã sẵn sàng về nhà và không cần phải + +34 +00:01:29,430 --> 00:01:30,480 +lo lắng nếu trời + +35 +00:01:30,480 --> 00:01:32,793 +bắt đầu mưa muộn hơn hơn thế. + +36 +00:01:33,690 --> 00:01:36,180 +Nếu chúng tôi xem xét JSON mà chúng tôi đã nhận + +37 +00:01:36,180 --> 00:01:38,550 +được, chúng tôi thực sự không quan tâm đến những + +38 +00:01:38,550 --> 00:01:42,300 +dự báo cho ngày mai hoặc những dự báo xa hơn trong tương lai. + +39 +00:01:42,300 --> 00:01:43,650 +Chúng tôi chỉ quan tâm + +40 +00:01:43,650 --> 00:01:46,290 +đến thời tiết trong bốn dự báo tiếp theo. + +41 +00:01:46,290 --> 00:01:49,260 +Xem xét kỹ hơn tài liệu API, chúng tôi thực sự có + +42 +00:01:49,260 --> 00:01:51,330 +thể phát hiện ra các tham số sẽ giúp + +43 +00:01:51,330 --> 00:01:55,140 +chúng tôi điều chỉnh phản hồi OpenWeatherMaps để chúng tôi + +44 +00:01:55,140 --> 00:01:56,850 +lấy lại dữ liệu mà chúng tôi + +45 +00:01:56,850 --> 00:01:58,590 +thực sự quan tâm. + +46 +00:01:58,590 --> 00:02:03,590 +Tất nhiên, tôi đang nói về tham số cnt hoặc count. + +47 +00:02:03,660 --> 00:02:06,330 +Bằng cách đặt số lượng thành bốn, chúng tôi + +48 +00:02:06,330 --> 00:02:09,090 +sẽ chỉ yêu cầu bốn dấu thời gian trong khoảng + +49 +00:02:09,090 --> 00:02:12,540 +thời gian 12 giờ quan trọng đối với chúng tôi. + +50 +00:02:12,540 --> 00:02:14,820 +Bằng cách đó, chúng ta làm cho cuộc sống của mình trở + +51 +00:02:14,820 --> 00:02:18,240 +nên dễ dàng hơn và tránh yêu cầu nhiều dữ liệu hơn mức chúng ta thực sự cần. + +52 +00:02:18,240 --> 00:02:20,550 +Đó là lý do tại sao bạn + +53 +00:02:20,550 --> 00:02:24,000 +nên đọc qua tài liệu API trước. + +54 +00:02:24,000 --> 00:02:25,950 +Thường có một số nội dung hữu ích trong đó sẽ + +55 +00:02:25,950 --> 00:02:29,700 +giúp cuộc sống của bạn với tư cách là một nhà phát triển trở nên dễ dàng hơn nhiều. + +56 +00:02:29,700 --> 00:02:31,530 +Như tôi luôn nói, điều này giống + +57 +00:02:31,530 --> 00:02:33,120 +như đi vào nhà người khác. + +58 +00:02:33,120 --> 00:02:34,260 +Mọi thứ đều khác nhau. + +59 +00:02:34,260 --> 00:02:36,780 +Cách thức hoạt động của máy giặt cũng khác. + +60 +00:02:36,780 --> 00:02:39,060 +Cách máy sấy của họ hoạt động khác nhau. + +61 +00:02:39,060 --> 00:02:40,440 +Vì vậy, bạn thực sự + +62 +00:02:40,440 --> 00:02:43,590 +phải xem tài liệu API khi làm việc với một + +63 +00:02:43,590 --> 00:02:46,380 +API mới, để không bị nhầm lẫn và hiểu + +64 +00:02:46,380 --> 00:02:49,170 +chính xác những gì bạn phải làm để trở + +65 +00:02:49,170 --> 00:02:52,053 +thành người dùng API tốt. + +66 +00:02:53,370 --> 00:02:55,890 +Bây giờ, hãy quay lại mã Python của chúng + +67 +00:02:55,890 --> 00:02:58,350 +tôi và cung cấp tham số bổ sung đó. + +68 +00:02:58,350 --> 00:03:00,240 +Tham số này được gọi là count và + +69 +00:03:00,240 --> 00:03:04,110 +tôi sẽ chỉ thêm nó vào từ điển Weather_params của chúng tôi. + +70 +00:03:04,110 --> 00:03:05,730 +Hãy đặt số đếm thành bốn để + +71 +00:03:05,730 --> 00:03:09,630 +chúng tôi chỉ yêu cầu dấu thời gian trong tương lai gần. + +72 +00:03:09,630 --> 00:03:14,490 +Hãy chạy lại và xem phản hồi JSON mà chúng tôi + +73 +00:03:14,490 --> 00:03:15,810 +nhận được. + +74 +00:03:15,810 --> 00:03:17,190 +Tôi sẽ sao chép lại nó, + +75 +00:03:17,190 --> 00:03:19,590 +quay lại trình xem JSON trực tuyến, + +76 +00:03:19,590 --> 00:03:22,530 +xóa lượng dữ liệu khổng lồ đó từ trước đó và dán + +77 +00:03:22,530 --> 00:03:24,750 +vào những gì tôi vừa lấy lại. + +78 +00:03:24,750 --> 00:03:26,880 +Bạn có thể thấy nó ngắn hơn nhiều và nếu tôi + +79 +00:03:26,880 --> 00:03:29,580 +nhấp vào Trình xem, chúng ta có thể thấy rằng danh + +80 +00:03:29,580 --> 00:03:31,920 +sách dự báo thời tiết của chúng tôi hiện chỉ + +81 +00:03:31,920 --> 00:03:33,993 +chứa bốn dấu thời gian tiếp theo. + +82 +00:03:35,070 --> 00:03:36,480 +Vì vậy, đó là mục tiêu. + +83 +00:03:36,480 --> 00:03:39,360 +Và nếu quay lại mã của mình, chúng tôi + +84 +00:03:39,360 --> 00:03:42,180 +biết rằng hiện tại mã phản hồi mà chúng + +85 +00:03:42,180 --> 00:03:45,900 +tôi nhận được khi gọi API này là 200. + +86 +00:03:45,900 --> 00:03:47,520 +Thế là thành công. + +87 +00:03:47,520 --> 00:03:48,750 +Nhưng chúng tôi muốn đảm + +88 +00:03:48,750 --> 00:03:51,900 +bảo rằng chúng tôi thực sự nắm bắt được các mã phản hồi khác. + +89 +00:03:51,900 --> 00:03:54,750 +Vì vậy, chúng ta sẽ gọi raise_for_status, + +90 +00:03:54,750 --> 00:03:57,150 +để nếu có vấn đề và chúng ta không nhận + +91 +00:03:57,150 --> 00:03:59,220 +được mã 200 thì chúng ta thực sự + +92 +00:03:59,220 --> 00:04:01,293 +sẽ đưa ra một ngoại lệ. + +93 +00:04:02,400 --> 00:04:06,450 +Bây giờ, tiếp theo, chúng ta muốn lưu câu trả lời của mình. json làm Weather_data và sau + +94 +00:04:06,450 --> 00:04:07,840 +đó chúng tôi sẽ làm việc + +95 +00:04:09,480 --> 00:04:11,040 +với dữ liệu này để có được + +96 +00:04:11,040 --> 00:04:13,380 +những phần cụ thể mà chúng tôi quan + +97 +00:04:13,380 --> 00:04:14,630 +tâm. + +98 +00:04:15,600 --> 00:04:17,519 +Thế là xong bước một. + +99 +00:04:17,519 --> 00:04:21,899 +Bước tiếp theo là tìm hiểu dự báo hàng giờ này và nắm + +100 +00:04:21,899 --> 00:04:24,750 +được điều mà chúng ta quan tâm, + +101 +00:04:24,750 --> 00:04:28,170 +đó là điều kiện thời tiết thực tế. + +102 +00:04:28,170 --> 00:04:30,390 +Cách mà các dịch vụ thời tiết có + +103 +00:04:30,390 --> 00:04:34,290 +xu hướng cung cấp điều kiện thời tiết là thông qua id. + +104 +00:04:34,290 --> 00:04:38,730 +Và tôi biết điều này vì tôi đã đọc tài liệu API. + +105 +00:04:38,730 --> 00:04:42,630 +Không phải vì tôi là người đam mê thời tiết. (cười) Mặc dù vậy, ý tôi là + +106 +00:04:42,630 --> 00:04:45,930 +đó không phải là điều xấu, tôi đoán vậy. + +107 +00:04:45,930 --> 00:04:50,930 +Nếu chúng ta cuộn xuống trong tài liệu này qua các ví dụ, bạn có thể thấy + +108 +00:04:51,000 --> 00:04:53,010 +nó cung cấp tất cả các trường + +109 +00:04:53,010 --> 00:04:54,600 +trong phản hồi API. + +110 +00:04:54,600 --> 00:04:56,280 +Vì vậy, đây là tất cả những + +111 +00:04:56,280 --> 00:04:59,760 +thứ mà chúng ta có thể lấy lại và ý nghĩa của chúng. + +112 +00:04:59,760 --> 00:05:01,920 +Và bạn có thể thấy có một số điều + +113 +00:05:01,920 --> 00:05:05,250 +thực sự thú vị, như nhiệt độ sẽ như thế nào dựa + +114 +00:05:05,250 --> 00:05:08,850 +trên gió lạnh và nhiệt độ thực tế trên mặt đất. + +115 +00:05:08,850 --> 00:05:13,020 +Nhưng điều chúng tôi quan tâm nhất là dữ liệu thời tiết. + +116 +00:05:13,020 --> 00:05:18,020 +Vì vậy, id thời tiết này là id điều kiện thời tiết và khi bạn nhấp vào + +117 +00:05:18,480 --> 00:05:21,660 +liên kết đó, nó sẽ đưa bạn đến bảng này hiển + +118 +00:05:21,660 --> 00:05:24,750 +thị cho bạn tất cả các mã điều kiện thời tiết + +119 +00:05:24,750 --> 00:05:29,103 +mà chúng tôi có thể lấy lại trong trường cụ thể này. + +120 +00:05:30,030 --> 00:05:31,860 +Bây giờ, bạn có thể thấy rằng + +121 +00:05:31,860 --> 00:05:36,860 +tất cả các mã bắt đầu bằng 2 đều có nghĩa là một loại giông bão nào đó. + +122 +00:05:37,230 --> 00:05:38,730 +Và bắt đầu từ số 3, nghĩa + +123 +00:05:38,730 --> 00:05:40,380 +là có mưa phùn. + +124 +00:05:40,380 --> 00:05:42,450 +Bắt đầu bằng số 5 có nghĩa là mưa. + +125 +00:05:42,450 --> 00:05:44,550 +Bắt đầu bằng số 6 có nghĩa là tuyết. + +126 +00:05:44,550 --> 00:05:47,460 +Và sau đó chúng ta có bảy trăm. + +127 +00:05:47,460 --> 00:05:50,340 +Vì vậy, đây là những thứ trong khí quyển như một chút sương + +128 +00:05:50,340 --> 00:05:53,040 +mù, một chút khói, một chút bụi hoặc sương mù. + +129 +00:05:53,040 --> 00:05:55,920 +Và đây cũng chính là lý do tại + +130 +00:05:55,920 --> 00:06:00,000 +sao khóa thời tiết này thực sự có một giá trị + +131 +00:06:00,000 --> 00:06:02,070 +ở dạng danh sách. + +132 +00:06:02,070 --> 00:06:05,250 +Bạn có thể thấy điều đó được biểu thị bằng dấu ngoặc vuông ở đây. + +133 +00:06:05,250 --> 00:06:08,730 +Vì vậy, thực sự có thể có nhiều điều kiện thời + +134 +00:06:08,730 --> 00:06:12,180 +tiết cho một địa điểm cụ thể vào một giờ cụ + +135 +00:06:12,180 --> 00:06:16,020 +thể và đó là vì bạn có thể có tuyết nhưng cũng có + +136 +00:06:16,020 --> 00:06:18,753 +thể có sương mù cùng một lúc. + +137 +00:06:19,740 --> 00:06:22,260 +Bây giờ, khi tôi xem qua rất nhiều + +138 +00:06:22,260 --> 00:06:26,010 +ví dụ và tài liệu, có vẻ như mục đầu tiên trong danh + +139 +00:06:26,010 --> 00:06:28,710 +sách đó là điều kiện chính. + +140 +00:06:28,710 --> 00:06:30,030 +Vì vậy, nếu trời sắp + +141 +00:06:30,030 --> 00:06:32,160 +mưa thì trời sẽ nằm ở mục đầu tiên + +142 +00:06:32,160 --> 00:06:35,070 +trong danh sách các điều kiện thời tiết. + +143 +00:06:35,070 --> 00:06:39,630 +Trong danh sách đó, chúng ta có một hoặc nhiều từ điển. + +144 +00:06:39,630 --> 00:06:42,870 +Mỗi cái đều chứa id điều kiện thời + +145 +00:06:42,870 --> 00:06:46,260 +tiết, tên điều kiện chính và mô tả. + +146 +00:06:46,260 --> 00:06:49,410 +Vậy nếu nhìn vào mã id 802 này chúng ta có thể giải + +147 +00:06:49,410 --> 00:06:51,780 +mã nó trong bảng này và các bạn có thể + +148 +00:06:51,780 --> 00:06:54,540 +thấy nó có nghĩa là mây rải rác. + +149 +00:06:54,540 --> 00:06:57,903 +Về cơ bản, 20 đến 50% bầu trời bị bao phủ bởi mây. + +150 +00:06:59,370 --> 00:07:01,500 +Dựa trên danh sách này, chúng + +151 +00:07:01,500 --> 00:07:05,550 +ta có thể nói rằng, bất cứ thứ gì có mã nhỏ hơn 700 thì + +152 +00:07:05,550 --> 00:07:08,730 +có lẽ chúng ta sẽ cần một chiếc ô. + +153 +00:07:08,730 --> 00:07:11,400 +Tôi không chắc làm thế nào bạn có thể đứng + +154 +00:07:11,400 --> 00:07:15,180 +trên ô trong tình huống tuyết rơi, nhưng cá nhân tôi thích + +155 +00:07:15,180 --> 00:07:17,130 +cầm ô khi trời có tuyết, đặc biệt + +156 +00:07:17,130 --> 00:07:18,780 +vì tôi sống ở một đất nước mà + +157 +00:07:18,780 --> 00:07:22,130 +tuyết không đến mức điên cuồng, nó chỉ là... + +158 +00:07:23,220 --> 00:07:26,670 +Nó không bao giờ giống như một loại tuyết đẹp đẽ khi + +159 +00:07:26,670 --> 00:07:29,310 +nó dày và dính vào lông mi của bạn. + +160 +00:07:29,310 --> 00:07:33,810 +Đó là một loại bùn khó chịu giống như tuyết, nhưng + +161 +00:07:33,810 --> 00:07:37,380 +nó giống như ai đó nhổ nước bọt vào bạn. + +162 +00:07:37,380 --> 00:07:38,940 +Trong trường hợp của tôi, + +163 +00:07:38,940 --> 00:07:41,820 +tôi muốn có một chiếc ô nếu trời sắp có tuyết. + +164 +00:07:41,820 --> 00:07:44,040 +Tôi sẽ kiểm tra các mã mà chúng + +165 +00:07:44,040 --> 00:07:47,010 +tôi nhận được từ API OpenWeatherMap + +166 +00:07:47,010 --> 00:07:49,890 +và nếu mã nhỏ hơn 700 thì tôi sẽ khuyên + +167 +00:07:49,890 --> 00:07:53,553 +người dùng của mình mang theo ô. + +168 +00:07:55,290 --> 00:07:57,690 +Đây là một thách thức dành cho bạn. + +169 +00:07:57,690 --> 00:08:00,150 +Bạn có thể tìm ra cách xem qua dữ + +170 +00:08:00,150 --> 00:08:01,800 +liệu mà chúng tôi nhận + +171 +00:08:01,800 --> 00:08:05,073 +được, dữ liệu này trông giống như thế này, + +172 +00:08:05,910 --> 00:08:08,910 +sau đó xem thời tiết và mục đầu tiên trong + +173 +00:08:08,910 --> 00:08:13,410 +danh sách thời tiết cũng như id không? + +174 +00:08:13,410 --> 00:08:16,800 +Vì vậy, bạn sẽ đi đến phần này, nhưng hãy nhớ + +175 +00:08:16,800 --> 00:08:19,830 +rằng bạn sẽ làm điều đó cho tất cả các mục + +176 +00:08:19,830 --> 00:08:22,410 +và bạn sẽ kiểm tra mã điều kiện. + +177 +00:08:22,410 --> 00:08:26,700 +Bây giờ nếu bất kỳ mã id nào nhỏ hơn 700, thì bạn + +178 +00:08:26,700 --> 00:08:30,330 +muốn có thể in ra, hãy mang theo ô. + +179 +00:08:30,330 --> 00:08:32,340 +Vì vậy, đó là mục tiêu và cách triển + +180 +00:08:32,340 --> 00:08:35,460 +khai thực tế, tôi sẽ tùy thuộc vào bạn vì có khá nhiều + +181 +00:08:35,460 --> 00:08:37,799 +cách để bạn có thể thực hiện việc này, nhưng + +182 +00:08:37,799 --> 00:08:40,710 +tôi chắc chắn rằng đến bây giờ, bạn đã chuẩn bị tốt + +183 +00:08:40,710 --> 00:08:44,400 +tất cả các công cụ trong Python để tìm hiểu cái này ra. + +184 +00:08:44,400 --> 00:08:48,180 +Nếu bạn muốn đảm bảo rằng mã của mình thực sự hoạt động, + +185 +00:08:48,180 --> 00:08:50,730 +bạn có thể chuyển sang vĩ độ và kinh + +186 +00:08:50,730 --> 00:08:52,860 +độ chắc chắn đang mưa. + +187 +00:08:52,860 --> 00:08:56,130 +Vì vậy, nếu bạn đi đến ventusky. com, họ thực sự cho + +188 +00:08:56,130 --> 00:08:59,340 +bạn thấy dự báo thời tiết trực tiếp. + +189 +00:08:59,340 --> 00:09:03,270 +Vì vậy, chúng ta có thể nhìn vào lượng mưa, về cơ bản là + +190 +00:09:03,270 --> 00:09:06,000 +mưa, và chúng ta có thể tìm thấy một nơi + +191 +00:09:06,000 --> 00:09:09,060 +không may mắn, có vẻ như đang mưa rất to. + +192 +00:09:09,060 --> 00:09:11,313 +Ví dụ: địa điểm này ở Ba Lan, + +193 +00:09:12,270 --> 00:09:16,145 +Lodz, và nếu tôi đánh vần đúng tên đó. + +194 +00:09:16,145 --> 00:09:19,200 +(gõ bàn phím) Lodz và sau đó tôi sẽ + +195 +00:09:19,200 --> 00:09:22,560 +thêm mã quốc gia Ba Lan và để đảm bảo + +196 +00:09:22,560 --> 00:09:24,750 +trên bản đồ, nó thực sự đã + +197 +00:09:24,750 --> 00:09:27,510 +tìm thấy đúng địa điểm. + +198 +00:09:27,510 --> 00:09:29,280 +Tuy nhiên, trông có vẻ khá giống, + +199 +00:09:29,280 --> 00:09:32,310 +sau đó tôi có thể chuyển đổi vĩ độ và kinh độ của + +200 +00:09:32,310 --> 00:09:34,260 +mình với nơi mưa này và bằng cách + +201 +00:09:34,260 --> 00:09:37,470 +đó, tôi biết rằng ít nhất một trong những kết quả tôi + +202 +00:09:37,470 --> 00:09:39,480 +nhận được chắc chắn sẽ chứa một + +203 +00:09:39,480 --> 00:09:41,463 +loại mưa nào đó. + +204 +00:09:44,400 --> 00:09:46,620 +Bây giờ nếu chúng ta nhìn vào dữ liệu + +205 +00:09:46,620 --> 00:09:48,450 +hàng giờ của họ, bạn có thể thấy + +206 +00:09:48,450 --> 00:09:51,780 +thời tiết về cơ bản chỉ là mưa, mưa, mưa. + +207 +00:09:51,780 --> 00:09:55,020 +Vì vậy, giữa việc xem xét những nơi có + +208 +00:09:55,020 --> 00:09:58,020 +nắng và những nơi có mưa, bạn sẽ có thể + +209 +00:09:58,020 --> 00:09:59,370 +làm cho mã của mình + +210 +00:09:59,370 --> 00:10:02,610 +hoạt động để nó cho bạn biết trong 12 giờ + +211 +00:10:02,610 --> 00:10:07,350 +tới nếu bất kỳ mã điều kiện nào nhỏ hơn 700, điều đó có nghĩa + +212 +00:10:07,350 --> 00:10:10,263 +là có một số dạng mưa. + +213 +00:10:11,310 --> 00:10:13,173 +Hãy tạm dừng video và thử làm điều này. + +214 +00:10:18,300 --> 00:10:22,290 +Được rồi, vậy hãy thu hẹp phạm vi thời tiết này. + +215 +00:10:22,290 --> 00:10:24,090 +Nếu chúng ta muốn biết thời tiết, + +216 +00:10:24,090 --> 00:10:28,320 +thì chúng ta phải nhấn vào mục đầu tiên trong danh sách của mình, sau + +217 +00:10:28,320 --> 00:10:30,030 +đó chúng ta nắm giữ thời tiết + +218 +00:10:30,030 --> 00:10:32,010 +và sau đó chúng ta chạm vào mục đầu + +219 +00:10:32,010 --> 00:10:37,010 +tiên trong danh sách đó dưới phím id, chúng ta sẽ nhận được giá trị thực. + +220 +00:10:37,050 --> 00:10:40,050 +Chúng ta đã nói chi tiết về điều này trong các bài học trước. + +221 +00:10:40,050 --> 00:10:42,030 +Nếu bạn đã bỏ qua nhiều bài + +222 +00:10:42,030 --> 00:10:43,860 +học và trực tiếp đến đây + +223 +00:10:43,860 --> 00:10:46,050 +thì sẽ hơi khó hiểu và tôi khuyên + +224 +00:10:46,050 --> 00:10:48,630 +bạn nên xem lại các bài học trước + +225 +00:10:48,630 --> 00:10:50,580 +khi tiếp tục. + +226 +00:10:50,580 --> 00:10:53,820 +Thay vì in dữ liệu thời tiết, hãy đi sâu vào chi tiết. + +227 +00:10:53,820 --> 00:10:56,250 +Chúng ta hãy đến mục đầu tiên ở đây. + +228 +00:10:56,250 --> 00:10:58,650 +Nếu chúng tôi cung cấp một bộ dấu ngoặc + +229 +00:10:58,650 --> 00:11:00,630 +vuông và sau đó chúng tôi có thể + +230 +00:11:00,630 --> 00:11:04,500 +truy cập giá trị bên trong khóa danh sách, như thế này. + +231 +00:11:04,500 --> 00:11:08,910 +Và bây giờ, chúng ta có một danh sách chứa tất cả dữ liệu hàng + +232 +00:11:08,910 --> 00:11:11,613 +giờ và nó trông khá giống thế này. + +233 +00:11:12,780 --> 00:11:14,250 +Bây giờ, bạn có thể xác + +234 +00:11:14,250 --> 00:11:17,790 +nhận điều này bằng cách dán nội dung này vào trình xem + +235 +00:11:17,790 --> 00:11:20,460 +JSON, thay thế văn bản trước đó ở đó. + +236 +00:11:20,460 --> 00:11:24,330 +Bạn có thể thấy chúng tôi hiện có các mặt hàng trong danh sách này. + +237 +00:11:24,330 --> 00:11:25,650 +Để đi sâu hơn, hãy + +238 +00:11:25,650 --> 00:11:28,260 +lấy mục đầu tiên trong danh sách + +239 +00:11:28,260 --> 00:11:30,960 +đó bằng cách cung cấp dấu ngoặc vuông + +240 +00:11:30,960 --> 00:11:33,990 +và sau đó là chỉ mục bằng 0. + +241 +00:11:33,990 --> 00:11:36,660 +Bây giờ, chúng ta đang đi vào mục đầu tiên + +242 +00:11:36,660 --> 00:11:39,120 +và dữ liệu trông như thế này. + +243 +00:11:39,120 --> 00:11:40,980 +Nó ngắn hơn rất nhiều. + +244 +00:11:40,980 --> 00:11:44,820 +Bây giờ, chúng ta muốn khai thác điều kiện thời tiết, điều + +245 +00:11:44,820 --> 00:11:47,340 +đó có nghĩa là một bộ dấu ngoặc vuông + +246 +00:11:47,340 --> 00:11:50,823 +khác và sau đó là tên của khóa, đó là thời tiết. + +247 +00:11:52,560 --> 00:11:53,730 +Bây giờ, nó khá đơn giản. + +248 +00:11:53,730 --> 00:11:58,470 +Nó chỉ đơn giản là cung cấp cho chúng tôi một danh sách chỉ có một mục. + +249 +00:11:58,470 --> 00:12:02,820 +Hãy nhấn vào mục đó bằng cách sử dụng lại dấu + +250 +00:12:02,820 --> 00:12:05,070 +ngoặc vuông, số 0. + +251 +00:12:05,070 --> 00:12:10,070 +Và bây giờ, về cơ bản chúng ta chỉ có một từ điển đơn giản. + +252 +00:12:10,470 --> 00:12:12,330 +Vì vậy, nếu chúng ta + +253 +00:12:12,330 --> 00:12:15,570 +muốn giữ id, thì đó là dấu ngoặc vuông + +254 +00:12:15,570 --> 00:12:18,450 +cuối cùng và khóa là id. + +255 +00:12:18,450 --> 00:12:21,690 +Bây giờ, nếu tôi tạo một danh sách + +256 +00:12:21,690 --> 00:12:24,600 +mới chứa mã điều kiện thì sao? + +257 +00:12:24,600 --> 00:12:26,610 +Chúng tôi biết rằng chúng tôi + +258 +00:12:26,610 --> 00:12:31,470 +có danh sách tất cả các điều kiện thời tiết trong 12 giờ tới. + +259 +00:12:31,470 --> 00:12:36,470 +Làm cách nào chúng ta có thể lặp qua danh sách đó để tìm ra id thực tế của + +260 +00:12:36,780 --> 00:12:39,873 +điều kiện thời tiết trong từng giờ đó? + +261 +00:12:40,770 --> 00:12:42,570 +Chà, chúng ta có thể tạo + +262 +00:12:42,570 --> 00:12:46,590 +một vòng lặp for để xem xét từng dữ liệu theo giờ. + +263 +00:12:46,590 --> 00:12:50,640 +Vì vậy, đối với dữ liệu giờ trong danh sách dữ liệu thời tiết, quá + +264 +00:12:50,640 --> 00:12:53,070 +trình này sẽ diễn ra trong 12 giờ. + +265 +00:12:53,070 --> 00:12:56,220 +Và sau đó, đối với mỗi mục, chúng ta sẽ + +266 +00:12:56,220 --> 00:12:58,830 +khai thác dữ liệu giờ và cố gắng + +267 +00:12:58,830 --> 00:13:01,653 +lấy mục có trong khóa thời tiết. + +268 +00:13:03,510 --> 00:13:04,413 +Như thế này. + +269 +00:13:05,370 --> 00:13:09,180 +Bây giờ, tôi sẽ in từng cái này và bạn có thể + +270 +00:13:09,180 --> 00:13:12,360 +thấy, bây giờ chúng ta đã có danh sách + +271 +00:13:12,360 --> 00:13:17,360 +tất cả các điều kiện thời tiết cho mỗi giờ đó. + +272 +00:13:17,760 --> 00:13:20,790 +Bây giờ, hãy thu hẹp điều đó thêm một chút. + +273 +00:13:20,790 --> 00:13:24,300 +Chúng ta hãy nắm bắt mục đầu tiên của mỗi danh sách này. + +274 +00:13:24,300 --> 00:13:26,580 +Và bạn có thể thấy, trên thực tế, chỉ có một mục trong + +275 +00:13:26,580 --> 00:13:27,930 +tất cả các danh sách này. + +276 +00:13:27,930 --> 00:13:31,200 +Rất hiếm khi bạn có nhiều điều kiện thời tiết + +277 +00:13:31,200 --> 00:13:32,463 +trong mỗi giờ. + +278 +00:13:33,420 --> 00:13:36,420 +Bây giờ, điều đó cung cấp cho chúng tôi một từ + +279 +00:13:36,420 --> 00:13:38,100 +điển Python cho mỗi giờ đó + +280 +00:13:38,100 --> 00:13:41,310 +và chúng tôi có thể khai thác giá trị cuối cùng mà + +281 +00:13:41,310 --> 00:13:43,800 +chúng tôi quan tâm dưới id khóa. + +282 +00:13:43,800 --> 00:13:47,760 +Vì vậy, bây giờ, chúng tôi đã lặp lại 12 giờ tiếp + +283 +00:13:47,760 --> 00:13:51,810 +theo và có được id điều kiện thời tiết cho từng + +284 +00:13:51,810 --> 00:13:53,223 +giờ đó. + +285 +00:13:54,120 --> 00:13:57,870 +Bây giờ, tất cả những gì chúng ta cần làm là lưu + +286 +00:13:57,870 --> 00:14:02,870 +cái này thay vì in nó và chúng ta sẽ gọi nó là condition_code. + +287 +00:14:02,871 --> 00:14:06,270 +(gõ bàn phím) Và nhớ trước đây + +288 +00:14:06,270 --> 00:14:07,710 +chúng ta đã nói + +289 +00:14:07,710 --> 00:14:11,340 +nếu mã điều kiện nhỏ hơn 700 thì + +290 +00:14:11,340 --> 00:14:15,000 +đi in, mang theo ô. + +291 +00:14:15,000 --> 00:14:17,940 +Vì vậy, chúng ta có thể kiểm tra xem condition_code, + +292 +00:14:17,940 --> 00:14:21,540 +mã được nhớ tại thời điểm này có còn là một chuỗi hay không. + +293 +00:14:21,540 --> 00:14:25,350 +Vì vậy chúng ta phải biến nó thành một số nguyên + +294 +00:14:25,350 --> 00:14:29,010 +để có thể so sánh nó với một số khác. + +295 +00:14:29,010 --> 00:14:33,570 +Nếu condition_code đó là số nguyên nhỏ hơn 700 + +296 +00:14:33,570 --> 00:14:37,173 +thì chúng ta sẽ in, mang theo ô. + +297 +00:14:39,510 --> 00:14:42,420 +Và bạn có thể thấy rằng trong 12 giờ + +298 +00:14:42,420 --> 00:14:46,470 +tiếp theo, có mưa tại một địa điểm cụ thể ở Lodz ở + +299 +00:14:46,470 --> 00:14:49,860 +Ba Lan mà tôi đã đưa vào vĩ độ và kinh độ. + +300 +00:14:49,860 --> 00:14:51,270 +Bây giờ, nếu tôi không + +301 +00:14:51,270 --> 00:14:54,720 +muốn gọi câu lệnh in này nhiều lần thì chúng ta có thể định + +302 +00:14:54,720 --> 00:14:57,718 +nghĩa một biến bên ngoài vòng lặp for có tên là + +303 +00:14:57,718 --> 00:14:59,135 +will_rain và ngay từ đầu + +304 +00:15:00,000 --> 00:15:03,180 +chúng ta có thể đặt biến đó thành false. + +305 +00:15:03,180 --> 00:15:06,570 +Bây giờ, nếu trong 12 giờ tới, mã_điều kiện nhỏ + +306 +00:15:06,570 --> 00:15:08,310 +hơn 700 thì thay vào đó, + +307 +00:15:08,310 --> 00:15:12,540 +chúng tôi sẽ chuyển giá trị đó thành giá trị đúng. + +308 +00:15:12,540 --> 00:15:16,140 +Bây giờ, sau khi vòng lặp for hoàn thành, chúng ta có + +309 +00:15:16,140 --> 00:15:17,850 +thể kiểm tra xem liệu nó có + +310 +00:15:17,850 --> 00:15:20,130 +mưa trong 12 giờ tới hay không. + +311 +00:15:20,130 --> 00:15:22,503 +Và nếu vậy thì sẽ in, mang theo ô. + +312 +00:15:23,760 --> 00:15:26,790 +Bằng cách này, chúng ta sẽ chỉ nhận được một câu + +313 +00:15:26,790 --> 00:15:28,560 +lệnh in được gọi, thay vì mỗi + +314 +00:15:28,560 --> 00:15:32,280 +lần chúng ta gặp phải một condition_code khi trời mưa. + +315 +00:15:32,280 --> 00:15:36,330 +Vì vậy, điều này liên quan đến việc truyền JSON khá + +316 +00:15:36,330 --> 00:15:41,330 +nhiều và cũng phải hiểu cách làm việc với các tham số và API. + +317 +00:15:41,970 --> 00:15:44,490 +Bây giờ, tôi hy vọng bạn đã tự mình đạt được điều + +318 +00:15:44,490 --> 00:15:47,370 +này, nhưng nếu không, hãy nhớ xem lại những gì tôi đã + +319 +00:15:47,370 --> 00:15:49,710 +viết và sửa mã của bạn theo yêu cầu. + +320 +00:15:49,710 --> 00:15:51,330 +Nếu có bất kỳ điều gì khó hiểu, + +321 +00:15:51,330 --> 00:15:54,570 +hãy nhớ xem lại các bài học trước đó trước khi bạn tiếp tục + +322 +00:15:54,570 --> 00:15:56,340 +vì chúng tôi hiện đang xây dựng + +323 +00:15:56,340 --> 00:15:57,870 +chủ yếu dựa trên kiến thức trước + +324 +00:15:57,870 --> 00:16:00,390 +đây mà bạn đã học được qua khóa học. + +325 +00:16:00,390 --> 00:16:01,800 +Bây giờ, trong bài + +326 +00:16:01,800 --> 00:16:03,930 +học tiếp theo, chúng ta sẽ + +327 +00:16:03,930 --> 00:16:06,600 +xem cách chúng ta có thể, thay vì + +328 +00:16:06,600 --> 00:16:09,870 +in, hãy mang theo ô để gửi tin nhắn văn bản + +329 +00:16:09,870 --> 00:16:12,993 +SMS thông báo bạn mang theo ô. + +330 +00:16:13,860 --> 00:16:15,960 +Vì vậy, với tất cả những điều đó và hơn thế nữa, tôi + +331 +00:16:15,960 --> 00:16:17,560 +sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Find-a-Place-thats-raining-using-Ventusky.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Find-a-Place-thats-raining-using-Ventusky.url new file mode 100644 index 0000000000000000000000000000000000000000..8f18e546e9904de17318bb13629665d054fb3ed5 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Find-a-Place-thats-raining-using-Ventusky.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.ventusky.com/ \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 OpenWeatherMap-Condition-IDs-and-Condition-Codes.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 OpenWeatherMap-Condition-IDs-and-Condition-Codes.url new file mode 100644 index 0000000000000000000000000000000000000000..4c2c062f956b34b3efb3a9f2d58155dc1eb9a790 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 OpenWeatherMap-Condition-IDs-and-Condition-Codes.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Python-Slice-Operator-with-Square-Brackets.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Python-Slice-Operator-with-Square-Brackets.url new file mode 100644 index 0000000000000000000000000000000000000000..44aafbac141319977a521fc091453f61da9ace61 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/004 Python-Slice-Operator-with-Square-Brackets.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://stackoverflow.com/questions/509211/understanding-slice-notation \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Sending SMS via the Twilio API.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Sending SMS via the Twilio API.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2b9143fd715b439e8e851f006f2159edb6b65282 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Sending SMS via the Twilio API.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:180871accfbe9d48bd72b8f3c4045ea5e53d28d8891635aea606e2a3ed27d0c7 +size 149306012 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Sending SMS via the Twilio API_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Sending SMS via the Twilio API_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9f0d12e7c866e2634622e35a1e06cda38344b39a --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Sending SMS via the Twilio API_vi.srt @@ -0,0 +1,752 @@ +1 +00:00:00,270 --> 00:00:01,710 +Người hướng dẫn: Bây giờ chúng + +2 +00:00:01,710 --> 00:00:02,543 +ta đã giải quyết được + +3 +00:00:02,543 --> 00:00:05,130 +phần khó khăn là xác định khi nào trời thực sự sẽ mưa, + +4 +00:00:05,130 --> 00:00:06,780 +bước tiếp theo là tìm hiểu (tin nhắn + +5 +00:00:06,780 --> 00:00:09,180 +văn bản) làm cách nào chúng tôi có thể gửi thông báo + +6 +00:00:09,180 --> 00:00:13,080 +này dưới dạng cảnh báo đến số điện thoại của mình bằng dịch vụ SMS. + +7 +00:00:13,080 --> 00:00:15,030 +Vì vậy, để làm được điều đó, + +8 +00:00:15,030 --> 00:00:18,547 +chúng ta sẽ cần sử dụng một API khác, API Twilio. + +9 +00:00:18,547 --> 00:00:21,480 +Twilio là một dịch vụ API cho phép chúng + +10 +00:00:21,480 --> 00:00:25,590 +tôi gửi tin nhắn văn bản, cuộc gọi điện thoại hoặc có số + +11 +00:00:25,590 --> 00:00:29,100 +điện thoại ảo ở bất kỳ quốc gia nào và nếu bạn nhìn + +12 +00:00:29,100 --> 00:00:31,440 +vào trang chủ của họ, bạn có thể + +13 +00:00:31,440 --> 00:00:33,660 +thấy thực sự có rất nhiều thứ bạn + +14 +00:00:33,660 --> 00:00:36,570 +có thể làm làm với API Twilio. + +15 +00:00:36,570 --> 00:00:38,850 +Về cơ bản, bạn có thể xây dựng một hệ thống + +16 +00:00:38,850 --> 00:00:41,280 +đặt hàng, bạn có thể tạo một ứng dụng video, + +17 +00:00:41,280 --> 00:00:43,080 +bạn có thể có SMS để gửi email, về + +18 +00:00:43,080 --> 00:00:45,030 +cơ bản là rất nhiều thứ. + +19 +00:00:45,030 --> 00:00:46,860 +Bây giờ, để tạo ra dịch vụ, rõ + +20 +00:00:46,860 --> 00:00:49,830 +ràng họ phải xây dựng rất nhiều cơ sở hạ tầng và + +21 +00:00:49,830 --> 00:00:52,290 +họ đã đầu tư rất nhiều vào việc làm cho + +22 +00:00:52,290 --> 00:00:54,390 +dịch vụ này hoạt động trơn tru và + +23 +00:00:54,390 --> 00:00:57,360 +hoạt động tốt, đó là lý do tại sao nếu bạn nhìn vào + +24 +00:00:57,360 --> 00:01:02,100 +phần định giá, họ sẽ tính phí cho dịch vụ nếu bạn sử dụng nó nhiều. + +25 +00:01:02,100 --> 00:01:03,210 +Bây giờ, trong trường + +26 +00:01:03,210 --> 00:01:06,870 +hợp của chúng ta, chúng ta sẽ bắt đầu sử dụng một số tín dụng dùng thử. + +27 +00:01:06,870 --> 00:01:09,300 +Vì vậy, họ sẽ cung cấp cho chúng tôi 10 đô la tín + +28 +00:01:09,300 --> 00:01:11,880 +dụng dùng thử và chúng tôi có thể thử nghiệm tất + +29 +00:01:11,880 --> 00:01:14,730 +cả API cũng như sử dụng bất kỳ tính năng nào của họ. + +30 +00:01:14,730 --> 00:01:17,967 +Trước tiên, hãy tiếp tục và nhấp vào "Bắt đầu miễn + +31 +00:01:19,410 --> 00:01:23,520 +phí" và bạn sẽ cần đăng ký để có tài khoản Twilio miễn phí, không + +32 +00:01:23,520 --> 00:01:24,933 +cần thẻ tín dụng. + +33 +00:01:26,130 --> 00:01:27,180 +Bây giờ, nếu bạn không muốn + +34 +00:01:27,180 --> 00:01:29,250 +học cách gửi tin nhắn văn bản cho chính mình thì + +35 +00:01:29,250 --> 00:01:30,660 +điều đó cũng hoàn toàn ổn. + +36 +00:01:30,660 --> 00:01:31,800 +Bạn không cần phải đăng + +37 +00:01:31,800 --> 00:01:36,270 +ký, bạn chỉ cần làm những gì chúng tôi đã làm trước đây bằng cách sử dụng email. + +38 +00:01:36,270 --> 00:01:37,920 +Sau khi đăng ký Twilio, + +39 +00:01:37,920 --> 00:01:39,660 +bạn sẽ phải xác nhận email + +40 +00:01:39,660 --> 00:01:42,843 +và số điện thoại thực của mình. + +41 +00:01:43,950 --> 00:01:46,110 +Sau khi bạn hoàn tất việc xác nhận + +42 +00:01:46,110 --> 00:01:48,360 +email và số điện thoại của mình, nó + +43 +00:01:48,360 --> 00:01:50,610 +sẽ đưa bạn tới bảng điều khiển và sẽ + +44 +00:01:50,610 --> 00:01:52,567 +hỏi bạn một số câu hỏi. + +45 +00:01:52,567 --> 00:01:53,520 +"Bạn có viết mã không? Vâng, tất nhiên + +46 +00:01:53,520 --> 00:01:54,787 +là chúng tôi biết. + +47 +00:01:54,787 --> 00:01:57,600 +"Ngôn ngữ ưa thích của bạn là gì," Python và "Mục tiêu + +48 +00:01:57,600 --> 00:01:59,100 +của bạn hôm nay là gì? Chà, chúng ta sẽ sử + +49 +00:01:59,100 --> 00:02:01,980 +dụng Twilio trong một dự án và điều đầu + +50 +00:02:01,980 --> 00:02:05,703 +tiên chúng ta muốn làm là gửi hoặc nhận SMS. + +51 +00:02:06,840 --> 00:02:11,670 +Vì vậy, bây giờ, nó sẽ đưa chúng ta đến Bảng điều khiển dự án Twilio + +52 +00:02:11,670 --> 00:02:15,990 +và bắt đầu bằng việc cấp cho chúng ta một số tiền dùng thử, + +53 +00:02:15,990 --> 00:02:19,410 +vì vậy đây là số tiền mà chúng ta có thể sử dụng + +54 +00:02:19,410 --> 00:02:22,590 +để thử nghiệm và sử dụng API Twilio. + +55 +00:02:22,590 --> 00:02:26,910 +Trước tiên, hãy bắt đầu bằng cách nhấp vào "Nhận số dùng thử" + +56 +00:02:26,910 --> 00:02:28,650 +và nó sẽ tạo cho bạn một số + +57 +00:02:28,650 --> 00:02:32,100 +tự động từ Hoa Kỳ. S. + +58 +00:02:32,100 --> 00:02:34,230 +Bây giờ, nếu muốn, bạn có thể mua + +59 +00:02:34,230 --> 00:02:36,120 +một số từ một quốc gia khác và + +60 +00:02:36,120 --> 00:02:39,420 +bạn có thể bắt đầu nhập bất kỳ số nào trong số này, + +61 +00:02:39,420 --> 00:02:40,380 +nhưng trong trường + +62 +00:02:40,380 --> 00:02:43,380 +hợp của chúng tôi, việc số đó đến từ đâu thực + +63 +00:02:43,380 --> 00:02:47,100 +sự không quan trọng, chúng tôi chỉ cần lấy số số mặc định + +64 +00:02:47,100 --> 00:02:49,587 +và nhấp vào "Chọn số này. Vì vậy, bây giờ, chúng tôi có số điện thoại + +65 +00:02:51,840 --> 00:02:55,380 +mới có trụ sở tại Hoa Kỳ. S. chúng tôi đã sẵn sàng + +66 +00:02:55,380 --> 00:02:59,610 +nhấp vào hoàn tất và bắt đầu sử dụng số Twilio đó để + +67 +00:02:59,610 --> 00:03:02,940 +gửi cho chính mình một số tin nhắn SMS. + +68 +00:03:02,940 --> 00:03:04,830 +Bây giờ, chúng ta sẽ chuyển tới Tài liệu + +69 +00:03:04,830 --> 00:03:06,873 +và chúng ta sẽ chuyển tới Bắt đầu nhanh. + +70 +00:03:08,280 --> 00:03:11,490 +Bây giờ, điều chúng tôi muốn làm là làm theo hướng + +71 +00:03:11,490 --> 00:03:14,040 +dẫn này, Khởi động nhanh SMS có thể lập + +72 +00:03:14,040 --> 00:03:17,370 +trình, để bắt đầu gửi tin nhắn SMS, vì vậy chúng tôi + +73 +00:03:17,370 --> 00:03:18,210 +sẽ nhấp vào phần + +74 +00:03:18,210 --> 00:03:21,150 +Python của Khởi động nhanh đó và bạn có thể thấy, + +75 +00:03:21,150 --> 00:03:22,680 +ở bên phải, nó cung cấp cho + +76 +00:03:22,680 --> 00:03:26,070 +chúng tôi mã ví dụ mà chúng tôi cần triển khai để thực + +77 +00:03:26,070 --> 00:03:28,860 +hiện công việc này. + +78 +00:03:28,860 --> 00:03:30,330 +Điều đầu tiên chúng + +79 +00:03:30,330 --> 00:03:32,970 +ta cần làm là tải xuống Thư viện Twilio + +80 +00:03:32,970 --> 00:03:36,930 +để sử dụng nó để nhập lớp khách hàng này. + +81 +00:03:36,930 --> 00:03:40,530 +Hãy tiếp tục và sao chép mã này vào dự án của chúng ta, + +82 +00:03:40,530 --> 00:03:44,130 +ngay bên dưới nơi chúng ta có "yêu cầu nhập", hãy tiếp + +83 +00:03:44,130 --> 00:03:48,480 +tục và dán dòng mã này mà chúng ta đã sao chép và bạn sẽ nhận thấy + +84 +00:03:48,480 --> 00:03:51,390 +rằng nó có một số gạch chân màu đỏ. + +85 +00:03:51,390 --> 00:03:55,140 +Điều này là do chúng ta cần cài đặt mô-đun Twilio này, vì + +86 +00:03:55,140 --> 00:03:57,600 +vậy, nhấp vào Twilio được gạch chân + +87 +00:03:57,600 --> 00:04:01,860 +đó, chúng ta có thể nhấp vào bóng đèn màu đỏ và cài đặt gói này. + +88 +00:04:01,860 --> 00:04:05,070 +Khi đã xong, tất cả lỗi sẽ biến mất và bây giờ chúng + +89 +00:04:05,070 --> 00:04:08,400 +ta có thể bắt đầu sử dụng lớp máy khách này. + +90 +00:04:08,400 --> 00:04:10,890 +Quay lại mã ví dụ, chúng ta cần + +91 +00:04:10,890 --> 00:04:15,890 +sao chép SID tài khoản và mã thông báo xác thực của mình. + +92 +00:04:16,560 --> 00:04:20,550 +Chúng tôi có thể lấy những thông tin chi tiết này từ Bảng điều khiển Twilio. + +93 +00:04:20,550 --> 00:04:23,100 +Ở đây, lưu ý rằng SID tài khoản này về cơ + +94 +00:04:23,100 --> 00:04:27,900 +bản là thông tin nhận dạng cho tài khoản Twilio của tôi và mã thông báo + +95 +00:04:27,900 --> 00:04:31,560 +xác thực mà chúng tôi cần lấy từ trang tổng quan. + +96 +00:04:31,560 --> 00:04:34,263 +Nếu chúng ta đi tới bảng điều khiển ở đây, + +97 +00:04:35,850 --> 00:04:39,210 +phía trên bên phải và sao chép mã thông báo xác thực + +98 +00:04:39,210 --> 00:04:42,120 +này vào đây hoặc bạn có thể nhấp vào "Hiển thị" + +99 +00:04:42,120 --> 00:04:47,120 +để xem, sau đó chúng ta có thể dán nó vào đây và thay thế mã thông báo xác thực này + +100 +00:04:47,310 --> 00:04:49,530 +và chỉ cần để thống nhất, tôi sẽ thay + +101 +00:04:49,530 --> 00:04:52,953 +đổi trích dẫn đơn này thành trích dẫn kép. + +102 +00:04:54,180 --> 00:04:56,850 +Vì vậy, đây là cả hai chuỗi. + +103 +00:04:56,850 --> 00:04:58,440 +Bây giờ, như tôi đã đề cập trước + +104 +00:04:58,440 --> 00:05:03,090 +đó, những ID mà bạn thấy trên màn hình này sẽ không phù hợp với bạn, vì vậy hãy đảm bảo + +105 +00:05:03,090 --> 00:05:06,090 +rằng bạn đã thực sự đăng nhập và xác nhận tất cả thông tin + +106 +00:05:06,090 --> 00:05:08,220 +chi tiết của mình để bạn có thể nhận được + +107 +00:05:08,220 --> 00:05:11,733 +SID tài khoản và mã thông báo xác thực của riêng mình . + +108 +00:05:13,110 --> 00:05:15,630 +Bây giờ, hãy quay lại phần Bắt đầu nhanh và chúng + +109 +00:05:15,630 --> 00:05:18,000 +ta đã hoàn thành tất cả những điều này. + +110 +00:05:18,000 --> 00:05:21,630 +Những gì chúng ta cần làm bây giờ là thiết lập ứng dụng khách Twilio, + +111 +00:05:21,630 --> 00:05:25,620 +sử dụng SID tài khoản và mã thông báo xác thực của chúng tôi. + +112 +00:05:25,620 --> 00:05:27,960 +Hãy tiếp tục và tạo ứng dụng khách của + +113 +00:05:27,960 --> 00:05:32,190 +chúng ta tại thời điểm chúng ta muốn gửi tin nhắn SMS cho chính mình, + +114 +00:05:32,190 --> 00:05:34,920 +vì vậy tôi sẽ xóa tất cả những thứ này và thay + +115 +00:05:34,920 --> 00:05:36,720 +vì câu lệnh in, chúng ta sẽ thiết + +116 +00:05:36,720 --> 00:05:39,390 +lập ứng dụng khách Twilio của mình. + +117 +00:05:39,390 --> 00:05:41,820 +Tiếp theo, chúng ta sẽ tạo thông điệp của mình. + +118 +00:05:41,820 --> 00:05:45,600 +Vì vậy, đây là thông điệp mà chúng tôi sẽ gửi cho chính mình. + +119 +00:05:45,600 --> 00:05:48,060 +Phần chúng ta cần thay đổi là nội dung, + +120 +00:05:48,060 --> 00:05:51,270 +vì vậy đây là văn bản mà chúng ta sẽ tự gửi và sau đó + +121 +00:05:51,270 --> 00:05:53,970 +chúng ta sẽ thay đổi trường "từ" thành số + +122 +00:05:53,970 --> 00:05:57,240 +điện thoại mà chúng ta nhận được từ Twilio và , "to" + +123 +00:05:57,240 --> 00:06:00,150 +thành số điện thoại mà chúng ta đã đăng ký với + +124 +00:06:00,150 --> 00:06:02,370 +Twilio, vì vậy chúng ta hãy thực hiện + +125 +00:06:02,370 --> 00:06:04,350 +từng việc một. + +126 +00:06:04,350 --> 00:06:06,963 +Thông điệp mà tôi muốn gửi tới chính mình là. + +127 +00:06:11,670 --> 00:06:13,657 +Như mọi khi, trên máy Mac, bạn có thể đi tới "Chỉnh + +128 +00:06:13,657 --> 00:06:16,890 +sửa", "Biểu tượng cảm xúc & Biểu tượng" để kéo bàn phím biểu tượng cảm xúc lên. + +129 +00:06:16,890 --> 00:06:18,150 +Nếu bạn đang sử dụng Windows + +130 +00:06:18,150 --> 00:06:20,220 +hoặc Linux, bạn chỉ cần truy cập Google + +131 +00:06:20,220 --> 00:06:24,000 +và tìm kiếm biểu tượng cảm xúc chiếc ô rồi dán nó vào đây. + +132 +00:06:24,000 --> 00:06:25,830 +Đó là thông điệp của chúng tôi, đã xong. + +133 +00:06:25,830 --> 00:06:29,880 +Bước tiếp theo là tìm ra số điện thoại nào + +134 +00:06:29,880 --> 00:06:33,720 +sẽ là số điện thoại của người gửi. + +135 +00:06:33,720 --> 00:06:36,630 +Quay trở lại Bảng điều khiển Twilio của + +136 +00:06:36,630 --> 00:06:40,320 +chúng tôi, chúng tôi sẽ sao chép số dùng thử này tại + +137 +00:06:40,320 --> 00:06:45,320 +đây và chúng tôi sẽ dán nó vào trường "từ" dưới dạng một chuỗi. + +138 +00:06:45,660 --> 00:06:47,430 +Điều tiếp theo là "đến", + +139 +00:06:47,430 --> 00:06:51,150 +vậy đây là người mà tin nhắn sẽ được gửi tới. + +140 +00:06:51,150 --> 00:06:54,330 +Đây phải là số điện thoại bạn đã sử dụng + +141 +00:06:54,330 --> 00:06:56,520 +để đăng ký Twilio. + +142 +00:06:56,520 --> 00:06:57,870 +Trên tài khoản dùng thử + +143 +00:06:57,870 --> 00:07:02,040 +Twilio, bạn có thể gửi tin nhắn và thực hiện cuộc gọi đến các số đã được xác + +144 +00:07:02,040 --> 00:07:03,870 +minh, đồng thời bạn có thể thêm các + +145 +00:07:03,870 --> 00:07:05,940 +số đã xác minh bằng cách nhấp vào nút + +146 +00:07:05,940 --> 00:07:08,370 +dấu cộng này và bạn có thể nhập số điện thoại + +147 +00:07:08,370 --> 00:07:10,200 +của ai đó, chẳng hạn như bạn bè hoặc + +148 +00:07:10,200 --> 00:07:12,720 +gia đình của bạn, nhưng bạn phải có thể để nhận + +149 +00:07:12,720 --> 00:07:15,450 +tin nhắn hoặc nhận cuộc gọi, để xác minh rằng bạn + +150 +00:07:15,450 --> 00:07:17,310 +thực sự sở hữu số đó hoặc bạn có quyền + +151 +00:07:17,310 --> 00:07:19,503 +truy cập vào số đó. + +152 +00:07:21,120 --> 00:07:22,770 +Bất kỳ số nào bạn thấy ở đây, + +153 +00:07:22,770 --> 00:07:27,630 +trong "ID người gọi đã xác minh" đều có thể được sử dụng trong mã của bạn. + +154 +00:07:27,630 --> 00:07:31,290 +Hãy tiếp tục và thay thế phần này có nội dung "đến" bằng số đã + +155 +00:07:31,290 --> 00:07:32,673 +được xác minh của bạn. + +156 +00:07:33,780 --> 00:07:37,680 +Bây giờ, cuối cùng, nó yêu cầu chúng ta in thông báo mà chúng ta đã + +157 +00:07:37,680 --> 00:07:39,063 +tạo ở đây, . sid, và về cơ + +158 +00:07:40,530 --> 00:07:43,650 +bản, điều đó có nghĩa là khi tin nhắn này được tạo + +159 +00:07:43,650 --> 00:07:47,400 +ID, điều đó có nghĩa là nó đã được gửi thành công. + +160 +00:07:47,400 --> 00:07:49,800 +Thay vì in thông báo SID, chúng + +161 +00:07:49,800 --> 00:07:53,610 +ta sẽ in trạng thái thông báo chỉ để đảm bảo rằng + +162 +00:07:53,610 --> 00:07:57,210 +nó thực sự đã được gửi thành công. + +163 +00:07:57,210 --> 00:08:01,170 +Tất cả mã này được thụt vào bên trong khối "will_rain" và đây + +164 +00:08:01,170 --> 00:08:03,120 +là thứ sẽ được kích hoạt nếu thực + +165 +00:08:03,120 --> 00:08:05,163 +sự hôm nay trời sẽ mưa. + +166 +00:08:06,450 --> 00:08:08,610 +Bây giờ chúng ta hãy tiếp tục kiểm tra điều + +167 +00:08:08,610 --> 00:08:10,290 +này, nhưng trước khi có thể kiểm + +168 +00:08:10,290 --> 00:08:13,620 +tra nó, chúng ta phải tìm nơi nào đó thực sự đang mưa. + +169 +00:08:13,620 --> 00:08:15,630 +Có vẻ như những người bị + +170 +00:08:15,630 --> 00:08:17,220 +bỏng đang có lượng + +171 +00:08:17,220 --> 00:08:20,730 +mưa khá lớn, vì vậy hãy cập nhật vĩ độ và kinh + +172 +00:08:20,730 --> 00:08:23,883 +độ của chúng ta để đốt ở Thụy Sĩ. + +173 +00:08:28,230 --> 00:08:30,060 +Bây giờ, chúng ta có một + +174 +00:08:30,060 --> 00:08:32,940 +nơi đang mưa, hãy tiếp tục chạy mã + +175 +00:08:32,940 --> 00:08:36,539 +và xem điều gì xảy ra trên điện thoại. + +176 +00:08:36,539 --> 00:08:37,650 +Ở đó bạn có nó. + +177 +00:08:37,650 --> 00:08:41,136 +Chúng tôi nhận được tin nhắn được gửi từ tài khoản dùng thử Twilio của mình, + +178 +00:08:41,136 --> 00:08:42,246 +"Hôm nay trời sẽ mưa. + +179 +00:08:42,246 --> 00:08:44,790 +"Nhớ mang theo ô nhé. Tất nhiên, bây giờ, bạn sẽ có thể loại bỏ + +180 +00:08:44,790 --> 00:08:47,130 +phần này, trong đó có nội dung "Đã gửi + +181 +00:08:47,130 --> 00:08:49,440 +từ tài khoản dùng thử Twilio của bạn" + +182 +00:08:49,440 --> 00:08:52,200 +nếu bạn đăng ký một tài khoản thực tế, nhưng + +183 +00:08:52,200 --> 00:08:56,100 +đối với tất cả ý định và mục đích, điều này đang hoạt động hoàn + +184 +00:08:56,100 --> 00:08:58,560 +hảo và hiện tại chúng tôi có thể nhận được + +185 +00:08:58,560 --> 00:08:59,640 +tin nhắn SMS khi điều + +186 +00:08:59,640 --> 00:09:03,450 +kiện thời tiết có mưa vài nơi trong 12 giờ tới. + +187 +00:09:03,450 --> 00:09:05,460 +Vì vậy, điều cuối cùng chúng ta + +188 +00:09:05,460 --> 00:09:10,460 +phải làm là thiết lập tập lệnh Python để chạy vào lúc 7:00 sáng hàng ngày. + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Signup-for-Twilio.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Signup-for-Twilio.url new file mode 100644 index 0000000000000000000000000000000000000000..87cfb9bbffecce2787c3a0dc7d0502b2a62853f5 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Signup-for-Twilio.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.twilio.com/try-twilio \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Twilio-SMS-Quickstart-Documentation-for-Python.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Twilio-SMS-Quickstart-Documentation-for-Python.url new file mode 100644 index 0000000000000000000000000000000000000000..5b16fc341e914fb1ce701c800028098cb534b9c3 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/005 Twilio-SMS-Quickstart-Documentation-for-Python.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.twilio.com/docs/sms/quickstart/python \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 How-to-Get-Twilio-to-Work-on-PythonAnywhere-Free-Accounts.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 How-to-Get-Twilio-to-Work-on-PythonAnywhere-Free-Accounts.url new file mode 100644 index 0000000000000000000000000000000000000000..ff1031cd186ad96eee68d8aeafc3a919c1a8682c --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 How-to-Get-Twilio-to-Work-on-PythonAnywhere-Free-Accounts.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://help.pythonanywhere.com/pages/TwilioBehindTheProxy/ \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 PythonAnywhere.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 PythonAnywhere.url new file mode 100644 index 0000000000000000000000000000000000000000..ae57e20b12686f76fd33e8c74fbb68ceb04aa1f7 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 PythonAnywhere.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.pythonanywhere.com/ \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 Use PythonAnywhere to Automate the Python Script.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 Use PythonAnywhere to Automate the Python Script.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0f39f533c34fc054a49b1eb8095bdba6adf7faf3 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 Use PythonAnywhere to Automate the Python Script.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd6f61d27e0277d1e92f5ba71077a64d648c220e27e437555c281addd10ad49e +size 95156337 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 Use PythonAnywhere to Automate the Python Script_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 Use PythonAnywhere to Automate the Python Script_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bac5a5cfe3a028896b103bd678bf60011b76b4b8 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/006 Use PythonAnywhere to Automate the Python Script_vi.srt @@ -0,0 +1,632 @@ +1 +00:00:00,510 --> 00:00:02,700 +Người hướng dẫn: Bây giờ chúng ta đã + +2 +00:00:02,700 --> 00:00:05,340 +kiểm tra mã của mình và đã làm cho nó hoạt động + +3 +00:00:05,340 --> 00:00:08,730 +cục bộ, bước tiếp theo là đưa tập lệnh của chúng ta lên mạng + +4 +00:00:08,730 --> 00:00:10,950 +để nó có thể chạy đúng lịch và chúng ta + +5 +00:00:10,950 --> 00:00:13,380 +không phải mở Python theo cách thủ công + +6 +00:00:13,380 --> 00:00:16,020 +và chạy nó vào lúc 7 giờ sáng mỗi ngày. + +7 +00:00:16,020 --> 00:00:16,950 +Chung ta se lam như thê nao? + +8 +00:00:16,950 --> 00:00:18,750 +Chà, chúng ta sẽ sử dụng PythonAnywhere, + +9 +00:00:18,750 --> 00:00:20,970 +cùng một dịch vụ mà chúng ta đã sử dụng + +10 +00:00:20,970 --> 00:00:24,420 +trước đây khi tạo lời chúc sinh nhật tự động. + +11 +00:00:24,420 --> 00:00:26,430 +Tất nhiên, bây giờ, điều đầu + +12 +00:00:26,430 --> 00:00:27,540 +tiên chúng ta sẽ + +13 +00:00:27,540 --> 00:00:30,300 +làm là đăng nhập vào dịch vụ và chúng ta sẽ + +14 +00:00:30,300 --> 00:00:33,990 +xóa tất cả các tệp trước đó, bao gồm thư mục mẫu thư và + +15 +00:00:33,990 --> 00:00:37,443 +cả tệp chính. py và ngày sinh nhật. csv. + +16 +00:00:39,990 --> 00:00:42,450 +Bây giờ thay vì chính trước đây. py, chúng tôi sẽ + +17 +00:00:42,450 --> 00:00:45,270 +tải lên tệp main. py. + +18 +00:00:45,270 --> 00:00:49,353 +Vì vậy, hãy tiếp tục và xác định vị trí này trong máy tính của chúng ta. + +19 +00:00:50,400 --> 00:00:53,133 +Và sau đó chúng tôi sẽ tải nó lên PythonAnywhere. + +20 +00:00:55,710 --> 00:00:56,910 +Thế đấy. + +21 +00:00:56,910 --> 00:01:01,910 +Bây giờ hãy mở tệp này và nhấp vào bảng điều khiển Bash ở đây. + +22 +00:01:02,250 --> 00:01:05,253 +Vì vậy, điều đó sẽ tạo bảng điều khiển của chúng ta ở + +23 +00:01:07,080 --> 00:01:09,150 +phía dưới và khi nó sẵn sàng như thế + +24 +00:01:09,150 --> 00:01:11,940 +này, chúng ta có thể nhập lệnh để chạy mã này. + +25 +00:01:11,940 --> 00:01:15,210 +Vì vậy, đó là python3, và sau đó là tên tệp của chúng tôi, + +26 +00:01:15,210 --> 00:01:17,850 +tệp này là main. py. + +27 +00:01:17,850 --> 00:01:21,180 +Và vì nó nằm ngay trong thư mục người dùng của tôi nên + +28 +00:01:21,180 --> 00:01:24,210 +tôi không phải chỉ định đường dẫn tệp tới nó. + +29 +00:01:24,210 --> 00:01:26,820 +Bây giờ, tôi không khuyên bạn nên có tệp main. py được lồng trong + +30 +00:01:26,820 --> 00:01:29,670 +các thư mục khác vì nó sẽ khiến việc này + +31 +00:01:29,670 --> 00:01:31,410 +phức tạp hơn một chút. + +32 +00:01:31,410 --> 00:01:33,630 +Vì vậy, miễn là bạn đã tải nó lên cùng một + +33 +00:01:33,630 --> 00:01:36,510 +nơi với tôi, ngay sau tên người dùng của bạn, thì + +34 +00:01:36,510 --> 00:01:38,910 +chúng ta sẽ có thể chạy dòng mã này. + +35 +00:01:40,530 --> 00:01:43,980 +Và chúng tôi có thể kiểm tra xem liệu mã này hiện có hoạt động hay không + +36 +00:01:43,980 --> 00:01:45,980 +khi nó được chạy từ PythonAnywhere. + +37 +00:01:46,830 --> 00:01:51,120 +Tuy nhiên, bây giờ những gì bạn sẽ thấy thay vì trạng + +38 +00:01:51,120 --> 00:01:55,650 +thái thông báo là một ngoại lệ và đó là lỗi kết nối. + +39 +00:01:55,650 --> 00:01:57,930 +Và lỗi kết nối cho chúng ta + +40 +00:01:57,930 --> 00:02:02,930 +biết điều gì đó về api này. Đã vượt quá số lần thử lại tối đa của twilio với url. + +41 +00:02:04,440 --> 00:02:08,400 +Vì vậy, nếu chúng ta tiếp tục và đánh dấu phần đó, chúng ta sẽ sao + +42 +00:02:08,400 --> 00:02:10,470 +chép nó, thì chúng ta có thể dán nó + +43 +00:02:10,470 --> 00:02:12,600 +vào Google và tìm ra điều gì sai. + +44 +00:02:12,600 --> 00:02:15,630 +Bài đăng đầu tiên bạn có thể thấy là một bài đăng từ Trợ + +45 +00:02:15,630 --> 00:02:17,283 +giúp tại PythonAnywhere. + +46 +00:02:18,150 --> 00:02:20,340 +Và họ đã tạo bài đăng này để cho bạn biết cách + +47 +00:02:20,340 --> 00:02:21,660 +giúp Twilio hoạt động trên + +48 +00:02:21,660 --> 00:02:24,333 +các tài khoản miễn phí với PythonAnywhere. + +49 +00:02:25,530 --> 00:02:27,330 +Như họ nói, nếu bạn đang cố gắng sử dụng + +50 +00:02:27,330 --> 00:02:29,520 +Twilio trên tài khoản PythonAnywhere miễn phí, + +51 +00:02:29,520 --> 00:02:30,630 +bạn sẽ gặp phải một lỗi giống + +52 +00:02:30,630 --> 00:02:32,160 +như thế này, đó chính xác là những + +53 +00:02:32,160 --> 00:02:33,840 +gì chúng tôi nhận được. + +54 +00:02:33,840 --> 00:02:35,940 +Và đó là nơi Google Tìm kiếm đã chọn nó để cho + +55 +00:02:35,940 --> 00:02:37,443 +chúng ta xem bài viết này. + +56 +00:02:38,340 --> 00:02:41,190 +Lý do cho điều này là vì về cơ bản, API Twilio + +57 +00:02:41,190 --> 00:02:43,560 +cần được hướng dẫn cách kết nối với + +58 +00:02:43,560 --> 00:02:47,280 +máy chủ proxy mà các tài khoản miễn phí sử dụng. + +59 +00:02:47,280 --> 00:02:50,340 +Khi bạn có tài khoản trả phí trên PythonAnywhere, bạn + +60 +00:02:50,340 --> 00:02:53,580 +có địa chỉ thực tế cho máy chủ chuyên dụng của mình, nhưng khi + +61 +00:02:53,580 --> 00:02:55,860 +bạn chỉ đăng ký bằng tài khoản miễn phí như + +62 +00:02:55,860 --> 00:02:59,580 +chúng tôi có ở đây, chúng tôi chỉ nhận được một máy chủ proxy. + +63 +00:02:59,580 --> 00:03:01,740 +Vì vậy chúng ta cần thay đổi mã một chút + +64 +00:03:01,740 --> 00:03:03,063 +để nó hoạt động. + +65 +00:03:03,930 --> 00:03:06,570 +Mặc dù chúng tôi thực sự đang sử dụng phiên bản Twilio + +66 +00:03:06,570 --> 00:03:08,700 +mới nhất nhưng qua thử nghiệm, tôi nhận thấy + +67 +00:03:08,700 --> 00:03:11,100 +rằng mã này dường như không phù hợp với tôi. + +68 +00:03:11,100 --> 00:03:14,460 +Thay vào đó, chúng tôi phải sử dụng phiên bản sửa + +69 +00:03:14,460 --> 00:03:16,680 +lỗi mà họ đã chỉ định ở đây. + +70 +00:03:16,680 --> 00:03:19,740 +Vì vậy, sự khác biệt duy nhất so với phiên bản mã của họ + +71 +00:03:19,740 --> 00:03:24,600 +và những gì chúng tôi có ở đây là tệp main. py là ba dòng mã. + +72 +00:03:24,600 --> 00:03:28,740 +Đầu tiên, chúng ta phải nhập lớp này có tên TwilioHttpClient + +73 +00:03:28,740 --> 00:03:30,450 +từ mô-đun Twilio. + +74 +00:03:30,450 --> 00:03:34,083 +Vì vậy, hãy sao chép nó và dán nó bên dưới các dòng trước đó của chúng ta. + +75 +00:03:35,460 --> 00:03:39,330 +Ngoài ra, bây giờ, chúng ta phải tạo một ứng dụng khách + +76 +00:03:39,330 --> 00:03:41,790 +proxy với lớp TwilioHttpClient + +77 +00:03:41,790 --> 00:03:44,310 +mà chúng ta vừa nhập vào. + +78 +00:03:44,310 --> 00:03:46,740 +Vì vậy, chúng ta sẽ đưa nó vào câu lệnh + +79 +00:03:46,740 --> 00:03:49,860 +IF khi chúng ta chuẩn bị tạo tin nhắn SMS. + +80 +00:03:49,860 --> 00:03:51,300 +Bước cuối cùng là, khi + +81 +00:03:51,300 --> 00:03:54,630 +lớp máy khách của chúng ta được tạo, chúng ta + +82 +00:03:54,630 --> 00:03:58,080 +phải đặt tham số máy khách HTTP này thành máy khách + +83 +00:03:58,080 --> 00:04:00,663 +proxy mà chúng ta vừa tạo. + +84 +00:04:01,620 --> 00:04:04,020 +Điều đó sẽ diễn ra ngay tại đây. + +85 +00:04:04,020 --> 00:04:06,600 +Phần còn lại của mã, chúng ta có thể + +86 +00:04:06,600 --> 00:04:10,623 +để nguyên và chỉ cần nhấn Lưu để cập nhật mã đó. + +87 +00:04:11,580 --> 00:04:13,530 +Bây giờ khi chúng ta đã nhập tất cả mã + +88 +00:04:13,530 --> 00:04:15,900 +đó, bạn có thể thấy chúng ta gặp lỗi ở đây. + +89 +00:04:15,900 --> 00:04:18,269 +Nó báo tên không xác định os và đó + +90 +00:04:18,269 --> 00:04:22,560 +là vì hệ điều hành này thực sự đến từ một mô-đun os, vì vậy + +91 +00:04:22,560 --> 00:04:26,193 +chúng ta nên nhập tên đó để lỗi này biến mất. + +92 +00:04:27,090 --> 00:04:29,220 +Vì vậy hãy nhấn Lưu lần nữa và bạn có + +93 +00:04:29,220 --> 00:04:33,060 +thể thấy chúng ta hiện không còn cảnh báo và lỗi nào nữa. + +94 +00:04:33,060 --> 00:04:35,700 +Bây giờ chúng ta đã sẵn sàng vào bảng điều khiển + +95 +00:04:35,700 --> 00:04:39,510 +và chạy lại lệnh tương tự, đó là python3 và sau đó là tên tệp của + +96 +00:04:39,510 --> 00:04:42,600 +chúng ta, main. py. + +97 +00:04:42,600 --> 00:04:44,130 +Vì vậy, bây giờ khi chúng tôi nhấn + +98 +00:04:44,130 --> 00:04:46,470 +enter, bạn có thể thấy chúng tôi lấy lại thư đã + +99 +00:04:46,470 --> 00:04:48,390 +được xếp hàng đợi, xuất phát từ câu lệnh + +100 +00:04:48,390 --> 00:04:50,610 +in này và đó là vì trạng thái thư của chúng tôi + +101 +00:04:50,610 --> 00:04:52,323 +hiện đã được xếp hàng đợi. + +102 +00:04:53,190 --> 00:04:57,510 +Và bạn có thể thấy rằng tôi hiện đã nhận được tin nhắn từ Twilio và tất nhiên + +103 +00:04:57,510 --> 00:05:00,300 +đây là vì tệp main. py đã được chạy trên + +104 +00:05:00,300 --> 00:05:02,100 +máy chủ PythonAnywhere thay + +105 +00:05:02,100 --> 00:05:04,560 +vì từ máy tính cục bộ của tôi. + +106 +00:05:04,560 --> 00:05:06,990 +Vì vậy, bây giờ chúng tôi đã xác nhận rằng tính + +107 +00:05:06,990 --> 00:05:09,430 +năng này hoạt động, cuối cùng chúng tôi có thể + +108 +00:05:11,100 --> 00:05:16,100 +quay lại PythonAnywhere và đi tới phần Nhiệm vụ để thiết lập nhiệm vụ của mình. + +109 +00:05:16,920 --> 00:05:19,890 +Bây giờ ở đây, tôi vẫn chưa thiết lập xong nhiệm vụ + +110 +00:05:19,890 --> 00:05:23,310 +trước đó khi chúng tôi tạo lời chúc sinh nhật tự động. + +111 +00:05:23,310 --> 00:05:24,480 +Bây giờ, vì tôi đang demo + +112 +00:05:24,480 --> 00:05:27,030 +tính năng này bằng tài khoản PythonAnywhere miễn + +113 +00:05:27,030 --> 00:05:30,150 +phí nên tôi chỉ có thể tạo một tác vụ theo lịch trình. + +114 +00:05:30,150 --> 00:05:32,370 +Nếu tôi bắt đầu trả tiền thì tôi có thể lên + +115 +00:05:32,370 --> 00:05:35,580 +lịch bao nhiêu tùy thích và chúng không bao giờ hết hạn. + +116 +00:05:35,580 --> 00:05:37,380 +Nhưng vì chúng ta chỉ mới học ở đây nên + +117 +00:05:37,380 --> 00:05:39,690 +tôi không muốn bạn đăng ký một tài khoản trả phí + +118 +00:05:39,690 --> 00:05:41,730 +chỉ để xem nó hoạt động như thế nào. + +119 +00:05:41,730 --> 00:05:44,400 +Vì vậy, chúng ta sẽ sử dụng cùng một tác vụ đã được lên lịch. + +120 +00:05:44,400 --> 00:05:46,110 +Bây giờ, nếu bạn không có bất kỳ tác vụ + +121 +00:05:46,110 --> 00:05:48,000 +nào được lên lịch, chỉ cần tiếp tục và tạo + +122 +00:05:48,000 --> 00:05:49,770 +một tác vụ và lệnh sẽ giống nhau. + +123 +00:05:49,770 --> 00:05:53,070 +Đó là python3, và sau đó nó đang chạy tệp main. py. + +124 +00:05:53,070 --> 00:05:56,280 +Vì vậy, lệnh tương tự mà bạn đã nhập trước đó. + +125 +00:05:56,280 --> 00:05:58,980 +Và chúng tôi sẽ đặt tần suất thành hàng ngày và + +126 +00:05:58,980 --> 00:06:01,383 +nó sẽ chạy vào lúc 7 giờ sáng hàng ngày. + +127 +00:06:02,460 --> 00:06:05,460 +Để kiểm tra điều này, tôi sẽ thay đổi thời + +128 +00:06:05,460 --> 00:06:08,670 +gian từ 7 giờ sáng sang thời gian hiện tại. + +129 +00:06:08,670 --> 00:06:11,910 +Vì vậy, thời gian hiện tại của máy chủ đang đăng + +130 +00:06:11,910 --> 00:06:14,280 +ký là 10:01, nhưng trên thực tế, tôi + +131 +00:06:14,280 --> 00:06:17,850 +thực sự đang nhìn thấy 02, vì vậy tôi sẽ thay đổi thành + +132 +00:06:17,850 --> 00:06:20,850 +10:03 và sau đó nhấn dấu kiểm. + +133 +00:06:20,850 --> 00:06:24,030 +Và bây giờ tôi sẽ kiên nhẫn chờ xem liệu điều đó có được + +134 +00:06:24,030 --> 00:06:27,120 +kích hoạt tự động từ các tác vụ đã lên lịch hay không và + +135 +00:06:27,120 --> 00:06:28,680 +tôi sẽ nhận được tin nhắn SMS + +136 +00:06:28,680 --> 00:06:30,783 +gửi đến điện thoại của mình. + +137 +00:06:32,010 --> 00:06:33,270 +Và bạn có nó rồi đấy! + +138 +00:06:33,270 --> 00:06:36,000 +Thông báo này hiện đang được gửi cho tôi từ Twilio + +139 +00:06:36,000 --> 00:06:37,950 +vì chúng tôi đã thực hiện lệnh gọi + +140 +00:06:37,950 --> 00:06:41,850 +API, nhưng nó được gửi vì tôi có tác vụ đã lên lịch này, tức là gọi lệnh + +141 +00:06:41,850 --> 00:06:46,680 +này để chạy lệnh chính của chúng tôi. py. + +142 +00:06:46,680 --> 00:06:49,800 +Và nó đang được thực hiện vào thời điểm mà tôi + +143 +00:06:49,800 --> 00:06:51,750 +đã chỉ định, mà trên thực tế, + +144 +00:06:51,750 --> 00:06:54,570 +tôi muốn diễn ra vào khoảng 7 giờ sáng. + +145 +00:06:54,570 --> 00:06:56,790 +Bây giờ, hãy lưu ý rằng đây là giờ UTC. + +146 +00:06:56,790 --> 00:07:01,470 +Vì vậy, nếu bạn muốn chuyển đổi thời gian UTC sang giờ địa phương của mình, vì vậy hiện tại + +147 +00:07:01,470 --> 00:07:05,010 +chúng tôi đang sử dụng Giờ mùa hè của Anh nơi tôi đang ở, thì bạn có thể + +148 +00:07:05,010 --> 00:07:06,720 +nhập thông tin này vào Google và + +149 +00:07:06,720 --> 00:07:10,170 +thay đổi thông tin này thành bất kỳ múi giờ nào bạn đang ở. + +150 +00:07:10,170 --> 00:07:14,250 +Và bằng cách đó bạn có thể tìm ra thời gian UTC tương + +151 +00:07:14,250 --> 00:07:17,040 +ứng với giờ địa phương của bạn. + +152 +00:07:17,040 --> 00:07:19,440 +Trong trường hợp của tôi, nó chỉ chậm một giờ. + +153 +00:07:19,440 --> 00:07:22,530 +Vì vậy, nếu tôi muốn nó chạy lúc 7:00 sáng theo giờ + +154 +00:07:22,530 --> 00:07:25,560 +địa phương thì tôi phải thay đổi thành 6:00. + +155 +00:07:25,560 --> 00:07:28,140 +Và bây giờ nó sẽ chạy vào lúc 6 giờ sáng hàng ngày + +156 +00:07:28,140 --> 00:07:30,180 +mà tôi không cần phải làm gì cả. + +157 +00:07:30,180 --> 00:07:33,210 +Và tôi sẽ nhận được thông báo đúng giờ nếu + +158 +00:07:33,210 --> 00:07:34,593 +trời sắp mưa. + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Course-Fixes-Report-an-Issue.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Environment-Variables-Wikipedia-Entry.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Environment-Variables-Wikipedia-Entry.url new file mode 100644 index 0000000000000000000000000000000000000000..9a6519a13759d4fcaeba2fd51ba348d4934e9a2b --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Environment-Variables-Wikipedia-Entry.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/Environment_variable \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Other-APIs-to-Explore.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Other-APIs-to-Explore.url new file mode 100644 index 0000000000000000000000000000000000000000..cac8329c8028bb0932c9daca3b65f124770b2ce7 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Other-APIs-to-Explore.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://apilist.fun/ \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Solution-Weather-Twilio.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Solution-Weather-Twilio.url new file mode 100644 index 0000000000000000000000000000000000000000..af076c940fde721512f98835c84919ae6a31b33c --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Solution-Weather-Twilio.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://gist.github.com/TheMuellenator/895e0a508727aea2156a9a5d63dcfb28 \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Solution-incl.code-for-PythonAnywhere-Deployment.url b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Solution-incl.code-for-PythonAnywhere-Deployment.url new file mode 100644 index 0000000000000000000000000000000000000000..eb58b442673003fd3930c7c97f8272ab4863bd01 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Solution-incl.code-for-PythonAnywhere-Deployment.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://gist.github.com/TheMuellenator/26127612aad5015a09ba3f4579048dd4 \ No newline at end of file diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Understanding Environment Variables and Hiding API Keys.mp4 b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Understanding Environment Variables and Hiding API Keys.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7869da5bc9d5719fb9411ea1e206fbac6d0f313d --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Understanding Environment Variables and Hiding API Keys.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5644c7d4b18c0f6129a750e14a40d236253511d2defc89c1f8a2a1cfc16dff11 +size 131051676 diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Understanding Environment Variables and Hiding API Keys_vi.srt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Understanding Environment Variables and Hiding API Keys_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2b8575305fc8fae523a1b6d0b14b1be586c8e054 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/007 Understanding Environment Variables and Hiding API Keys_vi.srt @@ -0,0 +1,612 @@ +1 +00:00:00,030 --> 00:00:01,800 +Bây giờ chúng ta đã làm cho ứng dụng của + +2 +00:00:02,040 --> 00:00:04,770 +mình hoạt động, bạn có thể nghĩ rằng chúng ta đã kết thúc bài + +3 +00:00:05,070 --> 00:00:08,010 +học hôm nay nhưng chỉ có một điều cuối cùng tôi muốn nói với bạn. + +4 +00:00:08,550 --> 00:00:12,210 +Và đó là môi trường. Không phải toàn bộ môi trường, + +5 +00:00:12,330 --> 00:00:15,510 +mà chính xác hơn là các biến môi trường. + +6 +00:00:16,260 --> 00:00:18,510 +Bây giờ, biến môi trường của chúng ta là gì? + +7 +00:00:18,870 --> 00:00:20,760 +Nếu bạn truy cập vào dự án PyCharm + +8 +00:00:20,880 --> 00:00:24,780 +của mình và vào tab này có ghi "Terminal", tại đây nếu bạn + +9 +00:00:24,810 --> 00:00:27,840 +nhập env (đặt trên Windows) và nhấn "Enter", + +10 +00:00:28,170 --> 00:00:31,020 +bạn có thể thấy cả đống biến. + +11 +00:00:31,050 --> 00:00:35,250 +Vậy là bạn đã có một khóa và một giá trị và + +12 +00:00:35,760 --> 00:00:39,270 +ở giữa chỉ có một dấu bằng (=). + +13 +00:00:39,960 --> 00:00:44,790 +Vì vậy, đây là các biến khác nhau được đặt trong môi trường mà mã của bạn + +14 +00:00:44,820 --> 00:00:45,720 +được chạy. + +15 +00:00:46,350 --> 00:00:49,980 +Các biến này có các giá trị là các chuỗi có thể được + +16 +00:00:50,400 --> 00:00:54,300 +sử dụng trong ứng dụng hoặc mã của chúng tôi. + +17 +00:00:55,230 --> 00:00:56,490 +Bây giờ bên trong Python + +18 +00:00:56,490 --> 00:01:00,750 +ở bất cứ đâu bạn cũng có thể nhập env và bạn có thể thấy một số biến môi + +19 +00:01:00,750 --> 00:01:05,099 +trường hơi khác một chút so với môi trường Python ở mọi nơi. + +20 +00:01:05,580 --> 00:01:09,660 +Chính xác thì tất cả các biến môi trường này được sử dụng để làm gì? Vâng, có hai trường + +21 +00:01:09,840 --> 00:01:14,370 +hợp sử dụng chính. Một là để thuận tiện. + +22 +00:01:14,970 --> 00:01:18,690 +Thông thường khi bạn triển khai một ứng dụng lớn thì + +23 +00:01:19,140 --> 00:01:23,340 +quá trình này khá phức tạp. Và một khi bạn đã hoàn thành nó, + +24 +00:01:23,670 --> 00:01:28,230 +bạn sẽ không muốn loay hoay với cơ sở mã và cập nhật các tệp mã như + +25 +00:01:28,230 --> 00:01:31,890 +tệp main. py chẳng hạn. Thay vào đó, bạn có thể có + +26 +00:01:31,920 --> 00:01:36,450 +các biến môi trường này mà bạn có thể thay đổi. Ví dụ: nếu bạn có một ứng dụng + +27 +00:01:36,510 --> 00:01:40,260 +gửi email cho khách hàng thì email cơ sở khách hàng + +28 +00:01:40,500 --> 00:01:43,500 +của bạn có thể thay đổi hàng ngày. + +29 +00:01:44,070 --> 00:01:48,840 +Vì vậy, một số biến nhất định đang được sử dụng trong cơ sở mã của bạn có thể được đặt làm + +30 +00:01:48,840 --> 00:01:49,980 +biến môi trường và bạn + +31 +00:01:50,220 --> 00:01:53,640 +có thể sửa đổi các biến đó mà không cần phải chạm vào mã. + +32 +00:01:54,510 --> 00:01:57,480 +Lý do thứ hai có thể là vì vấn đề bảo mật. + +33 +00:01:58,140 --> 00:01:59,700 +Vì vậy, khi bạn đang phát triển + +34 +00:01:59,730 --> 00:02:04,110 +phần mềm, bạn có thể tải mã của mình lên ở đâu đó, chẳng hạn như để lưu trữ mã đó + +35 +00:02:04,110 --> 00:02:07,590 +trực tuyến hoặc vào một dịch vụ như PythonAnywhere. + +36 +00:02:08,520 --> 00:02:13,440 +Và thường không phải là một ý tưởng hay nếu lưu trữ những thứ như khóa + +37 +00:02:13,440 --> 00:02:18,440 +xác thực hoặc khóa API ở cùng một nơi với phần còn lại của mã. + +38 +00:02:19,140 --> 00:02:21,180 +Đó là nơi các biến môi trường xuất hiện. + +39 +00:02:21,420 --> 00:02:26,420 +Vì vậy, các biến môi trường về cơ bản cho phép chúng ta tách biệt nơi + +40 +00:02:26,490 --> 00:02:28,590 +chúng ta lưu trữ khóa, nội dung + +41 +00:02:28,800 --> 00:02:33,480 +bí mật và nhiều biến khác khỏi nơi đặt cơ sở mã của chúng ta. + +42 +00:02:34,140 --> 00:02:34,973 +Trong trường hợp của + +43 +00:02:35,010 --> 00:02:39,270 +chúng tôi, điều đó không thực sự quan trọng vì chúng tôi chưa có tài khoản trả phí ở bất kỳ đâu tại đây. + +44 +00:02:39,750 --> 00:02:44,370 +Sẽ không thực sự quan trọng nếu ai đó đánh cắp mã thông báo xác thực hoặc khóa API của chúng tôi, bởi vì không có mã nào trong + +45 +00:02:44,490 --> 00:02:49,170 +số đó được liên kết với chi tiết thanh toán của chúng tôi. Tuy nhiên, bây giờ, nếu chúng tôi + +46 +00:02:49,170 --> 00:02:53,130 +nâng cấp tài khoản của mình trên API của bản đồ thời tiết mở + +47 +00:02:53,400 --> 00:02:54,900 +hoặc trên API của Twilio + +48 +00:02:55,200 --> 00:03:01,623 +thì chúng tôi chắc chắn muốn giữ bí mật hai điều này; mã thông báo xác thực và khóa API. + +49 +00:03:01,810 --> 00:03:05,860 +Thay vì đặt nó ở cùng một nơi mà chúng tôi có cơ sở mã, điều đó có nghĩa + +50 +00:03:06,310 --> 00:03:10,210 +là bạn có thể vô tình tải nó lên đâu đó trên internet nơi người khác + +51 +00:03:10,210 --> 00:03:12,610 +có thể nhìn thấy, thay vào đó, chúng ta có + +52 +00:03:12,640 --> 00:03:15,910 +thể lưu trữ hai thứ này dưới dạng biến môi trường. + +53 +00:03:16,600 --> 00:03:21,340 +Chúng ta có thể tạo một biến môi trường bằng cách + +54 +00:03:21,760 --> 00:03:26,050 +chỉ cần nhập xuất rồi nhập tên của biến mà tôi + +55 +00:03:26,410 --> 00:03:31,270 +sẽ gọi là OWM _API_KEY. Và điều thực sự quan trọng là chúng ta không có + +56 +00:03:31,480 --> 00:03:33,640 +dấu cách mà chỉ có một dấu bằng duy nhất. + +57 +00:03:34,360 --> 00:03:37,720 +Và sau đó chúng ta sẽ lưu trữ mọi thứ ở giữa dấu ngoặc kép. + +58 +00:03:38,020 --> 00:03:39,880 +Vì vậy, tôi sẽ sao chép + +59 +00:03:40,900 --> 00:03:45,430 +nó từ đây và dán nó vào đây. Khi tôi đã xuất nó và sau đó nếu tôi + +60 +00:03:46,180 --> 00:03:49,330 +nhấn "env" lần nữa, bạn sẽ thấy bây giờ trong môi + +61 +00:03:49,330 --> 00:03:51,370 +trường cập nhật này, bạn có thể + +62 +00:03:51,430 --> 00:03:55,090 +thấy biến môi trường đó xuất hiện ngay tại đó. + +63 +00:03:55,510 --> 00:04:00,100 +Và bây giờ chúng ta có thể khai thác biến môi trường đó trong bất kỳ mã nào + +64 +00:04:00,160 --> 00:04:05,160 +chúng ta chạy từ môi trường cụ thể này. Để làm được điều đó, chúng ta phải sử dụng mô-đun hệ điều hành + +65 +00:04:05,740 --> 00:04:06,573 +mà chúng ta đã có. + +66 +00:04:06,940 --> 00:04:10,780 +Vì vậy, tôi sẽ xóa mọi thứ hiện được lưu trữ trong khóa API. + +67 +00:04:11,230 --> 00:04:15,250 +Và thay vào đó, tôi sẽ nhấn vào os. environ, sau đó tôi sẽ sử dụng + +68 +00:04:16,029 --> 00:04:21,029 +một phương thức có tên get để lấy giá trị của một biến môi trường + +69 +00:04:21,070 --> 00:04:22,060 +cụ thể. + +70 +00:04:22,960 --> 00:04:26,500 +Tên là mọi thứ đứng trước dấu bằng. + +71 +00:04:26,980 --> 00:04:31,960 +Vì vậy hãy tiếp tục và dán nó vào đây. Và bây giờ khi tôi chạy mã này, bằng cách + +72 +00:04:32,320 --> 00:04:36,010 +sử dụng python3 và sau đó là tên của tệp, bạn có thể thấy rằng + +73 +00:04:36,760 --> 00:04:41,470 +nó đã chạy thành công việc xếp hàng tin nhắn của chúng tôi vào Twilio. + +74 +00:04:42,250 --> 00:04:45,730 +Bây giờ hãy tiếp tục và làm điều tương tự với mã thông báo xác thực. + +75 +00:04:46,360 --> 00:04:48,520 +Bạn muốn lưu mã này dưới dạng mã biến + +76 +00:04:48,520 --> 00:04:52,510 +môi trường auth_token ở dạng viết hoa toàn bộ, tương tự như những + +77 +00:04:52,900 --> 00:04:54,430 +gì chúng tôi có ở đây. + +78 +00:04:55,060 --> 00:04:58,390 +Và bạn muốn lưu trữ giá trị này trong biến môi trường. + +79 +00:04:58,630 --> 00:05:02,850 +Hãy tạm dừng video và thử xem. Được rồi. + +80 +00:05:02,880 --> 00:05:06,090 +Vì vậy, chúng ta sẽ làm theo chính xác điều mà chúng ta đã làm trước đây. Chúng tôi sử dụng + +81 +00:05:06,090 --> 00:05:10,920 +từ khóa xuất và sau đó nhập tên của biến môi trường + +82 +00:05:11,190 --> 00:05:15,420 +sẽ là AUTH_TOKEN. Và điều thực sự quan trọng là chúng + +83 +00:05:15,450 --> 00:05:17,670 +ta chỉ có một dấu bằng, không có dấu + +84 +00:05:18,090 --> 00:05:21,840 +cách và chúng ta sẽ lưu trữ giá trị này mà không có dấu ngoặc + +85 +00:05:22,440 --> 00:05:26,970 +kép và chúng ta sẽ đặt nó vào đây. Bây giờ, trong các biến môi trường của chúng tôi, + +86 +00:05:27,000 --> 00:05:30,120 +bạn có thể thấy chúng tôi đã có khóa API bản đồ thời tiết mở. + +87 +00:05:30,540 --> 00:05:35,280 +Và nếu chúng tôi cuộn lên thêm một chút, bạn cũng có thể thấy mã thông báo xác thực của chúng tôi. + +88 +00:05:36,750 --> 00:05:41,750 +Vì vậy, bây giờ chúng ta có thể thay thế chuỗi này bằng os. môi trường. get và sau đó chúng + +89 +00:05:43,560 --> 00:05:47,580 +ta chuyển vào tên của khóa là AUTH_TOKEN. + +90 +00:05:48,630 --> 00:05:53,630 +Và bây giờ hãy chạy lại mã của chúng tôi với python3 main. py. + +91 +00:05:54,090 --> 00:05:56,580 +Và bạn có thể thấy nó vẫn hoạt động như trước. + +92 +00:05:57,320 --> 00:06:01,730 +Nhưng bây giờ nếu ai đó tìm thấy cơ sở mã cụ thể này trên internet, họ sẽ + +93 +00:06:02,030 --> 00:06:07,030 +không thể sử dụng tài khoản Twilio hoặc tài khoản bản đồ thời tiết mở của chúng + +94 +00:06:07,460 --> 00:06:12,350 +tôi vì cả hai khóa này hiện đều bị ẩn. Hãy tiếp tục và nhấn lưu. + +95 +00:06:13,760 --> 00:06:15,410 +Vì vậy, bây giờ chúng ta sẽ làm điều + +96 +00:06:15,680 --> 00:06:19,340 +tương tự, nhưng tại thời điểm chúng ta chạy mã từ bộ lập lịch tác vụ của mình. + +97 +00:06:19,880 --> 00:06:24,590 +Vì vậy, hãy tiếp tục và nhấp chuột phải vào con rắn này rồi mở liên kết trong tab mới để + +98 +00:06:24,590 --> 00:06:27,470 +chúng ta có thể chuyển đến phần nhiệm vụ của mình. + +99 +00:06:27,920 --> 00:06:32,480 +Và ở đây chúng ta sẽ chỉnh sửa lệnh của mình. Thay vì chỉ chạy Python main. py, chúng tôi sẽ xuất hai biến môi trường đó. + +100 +00:06:32,480 --> 00:06:36,740 +Đây là lý do tại sao chúng tôi mở hai màn hình + +101 +00:06:37,280 --> 00:06:41,810 +để có thể sao chép các giá trị thực tế. Giá trị đầu tiên sẽ là khóa API bản đồ thời tiết + +102 +00:06:41,900 --> 00:06:46,430 +mở của chúng tôi. Vì vậy, tôi sẽ sao chép nó. Và ở đây, tôi sẽ viết xuất khẩu và dán vào + +103 +00:06:46,460 --> 00:06:49,790 +khóa đầu tiên đó. Bây giờ, sau đó, + +104 +00:06:49,820 --> 00:06:54,470 +tôi sẽ sử dụng dấu chấm phẩy để biểu + +105 +00:06:54,500 --> 00:06:58,790 +thị một dòng mới và sau đó tôi sẽ xuất khóa tiếp theo. Cuộn lên, chúng ta có thể thấy mã thông báo xác thực của mình ngay tại + +106 +00:06:59,210 --> 00:07:03,140 +đây vì vậy chúng ta cũng sẽ sao + +107 +00:07:03,170 --> 00:07:07,220 +chép mã đó và sẽ xuất mã đó dưới dạng biến môi trường khác. + +108 +00:07:07,550 --> 00:07:11,330 +Và cuối cùng, chúng ta sẽ kết thúc nó bằng dấu chấm phẩy. + +109 +00:07:11,780 --> 00:07:14,480 +Vì vậy, bây giờ bạn nên xuất OWM_API_KEY + +110 +00:07:14,930 --> 00:07:18,860 +và sau đó xuất mã thông báo xác thực của mình. Và cuối cùng, ở dòng cuối cùng, chúng tôi đang + +111 +00:07:19,430 --> 00:07:23,750 +chạy python3 main. py. + +112 +00:07:23,750 --> 00:07:26,960 +Bây giờ hãy thay đổi điều này để chạy ở thời điểm hiện tại. + +113 +00:07:27,770 --> 00:07:31,550 +Vì vậy, bây giờ sẽ là giờ UTC, tức là lúc + +114 +00:07:31,550 --> 00:07:35,690 +10 giờ và sau đó thay vì 46, bây giờ là 48 nên + +115 +00:07:35,720 --> 00:07:38,600 +tôi sẽ đổi nó thành 49. Và sau đó tôi sẽ đánh dấu tích. + +116 +00:07:38,600 --> 00:07:43,340 +Và bây giờ chúng tôi sẽ chờ xem liệu nó có thực sự hoạt động + +117 +00:07:44,060 --> 00:07:47,120 +hay không mặc dù chúng tôi đã lấy khóa API khỏi tệp chính của mình. py vì chúng tôi đang xuất nó trong + +118 +00:07:47,330 --> 00:07:51,410 +lệnh của mình. + +119 +00:07:51,650 --> 00:07:53,960 +Hãy xem liệu chúng ta có còn nhận được tin nhắn thông báo không. + +120 +00:07:54,200 --> 00:07:56,870 +Ở đó bạn có nó. Nó vẫn hoạt động như trước. + +121 +00:07:58,490 --> 00:08:01,310 +Nhưng bây giờ điều này là vô hình đối + +122 +00:08:02,180 --> 00:08:04,760 +với mọi người nếu họ tình cờ truy cập vào tệp chính của chúng tôi. py. + +123 +00:08:05,180 --> 00:08:07,910 +Bây giờ đừng lo lắng. Dịch vụ của Python ở mọi nơi đều khá an toàn. + +124 +00:08:08,510 --> 00:08:12,020 +Sẽ không có ai thực sự xâm nhập vào tài khoản + +125 +00:08:12,050 --> 00:08:14,000 +của bạn chỉ để xem thông tin chính của bạn. py. + +126 +00:08:14,300 --> 00:08:16,130 +Vấn đề lớn hơn là khi bạn + +127 +00:08:16,760 --> 00:08:20,390 +tải mã của riêng mình lên những nơi như Git Hub hoặc BitBucket, về cơ bản những nơi đó + +128 +00:08:20,390 --> 00:08:21,890 +về cơ bản là Dropbox để chứa mã. + +129 +00:08:22,160 --> 00:08:25,580 +Và khi bạn có nó ở đó, vì mã của bạn có thể được + +130 +00:08:26,150 --> 00:08:29,120 +công khai, đó là lúc vấn đề xảy ra. + +131 +00:08:29,420 --> 00:08:31,280 +Nếu mọi người nhìn vào tệp mã của + +132 +00:08:31,580 --> 00:08:35,659 +bạn và thấy rằng bạn có khóa API trong đó thì họ có thể đánh cắp chúng. Vì vậy, bất cứ khi nào bạn tải mã của mình lên một cách công khai, hãy luôn + +133 +00:08:35,659 --> 00:08:40,130 +cẩn thận loại bỏ tất cả các khóa API và thay + +134 +00:08:40,309 --> 00:08:45,310 +vào đó sử dụng các biến môi trường như chúng tôi có ở đây để lấy mã đó khỏi môi trường. + +135 +00:08:45,560 --> 00:08:50,450 +Tất cả những gì bạn cần làm là cập nhật vĩ độ và kinh + +136 +00:08:51,440 --> 00:08:56,070 +độ thành vĩ độ và kinh độ thực tế của địa phương thay + +137 +00:08:56,070 --> 00:09:00,810 +vì nơi có mưa mà chúng tôi đang thử nghiệm. Và bây giờ bạn đã hoàn thành xong ứng dụng cảnh báo mưa. + +138 +00:09:00,810 --> 00:09:05,550 +Bây giờ tôi đã giới thiệu cho bạn khá nhiều API + +139 +00:09:06,210 --> 00:09:08,970 +khác nhau nhưng có cả thế giới API để bạn khám phá. + +140 +00:09:09,000 --> 00:09:12,300 +Và nếu bạn đủ kiên nhẫn để đọc tài liệu của họ và hiểu cách làm việc + +141 +00:09:12,810 --> 00:09:16,680 +với API của họ thì giờ đây bạn đã biết cách làm việc với điểm cuối của họ, cách + +142 +00:09:16,680 --> 00:09:20,700 +truyền tham số cũng như cách xác thực bản thân với máy chủ của họ. + +143 +00:09:20,940 --> 00:09:25,560 +Vì vậy, đây là danh sách các API thú vị mà bạn có thể sử dụng để xây dựng ứng dụng. + +144 +00:09:26,100 --> 00:09:31,100 +Tôi đã chỉ cho bạn cách bạn có thể tạo cảnh báo mưa và gửi tin nhắn SMS cho + +145 +00:09:32,700 --> 00:09:37,700 +chính mình hoặc cách nhận vị trí của ISS hoặc thời gian mặt trời mọc và + +146 +00:09:38,520 --> 00:09:43,110 +mặt trời lặn, nhưng có rất nhiều API khác để bạn khám phá. Ví dụ: những thứ như API cơ sở dữ liệu phim mở, chứa toàn + +147 +00:09:43,410 --> 00:09:48,090 +bộ dữ liệu liên quan đến phim + +148 +00:09:48,090 --> 00:09:50,460 +hoặc tra cứu các bài hát và nghệ + +149 +00:09:50,910 --> 00:09:53,970 +sĩ bằng API Spotify, v.v. + +150 +00:09:54,390 --> 00:09:59,390 +Vì vậy, tôi sẽ để bạn khám phá điều đó. + +151 +00:10:00,840 --> 00:10:02,760 +Và nếu bạn nghĩ ra điều gì đó sáng tạo và thú + +152 +00:10:03,090 --> 00:10:06,000 +vị, hãy nhớ chia sẻ nó với những người còn lại trong phần Hỏi đáp + +153 +00:10:06,240 --> 00:10:10,380 +bên dưới bài học này để tất cả chúng ta có thể xem qua và ngưỡng mộ sự chăm chỉ của bạn. + diff --git a/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/external-links.txt b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..e8835b756ac2f4c2d9d8ea41a1448128ea2b8750 --- /dev/null +++ b/part3/35 - Day 35 - Intermediate+ Keys, Authentication & Environment Variables Send SMS/external-links.txt @@ -0,0 +1,54 @@ + +002 Create-a-free-account-on-OpenWeatherMap +https://home.openweathermap.org/users/sign_up + +003 OpenWeatherMap-Current-Weather-API-Documentation +https://openweathermap.org/current + +003 Link-to-Your-OpenWeatherMap-API-Key-req.login +https://home.openweathermap.org/api_keys + +003 Find-Your-Latitude-longitude +https://www.latlong.net/ + +003 Online-JSON-Viewer +http://jsonviewer.stack.hu/ + +003 OpenWeatherMap-Forecast-API-Documentation +https://openweathermap.org/forecast5 + +004 OpenWeatherMap-Condition-IDs-and-Condition-Codes +https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + +004 Find-a-Place-thats-raining-using-Ventusky +https://www.ventusky.com/ + +004 Python-Slice-Operator-with-Square-Brackets +https://stackoverflow.com/questions/509211/understanding-slice-notation + +005 Signup-for-Twilio +https://www.twilio.com/try-twilio + +005 Twilio-SMS-Quickstart-Documentation-for-Python +https://www.twilio.com/docs/sms/quickstart/python + +006 PythonAnywhere +https://www.pythonanywhere.com/ + +006 How-to-Get-Twilio-to-Work-on-PythonAnywhere-Free-Accounts +https://help.pythonanywhere.com/pages/TwilioBehindTheProxy/ + +007 Environment-Variables-Wikipedia-Entry +https://en.wikipedia.org/wiki/Environment_variable + +007 Other-APIs-to-Explore +https://apilist.fun/ + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +007 Solution-Weather-Twilio +https://gist.github.com/TheMuellenator/895e0a508727aea2156a9a5d63dcfb28 + +007 Solution-incl.code-for-PythonAnywhere-Deployment +https://gist.github.com/TheMuellenator/26127612aad5015a09ba3f4579048dd4 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 Day 36 Goals what you will make by the end of the day.mp4 b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 Day 36 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ce80034fc19ac5dfec4f270ba18b506503153d08 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 Day 36 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:033515e3e7ef6e84f06a2a32fe5ff9c7cc423f0683a937b00e828bcbae261c38 +size 108708024 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 Day 36 Goals what you will make by the end of the day_vi.srt b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 Day 36 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5cd00499edc7a4be14fc70fe8cdcebb6441d6472 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 Day 36 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,592 @@ +1 +00:00:00,090 --> 00:00:00,720 +Xin chào các bạn, + +2 +00:00:00,720 --> 00:00:05,720 +đây là Angela và chào mừng bạn đến với Ngày thứ 36 của 100 Ngày viết mã. Hôm nay chúng tôi có một dự + +3 +00:00:06,150 --> 00:00:08,370 +án thú vị dành cho bạn. + +4 +00:00:08,550 --> 00:00:12,720 +Chúng tôi sẽ xây dựng một dự án theo dõi tin tức chứng khoán. + +5 +00:00:13,410 --> 00:00:16,650 +Vì vậy, tôi không biết có bao nhiêu người trong số các bạn giao dịch cổ phiếu, + +6 +00:00:16,800 --> 00:00:19,110 +nhưng gần đây tôi đã bắt đầu tìm hiểu về nó. + +7 +00:00:19,350 --> 00:00:22,590 +Và một trong những hình ảnh luôn xuất hiện trong đầu tôi khi tôi nghĩ + +8 +00:00:22,590 --> 00:00:25,440 +về những người giao dịch cổ phiếu là một cái gì đó như + +9 +00:00:25,890 --> 00:00:28,230 +thế này, nơi nếu bạn sẽ ngồi trước hàng triệu + +10 +00:00:28,260 --> 00:00:31,020 +màn hình, xem tất cả dữ liệu và tất cả tin tức. + +11 +00:00:31,800 --> 00:00:33,990 +Bây giờ tôi đã nghiên cứu một + +12 +00:00:34,050 --> 00:00:39,050 +chút về vấn đề này và có vẻ như rất nhiều người giao dịch cổ phiếu chuyên nghiệp + +13 +00:00:39,110 --> 00:00:43,700 +có quyền truy cập vào thiết bị đầu cuối của Bloomberg, trông giống như thế này. + +14 +00:00:43,790 --> 00:00:45,890 +Và nó cung cấp cho bạn một số thứ, giá + +15 +00:00:46,370 --> 00:00:49,640 +cổ phiếu hiện tại của bất kỳ công ty nào bạn đang xem, và cả những + +16 +00:00:50,150 --> 00:00:55,130 +tin tức nóng hổi có liên quan đến những công ty đó. Vì vậy, tùy thuộc vào việc nếu họ có một + +17 +00:00:55,130 --> 00:00:57,440 +số tin tốt nói rằng họ kiếm được + +18 +00:00:57,440 --> 00:01:00,680 +nhiều tiền trong quý vừa qua, hoặc họ đã chế tạo ra một + +19 +00:01:00,690 --> 00:01:04,519 +sản phẩm thực sự tuyệt vời hay họ đã phát triển một loại vắc-xin mới. + +20 +00:01:04,760 --> 00:01:09,760 +Sau đó, rõ ràng bạn có thể tưởng tượng giá cổ phiếu của công ty họ tăng hoặc giảm + +21 +00:01:11,540 --> 00:01:16,540 +tùy thuộc vào loại tin tức được đưa ra. Và cuối cùng những nền tảng này cũng cung cấp + +22 +00:01:17,450 --> 00:01:22,450 +cho bạn khả năng cảnh báo bạn khi các mẩu tin tức liên quan xảy ra liên quan đến + +23 +00:01:23,930 --> 00:01:26,030 +cổ phiếu mà bạn đang theo dõi. + +24 +00:01:27,170 --> 00:01:32,170 +Vì vậy, tôi đã phát hiện ra với bạn mình rằng để đăng ký một trong + +25 +00:01:33,290 --> 00:01:34,123 +những thiết + +26 +00:01:34,220 --> 00:01:39,220 +bị đầu cuối của Bloomberg này, bạn phải trả khoảng 24.000 đô la một năm. + +27 +00:01:39,920 --> 00:01:43,160 +Vì vậy, đó là sự kết thúc của nghiên cứu đó. Ừm, nhưng tôi đã nghĩ + +28 +00:01:43,190 --> 00:01:46,820 +về nó và tôi đã nghĩ về những thứ thực sự hữu + +29 +00:01:46,820 --> 00:01:49,400 +ích cho ai đó giao dịch cổ phiếu. + +30 +00:01:49,580 --> 00:01:54,260 +Và tôi đã nghĩ về cách chúng ta có thể biến điều này thành một dự án Python. + +31 +00:01:54,830 --> 00:01:56,360 +Vì vậy, đây là những gì sẽ xảy ra. + +32 +00:01:56,600 --> 00:02:01,600 +Chúng tôi sẽ tự làm một thiết bị đầu cuối Bloomberg của riêng mình hoặc ít nhất là các phần + +33 +00:02:01,640 --> 00:02:05,240 +của chức năng khá hữu ích. Trước tiên, chúng ta hãy xem dữ + +34 +00:02:05,300 --> 00:02:09,500 +liệu thị trường chứng khoán trông như thế nào. Vì vậy, ở đây, tôi + +35 +00:02:09,500 --> 00:02:14,500 +có một trang web tên là tradingview. com và tôi đang xem xét các công ty vốn + +36 +00:02:15,950 --> 00:02:16,783 +hóa lớn. + +37 +00:02:17,120 --> 00:02:20,840 +Vì vậy, đây là những công ty nổi tiếng mà bạn có thể đã nghe nói + +38 +00:02:20,840 --> 00:02:22,370 +đến như Apple, Microsoft hoặc Amazon. + +39 +00:02:22,910 --> 00:02:26,330 +Và giả sử rằng chúng tôi quan tâm đến một cổ phiếu cụ thể. + +40 +00:02:26,360 --> 00:02:28,610 +Giả sử rằng chúng tôi đã mua cổ phần của Tesla và chúng tôi muốn + +41 +00:02:29,120 --> 00:02:31,340 +biết nó hoạt động như thế nào. Chà, chúng ta có + +42 +00:02:31,340 --> 00:02:34,130 +thể xem xét kỹ hơn và chúng ta có thể xem qua + +43 +00:02:34,400 --> 00:02:35,840 +biểu đồ đầy đủ tính năng. + +44 +00:02:36,560 --> 00:02:41,560 +Và điều này cho chúng ta thấy giá cổ phiếu Tesla trong những ngày qua. + +45 +00:02:45,410 --> 00:02:49,670 +Bây giờ tôi sẽ thay đổi múi giờ ở đây thành múi giờ + +46 +00:02:49,670 --> 00:02:54,170 +thực tế của sàn giao dịch. Và nếu tôi thay đổi chế độ xem thành chế + +47 +00:02:54,470 --> 00:02:58,730 +độ xem một ngày, thì bạn có thể thấy các điểm mà thị trường mở cửa và khi nó đóng cửa. + +48 +00:02:59,110 --> 00:03:03,010 +Vì vậy, những phần màu xanh này sẽ làm nổi bật khi thị trường đóng cửa. + +49 +00:03:03,730 --> 00:03:07,540 +Hiện tại là ngày 22 tháng bảy. Vì dữ liệu của ngày này + +50 +00:03:07,540 --> 00:03:11,550 +chưa hoàn chỉnh, chúng ta sẽ xem xét dữ liệu của ngày hôm trước. + +51 +00:03:11,580 --> 00:03:12,750 +Vì vậy, đây là ngày hôm qua. + +52 +00:03:13,320 --> 00:03:18,120 +Và bạn có thể thấy rằng NASDAQ mở cửa lúc 9:30 sáng theo giờ + +53 +00:03:18,180 --> 00:03:21,840 +New York và đóng cửa lúc 4:00 chiều cùng ngày. + +54 +00:03:22,410 --> 00:03:24,960 +Và thường thì khi bạn đang nhận dữ liệu về cổ + +55 +00:03:25,260 --> 00:03:30,060 +phiếu, bạn có thể nhận được giá của một cổ phiếu cụ thể tại thời điểm thị trường mở cửa và + +56 +00:03:30,300 --> 00:03:33,120 +khi thị trường đóng cửa. Ví dụ, chúng ta + +57 +00:03:33,120 --> 00:03:38,120 +có thể so sánh giá cổ phiếu Tesla tại thị trường đóng cửa ngày hôm qua. + +58 +00:03:38,610 --> 00:03:43,610 +Vì vậy, đó là khoảng $ 1,567 và tại thị trường đóng + +59 +00:03:45,560 --> 00:03:48,510 +cửa ngày hôm trước, tức là lúc + +60 +00:03:48,900 --> 00:03:53,900 +4 giờ ngày 20 tháng 7, và đó là khoảng $ 1,641. + +61 +00:03:54,120 --> 00:03:59,120 +Vì vậy, có sự khác biệt lớn giữa cuối ngày 20 tháng 7 và + +62 +00:03:59,490 --> 00:04:03,630 +cuối ngày 21 tháng 7. Là một nhà kinh doanh chứng khoán sẽ + +63 +00:04:03,630 --> 00:04:08,310 +khá quan tâm đến những biến động lớn này bởi vì nó có thể có nghĩa là chúng tôi muốn + +64 +00:04:08,340 --> 00:04:12,150 +mua nhiều hơn hoặc chúng tôi có thể muốn bán cổ phiếu của mình ở Tesla. + +65 +00:04:13,020 --> 00:04:14,910 +Khi bạn xem xét nhiều dịch vụ này, + +66 +00:04:14,940 --> 00:04:18,690 +có thể là thiết bị đầu cuối của Bloomberg hoặc thứ gì đó đơn giản hơn nhiều như + +67 +00:04:19,019 --> 00:04:21,930 +thế này, chúng cũng thường cung cấp cho bạn cả đống dữ liệu khác. + +68 +00:04:23,100 --> 00:04:28,100 +Một trong những điều hữu ích nhất thực sự là xem tin tức liên quan đến công + +69 +00:04:28,350 --> 00:04:32,340 +ty mà bạn đang điều tra. Vì vậy, ví dụ, + +70 +00:04:32,340 --> 00:04:34,740 +đây là những tiêu đề hiện tại + +71 +00:04:35,250 --> 00:04:39,990 +của Tesla, và nó đến từ nhiều nguồn tin tức khác nhau như + +72 +00:04:39,990 --> 00:04:44,850 +Reuters, Phố Wall hoặc Bloomberg của tôi. Và nó cung cấp cho chúng ta một số thông tin để bắt đầu phân tích. + +73 +00:04:44,850 --> 00:04:48,480 +Ví dụ, tại sao lại có sự sụt giảm lớn này, lý do là gì và có nhiều nguồn tin tức khác + +74 +00:04:48,990 --> 00:04:52,710 +nhau có thể cho chúng ta biết lý do tại sao. Ví dụ, có thể họ + +75 +00:04:52,710 --> 00:04:56,130 +đang gặp vấn đề với nhân viên phục vụ, hoặc có thể + +76 +00:04:56,220 --> 00:05:00,330 +như mẩu tin này cho thấy, cổ phiếu có thể sẽ tăng trở lại. + +77 +00:05:00,930 --> 00:05:02,850 +Vì vậy, đây là những điều thực + +78 +00:05:02,880 --> 00:05:05,820 +sự thú vị nếu chúng ta giao dịch cổ phiếu cụ thể này. + +79 +00:05:06,750 --> 00:05:10,350 +Nếu chúng ta tạo một chương trình Python để giúp chúng ta giao dịch cổ phiếu, thì đây + +80 +00:05:11,010 --> 00:05:14,010 +là cách nó có thể hoạt động. Đầu tiên, chúng tôi + +81 +00:05:14,160 --> 00:05:18,480 +sẽ kéo giá cổ phiếu của những cổ phiếu mà chúng tôi quan tâm. + +82 +00:05:18,900 --> 00:05:21,810 +Vì vậy, chúng tôi sẽ sử dụng một API để lấy dữ liệu này. + +83 +00:05:22,560 --> 00:05:26,460 +Và giả sử rằng chúng tôi đang theo dõi cổ phiếu Tesla vì chúng tôi đã mua một số cổ phiếu và chúng tôi + +84 +00:05:26,460 --> 00:05:29,400 +muốn biết nó hoạt động như thế nào. Chà, nó có thể + +85 +00:05:29,430 --> 00:05:34,430 +thu thập dữ liệu về giá cổ phiếu Tesla lúc thị trường đóng cửa. + +86 +00:05:35,220 --> 00:05:37,950 +Giả sử hôm nay là ngày 11 tháng 3. + +87 +00:05:38,250 --> 00:05:43,170 +Vì vậy, chúng tôi đang kéo giá đóng cửa của ngày hôm qua và giả sử, chẳng hạn, + +88 +00:05:43,320 --> 00:05:44,700 +nó là 1.000 đô la. + +89 +00:05:45,270 --> 00:05:49,320 +Bây giờ, điều tiếp theo mà chương trình của chúng tôi sẽ làm là nó + +90 +00:05:49,350 --> 00:05:52,020 +sẽ kéo giá đóng cửa vào ngày hôm trước. + +91 +00:05:52,530 --> 00:05:56,760 +Và chúng ta sẽ so sánh hai giá trị này. Vì vậy, trong suốt một ngày, sự + +92 +00:05:56,790 --> 00:05:59,300 +khác biệt là gì. Và trong trường hợp + +93 +00:05:59,360 --> 00:06:03,890 +này, có một sự khác biệt là một trăm đô la và hướng đi lên. + +94 +00:06:03,950 --> 00:06:08,720 +Vì vậy, nó đã tăng giá trị, phải không? Đi từ ngày 9 tháng 3 đến ngày 10 tháng 3. + +95 +00:06:08,960 --> 00:06:12,260 +Vì vậy, đó là tin tốt cho chúng tôi nếu chúng tôi mua vào. Bây giờ, chúng tôi cũng có + +96 +00:06:12,320 --> 00:06:16,910 +thể tính toán tỷ lệ phần trăm mà sự gia tăng này thể hiện là bao nhiêu. + +97 +00:06:16,940 --> 00:06:21,770 +Vì vậy, nếu chúng ta nhìn vào sự khác biệt một trăm đô la này và tính nó theo + +98 +00:06:21,770 --> 00:06:24,890 +phần trăm của giá đóng cửa ngày hôm qua, thì chúng + +99 +00:06:25,160 --> 00:06:30,160 +ta có thể thấy rằng giá vào ngày 9 tháng 3 thấp hơn 10% so với ngày 10 tháng 3. + +100 +00:06:31,340 --> 00:06:33,650 +Vì vậy, giả sử rằng trong chương trình Python + +101 +00:06:34,010 --> 00:06:37,550 +của chúng tôi, chúng tôi thiết lập chương trình chạy và lấy cho chúng + +102 +00:06:37,790 --> 00:06:42,530 +tôi một số tin tức bất cứ khi nào chúng tôi có mức tăng bất thường hoặc giảm bất thường. + +103 +00:06:42,920 --> 00:06:46,850 +Vì vậy, bạn có thể xác định đó là bất kỳ thứ gì bạn muốn, nhưng giả sử nó là 10%. + +104 +00:06:47,600 --> 00:06:52,400 +Nếu có sự khác biệt từ 10% trở lên giữa giá đóng cửa của ngày hôm qua và ngày + +105 +00:06:52,400 --> 00:06:55,040 +hôm trước, thì chúng tôi muốn biết về điều đó. + +106 +00:06:55,910 --> 00:07:00,470 +Vì vậy, chúng tôi sẽ lấy API của mình để lấy cho chúng tôi một số tin tức có liên quan. + +107 +00:07:01,070 --> 00:07:05,240 +Bằng cách đó, chúng ta có thể tìm ra đâu là lý do cho sự gia tăng này hoặc đâu là lý do + +108 +00:07:05,240 --> 00:07:06,350 +cho sự sụt giảm này. + +109 +00:07:06,860 --> 00:07:11,030 +Và mọi chuyện có thể diễn ra tốt đẹp vì Tesla đã tung ra một sản phẩm + +110 +00:07:11,360 --> 00:07:14,240 +mới hoặc vì họ đã mua lại một nhà máy mới. + +111 +00:07:14,480 --> 00:07:17,240 +Một số loại chỉ báo cho biết, tốt, công ty này + +112 +00:07:17,240 --> 00:07:20,630 +sẽ làm tốt hơn rất nhiều. Bây giờ, khi giá cổ + +113 +00:07:20,630 --> 00:07:25,630 +phiếu đã kích hoạt cảnh báo này và chúng tôi tìm nạp dữ liệu tin tức, sau đó + +114 +00:07:26,660 --> 00:07:29,660 +chúng tôi sẽ tự gửi cho mình một tin nhắn SMS. + +115 +00:07:29,930 --> 00:07:34,190 +Vì vậy, chúng tôi sẽ tự gửi cho mình một thông điệp cho chúng tôi biết biến động lớn đã + +116 +00:07:34,220 --> 00:07:39,220 +xảy ra là gì và tin tức liên quan là gì để chúng tôi có thể quyết định ở đó và sau đó + +117 +00:07:39,440 --> 00:07:41,780 +xem bạn muốn bán cổ phiếu của chúng tôi hay chúng + +118 +00:07:41,810 --> 00:07:42,950 +tôi muốn mua thêm. + +119 +00:07:43,730 --> 00:07:48,440 +Chúng tôi đang hướng tới các tin nhắn từ Twilio trông giống như thế này. + +120 +00:07:48,950 --> 00:07:49,610 +Bằng cách + +121 +00:07:49,610 --> 00:07:52,940 +đó, khi bạn thức dậy vào buổi sáng và bạn đang tự hỏi điều + +122 +00:07:52,940 --> 00:07:57,020 +gì đang xảy ra với cổ phiếu Tesla của tôi và nó chỉ xảy ra trong hai ngày + +123 +00:07:57,110 --> 00:07:59,510 +qua, nó đã trải qua những biến động lớn, sau + +124 +00:07:59,870 --> 00:08:04,870 +đó bạn sẽ nhận được các mẩu tin tức liên quan để giúp bạn quyết định và giúp bạn tìm ra những + +125 +00:08:05,270 --> 00:08:10,190 +gì bạn nên làm với các giao dịch của mình. Đó là mục tiêu. + +126 +00:08:10,430 --> 00:08:15,350 +Và phần tốt nhất của dự án này là thực tế là nó + +127 +00:08:15,350 --> 00:08:17,060 +sẽ phụ thuộc + +128 +00:08:18,190 --> 00:08:20,350 +chủ yếu vào cách bạn + +129 +00:08:20,650 --> 00:08:24,100 +tạo ra nó như thế nào. bạn muốn chọn + +130 +00:08:24,580 --> 00:08:29,020 +mức độ khó nào, bình thường, khó hay cực khó, bạn + +131 +00:08:29,020 --> 00:08:33,520 +có thể chọn dự án bắt đầu phù hợp với mình. + +132 +00:08:34,090 --> 00:08:35,710 +Khi bạn chọn dự án + +133 +00:08:35,740 --> 00:08:37,780 +bắt đầu, bạn sẽ xem xét từng + +134 +00:08:38,110 --> 00:08:42,280 +nhận xét và bạn sẽ thử hoàn thành chức năng của chương trình này. + +135 +00:08:42,940 --> 00:08:47,200 +Bây giờ tôi muốn bạn dành ít nhất từ nửa giờ đến 45 phút để làm + +136 +00:08:47,200 --> 00:08:51,580 +việc cho dự án này, chỉ vì nó có khá nhiều API mà bạn cần phải khai thác. + +137 +00:08:51,940 --> 00:08:53,440 +Và quan trọng nhất, + +138 +00:08:53,710 --> 00:08:58,440 +tôi muốn bạn tự đọc qua tài liệu API để bạn có thể hiểu + +139 +00:08:58,440 --> 00:09:02,820 +cách làm việc với nó và cách tự tìm hiểu mọi thứ. + +140 +00:09:03,210 --> 00:09:06,300 +Bởi vì suy cho cùng, có hàng triệu API ngoài kia và + +141 +00:09:06,420 --> 00:09:09,270 +nếu bạn cần nó cho một dự án đặc biệt của + +142 +00:09:09,570 --> 00:09:12,870 +riêng mình, bạn sẽ cần phải trải qua quá trình này mà tất + +143 +00:09:13,050 --> 00:09:18,050 +cả các nhà phát triển đều trải qua, đó là đào qua tài liệu và hiểu cách làm việc + +144 +00:09:18,240 --> 00:09:19,073 +với một + +145 +00:09:19,550 --> 00:09:21,350 +phần mềm bên ngoài 2: hoặc mã. + +146 +00:09:21,380 --> 00:09:25,700 +0: Đó là thử thách tôi đặt ra cho bạn. Truy cập tài nguyên khóa học ngay bây + +147 +00:09:25,700 --> 00:09:29,630 +giờ và lấy mã bắt đầu để bạn có thể bắt đầu làm việc với dự án. + +148 +00:09:29,750 --> 00:09:30,380 +Chúc may mắn. + diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 TSLA-Stock-Price.url b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 TSLA-Stock-Price.url new file mode 100644 index 0000000000000000000000000000000000000000..b6a0aeacaf205c763720da459ef234028eee0f28 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/001 TSLA-Stock-Price.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://uk.tradingview.com/symbols/NASDAQ-TSLA/ \ No newline at end of file diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Choose Your Destiny!.html b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Choose Your Destiny!.html new file mode 100644 index 0000000000000000000000000000000000000000..08358fdea8ef0c9507ab884a5ec5a127f154be02 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Choose Your Destiny!.html @@ -0,0 +1 @@ +

Head over to the course resources and download a project .zip file of your choice: Normal, Hard, or Extra Hard.

What follows are the solution and walkthrough videos to the steps outlined in the Normal difficulty track.

I'll see you on the other side.

\ No newline at end of file diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 News-API.url b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 News-API.url new file mode 100644 index 0000000000000000000000000000000000000000..a00867cc8b7b4ad7f22ba85fd5f8af684815f02c --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 News-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://newsapi.org/ \ No newline at end of file diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Stock-Price-API.url b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Stock-Price-API.url new file mode 100644 index 0000000000000000000000000000000000000000..49e9dac25c549705ed680a4b83a105266074b46f --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Stock-Price-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.alphavantage.co/ \ No newline at end of file diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Twilio-API.url b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Twilio-API.url new file mode 100644 index 0000000000000000000000000000000000000000..fd9ec02ca96c097f3bebb1ba1f2bc31917a499af --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 Twilio-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.twilio.com/ \ No newline at end of file diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-extrahard-start.zip b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-extrahard-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..e94cb0d838d456b9dd384666e9e59cfb4de6d70c --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-extrahard-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b9226b7368069db590827852758086ee9fefb06661ba4c36660a162a4d2f191 +size 3181 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-hard-start.zip b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-hard-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..f7c4db2fa2928e6f888a11d3bfb32db636df6ed5 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-hard-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9662cb66571c2bf5f9a4a96f40caf91f38e40699310ba9524d78be2c5574814f +size 3449 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-normal-start.zip b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-normal-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..d17127396cd2002f2830422b89d67fb003ab8429 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/002 stock-news-normal-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d49b3806fa12cfddb31ebec5f5caf7ed7864b11958ef83efa6a93db88df4697e +size 1317 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/003 Solution & Walkthrough for Step 1 - Check for Stock Price Movements.mp4 b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/003 Solution & Walkthrough for Step 1 - Check for Stock Price Movements.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..423b03fd6b30ab1a5a2233b8d76bb0afa01cfdaa --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/003 Solution & Walkthrough for Step 1 - Check for Stock Price Movements.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3af0d1e41604d738b1f6d7d7c501d9f25893c4d4995648164ad133557bc33ed1 +size 195247742 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/003 Solution & Walkthrough for Step 1 - Check for Stock Price Movements_vi.srt b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/003 Solution & Walkthrough for Step 1 - Check for Stock Price Movements_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0822b8374a3727d4d7e317a3a69f86f70f75f62d --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/003 Solution & Walkthrough for Step 1 - Check for Stock Price Movements_vi.srt @@ -0,0 +1,900 @@ +1 +00:00:00,180 --> 00:00:02,310 +Bây giờ tôi sẽ hướng dẫn bạn cách giải quyết. + +2 +00:00:02,790 --> 00:00:06,870 +Và tôi muốn đảm bảo rằng bạn đã thực sự thử điều này trước khi xem xét + +3 +00:00:06,870 --> 00:00:10,920 +giải pháp, bởi vì bạn có thể nhìn tôi gõ mã cả ngày và nó vẫn + +4 +00:00:10,950 --> 00:00:13,410 +không giúp bạn đạt được vị trí bạn muốn. + +5 +00:00:13,470 --> 00:00:16,530 +Vì vậy, hãy chắc chắn rằng bạn đã thực sự luyện tập và bạn đã đấu tranh. + +6 +00:00:16,890 --> 00:00:18,180 +Ngay cả khi bạn + +7 +00:00:18,300 --> 00:00:22,950 +gặp khó khăn, vẫn tốt hơn là chỉ xem video và xem mã được viết. + +8 +00:00:23,190 --> 00:00:27,210 +Bạn phải viết mã để có được khả năng viết mã tốt. Được rồi, đủ động + +9 +00:00:27,210 --> 00:00:28,260 +lực. + +10 +00:00:28,470 --> 00:00:33,470 +Bây giờ tôi sẽ lấy điểm xuất phát bình thường để + +11 +00:00:33,990 --> 00:00:38,640 +hướng dẫn bạn từng bước. Bây giờ, hãy để ý xem trong dự án bắt đầu, tôi đã bao gồm một loạt việc cần làm như thế nào. + +12 +00:00:39,060 --> 00:00:42,810 +Và một trong những điều thú vị về PyCharm là bạn có thể xem tất cả những + +13 +00:00:42,810 --> 00:00:47,220 +việc cần làm được tìm thấy trong tệp và bạn có thể xóa chúng khi kiểm tra, và sau đó bạn + +14 +00:00:47,460 --> 00:00:51,150 +sẽ có thể xem những gì còn lại. Và khi bạn nhấp vào nó, nó sẽ + +15 +00:00:51,150 --> 00:00:55,470 +đưa bạn trực tiếp đến vị trí của việc cần làm cụ thể đó, điều này thực sự rất gọn gàng. + +16 +00:00:56,040 --> 00:00:57,240 +Hãy bắt đầu từ đầu. + +17 +00:00:57,510 --> 00:01:02,510 +Chúng tôi muốn có thể sử dụng alphavantage. API của đồng để có được giá cổ phiếu + +18 +00:01:03,420 --> 00:01:07,020 +đóng cửa của ngày hôm qua. Vì vậy, đó là điều đầu tiên. + +19 +00:01:08,610 --> 00:01:13,260 +làm sao chúng ta làm việc đó bây giờ? Vâng, Alpha vantage là một API thị trường chứng khoán và + +20 +00:01:13,770 --> 00:01:16,680 +những gì chúng ta phải làm trước tiên là thiết lập một khóa API. + +21 +00:01:17,970 --> 00:01:22,500 +Bạn có thể chọn mình là sinh viên và sau đó chọn tổ chức của bạn nếu + +22 +00:01:23,280 --> 00:01:28,110 +bạn có và sau đó nhập email của bạn. Bây giờ, khi bạn đã điền vào biểu mẫu, bạn có + +23 +00:01:28,110 --> 00:01:29,550 +thể nhấp vào nhận khóa + +24 +00:01:29,940 --> 00:01:33,300 +API miễn phí và bạn sẽ thấy khóa API của mình hiển thị bên dưới. + +25 +00:01:33,900 --> 00:01:37,800 +Đảm bảo rằng bạn sao chép khóa API này và lưu nó trong dự án của mình. + +26 +00:01:38,310 --> 00:01:41,370 +Vì vậy, tôi sẽ đi đến đây và ngay + +27 +00:01:41,400 --> 00:01:46,400 +trên cùng, tôi sẽ thêm STOCK_API_KEY của mình dưới dạng một hằng số như thế này. + +28 +00:01:47,940 --> 00:01:48,390 +Bằng + +29 +00:01:48,390 --> 00:01:52,260 +cách đó, tôi sẽ không quên nó vì thực sự khá khó để điều hướng trở lại + +30 +00:01:52,590 --> 00:01:56,190 +trang này và lấy khóa API của bạn. Bây giờ, bước tiếp theo tất nhiên + +31 +00:01:56,190 --> 00:01:59,130 +là tìm hiểu tài liệu. Bây giờ, đối với những + +32 +00:01:59,130 --> 00:02:02,190 +người đã chọn phiên bản khó và cực kỳ khó, tôi + +33 +00:02:02,220 --> 00:02:06,510 +không thực sự chỉ cho bạn phần nào của tài liệu API là phù hợp nhất, + +34 +00:02:06,510 --> 00:02:10,440 +bởi vì tôi hy vọng rằng nếu bạn đã chọn thử thách cho mình, bạn + +35 +00:02:10,500 --> 00:02:14,850 +sẽ đánh giá cao việc có cơ hội tìm hiểu tất cả những thứ khác nhau mà + +36 +00:02:14,850 --> 00:02:18,180 +bạn có thể làm với API. Bây giờ, trong trường hợp của chúng + +37 +00:02:18,210 --> 00:02:20,400 +tôi, chúng tôi thực sự muốn là dữ liệu hàng ngày. + +38 +00:02:21,240 --> 00:02:24,720 +Vì vậy, API này sẽ trả về dữ liệu hàng ngày, + +39 +00:02:25,020 --> 00:02:29,790 +cung cấp cho chúng ta giá mở cửa, giá cao nhất trong ngày, giá thấp nhất + +40 +00:02:29,790 --> 00:02:33,210 +trong ngày và cũng là giá đóng cửa trong ngày mà + +41 +00:02:33,240 --> 00:02:37,470 +chúng ta chủ yếu quan tâm. Có một số tham số API được + +42 +00:02:37,470 --> 00:02:39,720 +yêu cầu; hàm trong trường hợp này là + +43 +00:02:39,870 --> 00:02:43,530 +một chuỗi thời gian hàng ngày và cũng là biểu tượng là tên + +44 +00:02:43,560 --> 00:02:47,370 +của số vốn bạn chọn. Trong trường hợp của chúng tôi, chúng tôi đã + +45 +00:02:47,400 --> 00:02:50,850 +xác định điều đó ở trên cùng. Đó là tên cổ phiếu ngay tại đây. + +46 +00:02:51,510 --> 00:02:56,370 +Vì vậy, hãy xem làm thế nào chúng ta có thể lấy giá cổ phiếu đóng cửa của ngày hôm qua. Để bắt đầu, tất nhiên chúng ta + +47 +00:02:56,370 --> 00:02:59,220 +cần mô-đun yêu cầu đáng tin cậy của mình. + +48 +00:03:01,120 --> 00:03:03,010 +Và bằng cách sử + +49 +00:03:03,040 --> 00:03:08,040 +dụng các yêu cầu, chúng tôi sẽ tìm nạp từ điểm cuối chứng khoán. + +50 +00:03:08,860 --> 00:03:10,960 +Vì vậy, bạn có thể thấy rằng + +51 +00:03:11,020 --> 00:03:15,970 +trong ví dụ của họ, điểm kết thúc là mọi thứ tùy thuộc vào và không bao + +52 +00:03:15,970 --> 00:03:18,670 +gồm dấu chấm hỏi. Điều này chắc hẳn đã khá quen + +53 +00:03:18,760 --> 00:03:22,600 +thuộc với bạn, nhưng bạn cũng có thể chỉ cần nhập đơn giản một cái mà tôi đã đưa vào. + +54 +00:03:22,720 --> 00:03:27,610 +Điểm cuối cổ phiếu này. Bây giờ, tiếp theo, chúng ta sẽ cần thêm một số tham số. + +55 +00:03:27,790 --> 00:03:32,790 +Vì vậy, hãy tạo một cái gì đó gọi là stock_params của chúng tôi và hãy xem những gì + +56 +00:03:33,190 --> 00:03:35,920 +chúng tôi cần thêm. Vì vậy, chúng ta phải thêm + +57 +00:03:36,220 --> 00:03:39,640 +chức năng bằng chuỗi thời gian hàng ngày. Tôi sẽ sao chép nó để không + +58 +00:03:39,640 --> 00:03:41,020 +mắc lỗi chính tả. + +59 +00:03:41,560 --> 00:03:46,560 +Vì vậy, hãy tạo một từ điển Python và đây sẽ là khóa và giá trị. + +60 +00:03:47,710 --> 00:03:48,160 +Tiếp + +61 +00:03:48,160 --> 00:03:52,870 +theo, chúng ta phải thêm ký hiệu của mình và đó sẽ là tên của cổ phiếu hoặc vốn chủ sở + +62 +00:03:52,870 --> 00:03:53,703 +hữu của chúng ta. + +63 +00:03:55,780 --> 00:03:59,830 +Ký hiệu, trong trường hợp này, đơn giản sẽ là tên cổ phiếu TSLA + +64 +00:04:00,210 --> 00:04:01,043 +1: Đúng. + +65 +00:04:03,420 --> 00:04:07,500 +0: Và các ký hiệu chứng khoán có xu hướng có số lượng tối đa là bốn chữ cái. + +66 +00:04:07,500 --> 00:04:12,500 +Vì vậy, đó là lý do tại sao bạn thấy nó được viết tắt như Snap cho Snapchat hoặc TSLA cho Tesla. + +67 +00:04:14,220 --> 00:04:17,790 +Bây giờ, tham số bắt buộc cuối cùng là khóa API của chúng tôi. + +68 +00:04:18,300 --> 00:04:22,800 +Toàn bộ sự việc sẽ không hoạt động trừ khi chúng tôi xác thực bản thân bằng cách sử + +69 +00:04:22,800 --> 00:04:24,420 +dụng khóa API mà chúng tôi + +70 +00:04:24,690 --> 00:04:27,810 +nhận được ngay bây giờ, được lưu dưới dạng STOCK_API_KEY của chúng tôi. + +71 +00:04:28,860 --> 00:04:33,270 +Bây giờ chúng ta đã có tất cả ba tham số trong đó, tốt, chúng ta có thể thêm nó + +72 +00:04:33,270 --> 00:04:37,170 +vào phương thức yêu cầu của mình và nó sẽ chỉ thêm nó dưới dạng stock_params. + +73 +00:04:37,710 --> 00:04:42,710 +Bây giờ hãy lưu nó dưới dạng phản hồi và hãy in ra phản hồi thực sự + +74 +00:04:43,680 --> 00:04:47,040 +trông như thế nào khi nó ở định dạng JSON. + +75 +00:04:48,420 --> 00:04:53,400 +Vì vậy, hãy chạy mã này và tôi gặp lỗi thông báo lỗi + +76 +00:04:53,490 --> 00:04:57,390 +thụt lề không mong muốn. Và đó là bởi vì stock_params + +77 +00:04:57,390 --> 00:05:02,390 +của tôi ở đây thực sự phải nằm trong cùng một thụt đầu dòng với điểm + +78 +00:05:04,950 --> 00:05:08,400 +bắt đầu như thế này. Vì vậy, hãy cẩn thận rằng khi + +79 +00:05:08,400 --> 00:05:12,540 +bạn có việc cần làm, mọi dòng bạn bắt đầu sau đó cũng sẽ bị + +80 +00:05:12,540 --> 00:05:13,373 +thụt vào. + +81 +00:05:13,920 --> 00:05:18,920 +Vì vậy, nó có thể hữu ích để chỉ cần hợp nhất mọi thứ để chúng sẽ bắt đầu + +82 +00:05:19,260 --> 00:05:22,530 +ở mức lề ở đây. Vì vậy, chúng ta hãy thử lại. + +83 +00:05:25,140 --> 00:05:28,800 +Và lần này có vẻ như chúng tôi đang lấy lại dữ liệu + +84 +00:05:28,800 --> 00:05:33,030 +thực tế ở định dạng JSON. Hãy xem nó bằng trình xem JSON của chúng tôi. + +85 +00:05:34,830 --> 00:05:36,870 +Bạn có thể thấy rằng chúng tôi có một số siêu dữ + +86 +00:05:36,900 --> 00:05:41,880 +liệu về cơ bản chỉ mô tả những gì chúng tôi đã nói với API. Ví dụ: chúng tôi + +87 +00:05:41,880 --> 00:05:46,880 +muốn biểu tượng Tesla và chúng tôi muốn giá hàng ngày. + +88 +00:05:47,370 --> 00:05:51,660 +Nhưng những gì chúng tôi thực sự quan tâm là dữ liệu hàng ngày của chuỗi thời gian. + +89 +00:05:52,110 --> 00:05:56,280 +Vì vậy, bạn có thể thấy nó cung cấp cho chúng tôi dữ liệu cho tất cả các ngày trước hôm nay. + +90 +00:05:56,400 --> 00:05:58,640 +Vì vậy, hiện tại là ngày 22 tháng 7, vì vậy chúng tôi có + +91 +00:05:58,940 --> 00:06:03,940 +thể xem dữ liệu đầy đủ cho ngày 21 tháng 7 và ngày 20 tháng 7. Hiện tại, điều chúng tôi + +92 +00:06:05,090 --> 00:06:09,590 +quan tâm là giá cổ phiếu đóng cửa ngày hôm qua. + +93 +00:06:10,190 --> 00:06:14,600 +Vì vậy, đây là ngày hôm qua và đây là giá cổ phiếu đóng cửa. + +94 +00:06:14,930 --> 00:06:19,130 +Vì vậy, nó là 1,568. Làm thế nào để chúng tôi nắm bắt nó? Chà, chúng ta phải + +95 +00:06:19,130 --> 00:06:22,970 +thực hiện qua một số phím để đạt được giá trị + +96 +00:06:22,970 --> 00:06:25,130 +cụ thể này. Đầu tiên, chúng + +97 +00:06:25,160 --> 00:06:30,160 +ta cần vượt qua chuỗi thời gian của mình hàng ngày và để ý xem điều này + +98 +00:06:30,830 --> 00:06:35,810 +có dấu ngoặc và mọi thứ như thế nào. Chúng ta phải bao gồm tất cả các khoảng trắng, tất cả các dấu ngoặc trong khóa của chúng ta. + +99 +00:06:36,380 --> 00:06:40,880 +Giả sử rằng dữ liệu của chúng tôi bằng với phản hồi. + +100 +00:06:40,910 --> 00:06:44,870 +json, hãy tiếp tục và thêm một dấu ngoặc vuông, và sau đó chúng + +101 +00:06:45,170 --> 00:06:47,270 +ta có thể cung cấp khóa + +102 +00:06:47,660 --> 00:06:50,600 +mà tôi thực sự sẽ sao chép từ dưới đây. + +103 +00:06:51,440 --> 00:06:53,510 +Vì vậy, tôi không mắc lỗi chính tả + +104 +00:06:53,540 --> 00:06:58,190 +nào và đảm bảo rằng tôi giữ nguyên tất cả các khoảng trắng và tất cả các ký hiệu. + +105 +00:06:58,430 --> 00:07:03,430 +Vì vậy, về cơ bản mọi thứ ở giữa dấu ngoặc kép như thế này. + +106 +00:07:04,220 --> 00:07:06,680 +Bây giờ, nếu chúng tôi in dữ liệu của mình, + +107 +00:07:07,910 --> 00:07:11,480 +bạn có thể thấy nó được đưa vào từ điển cụ thể đó và nó hiện + +108 +00:07:11,810 --> 00:07:16,730 +cung cấp cho chúng tôi tất cả dữ liệu này. Nhưng đây không phải là một danh sách. + +109 +00:07:16,790 --> 00:07:20,390 +Như bạn có thể thấy, dữ liệu bắt đầu bằng một dấu ngoặc nhọn. Trên thực tế, đó là + +110 +00:07:20,390 --> 00:07:24,260 +một cuốn từ điển thực sự lớn với chìa khóa là ngày tháng. + +111 +00:07:25,670 --> 00:07:28,940 +Bây giờ, mặc dù tôi có thể khai thác dữ liệu + +112 +00:07:28,970 --> 00:07:32,390 +của ngày hôm qua chỉ bằng cách cung cấp điều này làm + +113 +00:07:32,780 --> 00:07:36,740 +chìa khóa, nhưng điều này sẽ được mã hóa khá khó khăn vì một khi + +114 +00:07:36,740 --> 00:07:41,450 +tôi đến ngày mai khi nó trở thành ngày 23, thì ngày hôm qua sẽ thay đổi. + +115 +00:07:41,960 --> 00:07:46,960 +Vì vậy, chúng tôi phải tìm ra một cách khác để nắm giữ giá trị đầu tiên đó. + +116 +00:07:47,960 --> 00:07:52,960 +Làm thế nào về việc biến từ điển lớn này thành một danh sách mà chúng tôi nhận được từng + +117 +00:07:55,940 --> 00:08:00,940 +phần dữ liệu được liên kết với mỗi khóa? Để làm được điều đó, chúng ta sẽ cần + +118 +00:08:01,070 --> 00:08:03,380 +phải hiểu một chút về danh sách. + +119 +00:08:03,770 --> 00:08:05,810 +Vì vậy, tôi sẽ tạo một biến có tên + +120 +00:08:06,020 --> 00:08:09,650 +là data_list và sau đó tôi sẽ sử dụng các từ khóa hiểu danh sách của mình. + +121 +00:08:09,650 --> 00:08:12,860 +Vì vậy, chúng tôi đã liệt kê các kiến thức dễ hiểu một thời gian trước, + +122 +00:08:12,890 --> 00:08:16,280 +nhưng đây có thể là thời điểm tốt để nhắc nhở bản thân về cách sử dụng nó. + +123 +00:08:17,060 --> 00:08:21,200 +Nó sẽ là mục mới cho mục trong danh sách. + +124 +00:08:21,680 --> 00:08:25,670 +Danh sách của chúng tôi thực sự không phải là danh sách. Trên thực tế, nó là một cuốn từ điển. + +125 +00:08:26,120 --> 00:08:29,960 +Vì vậy, chúng ta sẽ khai thác dữ liệu của mình, đó là từ + +126 +00:08:30,350 --> 00:08:33,860 +điển và chúng ta sẽ gọi phương thức items trên đó. + +127 +00:08:34,490 --> 00:08:37,549 +Và điều này sẽ không chỉ cung cấp cho chúng ta mặt + +128 +00:08:37,640 --> 00:08:40,250 +hàng, mà còn là chìa khóa và giá trị. + +129 +00:08:40,730 --> 00:08:45,080 +Vì vậy, chúng tôi thực sự chỉ quan tâm đến các giá trị. Vì vậy, chúng ta có thể đưa + +130 +00:08:45,440 --> 00:08:50,440 +nó vào đây để mỗi mục trong danh sách mới này chỉ bao gồm các giá trị + +131 +00:08:51,290 --> 00:08:54,830 +chứ không phải các khóa. Bây giờ, nếu tôi in danh sách dữ liệu + +132 +00:08:56,340 --> 00:09:00,510 +này, bạn có thể thấy bây giờ tôi đã có một danh sách được biểu thị bằng dấu ngoặc vuông và mỗi mục + +133 +00:09:00,900 --> 00:09:05,900 +trong danh sách là một từ điển với dữ liệu của mỗi ngày. Bằng cách sử dụng đó, tôi có thể nắm giữ + +134 +00:09:08,850 --> 00:09:10,110 +dữ liệu của ngày hôm + +135 +00:09:10,110 --> 00:09:15,110 +qua bằng cách chỉ cần chạm vào danh sách dữ liệu của chúng tôi và nhận đối tượng ở chỉ số 0. + +136 +00:09:17,280 --> 00:09:19,410 +Bây giờ, khi tôi đã có dữ liệu + +137 +00:09:19,470 --> 00:09:24,470 +của ngày hôm qua, thì việc lấy giá đóng cửa của ngày hôm qua khá đơn giản, bởi vì điều đó + +138 +00:09:26,640 --> 00:09:31,320 +đơn giản được lưu trữ trong khóa cụ thể này. Bây giờ một lần nữa, hãy chú + +139 +00:09:31,350 --> 00:09:36,060 +ý toàn bộ chìa khóa này như thế nào. Đó là mọi thứ nằm giữa dấu ngoặc + +140 +00:09:36,060 --> 00:09:39,420 +kép, bao gồm số và dấu chấm và tất cả những thứ đó. + +141 +00:09:39,810 --> 00:09:43,380 +Vì vậy, đây là một cách hơi kỳ lạ để định dạng các phím của bạn, thành thật mà nói. + +142 +00:09:43,440 --> 00:09:47,610 +Tôi chưa thấy nhiều API làm điều này vì hơi khó hiểu khi có + +143 +00:09:47,610 --> 00:09:50,760 +khoảng trắng, dấu chấm và số, nhưng đó chỉ là cách + +144 +00:09:50,970 --> 00:09:53,370 +mà họ quyết định làm điều đó. + +145 +00:09:53,400 --> 00:09:56,130 +Vì vậy, để có được giá đóng cửa, chúng + +146 +00:09:56,160 --> 00:10:01,140 +ta có thể khai thác dữ liệu của ngày hôm qua, thêm một bộ dấu ngoặc + +147 +00:10:01,140 --> 00:10:05,880 +vuông, chuyển vào khóa cụ thể này. Vì vậy, bây giờ nếu chúng tôi in ra giá đóng + +148 +00:10:06,000 --> 00:10:11,000 +cửa của ngày hôm qua, bạn có thể thấy chúng tôi đã thu hẹp mức giá chính xác của cổ phiếu Tesla khi đóng + +149 +00:10:11,730 --> 00:10:13,110 +cửa thị trường ngày hôm qua. + +150 +00:10:15,230 --> 00:10:15,680 +2: Đúng không? + +151 +00:10:15,680 --> 00:10:19,670 +0: Việc cần làm số một đã hoàn thành. Chúng tôi có thể xóa việc cần làm. + +152 +00:10:20,570 --> 00:10:20,960 +Bây + +153 +00:10:20,960 --> 00:10:25,910 +giờ, việc tiếp theo là lấy ngày trước giá cổ phiếu đóng cửa của ngày hôm qua. + +154 +00:10:26,270 --> 00:10:28,670 +Vì vậy, bây giờ chúng tôi đã + +155 +00:10:28,760 --> 00:10:33,760 +thực sự có danh sách dữ liệu này, khá đơn giản để làm điều đó; + +156 +00:10:34,490 --> 00:10:39,490 +Dữ liệu ngày_bé trước_hôm qua_ sẽ bằng với danh sách dữ liệu ở chỉ mục + +157 +00:10:40,190 --> 00:10:44,840 +một vì hãy nhớ mọi thứ trong danh sách được sắp xếp ngược lại + +158 +00:10:44,840 --> 00:10:48,650 +so với ngày hôm nay. Vì vậy, đó sẽ là ngày trước dữ liệu của ngày hôm qua. + +159 +00:10:51,380 --> 00:10:54,830 +Và sau đó một ngày trước giá đóng cửa của ngày hôm qua, chúng ta có + +160 +00:10:54,890 --> 00:10:56,420 +thể tìm nạp điều đó theo + +161 +00:10:56,420 --> 00:11:00,380 +cách tương tự bằng cách chuyển vào khóa 4 đó. không gian đóng. + +162 +00:11:01,130 --> 00:11:03,200 +Và chỉ để xác nhận mọi + +163 +00:11:03,260 --> 00:11:05,960 +thứ hoạt động, hãy in ra cả hai giá đóng + +164 +00:11:06,260 --> 00:11:10,790 +cửa để bạn có thể thấy rằng ngày hôm qua nó đã đóng cửa ở mức 1.568 + +165 +00:11:11,120 --> 00:11:14,780 +đô la và ngày hôm trước nó đóng cửa ở mức 1.643 đô la. + +166 +00:11:15,020 --> 00:11:18,740 +Vì vậy, đó thực sự là một mức giảm khá lớn, gần một trăm đô la. + +167 +00:11:20,600 --> 00:11:22,580 +Việc cần làm số hai đã xong. + +168 +00:11:22,580 --> 00:11:27,580 +Chúng tôi đã cố gắng để có được một ngày trước giá cổ phiếu đóng cửa của ngày hôm qua. Việc cần làm số ba liên quan đến việc + +169 +00:11:27,980 --> 00:11:28,813 +tìm ra + +170 +00:11:28,940 --> 00:11:33,050 +sự khác biệt dương giữa bước một và bước hai, do đó, giá đóng cửa + +171 +00:11:33,350 --> 00:11:37,370 +của ngày hôm qua và ngày trước giá đóng cửa của ngày hôm qua. + +172 +00:11:38,090 --> 00:11:39,320 +Và nó cho chúng ta một gợi ý. + +173 +00:11:40,790 --> 00:11:44,360 +Bây giờ gợi ý sẽ đưa chúng ta đến hàm abs trong Python, mà chúng + +174 +00:11:44,450 --> 00:11:46,220 +ta cũng đã thấy trước đây. + +175 +00:11:46,880 --> 00:11:50,300 +Đó là một hàm trả về giá trị tuyệt đối của một số. + +176 +00:11:50,300 --> 00:11:54,700 +Vì vậy, về cơ bản nó chỉ loại bỏ bất kỳ dấu hiệu tiêu cực nào ở phía trước một số. + +177 +00:11:55,630 --> 00:11:59,860 +Và đây là những gì chúng ta cần để hoàn thành việc cần làm số ba. + +178 +00:11:59,880 --> 00:12:00,713 +2: Đúng không? + +179 +00:12:02,130 --> 00:12:07,130 +0: Chênh lệch sẽ là giá đóng cửa của ngày hôm qua trừ đi của ngày trước giá + +180 +00:12:08,670 --> 00:12:12,180 +đóng cửa của ngày hôm qua. Bây giờ, vì hai chuỗi + +181 +00:12:12,240 --> 00:12:16,800 +này là chuỗi, nếu chúng tôi thực sự chạy mã ngay bây giờ, + +182 +00:12:16,830 --> 00:12:18,510 +bạn sẽ gặp lỗi. + +183 +00:12:19,380 --> 00:12:23,310 +Và lỗi cho bạn biết rằng bạn không thể trừ giữa một chuỗi và một chuỗi. + +184 +00:12:23,910 --> 00:12:26,250 +Chúng ta biết rằng những con số này trông giống + +185 +00:12:26,310 --> 00:12:31,310 +như thế này, vì vậy chúng ta có thể dễ dàng chuyển đổi chúng thành một số dấu phẩy động chỉ + +186 +00:12:31,350 --> 00:12:35,850 +bằng cách gói hàm float xung quanh chúng. Nếu chúng tôi in nó ra, + +187 +00:12:35,880 --> 00:12:39,960 +bạn có thể thấy rằng nó thực sự sẽ là một số âm. + +188 +00:12:40,500 --> 00:12:42,780 +Và lý do là vì đây là giá của ngày hôm + +189 +00:12:42,810 --> 00:12:44,940 +qua, đây là ngày trước giá của ngày hôm qua. + +190 +00:12:45,330 --> 00:12:48,660 +Giá thực sự đã giảm $ 74. + +191 +00:12:49,290 --> 00:12:53,700 +Điều gì sẽ xảy ra nếu chúng ta muốn nhận được sự khác biệt dương giữa một và hai? + +192 +00:12:55,770 --> 00:13:01,050 +Đây là nơi mà hàm abs hoặc giá trị tuyệt đối có ích. + +193 +00:13:01,260 --> 00:13:05,490 +Nếu chúng ta quấn tất cả những điều đó xung quanh hàm tuyệt đối, thì bây giờ, nếu tôi + +194 +00:13:05,640 --> 00:13:08,970 +chạy nó, bạn có thể thấy chúng tôi đang nhận một giá trị dương. + +195 +00:13:10,590 --> 00:13:12,600 +Bây giờ bước ba đã hoàn thành. + +196 +00:13:12,720 --> 00:13:17,370 +Chúng tôi đã tìm thấy sự khác biệt dương giữa giá đóng cửa của ngày hôm qua và ngày + +197 +00:13:17,370 --> 00:13:19,470 +trước giá đóng cửa của ngày hôm qua. + +198 +00:13:20,610 --> 00:13:22,770 +Bây giờ chúng ta hãy giải quyết bước số bốn. + +199 +00:13:23,400 --> 00:13:27,570 +Chúng tôi muốn tính toán phần trăm chênh lệch giá giữa + +200 +00:13:27,570 --> 00:13:31,980 +giá đóng cửa ngày hôm qua và giá đóng cửa ngày hôm trước. + +201 +00:13:33,390 --> 00:13:38,390 +Diff_percent sẽ là mức chênh lệch chia cho giá đóng cửa ngày hôm + +202 +00:13:40,920 --> 00:13:41,753 +qua. + +203 +00:13:43,830 --> 00:13:46,860 +Và để biến nó thành một tỷ lệ phần trăm, chúng + +204 +00:13:46,920 --> 00:13:51,210 +ta sẽ phải nhân nó với 100. Nhưng một lần nữa, hãy lưu ý + +205 +00:13:51,240 --> 00:13:56,040 +rằng đây là một số dấu phẩy động vì nó đã được tính toán ở đây, + +206 +00:13:56,370 --> 00:13:58,290 +nhưng đây vẫn là chuỗi. + +207 +00:13:58,770 --> 00:14:02,670 +Vì vậy, chúng ta sẽ phải biến nó thành một phao để tính toán + +208 +00:14:02,670 --> 00:14:06,510 +này thực sự được thực hiện. Và một khi nó làm được điều đó, chúng tôi sẽ in nó ra. + +209 +00:14:08,370 --> 00:14:12,870 +Chúng tôi có khoảng 4. 75% chênh lệch. + +210 +00:14:14,220 --> 00:14:17,700 +Bây giờ chúng ta có thể giải quyết việc cần làm số + +211 +00:14:18,150 --> 00:14:22,350 +năm, đó là nếu tỷ lệ phần trăm ở đây lớn hơn năm, thì + +212 +00:14:22,680 --> 00:14:27,600 +chúng ta sẽ in lấy tin tức. Điều này khá đơn giản. + +213 +00:14:27,630 --> 00:14:31,650 +Tất cả những gì chúng ta phải làm là kiểm tra xem diff_percent có lớn hơn năm hay không, + +214 +00:14:32,130 --> 00:14:36,810 +trong trường hợp đó chúng ta sẽ in lấy tin tức. Hiện tại, tùy thuộc vào thời + +215 +00:14:36,810 --> 00:14:39,630 +điểm bạn hoàn thành dự án này, + +216 +00:14:39,960 --> 00:14:43,290 +giá cổ phiếu của Tesla có thể không + +217 +00:14:43,320 --> 00:14:47,880 +chênh lệch quá 5. Bởi vì để tiếp tục kiểm tra mã của chúng tôi, + +218 +00:14:47,910 --> 00:14:50,670 +chúng tôi sẽ cần điều này thành sự thật, sau đó chúng tôi + +219 +00:14:51,110 --> 00:14:54,530 +có thể thay đổi số này thành một số nhỏ hơn, để chúng tôi thực sự + +220 +00:14:54,560 --> 00:14:57,890 +có thể làm cho nó hoạt động. Vì vậy, trường hợp của tôi, + +221 +00:14:57,890 --> 00:15:02,150 +sự khác biệt là 4. 75. Vì vậy, tôi thực sự sẽ chỉ thay đổi điều này xuống còn 4. + +222 +00:15:04,130 --> 00:15:06,380 +Và bây giờ nếu tôi chạy tất cả những + +223 +00:15:06,710 --> 00:15:09,680 +điều này, thì bạn có thể thấy nó sẽ in lấy tin tức. + +224 +00:15:10,190 --> 00:15:12,350 +Vì vậy, đó là những gì chúng ta sẽ làm trong bài + +225 +00:15:12,620 --> 00:15:14,450 +học tiếp theo trong phần thứ hai của giải pháp. + diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/004 Solution & Walkthrough for Step 2 - Get the News Articles.mp4 b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/004 Solution & Walkthrough for Step 2 - Get the News Articles.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..139ce7789699b1f057e8379ceabf39e002e9270a --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/004 Solution & Walkthrough for Step 2 - Get the News Articles.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1624bea15826c763f8dccd34afe4016871503191b6254e3f38de1ade923d766c +size 110853788 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/004 Solution & Walkthrough for Step 2 - Get the News Articles_vi.srt b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/004 Solution & Walkthrough for Step 2 - Get the News Articles_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ac4396966e69ab64ca1467858c0d63ef5b0fc5ce --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/004 Solution & Walkthrough for Step 2 - Get the News Articles_vi.srt @@ -0,0 +1,404 @@ +1 +00:00:00,420 --> 00:00:02,310 +Trong phần đầu tiên của giải pháp, + +2 +00:00:02,340 --> 00:00:07,340 +chúng tôi đã quản lý để lấy mã của mình để lấy dữ liệu cổ phiếu trực tiếp cho tên cổ + +3 +00:00:08,180 --> 00:00:09,020 +phiếu đã chọn. + +4 +00:00:09,740 --> 00:00:14,270 +Và sau đó chúng tôi xem xét sự khác biệt về giá giữa ngày hôm qua và + +5 +00:00:14,270 --> 00:00:18,140 +ngày hôm kia và sau đó chúng tôi tính ra phần trăm chênh lệch. + +6 +00:00:18,920 --> 00:00:22,760 +Bây giờ chúng ta có câu lệnh if này sẽ in ra tin + +7 +00:00:23,090 --> 00:00:27,560 +tức nếu chênh lệch tỷ lệ phần trăm lớn hơn một số tiền được chỉ định. + +8 +00:00:28,130 --> 00:00:31,760 +Bây giờ, tôi đã đặt đúng năm ở đây, chỉ vì lý tưởng, nếu bạn + +9 +00:00:31,820 --> 00:00:33,980 +đang theo dõi một cổ phiếu cụ + +10 +00:00:34,220 --> 00:00:37,880 +thể, bạn có thể chỉ quan tâm nếu nó thay đổi một lượng lớn, chẳng + +11 +00:00:37,880 --> 00:00:42,800 +hạn như 5 hoặc 10 hoặc 50% do bạn đặt. Nhưng hiện tại, vì chúng tôi đang + +12 +00:00:42,800 --> 00:00:47,780 +thử nghiệm những điều này và cổ phiếu Tesla chỉ dao động một phần trăm, nên + +13 +00:00:47,780 --> 00:00:51,710 +điều này thực sự sẽ không bao giờ trở thành sự thật. + +14 +00:00:51,800 --> 00:00:56,030 +Vì vậy, tôi sẽ điều chỉnh thủ công điều này để chúng tôi có thể tiếp tục + +15 +00:00:56,030 --> 00:01:00,770 +làm việc với phần còn lại của thử thách. Vì vậy, bây giờ chuyển sang bước hai + +16 +00:01:00,920 --> 00:01:04,459 +của thử thách, phần đầu tiên là thay vì in lấy tin + +17 +00:01:04,670 --> 00:01:08,960 +tức, chúng ta sẽ sử dụng API tin tức để nhận các bài báo liên + +18 +00:01:08,960 --> 00:01:13,820 +quan đến tên công ty. API tin tức là newsapi. tổ chức. + +19 +00:01:14,540 --> 00:01:17,780 +Và chúng ta có thể bắt đầu bằng cách nắm giữ một khóa API. + +20 +00:01:18,590 --> 00:01:21,740 +Sau khi đăng ký, bạn sẽ nhận được khóa API miễn + +21 +00:01:21,860 --> 00:01:25,580 +phí và chúng tôi sẽ dán khóa đó vào dự án của mình. + +22 +00:01:27,500 --> 00:01:31,550 +Bây giờ chúng ta có thể bắt đầu xem qua tài liệu và xem cách chúng ta có thể + +23 +00:01:31,550 --> 00:01:32,990 +sử dụng API tin tức này. + +24 +00:01:34,010 --> 00:01:39,010 +Có một số điểm cuối như chúng ta có thể thấy. Có những tiêu đề hàng đầu và cũng có + +25 +00:01:39,170 --> 00:01:41,810 +tất cả mọi thứ. Đây là hai điểm cuối chính. + +26 +00:01:42,470 --> 00:01:46,250 +Giờ đây, mọi thứ đều tốt hơn cho việc khám phá bài viết + +27 +00:01:46,700 --> 00:01:50,990 +trong khi các tiêu đề có xu hướng chỉ có một số tiêu đề hạn chế. + +28 +00:01:51,530 --> 00:01:53,300 +Tôi đã thử nghiệm cả hai + +29 +00:01:53,360 --> 00:01:58,360 +điều này và tôi nhận thấy rằng mọi thứ có nhiều khả năng cung cấp cho chúng tôi tin tức + +30 +00:01:58,670 --> 00:02:03,260 +về các cổ phiếu mà chúng tôi đang tìm kiếm. Bởi vì thường rất nhiều công ty này và + +31 +00:02:03,260 --> 00:02:06,530 +cổ phiếu của họ không thực sự trở thành tiêu đề trong ngày. + +32 +00:02:07,190 --> 00:02:12,170 +Vì vậy, đây là những gì truy vấn trông như thế nào, đây là điểm kết + +33 +00:02:12,230 --> 00:02:16,730 +thúc và đây là các tham số. Bây giờ, nếu chúng ta cuộn xuống, + +34 +00:02:16,760 --> 00:02:20,330 +chúng ta có thể thấy một số tham số yêu cầu; q là + +35 +00:02:20,330 --> 00:02:25,330 +từ khóa hoặc cụm từ giống nhau trong tiêu đề và nội dung bài viết, qIn Title + +36 +00:02:25,760 --> 00:02:29,210 +chỉ để tìm kiếm trong tiêu đề và sau đó bạn có + +37 +00:02:29,720 --> 00:02:32,420 +thể giới hạn các nguồn hoặc tên miền mà + +38 +00:02:32,420 --> 00:02:35,570 +bạn muốn tìm kiếm hoặc loại trừ các trang web nhất + +39 +00:02:35,930 --> 00:02:39,200 +định và bạn cũng có thể chỉ định ngày, giờ, ngôn + +40 +00:02:39,530 --> 00:02:43,550 +ngữ và một số thứ khác. Bây giờ, tham số bắt buộc duy nhất + +41 +00:02:43,880 --> 00:02:47,780 +thực sự là khóa API này. Bây giờ, ngoài ra, chúng tôi + +42 +00:02:47,810 --> 00:02:51,500 +có thể sẽ muốn sử dụng một trong các tham số yêu cầu này. + +43 +00:02:52,250 --> 00:02:57,050 +Có rất nhiều cổ phiếu được đưa vào các bài báo phân tích này. + +44 +00:02:57,410 --> 00:03:01,420 +Vì vậy, tôi nghĩ sẽ cụ thể hơn nếu chúng ta thực sự có thể kiểm tra tiêu đề + +45 +00:03:01,420 --> 00:03:03,730 +của bài báo cho tên công ty của chúng tôi. + +46 +00:03:04,600 --> 00:03:08,680 +Vì vậy, hãy bắt đầu sử dụng API này. Ở đây, chúng tôi thực sự + +47 +00:03:08,680 --> 00:03:10,840 +đã có điểm cuối tin tức và + +48 +00:03:11,770 --> 00:03:15,010 +chúng tôi sẽ xóa bản in này và chúng tôi + +49 +00:03:15,400 --> 00:03:20,400 +sẽ sử dụng thư viện yêu cầu để nắm giữ một số dữ liệu từ điểm + +50 +00:03:21,550 --> 00:03:22,383 +cuối đó. + +51 +00:03:23,920 --> 00:03:28,920 +Và sau đó chúng tôi sẽ thêm các thông số của chúng tôi. Các thông số mới của chúng tôi trước hết sẽ chứa khóa + +52 +00:03:29,950 --> 00:03:34,950 +API của chúng tôi và để ý cách đánh vần của nó. Khi bạn đang sử dụng các tham số, + +53 +00:03:36,400 --> 00:03:40,840 +bạn phải đảm bảo rằng mọi cách viết hoa hoặc chính tả phải khớp chính xác + +54 +00:03:40,840 --> 00:03:42,430 +với yêu cầu của chúng. + +55 +00:03:43,510 --> 00:03:48,040 +Vì vậy, khóa API sẽ chỉ là khóa API tin tức của chúng tôi mà chúng tôi + +56 +00:03:48,580 --> 00:03:52,690 +đã thêm trước đó và sau đó chúng tôi cũng sẽ cung cấp một queryInTitle. + +57 +00:03:53,020 --> 00:03:57,130 +Và tôi thực sự sẽ sao chép nó ngay lập tức vì tôi không chắc đó là + +58 +00:03:57,130 --> 00:04:01,390 +chữ I hay chữ L. Bằng cách đó, chúng tôi không mắc bất kỳ lỗi chính tả nào. Bây giờ, truy vấn chúng + +59 +00:04:01,420 --> 00:04:04,810 +tôi sẽ tìm kiếm thực sự là tên công ty của chúng tôi, bởi vì + +60 +00:04:04,990 --> 00:04:07,420 +trong khi chúng tôi có thể tìm kiếm tên cổ + +61 +00:04:07,660 --> 00:04:11,860 +phiếu, thực sự tốt hơn nếu tìm kiếm tên công ty vì hầu hết các bài báo có + +62 +00:04:11,860 --> 00:04:14,650 +xu hướng bao gồm tên công ty hơn là tên cổ phiếu. + +63 +00:04:15,730 --> 00:04:19,120 +Đây sẽ là các tham số sẽ đi vào đây. + +64 +00:04:19,720 --> 00:04:22,300 +Bây giờ chúng ta sẽ nắm bắt phản + +65 +00:04:24,340 --> 00:04:28,420 +hồi của mình và tôi sẽ in phản hồi ra dưới dạng JSON. + +66 +00:04:31,170 --> 00:04:31,410 +1: Được rồi. + +67 +00:04:31,410 --> 00:04:33,030 +0: Nếu bạn xem qua tài + +68 +00:04:33,030 --> 00:04:37,080 +liệu, chúng cũng cho bạn biết kết quả đầu ra ví dụ sẽ như thế nào. + +69 +00:04:37,500 --> 00:04:42,060 +Thứ nhất, chúng tôi có một từ điển với trạng thái, tổng kết + +70 +00:04:42,090 --> 00:04:45,150 +quả, nhưng quan trọng nhất là các bài + +71 +00:04:45,330 --> 00:04:50,130 +báo, đó là một danh sách. Trong danh sách đó có một loạt + +72 +00:04:50,160 --> 00:04:54,480 +các từ điển chứa những thứ như nguồn, tác giả, tiêu đề, mô + +73 +00:04:54,870 --> 00:04:59,370 +tả và mỗi bài báo này là một mục trong danh sách bài báo này. + +74 +00:05:00,060 --> 00:05:02,730 +Chúng tôi thực sự có thể nắm được tất cả + +75 +00:05:03,210 --> 00:05:08,210 +các bài báo chỉ bằng cách nhấn vào news_response. json và sau đó chuyển qua + +76 +00:05:09,420 --> 00:05:14,400 +các bài báo chính. Và bây giờ khi tôi in nó ra, trước hết + +77 +00:05:14,400 --> 00:05:16,830 +bạn có thể thấy danh sách của nó, + +78 +00:05:17,280 --> 00:05:21,150 +và sau đó mỗi bài báo là một từ điển bên trong danh sách đó. + +79 +00:05:22,710 --> 00:05:27,630 +Bây giờ chúng ta đã hoàn thành việc cần làm số sáu và chúng ta có thể + +80 +00:05:27,630 --> 00:05:28,800 +chuyển sang việc + +81 +00:05:29,280 --> 00:05:34,280 +cần làm số bảy, tức là sử dụng toán tử lát cắt Python để tạo danh sách có + +82 +00:05:35,220 --> 00:05:38,130 +ba bài viết đầu tiên. Và như một gợi + +83 +00:05:38,220 --> 00:05:41,160 +ý, tôi đã liên kết đến trang Stack + +84 +00:05:41,190 --> 00:05:46,170 +Overflow, nơi chúng thực sự đi qua toán tử lát cắt khá chi + +85 +00:05:46,170 --> 00:05:47,003 +tiết. + +86 +00:05:48,240 --> 00:05:51,900 +Nếu chúng ta chỉ muốn nhận được ba bài báo đầu tiên, thì khởi + +87 +00:05:51,960 --> 00:05:55,950 +đầu của chúng ta có thể là từ đầu và sau đó chúng ta sẽ + +88 +00:05:55,950 --> 00:05:58,100 +lặp lại để dừng trừ một bài. + +89 +00:05:58,490 --> 00:06:03,490 +Vì vậy, đó sẽ là: 3 bởi vì chúng ta hãy bắt đầu đếm từ số không. Như vậy + +90 +00:06:05,000 --> 00:06:08,300 +đó. Và bây giờ nếu tôi + +91 +00:06:08,380 --> 00:06:09,213 +in ba + +92 +00:06:11,380 --> 00:06:12,010 +bài + +93 +00:06:12,010 --> 00:06:17,010 +báo này, 2: right, 0: để xem chúng, nếu bạn nhấp vào bọc mềm + +94 +00:06:17,980 --> 00:06:22,540 +này và bạn có thể thấy ba mục, một, hai và ba. + +95 +00:06:24,310 --> 00:06:25,143 +2: Đó là + +96 +00:06:25,630 --> 00:06:26,463 +0: bước hai. + +97 +00:06:26,500 --> 00:06:31,500 +Bây giờ chúng tôi đã quản lý để sử dụng API tin tức để nắm giữ ba bài báo đầu + +98 +00:06:32,440 --> 00:06:37,240 +tiên nói về tên công ty cụ thể này. Trong bài học tiếp theo, tôi sẽ + +99 +00:06:37,270 --> 00:06:41,350 +đi qua phần cuối cùng của giải pháp, đó là bước ba và tìm + +100 +00:06:41,500 --> 00:06:46,500 +cách gửi các phần liên quan của bài viết đến số điện thoại di động của chúng + +101 +00:06:47,140 --> 00:06:47,560 +tôi. + diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Course-Fixes-Report-an-Issue.url b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution & Walkthrough for Step 3 - Send the SMS Messages.mp4 b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution & Walkthrough for Step 3 - Send the SMS Messages.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1140b97627991248bce7fa0c64c86643b4f18da9 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution & Walkthrough for Step 3 - Send the SMS Messages.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41e305cf71de824ffcbe663f09063a3d619157125e6063b53627e34cc47fb6f8 +size 152246002 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution & Walkthrough for Step 3 - Send the SMS Messages_vi.srt b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution & Walkthrough for Step 3 - Send the SMS Messages_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8f0021eb473714e9f36ae8da3eedfdc6142b59b3 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution & Walkthrough for Step 3 - Send the SMS Messages_vi.srt @@ -0,0 +1,372 @@ +1 +00:00:00,140 --> 00:00:06,740 +Vì vậy, trước đây chúng tôi đã quản lý để kiểm tra chênh lệch giá cổ phiếu giữa ngày hôm kia và ngày hôm qua. + +2 +00:00:06,740 --> 00:00:13,970 +Và sau đó, dựa trên thời điểm chênh lệch đó vượt quá một ngưỡng nhất định, thì chúng tôi kích hoạt + +3 +00:00:13,970 --> 00:00:19,220 +nhóm mã này để thực sự tìm nạp một số tin tức từ API Tin tức về công ty đó. + +4 +00:00:19,340 --> 00:00:26,510 +Vì vậy, bây giờ chúng ta đã có ba bài viết hàng đầu từ API Tin tức, bây giờ chúng ta sẽ chuyển sang bước ba, đó + +5 +00:00:26,510 --> 00:00:33,380 +là sử dụng Twilio để gửi tin nhắn với từng bài viết, tiêu đề và mô tả đến số điện thoại của chúng ta. + +6 +00:00:33,590 --> 00:00:41,510 +Bước đầu tiên là tạo danh sách gồm ba bài viết đầu tiên, tiêu đề và mô tả bằng cách sử dụng khả năng hiểu + +7 +00:00:41,510 --> 00:00:42,590 +danh sách. + +8 +00:00:42,590 --> 00:00:50,810 +Vì vậy, mục tiêu của chúng tôi là một chuỗi duy nhất có nội dung giống như tiêu đề này, và sau + +9 +00:00:50,810 --> 00:00:53,960 +đó là tiêu đề bài viết thực tế. + +10 +00:00:54,170 --> 00:01:00,000 +Và sau đó chúng tôi đã có bản tóm tắt của chúng tôi, sẽ đi vào một dòng mới. + +11 +00:01:00,000 --> 00:01:04,319 +Và sau đó đây sẽ là mô tả bài viết. + +12 +00:01:05,180 --> 00:01:09,850 +Bạn có thể thấy những phần đó trong các bài báo mà chúng tôi đã in ra. + +13 +00:01:09,860 --> 00:01:17,870 +Ví dụ, bài viết đầu tiên này ở đây, bạn có thể thấy tiêu đề nói rằng Spartan Energy dâng lên sau một cái gì đó, một cái gì đó, một + +14 +00:01:17,870 --> 00:01:19,430 +cái gì đó, một cái gì đó. + +15 +00:01:19,460 --> 00:01:24,200 +Bạn có thể xem đây là tiêu đề đầu tiên và đây là mô tả đầu tiên. + +16 +00:01:24,200 --> 00:01:32,510 +Vì vậy, về cơ bản nó là tiêu đề của bài viết và cũng là một mô tả ngắn gọn về nội dung của bài viết. + +17 +00:01:32,690 --> 00:01:35,370 +Đó là những gì chúng tôi muốn nhận được tin nhắn cho chúng tôi. + +18 +00:01:35,390 --> 00:01:41,870 +Bây giờ, để sử dụng khả năng hiểu danh sách, trước tiên chúng tôi sử dụng phương pháp từ khóa. + +19 +00:01:42,140 --> 00:01:46,130 +Vì vậy, mục mới cho mục trong danh sách. + +20 +00:01:46,310 --> 00:01:54,110 +Tất nhiên, bây giờ danh sách của chúng ta trong trường hợp này là ba bài báo, và mỗi mục đó sẽ là + +21 +00:01:54,110 --> 00:01:55,160 +một bài báo. + +22 +00:01:55,160 --> 00:01:59,800 +Và đối với mỗi bài báo đó, chúng tôi muốn có định dạng này. + +23 +00:01:59,810 --> 00:02:03,680 +Vì vậy, tôi sẽ cắt nó và sau đó dán nó vào đây. + +24 +00:02:03,680 --> 00:02:08,880 +Và sau đó tôi sẽ sử dụng một chuỗi F để chèn những phần liên quan này. + +25 +00:02:09,000 --> 00:02:15,570 +Vì vậy, tiêu đề bài viết được lưu trữ dưới khóa tiêu đề và mô tả được lưu trữ dưới khóa + +26 +00:02:15,570 --> 00:02:16,220 +mô tả. + +27 +00:02:16,230 --> 00:02:22,380 +Vì vậy, chúng ta có thể chỉ cần sử dụng nó làm chìa khóa để khai thác bài viết này. + +28 +00:02:22,740 --> 00:02:28,730 +Lưu ý cách chúng tôi có một tập hợp các dấu ngoặc kép bên ngoài để tạo chuỗi của chúng tôi. + +29 +00:02:28,740 --> 00:02:34,830 +Nếu chúng ta có một bộ dấu ngoặc kép khác để chỉ định khóa, điều này sẽ hơi khó hiểu đối với + +30 +00:02:34,830 --> 00:02:42,480 +trình thông dịch mã, vì vậy, hãy thay đổi nó thành dấu ngoặc đơn để làm cho nó thực sự hoạt động như thế này. + +31 +00:02:42,900 --> 00:02:45,930 +Bây giờ tiếp theo là mô tả bài viết. + +32 +00:02:46,170 --> 00:02:53,220 +Vì vậy, cái này sẽ nằm trong một tập hợp các dấu ngoặc kép khác và nó cũng sẽ nằm trong một tập hợp các + +33 +00:02:53,220 --> 00:02:55,350 +dấu ngoặc vuông như thế này. + +34 +00:02:56,890 --> 00:03:03,100 +Mỗi mục mới sẽ đi vào danh sách mới này sẽ là một chuỗi bao gồm tiêu đề + +35 +00:03:03,100 --> 00:03:06,310 +bài viết và cả phần mô tả bài viết. + +36 +00:03:06,610 --> 00:03:14,620 +Bây giờ chúng ta có thể lưu danh sách mới này vào danh sách bài viết được định dạng như thế này. + +37 +00:03:15,470 --> 00:03:17,990 +Như vậy là xong tám việc. + +38 +00:03:17,990 --> 00:03:23,570 +Và bây giờ chúng ta sẽ thử gửi từng bài viết dưới dạng một tin nhắn riêng qua Twilio. + +39 +00:03:24,260 --> 00:03:30,310 +Đây là Twilio SMS, Python, Quickstart của chúng tôi và về cơ bản chúng tôi sẽ sao chép tất cả những thứ này. + +40 +00:03:30,320 --> 00:03:36,410 +Vì vậy, trước tiên chúng ta sẽ nhập lớp máy khách từ Thư viện Twilio. + +41 +00:03:39,020 --> 00:03:43,550 +Và đảm bảo rằng chúng tôi thực sự đã cài đặt cái này nếu nó chưa được cài đặt. + +42 +00:03:44,090 --> 00:03:47,000 +Và loại bỏ các gạch chân màu đỏ. + +43 +00:03:47,030 --> 00:03:52,430 +Tiếp theo, chúng tôi sẽ lấy tài khoản Sid và mã thông báo xác thực từ Twilio. + +44 +00:03:53,000 --> 00:03:59,360 +Vì vậy, tôi sẽ sao chép tài khoản của mình, Sid và đặt nó ở đây. + +45 +00:04:03,180 --> 00:04:06,630 +Và cũng nhận được mã thông báo xác thực của tôi từ đây. + +46 +00:04:07,980 --> 00:04:15,090 +Vì vậy, bây giờ tôi có thể thiết lập ứng dụng khách của mình bằng cách tạo nó từ lớp ứng dụng khách dưới đây. Tại thời + +47 +00:04:15,090 --> 00:04:21,600 +điểm tôi muốn gửi tin nhắn của mình, tôi sẽ tạo một ứng dụng khách mới từ lớp ứng dụng khách Twilio và điều + +48 +00:04:21,600 --> 00:04:24,300 +này sẽ bao gồm tài khoản Twilio của tôi. + +49 +00:04:24,390 --> 00:04:28,170 +Sid Và cả mã thông báo xác thực Twilio của tôi. + +50 +00:04:28,850 --> 00:04:34,400 +Cuối cùng, chúng tôi có thể tạo tin nhắn của mình và gửi nó đến số của chính chúng tôi. + +51 +00:04:37,430 --> 00:04:41,770 +Nội dung của thư sẽ là từng bài viết. + +52 +00:04:41,780 --> 00:04:50,120 +Vì vậy, để gửi ba tin nhắn, chúng ta có thể lặp qua ba bài viết được định dạng như thế này, sau đó + +53 +00:04:50,120 --> 00:04:55,130 +chúng ta có thể tạo một tin nhắn và gửi từng tin nhắn một. + +54 +00:04:55,130 --> 00:05:00,350 +Vì vậy, phần thân sẽ là từng bài viết trong các bài viết được định dạng. + +55 +00:05:00,980 --> 00:05:08,900 +Bây giờ, số từ sẽ là số ảo Twilio của chúng tôi và số đến của chúng tôi sẽ là số điện thoại thực của chúng + +56 +00:05:08,900 --> 00:05:09,830 +tôi. + +57 +00:05:10,490 --> 00:05:16,490 +Khi chúng tôi đã hoàn thành tất cả những điều đó, bây giờ chúng tôi có thể kiểm tra điều này và chạy nó để xem nó có thực sự hoạt động hay không. + +58 +00:05:16,850 --> 00:05:22,610 +Bây giờ tôi sẽ tiếp tục và nhấn chạy và hy vọng tin nhắn của chúng ta sẽ được gửi đi. + +59 +00:05:24,680 --> 00:05:26,530 +Như bạn có thể thấy ngay bây giờ. + +60 +00:05:26,540 --> 00:05:29,030 +Vì vậy, chúng tôi đã có tiêu đề và tóm tắt của chúng tôi. + +61 +00:05:29,030 --> 00:05:33,470 +Và mỗi trong số ba bài báo đang được gửi dưới dạng một tin nhắn riêng biệt. + +62 +00:05:33,950 --> 00:05:36,970 +Đó gần như là kết thúc của thử thách này. + +63 +00:05:36,980 --> 00:05:40,100 +Bây giờ, tất nhiên, bạn có thể cải thiện điều này hơn nữa. + +64 +00:05:40,220 --> 00:05:46,580 +Và một trong những điều tôi nghĩ đến là có một biểu tượng cảm xúc nhỏ để hiển thị liệu cổ phiếu của bạn + +65 +00:05:46,580 --> 00:05:50,600 +tăng hay giảm và cũng hiển thị tỷ lệ phần trăm được làm tròn. + +66 +00:05:50,990 --> 00:05:57,440 +Để làm được điều đó, chúng ta cần tìm hiểu xem cổ phiếu tăng hay giảm và chúng ta có thể tìm ra điều đó bằng cách + +67 +00:05:57,440 --> 00:05:58,970 +xem xét sự khác biệt. + +68 +00:05:58,970 --> 00:06:05,930 +Nếu thay vì sử dụng ABS ở đây, điều này sẽ loại bỏ âm và dương của chúng ta, thay vào đó, nếu chúng + +69 +00:06:05,930 --> 00:06:13,340 +ta sử dụng câu lệnh if để kiểm tra xem chênh lệch có lớn hơn 0 hay không để nó dương, thì chúng ta có thể + +70 +00:06:13,340 --> 00:06:17,810 +tạo một biến gọi là up down mà bắt đầu như không có. + +71 +00:06:17,810 --> 00:06:23,210 +Nhưng nếu nó tích cực, thì chúng ta có thể biến nó thành một biểu tượng cảm xúc. + +72 +00:06:26,050 --> 00:06:30,670 +Và hãy nhớ rằng, biểu tượng cảm xúc chỉ đơn giản được coi là chuỗi trong mã của chúng tôi. + +73 +00:06:30,970 --> 00:06:36,250 +Mặt khác, nếu nó dưới 0, thì chúng tôi sẽ thay đổi biểu tượng đó thành biểu tượng cảm xúc hướng xuống. + +74 +00:06:42,660 --> 00:06:43,700 +Như thế này. + +75 +00:06:43,710 --> 00:06:49,650 +Và như mọi khi, bạn luôn có thể tìm kiếm các biểu tượng cảm xúc này trên Google, sao chép và dán chúng vào nếu bạn không + +76 +00:06:49,650 --> 00:06:52,350 +có bàn phím biểu tượng cảm xúc và biểu tượng. + +77 +00:06:52,980 --> 00:06:59,250 +Nhưng sau khi đã lấy đi hàm giá trị tuyệt đối ở đây, chúng ta sẽ phải đặt nó trở lại ở một nơi + +78 +00:06:59,250 --> 00:06:59,760 +khác. + +79 +00:06:59,760 --> 00:07:05,220 +Vì vậy, chúng tôi sẽ đặt nó ngay tại điểm mà chúng tôi thực hiện kiểm tra Nếu. + +80 +00:07:07,190 --> 00:07:14,360 +Ngoài ra, tôi muốn thay đổi phần trăm chênh lệch này để chúng ta thực sự làm tròn nó thành số nguyên + +81 +00:07:14,360 --> 00:07:15,230 +gần nhất. + +82 +00:07:16,320 --> 00:07:18,810 +Với tỷ lệ phần trăm khác biệt được làm tròn. + +83 +00:07:18,810 --> 00:07:26,400 +Và ngược lại, bây giờ chúng ta có thể định dạng tin nhắn của mình để nó hiển thị tên của cổ phiếu. + +84 +00:07:29,040 --> 00:07:36,240 +Và sau đó là tăng hay giảm và sau đó là tỷ lệ phần trăm chênh lệch. + +85 +00:07:36,510 --> 00:07:41,040 +Và cuối cùng, một dấu phần trăm và cũng là một dòng mới. + +86 +00:07:41,580 --> 00:07:43,860 +Vì vậy, bây giờ nếu tôi chạy lại cái này. + +87 +00:07:46,050 --> 00:07:53,940 +Bạn có thể thấy rằng lần này những thông báo này hoàn chỉnh với tên cổ phiếu, tỷ lệ chuyển động, + +88 +00:07:53,940 --> 00:07:56,100 +tiêu đề và tóm tắt. + +89 +00:07:57,070 --> 00:07:58,480 +Vì vậy, có bạn có nó. + +90 +00:07:58,570 --> 00:08:04,120 +Tôi chắc rằng bạn có thể nghĩ ra nhiều cải tiến hơn nữa cho chương trình này, và đặc biệt nếu bạn là người thực + +91 +00:08:04,120 --> 00:08:09,230 +sự giao dịch cổ phiếu, thì tôi chắc chắn rằng bạn sẽ nghĩ ra nhiều cách hơn nữa để cải thiện dự án này. + +92 +00:08:09,250 --> 00:08:14,440 +Nếu bạn nghĩ ra bất kỳ điều gì thú vị và vui nhộn, hãy nhớ chia sẻ nó với những người còn lại trong phần Hỏi & Đáp + +93 +00:08:14,470 --> 00:08:16,960 +để tất cả chúng ta đều ngưỡng mộ sự chăm chỉ của bạn. + diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution-stock-news-end.zip b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution-stock-news-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..c9b5487397d3435628a811b43312f724c2207ca1 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/005 Solution-stock-news-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe8951f82afdbd1f57ee73171e694d5b8622f4745a2c2f5fb1db851c432f5919 +size 1584 diff --git a/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/external-links.txt b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..de02c95d874c052081c96e4b158261a820372d67 --- /dev/null +++ b/part3/36 - Day 36 - Intermediate+ Stock Trading News Alert Project/external-links.txt @@ -0,0 +1,15 @@ + +001 TSLA-Stock-Price +https://uk.tradingview.com/symbols/NASDAQ-TSLA/ + +002 Stock-Price-API +https://www.alphavantage.co/ + +002 News-API +https://newsapi.org/ + +002 Twilio-API +https://www.twilio.com/ + +005 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/001 Day 37 Goals what you will make by the end of the day.mp4 b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/001 Day 37 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3e8c8aa6f0bc67b7f39dc853c931c5bfdda321f7 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/001 Day 37 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b45003cbb2ce485abc60f681e4563347a8901ee7700ed1c6bdca39926876b8b6 +size 30430116 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/001 Day 37 Goals what you will make by the end of the day_vi.srt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/001 Day 37 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..839d6e846de692d8b51e4569e9fdc99bb6e56518 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/001 Day 37 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,176 @@ +1 +00:00:00,240 --> 00:00:00,870 +Xin chào các + +2 +00:00:00,870 --> 00:00:05,400 +bạn, chào mừng đến với ngày thứ 37 của 100 Ngày viết mã. Hôm nay chúng ta sẽ tìm hiểu + +3 +00:00:05,430 --> 00:00:09,840 +về các phương pháp xác thực nâng cao bằng cách sử dụng tiêu đề + +4 +00:00:09,840 --> 00:00:10,673 +và chúng + +5 +00:00:10,860 --> 00:00:15,450 +ta cũng sẽ học cách tạo các yêu cầu POST, PUT và DELETE bằng + +6 +00:00:15,540 --> 00:00:19,980 +cách sử dụng mô-đun yêu cầu. Và khi chúng ta đã học được tất cả những điều đó, chúng + +7 +00:00:20,040 --> 00:00:24,450 +ta sẽ xây dựng một công cụ theo dõi thói quen. Người phụ nữ này là Simone Giertz và + +8 +00:00:24,540 --> 00:00:26,760 +cô ấy là người mà tôi thực sự ngưỡng mộ. + +9 +00:00:26,760 --> 00:00:31,740 +Cô ấy tạo ra đủ loại robot vô dụng, ừm, đó là những gì cô ấy nói, nhưng + +10 +00:00:31,800 --> 00:00:33,660 +chúng thực sự rất hấp dẫn. + +11 +00:00:33,750 --> 00:00:38,610 +Và một trong những sản phẩm mà cô ấy đã giới thiệu thông qua Kickstarter là công cụ + +12 +00:00:38,610 --> 00:00:39,270 +theo dõi + +13 +00:00:39,270 --> 00:00:44,270 +thói quen này, nơi bạn có thể truy cập nó hàng ngày và chỉ cần nhấn vào ngày hôm nay. + +14 +00:00:45,540 --> 00:00:50,370 +Vì vậy, nếu bạn muốn thiền mỗi ngày, nếu bạn muốn đọc 500 trang sách mỗi ngày, thì bạn + +15 +00:00:50,370 --> 00:00:54,990 +có thể theo dõi thói quen của mình. Và bởi vì nó liên tục, nó + +16 +00:00:55,390 --> 00:00:59,970 +khiến bạn thực sự muốn tiếp tục chuỗi của mình và không bị đứt đoạn. + +17 +00:01:00,750 --> 00:01:05,750 +Vì vậy, chúng tôi sẽ sử dụng công nghệ để xây dựng phiên bản kỹ thuật số của nó ngày nay. + +18 +00:01:06,390 --> 00:01:09,270 +Và chúng tôi sẽ sử dụng một API có tên là Pixela. + +19 +00:01:09,780 --> 00:01:14,160 +Điều này đến từ một nhà phát triển Nhật Bản và nó thực sự tuyệt vời. + +20 +00:01:14,550 --> 00:01:17,070 +Nó cho phép bạn theo dõi thói quen của mình, nhưng không + +21 +00:01:17,130 --> 00:01:20,970 +chỉ hiển thị ngày nào bạn đã thực hiện thói quen của mình, ngày nào bạn chưa thực hiện + +22 +00:01:21,360 --> 00:01:25,140 +mà còn cho biết cường độ hoạt động. Vì vậy, chẳng hạn, có thể + +23 +00:01:25,170 --> 00:01:29,040 +bạn muốn theo dõi xem mình đang đọc bao nhiêu trang mỗi ngày, + +24 +00:01:29,040 --> 00:01:33,010 +bạn muốn xây dựng thói quen đọc. Chà, bạn có thể thấy rằng vào một số + +25 +00:01:33,010 --> 00:01:36,870 +ngày nhất định, bạn sẽ thực sự đọc rất nhiều và bạn đang hướng tới một chuỗi, nhưng sau đó + +26 +00:01:36,900 --> 00:01:40,050 +vào những ngày khác, mặc dù bạn đang thực hiện một số giống vì màu nhạt + +27 +00:01:40,350 --> 00:01:44,700 +hơn, điều đó có nghĩa là bạn đọc ít trang hơn. Và trong một năm, bạn có thể thấy + +28 +00:01:44,730 --> 00:01:49,230 +toàn bộ sự tiến bộ của mình và bạn có thể thấy thói quen của mình được theo + +29 +00:01:49,230 --> 00:01:52,050 +dõi từng ngày, điều này tôi nghĩ thực sự tuyệt vời. + +30 +00:01:52,740 --> 00:01:56,730 +Đây là những gì chúng tôi sẽ xây dựng cuối cùng. Bạn có thể lấy bất kỳ ví dụ + +31 +00:01:56,910 --> 00:01:59,640 +nào, bất kỳ thói quen nào mà bạn muốn xây dựng, vì + +32 +00:01:59,670 --> 00:02:04,670 +vậy trong trường hợp của tôi, tôi muốn thử đạp xe mỗi ngày và tôi ghi lại số km mà tôi + +33 +00:02:04,770 --> 00:02:05,670 +đã đạp xe. + +34 +00:02:06,150 --> 00:02:10,560 +Và bạn có thể thấy rằng những ngày nhất định tôi đạp xe rất nhiều và những ngày khác tôi đạp xe + +35 +00:02:10,560 --> 00:02:11,393 +ít hơn một chút. + +36 +00:02:11,790 --> 00:02:16,790 +Nhưng tôi có thể biết những ngày nào tôi đã bỏ lỡ việc đạp xe và cố gắng theo + +37 +00:02:17,760 --> 00:02:19,080 +kịp đà và thành tích. + +38 +00:02:19,410 --> 00:02:23,130 +Có thể bạn muốn theo dõi khoảng thời gian bạn dành mỗi ngày để học viết + +39 +00:02:23,130 --> 00:02:28,020 +mã hoặc có thể bạn muốn theo dõi khoảng thời gian bạn thiền mỗi ngày hoặc có thể bạn muốn theo + +40 +00:02:28,590 --> 00:02:31,950 +dõi xem bạn đã bơi được bao nhiêu độ dài trong bể bơi. + +41 +00:02:32,400 --> 00:02:34,380 +Dù bạn đang cố gắng xây dựng thói + +42 +00:02:34,830 --> 00:02:37,290 +quen nào Tôi chắc chắn rằng vào cuối dự án hôm + +43 +00:02:37,350 --> 00:02:40,620 +nay, bạn sẽ có một công cụ giúp bạn đạt được mục tiêu của mình. + +44 +00:02:40,980 --> 00:02:44,730 +Vì vậy, khi bạn đã sẵn sàng, hãy bắt đầu bằng cách chuyển sang bài học tiếp theo. + diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 HTTP Post Requests.mp4 b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 HTTP Post Requests.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..000363bfee06a14e5f1d1c1802c9256cc5f85033 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 HTTP Post Requests.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29f4435b1da65268cd95747dfb39d3668fa8d4cce0fce254b7518482502f921f +size 66597690 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 HTTP Post Requests_vi.srt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 HTTP Post Requests_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b386097f2edaa3ecd1f95dffb649d3cdf445bd52 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 HTTP Post Requests_vi.srt @@ -0,0 +1,520 @@ +1 +00:00:00,180 --> 00:00:03,180 +Chúng tôi đã sử dụng mô-đun yêu cầu trong một thời + +2 +00:00:03,270 --> 00:00:07,590 +gian và chúng tôi đã sử dụng nó để thực hiện các yêu cầu HTTP trên internet. + +3 +00:00:08,189 --> 00:00:10,260 +Chúng tôi đã thấy yêu cầu nhận và + +4 +00:00:10,410 --> 00:00:14,940 +đây là cách để chúng tôi lấy các phần dữ liệu từ người khác, chẳng hạn như + +5 +00:00:14,970 --> 00:00:16,350 +nhà cung cấp API. + +6 +00:00:17,070 --> 00:00:22,070 +Bây giờ cũng có bốn loại yêu cầu phổ biến khác mà chúng ta có + +7 +00:00:22,170 --> 00:00:24,630 +thể nên biết; đăng và xóa. + +8 +00:00:25,440 --> 00:00:30,440 +Chúng ta có thể sử dụng mô-đun yêu cầu để hoàn thành một yêu cầu nhận bằng cách viết các yêu cầu một + +9 +00:00:30,480 --> 00:00:31,920 +cách đơn giản. lấy và sau đó + +10 +00:00:32,400 --> 00:00:37,400 +chúng tôi đặt các tham số của chúng tôi bên trong dấu ngoặc đơn. Đối với ba yêu cầu khác, mã + +11 +00:00:37,470 --> 00:00:38,303 +trông + +12 +00:00:38,460 --> 00:00:42,900 +khá giống nhau. Của nó . bưu kiện, . đặt, và. xóa bỏ. + +13 +00:00:44,010 --> 00:00:49,010 +Trong khi đó, yêu cầu nhận được thực hiện khi chúng tôi yêu cầu hệ thống bên ngoài cung cấp một phần + +14 +00:00:49,560 --> 00:00:53,610 +dữ liệu cụ thể và họ cung cấp thông tin đó cho chúng tôi trong phản hồi. + +15 +00:00:54,270 --> 00:00:59,220 +yêu cầu đăng là nơi chúng tôi cung cấp cho hệ thống bên ngoài một số phần dữ liệu và chúng + +16 +00:00:59,820 --> 00:01:03,660 +tôi không quá quan tâm đến phản hồi mà chúng tôi nhận lại ngoài việc liệu + +17 +00:01:03,660 --> 00:01:06,960 +nó có thành công hay không. Ví dụ: nếu bạn + +18 +00:01:06,990 --> 00:01:10,950 +muốn lưu một phần dữ liệu trong Google trang tính, thì bạn + +19 +00:01:11,220 --> 00:01:13,440 +có thể sử dụng API Google trang + +20 +00:01:13,680 --> 00:01:17,190 +tính để đăng dữ liệu của mình lên Google trang tính. + +21 +00:01:18,060 --> 00:01:21,450 +Hoặc có thể bạn muốn sử dụng API Twitter để đăng một + +22 +00:01:21,780 --> 00:01:26,780 +tweet thì chương trình của bạn sẽ gửi tweet của bạn thông qua một yêu cầu đăng + +23 +00:01:27,150 --> 00:01:29,580 +đến API Twitter. Vì vậy, đó + +24 +00:01:29,610 --> 00:01:34,610 +là cách nhận và đăng hoạt động. Đặt là nơi bạn chỉ cần cập nhật một phần dữ + +25 +00:01:34,680 --> 00:01:38,100 +liệu trong dịch vụ bên ngoài. Vì vậy, nếu bạn có một bảng + +26 +00:01:38,100 --> 00:01:41,430 +tính trong Google sheet và có thể bạn muốn cập nhật một số giá trị trong bảng + +27 +00:01:41,640 --> 00:01:43,590 +tính, thì bạn sẽ sử dụng một yêu cầu đặt. + +28 +00:01:44,010 --> 00:01:48,330 +Và cuối cùng xóa chỉ đơn giản là nơi bạn muốn xóa một phần dữ liệu trong dịch vụ bên + +29 +00:01:48,330 --> 00:01:49,350 +ngoài như một tweet + +30 +00:01:49,350 --> 00:01:53,550 +mà bạn đã đăng hoặc một bài đăng trên Facebook. Hôm nay chúng ta sẽ xây + +31 +00:01:53,550 --> 00:01:57,360 +dựng công cụ theo dõi thói quen của mình bằng API Pixela. + +32 +00:01:57,990 --> 00:02:00,030 +Và để sử dụng API này, chúng tôi + +33 +00:02:00,090 --> 00:02:04,380 +sẽ đăng dữ liệu theo dõi thói quen của mình, ví dụ: có bao nhiêu trang có + +34 +00:02:04,380 --> 00:02:08,460 +một cuốn sách chúng tôi đã đọc, chúng tôi đã đạp xe bao nhiêu km và + +35 +00:02:08,729 --> 00:02:11,940 +chúng tôi sẽ đăng dữ liệu tới Pixela để được theo dõi + +36 +00:02:12,030 --> 00:02:14,040 +trong biểu đồ của chúng tôi. + +37 +00:02:14,730 --> 00:02:17,610 +Nếu bạn truy cập trang web của họ và cuộn + +38 +00:02:17,850 --> 00:02:21,090 +xuống, bạn có thể thấy rằng nó cho bạn biết cách bắt đầu. + +39 +00:02:21,450 --> 00:02:24,810 +Và đó là một loạt sáu bước. + +40 +00:02:25,200 --> 00:02:27,480 +Vì vậy, chúng tôi sẽ hoàn thành những thứ + +41 +00:02:27,930 --> 00:02:30,360 +này theo thứ tự và chúng tôi sẽ ghép nối + +42 +00:02:30,360 --> 00:02:33,810 +hướng dẫn bắt đầu của biểu mẫu ngắn này với tài liệu của họ. + +43 +00:02:34,380 --> 00:02:38,490 +Vì vậy, chúng ta sẽ có điều đó cạnh nhau để xem tất cả + +44 +00:02:38,490 --> 00:02:42,300 +các tài liệu về từng bước. Bước một liên quan đến + +45 +00:02:42,300 --> 00:02:47,300 +việc tạo một tài khoản người dùng. Và nó nói rằng bạn phải đạt được + +46 +00:02:48,240 --> 00:02:52,290 +điểm cuối cụ thể này bằng cách sử dụng yêu cầu bài đăng HTTP. + +47 +00:02:52,680 --> 00:02:55,860 +Vì vậy, đây là lần đầu tiên chúng tôi đưa ra yêu cầu đăng bài. + +48 +00:02:56,640 --> 00:03:00,100 +Bây giờ tôi đã thiết lập một dự án mới trong trình theo dõi + +49 +00:03:00,490 --> 00:03:05,110 +thói quen PyCharm và trong chính của tôi. py, như mọi khi, tôi sẽ bắt đầu bằng cách + +50 +00:03:05,110 --> 00:03:07,090 +nhập mô-đun yêu cầu. Bây giờ, vì + +51 +00:03:07,090 --> 00:03:11,650 +đây là một dự án hoàn toàn mới, chúng tôi sẽ phải cài đặt gói đó để + +52 +00:03:11,710 --> 00:03:14,020 +làm cho gạch chân màu đỏ này biến mất. + +53 +00:03:14,620 --> 00:03:19,330 +Và khi nó đã được cài đặt thành công, chúng ta có thể khai thác các yêu cầu + +54 +00:03:19,860 --> 00:03:22,290 +phương pháp 1:. bưu kiện. Chúng ta sẽ + +55 +00:03:22,410 --> 00:03:27,060 +đến 0 là gì: đặt trong ngoặc đơn này, các tham số là gì, đầu vào là gì? + +56 +00:03:27,420 --> 00:03:31,350 +Điều đầu tiên là điểm cuối URL, phải không? + +57 +00:03:31,440 --> 00:03:34,020 +Vì vậy, đây là điểm cuối của + +58 +00:03:34,740 --> 00:03:38,130 +Pixela, và đó sẽ là tất cả những điều này. + +59 +00:03:38,820 --> 00:03:42,690 +Hãy sao chép và dán nó vào dưới dạng một chuỗi. + +60 +00:03:44,070 --> 00:03:46,410 +Bây giờ, nếu chúng ta đi đến tài liệu + +61 +00:03:46,560 --> 00:03:50,220 +API, bạn có thể thấy rằng có một chỉ mục của API ở bên + +62 +00:03:50,580 --> 00:03:52,650 +phải và cũng ở đầu tài liệu. + +63 +00:03:53,010 --> 00:03:56,130 +Vì vậy, những gì chúng tôi muốn làm trước tiên là tạo + +64 +00:03:56,130 --> 00:03:58,350 +một người dùng, 1: Đó là bước một. + +65 +00:03:58,440 --> 00:04:01,200 +0: Bây giờ, API này thực sự đã được ghi chép đầy + +66 +00:04:01,590 --> 00:04:04,950 +đủ, đặc biệt là với thực tế rằng nó thực sự không phải là một + +67 +00:04:04,950 --> 00:04:08,790 +nhóm phát triển lớn đứng sau điều này. Nếu chúng ta xem xét, đây là điểm kết thúc, và đây là + +68 +00:04:09,090 --> 00:04:12,150 +những gì chúng ta có trong mã của mình. Tiếp theo, chúng tôi sẽ + +69 +00:04:12,180 --> 00:04:14,160 +thực hiện yêu cầu bài đăng của + +70 +00:04:14,190 --> 00:04:18,240 +mình và chúng tôi sẽ thêm một số tham số vào nội dung yêu cầu. + +71 +00:04:18,959 --> 00:04:23,100 +Vì vậy, bạn có thể thấy rằng một số trong số này là bắt buộc và một số khác là tùy chọn. + +72 +00:04:23,610 --> 00:04:28,200 +Vì vậy, chúng tôi sẽ thêm một giá trị cho mỗi tham số bắt buộc; mã thông báo, + +73 +00:04:28,470 --> 00:04:32,550 +tên người dùng, thỏa thuậnTermsOfService và rằng chúng tôi không phải là trẻ vị thành niên. + +74 +00:04:35,760 --> 00:04:35,880 +1: Tuyệt vời. + +75 +00:04:35,880 --> 00:04:40,380 +0: Vì vậy, hãy tạo user_params của chúng tôi. Và chìa khóa đầu tiên là mã thông báo của chúng tôi. + +76 +00:04:40,920 --> 00:04:42,780 +Bây giờ chúng ta hãy xem mã thông báo này cần phải là gì. + +77 +00:04:42,990 --> 00:04:47,190 +Nó phải là một chuỗi được sử dụng để xác thực người dùng của bạn và chúng tôi sẽ + +78 +00:04:47,670 --> 00:04:51,510 +sử dụng nó sau này cũng như khi chúng tôi truy cập biểu đồ của mình + +79 +00:04:51,540 --> 00:04:55,020 +và khi chúng tôi thêm vào nó. Vì vậy, hãy đảm bảo rằng bạn lưu thông tin này một cách an toàn. + +80 +00:04:55,110 --> 00:04:59,430 +Về cơ bản, điều này giống như một khóa API mà bạn sẽ tự tạo. + +81 +00:05:00,090 --> 00:05:02,370 +Mã thông báo này có thể chứa + +82 +00:05:02,370 --> 00:05:05,940 +bất kỳ ký tự nào, vì vậy bạn có thể tạo một + +83 +00:05:06,120 --> 00:05:10,650 +khóa như thế này, nhưng độ dài của mã thông báo phải từ 8 ký + +84 +00:05:10,650 --> 00:05:14,310 +tự đến 128 ký tự. Vì vậy, tôi nghĩ rằng tôi chắc chắn có hơn + +85 +00:05:14,580 --> 00:05:18,270 +tám ký tự ở đó, vì vậy tôi có thể chuyển sang khóa tiếp theo, đó là tên người dùng của tôi. + +86 +00:05:19,350 --> 00:05:23,730 +Tôi sẽ thử và xem liệu tôi có thể thoát khỏi chỉ với tên của mình không. Nếu không thành công, chúng tôi luôn + +87 +00:05:23,730 --> 00:05:26,340 +có thể thử lại. Tiếp theo, chúng + +88 +00:05:26,370 --> 00:05:31,370 +tôi đã có agreeTermsOfService và điều này sẽ là có hoặc không. + +89 +00:05:32,700 --> 00:05:34,200 +Chúng tôi có thể sẽ phải nói có + +90 +00:05:34,200 --> 00:05:36,120 +nếu chúng tôi thực sự muốn sử dụng dịch vụ này. + +91 +00:05:36,420 --> 00:05:39,240 +Và chúng tôi cũng sẽ phải nói có rằng chúng tôi không phải là trẻ vị thành niên. + +92 +00:05:40,680 --> 00:05:44,760 +Hãy đảm bảo rằng chúng ta không mắc lỗi chính tả nào bằng cách chỉ cần dán cái này vào. + +93 +00:05:45,660 --> 00:05:50,660 +Vì vậy, đó là một đồng ý cho các điều khoản dịch vụ đã đồng ý và một đồng ý cho thực tế là + +94 +00:05:51,240 --> 00:05:56,130 +tôi không phải là trẻ vị thành niên, thật đáng buồn. Không phải là trẻ vị thành niên nữa. + +95 +00:05:56,840 --> 00:06:01,070 +Khi chúng tôi đã có thông số người dùng và điểm cuối Pixela của mình, thì chúng tôi đã sẵn + +96 +00:06:01,190 --> 00:06:04,910 +sàng thực hiện yêu cầu đăng của mình. Một lần nữa, chúng ta + +97 +00:06:04,910 --> 00:06:09,710 +sẽ bắt đầu với URL sẽ là điểm cuối Pixela của chúng ta và sau + +98 +00:06:10,370 --> 00:06:13,790 +đó chúng ta sẽ thêm một đối số từ khóa mới. + +99 +00:06:14,270 --> 00:06:15,770 +Và đây được gọi là json. + +100 +00:06:16,250 --> 00:06:21,250 +Lưu ý rằng tất cả dữ liệu mà chúng tôi đang đăng lên Pixela có khá + +101 +00:06:21,260 --> 00:06:24,860 +nhiều ở định dạng JSON. Chuỗi và chuỗi. + +102 +00:06:25,310 --> 00:06:28,670 +Về cơ bản, đây là một phần dữ liệu JSON mà chúng tôi sẽ gửi qua. + +103 +00:06:29,570 --> 00:06:33,080 +Và đó là tất cả những gì cần làm. Điểm cuối và cũng là + +104 +00:06:33,380 --> 00:06:36,020 +dữ liệu JSON mà chúng tôi muốn gửi qua. + +105 +00:06:36,560 --> 00:06:41,060 +Vì vậy, hãy tiếp tục và lưu điều này bên trong một biến phản hồi giống như chúng + +106 +00:06:41,060 --> 00:06:44,060 +ta đã làm trước đó. Và sau khi điều này + +107 +00:06:44,120 --> 00:06:46,910 +hoàn thành, hãy tiếp tục và in phản hồi là gì. + +108 +00:06:47,420 --> 00:06:50,270 +Bây giờ bạn có thể nhấn vào phản hồi dưới + +109 +00:06:50,630 --> 00:06:54,560 +dạng JSON, nhưng trong trường hợp này, chúng tôi không thực sự muốn + +110 +00:06:54,560 --> 00:06:58,160 +làm gì với phản hồi. Chúng tôi chỉ muốn kiểm tra xem nó có thực sự thành công hay không. + +111 +00:06:58,580 --> 00:07:01,070 +Chúng tôi thực sự có thể khai thác một thuộc tính được gọi là văn bản. + +112 +00:07:02,060 --> 00:07:05,180 +Vì vậy, nó sẽ trả lại cho bạn phản hồi dưới dạng một đoạn văn bản. + +113 +00:07:05,690 --> 00:07:09,230 +Hãy tiếp tục và chạy nó và xem liệu tôi có thể thoát khỏi việc đặt tên người + +114 +00:07:09,350 --> 00:07:12,500 +dùng của mình là angela hay không. Ồ. + +115 +00:07:12,650 --> 00:07:16,130 +Vì vậy, thực tế không có người dùng nào có tên là angela vào + +116 +00:07:16,550 --> 00:07:19,790 +lúc này và tôi đã có thể lấy tên người dùng đó. + +117 +00:07:20,360 --> 00:07:23,090 +Vì vậy, lý do tại sao chúng tôi quan tâm đến việc xem + +118 +00:07:23,180 --> 00:07:27,650 +xét phản hồi là nếu có một số vấn đề, ví dụ: nếu tôi cố gắng chạy lại điều này ngay bây + +119 +00:07:27,680 --> 00:07:32,210 +giờ khi tôi đã sử dụng tên người dùng này, tôi nghĩ rằng nó có thể sẽ không thành công và nó + +120 +00:07:32,300 --> 00:07:36,740 +cho chúng tôi biết người dùng này đã tồn tại. Ngoài ra, nếu chúng tôi nói không với một trong + +121 +00:07:36,770 --> 00:07:40,430 +số những điều này, đồng ý với các điều khoản dịch vụ hoặc không nhỏ, nó + +122 +00:07:40,670 --> 00:07:45,110 +có thể cũng sẽ gửi cho chúng tôi một thông báo cho chúng tôi biết lý do tại sao + +123 +00:07:45,170 --> 00:07:49,490 +yêu cầu đăng bài này không thành công. Nhưng bây giờ tôi đã hoàn thành + +124 +00:07:49,550 --> 00:07:54,550 +bước này, tôi thực sự có thể nhận xét nó vì tôi đã tạo người dùng của mình. + +125 +00:07:55,370 --> 00:08:00,370 +Hiện chúng tôi đã tự thiết lập một tài khoản mới trên Pixela với tên người dùng và cũng là mã thông báo + +126 +00:08:02,120 --> 00:08:06,110 +bí mật mà chúng tôi sẽ sử dụng trong tương lai để truy cập vào tài khoản này. + +127 +00:08:06,560 --> 00:08:11,060 +Đó thực sự là tên người dùng và mật khẩu của chúng tôi. Vì vậy, trong bài học tiếp theo, + +128 +00:08:11,120 --> 00:08:14,960 +chúng ta sẽ tạo biểu đồ của mình và chúng ta sẽ tìm hiểu cách + +129 +00:08:14,960 --> 00:08:17,570 +sử dụng một phương pháp xác thực an toàn hơn. + +130 +00:08:18,080 --> 00:08:21,110 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Pixela-API-Documentation.url b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Pixela-API-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..c750e73d860ef90476e65dbf4143ac76886a993a --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Pixela-API-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.pixe.la/ \ No newline at end of file diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Pixela-Website.url b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Pixela-Website.url new file mode 100644 index 0000000000000000000000000000000000000000..bd373ce63f73890d43347c11414aec4c1fe6bffb --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Pixela-Website.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pixe.la/ \ No newline at end of file diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Requests-Module-Documentation.url b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Requests-Module-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..4efcea0bfca22d60d3ca0f0bc0b8acb7c06fb34c --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/002 Requests-Module-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://requests.readthedocs.io/en/latest/api/ \ No newline at end of file diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/003 Advanced Authentication using an HTTP Header.mp4 b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/003 Advanced Authentication using an HTTP Header.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..84761b8eb3669d5fa014a6a14a291eb8015a2cbd --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/003 Advanced Authentication using an HTTP Header.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06d3a8a2fd077081b7e248534eee75e6ee944ca7479773d5215181d5381e00f1 +size 145254065 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/003 Advanced Authentication using an HTTP Header_vi.srt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/003 Advanced Authentication using an HTTP Header_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bd68ba781f9d43f3992a43fdf635ef09000e0000 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/003 Advanced Authentication using an HTTP Header_vi.srt @@ -0,0 +1,624 @@ +1 +00:00:00,360 --> 00:00:03,090 +Trước đó, chúng tôi đã hoàn thành + +2 +00:00:03,330 --> 00:00:06,960 +bước một là thiết lập tài khoản người dùng trên Pixela. + +3 +00:00:07,590 --> 00:00:09,360 +Bây giờ chúng ta có thể chuyển + +4 +00:00:09,450 --> 00:00:13,920 +sang bước thứ hai là tạo một biểu đồ mới trên Pixela cho tên người dùng của chúng ta. + +5 +00:00:14,550 --> 00:00:19,550 +Vì vậy, hãy chú ý xem điểm cuối bây giờ khác như thế nào vì ngoài / v1 + +6 +00:00:20,160 --> 00:00:21,210 +/ users, chúng + +7 +00:00:21,480 --> 00:00:26,480 +ta còn phải thêm tên người dùng của mình ngay bây giờ và sau đó cho / graphs. + +8 +00:00:27,030 --> 00:00:31,590 +Vì vậy, chúng ta hãy quay lại tài liệu và cuộn xuống phần có liên + +9 +00:00:31,590 --> 00:00:36,030 +quan của API, đây là phần để tạo đồ thị, đó là bước hai. + +10 +00:00:37,410 --> 00:00:40,890 +Đây cũng sẽ là một yêu cầu đăng HTTP, nhưng + +11 +00:00:41,310 --> 00:00:43,770 +điểm kết thúc hiện đã thay đổi. + +12 +00:00:44,280 --> 00:00:47,160 +Vì vậy, hãy tiếp tục và tạo điểm cuối mới của + +13 +00:00:47,580 --> 00:00:49,770 +chúng ta là điểm cuối của đồ thị. + +14 +00:00:51,750 --> 00:00:56,340 +Và điều này sẽ bao gồm điểm cuối Pixela và sau đó thêm vào + +15 +00:00:56,700 --> 00:01:00,780 +đó, nó sẽ là / tên người dùng của chúng tôi. + +16 +00:01:01,770 --> 00:01:03,090 +Vì vậy, chúng ta hãy lấy + +17 +00:01:03,090 --> 00:01:07,050 +tên người dùng và mã thông báo của chúng tôi và đặt nó như một hằng số ở trên cùng. + +18 +00:01:07,130 --> 00:01:07,963 +1: Đúng 0: + +19 +00:01:14,840 --> 00:01:17,720 +Bây giờ chúng ta có thể thêm nó vào đây bằng cách + +20 +00:01:20,630 --> 00:01:23,300 +sử dụng chuỗi f và cuối cùng là / đồ thị. + +21 +00:01:25,700 --> 00:01:27,920 +Bây giờ, hãy nhớ nếu bạn đang làm điều này cùng + +22 +00:01:27,950 --> 00:01:32,750 +với tôi, tên người dùng này sẽ phải là tên người dùng duy nhất của riêng bạn và mã thông báo sẽ là + +23 +00:01:32,750 --> 00:01:34,700 +mã thông báo bí mật của riêng bạn. + +24 +00:01:36,230 --> 00:01:38,360 +Khi chúng tôi đã tạo điểm kết thúc biểu đồ của mình, + +25 +00:01:38,600 --> 00:01:43,130 +bước tiếp theo là thực hiện yêu cầu đăng bài của chúng tôi. Một lần nữa, chúng tôi + +26 +00:01:43,160 --> 00:01:48,160 +sẽ sử dụng mô-đun yêu cầu của mình và gọi phương thức đăng + +27 +00:01:48,200 --> 00:01:52,760 +để thực hiện yêu cầu này. Lần này dữ liệu mà chúng ta muốn gửi là gì? + +28 +00:01:53,330 --> 00:01:53,690 +Chà, + +29 +00:01:53,690 --> 00:01:58,690 +chúng tôi muốn có thể thêm ID của biểu đồ mới của mình, vì vậy, một số cách + +30 +00:01:59,300 --> 00:02:04,300 +xác định nó trong URL, sau đó là tên của biểu đồ và sau đó là đơn vị + +31 +00:02:05,090 --> 00:02:09,590 +đo lường mà chúng tôi đang theo dõi. Ví dụ: nếu tôi đang theo dõi + +32 +00:02:09,590 --> 00:02:11,600 +quá trình đạp xe của + +33 +00:02:11,840 --> 00:02:14,540 +mình, thì đó sẽ là số km tôi đã + +34 +00:02:14,870 --> 00:02:18,950 +đạp xe hoặc nếu tôi muốn theo dõi khoảng thời gian tôi viết mã + +35 +00:02:18,980 --> 00:02:21,320 +thì đó có thể là phút hoặc giờ. + +36 +00:02:21,950 --> 00:02:25,850 +Và sau đó là kiểu dữ liệu của đơn vị đo lường. + +37 +00:02:26,240 --> 00:02:29,930 +Nếu tôi theo dõi số trang tôi đã đọc thì chúng sẽ là số nguyên, nếu tôi + +38 +00:02:30,320 --> 00:02:32,660 +theo dõi số km tôi đã chạy thì có lẽ nó + +39 +00:02:32,900 --> 00:02:36,470 +sẽ là một số dấu phẩy động. Và cuối cùng, chúng ta sẽ chỉ định màu + +40 +00:02:36,500 --> 00:02:39,530 +cho đồ thị của chúng ta. Ở đây bạn + +41 +00:02:39,530 --> 00:02:42,950 +phải cẩn thận một chút vì đây là những chuỗi + +42 +00:02:42,980 --> 00:02:46,160 +thực sự bằng tiếng Nhật. Vì vậy, ví + +43 +00:02:46,580 --> 00:02:48,680 +dụ, momiji là lá mùa thu. + +44 +00:02:49,250 --> 00:02:52,580 +shibafu là cỏ, sara là bầu trời, và họ có rất + +45 +00:02:53,300 --> 00:02:58,300 +nhiều cái tên thơ mộng cho từng màu sắc này, điều đó thật tuyệt vời, nhưng + +46 +00:02:58,790 --> 00:03:01,120 +nó cũng dễ xảy ra sai sót. + +47 +00:03:01,180 --> 00:03:05,590 +Vì vậy, bạn phải cẩn thận khi nhập màu mà bạn muốn. + +48 +00:03:05,800 --> 00:03:09,640 +Và nếu nghi ngờ, chỉ cần sao chép nó từ tài liệu. + +49 +00:03:10,930 --> 00:03:14,110 +Vì vậy, hãy tiếp tục và tạo cấu hình đồ thị của chúng tôi. + +50 +00:03:15,730 --> 00:03:20,080 +Để bắt đầu, tôi phải chỉ định một ID. Và trong trường hợp này, nó phải bắt đầu + +51 +00:03:20,110 --> 00:03:23,590 +bằng một số chữ cái từ A đến Z, và sau đó nó + +52 +00:03:23,920 --> 00:03:26,050 +có thể là chữ cái hoặc số. + +53 +00:03:26,500 --> 00:03:29,680 +Và nó phải có từ 1 đến 16 ký tự. + +54 +00:03:30,100 --> 00:03:33,280 +Giả sử rằng id của biểu đồ của tôi sẽ là + +55 +00:03:33,730 --> 00:03:38,730 +graph1, hãy lưu ý rằng chúng ta không thể có số ngay từ đầu vì những quy tắc này. + +56 +00:03:40,450 --> 00:03:42,460 +Tiếp theo là tên của đồ thị. + +57 +00:03:44,320 --> 00:03:46,750 +Vì vậy, của tôi sẽ là đồ thị chu kỳ của + +58 +00:03:47,830 --> 00:03:50,110 +tôi, và sau đó là đơn vị đo lường. + +59 +00:03:50,860 --> 00:03:55,030 +Vì tôi đang theo dõi quá trình đạp xe của mình, nó sẽ tính bằng km. + +60 +00:03:55,960 --> 00:04:00,880 +Và sau đó nó sẽ là loại dữ liệu mà tôi sẽ đăng trong + +61 +00:04:00,880 --> 00:04:03,310 +đơn vị này. Bởi vì đó là km, + +62 +00:04:03,490 --> 00:04:06,370 +tôi có thể sẽ có một số số sau dấu thập phân. + +63 +00:04:06,640 --> 00:04:09,730 +Vì vậy, tôi sẽ giữ nó dưới dạng float thay vì int. + +64 +00:04:10,780 --> 00:04:13,450 +Và cuối cùng, chúng ta sẽ chọn một màu. + +65 +00:04:14,080 --> 00:04:18,370 +Tôi sẽ chọn màu tím, ajisai, là hoa tú cầu. + +66 +00:04:18,910 --> 00:04:21,670 +Và để đảm bảo rằng tôi không mắc lỗi, + +67 +00:04:21,700 --> 00:04:24,160 +tôi sẽ sao chép và dán nó vào. + +68 +00:04:25,570 --> 00:04:30,520 +Đó là tất cả cấu hình đồ thị yêu cầu của tôi. Nhưng ngay bây giờ, nếu tôi làm + +69 +00:04:31,060 --> 00:04:33,280 +điều tương tự như tôi đã + +70 +00:04:33,310 --> 00:04:37,660 +làm trước đó là đặt điểm cuối biểu đồ của tôi làm URL + +71 +00:04:38,080 --> 00:04:42,460 +và sau đó JSON được đặt bằng cấu hình biểu đồ, nếu tôi + +72 +00:04:42,970 --> 00:04:47,440 +thực sự đăng bài này ngay bây giờ, nó sẽ không hoạt động . + +73 +00:04:47,680 --> 00:04:52,570 +Và nếu tôi in câu trả lời. văn bản, bạn sẽ thấy lý do. + +74 +00:04:54,610 --> 00:04:58,750 +Thông báo cho tôi biết rằng người dùng angela không tồn tại. + +75 +00:04:59,110 --> 00:05:03,790 +Tôi biết nó tồn tại bởi vì tôi đã tạo ở bước này và tôi đã nhận được phản hồi thành công + +76 +00:05:04,990 --> 00:05:09,940 +hoặc nó cho tôi biết rằng mã thông báo bị sai. Vì vậy, hãy suy nghĩ về nó. + +77 +00:05:09,970 --> 00:05:12,760 +Chúng tôi đã thực sự cung cấp mật khẩu của mình ở đâu? + +78 +00:05:12,760 --> 00:05:16,750 +Nếu chúng tôi cung cấp mã thông báo của mình trong yêu cầu này thì ở đâu? Hư không. + +79 +00:05:17,380 --> 00:05:19,930 +Nó không phải là một trong những khóa nội dung yêu cầu. + +80 +00:05:20,440 --> 00:05:24,070 +Vì vậy, làm thế nào để chúng tôi cung cấp xác thực của chúng tôi? Chà, sử dụng + +81 +00:05:24,070 --> 00:05:26,620 +tiêu đề yêu cầu là xong. + +82 +00:05:27,130 --> 00:05:29,080 +Chúng tôi phải cung cấp khóa này + +83 +00:05:29,170 --> 00:05:34,170 +và nó sẽ tìm kiếm mã thông báo mà chúng tôi đã sử dụng để đăng ký với Pixela. + +84 +00:05:35,650 --> 00:05:40,060 +Bạn thậm chí có thể đã nhận thấy trước đây khi chúng tôi làm việc với API + +85 +00:05:40,390 --> 00:05:42,820 +tin tức rằng khi chúng tôi xem xét xác + +86 +00:05:43,150 --> 00:05:48,150 +thực, mặc dù có ba phương pháp để xác thực, thông qua khóa API, tham số chuỗi truy vấn + +87 +00:05:49,330 --> 00:05:50,050 +là những + +88 +00:05:50,050 --> 00:05:55,050 +gì chúng tôi đã sử dụng hoặc thông qua X-Api -Tiêu đề HTTP chính hoặc thông qua tiêu đề + +89 +00:05:56,750 --> 00:05:57,680 +HTEP ủy quyền. + +90 +00:05:58,160 --> 00:06:02,810 +Và bạn có thể thấy rằng họ thực sự nói rằng chúng tôi thực sự khuyên bạn nên sử + +91 +00:06:02,810 --> 00:06:06,350 +dụng một trong hai cách sau, vì vậy hãy sử dụng tiêu đề HTTP. + +92 +00:06:06,830 --> 00:06:11,270 +Và lý do là vì khóa API của bạn không hiển thị với những người khác trong nhật ký hoặc + +93 +00:06:11,510 --> 00:06:13,730 +nếu họ đang thực hiện dò tìm yêu cầu. + +94 +00:06:14,990 --> 00:06:17,720 +Vậy chính xác thì những tiêu đề này là gì? + +95 +00:06:18,020 --> 00:06:21,290 +Nếu bạn nghĩ về một bức thư mà bạn có thể + +96 +00:06:21,530 --> 00:06:26,390 +nhận được trong thư, thì tiêu đề là phần chứa một số thông tin liên quan, + +97 +00:06:26,390 --> 00:06:27,350 +như, ừm, + +98 +00:06:27,620 --> 00:06:32,240 +số điện thoại của công ty hoặc trang web của công ty hoặc logo của họ. + +99 +00:06:32,780 --> 00:06:36,380 +Và sau đó phần thân là phần thông điệp thực sự theo cách tuần tự. + +100 +00:06:36,380 --> 00:06:40,610 +Đó là phần thay đổi từ chữ cái này sang chữ cái khác. Bây giờ, quay lại dự án + +101 +00:06:40,640 --> 00:06:45,640 +trước đó, nơi chúng tôi đã tạo ứng dụng cảnh báo tin tức chứng khoán của + +102 +00:06:46,970 --> 00:06:51,970 +mình, bạn có thể thấy rằng chúng tôi chỉ gửi khóa API của mình dưới dạng + +103 +00:06:53,810 --> 00:06:58,810 +một tham số cùng với yêu cầu nhận. Và điều này sẽ trông như thế nào + +104 +00:06:59,510 --> 00:07:04,220 +nếu chúng tôi thực hiện trong trình duyệt là chúng tôi đang sử dụng điểm cuối tin + +105 +00:07:04,670 --> 00:07:09,670 +tức, chúng tôi đưa nó vào thanh URL và sau đó chúng tôi thêm các tham số của mình. + +106 +00:07:10,700 --> 00:07:12,890 +Vì vậy, cái đầu tiên là khóa API. + +107 +00:07:14,540 --> 00:07:18,350 +Và tiếp theo là truy vấn thực tế. + +108 +00:07:19,550 --> 00:07:23,990 +Vì vậy, chúng tôi đã truy vấn tên công ty trong tiêu đề của mẩu tin tức + +109 +00:07:24,440 --> 00:07:26,600 +và chúng tôi đang tìm kiếm Tesla. + +110 +00:07:27,320 --> 00:07:31,460 +Điều này thực sự giống hệt như mã của chúng tôi ở đây. + +111 +00:07:31,970 --> 00:07:36,200 +Chúng tôi yêu cầu URL đó và chuyển các thông số này. + +112 +00:07:36,560 --> 00:07:39,770 +Không có sự khác biệt giữa cái này và cái kia. + +113 +00:07:40,370 --> 00:07:45,110 +Như bạn có thể tưởng tượng, tất cả những thứ bí mật của chúng tôi trong chính yêu cầu. + +114 +00:07:45,500 --> 00:07:47,450 +Vì vậy, nếu ai đó theo dõi điều + +115 +00:07:47,510 --> 00:07:51,710 +này, thì họ sẽ có thể xem tất cả thông tin này và họ có thể đánh + +116 +00:07:51,710 --> 00:07:54,890 +cắp khóa API của bạn. Bây giờ, một trong những + +117 +00:07:54,890 --> 00:07:59,890 +điều khiến bạn yên tâm là API này được truy cập thông qua HTTPS và chữ + +118 +00:08:01,880 --> 00:08:04,070 +S là viết tắt của an toàn. + +119 +00:08:04,400 --> 00:08:07,610 +Vì vậy, yêu cầu này thực sự được mã hóa, nhưng nó + +120 +00:08:07,970 --> 00:08:12,970 +không ngăn ai đó cài đặt thứ gì đó trên trình duyệt của bạn để xem bạn đang thực + +121 +00:08:13,130 --> 00:08:14,660 +hiện yêu cầu nào và + +122 +00:08:15,260 --> 00:08:20,260 +có một số trường hợp nhất định điều này có thể làm rò rỉ khóa API của bạn cho + +123 +00:08:21,530 --> 00:08:25,370 +ai đó mà bạn không muốn . Vì vậy, đối với một số nhà + +124 +00:08:25,400 --> 00:08:29,630 +cung cấp API, bạn sẽ thấy rằng họ muốn bạn cung cấp xác thực trong tiêu đề. + +125 +00:08:30,410 --> 00:08:35,240 +Hãy tiếp tục và làm điều đó. Vì vậy, chúng ta hãy lấy chìa khóa + +126 +00:08:35,870 --> 00:08:39,409 +mà họ đang mong đợi và hãy tạo một từ điển có tên + +127 +00:08:41,659 --> 00:08:44,210 +là tiêu đề, và hãy tạo khóa đó, và + +128 +00:08:44,540 --> 00:08:47,930 +sau đó giá trị sẽ là mã thông báo của chúng ta. + +129 +00:08:48,270 --> 00:08:51,950 +Đây là mật khẩu tuyệt mật của chúng tôi. Bây giờ, ngoài URL của + +130 +00:08:51,950 --> 00:08:56,950 +chúng tôi trên JSON mà chúng tôi đang gửi cho Pixela, chúng tôi cũng + +131 +00:08:57,390 --> 00:09:02,340 +sẽ thêm một đối số từ khóa tùy chọn được gọi là tiêu đề. + +132 +00:09:02,910 --> 00:09:07,860 +Điều này sẽ không hiển thị khi bạn bắt đầu nhập, không giống như JSON hoặc URL. + +133 +00:09:08,010 --> 00:09:12,990 +Và điều này là do nó là một trong những đối số kwargs hoặc từ khóa. + +134 +00:09:13,590 --> 00:09:17,370 +Và điều đó có nghĩa là bạn cũng phải viết đúng chính tả và đảm bảo rằng + +135 +00:09:17,460 --> 00:09:21,750 +bạn không mắc bất kỳ lỗi chính tả nào. Đó là tiêu đề có chữ S ở cuối. + +136 +00:09:22,260 --> 00:09:26,370 +Và sau đó chúng ta sẽ chuyển các tiêu đề biến của chúng ta vào tham số này. + +137 +00:09:27,990 --> 00:09:31,350 +Bây giờ những gì chúng tôi sẽ thực hiện yêu cầu của mình một lần nữa và bạn có + +138 +00:09:31,830 --> 00:09:35,640 +thể thấy lần này khi chúng tôi in phản hồi. văn bản, nó mang lại cho chúng tôi + +139 +00:09:35,730 --> 00:09:40,730 +thành công và hiện chúng tôi đã quản lý để thiết lập biểu đồ đi xe đạp hoàn toàn mới của mình. + +140 +00:09:42,890 --> 00:09:45,290 +Vì vậy, nếu chúng ta quay lại bước ba, chúng + +141 +00:09:45,410 --> 00:09:50,410 +ta thực sự có thể tiếp tục và xem biểu đồ chu kỳ của mình bằng cách truy cập URL này và + +142 +00:09:50,840 --> 00:09:55,550 +thay thế phần này là tên người dùng của người sáng tạo bằng tên người dùng của chính chúng ta, + +143 +00:09:55,580 --> 00:09:58,490 +vì vậy tôi là angela. Của bạn sẽ là một cái gì đó khác. + +144 +00:09:58,790 --> 00:10:02,540 +Và chúng tôi cũng sẽ thay thế phần cuối cùng này bằng ID của chúng + +145 +00:10:02,720 --> 00:10:05,090 +tôi, trong trường hợp của tôi chỉ là graph1. + +146 +00:10:05,870 --> 00:10:09,890 +Bây giờ cuối cùng chúng ta sẽ gắn thẻ. html ở cuối và khi tôi nhấn + +147 +00:10:09,980 --> 00:10:11,120 +enter, bạn sẽ + +148 +00:10:11,480 --> 00:10:16,480 +thấy nó chuyển đến biểu đồ chu kỳ hoàn toàn mới của tôi ngay tại đây. + +149 +00:10:17,150 --> 00:10:20,900 +Và nó sẽ có màu tím, trông rất đẹp và sẽ bắt đầu + +150 +00:10:20,900 --> 00:10:23,840 +theo dõi dữ liệu đi xe đạp của tôi. + +151 +00:10:25,070 --> 00:10:29,750 +Vì vậy, đây là cách chúng ta có thể tự xác thực bằng cách sử dụng tiêu + +152 +00:10:30,140 --> 00:10:35,140 +đề và mô-đun yêu cầu giúp việc chuyển qua tiêu đề dễ dàng như truyền qua các tham số + +153 +00:10:35,990 --> 00:10:40,990 +khác hoặc các phần khác của nội dung thư. Trong bài học tiếp theo, chúng ta + +154 +00:10:41,660 --> 00:10:46,100 +sẽ chuyển sang bước 4 để cuối cùng chúng ta có thể thêm một + +155 +00:10:46,130 --> 00:10:48,740 +pixel dữ liệu vào biểu đồ của mình. + +156 +00:10:49,250 --> 00:10:51,830 +Vì vậy, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/004 Challenge Add a Pixel to the Habit Tracker using a Post Request.mp4 b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/004 Challenge Add a Pixel to the Habit Tracker using a Post Request.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..24e6a29d4955a01d4f83e4451de45d43374d9378 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/004 Challenge Add a Pixel to the Habit Tracker using a Post Request.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad5ed2107469c8978a424d55b27777792accdd1760ef10b0548a43594fc5ed3a +size 55290075 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/004 Challenge Add a Pixel to the Habit Tracker using a Post Request_vi.srt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/004 Challenge Add a Pixel to the Habit Tracker using a Post Request_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d29cb005eab1c9864dd579bde7cc16cd5d86d376 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/004 Challenge Add a Pixel to the Habit Tracker using a Post Request_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,120 --> 00:00:03,000 +Vì vậy, bây giờ chúng tôi cuối cùng đã sẵn sàng để chuyển sang bước cuối + +2 +00:00:03,330 --> 00:00:05,939 +cùng, đó là đăng một giá trị lên biểu đồ của chúng tôi. + +3 +00:00:06,360 --> 00:00:10,920 +Và điều này sẽ tạo ra một pixel mới trên biểu đồ thói quen của chúng ta. + +4 +00:00:11,820 --> 00:00:15,570 +Vì vậy, tôi muốn bạn kéo lên phần tài + +5 +00:00:15,660 --> 00:00:18,630 +liệu liên quan sẽ đăng một pixel. + +6 +00:00:19,320 --> 00:00:24,320 +Và tôi muốn bạn xem qua phần mô tả, phần tiêu đề và phần nội dung, và xem liệu bạn có + +7 +00:00:25,470 --> 00:00:28,320 +thể hoàn thành bước này như một thử thách hay không. + +8 +00:00:28,710 --> 00:00:33,330 +Lưu ý rằng, trước tiên, điểm cuối lại khác và mọi thứ bên trong các + +9 +00:00:33,330 --> 00:00:34,163 +dấu ngoặc + +10 +00:00:34,170 --> 00:00:38,520 +nhọn này cần được thay thế bằng các giá trị thực của bạn. + +11 +00:00:38,580 --> 00:00:42,660 +Vì vậy, tên người dùng thực tế của bạn và ID biểu đồ thực tế của bạn. Ngoài ra, đây một lần nữa + +12 +00:00:42,720 --> 00:00:47,720 +sẽ là một yêu cầu đăng và nó yêu cầu xác thực trong tiêu + +13 +00:00:48,150 --> 00:00:50,670 +đề yêu cầu. Cuối cùng, bạn + +14 +00:00:50,670 --> 00:00:55,530 +phải cung cấp ngày ở định dạng bốn ký tự cho năm, hai ký + +15 +00:00:55,530 --> 00:00:58,710 +tự cho tháng và hai ký tự cho ngày. + +16 +00:00:59,010 --> 00:01:01,380 +Vì vậy, hôm nay sẽ + +17 +00:01:01,410 --> 00:01:04,739 +là năm 2020 0724 ở định dạng này. + +18 +00:01:05,280 --> 00:01:09,750 +Và sau đó bạn phải cung cấp số lượng mà bạn muốn thêm vào pixel ngày hôm nay. + +19 +00:01:10,050 --> 00:01:14,250 +Vì vậy, nếu bạn đã đạp xe 10. 5 km, sau đó sẽ là 10. 5. + +20 +00:01:14,640 --> 00:01:19,080 +Nếu ban đầu bạn thiết lập biểu đồ của mình để theo dõi số nguyên, chẳng hạn như + +21 +00:01:19,080 --> 00:01:22,590 +số trang bạn đọc trong một cuốn sách, thì đó sẽ là số. + +22 +00:01:23,310 --> 00:01:27,780 +Vì vậy, tôi muốn bạn tạm dừng video và xem liệu bạn có thể hoàn thành bước này như một + +23 +00:01:27,780 --> 00:01:29,850 +thử thách hay không. Đi ngay bây giờ. + +24 +00:01:33,260 --> 00:01:37,430 +Được rồi. Vì vậy, điều đầu tiên chúng tôi sẽ làm là cập nhật điểm cuối của chúng tôi. + +25 +00:01:38,720 --> 00:01:42,590 +Tôi sẽ bình luận về bước trước này bởi vì chúng tôi đã tạo biểu đồ của mình + +26 +00:01:43,040 --> 00:01:45,890 +và bây giờ chúng tôi sẽ chuyển sang tạo pixel của chúng tôi. + +27 +00:01:46,010 --> 00:01:48,890 +Vì vậy, đó là những gì tôi sẽ gọi là điểm cuối của mình. + +28 +00:01:51,260 --> 00:01:55,550 +Bây giờ, điểm cuối tạo pixel này rõ ràng không phải là thứ chúng ta cần. + +29 +00:01:55,610 --> 00:01:59,990 +Chúng tôi cần định dạng URL này để chúng tôi thêm + +30 +00:02:00,110 --> 00:02:04,520 +vào phần đầu tiên là điểm cuối pixela đi tới / người dùng. + +31 +00:02:05,330 --> 00:02:07,160 +Vì vậy, đó là tất cả của phần này. + +32 +00:02:07,280 --> 00:02:11,180 +Vì vậy, chúng ta có thể sử dụng một chuỗi f và thêm điểm cuối pixel. + +33 +00:02:11,570 --> 00:02:16,370 +Và sau đó chúng ta sẽ thay thế / username bằng tên người dùng của chính + +34 +00:02:16,400 --> 00:02:19,880 +chúng ta, sau đó là / graphs và chúng ta cũng phải + +35 +00:02:20,030 --> 00:02:23,930 +thay thế ID biểu đồ này. Và trong trường hợp của + +36 +00:02:23,930 --> 00:02:26,570 +tôi, ID biểu đồ chỉ đơn giản là graph1. + +37 +00:02:26,990 --> 00:02:30,830 +Vì vậy, cũng có thể hợp lý khi tạo một hằng số cho điều đó, + +38 +00:02:31,160 --> 00:02:31,993 +1: phải không? + +39 +00:02:41,630 --> 00:02:45,950 +0: Để chúng ta có thể sử dụng nó ở cuối điểm cuối này. + +40 +00:02:47,090 --> 00:02:49,550 +Vì vậy, bây giờ chúng ta đã tạo + +41 +00:02:49,940 --> 00:02:53,420 +xong điểm kết thúc, bước tiếp theo là tạo phần thân yêu cầu. + +42 +00:02:53,780 --> 00:02:56,570 +Vì vậy, vượt qua ngày tháng và số lượng. + +43 +00:02:57,620 --> 00:02:59,740 +Vì vậy, tôi sẽ tạo pixel_data, + +44 +00:03:00,790 --> 00:03:04,000 +và điều này đầu tiên sẽ có ngày tháng, nhưng nó + +45 +00:03:04,300 --> 00:03:07,360 +phải được định dạng theo cách họ đã chỉ định. + +46 +00:03:07,510 --> 00:03:11,350 +Vì vậy, bốn ký tự cho năm, là năm 2020, sau đó là hai + +47 +00:03:11,380 --> 00:03:13,060 +ký tự cho tháng, 07 + +48 +00:03:13,330 --> 00:03:15,850 +và sau đó là hai ký tự cho ngày. + +49 +00:03:16,510 --> 00:03:21,510 +Nhưng lưu ý ở đây rằng họ chỉ định kiểu dữ liệu cho ngày phải là một chuỗi. + +50 +00:03:22,390 --> 00:03:24,640 +Vì vậy, chúng ta không thể đơn giản để nó như một con số. + +51 +00:03:24,790 --> 00:03:27,610 +Vì vậy, chúng ta phải thêm một số dấu ngoặc kép xung quanh nó. + +52 +00:03:28,480 --> 00:03:31,360 +Và sau đó, cuối cùng chúng ta có thể + +53 +00:03:31,480 --> 00:03:35,140 +thêm dữ liệu thực tế sẽ đi dưới đại lượng chính + +54 +00:03:35,680 --> 00:03:37,840 +và đây cũng sẽ là một + +55 +00:03:38,140 --> 00:03:41,830 +chuỗi và đây là đại lượng mà chúng ta sẽ đăng ký + +56 +00:03:42,070 --> 00:03:46,360 +trong pixel và điều đó sẽ xác định cường độ của pixel thực tế. + +57 +00:03:47,320 --> 00:03:51,370 +Vì vậy, trong trường hợp của tôi, tôi đã thực sự đi một chuyến đi nhanh hôm nay. Ừm, và số liệu thống kê + +58 +00:03:51,880 --> 00:03:55,480 +của tôi không phải là tuyệt vời, nhưng, ừm, tôi vẫn sẽ + +59 +00:03:55,780 --> 00:03:56,890 +ghi lại nó. + +60 +00:03:57,040 --> 00:04:00,790 +Vì vậy, đó là 9. 74 km mà tôi đã đạp xe. + +61 +00:04:01,660 --> 00:04:06,640 +Vì vậy, đó là số lượng của tôi sẽ là, 9. 74. Và một lần nữa, đây + +62 +00:04:06,670 --> 00:04:10,690 +là một chuỗi vì đó là những gì tài liệu cho chúng ta biết. + +63 +00:04:12,160 --> 00:04:14,320 +Và hãy nhớ rằng khi bạn thiết lập đồ thị của mình, + +64 +00:04:14,410 --> 00:04:17,079 +nếu bạn thiết lập kiểu dữ liệu để nhận số float, thì bạn thực sự + +65 +00:04:17,380 --> 00:04:21,339 +có thể cung cấp cho nó một số dấu phẩy động. Nếu bạn thiết lập nó là int, thì + +66 +00:04:21,350 --> 00:04:23,380 +bạn phải cung cấp cho nó một số nguyên. + +67 +00:04:24,340 --> 00:04:26,650 +Bây giờ chúng tôi đã có dữ liệu và điểm cuối của mình, sau đó chúng tôi cuối + +68 +00:04:26,680 --> 00:04:31,330 +cùng đã sẵn sàng để tạo các yêu cầu của mình. Vì vậy, bạn yêu cầu. bài viết. + +69 +00:04:31,690 --> 00:04:32,590 +Và một + +70 +00:04:32,620 --> 00:04:36,910 +lần nữa, URL của chúng tôi sẽ là điểm cuối tạo pixel mới này. + +71 +00:04:38,230 --> 00:04:42,100 +JSON của chúng tôi mà chúng tôi sẽ chuyển qua là pixel_data của chúng tôi + +72 +00:04:42,820 --> 00:04:43,990 +và cuối cùng, chúng + +73 +00:04:44,020 --> 00:04:47,920 +tôi sẽ sử dụng lại các tiêu đề mà chúng tôi đã có từ trước đó, + +74 +00:04:48,340 --> 00:04:52,750 +bởi vì nó vẫn chứa cùng một mã thông báo mà chúng tôi cần xác thực chính mình. + +75 +00:04:53,440 --> 00:04:56,350 +Vì vậy, hãy xem phản hồi mà chúng tôi nhận lại là gì. + +76 +00:04:56,470 --> 00:05:01,470 +Vì vậy, tôi sẽ in ra phản hồi. nhắn tin và hy vọng nếu mọi thứ + +77 +00:05:03,790 --> 00:05:07,450 +suôn sẻ, thì chúng ta sẽ nhận được thông báo thành công. + +78 +00:05:08,110 --> 00:05:10,570 +Nhưng bây giờ là phần thú vị nhất. + +79 +00:05:10,780 --> 00:05:14,710 +Bạn có thể quay lại biểu đồ chu kỳ của chúng tôi và sau đó nhấn làm + +80 +00:05:15,040 --> 00:05:20,040 +mới và chúng tôi sẽ thấy tất cả pixel hoàn toàn mới hiển thị trong biểu đồ của chúng tôi ngay tại đó. + +81 +00:05:22,540 --> 00:05:26,980 +Và nó cho chúng ta biết hôm nay chúng ta đã đạp xe số 9. 74 km. + +82 +00:05:28,300 --> 00:05:30,520 +Có một điều bạn có thể thắc mắc là, + +83 +00:05:30,580 --> 00:05:33,370 +làm thế nào chúng ta có thể tự động hóa ngày này? + +84 +00:05:33,400 --> 00:05:36,550 +Bởi vì tôi không muốn phải kiểm tra ngày tháng và nhập nó vào. + +85 +00:05:36,790 --> 00:05:40,510 +Chúng ta có thể sử dụng mô-đun thời gian ngày, phải không? Vì vậy, trong bài học tiếp theo, + +86 +00:05:40,540 --> 00:05:45,370 +tôi sẽ chỉ cho bạn cách bạn có thể sử dụng một phương thức có tên là strftime để + +87 +00:05:45,370 --> 00:05:50,370 +định dạng ngày giờ mà bạn nhận được từ Python thành bất kỳ định dạng nào mà bạn yêu cầu. + +88 +00:05:51,820 --> 00:05:54,640 +Đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 Autofilling today's date using strftime.mp4 b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 Autofilling today's date using strftime.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..289ba986a2ba571cdf5108c6b895bad42124a6e7 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 Autofilling today's date using strftime.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d5538730ae279fed40460f8e85a8edbf18800db24808b918681a52d56cf980d +size 28767667 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 Autofilling today's date using strftime_vi.srt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 Autofilling today's date using strftime_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a9c54669c2556655533b0d5f5da993c77063cc2c --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 Autofilling today's date using strftime_vi.srt @@ -0,0 +1,248 @@ +1 +00:00:00,180 --> 00:00:04,170 +Trong bài học trước, chúng ta đã biết cách tạo một pixel. + +2 +00:00:04,560 --> 00:00:08,220 +Nhưng một trong những điều thú vị là thay vì phải nhập + +3 +00:00:08,220 --> 00:00:09,053 +nó theo + +4 +00:00:09,240 --> 00:00:14,240 +cách thủ công, tôi thực sự muốn có thể tạo nó bằng cách sử dụng mô-đun ngày-giờ. + +5 +00:00:15,090 --> 00:00:19,500 +Tôi có thể nhập ngày giờ của mình, vì vậy từ + +6 +00:00:19,530 --> 00:00:22,860 +mô-đun datetime, tôi sẽ nhập lớp datetime. + +7 +00:00:23,550 --> 00:00:28,550 +Và bây giờ tôi có thể sử dụng nó để lấy ngày hôm nay bằng cách khai thác vào ngày giờ. bây giờ. + +8 +00:00:30,330 --> 00:00:31,950 +Nhưng nếu tôi in nó + +9 +00:00:32,040 --> 00:00:37,040 +ra, bạn có thể thấy rằng nó rõ ràng sẽ không ở định dạng mà tôi + +10 +00:00:37,080 --> 00:00:37,770 +cần. + +11 +00:00:37,770 --> 00:00:42,770 +Vì vậy, tôi sẽ bình luận về yêu cầu của mình và tôi sẽ xem xét dữ liệu + +12 +00:00:42,900 --> 00:00:46,260 +của mình trông như thế nào. Điều này chứa ngày + +13 +00:00:46,560 --> 00:00:49,530 +và giờ và nó ở một định dạng khác. + +14 +00:00:50,460 --> 00:00:53,910 +Vì vậy, bất cứ khi nào chúng ta gặp một API mới hoặc một dịch vụ mới, + +15 +00:00:54,180 --> 00:00:58,980 +họ thường muốn ngày và giờ ở một định dạng khác. Ví dụ, ở châu Á, năm có + +16 +00:00:58,980 --> 00:01:02,430 +xu hướng đến trước, ở Mỹ hoặc ở Anh, năm + +17 +00:01:02,550 --> 00:01:04,440 +có xu hướng đến cuối. + +18 +00:01:05,250 --> 00:01:09,660 +Làm thế nào chúng ta có thể định dạng ngày trong Python thành bất kỳ định dạng nào chúng ta cần? Chà, có một phương + +19 +00:01:09,720 --> 00:01:14,720 +thức thực sự hữu ích được gọi là phương thức strftime. + +20 +00:01:15,630 --> 00:01:20,630 +Và điều này cho phép chúng ta chuyển một chuỗi sẽ định dạng ngày mà chúng + +21 +00:01:21,180 --> 00:01:25,680 +ta lấy lại từ datetime sang bất kỳ định dạng nào chúng ta cần. + +22 +00:01:26,250 --> 00:01:27,083 +Ví dụ: + +23 +00:01:27,180 --> 00:01:32,180 +nếu chúng ta vượt qua% a thì chúng ta sẽ nhận được phiên bản ngắn + +24 +00:01:32,400 --> 00:01:35,700 +của ngày trong tuần. Nếu chúng ta vượt qua% + +25 +00:01:35,760 --> 00:01:40,050 +b, thì chúng ta sẽ nhận được tên đầy đủ của tháng, v.v. + +26 +00:01:40,230 --> 00:01:45,230 +Vì vậy, chúng ta có thể sử dụng bảng này để thực sự tạo định dạng ngày chính xác mà chúng ta cần. + +27 +00:01:46,380 --> 00:01:51,380 +Hãy tiếp tục và thực hiện điều này ngay hôm nay và hãy tiếp tục sử dụng strftime và chúng ta + +28 +00:01:54,690 --> 00:01:57,300 +sẽ chuyển vào một chuỗi. Bây giờ, chuỗi + +29 +00:01:57,300 --> 00:02:01,260 +đầu tiên chúng ta cần là năm trong phiên bản đầy đủ. + +30 +00:02:01,290 --> 00:02:04,710 +Vì vậy, đây sẽ là% Y và nó là Y viết hoa. + +31 +00:02:06,120 --> 00:02:09,449 +Bây giờ, nếu bạn cần dấu gạch ngang, thì bạn có thể thêm dấu gạch ngang. Nếu bạn cần một khoảng trống, + +32 +00:02:09,479 --> 00:02:12,870 +bạn có thể thêm một khoảng trắng. Nhưng trong trường hợp của tôi, tôi thực sự muốn tất cả cùng nhau. + +33 +00:02:13,230 --> 00:02:16,140 +Vì vậy, điều tiếp theo tôi muốn là tháng dưới dạng một con số. + +34 +00:02:16,170 --> 00:02:18,360 +Vì vậy, đó là% m và + +35 +00:02:19,980 --> 00:02:23,280 +sau đó là% d để có được ngày trong tháng. + +36 +00:02:25,980 --> 00:02:28,500 +Bây giờ, nếu tôi thực sự in nó ra, bạn + +37 +00:02:31,770 --> 00:02:35,760 +có thể thấy rằng nó được định dạng ở định dạng chính xác mà tôi cần. + +38 +00:02:35,850 --> 00:02:39,180 +Và nếu tôi muốn thêm a, tôi không biết, asterix ở đó + +39 +00:02:39,240 --> 00:02:41,940 +thì nó sẽ định dạng nó như thế. + +40 +00:02:42,240 --> 00:02:47,010 +Nếu tôi muốn thay đổi ngày thành một từ như Thứ Tư hoặc Tháng Mười Hai, thì tôi + +41 +00:02:47,040 --> 00:02:49,200 +chỉ cần thay đổi chuỗi định dạng đó. + +42 +00:02:50,760 --> 00:02:54,900 +Bây giờ chúng tôi đã quản lý để làm điều này, sau đó chúng tôi có thể lấy ngày giờ của + +43 +00:02:54,900 --> 00:02:59,320 +mình theo chương trình bằng cách sử dụng ngày giờ. bây giờ phương pháp. + +44 +00:02:59,860 --> 00:03:03,280 +Chúng tôi cũng có thể sử dụng nó để tạo bất kỳ ngày giờ nào chúng tôi chọn. + +45 +00:03:03,490 --> 00:03:07,720 +Vì vậy, giả sử tôi muốn một nhạc nền để tạo pixel cho ngày hôm qua. + +46 +00:03:08,080 --> 00:03:12,730 +Vậy thì tôi có thể chỉ cần tạo ngày giờ của + +47 +00:03:13,240 --> 00:03:17,320 +mình bằng cách chỉ định năm, tháng và ngày. + +48 +00:03:17,350 --> 00:03:18,790 +Vì vậy, ngày 24 của ngày hôm nay. + +49 +00:03:18,820 --> 00:03:23,820 +Vì vậy, ngày hôm qua là ngày 23 và sau đó sẽ lấy ngày đó và nó sẽ định + +50 +00:03:23,890 --> 00:03:28,000 +dạng nó thành định dạng chính xác và sau đó đăng một số lượng. + +51 +00:03:28,240 --> 00:03:30,700 +Vì vậy, giả sử rằng ngày hôm qua tôi đã đạp + +52 +00:03:30,940 --> 00:03:34,630 +xe, tôi đã đạp xe nhiều hơn một chút, giả sử nó đã đi được 15 km. + +53 +00:03:35,320 --> 00:03:39,040 +Bây giờ nếu tôi tiếp tục và bỏ ghi chú này và chạy lại, + +54 +00:03:39,070 --> 00:03:43,270 +nó sẽ đăng phần dữ liệu mới nhất lên pixela và nếu bây giờ chúng tôi + +55 +00:03:43,750 --> 00:03:45,460 +cập nhật biểu đồ của mình, + +56 +00:03:45,580 --> 00:03:50,580 +bạn có thể thấy tôi hiện có hai pixel và cái này nặng hơn rất nhiều về mặt màu sắc + +57 +00:03:51,730 --> 00:03:55,960 +để cho thấy rằng tôi đã đạp xe xa hơn rất nhiều so với ngày hôm nay. + +58 +00:03:57,070 --> 00:04:01,150 +Và bây giờ chúng ta có tổng số km, tối đa, tối + +59 +00:04:01,150 --> 00:04:03,610 +thiểu, trung bình và tổng số pixel. + +60 +00:04:04,660 --> 00:04:08,530 +Điều cuối cùng tôi muốn cho bạn thấy trước khi chúng ta kết thúc dự án + +61 +00:04:08,530 --> 00:04:13,530 +này là cách chúng ta có thể cập nhật và xóa pixel bằng cách sử dụng yêu cầu đặt và xóa. + +62 +00:04:15,430 --> 00:04:17,290 +Đó là những gì chúng ta sẽ làm trong bài học tiếp theo. + diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 w3schools-Python-Date-Formatting-with-strftime.url b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 w3schools-Python-Date-Formatting-with-strftime.url new file mode 100644 index 0000000000000000000000000000000000000000..e0e0eef30b44c974d9e6cf4c79af0a41a6bcb18c --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/005 w3schools-Python-Date-Formatting-with-strftime.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/python/python_datetime.asp \ No newline at end of file diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 Course-Fixes-Report-an-Issue.url b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 How to use HTTP Put and Delete Requests.mp4 b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 How to use HTTP Put and Delete Requests.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0b9f14e310752f8617e33eb27ec738e242724444 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 How to use HTTP Put and Delete Requests.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20285f59e666319d836ed6e8309b329b2975ab97262bdd84a99f3ca7b81f1b8c +size 63230334 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 How to use HTTP Put and Delete Requests_vi.srt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 How to use HTTP Put and Delete Requests_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6008953af334c515da7987bd79799f518d31950d --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 How to use HTTP Put and Delete Requests_vi.srt @@ -0,0 +1,372 @@ +1 +00:00:00,150 --> 00:00:02,820 +Bây giờ trong phần đầu của các bài học hôm nay, + +2 +00:00:02,880 --> 00:00:07,880 +tôi đã đề cập rằng chúng ta có thể thực hiện các yêu cầu khác ngoài nhận và đăng như + +3 +00:00:08,580 --> 00:00:09,413 +đặt và xóa. + +4 +00:00:09,900 --> 00:00:14,900 +Và chúng tôi có thể làm điều đó bằng cách sử dụng một định dạng tương tự như chúng tôi đã làm cho get và post. + +5 +00:00:15,750 --> 00:00:20,250 +Chỉ bằng cách đơn giản thay đổi phương pháp, chúng ta sẽ có một hành vi khác. + +6 +00:00:20,850 --> 00:00:25,850 +Vì vậy, put sẽ thay đổi một phần dữ liệu hiện có và xóa sẽ xóa phần + +7 +00:00:26,760 --> 00:00:29,160 +dữ liệu đó. Hãy thử nó để biết kích thước. + +8 +00:00:29,790 --> 00:00:34,440 +Nếu chúng tôi đi vào tài liệu và chúng tôi cuộn xuống tất cả những điều chúng tôi có + +9 +00:00:34,440 --> 00:00:36,120 +thể làm đối với pixel, bạn + +10 +00:00:36,120 --> 00:00:39,840 +có thể thấy chúng tôi cũng có thể cập nhật pixel, được đặt và xóa pixel. + +11 +00:00:40,200 --> 00:00:44,850 +Vì vậy, chúng ta hãy nhấp vào cập nhật trước và hãy nói rằng, ừm, tôi đã quyết định rằng ngày hôm + +12 +00:00:44,940 --> 00:00:49,620 +qua tôi đã không thực sự đạp xe 15 km. Tôi đã nói dối. + +13 +00:00:49,650 --> 00:00:54,330 +Tôi chỉ đạp xe 4 cái. Chà, chúng ta sẽ làm điều đó như thế nào? Chà, chúng tôi sẽ + +14 +00:00:54,340 --> 00:00:59,340 +sử dụng tài liệu ở đây và cả phương pháp put để đạt được điều này. + +15 +00:01:00,660 --> 00:01:05,250 +Vì vậy, tôi muốn bạn thử và xem liệu bạn có thể tìm ra nó không. Bây giờ, tôi đã nói với + +16 +00:01:05,310 --> 00:01:09,810 +bạn rằng bạn cần sử dụng phương thức put và bạn biết cách định dạng + +17 +00:01:09,840 --> 00:01:13,860 +các điểm cuối và cung cấp phần thân yêu cầu và phần đầu. + +18 +00:01:14,160 --> 00:01:17,370 +Vì vậy, hãy tạm dừng video và thực hiện thử thách này. + +19 +00:01:19,730 --> 00:01:20,390 +1: Đúng không? + +20 +00:01:20,390 --> 00:01:20,720 +0: Được rồi. + +21 +00:01:20,720 --> 00:01:25,720 +Vì vậy, điều đầu tiên chúng tôi sẽ làm là sao chép định dạng mới này + +22 +00:01:25,910 --> 00:01:29,630 +của điểm cuối và tôi sẽ bình luận phần trước nơi + +23 +00:01:29,630 --> 00:01:34,610 +chúng tôi đã đăng pixel của mình và tôi sẽ tạo điểm cuối mới này. + +24 +00:01:34,640 --> 00:01:36,800 +Vì vậy, đây là update_endpoint và nó + +25 +00:01:38,660 --> 00:01:42,470 +sẽ là sự kết hợp của tất cả mọi thứ cho đến nay, + +26 +00:01:42,680 --> 00:01:44,450 +đó là pixela 1 của chúng + +27 +00:01:44,630 --> 00:01:45,463 +tôi: ... + +28 +00:01:47,480 --> 00:01:50,840 +0: điểm cuối. Và sau đó là tên người dùng của + +29 +00:01:53,570 --> 00:01:56,360 +riêng bạn, sau đó là biểu đồ và sau đó là ID biểu đồ. + +30 +00:01:58,760 --> 00:02:00,800 +Và cuối cùng, đó là năm, + +31 +00:02:00,800 --> 00:02:04,850 +tháng và ngày cho phần dữ liệu mà bạn thực sự muốn cập nhật. + +32 +00:02:05,870 --> 00:02:09,530 +Vì vậy, giả sử rằng tôi sẽ cập nhật phần dữ liệu của ngày hôm + +33 +00:02:09,560 --> 00:02:11,870 +qua mà tôi đã tạo thủ công ở đây. + +34 +00:02:11,960 --> 00:02:15,320 +Và tôi đã định dạng bằng cách sử dụng strftime ngay tại đây. + +35 +00:02:15,830 --> 00:02:20,830 +Vì vậy, tôi sẽ thay thế điều này bằng một tập hợp các dấu ngoặc nhọn + +36 +00:02:22,220 --> 00:02:25,460 +và dán nó vào đó. Bây giờ hãy chú ý, + +37 +00:02:25,460 --> 00:02:28,850 +bởi vì tôi có hai bộ dấu ngoặc kép này, nó + +38 +00:02:28,910 --> 00:02:30,380 +sẽ hơi nhầm lẫn. + +39 +00:02:30,680 --> 00:02:34,790 +Vì vậy, tôi sẽ thay đổi một trong những bộ đó thành một trích dẫn duy nhất để thay thế. + +40 +00:02:35,480 --> 00:02:38,960 +Và bây giờ tôi đã loại bỏ tất cả các lỗi và cảnh báo của mình. + +41 +00:02:40,220 --> 00:02:42,560 +Vì vậy, đây là điểm cuối cập nhật của chúng tôi. + +42 +00:02:43,130 --> 00:02:46,580 +Và điều duy nhất mà chúng ta sẽ thay đổi là số lượng. + +43 +00:02:47,810 --> 00:02:51,980 +Giả sử tôi tạo một từ điển dữ liệu pixel mới. + +44 +00:02:52,430 --> 00:02:57,430 +Và bây giờ số lượng của tôi thay vì là 15 km, thực ra, giả sử là 4. 5. + +45 +00:03:03,160 --> 00:03:04,990 +Vì vậy, đây là dữ liệu pixel mới + +46 +00:03:05,410 --> 00:03:08,470 +của tôi và bây giờ tôi đã sẵn sàng thực hiện yêu cầu của mình. + +47 +00:03:08,860 --> 00:03:12,040 +Vì vậy, chúng tôi đang sử dụng các yêu cầu. đặt, và sau đó + +48 +00:03:12,340 --> 00:03:15,970 +URL sẽ là điểm cuối cập nhật, JSON sẽ là + +49 +00:03:16,630 --> 00:03:20,170 +dữ liệu pixel mới của chúng tôi và cuối + +50 +00:03:20,710 --> 00:03:25,330 +cùng, tiêu đề sẽ là tiêu đề của chúng tôi để xác thực. + +51 +00:03:26,550 --> 00:03:27,383 +1: Đúng. + +52 +00:03:33,240 --> 00:03:35,880 +0: Vì vậy, bây giờ chúng ta hãy tiếp tục và chạy đoạn mã này. + +53 +00:03:36,480 --> 00:03:41,460 +Và một khi chúng tôi nhận được thành công thông điệp của mình, chúng tôi có thể quay lại biểu đồ + +54 +00:03:41,700 --> 00:03:42,533 +của mình, làm + +55 +00:03:42,990 --> 00:03:47,880 +mới nó và bạn sẽ thấy rằng pixel của ngày hôm qua không còn dày đặc như trước nữa. + +56 +00:03:47,970 --> 00:03:48,720 +Và trên thực + +57 +00:03:48,720 --> 00:03:53,610 +tế, nó bây giờ bị mất một chút màu sắc và nó đã được cập nhật với giá trị mới. + +58 +00:03:55,290 --> 00:03:56,130 +Vì vậy, cuối + +59 +00:03:56,130 --> 00:04:01,130 +cùng, chúng tôi có phương pháp xóa của mình và chúng tôi sẽ sử dụng phương pháp đó để xóa một pixel. + +60 +00:04:04,620 --> 00:04:06,690 +Một lần nữa, tôi muốn bạn làm điều này một mình. + +61 +00:04:06,750 --> 00:04:11,750 +Xem liệu bạn có thể xóa một trong các pixel trong biểu đồ của mình bằng cách sử dụng điểm cuối và tài + +62 +00:04:11,880 --> 00:04:12,750 +liệu hay không. + +63 +00:04:14,190 --> 00:04:15,023 +1: Đi! + +64 +00:04:16,410 --> 00:04:20,700 +0: Được rồi. Vì vậy, điểm cuối giống hệt với điểm cuối cập nhật. + +65 +00:04:20,730 --> 00:04:25,730 +Vì vậy, tôi chỉ đơn giản là sẽ sao chép nó và tạo một cái mới có tên là xóa. + +66 +00:04:27,960 --> 00:04:32,610 +Và tôi cũng sẽ bình luận yêu cầu này để tôi sử dụng + +67 +00:04:32,610 --> 00:04:36,990 +yêu cầu này thay thế. Bây giờ điểm cuối xóa không thực sự lấy bất kỳ dữ + +68 +00:04:37,170 --> 00:04:38,580 +liệu nào, nhưng nó cần tiêu đề. + +69 +00:04:39,120 --> 00:04:44,120 +Vì vậy, chúng tôi có thể sử dụng mô-đun yêu cầu của mình và gọi phương thức + +70 +00:04:45,630 --> 00:04:49,230 +xóa và chuyển vào điểm cuối là điểm cuối xóa, tiêu đề + +71 +00:04:49,260 --> 00:04:51,720 +là tiêu đề xác thực của chúng tôi + +72 +00:04:52,260 --> 00:04:55,830 +và chúng tôi đã có thể thực hiện yêu cầu của mình. + +73 +00:05:01,920 --> 00:05:02,580 +1: Đúng + +74 +00:05:02,580 --> 00:05:06,720 +0: Bây giờ khi chúng tôi nhấn run, nếu nó cho chúng tôi thông báo thành công, thì + +75 +00:05:07,050 --> 00:05:10,740 +chúng tôi biết rằng chúng tôi đã cập nhật dữ liệu của mình ở đây và + +76 +00:05:11,280 --> 00:05:13,470 +giờ chúng tôi không còn có hai pixel nữa. + +77 +00:05:13,500 --> 00:05:16,980 +Chúng tôi chỉ có một lý do là chúng tôi đã xóa một trong ngày hôm qua. + +78 +00:05:17,970 --> 00:05:22,860 +Thats tất cả để có nó. Nếu bây giờ bạn muốn có thể theo dõi + +79 +00:05:23,190 --> 00:05:28,190 +thói quen của mình, tất cả những gì bạn phải làm là nhận xét tất cả các câu trả lời + +80 +00:05:29,580 --> 00:05:34,580 +còn lại và kích hoạt lại câu trả lời nơi chúng tôi đăng dữ liệu pixel và thay đổi số + +81 +00:05:37,140 --> 00:05:40,400 +lượng thành đầu vào tùy chỉnh. Vậy trong trường + +82 +00:05:40,410 --> 00:05:45,410 +hợp của tôi, hôm nay bạn đã đạp xe bao nhiêu km? + +83 +00:05:47,940 --> 00:05:52,320 +Và tất nhiên sau đó thay đổi ngày giờ của chúng tôi trở lại bây giờ. + +84 +00:05:54,090 --> 00:05:56,850 +Và bây giờ khi tôi chạy mã của + +85 +00:05:57,680 --> 00:06:01,390 +tôi, nó sẽ đi trước và hỏi tôi chạy bao nhiêu km. + +86 +00:06:01,720 --> 00:06:05,350 +Tôi có thể nhập số và sau đó khi tôi nhấn enter ở đó, dữ + +87 +00:06:05,440 --> 00:06:09,460 +liệu sẽ được đăng lên máy chủ. Tất nhiên, bây giờ, vì tôi đã + +88 +00:06:09,460 --> 00:06:13,180 +có một phần dữ liệu, điều này sẽ không cho phép tôi, vì vậy + +89 +00:06:13,570 --> 00:06:17,740 +tôi sẽ phải đợi ngày mai để đăng dữ liệu đạp xe cập nhật của mình. + +90 +00:06:18,550 --> 00:06:21,340 +Tôi hy vọng bạn thích xây dựng dự án này cùng nhau. + +91 +00:06:21,730 --> 00:06:26,730 +Và tôi hy vọng bạn sẽ cố gắng sửa đổi điều này để theo dõi thói quen của riêng bạn và xem liệu bạn có thể thực hiện + +92 +00:06:27,310 --> 00:06:31,240 +một số công việc sáng tạo với nó hay không. Và như mọi khi, nếu bạn tạo ra điều + +93 +00:06:31,360 --> 00:06:34,540 +gì đó thú vị, hãy nhớ chia sẻ nó với những người còn lại trong chúng tôi. + diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 Solution-habit-tracking-end.zip b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 Solution-habit-tracking-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..09a58d647d8f5d4c08177095a960b287b8887ac0 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/006 Solution-habit-tracking-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50829fbfc0bb6bd4f7a046acb1193662cb6c06d66c9b6afa9a647dc66417dfdc +size 713 diff --git a/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/external-links.txt b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d130025a18685734234c06a1442c06d5208d5645 --- /dev/null +++ b/part3/37 - Day 37 - Intermediate+ Habit Tracking Project API Post Requests & Headers/external-links.txt @@ -0,0 +1,15 @@ + +002 Pixela-Website +https://pixe.la/ + +002 Pixela-API-Documentation +https://docs.pixe.la/ + +002 Requests-Module-Documentation +https://requests.readthedocs.io/en/latest/api/ + +005 w3schools-Python-Date-Formatting-with-strftime +https://www.w3schools.com/python/python_datetime.asp + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 Day 38 Goals what you will make by the end of the day.mp4 b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 Day 38 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1e89eed0cb8c98a006f0ec9487409f7648f3ff04 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 Day 38 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad46a758c7719ffafc8592eb7f0f38aaa332aea51a33db023e9d195dcecd2b19 +size 15702358 diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 Day 38 Goals what you will make by the end of the day_vi.srt b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 Day 38 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..621ff871eeead6b5a24382ba8c330e65776439c6 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 Day 38 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,216 @@ +1 +00:00:00,510 --> 00:00:05,010 +Xin chào các bạn, chào mừng đến với ngày thứ 38 của 100 Ngày viết mã. Bây giờ, hôm nay tôi + +2 +00:00:05,040 --> 00:00:08,189 +có một dự án thử thách dành cho bạn. + +3 +00:00:08,580 --> 00:00:13,580 +Và dự án thử thách này sẽ được xây dựng một ứng dụng + +4 +00:00:13,710 --> 00:00:17,430 +theo dõi bài tập bằng Python và Google sheet. + +5 +00:00:18,090 --> 00:00:23,090 +Một trong những điều tôi đang cố gắng làm gần đây là theo dõi quá trình tập luyện của mình và tôi + +6 +00:00:23,130 --> 00:00:25,620 +đã làm điều đó trên khá nhiều bút và giấy. + +7 +00:00:26,250 --> 00:00:30,330 +Nhưng sẽ thật tuyệt nếu chúng ta có thể theo dõi bài tập mà + +8 +00:00:30,690 --> 00:00:33,990 +chúng ta đang làm, thời gian, bao lâu chúng ta đã + +9 +00:00:34,410 --> 00:00:39,060 +tập và cũng tìm ra chúng ta có thể ăn bao nhiêu kem vì quá trình + +10 +00:00:39,060 --> 00:00:43,170 +tập luyện mà chúng ta làm. Vì vậy, theo dõi lượng calo chúng ta đã sử dụng hết. + +11 +00:00:44,160 --> 00:00:49,370 +Bây giờ, rất nhiều cảm hứng cho dự án này đến từ tin tức gần + +12 +00:00:49,800 --> 00:00:53,190 +đây về mô hình AI GPT-3 của Open AI. + +13 +00:00:53,820 --> 00:00:58,740 +Và đó là một mô hình xử lý ngôn ngữ tự nhiên, thực sự thông minh, ví dụ, nếu bạn truy cập + +14 +00:00:58,740 --> 00:01:01,860 +vào Wikipedia, bạn tìm thấy một bài báo về bánh mì, bạn quyết + +15 +00:01:02,160 --> 00:01:05,910 +định sử dụng mô hình này để hỏi nó, tại sao bánh mì lại xốp như vậy? + +16 +00:01:06,480 --> 00:01:11,190 +Nó thực sự có thể tìm kiếm qua tất cả văn bản và tìm cho bạn phần có liên quan. + +17 +00:01:11,730 --> 00:01:16,620 +Vì vậy, nó đang thực hiện một số công cụ thông minh đằng sau hậu trường để hiểu những gì bạn + +18 +00:01:16,620 --> 00:01:19,620 +đang nói và cũng hiểu tất cả nội dung của bài báo. + +19 +00:01:20,190 --> 00:01:23,670 +Và đây được gọi là xử lý ngôn ngữ tự nhiên, nhưng nó + +20 +00:01:23,790 --> 00:01:28,170 +chỉ là một xử lý rất mạnh mẽ. Bây giờ, trong trường hợp của chúng + +21 +00:01:28,200 --> 00:01:31,260 +ta, chúng ta cũng sẽ sử dụng xử lý ngôn ngữ tự + +22 +00:01:31,680 --> 00:01:35,580 +nhiên, và chúng ta sẽ viết ra các bài tập mà chúng ta đã làm, + +23 +00:01:35,760 --> 00:01:38,010 +nhưng bằng một câu tiếng Anh bình thường. + +24 +00:01:38,550 --> 00:01:43,440 +Bạn có thể tưởng tượng tình huống khi bạn đang ở trong phòng tập thể dục và bạn thực hiện + +25 +00:01:43,470 --> 00:01:47,880 +Repl cuối cùng của mình. nó. Vì vậy, đây là liên kết đến bảng điều khiển của ứng dụng đã hoàn thành. + +26 +00:01:48,380 --> 00:01:49,213 +1: Đúng 0: + +27 +00:01:51,350 --> 00:01:53,510 +Bây giờ tôi đã kéo lên cùng một + +28 +00:01:53,570 --> 00:01:56,900 +trang này, nhưng trên trình duyệt Chrome trên điện thoại di động của tôi. + +29 +00:01:57,350 --> 00:02:01,790 +Vì vậy, đây là những gì tôi có thể làm sau khi tập luyện tại phòng tập thể dục hoặc sau một chu kỳ nhanh chóng. + +30 +00:02:02,270 --> 00:02:07,270 +Và những gì chúng tôi sẽ thử và làm là đưa dữ liệu vào bảng tính của chúng tôi tại + +31 +00:02:07,340 --> 00:02:08,690 +đây trên Google trang tính. + +32 +00:02:09,590 --> 00:02:14,590 +Vì vậy, ở đây tôi sẽ gõ tôi đã chạy 5K và đạp xe trong + +33 +00:02:18,350 --> 00:02:19,220 +20 phút. + +34 +00:02:20,060 --> 00:02:25,060 +Vì vậy, đây là đầu vào đầy đủ của tôi và nó gần như chỉ là một câu tiếng Anh đơn giản. + +35 +00:02:25,610 --> 00:02:29,390 +Bây giờ tôi sẽ tiếp tục và nhấn return để kích hoạt mã chạy. + +36 +00:02:29,930 --> 00:02:33,860 +Và ngay lập tức bạn có thể thấy rằng các hoạt động của tôi đã được ghi lại. + +37 +00:02:34,280 --> 00:02:37,070 +Vì vậy, ngày và giờ đã được thêm tự động, + +38 +00:02:37,490 --> 00:02:42,110 +tôi hiểu rằng một trong những hoạt động của tôi đang chạy và nó tính toán thời + +39 +00:02:42,110 --> 00:02:45,620 +lượng dựa trên khoảng cách. Vì vậy, trung bình, + +40 +00:02:45,830 --> 00:02:49,820 +ai đó có thể mất 31 phút để chạy 5 km. + +41 +00:02:50,210 --> 00:02:54,800 +Và sau đó nó tính ra số calo mà tôi đã tiêu tốn để thực hiện hoạt động đó. + +42 +00:02:55,310 --> 00:02:57,290 +Và nó đã làm điều tương tự đối với + +43 +00:02:57,650 --> 00:03:02,650 +việc đạp xe của tôi, ngoại trừ lần này thời lượng đến từ thông tin đầu vào của tôi và lượng calo được tính + +44 +00:03:03,250 --> 00:03:04,090 +toán tự động. + +45 +00:03:04,870 --> 00:03:09,310 +Vì vậy, điều này thực sự thú vị và phần tốt nhất bạn sẽ tự mình xây + +46 +00:03:09,310 --> 00:03:10,143 +dựng tất cả. + +47 +00:03:10,810 --> 00:03:14,020 +Bạn sẽ sử dụng một loạt những thứ mà bạn + +48 +00:03:14,050 --> 00:03:17,980 +đã học cho đến nay, bao gồm cả phương thức datetime, strftime trong + +49 +00:03:18,340 --> 00:03:23,140 +Python, sử dụng API, thực hiện yêu cầu đăng bài, tạo tiêu đề ủy quyền và + +50 +00:03:23,260 --> 00:03:24,610 +các biến môi trường. + +51 +00:03:24,940 --> 00:03:28,450 +Bạn sẽ thực hiện một loạt việc này, từng bước, một mình. + +52 +00:03:28,900 --> 00:03:30,760 +Và nếu bạn chuyển sang bài học + +53 +00:03:31,120 --> 00:03:33,250 +tiếp theo, sẽ có hướng dẫn về cách bắt đầu. + +54 +00:03:33,580 --> 00:03:36,970 +Vì vậy, tôi hy vọng bạn sẽ hào hứng bắt đầu và hẹn gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 OpenAi-GPT-3.url b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 OpenAi-GPT-3.url new file mode 100644 index 0000000000000000000000000000000000000000..d0e5fe83ec99d919a0809bc3b7a95c3f3cb8a3e9 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/001 OpenAi-GPT-3.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://openai.com/blog/openai-api/ \ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/002 Nutritionix-API.url b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/002 Nutritionix-API.url new file mode 100644 index 0000000000000000000000000000000000000000..d6bf998b5081cb71a8953ffaa36cde60bdbbd7cf --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/002 Nutritionix-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.nutritionix.com/business/api \ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/002 Step 1 - Setup API Credentials and Google Spreadsheet.html b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/002 Step 1 - Setup API Credentials and Google Spreadsheet.html new file mode 100644 index 0000000000000000000000000000000000000000..f9113105bb1db8a87f58df4a8a46f0adf1ada21b --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/002 Step 1 - Setup API Credentials and Google Spreadsheet.html @@ -0,0 +1 @@ +

1. Go to this link and create a copy of the My Workouts Spreadsheet. You may need to login/register.

e.g.:

You can also create your own sheet if you like.


2. Go to the Nutritionix API website and select "Get Your API Key" to sign up for a free account. Double check your spam folder (and/or your gmail "promotions" tab) for the Nutritionix verification email.


3. Once logged in, you should be able to access your API key and App id:

4. Create a new project in PyCharm and in the main.py create 2 constants to store the APP_ID and API_KEY that you got from Nutritionix.

\ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/003 Nutritionix-API-Documentation.url b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/003 Nutritionix-API-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..50cfe9abd1a759222ebbb3dbc0aa38d510650b74 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/003 Nutritionix-API-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.google.com/document/d/1_q-K-ObMTZvO0qUEAxROrN3bwMujwAN25sLHwJzliK0/preview \ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/003 Step 2 - Get Exercise Stats with Natural Language Queries.html b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/003 Step 2 - Get Exercise Stats with Natural Language Queries.html new file mode 100644 index 0000000000000000000000000000000000000000..43beaff835517f6ab0bf56533af10622406c78f1 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/003 Step 2 - Get Exercise Stats with Natural Language Queries.html @@ -0,0 +1 @@ +

1. Using the Nutritionix "Natural Language for Exercise" API Documentation, figure out how to print the exercise stats for plain text input.

e.g.

You can hard code the API key and the App Id for now. In step 6, we'll store the API key and app id as environment variables.


HINT 1:  Use what you have learnt about Authentication headers and the relevant part of the Nutritionix Authentication Documentation (and here) to authenticate your request.


HINT 2: Use what you have learnt about making POST requests and the relevant part of the Nutritionix Exercise Documentation to make your request with the required parameters.


SOLUTION

\ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/004 Sheety-API.url b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/004 Sheety-API.url new file mode 100644 index 0000000000000000000000000000000000000000..016b5b68760b3f6f8a5c54e6a0b53c5e845f6604 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/004 Sheety-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://sheety.co/ \ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/004 Step 3 - Setup Your Google Sheet with Sheety.html b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/004 Step 3 - Setup Your Google Sheet with Sheety.html new file mode 100644 index 0000000000000000000000000000000000000000..ecc9237379915ffad9ee328c4615c6135a0bfa71 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/004 Step 3 - Setup Your Google Sheet with Sheety.html @@ -0,0 +1 @@ +

1. Log into Sheety with your Google Account (the same account that owns the Google Sheet you copied in step 1).

Make sure you give Sheety permission to access your Google sheets. If you miss this step, log out of Sheety and log in again.

Make sure the email matches between your Google Sheet and Sheety Account. e.g.


Under your Google Account Security settings, you should see that Sheety has access. Double-check that you see Sheety listed as an authorized app. Otherwise, your Python code can't access your spreadsheet.


2. In your project page, click on "New Project" and create a new project in Sheety with the name "Workout Tracking" and paste in the URL of your own "My Workouts" Google Sheet.


3. Click on the workouts API endpoint and enable GET and POST.



\ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/005 Step 4 - Saving Data into Google Sheets.html b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/005 Step 4 - Saving Data into Google Sheets.html new file mode 100644 index 0000000000000000000000000000000000000000..44e55a3e9b3d2587ea7ad4e3cdd65777f4e0af6f --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/005 Step 4 - Saving Data into Google Sheets.html @@ -0,0 +1 @@ +

1.  Using the Sheety Documentation, write some code to use the Sheety API to generate a new row of data in your Google Sheet for each of the exercises that you get back from the Nutritionix API. The date and time columns should contain the current date and time from the Python datetime module.

e.g.


HINT 1: Parameters have to be camelCase. Also, pay special attention to this part in the documentation:


HINT 2: Remember you can generate text in title case by using the Python .title() method.

https://www.w3schools.com/python/ref_string_title.asp


HINT 3: Remember you can format a datetime object using the .strftime() method.

https://www.w3schools.com/python/python_datetime.asp


Debugging Tip: If you're having any issues, double-check that you are logged in to Sheety with the same Google account that owns the spreadsheet you're trying to modify.


SOLUTION

\ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/006 Step 5 - Authenticate Your Sheety API.html b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/006 Step 5 - Authenticate Your Sheety API.html new file mode 100644 index 0000000000000000000000000000000000000000..35f326e0d6396cc6af7ce8275e0996ce04ec99aa --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/006 Step 5 - Authenticate Your Sheety API.html @@ -0,0 +1 @@ +

At the moment there is no authentication that's required to access your Sheety endpoint. That means anyone could read and write to your "My Workout" Google Sheet.

1. Add either "Basic Authentication" or "Bearer Token" to your Sheety endpoint to secure it.  You can hardcode the token in your code for now while you test your code. Once you're sure it works, we can add it to the environment variables in the next step.

What is Bearer authentication?

Bearer authentication (also known as token authentication) is an HTTP authentication scheme that involves security tokens. The name Bearer authentication basically means give access to the bearer of this token. The security token or bearer token is just a cryptic string. An example of a bearer token would be a string that could look something like this:

"AAAAAAAAAAAAAAAAAAAAAMLheAAAAAAA0%2BuSeid%2BULvsea4JtiGRiSDSJSI%3DEUifiRBkKG5E2XzMDjRfl76ZC9Ub0wnz4XsNiRVBChTYbJcE3F"

The idea is that whoever has the secret token, has permission to interact with the spreadsheet. A client - like your browser or mobile app - would then send this security token in the Authorization header when making requests to Sheety's server.


2. Using the Sheety documentation on authentication to update your Python code to authenticate your request.

HINT: You'll need to read the relevant section on the request module documentation to do this.

Basic Authentication: https://requests.readthedocs.io/en/master/user/authentication/#basic-authentication

Bearer Authentication: https://stackoverflow.com/questions/29931671/making-an-api-call-in-python-with-an-api-that-requires-a-bearer-token


SOLUTION

\ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Course-Fixes-Report-an-Issue.url b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Solution-Exercise-Tracker.zip b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Solution-Exercise-Tracker.zip new file mode 100644 index 0000000000000000000000000000000000000000..dcad0d2edb04c92da95d0dd4dca75d479aa0ef46 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Solution-Exercise-Tracker.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac2090060b51fa3669504ac694b79761341286d8d252c365cc01aeca6f59c9a7 +size 3263 diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Step 6 - Environment Variables in Repl.it.html b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Step 6 - Environment Variables in Repl.it.html new file mode 100644 index 0000000000000000000000000000000000000000..785893f2ef55b305c37ea6f10cf276dd6ec0c00a --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/007 Step 6 - Environment Variables in Repl.it.html @@ -0,0 +1,3 @@ +

It's time to remove the hard-coded API keys, passwords, and endpoints from our .py file and move them into environment variables. The process will be slightly different depending on what your environment is.

1. Using what you know about Environment Variables (see Day 35), update your code to use environment variables for all sensitive data including:

APP_ID

API_KEY

SHEET_ENDPOINT

USERNAME

PASSWORD

TOKEN


HINT 1: You'll need to import the os module.

Here's how you would set environment variables

os.environ["APP_ID"] = APP_ID

and here is how you would get an environment variable

APP_ID = os.environ["APP_ID"]  raises exception if key does not exist
+APP_ID = os.environ.get("APP_ID")  returns None if key does not exist
+APP_ID = os.environ.get("APP_ID", Message)  returns Message if key does not exist

See Python | os.environ object

In PyCharm, you can add your environment variables under "Edit Configurations". If you click on the little symbol to the right under "Environment Variables, you will bring up a window where you can add the key-value pairs one by one. (you can also copy-paste all the environment variables at the same time).  

2. In order to be able to post our workout data while we're out and about, it would be easier if we can access the console and run the code in Repl.it

However, because Repl.it projects are public, we don't want other people to see our API keys and secrets.

Use the Replit documentation to work out how to add environment variables to Replit and store your Environment Variables:

https://docs.replit.com/tutorials/storing-secrets-and-history#understanding-the-environment-variables-pane



HINT 1: Environment variables are declared without spaces!

HINT 2: https://stackoverflow.com/questions/4906977/how-to-access-environment-variable-values


SOLUTION

\ No newline at end of file diff --git a/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/external-links.txt b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..84628d6e87fa1c8d0410e12eee8e06ea1e0d4871 --- /dev/null +++ b/part3/38 - Day 38 - Intermediate+ Workout Tracking Using Google Sheets/external-links.txt @@ -0,0 +1,15 @@ + +001 OpenAi-GPT-3 +https://openai.com/blog/openai-api/ + +002 Nutritionix-API +https://www.nutritionix.com/business/api + +003 Nutritionix-API-Documentation +https://docs.google.com/document/d/1_q-K-ObMTZvO0qUEAxROrN3bwMujwAN25sLHwJzliK0/preview + +004 Sheety-API +https://sheety.co/ + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/001 Day 39 Goals what you will make by the end of the day.mp4 b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/001 Day 39 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..97dbfa9207c0397fd82d3eba195e8c786b99e2bc --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/001 Day 39 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c29345d8f79fac0b5591957b64ac0707dc17cd3ac3676d63c2afccf7500af586 +size 60727419 diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/001 Day 39 Goals what you will make by the end of the day_vi.srt b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/001 Day 39 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a87a34f6854523ed4b76cc546bd317a66ee6cb48 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/001 Day 39 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,276 @@ +1 +00:00:00,150 --> 00:00:04,500 +Này đó. Chào mừng bạn đến với ngày thứ 39 của 100 Ngày viết mã. + +2 +00:00:04,980 --> 00:00:05,400 +Bây + +3 +00:00:05,400 --> 00:00:10,260 +giờ, hôm nay chúng ta có một loạt hai phần và đây là phần một + +4 +00:00:10,260 --> 00:00:12,360 +trong dự án capstone của bạn. + +5 +00:00:12,840 --> 00:00:15,450 +Vì vậy, chúng tôi đã tìm hiểu về API trong một + +6 +00:00:15,660 --> 00:00:20,660 +thời gian dài và chúng tôi sẽ sử dụng kết hợp các API khác nhau để tạo ra một công cụ + +7 +00:00:21,780 --> 00:00:24,720 +tìm chuyến bay giá rẻ. Phần một, chương trình của + +8 +00:00:25,020 --> 00:00:29,610 +chúng tôi sẽ tìm kiếm những chuyến bay tuyệt vời chỉ dành riêng cho chính chúng tôi. + +9 +00:00:29,910 --> 00:00:30,930 +Và trong phần hai, + +10 +00:00:31,200 --> 00:00:36,200 +chúng tôi biến dự án này thành một sản phẩm hoàn chỉnh, nơi chúng tôi có thể bắt đầu đăng ký + +11 +00:00:36,780 --> 00:00:41,190 +người dùng sử dụng dịch vụ của chúng tôi. Vì vậy, tôi không biết về + +12 +00:00:41,220 --> 00:00:44,400 +bạn, nhưng tôi là một người đam mê du lịch. + +13 +00:00:44,430 --> 00:00:46,890 +Tôi hoàn toàn thích đi du lịch. + +14 +00:00:47,400 --> 00:00:51,030 +Tôi là loại người không thể đứng yên tại một địa điểm. + +15 +00:00:51,510 --> 00:00:56,190 +Và một trong những lý do khiến tôi dạy Lập trình trực tuyến là để có thể đi du lịch và + +16 +00:00:56,250 --> 00:00:58,020 +làm việc từ nhiều nơi khác nhau. + +17 +00:00:58,500 --> 00:01:02,910 +Bây giờ tôi không kén chọn nơi tôi đi. Tôi nghĩ rằng ở bất cứ đâu + +18 +00:01:02,910 --> 00:01:06,690 +tôi đến, đều có những người đẹp có thể dạy tôi rất nhiều điều. + +19 +00:01:07,290 --> 00:01:12,290 +Vì vậy, thay vì lập kế hoạch cho một chuyến đi mà tôi chỉ có một điểm đến và tôi + +20 +00:01:12,570 --> 00:01:16,350 +lên kế hoạch ngày giờ, tôi thực sự chỉ tìm kiếm một thỏa thuận tốt. + +21 +00:01:16,710 --> 00:01:18,660 +Vì vậy, khi tôi có thể có + +22 +00:01:18,660 --> 00:01:22,830 +được một chuyến bay thực sự rẻ và đến một địa điểm mà tôi muốn ghé thăm, + +23 +00:01:23,190 --> 00:01:27,930 +thì tôi hoàn toàn chỉ cần thực hiện nó. Vì vậy, ví dụ, trong khi một + +24 +00:01:28,440 --> 00:01:32,820 +chuyến bay đến New Zealand thường có giá khoảng 800 bảng Anh, tôi đã + +25 +00:01:33,240 --> 00:01:36,900 +tìm được một chuyến bay chỉ với 350 bảng Anh, và đó + +26 +00:01:37,170 --> 00:01:39,030 +là một thỏa thuận tốt. + +27 +00:01:39,060 --> 00:01:43,170 +Nó thậm chí còn bao gồm một điểm dừng chân ở Bắc Kinh, nơi tôi có thể kiếm một ít vịt + +28 +00:01:43,710 --> 00:01:48,210 +ngon trước khi tôi lên chuyến bay 12 giờ tiếp theo. Một trường hợp + +29 +00:01:48,240 --> 00:01:52,950 +khác, ừm, là Nhật Bản, nơi chuyến bay thường + +30 +00:01:53,160 --> 00:01:58,140 +có giá khoảng 500, 550. Và tôi đã tìm được một chuyến bay chỉ có giá 250 bảng Anh khứ hồi. + +31 +00:01:58,680 --> 00:02:02,880 +Và số tiền tiết kiệm được trên chuyến bay có nghĩa là tôi phải ăn thêm một số món sushi ngon. + +32 +00:02:03,420 --> 00:02:07,860 +Cách mà các giao dịch này xảy ra là hãy tưởng tượng nếu bạn truy cập vào + +33 +00:02:07,860 --> 00:02:11,100 +một trang web tìm kiếm chuyến bay và bạn tìm kiếm các + +34 +00:02:11,160 --> 00:02:12,990 +chuyến bay, bất cứ lúc nào + +35 +00:02:13,290 --> 00:02:16,590 +trong sáu tháng tới, mỗi ngày cho rất nhiều địa điểm khác nhau. + +36 +00:02:16,980 --> 00:02:19,230 +Sau đó, bạn sẽ thấy rằng tại một số thời + +37 +00:02:19,230 --> 00:02:23,490 +điểm, một trong những mức giá chuyến bay sẽ tăng lên và nó thấp hơn nhiều so với + +38 +00:02:23,490 --> 00:02:27,600 +những gì bạn mong đợi. Và đó là cách bạn có được một hợp đồng tốt. Nhưng tất nhiên, chúng tôi quá + +39 +00:02:27,750 --> 00:02:30,420 +bận rộn để làm điều đó mỗi ngày một cách thủ công. + +40 +00:02:30,810 --> 00:02:34,320 +Vì vậy, đây là cách chương trình của tôi hoạt động. Đầu tiên, chúng tôi + +41 +00:02:34,350 --> 00:02:39,350 +có một trang tính của Google theo dõi các địa điểm mà chúng tôi muốn + +42 +00:02:39,750 --> 00:02:44,520 +ghé thăm và mức giá ưu đãi. Vì vậy, một mức giá thấp lịch sử. + +43 +00:02:44,850 --> 00:02:45,683 +Ví dụ, có + +44 +00:02:45,690 --> 00:02:50,690 +thể tôi muốn đến Carola, thăm nhà bếp và ăn một số món ăn ngon của miền Nam Ấn + +45 +00:02:51,390 --> 00:02:52,470 +Độ. Chà, + +46 +00:02:52,500 --> 00:02:57,060 +có lẽ tôi sẽ đặt giá 350 bảng trở lại từ London. + +47 +00:02:57,750 --> 00:03:02,560 +Vì vậy, chúng tôi lấy dữ liệu này từ trang tính của Google với nhiều vị trí khác nhau và + +48 +00:03:02,620 --> 00:03:07,180 +mức giá thấp nhất của chúng và chúng tôi cung cấp dữ liệu đó vào API tìm kiếm chuyến + +49 +00:03:07,570 --> 00:03:11,260 +bay, sẽ chạy hàng ngày, tìm kiếm qua tất cả các địa điểm để tìm + +50 +00:03:11,530 --> 00:03:14,080 +kiếm chuyến bay rẻ nhất trong tương lai sáu tháng. + +51 +00:03:14,650 --> 00:03:19,420 +Khi nó xuất hiện và tìm thấy một chuyến bay thực sự rẻ hơn mức giá + +52 +00:03:19,420 --> 00:03:20,800 +đã xác định trước + +53 +00:03:21,100 --> 00:03:26,100 +của chúng tôi, thì nó sẽ gửi ngày và giá đó qua mô-đun Twilio SMS đến điện + +54 +00:03:26,320 --> 00:03:29,110 +thoại di động của chúng tôi để chúng tôi có + +55 +00:03:29,110 --> 00:03:33,160 +thể đặt vé ngay tại đó. Đó là lý thuyết về nó, nhưng chúng ta hãy xem nó trong thực tế. + +56 +00:03:33,700 --> 00:03:38,700 +Vì vậy, ở đây tôi đã có mã cho câu lạc bộ bay cá nhân của mình và tôi sẽ chạy nó + +57 +00:03:39,490 --> 00:03:44,490 +và chúng tôi sẽ xem điện thoại của tôi và chờ xem liệu có bất kỳ giao dịch tốt nào mà họ + +58 +00:03:45,730 --> 00:03:46,900 +tìm thấy hôm nay không. + +59 +00:03:47,800 --> 00:03:52,800 +Và chúng tôi nhận được một tin nhắn văn bản từ tài khoản Twilio của mình và chúng tôi có nó. Tin nhắn hôm nay cho biết cảnh + +60 +00:03:54,580 --> 00:03:56,800 +báo giá thấp, chỉ 41 pound + +61 +00:03:57,010 --> 00:04:02,010 +để bay từ London Stansted đến Berlin từ ngày 25 tháng 8 đến + +62 +00:04:03,970 --> 00:04:06,040 +ngày 10 tháng 9. + +63 +00:04:06,670 --> 00:04:11,670 +Điều đó được kích hoạt bởi vì nó đã xem bảng tính giá chuyến bay của tôi và + +64 +00:04:11,860 --> 00:04:14,770 +nó phát hiện ra rằng trong số tất cả những + +65 +00:04:15,220 --> 00:04:20,140 +địa điểm này, chuyến bay duy nhất mà nó tìm thấy rẻ hơn mức giá thấp nhất của + +66 +00:04:20,170 --> 00:04:22,600 +tôi là đến Berlin. Nó thực sự chỉ rẻ hơn một pound. + +67 +00:04:23,440 --> 00:04:27,190 +Vì vậy, bây giờ tôi đã nhận được tin nhắn của mình, tôi có thể tiếp tục và đặt chuyến đi đến Berlin. + +68 +00:04:28,720 --> 00:04:31,990 +Nhưng trước khi tôi làm điều đó, chúng tôi sẽ hoàn thành dự án capstone này. + +69 +00:04:32,410 --> 00:04:36,670 +Vì vậy, hãy chuyển sang bài học tiếp theo và hãy bắt đầu xây dựng dự án này. + diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/002 Step 1 - Choose Your Path and Download the Starting Project.html b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/002 Step 1 - Choose Your Path and Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..4c0131d50ce496a498fb4cf4c2a8f48861dd0630 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/002 Step 1 - Choose Your Path and Download the Starting Project.html @@ -0,0 +1 @@ +

Download the starting project

Download the starting project by clicking on the link the bottom.

Unzip the downloaded file and open the project in PyCharm.

Take a look through the starting project to get a sense for the structure of the final program.

You can choose to build the project entirely yourself or you can follow step-by-step challenges. If you feel you are an advanced programmer and you have learnt and understood all the concepts in the course so far (OOP, APIs, datetime, List and Dictionary Comprehensions) then stop here and try to create the project yourself using the APIs listed below. If you prefer smaller step-by-step challenges then continue to the next lesson.


Make Your Own Copy of the Starting Google Sheet

Make a copy of the Google sheet.


APIs Required

Google Sheet Data Management - https://sheety.co/

Kiwi Partners Flight Search API (Free Signup, Credit Card not required) - https://partners.kiwi.com/

Tequila Flight Search API Documentation - https://tequila.kiwi.com/portal/docs/tequila_api

Twilio SMS API - https://www.twilio.com/docs/sms


Program Requirements

  1. Use the Flight Search and Sheety API to populate your own copy of the Google Sheet with International Air Transport Association (IATA) codes for each city. Most of the cities in the sheet include multiple airports, you want the city code (not the airport code see here).

  2. Use the Flight Search API to check for the cheapest flights from tomorrow to 6 months later for all the cities in the Google Sheet.

  3. If the price is lower than the lowest price listed in the Google Sheet then send an SMS to your own number with the Twilio API.

  4. The SMS should include the departure airport IATA code, destination airport IATA code, departure city, destination city, flight price and flight dates. e.g.


Toggle these options when setting up with the API providers


Sheety API

Avoid making too many unnecessary requests with the Sheety API while testing your code. The free tier for the Sheety API only allows 200 requests per month.

Also, enable the PUT option so that you can write to your Google sheet


Register with the Kiwi Partners Flight Search API

Your account name should be the same as what you used later in "First name" and "Last name".

There is no need to provide a credit card or billing information (you can skip that section) when you create your "Solution" (previously called "Application").

When registering for your API key choose Meta Search as your product type.


Then choose One-Way and Return.

In summary, your "solution" should look something like this:

If the website prompts you for the type of partnership you can either choose "Book with Kiwi.com" or the affiliate program. Both should work for this project.

\ No newline at end of file diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/002 flight-deals-start.zip b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/002 flight-deals-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..a56d0964076c59af2bae68149573138d334608b2 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/002 flight-deals-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aea1899ba0bbd0a96585dbe5134fd3f93a8737a30485e801b65084e44be2bb52 +size 4659 diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/003 Step 2 - Use Sheety to Read and Write Data to the Google Sheet.html b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/003 Step 2 - Use Sheety to Read and Write Data to the Google Sheet.html new file mode 100644 index 0000000000000000000000000000000000000000..b06b5a953b24f4f5a6c2bd1bed4284713021fcc7 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/003 Step 2 - Use Sheety to Read and Write Data to the Google Sheet.html @@ -0,0 +1 @@ +

Read and Write Data to your Google Sheet

The goal for this step is to read and write some data to the Google Sheet. This way you can check if Sheety is working correctly before connecting the Kiwi Partners Flight Search API and getting the actual IATA codes for each city to the Google Sheet.

1. Go to the link for the starting Google Sheet and make your own copy of it. Then create a new project on Sheety to work with your copy of the Google sheet.


Make requests using the Sheety API

2. Now use the Sheety API to GET all the data in that sheet and print it out. You should see something like this:

3. Try importing pretty print with the line from pprint import pprint and printing the data out again using pprint() to see it formatted.

4. Pass everything stored in the "prices" key back to the main.py file and store it in a variable called sheet_data, so that you can print the sheet_data from main.py

e.g.

5. In main.py check if sheet_data contains any values for the "iataCode" key. If not, then the IATA Codes column is empty in the Google Sheet. In this case, pass each city name in sheet_data one-by-one to the FlightSearch class. For now, the FlightSearch class can respond with "TESTING" instead of a real IATA code. You should use the response from the FlightSearch class to update the sheet_data dictionary.


Print the updated sheet_data dictionary and you should see:

6. In the DataManager Class make a PUT request and use the row id  from sheet_data to update the Google Sheet with the IATA codes. (Do this using code). HINT: Remember to check the checkbox to allow PUT requests in Sheety.

Take a look at the Sheety API documentation to help you:

If successful, you should see the Google Sheet update as if by magic (but it's not magic, it's just code):

IMPORTANT: The Google Sheet URL that you put into Sheety must be owned by the same account as the Google account you used to sign into Sheety.

\ No newline at end of file diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/003 flight-deals-step-2-solution.zip b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/003 flight-deals-step-2-solution.zip new file mode 100644 index 0000000000000000000000000000000000000000..e76edde1a3b7a4c57a0fc610ffd8195137d2dc38 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/003 flight-deals-step-2-solution.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4442206da6593aefcfdd003b2d3a64079f7ec066afa73e9d57494f32854b3a30 +size 5895 diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/004 Step 3 - Get the IATA Codes using the Kiwi Partners API.html b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/004 Step 3 - Get the IATA Codes using the Kiwi Partners API.html new file mode 100644 index 0000000000000000000000000000000000000000..10ea1a992919b8f991d9293c5f9d0a0bd04af3cb --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/004 Step 3 - Get the IATA Codes using the Kiwi Partners API.html @@ -0,0 +1 @@ +

Add the City IATA Codes to your Google Sheet

In order to search for flights, we need an International Air Transport Association (IATA) code. This code helps to identify airports and metropolitan areas.

Some airports are so famous that people even refer to the IATA code in normal conversation. e.g LAX and JFK.

Some cities have multiple airports so they have their own city IATA code which is different from the airport IATA code. e.g. LON (London) - LHR (Heathrow)/ LGW(Gatwick) etc.

The goal for this step is to add the missing IATA codes for each city to the Google Sheet.

1. Delete the "TESTING" values in the Google sheet again. Our code thus far only writes to the Google sheet if the cells are empty.


Make requests using the Kiwi Partners Tequila API

NOTE: You'll have to sign up (free) for an account with Tequila to access their flight search API. Double check the instructions in Step 1 to make sure you've selected the correct options. Then take a look at the locations API -> search by query.

2. Pass each city name in sheet_data one-by-one to the FlightSearch class to get the corresponding IATA code for that city using the Flight Search API. You should use the code you get back to update the sheet_data dictionary.

Print the updated sheet_data dictionary and you should see:

When you run your code again, you should see the Google Sheet update with the IATA code for each city.

SOLUTION

STEP 3 SOLUTION IN REPL.IT PROJECT

\ No newline at end of file diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/005 Step 4 - Search for Cheap Flights.html b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/005 Step 4 - Search for Cheap Flights.html new file mode 100644 index 0000000000000000000000000000000000000000..e1550dbaf72641e39402f888ca4aa36d5ff4871a --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/005 Step 4 - Search for Cheap Flights.html @@ -0,0 +1 @@ +

Searching for Flights

The next step is to search for the flight prices from London (LON) to all the destinations in the Google Sheet. In this project, we're looking only for direct flights, that leave anytime between tomorrow and in 6 months (6x30days) time. We're also looking for round trips that return between 7 and 28 days in length. The currency of the price we get back should be in GBP.

Objective

Take a look at the Flight Search API to see which parameters you can pass to the API:

https://tequila.kiwi.com/portal/docs/tequila_api/search_api

Aim to print the City and Price for all the cities, e.g:


HINT 1: Try to use the FlightData class to represent the flight data. e.g. You can create attributes for price, departure_airport_code, departure_city etc.


HINT 2: You can use timedelta() from the datatime module to define a 6 month period (6 x 30 days). e.g.

https://stackoverflow.com/questions/4541629/how-to-create-a-datetime-equal-to-15-minutes-ago/4541668


HINT 3: You can use strftime() to format the date to the required format by the Flight Search API.

https://www.w3schools.com/python/python_datetime.asp


HINT 4: You can use the split() function to get the first part of the date from the API response.

https://www.w3schools.com/python/ref_string_split.asp


Debugging Note

You can of course change your starting city, time frame and the destination cities as you see fit. Keep this in mind when you run into problems. For example, due to international travel disruptions, there may actually be no flights to certain destinations in the timeframe that you're searching in. Thus your code may not work even if otherwise, it is perfectly valid. If you're not sure why you're not getting any results back, you can double-check flight availability on websites such as Skyscanner or Kayak.com. As such, you could change the origin city to Denver (DEN), change the currency to dollars (i.e., "curr"="USD"), and change the Google Sheet cities to very large domestic airports like Atlanta, Los Angeles, Chicago and Dallas.


SOLUTION

STEP 4 SOLUTION IN REPL.IT

\ No newline at end of file diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/006 Course-Fixes-Report-an-Issue.url b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/006 Step 5 - If Flight Price Lower than in Google Sheet send an SMS.html b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/006 Step 5 - If Flight Price Lower than in Google Sheet send an SMS.html new file mode 100644 index 0000000000000000000000000000000000000000..e69f2076337cce702bff1a87b0378138d2026690 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/006 Step 5 - If Flight Price Lower than in Google Sheet send an SMS.html @@ -0,0 +1 @@ +

Send an SMS using Twilio

The final step is to check if any of the flights found are cheaper than the Lowest Price listed in the Google Sheet. If so, then we should use the Twilio API to send an SMS with enough information to book the flight. You should use the NotificationManager for this job.

The message should include:

Price

Departure City Name

Departure Airport IATA Code

Arrival City Name

Arrival Airport IATA Code

Outbound Date

Inbound Date

e.g.


SOLUTION

COMPLETED PROJECT

\ No newline at end of file diff --git a/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/external-links.txt b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d06ef8c7be4821826fa11d8509a0c4576a8e1899 --- /dev/null +++ b/part3/39 - Day 39 - Intermediate+ Capstone Part 1 Flight Deal Finder/external-links.txt @@ -0,0 +1,3 @@ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Day 40 Goals what you will make by the end of the day.mp4 b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Day 40 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..58ac7c83d02ba07ec6c1f6ac297e8fe1b1248a58 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Day 40 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71d0c1e0e119686b8ac30bc97fe496035da1e2851a7c1aff36966e1a788beeff +size 21997827 diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Day 40 Goals what you will make by the end of the day_vi.srt b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Day 40 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..59f45c735a2bf160b9a0c123adc587cc5618e4a6 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Day 40 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,168 @@ +1 +00:00:00,210 --> 00:00:00,840 +Xin chào các + +2 +00:00:00,840 --> 00:00:05,840 +bạn, chào mừng đến với ngày thứ 40 của 100 ngày viết mã. Hôm nay thực sự rất thú vị vì + +3 +00:00:06,870 --> 00:00:11,870 +chúng tôi sẽ nâng cấp dự án mà chúng tôi đã tạo vào ngày hôm trước + +4 +00:00:12,270 --> 00:00:17,220 +thành một sản phẩm hoàn chỉnh. Hôm nay chúng ta sẽ xây dựng một công + +5 +00:00:17,610 --> 00:00:20,730 +ty và đây là phần hai trong dự án capstone của bạn. + +6 +00:00:21,330 --> 00:00:26,130 +Bây giờ quy tắc đầu tiên của câu lạc bộ bay là bạn không nói về câu lạc bộ bay. + +7 +00:00:26,670 --> 00:00:31,410 +Vì vậy, trong phần một, chúng tôi đã tạo công cụ săn thỏa thuận chuyến bay cho chính mình và chúng tôi + +8 +00:00:31,950 --> 00:00:36,300 +chỉ có một cơ sở người dùng duy nhất. Bây giờ trong phần 2 này, + +9 +00:00:36,420 --> 00:00:41,250 +chúng ta sẽ nâng cấp mã để có thể bắt đầu đăng ký người dùng và + +10 +00:00:41,250 --> 00:00:45,990 +gửi cho họ email thông báo về tất cả các ưu đãi chuyến bay tốt nhất. + +11 +00:00:47,310 --> 00:00:50,940 +Cách đây ít lâu, tôi phát hiện ra một công ty tên là câu lạc bộ bay + +12 +00:00:51,420 --> 00:00:52,950 +của Jack, và nó khá đơn giản. + +13 +00:00:53,220 --> 00:00:57,600 +Tất cả những gì bạn phải làm là gửi email của mình và sau đó họ sẽ gửi cho bạn + +14 +00:00:57,600 --> 00:01:00,840 +các ưu đãi chuyến bay giá rẻ. Vì vậy, bất kỳ chuyến bay + +15 +00:01:01,170 --> 00:01:06,120 +nào trong vòng sáu tháng tới rẻ hơn rất nhiều so với bình thường, bạn sẽ nhận được thông qua email. + +16 +00:01:06,570 --> 00:01:10,980 +Và nếu bạn giống tôi, một người không thực sự quan tâm đến việc họ sẽ đi + +17 +00:01:11,310 --> 00:01:15,570 +đâu miễn là họ nhận được một hợp đồng tốt, thì những email này khá tuyệt, + +18 +00:01:15,630 --> 00:01:16,463 +phải không? + +19 +00:01:16,830 --> 00:01:21,830 +Họ thực sự tính phí cho dịch vụ cao cấp này để nhận được email với tất cả các ưu đãi mới + +20 +00:01:22,650 --> 00:01:27,630 +nhất và tất cả các chuyến bay giá tốt nhất. Bây giờ, nếu bạn nghĩ về nó, dịch vụ + +21 +00:01:27,660 --> 00:01:28,560 +của họ + +22 +00:01:28,650 --> 00:01:33,510 +về cơ bản giống như những gì chúng tôi đã tạo bằng cách sử dụng mã Python. + +23 +00:01:33,990 --> 00:01:37,890 +Có thể họ sẽ có một bảng tính Google lớn hơn với nhiều điểm đến hơn, nhưng + +24 +00:01:38,220 --> 00:01:40,350 +về cơ bản thì nó khá giống nhau. + +25 +00:01:41,100 --> 00:01:46,100 +Tôi muốn bạn xem trang web của họ, câu lạc bộ bay của Jack, và xem nó hoạt động như thế + +26 +00:01:46,320 --> 00:01:50,940 +nào và bạn có thể thấy rằng họ thực sự có rất nhiều thành viên, nhưng về cơ + +27 +00:01:51,390 --> 00:01:53,970 +bản đây là những gì chúng tôi sẽ nhân rộng. + +28 +00:01:54,930 --> 00:01:56,430 +Vào cuối ngày hôm nay, chúng + +29 +00:01:56,460 --> 00:02:01,460 +tôi sẽ có một cách dựa trên văn bản để thu hút khách hàng hoặc người dùng của chúng tôi tham gia. + +30 +00:02:02,160 --> 00:02:06,840 +Vì vậy, có thể bạn có một số bạn bè và gia đình có thể muốn sử dụng câu lạc bộ chuyến bay của bạn để nhận được + +31 +00:02:06,840 --> 00:02:09,210 +các ưu đãi chuyến bay tốt nhất. Vậy thì tất cả những gì + +32 +00:02:09,210 --> 00:02:13,440 +bạn phải làm là trỏ chúng đến một liên kết trong Repl. nó chứa mã + +33 +00:02:13,500 --> 00:02:17,880 +chuyển đổi khách hàng của bạn và sau đó + +34 +00:02:17,910 --> 00:02:22,440 +họ có thể nhập tên và email của họ. + +35 +00:02:24,000 --> 00:02:25,890 +Và sau khi xác thực một chút, chúng + +36 +00:02:25,920 --> 00:02:30,920 +tôi nhấn enter và chúng tôi được thêm vào một bảng tính. Trong bảng tính của chúng tôi, trong một trang tính khác + +37 +00:02:31,860 --> 00:02:33,780 +được gọi là người dùng, chúng tôi + +38 +00:02:34,200 --> 00:02:37,620 +sẽ thấy tất cả các chi tiết về khách hàng của chúng tôi đã + +39 +00:02:38,100 --> 00:02:42,270 +được thêm vào và chúng tôi sẽ sử dụng mô-đun SMTP mà chúng tôi đã học cách đây + +40 +00:02:42,270 --> 00:02:46,710 +rất lâu để gửi email mới nhất cho tất cả người dùng của chúng tôi giao dịch mỗi ngày. + +41 +00:02:47,700 --> 00:02:52,020 +Vì vậy, hãy chuyển sang bài học tiếp theo và bắt đầu bằng cách tải xuống các tệp bắt + +42 +00:02:52,020 --> 00:02:52,440 +đầu. + diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Project-Inspiration-Jacks-Flight-Club.url b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Project-Inspiration-Jacks-Flight-Club.url new file mode 100644 index 0000000000000000000000000000000000000000..57c4631b247ec5477fea8b1bc14cba0feac1b5e9 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/001 Project-Inspiration-Jacks-Flight-Club.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://jacksflightclub.com/ \ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/002 Step 1 - Create the Customer Acquisition Code.html b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/002 Step 1 - Create the Customer Acquisition Code.html new file mode 100644 index 0000000000000000000000000000000000000000..d178e6075bbe8cf200c6db24d112424b93e2fe20 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/002 Step 1 - Create the Customer Acquisition Code.html @@ -0,0 +1 @@ +

In order for other users to access our customer acquisition program, we're going to use repl.it to host our code and share the link to the console with our users.

1. Create a new Repl.it project.

https://replit.com/

2. Create a new Sheet (Tab) in your Copy of Flight Deals Google Sheet:

3. Add 3 new column headings - "First Name", "Last Name", "Email" to this new user Sheet:

4. Sync the new sheet in Sheety. Note: you might have to log in again to Sheety, also you'll need to re-check the PUT checkbox in the prices endpoint.

5. Enable the POST method in the users endpoint:

6. Code up the Repl.it project so that it asks the user for their first name, last name and email. Make sure to get them to type their email twice for validation. If the two emails match, then tell them that they're in the club. e.g.

7. Use the Sheety API to POST the data that the user enters into the user sheet in your Copy of Flight Deals Google Sheet.

This is what you're aiming for:



Solution for main.py


Solution for sheety.py


\ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/003 Step 2 - Download the Starting Project.html b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/003 Step 2 - Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..cf0d68cb5a904ea9424c84dc2ede98c687a9f140 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/003 Step 2 - Download the Starting Project.html @@ -0,0 +1 @@ +

Download the completed code for the flight deals project that we created yesterday from this lesson's course resources. Unzip the file and open the project in PyCharm.

Remember to replace the relevant parts (eg. API Keys and Sheet endpoints) with your own.

Alternatively, you can use your own code from yesterday, make sure that it has all of the required functionality. If in doubt, review the code from yesterday's completed project.

\ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/003 flight-deals-end.zip b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/003 flight-deals-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..9dfb864cac59de181083b86949effb1065002648 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/003 flight-deals-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4195072ed74f5796649db4179f54079c3e569e1bd6c5a703415e10ceb200ae98 +size 5951 diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/004 Step 3 - Exception Handling for Destinations without Flights.html b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/004 Step 3 - Exception Handling for Destinations without Flights.html new file mode 100644 index 0000000000000000000000000000000000000000..7bbbfe81fa0693d5279f0a1c954ecbf8af2b9770 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/004 Step 3 - Exception Handling for Destinations without Flights.html @@ -0,0 +1 @@ +

For some destinations, certain time periods, there will be no flights available. We need to add exception handling to our code so that it doesn't break and crash in these situations.

1. Add Bali, DPS, 501 to the last row of the prices sheet in your copy of the Flight Deals Google Sheet:

NOTE: Bali is not a city, but the city in Bali with the largest airport is not well known to most people (Denpasar). To find the historic low price, I used this website: https://www.faredetective.com/farehistory/

2. Run your program and it will crash, we've set the max_stopovers to 0 and there are no direct flights from London to Denpasar (Bali). Use exception handling to prevent this. You'll need to use try/except/else to catch the situations when the flight data is empty and let the code continue without crashing.

HINT: if the flight data is empty, you'll return an empty flight object (None) to main.py you can use continue to let the for loop to continue to run when flight is None. https://www.w3schools.com/python/ref_keyword_continue.asp


SOLUTION


STEP 3 SOLUTION in REPL.IT

\ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/005 Step 4 - Destinations without Direct Flights.html b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/005 Step 4 - Destinations without Direct Flights.html new file mode 100644 index 0000000000000000000000000000000000000000..09b74032a5b5057e0f9616c50ea2a413366421ce --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/005 Step 4 - Destinations without Direct Flights.html @@ -0,0 +1 @@ +

There are a lot of popular destinations that our customers will want to go to that don't have direct flights. e.g. Bali

1. If a flight is not found, check to see if there are flights with 1 stop and pretty print the result with pprint().

2. Modify the FlightData class to add 2 optional init parameters with default values - stop_overs=0 and via_city="" . Instead of the printing the result from (1.) above, create a flight object with stop_overs set to 1 and via_city as the name of stopover city. Examine the data you printed in (1.) carefully to extract the information for origin_city, origin_airport, destination_city, destination_airport, out_date, and return_date .

HINT: the "route" key value pair you get back from the API now contains a list with 4 items. [origin -> stop_over, stop_over -> destination, destination -> stop_over, stop_over -> origin].

3. Format the message to the NotificationManager in main.py to add the stop_over number and via_city, if a flight is found that requires a stopover.

e.g. It should read:


SOLUTION


STEP 4 SOLUTION in REPL.IT

\ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/006 Course-Fixes-Report-an-Issue.url b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/006 Step 5 - Email all our customers.html b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/006 Step 5 - Email all our customers.html new file mode 100644 index 0000000000000000000000000000000000000000..627c914d4986f41722a096e838661740a20bcff2 --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/006 Step 5 - Email all our customers.html @@ -0,0 +1 @@ +

Now that our program is working as expected, all that's left to do is to notify our customers when there is a good deal!

1. Create a method in the NotificationManager called send_emails() . Use what you have learnt about smtplib and sending emails to send all our customers in the users sheet from Google Sheets the message that contains the flight deal.

NOTE: when sending emails, it won't like the "" symbol, you might get an error like the one below:

You can solve this by encoding the message with UTF-8 e.g. https://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20#answer-9942885


SOLUTION


COMPLETED PROJECT

\ No newline at end of file diff --git a/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/external-links.txt b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..9c968dd1e6dd94ea729c8a345b9e90c93baa83ca --- /dev/null +++ b/part3/40 - Day 40 - Intermediate+ Capstone Part 2 Flight Club/external-links.txt @@ -0,0 +1,6 @@ + +001 Project-Inspiration-Jacks-Flight-Club +https://jacksflightclub.com/ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 How Does the Internet Actually Work.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 How Does the Internet Actually Work.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4fa2980efd4175e45bc7c64a48bbca4a48f715f1 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 How Does the Internet Actually Work.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d3792da2d8e2d799a14ee813001496fc9b01da3845dee95ac2e7b4c6951b68 +size 81427938 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 How Does the Internet Actually Work_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 How Does the Internet Actually Work_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e44cd46004920c1ca5d6b6f4b3157e106eb9dd45 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 How Does the Internet Actually Work_vi.srt @@ -0,0 +1,324 @@ +1 +00:00:00,200 --> 00:00:02,540 +Này các bạn, đây là Angela từ App Brewery. + +2 +00:00:02,540 --> 00:00:08,380 +Và trong bài học này, chúng ta sẽ đi sâu tìm hiểu xem Internet hoạt động chính xác như thế nào? + +3 +00:00:08,390 --> 00:00:10,970 +Vậy chính xác thì Internet là gì? + +4 +00:00:11,000 --> 00:00:15,440 +Nhiều người cho rằng đó là một đám mây, một thứ gì đó đang lơ lửng trên bầu trời. + +5 +00:00:15,440 --> 00:00:20,270 +Nó siêu phức tạp, siêu khó hiểu, nhưng thực ra không phải vậy đâu. + +6 +00:00:20,300 --> 00:00:22,760 +Internet khá đơn giản. + +7 +00:00:22,850 --> 00:00:29,510 +Tất cả chỉ là một đoạn dây dài và dây kết nối các máy tính khác nhau với nhau. + +8 +00:00:29,510 --> 00:00:35,090 +Vì vậy, bạn có thể có một máy tính ở London và một máy tính khác ở Seattle, và chúng có thể nói chuyện + +9 +00:00:35,090 --> 00:00:38,450 +với nhau và truyền dữ liệu qua sợi dây khổng lồ này. + +10 +00:00:38,450 --> 00:00:42,530 +Bây giờ, một số máy tính này kết nối với Internet, có một công việc rất đặc biệt. + +11 +00:00:42,560 --> 00:00:49,040 +Họ phải trực tuyến 24/7 để sẵn sàng cung cấp cho bạn tất cả dữ liệu và tệp mà bạn yêu cầu khi bạn cố + +12 +00:00:49,040 --> 00:00:51,110 +gắng truy cập một trang web. + +13 +00:00:51,260 --> 00:00:54,140 +Và chúng được gọi là máy chủ. + +14 +00:00:54,170 --> 00:01:00,840 +Và những gì họ làm là cung cấp cho bạn tất cả dữ liệu và tệp bạn cần để có thể truy cập và tương tác với một số + +15 +00:01:00,840 --> 00:01:02,250 +trang web nhất định. + +16 +00:01:02,250 --> 00:01:04,800 +Vì vậy, những máy tính này được gọi là máy chủ. + +17 +00:01:04,800 --> 00:01:10,230 +Và bất kỳ máy tính nào mà người dùng sử dụng để truy cập Internet đều được gọi là máy khách. + +18 +00:01:10,260 --> 00:01:16,620 +Giờ đây, bạn có thể tưởng tượng máy chủ web giống như một thư viện khổng lồ mở cửa 24/7 và bạn có thể vào đó bất kỳ + +19 +00:01:16,620 --> 00:01:22,350 +giờ nào trong ngày và nói, tôi muốn xem trang chủ của Google hoặc tôi muốn xem các bài đăng mới nhất + +20 +00:01:22,350 --> 00:01:27,870 +trên TechCrunch và sẽ có thể cung cấp cho bạn tất cả các tệp và dữ liệu bạn cần để có thể xem bất kỳ + +21 +00:01:27,900 --> 00:01:29,400 +trang web nào bạn muốn. + +22 +00:01:29,430 --> 00:01:35,070 +Bây giờ, như bạn có thể tưởng tượng, nếu có một thư viện đủ lớn để chứa tất cả + +23 +00:01:35,070 --> 00:01:41,400 +các trang web này, thì sẽ rất khó để tìm nhanh thứ bạn muốn từ thư viện khổng lồ này. + +24 +00:01:41,400 --> 00:01:41,970 +Phải? + +25 +00:01:41,970 --> 00:01:44,670 +Vậy vấn đề này được giải quyết như thế nào trên Internet? + +26 +00:01:45,120 --> 00:01:50,520 +Chà, giả sử bạn đang ngồi ở nhà trên máy tính và bạn gõ Google. com vì bạn muốn truy cập trang + +27 +00:01:50,520 --> 00:01:53,070 +chủ chính của Google. + +28 +00:01:53,160 --> 00:02:01,410 +Chà, điều xảy ra đằng sau hậu trường là trình duyệt của bạn sẽ gửi tin nhắn đó đến ISP hoặc nhà cung cấp dịch vụ + +29 +00:02:01,410 --> 00:02:03,030 +Internet của bạn. + +30 +00:02:03,030 --> 00:02:06,630 +Vì vậy, đây là những người bạn trả tiền để có thể truy cập internet. + +31 +00:02:06,840 --> 00:02:10,770 +Nếu bạn sống ở Hoa Kỳ, đó sẽ là AT&T hoặc Comcast. + +32 +00:02:10,770 --> 00:02:14,490 +Và nếu bạn ở Vương quốc Anh, sẽ có một cái gì đó như BT hoặc TalkTalk. + +33 +00:02:14,520 --> 00:02:21,600 +Bây giờ thông báo mà bạn đang gửi cho ISP là Tôi muốn xem Google. com và ISP sau đó sẽ chuyển tiếp thông báo + +34 +00:02:21,600 --> 00:02:28,590 +đó đến một thứ gọi là máy chủ DNS, viết tắt của máy chủ hệ thống tên miền. + +35 +00:02:28,590 --> 00:02:33,180 +Và một máy chủ DNS về cơ bản chỉ là một danh bạ điện thoại được cải tiến. + +36 +00:02:33,180 --> 00:02:39,000 +Và điều xảy ra khi bạn thực hiện yêu cầu đó thông qua trình duyệt của mình là máy chủ DNS sẽ tra + +37 +00:02:39,000 --> 00:02:44,910 +cứu trong cơ sở dữ liệu của nó để tìm địa chỉ IP chính xác của trang web mà bạn đang cố truy cập. + +38 +00:02:44,910 --> 00:02:50,160 +Và mỗi máy tính được kết nối với internet đều có một địa chỉ IP. + +39 +00:02:50,190 --> 00:02:55,680 +Nó giống như một mã bưu chính cho máy tính của bạn để khi mọi người cần gửi và nhận + +40 +00:02:55,680 --> 00:03:02,940 +tệp trên Internet, mỗi máy tính có thể được định vị và liên hệ bằng địa chỉ IP duy nhất của chúng. + +41 +00:03:02,940 --> 00:03:09,720 +Và một khi máy chủ DNS tìm thấy địa chỉ IP đó, nó sẽ gửi nó trở lại trình duyệt của bạn thông qua ISP + +42 +00:03:09,870 --> 00:03:11,190 +trên Internet. + +43 +00:03:11,220 --> 00:03:15,150 +Sau đó, bạn có thể gửi yêu cầu trực tiếp đến địa chỉ đó. + +44 +00:03:15,150 --> 00:03:21,810 +Và những gì tồn tại ở địa chỉ IP đó tất nhiên là các máy chủ Google và chúng sẽ có thể gửi lại + +45 +00:03:21,810 --> 00:03:27,150 +cho bạn tất cả các tệp và dữ liệu bạn cần để có thể xem Trang chủ Google. + +46 +00:03:27,150 --> 00:03:33,330 +Giờ đây, bạn có thể tự mình thử cách này để tra cứu địa chỉ IP của Trang chủ Google, hãy + +47 +00:03:33,330 --> 00:03:41,550 +truy cập trang web này nslookup. io và gõ vào google. com và họ sẽ hiển thị cho bạn địa chỉ IP chính xác của máy + +48 +00:03:41,550 --> 00:03:43,470 +chủ Google mà bạn có thể truy cập. + +49 +00:03:43,500 --> 00:03:49,230 +Bây giờ, nếu bạn thử kiểm tra địa chỉ này vào một ngày khác, chẳng hạn sau một tuần hoặc một tháng, bạn có + +50 +00:03:49,230 --> 00:03:51,750 +thể thấy rằng địa chỉ này thực sự thay đổi. + +51 +00:03:51,750 --> 00:03:56,880 +Và đó là bởi vì nhiều trang web, bao gồm cả Google, sử dụng thứ gọi là địa chỉ IP động, + +52 +00:03:56,880 --> 00:03:59,880 +cũng như mạng phân phối nội dung hoặc CDN. + +53 +00:03:59,910 --> 00:04:05,310 +Điều này về cơ bản đảm bảo rằng nó sẽ đưa bạn đến máy chủ gần nhất với vị trí của bạn. + +54 +00:04:05,310 --> 00:04:10,950 +Và địa chỉ này cũng sẽ thay đổi tùy thuộc vào việc nó có được sử dụng hay không. + +55 +00:04:10,950 --> 00:04:13,260 +Vì vậy, đừng gõ những gì bạn nhìn thấy trên màn hình. + +56 +00:04:13,260 --> 00:04:20,160 +Thay vào đó, hãy truy cập nslookup. io và tra cứu địa chỉ IP gần nhất với bạn hiện đang + +57 +00:04:20,160 --> 00:04:21,209 +được sử dụng. + +58 +00:04:21,300 --> 00:04:27,840 +Vì vậy, nếu bạn sao chép và dán nó vào một tab mới, thì bạn sẽ có thể sao chép quy trình đó và thấy Trang + +59 +00:04:27,840 --> 00:04:29,490 +chủ Google hiển thị. + +60 +00:04:29,490 --> 00:04:37,590 +Vì vậy, để tóm tắt, Internet chỉ là một loạt các dây kết nối các máy tính khác nhau, nhưng nó chỉ ở quy mô + +61 +00:04:37,590 --> 00:04:42,150 +lớn hơn nhiều kết nối tất cả các máy tính trên thế giới. + +62 +00:04:42,150 --> 00:04:43,710 +Nhưng còn các đại dương thì sao? + +63 +00:04:43,710 --> 00:04:44,810 +Tôi nghe bạn hỏi. + +64 +00:04:44,820 --> 00:04:47,310 +Vâng, đó là một trong những điều tuyệt vời nhất. + +65 +00:04:47,310 --> 00:04:52,710 +Có những dây cáp khổng lồ dưới biển kết nối tất cả các lục địa trên trái đất. + +66 +00:04:52,710 --> 00:04:59,820 +Và nếu bạn đi đến bản đồ cáp ngầm. com, bạn có thể xem tất cả các dây cáp này và xem những dây kết nối. + +67 +00:05:00,030 --> 00:05:01,480 +Bạn lên Internet. + +68 +00:05:01,480 --> 00:05:08,140 +Và những tuyến cáp dưới biển này rất lớn, bao gồm hàng trăm sợi quang, mỗi sợi + +69 +00:05:08,140 --> 00:05:13,030 +sử dụng tia laser để truyền tới 400GB dữ liệu mỗi giây. + +70 +00:05:13,060 --> 00:05:16,720 +Đây là mặt cắt ngang của một trong những dây cáp chạy đến New Zealand. + +71 +00:05:16,750 --> 00:05:20,020 +Đó là một tuyệt tác tuyệt đối của công nghệ hiện đại. + +72 +00:05:20,020 --> 00:05:22,600 +Và nó trông rất đẹp, bạn có nghĩ vậy không? + +73 +00:05:22,630 --> 00:05:28,360 +Và hãy nghĩ rằng mỗi khi chúng ta tải một trang web hoặc nhấp vào một nút trên một trang web, đằng + +74 +00:05:28,360 --> 00:05:34,710 +sau hậu trường là gửi các tín hiệu điều hướng tất cả các dây điên rồ dưới nước và trên mặt nước này. + +75 +00:05:34,720 --> 00:05:37,630 +Và tất cả những gì tôi cần chỉ là một địa chỉ IP. + +76 +00:05:37,630 --> 00:05:43,030 +Và thông qua các tín hiệu điện cực nhỏ, di chuyển với tốc độ ánh sáng qua các đại dương và nửa + +77 +00:05:43,030 --> 00:05:50,080 +vòng trái đất chỉ trong một phần nghìn giây, tôi có thể xem các trang web yêu thích của mình và đó là điều tuyệt vời của + +78 +00:05:50,080 --> 00:05:51,150 +Internet. + +79 +00:05:51,160 --> 00:05:55,630 +Và chúng tôi sẽ thuần hóa nó để xây dựng các trang web và ứng dụng web của riêng mình. + +80 +00:05:55,630 --> 00:06:01,330 +Và để có thể làm được điều đó, trước tiên chúng ta phải hiểu chính xác các trang web hoạt động như thế nào. + +81 +00:06:01,340 --> 00:06:04,940 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 Submarine-Cable-Map.url b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 Submarine-Cable-Map.url new file mode 100644 index 0000000000000000000000000000000000000000..738d0f4a70e6500762fe09d9059f759d3a8302a1 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/001 Submarine-Cable-Map.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.submarinecablemap.com/ \ No newline at end of file diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/002 How Do Websites Actually Work.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/002 How Do Websites Actually Work.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8871a6141af3cff08dd822df6ebf1f1564866670 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/002 How Do Websites Actually Work.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14557a1046f831d3cd2df9632d4f3f9ad4a4970cc90e99d4a943f6cdd759558a +size 61750694 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/002 How Do Websites Actually Work_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/002 How Do Websites Actually Work_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a0ce972e1df2388a108e825bda9b4b3469c6464e --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/002 How Do Websites Actually Work_vi.srt @@ -0,0 +1,392 @@ +1 +00:00:00,450 --> 00:00:04,530 +Bây giờ chúng ta đã nói về cách thức hoạt động của Internet, trong tập này, tôi muốn + +2 +00:00:04,560 --> 00:00:09,240 +nói về cách các trang web hoạt động chính xác. Chính xác thì HTML, + +3 +00:00:09,240 --> 00:00:14,130 +CSS và JavaScript làm gì? Bây giờ, để truy cập một trang web, chúng ta đều + +4 +00:00:14,160 --> 00:00:18,420 +biết rằng bạn cần một trình duyệt, phải không? Và đó có thể là Chrome, + +5 +00:00:18,480 --> 00:00:21,330 +Safari, Firefox, bất cứ thứ gì bạn yêu thích. + +6 +00:00:21,570 --> 00:00:26,570 +Đây là tất cả các phần mềm cho phép bạn tra cứu địa chỉ IP của trang web của mình + +7 +00:00:27,420 --> 00:00:32,420 +và có thể nhận dữ liệu mà nó có thể hiển thị vào các trang web tuyệt đẹp này mà + +8 +00:00:33,060 --> 00:00:34,950 +chúng ta thấy. Bây giờ, + +9 +00:00:35,310 --> 00:00:40,100 +dữ liệu bạn nhận được từ máy chủ thường bao gồm + +10 +00:00:40,100 --> 00:00:43,400 +ba loại tệp; HTML, CSS và JavaScript. + +11 +00:00:43,700 --> 00:00:48,080 +Và rất có thể bạn đã từng bắt gặp những loại tệp này hoặc những từ này + +12 +00:00:48,080 --> 00:00:49,340 +trước đây, bởi vì + +13 +00:00:49,610 --> 00:00:53,930 +chúng rất phổ biến và không thể thiếu đối với cách các trang web hoạt động. + +14 +00:00:53,960 --> 00:00:56,150 +Nhưng, chính xác thì chúng làm gì + +15 +00:00:56,210 --> 00:00:58,970 +và tại sao lại có nhiều loại tệp khác nhau? + +16 +00:00:59,300 --> 00:01:03,440 +Tại sao chúng ta không thể chỉ có một tệp, bạn biết đấy, một trang web? Chà, họ thực sự có những + +17 +00:01:03,710 --> 00:01:05,480 +công việc rất khác nhau. + +18 +00:01:05,690 --> 00:01:10,690 +Tệp mã HTML chịu trách nhiệm về cấu trúc trang web của bạn. + +19 +00:01:11,030 --> 00:01:12,860 +Vì vậy, nếu một trang + +20 +00:01:13,130 --> 00:01:18,020 +web là một ngôi nhà, thì HTML sẽ là người xây dựng sẽ đến để xây + +21 +00:01:18,020 --> 00:01:22,670 +tường hoặc đặt trong nhà vệ sinh. Về cơ bản, chúng thiết lập cấu trúc ngôi nhà của bạn. + +22 +00:01:23,000 --> 00:01:27,410 +Và khi bạn viết mã HTML, bạn cũng xây dựng cấu trúc trang web của mình. + +23 +00:01:27,620 --> 00:01:32,270 +Vì vậy, bạn có thể sử dụng HTML để thêm hình ảnh hoặc nút hoặc hộp văn bản, bất cứ thứ gì + +24 +00:01:32,540 --> 00:01:35,600 +bạn cần trong trang web của mình. Bây giờ, loại tệp + +25 +00:01:35,630 --> 00:01:38,150 +thứ hai là tệp CSS và các tệp + +26 +00:01:38,360 --> 00:01:41,840 +này chịu trách nhiệm tạo kiểu cho trang web của bạn. + +27 +00:01:42,530 --> 00:01:46,460 +Nếu bạn đang xây một ngôi nhà, thì đây sẽ là những người thợ sơn và người trang trí. + +28 +00:01:46,670 --> 00:01:47,720 +Họ sẽ đi xung + +29 +00:01:47,720 --> 00:01:51,980 +quanh việc sơn các bức tường hoặc thêm những nét khởi sắc về phong cách cho nơi ở + +30 +00:01:52,160 --> 00:01:55,850 +của bạn và nói chung là làm cho nơi này trông theo cách bạn muốn. + +31 +00:01:56,210 --> 00:02:00,950 +Và đó cũng chính xác là những gì mã CSS làm. Khi bạn kết hợp CSS, nó cho phép + +32 +00:02:01,040 --> 00:02:04,820 +bạn chỉ định cách bạn muốn trang web của mình trông như thế nào. + +33 +00:02:05,060 --> 00:02:09,380 +Vì vậy, bạn có thể nói rằng, vâng, tôi có một nút mà tôi lấy từ HTML của + +34 +00:02:09,620 --> 00:02:14,000 +mình, nhưng nút đó tôi muốn nó có màu đỏ và tôi muốn văn bản có màu trắng + +35 +00:02:14,090 --> 00:02:19,090 +và tôi muốn phông chữ của văn bản là Arial. Đó là tất cả được thực hiện bằng cách sử dụng mã CSS. + +36 +00:02:19,910 --> 00:02:23,420 +Bây giờ thành phần cuối cùng là mã JavaScript. + +37 +00:02:23,660 --> 00:02:28,430 +Và đây là mã cho phép trang web của bạn thực sự hoạt động hoặc + +38 +00:02:28,460 --> 00:02:30,890 +có hành vi. Và nếu bạn đang + +39 +00:02:30,920 --> 00:02:32,720 +xây một ngôi nhà, bạn sẽ có thợ + +40 +00:02:32,900 --> 00:02:36,860 +điện đến, người có thể kết nối dây điện để bóng đèn của bạn thực sự bật + +41 +00:02:36,860 --> 00:02:40,550 +lên hoặc ai đó vào và làm hệ thống ống nước để nhà vệ sinh của + +42 +00:02:40,550 --> 00:02:44,000 +bạn thực sự có thể xả nước. Và mã JavaScript thực hiện chính xác điều đó. + +43 +00:02:44,390 --> 00:02:48,860 +Nó cho phép trang web của bạn thực sự hoạt động và có hành vi. + +44 +00:02:49,100 --> 00:02:51,920 +Vì vậy, nếu chúng tôi lấy trang web của Google làm ví dụ một + +45 +00:02:52,100 --> 00:02:54,980 +lần nữa, khi chúng tôi nhận được các tệp này từ máy chủ của + +46 +00:02:55,130 --> 00:02:58,850 +Google, khi trình duyệt của chúng tôi tải lên các tệp HTML, chúng tôi sẽ thấy cấu trúc của + +47 +00:02:59,500 --> 00:03:03,160 +trang web, cụ thể là có một hình ảnh có logo, có hai nút và có một hộp văn + +48 +00:03:03,400 --> 00:03:08,200 +bản để chúng ta có thể nhập tìm kiếm của mình. Bây giờ, khi chúng ta nhận được + +49 +00:03:08,200 --> 00:03:10,240 +các tệp CSS, thì điều + +50 +00:03:10,630 --> 00:03:14,770 +đó sẽ sửa đổi giao diện của tất cả các thành phần đó. + +51 +00:03:15,010 --> 00:03:18,580 +Chúng tôi không có thêm bất kỳ nút nào hoặc bất kỳ hình ảnh nào nữa, nhưng + +52 +00:03:18,790 --> 00:03:23,410 +giao diện bây giờ theo cách mà Google mong muốn. Và cuối cùng, khi chúng tôi kết hợp + +53 +00:03:23,680 --> 00:03:25,900 +các tệp JavaScript, thì trang web của + +54 +00:03:26,140 --> 00:03:31,090 +chúng tôi thực sự bắt đầu có hành vi. Nó có chức năng và nó thực sự + +55 +00:03:31,330 --> 00:03:35,650 +có thể làm điều gì đó hơn là chỉ hiển thị một số hình ảnh + +56 +00:03:35,650 --> 00:03:39,490 +và văn bản cho chúng tôi. Bây giờ, với kiến thức mà chúng ta đã + +57 +00:03:39,610 --> 00:03:43,150 +có được, chúng ta đã có thể bắt đầu làm rối tung các trang web trên internet. + +58 +00:03:43,600 --> 00:03:46,510 +Vì vậy, hãy mở Chrome và bắt đầu với techcrunch. com. + +59 +00:03:46,780 --> 00:03:48,340 +Và nếu bạn không quen thuộc với nó, về + +60 +00:03:48,430 --> 00:03:52,390 +cơ bản nó là một trang web tin tức công nghệ, nơi tôi nhận được tin tức công nghệ mới nhất của mình. + +61 +00:03:52,780 --> 00:03:53,920 +Khi bạn đã + +62 +00:03:54,130 --> 00:03:59,130 +đến đây, tôi muốn bạn nhấp chuột phải vào tiêu đề ở đây và nhấp vào kiểm tra. + +63 +00:04:01,660 --> 00:04:04,210 +Bây giờ phần này hiển thị các công cụ dành cho nhà + +64 +00:04:04,570 --> 00:04:07,930 +phát triển Chrome và chúng ta sẽ khám phá điều này một cách chi tiết hơn, nhưng + +65 +00:04:08,290 --> 00:04:11,860 +bây giờ chúng ta sẽ sử dụng nó để làm một điều gì đó thực sự đơn giản. + +66 +00:04:12,070 --> 00:04:15,970 +Bạn có thể thấy rằng khi tôi nhấp chuột phải vào tiêu đề đó + +67 +00:04:16,209 --> 00:04:21,209 +và nhấp vào kiểm tra, nó sẽ tự động mở ra toàn bộ tệp mã được sử dụng + +68 +00:04:21,760 --> 00:04:25,900 +để hiển thị trang web này. Vì vậy, đây là tất cả các yếu tố tạo nên trang web này. + +69 +00:04:26,320 --> 00:04:28,420 +Và khi bạn nhấp vào kiểm + +70 +00:04:28,780 --> 00:04:33,700 +tra, nó sẽ tô sáng cho bạn phần mã tương ứng với thứ mà bạn nhấp + +71 +00:04:33,700 --> 00:04:36,700 +chuột phải, phải không? Trong trường hợp này, đó là tiêu đề này. + +72 +00:04:37,390 --> 00:04:40,840 +Và bên trong tiêu đề này, bạn có thể thấy có một liên kết, có + +73 +00:04:41,230 --> 00:04:44,350 +nghĩa là khi bạn nhấp vào nó, nó sẽ chuyển đến một trang + +74 +00:04:44,710 --> 00:04:49,510 +web khác, nhưng nó cũng có một chút văn bản. Vì vậy, ngay bên trong các công cụ dành cho nhà + +75 +00:04:49,660 --> 00:04:53,620 +phát triển Chrome, nếu bạn nhấp đúp vào bit văn bản tương ứng với tiêu đề, bạn thực sự + +76 +00:04:53,950 --> 00:04:55,180 +có thể chỉnh sửa nó. + +77 +00:04:56,110 --> 00:04:59,800 +Vì vậy, hãy tiếp tục và thay đổi trang đầu của TechCrunch. + +78 +00:04:59,890 --> 00:05:01,030 +Hãy nói điều gì đó như, + +79 +00:05:02,040 --> 00:05:02,873 +1: uhm .. + +80 +00:05:04,500 --> 00:05:07,410 +0: Vì vậy, đây là một cách tuyệt vời để chơi khăm bạn bè của bạn, đặc + +81 +00:05:07,560 --> 00:05:12,540 +biệt là khi họ có thể thấy rằng bạn đang sử dụng công nghệ. com và tiêu đề hoặc bất kỳ văn + +82 +00:05:12,540 --> 00:05:15,810 +bản nào trên trang web là những gì bạn muốn nó nói. + +83 +00:05:15,990 --> 00:05:19,470 +Và đây là một trò đùa tuyệt vời để chơi với những người bạn có thể không hoàn toàn + +84 +00:05:19,470 --> 00:05:21,120 +bằng công nghệ tiên tiến như bạn, bởi + +85 +00:05:21,300 --> 00:05:24,810 +vì họ chưa tham gia khóa học mà bạn có. Thật không may, khi tôi + +86 +00:05:24,840 --> 00:05:29,580 +nhấn làm mới trên trang web này, tất cả công việc tốt của tôi đã biến mất. + +87 +00:05:29,910 --> 00:05:34,910 +Và lý do là vì khi tôi chỉnh sửa nó ở đây bên trong trình duyệt của mình, + +88 +00:05:35,730 --> 00:05:40,730 +tôi thực sự đang thay đổi bản sao cục bộ của tệp này mà tôi đã nhận + +89 +00:05:41,430 --> 00:05:44,340 +lại từ máy chủ. Nhưng khi tôi nhấp + +90 +00:05:44,430 --> 00:05:49,320 +vào làm mới, thì điều đó sẽ tạo ra một yêu cầu mới đối với máy chủ để tải + +91 +00:05:49,320 --> 00:05:53,400 +lên một bản sao mới của trang web. Vì vậy, tất nhiên, sau đó nó cập nhật nội dung gốc. + +92 +00:05:53,640 --> 00:05:57,530 +Nhưng trong các bài học sắp tới, chúng ta sẽ làm việc với HTML, CSS + +93 +00:05:57,740 --> 00:06:02,150 +và JavaScript để bạn có thể tạo và lưu trữ trực tiếp trên internet, các trang web của + +94 +00:06:02,360 --> 00:06:06,770 +riêng bạn và thông qua việc học cách viết mã và cách xây dựng các trang web + +95 +00:06:06,770 --> 00:06:07,580 +mà bạn + +96 +00:06:07,580 --> 00:06:11,270 +đang sử dụng để có thể tạo các trang web nói bất cứ điều + +97 +00:06:11,540 --> 00:06:15,520 +gì bạn muốn, giao diện theo cách bạn muốn và có chức năng mà bạn cần. + +98 +00:06:15,940 --> 00:06:19,210 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/003 Download the Required Software.html b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/003 Download the Required Software.html new file mode 100644 index 0000000000000000000000000000000000000000..8e1d4bcdd6e7c09ed1457c4cea460abdf70f81f4 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/003 Download the Required Software.html @@ -0,0 +1 @@ +

1. Install Visual Studio Code

This is a free piece of software from Microsoft that you will use to write your code.

https://code.visualstudio.com/


NOTE: You'll see the Atom editor in some of the videos, this software is now being sunsetted by GitHub and in the coming months all the videos will update to use VS Code. But if you hear me say "Open Atom" or "Inside the Atom editor do..." just know that you should now use VS Code.


2. Install Visual Studio Code Extensions

Extensions are like plugins that extend the functionality of VSCode. Here are the ones that I've installed. Click on the link and then click on the "install" button and it should automatically install it in your VSCode application.

Live Preview

Prettier

vscode-icons


3. Install Google Chrome

This is a free browser from Google that we need for development. Even if you normally use another browser, I recommend downloading Chrome for their developer tool suite which we will use extensively in the course.

https://www.google.com/intl/en_uk/chrome/

\ No newline at end of file diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/004 What is HTML.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/004 What is HTML.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c28c4b46d70165613938636e82df7884c5768067 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/004 What is HTML.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c364aa7203d2b1a166e7444c39004dd004cc757bde3e3de94ef2b8b703b13c5d +size 17280347 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/004 What is HTML_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/004 What is HTML_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a57b7b18ab56a64e381560f43a9d6c3a376b4f2f --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/004 What is HTML_vi.srt @@ -0,0 +1,200 @@ +1 +00:00:00,560 --> 00:00:09,110 +Bây giờ, hãy bắt đầu bằng cách tìm hiểu thêm một chút về chính xác nó là gì và cách chúng tôi sử dụng nó để tạo + +2 +00:00:09,110 --> 00:00:10,340 +trang web. + +3 +00:00:10,370 --> 00:00:18,050 +Giờ đây, bất kể bạn thích sử dụng trình duyệt nào, Chrome hay Safari hay Brave, thậm chí tất cả các ứng dụng này đều làm + +4 +00:00:18,050 --> 00:00:19,230 +điều tương tự. + +5 +00:00:19,250 --> 00:00:27,110 +Họ lấy các tệp khác nhau như HTML, CSS và JavaScript và đưa chúng vào một trang web. + +6 +00:00:27,260 --> 00:00:34,100 +Nhưng ngay cả khi hầu hết các trang web hiện đại được tạo bằng ba loại tệp khác nhau này được kết hợp với nhau, + +7 +00:00:34,100 --> 00:00:39,540 +bạn không thể tạo một trang web chỉ bằng một tệp CSS hoặc chỉ một tệp JavaScript. + +8 +00:00:39,560 --> 00:00:43,490 +Tuy nhiên, bạn có thể chỉ có một tệp HTML. + +9 +00:00:43,490 --> 00:00:48,800 +Và trên thực tế, đó chính xác là những trang web đầu tiên được tạo bằng HTML. + +10 +00:00:48,830 --> 00:00:53,390 +Bây giờ HTML xác định nội dung và cấu trúc của trang web. + +11 +00:00:53,390 --> 00:01:00,960 +Vì vậy, ví dụ, trong trường hợp này, tất cả những gì tệp HTML của tôi làm là hiển thị tiêu đề cho biết trang web của tôi. + +12 +00:01:00,990 --> 00:01:08,640 +Và khi tệp này được mở bởi trình duyệt, nó sẽ hiển thị tiêu đề đó là trang web của tôi. + +13 +00:01:08,730 --> 00:01:11,490 +Bây giờ chính xác thì HTML là gì? + +14 +00:01:11,520 --> 00:01:12,690 +Hãy chia nhỏ nó ra. + +15 +00:01:12,690 --> 00:01:16,950 +Vì vậy, HTML là viết tắt của ngôn ngữ đánh dấu siêu văn bản. + +16 +00:01:16,980 --> 00:01:20,940 +Nếu chúng ta nhìn vào phần đầu tiên, siêu văn bản, điều đó có nghĩa là gì? + +17 +00:01:21,420 --> 00:01:28,600 +Chà, nó đề cập đến các đoạn văn bản có thể liên kết đến các tài liệu khác trong trang web. + +18 +00:01:28,620 --> 00:01:37,830 +Vì vậy, những đoạn văn bản này là siêu văn bản hoặc siêu liên kết và chúng là nền tảng về cách thức hoạt động của một trang web + +19 +00:01:37,830 --> 00:01:38,580 +HTML. + +20 +00:01:38,610 --> 00:01:46,560 +Bây giờ, nếu chúng ta nhìn vào trang web Đệ nhất Thế giới được tạo bởi Sir Tim Berners-Lee, người cũng tình cờ là người phát + +21 +00:01:46,560 --> 00:01:52,040 +minh ra Internet, thì bạn có thể thấy nó chứa đầy các siêu liên kết được đánh dấu màu + +22 +00:01:52,050 --> 00:01:54,600 +xanh và chính xác như bạn mong đợi. + +23 +00:01:54,600 --> 00:02:01,710 +Nếu bạn nhấp vào bất kỳ siêu liên kết nào trong số này, nó sẽ đưa bạn đến một tài liệu khác, một tệp HTML khác. + +24 +00:02:01,740 --> 00:02:06,600 +Vì vậy, nếu chúng tôi quay lại, bạn có thể thấy rằng chúng tôi đang chiếu HTML. + +25 +00:02:06,600 --> 00:02:14,880 +Và nếu tôi nhấp vào một trong các siêu liên kết như cách tôi có thể trợ giúp, nó sẽ đưa tôi đến một tệp HTML khác và đây là cách + +26 +00:02:14,880 --> 00:02:16,650 +siêu văn bản hoạt động. + +27 +00:02:16,650 --> 00:02:22,260 +Và thậm chí còn có một liên kết trên trang web này giải thích chính xác siêu văn bản là gì. + +28 +00:02:22,290 --> 00:02:28,080 +Vì vậy, bây giờ chúng ta đã biết siêu văn bản là gì, còn phần khác, ngôn ngữ đánh dấu thì sao? + +29 +00:02:28,080 --> 00:02:29,910 +Ngôn ngữ đánh dấu là gì? + +30 +00:02:30,300 --> 00:02:36,870 +Bây giờ, nếu bạn nhìn vào ngôn ngữ tiếng Anh, chúng ta thường thấy các bit nhỏ có chức năng rất giống với đánh dấu, + +31 +00:02:36,960 --> 00:02:38,970 +giống như các dấu ngoặc kép này. + +32 +00:02:39,000 --> 00:02:45,690 +Sự hiện diện của các dấu ngoặc kép này cho người đọc biết rằng phần này là một trích dẫn. + +33 +00:02:45,690 --> 00:02:54,480 +Và như bạn sẽ thấy, điều này sẽ thực sự giống với những gì bạn thấy trong phần đánh giá bản thảo của biên tập viên. + +34 +00:02:54,480 --> 00:03:01,830 +Vì vậy, được sử dụng để đánh dấu chúng và hiển thị những thứ khác nhau, chẳng hạn như phần nào cần được in đậm + +35 +00:03:01,850 --> 00:03:09,830 +bằng cách thêm một đường nguệch ngoạc bên dưới nó và phần nào cần được gạch chân bằng cách thêm một đường thẳng xuyên + +36 +00:03:09,830 --> 00:03:10,490 +qua nó. + +37 +00:03:11,060 --> 00:03:15,230 +Vậy làm thế nào để bạn đánh dấu bằng HTML? + +38 +00:03:15,260 --> 00:03:19,670 +Chà, nó được thực hiện thông qua cái được gọi là thẻ HTML. + +39 +00:03:19,700 --> 00:03:25,040 +Bây giờ, trong những ngày đầu của Internet, chỉ có rất ít thẻ HTML. + +40 +00:03:25,160 --> 00:03:31,310 +Ngày nay, có rất nhiều thứ, nhưng trên thực tế, bạn sẽ chỉ sử dụng một + +41 +00:03:31,310 --> 00:03:38,700 +số thứ quan trọng nhất, chẳng hạn như tiêu đề H1 đến H6 hoặc thẻ đoạn văn thẻ P. + +42 +00:03:38,720 --> 00:03:44,570 +Vì vậy, ở đây bạn có thể thấy tất cả các thẻ HTML, nhưng khi chúng tôi thu hẹp nó xuống những thẻ mà bạn + +43 +00:03:44,570 --> 00:03:47,810 +thực sự cần biết, thì nó sẽ dễ tiếp cận hơn rất nhiều. + +44 +00:03:47,930 --> 00:03:52,610 +Và trong phần còn lại của khóa học, chúng ta sẽ đề cập đến một số thẻ quan trọng nhất. + +45 +00:03:52,610 --> 00:03:55,400 +Và vì vậy đừng lo lắng về việc học chúng. + +46 +00:03:55,400 --> 00:03:58,950 +Vì vậy, đừng lo lắng về việc ghi nhớ tất cả chúng hoặc học chúng. + +47 +00:03:58,970 --> 00:04:03,690 +Chúng tôi sẽ đề cập đến chúng khi chúng tôi cần chúng trong các dự án và trong các bài tập của chúng tôi. + +48 +00:04:03,870 --> 00:04:11,610 +Vì vậy, trong bài học tiếp theo, chúng ta sẽ bắt đầu bằng cách tìm hiểu về thẻ tiêu đề, một trong + +49 +00:04:11,640 --> 00:04:14,940 +những thẻ HTML OG nhất từng tồn tại. + +50 +00:04:14,940 --> 00:04:18,360 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 2.1-Heading-Element.zip b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 2.1-Heading-Element.zip new file mode 100644 index 0000000000000000000000000000000000000000..88102b326ba2992c453ef55ccb5b724b72f55653 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 2.1-Heading-Element.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16f8a0c9fbd347557760baf0fbbe31eb14241ffd02daf01bbe9abc6e613c4a9b +size 289087 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 HTML Heading Elements.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 HTML Heading Elements.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4dd746ac5f3d38b11d0227bfa6d2280c9fa21ef5 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 HTML Heading Elements.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d0e8490a864282c32f75bc4dcbe72d53419519b1bb0fd693ae07c8b5e8a370a +size 103258979 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 HTML Heading Elements_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 HTML Heading Elements_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..508cafee45e119a49e72a22062dcf6e0cece5362 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 HTML Heading Elements_vi.srt @@ -0,0 +1,732 @@ +1 +00:00:00,200 --> 00:00:07,130 +Bây giờ, trong bài học trước, chúng ta đã xem HTML là gì và trong bài học này, tôi muốn giúp chúng ta bắt đầu sử + +2 +00:00:07,130 --> 00:00:13,640 +dụng HTML càng nhanh càng tốt để chúng ta có thể học cách viết mã của riêng mình và bắt đầu tạo trang web + +3 +00:00:13,640 --> 00:00:14,240 +với nó. + +4 +00:00:14,270 --> 00:00:19,400 +Bây giờ, trong bài học này, chúng ta sẽ học về một trong những thành phần quan trọng nhất, thành phần + +5 +00:00:19,400 --> 00:00:20,060 +tiêu đề. + +6 +00:00:20,060 --> 00:00:23,320 +Và đây là giao diện của phần tử tiêu đề. + +7 +00:00:23,330 --> 00:00:31,460 +Nó bắt đầu với cái được gọi là thẻ mở ở đây và nó kết thúc bằng cái được gọi là thẻ đóng. + +8 +00:00:31,460 --> 00:00:37,610 +Bây giờ, nếu bạn nhìn kỹ, thẻ mở và thẻ đóng thực sự có một thứ khác biệt, và đó là dấu + +9 +00:00:37,610 --> 00:00:40,520 +gạch chéo về phía trước ngay tại đây. + +10 +00:00:40,700 --> 00:00:44,240 +Và đó là những gì làm cho điều này trở thành một thẻ đóng. + +11 +00:00:44,450 --> 00:00:52,100 +Và những gì ở giữa hai thẻ này là nội dung của phần tử HTML cụ thể đó. + +12 +00:00:52,100 --> 00:00:58,820 +Vì vậy, trong trường hợp này, điều chúng tôi muốn làm là tạo tiêu đề H1 và + +13 +00:00:58,820 --> 00:01:03,200 +tiêu đề sẽ chứa những từ này Xin chào thế giới. + +14 +00:01:03,620 --> 00:01:10,670 +Bây giờ, rất thường xuyên khi bạn nghe tôi nói về HTML, bạn sẽ nghe tôi đề cập đến các thẻ và thành phần và bạn cũng sẽ + +15 +00:01:10,670 --> 00:01:13,490 +thấy điều này trên Internet và mọi nơi khác. + +16 +00:01:13,730 --> 00:01:16,550 +Vì vậy, chính xác những gì là sự khác biệt? + +17 +00:01:16,850 --> 00:01:20,360 +Chà, thẻ đề cập đến những bit này. + +18 +00:01:20,360 --> 00:01:21,530 +Đây là những thẻ. + +19 +00:01:21,530 --> 00:01:27,530 +Bất cứ thứ gì bên trong một dấu ngoặc nhọn mà chúng tôi gọi là các dấu ngoặc nhọn này là một thẻ. + +20 +00:01:27,530 --> 00:01:28,910 +Và họ có tên khác nhau. + +21 +00:01:28,910 --> 00:01:32,180 +Vì vậy, như tôi đã đề cập, đây là thẻ mở đầu. + +22 +00:01:33,210 --> 00:01:37,950 +Và cái này ở cuối, tất nhiên, được gọi là thẻ đóng. + +23 +00:01:38,520 --> 00:01:40,920 +Bây giờ, đây là các thẻ. + +24 +00:01:40,920 --> 00:01:42,630 +Vậy phần tử là gì? + +25 +00:01:42,660 --> 00:01:52,260 +Chà, toàn bộ nội dung ở đây, đây là một thành phần bao gồm nội dung cũng như bất kỳ thẻ mở hoặc thẻ + +26 +00:01:52,260 --> 00:01:53,420 +đóng nào. + +27 +00:01:53,430 --> 00:01:56,160 +Đây là phần tử HTML. + +28 +00:01:56,160 --> 00:01:59,550 +Và những phần này là các thẻ. + +29 +00:02:00,120 --> 00:02:05,520 +Vì vậy, hy vọng điều đó sẽ giúp mọi thứ rõ ràng hơn một chút vào lần tới khi bạn nghe về các thẻ và thành phần. + +30 +00:02:06,210 --> 00:02:09,750 +Mục đích của các yếu tố đề mục này là gì? + +31 +00:02:09,750 --> 00:02:12,930 +Chà, ý tưởng đến từ việc đóng sách. + +32 +00:02:12,930 --> 00:02:18,810 +Nếu bạn tạo một cuốn sách và bạn tạo một mục lục như thế này, bạn sẽ thấy rằng có một loại phân + +33 +00:02:18,810 --> 00:02:20,250 +cấp, phải không? + +34 +00:02:20,280 --> 00:02:23,670 +Bạn đã có các tiêu đề cấp cao nhất ở đây. + +35 +00:02:23,760 --> 00:02:31,530 +Đây có thể là tiêu đề cấp một và đây sẽ là tiêu đề cấp hai vì chúng đề cập đến + +36 +00:02:31,530 --> 00:02:37,180 +điều gì đó ít nhiều liên quan đến phần phê duyệt này. + +37 +00:02:37,300 --> 00:02:45,490 +Và bạn có thể thấy bên trong phần 8 ở đây, thậm chí còn có một tiểu mục 8 khác. 1, đi vào chi tiết hơn về một số + +38 +00:02:45,490 --> 00:02:48,280 +khía cạnh của tám. + +39 +00:02:48,310 --> 00:02:52,300 +Điều này trong trường hợp của chúng tôi có thể là một tiêu đề H ba. + +40 +00:02:52,330 --> 00:02:58,270 +Các cấp độ này là những gì chúng ta có thể xác định bằng cách sử dụng các tiêu đề HTML của mình. + +41 +00:02:59,350 --> 00:03:07,540 +Đây là giao diện của mã đối với tất cả sáu cấp tiêu đề và hãy nhớ rằng không có tiêu đề thứ + +42 +00:03:07,540 --> 00:03:08,290 +bảy. + +43 +00:03:08,320 --> 00:03:15,430 +Không có thứ gọi là H bảy không tồn tại khi bạn đã đi đến phần sáu. + +44 +00:03:15,430 --> 00:03:23,410 +Đó gần như là kết thúc theo định nghĩa của mọi người và bất kỳ thứ gì có mức độ quan trọng thấp hơn, bạn sẽ bắt + +45 +00:03:23,410 --> 00:03:27,940 +đầu sử dụng một loại thẻ khác, điều này sẽ đi vào phần sau. + +46 +00:03:27,940 --> 00:03:33,610 +Nhưng đối với mọi thứ từ một đến sáu, cấu trúc gần như giống nhau. + +47 +00:03:33,610 --> 00:03:39,490 +Bạn có một thẻ mở, đó là H một hoặc H sáu, và bạn có một thẻ đóng có số tương + +48 +00:03:39,490 --> 00:03:40,140 +ứng. + +49 +00:03:40,150 --> 00:03:47,140 +Bây giờ nếu bạn tạo một thẻ như thế này với chữ H và sau đó bạn kết thúc bằng một thẻ khác như chữ H sáu, thì điều + +50 +00:03:47,170 --> 00:03:49,210 +đó cũng sẽ không hiệu quả. + +51 +00:03:49,210 --> 00:03:51,850 +Chỉ cần nhớ điều đó khi bạn đang viết mã của riêng mình. + +52 +00:03:51,880 --> 00:03:54,070 +Bây giờ, cái này trông như thế nào? + +53 +00:03:54,070 --> 00:03:57,400 +Nếu chúng tôi chạy mã này, đây là những gì chúng tôi sẽ nhận được. + +54 +00:03:57,430 --> 00:04:04,870 +Chúng tôi sẽ nhận được các cấp tiêu đề khác nhau và theo mặc định, chúng sẽ được tạo kiểu để có các kích thước khác nhau. + +55 +00:04:04,870 --> 00:04:09,310 +Vì vậy, tiêu đề một là lớn nhất và tiêu đề sáu là nhỏ nhất. + +56 +00:04:09,490 --> 00:04:15,340 +Tất nhiên, chúng ta có thể tạo kiểu này sau này, nhưng ngay khi chúng ta nhập các tiêu đề này, nó + +57 +00:04:15,340 --> 00:04:21,820 +chỉ cho chúng ta biết các cấp độ của chúng ta để đảm bảo rằng chúng ta đã viết tất cả mã của mình như dự định. + +58 +00:04:21,820 --> 00:04:26,950 +Và điều này về cơ bản tuân theo cấu trúc mà chúng ta đã thấy trước đó với mục lục. + +59 +00:04:26,950 --> 00:04:32,320 +Đề mục cấp một là lớn nhất và đề mục cấp sáu là nhỏ nhất. + +60 +00:04:32,990 --> 00:04:39,200 +Vì vậy, bây giờ chúng ta đã biết một chút về cách thức hoạt động của tất cả những thứ này, hãy thử thực hiện một bài tập trong đó chúng ta tạo + +61 +00:04:39,200 --> 00:04:40,990 +các thành phần tiêu đề của riêng mình. + +62 +00:04:41,000 --> 00:04:48,440 +Để tải xuống các tệp bắt đầu, bạn phải truy cập tài nguyên khóa học cho bài học + +63 +00:04:48,440 --> 00:04:53,060 +này và nhấp vào nút 2. 1 tệp thành phần tiêu đề để tải xuống. + +64 +00:04:53,060 --> 00:04:58,310 +Bây giờ, nếu bạn không biết nó ở đâu, thì bạn có thể đã bỏ lỡ ở phần đầu của khóa học, có + +65 +00:04:58,310 --> 00:05:05,030 +một bài học gọi là cách tải xuống các tài nguyên của khóa học và trong đó tôi chỉ cho bạn chính xác cách tải xuống + +66 +00:05:05,030 --> 00:05:08,930 +từng tài nguyên của khóa học cho mỗi bài học duy nhất. + +67 +00:05:08,930 --> 00:05:14,060 +Vì vậy, nếu bạn bỏ lỡ điều đó, hãy nhớ đến đó để xem và xem bạn có thể làm điều này như thế nào. + +68 +00:05:14,810 --> 00:05:21,910 +Bây giờ, khi bạn đã tải xuống tệp này, điều thực sự quan trọng là bạn phải giải nén nó hay cái mà chúng tôi gọi là giải nén. + +69 +00:05:21,920 --> 00:05:28,250 +Bây giờ, điều đầu tiên tôi muốn bạn làm là tạo một thư mục cho tất cả các dự án phát triển web của bạn + +70 +00:05:28,250 --> 00:05:35,130 +và bạn có thể tạo thư mục đó ở bất kỳ đâu bạn muốn trên màn hình nền trong ổ C, trong phần tên người dùng, bất + +71 +00:05:35,130 --> 00:05:40,560 +cứ nơi nào bạn muốn, nhưng chỉ cần gọi nó là các dự án phát triển web như thế này. + +72 +00:05:41,130 --> 00:05:47,520 +Bây giờ, khi bạn đã tạo thư mục đó, tôi muốn bạn tiếp tục và mở tệp zip mà bạn vừa tải + +73 +00:05:47,520 --> 00:05:50,400 +xuống bằng cách nhấp đúp vào tệp đó. + +74 +00:05:50,490 --> 00:05:57,450 +Và khi bạn đã mở tệp zip đó, tôi muốn bạn kéo nó vào thư mục dự án phát triển Web của bạn + +75 +00:05:57,600 --> 00:05:58,890 +như thế này. + +76 +00:05:59,760 --> 00:06:03,150 +Và sau đó bạn sẽ có thể truy cập chúng ngay tại đây. + +77 +00:06:03,450 --> 00:06:07,170 +Bây giờ, bước tiếp theo là chúng ta sẽ mở nó bằng mã VS. + +78 +00:06:08,510 --> 00:06:13,310 +Bên trong vs mã, đi đến tệp và chúng tôi sẽ tạo một cửa sổ mới. + +79 +00:06:13,340 --> 00:06:16,160 +Bây giờ hãy mở trình khám phá ở đây. + +80 +00:06:16,160 --> 00:06:22,000 +Và sau đó khi chúng ta ở đây, chúng ta sẽ mở thư mục dự án phát triển web mà chúng ta + +81 +00:06:22,010 --> 00:06:26,480 +vừa tạo và bạn sẽ có thể thấy thành phần tiêu đề thư mục đó. + +82 +00:06:26,750 --> 00:06:32,510 +Bây giờ, nếu vì lý do nào đó, điều này không hiệu quả với bạn, đặc biệt nếu bạn đang sử dụng Windows, thì + +83 +00:06:32,510 --> 00:06:36,100 +điều này có thể là do bạn chưa giải nén thư mục này đúng cách. + +84 +00:06:36,110 --> 00:06:41,120 +Vì vậy, một lần nữa, hãy đảm bảo rằng bạn nhấp đúp vào tệp zip hoặc trên Windows. + +85 +00:06:41,120 --> 00:06:44,510 +Bạn cũng có thể nhấp chuột phải vào nó và nhấp vào giải nén. + +86 +00:06:44,510 --> 00:06:50,900 +Và sau khi bạn đã hoàn thành việc đó, hãy kéo thư mục đó đã được trích xuất vào thư mục + +87 +00:06:50,900 --> 00:06:56,000 +dự án phát triển web của bạn và mở thư mục đó bên trong mã VS của bạn. + +88 +00:06:56,390 --> 00:07:02,390 +Khi bạn ở đây, bạn có thể thấy rằng có ba tệp trong thư mục này có tên là 2. 1 tiêu đề Phần tử một là + +89 +00:07:02,420 --> 00:07:04,880 +chỉ mục. html. + +90 +00:07:04,910 --> 00:07:10,290 +Đây là nơi bạn sẽ viết mã của mình và tôi có một số mã bắt đầu cho bạn mà chúng + +91 +00:07:10,290 --> 00:07:13,770 +tôi sẽ cần sửa đổi để hoàn thành thử thách này. + +92 +00:07:13,800 --> 00:07:20,220 +Bây giờ bạn cũng đã có giải pháp, tôi khuyên bạn không nên xem giải pháp này cho đến khi bạn hoàn thành thử thách, mà chỉ để + +93 +00:07:20,220 --> 00:07:23,790 +kiểm tra mã của bạn hoặc xem liệu có bất kỳ sự khác biệt nào không. + +94 +00:07:23,790 --> 00:07:29,430 +Bây giờ hãy lưu ý cách tôi đã thêm một chút ở đây để bạn không vô tình nhìn thấy trừ khi bạn + +95 +00:07:29,430 --> 00:07:29,970 +muốn. + +96 +00:07:29,970 --> 00:07:34,110 +Nhưng nếu bạn muốn xem giải pháp, chỉ cần cuộn xuống và bạn sẽ thấy nó ở dưới đó. + +97 +00:07:34,320 --> 00:07:43,560 +Mục tiêu của bài tập này là tạo mã ở đây, tạo một trang web trông như thế này. + +98 +00:07:43,740 --> 00:07:48,780 +Hãy nhớ trước đây khi chúng tôi thiết lập và tải xuống Mã VS, tôi đã chỉ cho bạn cách cài đặt bản xem trước + +99 +00:07:48,780 --> 00:07:50,580 +trực tiếp của tiện ích mở rộng. + +100 +00:07:50,580 --> 00:07:55,770 +Nếu bạn không thấy bản xem trước trực tiếp khi nhấp vào tiện ích mở rộng, điều đó có thể có nghĩa là bạn đã + +101 +00:07:55,770 --> 00:07:57,360 +bỏ lỡ một số phần của video đó. + +102 +00:07:57,360 --> 00:08:03,690 +Vì vậy, vui lòng quay lại thiết lập và tải xuống video cho VS Code vì có một số thứ khác mà tôi cũng + +103 +00:08:03,690 --> 00:08:05,100 +cần bạn thiết lập. + +104 +00:08:05,130 --> 00:08:10,020 +Hãy chắc chắn rằng bạn không bỏ qua bất kỳ bài học nào trừ khi bạn biết chính xác mình đang làm gì và bạn thực + +105 +00:08:10,020 --> 00:08:11,400 +sự quen thuộc với mọi thứ. + +106 +00:08:11,580 --> 00:08:18,690 +Điều mà bản xem trước trực tiếp đó cho phép chúng tôi làm là đi vào tệp mã của chúng tôi index. html, nhấp chuột phải vào nó và nhấp vào hiển thị + +107 +00:08:18,690 --> 00:08:20,160 +bản xem trước. + +108 +00:08:20,160 --> 00:08:26,190 +Vì vậy, bây giờ nó sẽ mở ra một ngăn khác và bạn có thể thấy nó hiển thị các chương sách của chúng + +109 +00:08:26,190 --> 00:08:31,800 +ta, Phần một, Chương một, chương hai, chương ba và các phần Sơ đồ và Tiểu mục. + +110 +00:08:31,920 --> 00:08:38,010 +Thật không may, mọi thứ dường như chỉ nằm trên một dòng dài, và nếu bạn kéo nó ra, bạn có thể thấy nó + +111 +00:08:38,010 --> 00:08:39,330 +chỉ là một dòng dài. + +112 +00:08:39,330 --> 00:08:44,400 +Không có định dạng nào cả và không có dấu hiệu nào về hệ thống phân cấp. + +113 +00:08:44,400 --> 00:08:46,860 +Vì vậy, đó là nơi thử thách xuất hiện. + +114 +00:08:46,890 --> 00:08:54,660 +Bạn sẽ sử dụng những gì bạn đã học về các phần tử tiêu đề để định dạng mã này + +115 +00:08:54,660 --> 00:08:59,820 +ở đây trong chỉ mục. html để chúng ta có được thứ gì đó giống như thế này. + +116 +00:08:59,820 --> 00:09:05,700 +Vì vậy, chúng tôi muốn bản xem trước hiển thị cho chúng tôi tiêu đề một thành phần tiêu đề hai thành phần tiêu đề ba thành phần. + +117 +00:09:05,700 --> 00:09:09,330 +Và cái này sơ đồ này thực sự là một yếu tố tiêu đề bốn. + +118 +00:09:09,330 --> 00:09:14,370 +Vì vậy, bạn nên có H một đến H bốn trong mã của mình ở đây. + +119 +00:09:14,370 --> 00:09:21,030 +Vì vậy, bây giờ là lúc tôi tạm dừng video và cố gắng hoàn thành thử thách này. + +120 +00:09:21,030 --> 00:09:26,970 +Và sau khi hoàn tất, bạn có thể tiếp tục phát video và chúng ta sẽ cùng nhau tìm hiểu giải pháp, hãy tạm dừng + +121 +00:09:26,970 --> 00:09:28,890 +video ngay bây giờ và thử xem. + +122 +00:09:32,320 --> 00:09:32,770 +Được rồi. + +123 +00:09:32,770 --> 00:09:40,480 +Vì vậy, chúng ta sẽ có một phần tử h một duy nhất ở đây, sẽ dành cho cuốn sách từ vựng này. + +124 +00:09:40,510 --> 00:09:48,250 +Vì vậy, chúng tôi sẽ đặt một yếu tố H một ngay tại đây và chúng tôi sẽ kéo cuốn sách của chúng tôi, đó là nội + +125 +00:09:48,250 --> 00:09:48,820 +dung. + +126 +00:09:48,820 --> 00:09:54,700 +Hãy nhớ rằng, ở giữa hai thẻ này, đó là cách các thẻ tiêu đề của chúng tôi được định dạng. + +127 +00:09:54,790 --> 00:10:00,910 +Bây giờ, phần tiếp theo là các phần của Chương một, chương hai, chương ba, và + +128 +00:10:00,910 --> 00:10:05,500 +tất cả chúng sẽ là cấp độ phân cấp tiếp theo, đó là H hai. + +129 +00:10:05,530 --> 00:10:08,290 +Vì vậy, hãy làm điều đó cho cả ba người họ. + +130 +00:10:16,830 --> 00:10:23,070 +Và sau đó chúng ta có thể chuyển sang phần H ba, đây sẽ là các phần trong các chương. + +131 +00:10:23,220 --> 00:10:27,690 +Và bây giờ tôi sẽ tua nhanh qua phần còn lại của mã để bạn không cảm thấy nhàm chán. + +132 +00:10:29,000 --> 00:10:35,930 +Và cuối cùng, sơ đồ này, nằm trong phần một của chương hai, sẽ là cấp cuối + +133 +00:10:35,930 --> 00:10:40,860 +cùng và thấp nhất của hệ thống phân cấp, đó là H 4. + +134 +00:10:40,880 --> 00:10:47,120 +Và khi chúng tôi đã hoàn thành tất cả mã này, bạn có thể tự kiểm tra mã giải pháp và bạn + +135 +00:10:47,120 --> 00:10:49,400 +sẽ thấy nó khá giống nhau. + +136 +00:10:51,020 --> 00:11:00,320 +Bây giờ, một trong những thứ mà bạn sẽ tìm thấy là khi bạn nhấn lưu bằng lệnh S hoặc sử dụng lưu tệp, bạn sẽ thấy CNTT tự động + +137 +00:11:00,320 --> 00:11:05,810 +định dạng mã của chúng ta để chúng ta mất bất kỳ dấu đầu dòng nào. + +138 +00:11:05,840 --> 00:11:09,470 +Đừng lo lắng nếu điều này xảy ra với bạn, nó hoàn toàn bình thường. + +139 +00:11:09,590 --> 00:11:13,670 +Và nếu chúng ta kiểm tra bản thân với giải pháp, bạn có thể thấy chúng phù hợp. + +140 +00:11:13,700 --> 00:11:14,600 +Chính xác. + +141 +00:11:14,600 --> 00:11:20,840 +Và chúng tôi đạt được kết quả tương tự như hình ảnh mục tiêu, đó là những gì chúng tôi đang hướng tới. + +142 +00:11:21,470 --> 00:11:22,960 +Làm thế nào mà bạn quản lý? + +143 +00:11:22,970 --> 00:11:23,750 +Đừng lo lắng. + +144 +00:11:23,750 --> 00:11:30,170 +Nếu bạn mắc sai lầm, đây là lúc an toàn để bạn mắc sai lầm và thử mọi thứ vì chúng tôi chỉ đang tìm hiểu rằng không có bài + +145 +00:11:30,170 --> 00:11:32,600 +kiểm tra nào và không có ai theo dõi bạn. + +146 +00:11:32,630 --> 00:11:35,420 +Tất cả những gì quan trọng là bạn đang thực sự học hỏi. + +147 +00:11:35,420 --> 00:11:36,890 +Đó mới là điều quan trọng. + +148 +00:11:36,920 --> 00:11:38,590 +Có một chơi xung quanh với mã. + +149 +00:11:38,600 --> 00:11:42,260 +Đừng lo lắng, nếu bạn làm sai điều gì, luôn có cách giải quyết. + +150 +00:11:42,260 --> 00:11:44,240 +Và tôi ở đây để giúp bạn. + +151 +00:11:44,900 --> 00:11:49,880 +Có một số điều cần lưu ý về những điều nên làm và không nên làm khi đề cập đến các yếu tố tiêu + +152 +00:11:49,880 --> 00:11:51,390 +đề mà tôi muốn nói với bạn. + +153 +00:11:51,420 --> 00:11:56,990 +Một nguyên tắc quan trọng là chú ý rằng trong bài tập của chúng ta chỉ có một H1. + +154 +00:11:57,000 --> 00:12:05,280 +Không nên có nhiều hơn một H1 vì H1 là tiêu đề cấp cao nhất. + +155 +00:12:05,310 --> 00:12:11,340 +Hãy tưởng tượng H1 là tiêu đề cuốn sách và mục lục bao gồm các phần khác. + +156 +00:12:11,340 --> 00:12:14,520 +Vì vậy, có lẽ H2 sẽ là chương đầu tiên. + +157 +00:12:15,150 --> 00:12:17,580 +Không có nhiều hơn một H1. + +158 +00:12:17,580 --> 00:12:26,400 +Thay vào đó, nếu bạn cần một phụ đề khác hoặc một cấp tiêu đề khác, thì hãy chuyển đến H2 hoặc H3 hoặc tất + +159 +00:12:26,400 --> 00:12:29,430 +cả những phụ đề khác cho đến H6. + +160 +00:12:30,180 --> 00:12:34,710 +Bây giờ, điều khác cần chú ý là không bỏ qua một cấp độ. + +161 +00:12:34,710 --> 00:12:40,440 +Khi bạn đang tạo các phần tử tiêu đề, đừng đi thẳng từ H1 đến H3. + +162 +00:12:40,470 --> 00:12:46,170 +Nếu bạn có H3, thì cũng phải có H2 ở đâu đó trên trang web đó. + +163 +00:12:46,230 --> 00:12:52,650 +Thay vào đó, tôi khuyên bạn chỉ nên thực hiện theo thứ tự khi bạn có H1 mà bạn đã tạo và sau đó bạn nhận ra mình + +164 +00:12:52,650 --> 00:12:55,650 +cần một tiêu đề khác, sau đó chuyển sang H2. + +165 +00:12:55,650 --> 00:13:01,620 +Và sau đó, nếu bạn cần một cấp tiêu đề khác thậm chí còn có mức độ ưu tiên thấp hơn, hãy chuyển đến H3. + +166 +00:13:01,650 --> 00:13:04,680 +Đừng nhảy giữa các tiêu đề cấp độ khác nhau. + +167 +00:13:04,890 --> 00:13:07,710 +Đây không phải là những thứ sẽ phá mã của bạn. + +168 +00:13:07,710 --> 00:13:11,190 +Trang web của bạn sẽ trông vẫn ổn ngay cả khi bạn vi phạm tất cả các quy tắc này. + +169 +00:13:11,190 --> 00:13:13,140 +Nhưng chúng chỉ là những quy tắc cho quy ước. + +170 +00:13:13,140 --> 00:13:17,880 +Và bởi vì chúng ta sẽ trở thành những người chuyên nghiệp, chúng ta sẽ bắt đầu bằng chân phải và tìm hiểu + +171 +00:13:17,880 --> 00:13:19,740 +tất cả các quy tắc mà chúng ta cần biết. + +172 +00:13:20,270 --> 00:13:27,350 +Bây giờ, nếu bạn muốn đọc nhiều hơn nữa về các thành phần tiêu đề, thì tôi khuyên bạn nên truy cập công cụ chuyên + +173 +00:13:27,380 --> 00:13:34,610 +nghiệp, đó là tài liệu web mạng lưới nhà phát triển Mozilla của chúng tôi và chúng có tài liệu về tất cả các thành + +174 +00:13:34,760 --> 00:13:36,950 +phần HTML hiện có. + +175 +00:13:36,950 --> 00:13:43,070 +Và khi bạn đọc từng trang này, chúng sẽ cho bạn biết thêm chi tiết về những điều bạn cần biết và chúng + +176 +00:13:43,070 --> 00:13:47,630 +cho bạn thấy một số ví dụ tương tác về cách thức hoạt động của tất cả. + +177 +00:13:47,870 --> 00:13:53,750 +Bây giờ, tôi không khuyên bạn nên đọc qua tất cả những điều này cho tất cả các phần tử HTML, nhưng tôi khuyên + +178 +00:13:53,750 --> 00:13:59,420 +bạn nên sử dụng một phần tử mới mà bạn chưa từng thấy trước đây và bạn không biết nó hoạt động như thế + +179 +00:13:59,420 --> 00:14:04,700 +nào , bạn chưa có bài giảng về nó, thì tôi khuyên bạn chỉ nên xem nhanh tài liệu và xem một số ví + +180 +00:14:04,700 --> 00:14:09,920 +dụ về cách chúng được sử dụng theo cách tương tự mà tôi đã chỉ cho bạn trong bài giảng. + +181 +00:14:10,640 --> 00:14:15,800 +Bây giờ chúng ta đã học về một trong những thành phần quan trọng nhất của HTML, thành phần tiêu đề, + +182 +00:14:15,800 --> 00:14:21,960 +trong bài học tiếp theo, chúng ta sẽ chuyển sang một thành phần cực kỳ quan trọng khác, đó là thành phần đoạn văn. + +183 +00:14:21,960 --> 00:14:24,450 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 MDN-Docs-Headings.url b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 MDN-Docs-Headings.url new file mode 100644 index 0000000000000000000000000000000000000000..a6e67044a0631b8d84865eefbd228c652686ab68 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 MDN-Docs-Headings.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements \ No newline at end of file diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 Unzip-in-Windows.url b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 Unzip-in-Windows.url new file mode 100644 index 0000000000000000000000000000000000000000..af637a9b4ad87a0cc109b02b67aaf807eb1e0cd1 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 Unzip-in-Windows.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pureinfotech.com/extract-zip-file-windows-11-10/ \ No newline at end of file diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 Unzip-on-Mac.url b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 Unzip-on-Mac.url new file mode 100644 index 0000000000000000000000000000000000000000..ad3664d393f07ea565cea7fde19f85dd3afe531e --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/005 Unzip-on-Mac.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://support.apple.com/en-gb/guide/mac-help/mchlp2528/mac \ No newline at end of file diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 2.2-Paragraph-Element.zip b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 2.2-Paragraph-Element.zip new file mode 100644 index 0000000000000000000000000000000000000000..f98f553c1101fbc079c495620399c5df48ba5bc0 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 2.2-Paragraph-Element.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a1af4eebdd7e65041d122de0759fea83fcd1bf7c09d9061d95cdc05089d3a08 +size 1734253 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 HTML Paragraph Elements.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 HTML Paragraph Elements.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7dc23fd62428b949da2b826c3e09e0509d99c75e --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 HTML Paragraph Elements.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c6472ecc59527321f713dc164bf6384cdffed73521a49f651be8b57df52bd44 +size 129713803 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 HTML Paragraph Elements_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 HTML Paragraph Elements_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6dad73d611058c1120d384ceac39e5418a0638b4 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/006 HTML Paragraph Elements_vi.srt @@ -0,0 +1,368 @@ +1 +00:00:00,170 --> 00:00:05,330 +Vì vậy, bây giờ bạn đã thấy những gì bạn có thể làm với phần tử tiêu đề HTML, phần tiếp theo + +2 +00:00:05,330 --> 00:00:07,880 +chúng ta sẽ tìm hiểu là phần tử đoạn văn. + +3 +00:00:07,880 --> 00:00:13,490 +Và điều này cũng liên quan đến định dạng và đặt văn bản trên trang web của chúng tôi. + +4 +00:00:14,000 --> 00:00:22,070 +Đây là giao diện của phần tử đoạn văn và tương tự như phần tử tiêu đề, + +5 +00:00:22,100 --> 00:00:31,670 +bạn có thẻ mở và thẻ đóng, và ở giữa bạn có nội dung sẽ là đoạn văn của mình. + +6 +00:00:32,000 --> 00:00:39,710 +Bây giờ, lý do tại sao chúng ta cần một thẻ đoạn văn là bởi vì nếu bạn chỉ có văn bản thuần túy trong tài liệu HTML + +7 +00:00:39,740 --> 00:00:46,720 +của mình, khi bạn chạy mã và bạn thấy nó trên một trang web, những gì bạn sẽ thấy giống như thế này. + +8 +00:00:46,730 --> 00:00:53,870 +Văn bản, chúng chạy vào nhau trên cùng một dòng và bạn thực sự không thể biết đoạn này bắt đầu ở đâu + +9 +00:00:53,870 --> 00:00:56,060 +và đoạn kia kết thúc ở đâu. + +10 +00:00:56,510 --> 00:01:03,630 +Ngược lại, nếu chúng ta đã tạo hai phần tử đoạn văn cho hai dòng này, thì khi chạy mã, + +11 +00:01:03,630 --> 00:01:10,890 +bạn sẽ thấy chúng được phân tách bằng một dòng ở giữa để có thể phân biệt các đoạn văn + +12 +00:01:10,890 --> 00:01:12,060 +khác nhau. + +13 +00:01:12,630 --> 00:01:18,930 +Và điều này cũng thực sự quan trọng đối với những người đang sử dụng trình đọc màn hình, vì vậy + +14 +00:01:18,960 --> 00:01:26,010 +những người có thể bị mù, bởi vì những gì trình đọc màn hình sẽ làm là họ sẽ thấy phần đầu của từng thành phần + +15 +00:01:26,010 --> 00:01:33,480 +đoạn văn và nó cho phép người dùng mù có thể bỏ qua sang đoạn tiếp theo một cách dễ dàng và có thể xem điều gì đang + +16 +00:01:33,480 --> 00:01:34,770 +xảy ra mỗi lần. + +17 +00:01:35,340 --> 00:01:41,460 +Bây giờ, hãy thực hành những kỹ năng đó bằng cách thử làm một bài tập sử dụng yếu tố đoạn văn. + +18 +00:01:41,730 --> 00:01:47,130 +Nếu bạn truy cập tài nguyên khóa học cho bài học này, bạn sẽ có thể tải xuống + +19 +00:01:47,130 --> 00:01:50,100 +tệp zip cho 2. 2 phần tử đoạn văn. + +20 +00:01:50,100 --> 00:01:56,040 +Và khi bạn đã giải nén và giải nén nó, hãy tiếp tục và đặt nó vào thư mục dự án phát + +21 +00:01:56,040 --> 00:01:59,520 +triển web của bạn rồi mở nó ra bên trong vs mã. + +22 +00:01:59,550 --> 00:02:06,150 +Tôi đã chỉ cho bạn cách thực hiện tất cả những điều này trong bài học trước về phần tử tiêu đề HTML cũng như bài học + +23 +00:02:06,150 --> 00:02:11,910 +đầu tiên khi tôi chỉ cho bạn cách tải xuống tài nguyên khóa học, vì vậy hãy nhớ kiểm tra những nơi đó + +24 +00:02:11,910 --> 00:02:14,850 +nếu bạn không biết cách lấy. của thư mục này. + +25 +00:02:15,060 --> 00:02:20,970 +Nhưng một khi bạn đã mở nó ra như thế này, thì tôi muốn bạn tiếp tục và mở chỉ mục ra. html, như mọi khi, là nơi + +26 +00:02:20,970 --> 00:02:24,690 +chúng ta sẽ viết mã của mình. + +27 +00:02:24,930 --> 00:02:32,070 +Lưu ý ở đây chúng ta có ba đoạn văn, đoạn đầu tiên, đoạn thứ hai và đoạn thứ ba. + +28 +00:02:32,070 --> 00:02:36,240 +Và sau đó là một số văn bản giữ chỗ bằng tiếng Latinh, không có nghĩa gì cả. + +29 +00:02:36,240 --> 00:02:42,180 +Nó chỉ ở đó để bạn có thể thấy một đoạn văn bản trông như thế nào. + +30 +00:02:42,180 --> 00:02:49,860 +Và khi bạn tiếp tục và nhấp chuột phải và hiển thị bản xem trước, bạn sẽ thấy rằng tất cả các đoạn được + +31 +00:02:49,860 --> 00:02:58,050 +trộn lẫn với nhau thành một dòng dài và chúng ta không thể biết đoạn này bắt đầu và đoạn kia kết thúc ở đâu. + +32 +00:02:58,050 --> 00:03:05,490 +Vì vậy, bây giờ nhiệm vụ của bạn là giải quyết vấn đề này bằng cách sử dụng những gì bạn đã học được về thành phần đoạn văn. + +33 +00:03:05,490 --> 00:03:12,960 +Vì vậy, hãy tiếp tục và định dạng ba đoạn này bằng cách sử dụng thẻ đoạn và sau khi hoàn tất, bạn sẽ thấy + +34 +00:03:12,960 --> 00:03:14,250 +bản xem trước. + +35 +00:03:14,280 --> 00:03:22,560 +Hiển thị một cái gì đó như thế này trong đó mỗi đoạn văn được tách thành các dòng mới và rõ ràng trực quan, chúng tôi + +36 +00:03:22,560 --> 00:03:28,650 +có thể thấy sự khác biệt và chúng tôi có thể phân biệt ba đoạn văn khác nhau này. + +37 +00:03:28,980 --> 00:03:32,880 +Tạm dừng video ngay bây giờ và sau khi bạn hoàn tất, chúng ta sẽ cùng nhau tìm hiểu giải pháp. + +38 +00:03:36,890 --> 00:03:37,280 +Được rồi. + +39 +00:03:37,280 --> 00:03:39,800 +Chúng tôi sẽ sử dụng thẻ đoạn văn của chúng tôi. + +40 +00:03:39,800 --> 00:03:46,970 +Vì vậy, chúng ta sẽ đặt thẻ mở ở đây ngay trước đoạn đầu tiên của chúng ta, sau đó chúng + +41 +00:03:46,970 --> 00:03:53,510 +ta sẽ đặt thẻ đóng ở cuối đoạn đầu tiên, và sau đó chúng ta sẽ lặp lại điều đó về + +42 +00:03:53,510 --> 00:03:56,810 +cơ bản cho tất cả các đoạn khác. + +43 +00:03:59,490 --> 00:04:03,390 +Bây giờ bạn có thể thấy ở đây tôi chỉ nhấp và kéo. + +44 +00:04:03,510 --> 00:04:11,370 +Ngoài ra, bạn có thể cắt nó rồi dán vào cuối đoạn văn. + +45 +00:04:11,400 --> 00:04:16,950 +Thực sự không quan trọng bạn làm như thế nào, miễn là bạn đặt các thẻ đó ở đúng nơi. + +46 +00:04:16,950 --> 00:04:24,250 +Và bây giờ, hy vọng bản xem trước của bạn đã được cập nhật và bạn có thể thấy các đoạn văn này hình thành khi chúng tôi nhập. + +47 +00:04:24,270 --> 00:04:27,660 +Vì vậy, điều này trông khá giống với mục tiêu của chúng tôi. + +48 +00:04:27,660 --> 00:04:35,760 +Và nếu bạn kiểm tra giải pháp HTML, bạn cũng sẽ thấy các thẻ ở đúng vị trí. + +49 +00:04:35,880 --> 00:04:42,780 +Vì vậy, hy vọng điều đó không quá khó và bạn có thể tự mình làm tất cả và bây giờ bạn đã + +50 +00:04:42,780 --> 00:04:51,870 +thấy lợi ích của việc sử dụng phần tử đoạn văn để phân tách văn bản thành các đoạn nội dung khác nhau là gì? + +51 +00:04:52,140 --> 00:04:59,260 +Bây giờ, những gì bạn đã thấy trong bài tập là những đoạn văn bản giữ chỗ, và đó là những gì chúng tôi gọi là + +52 +00:04:59,260 --> 00:05:00,310 +Lorem ipsum. + +53 +00:05:00,340 --> 00:05:04,240 +Đó là thứ mà bạn sẽ bắt gặp khá nhiều, đặc biệt là trong thiết kế web. + +54 +00:05:04,240 --> 00:05:11,110 +Đó là để chúng tôi không kết thúc với một thứ như thế này khi chúng tôi đang cố mô phỏng nội dung trong một đoạn văn, nhưng sau đó chúng tôi chỉ + +55 +00:05:11,110 --> 00:05:15,310 +viết nội dung, nội dung, nội dung hoặc đây là một đoạn văn, đây là một đoạn văn, đây là + +56 +00:05:15,310 --> 00:05:16,180 +một đoạn văn. + +57 +00:05:16,180 --> 00:05:20,500 +Và lý do tại sao chúng tôi không muốn làm điều này là bởi vì đây đều là những từ giống nhau. + +58 +00:05:20,530 --> 00:05:22,240 +Câu có cùng độ dài. + +59 +00:05:22,240 --> 00:05:27,640 +Nó không giống như một khối văn bản tự nhiên sẽ trông như thế nào và chúng tôi không có thời gian cũng + +60 +00:05:27,640 --> 00:05:31,660 +như năng lượng để thực sự tạo nội dung chỉ để thử nghiệm và thiết kế web. + +61 +00:05:31,660 --> 00:05:35,140 +Vì vậy, đó là lý do tại sao chúng tôi sử dụng thứ gọi là Lorem Ipsum. + +62 +00:05:35,590 --> 00:05:44,320 +Và Lorem ipsum dường như đến từ văn học cổ điển Latinh của một tác giả nổi tiếng tên là Cicero. + +63 +00:05:44,350 --> 00:05:51,160 +Nếu bạn đã nghe nói về anh ấy và nó đã hơn 2000 năm tuổi và điều này đã được sử dụng trong ngành in ấn + +64 +00:05:51,160 --> 00:05:57,700 +trong nhiều năm, kể từ những năm 1500, thậm chí, khi mọi người bắt đầu đặt báo và khi họ chưa + +65 +00:05:57,700 --> 00:06:01,780 +có nội dung cho bố cục, họ sẽ sử dụng văn bản giữ chỗ này. + +66 +00:06:01,810 --> 00:06:09,640 +Nếu bạn muốn nắm giữ chúng, bạn có thể truy cập Simcom và ở đó bạn sẽ tìm thấy Lorem ipsum ngay cả trong các + +67 +00:06:09,640 --> 00:06:17,050 +ngôn ngữ khác nhau như tiếng Hà Lan hoặc tiếng Ba Lan và bạn có thể sử dụng công cụ này để tạo bao nhiêu + +68 +00:06:17,050 --> 00:06:24,160 +đoạn văn hoặc từ hoặc byte hoặc danh sách tùy ý. bạn cần bằng cách sử dụng nút tạo này. + +69 +00:06:24,160 --> 00:06:29,130 +Và đây, tôi đã có năm đoạn sẵn sàng để đưa vào thiết kế web mới của mình. + +70 +00:06:29,140 --> 00:06:35,290 +Bây giờ, thay vì có một cái gì đó trông giống như thế này trong đó mọi thứ đều dài như nhau, thay vào + +71 +00:06:35,290 --> 00:06:42,310 +đó chúng ta có những đoạn văn trông rất tự nhiên bắt chước khá giống một bài báo tiếng Anh thông thường trông như + +72 +00:06:42,310 --> 00:06:43,150 +thế nào. + +73 +00:06:43,150 --> 00:06:47,230 +Và điều này được thực hiện chỉ trong vài giây bằng Lorem ipsum. + +74 +00:06:47,560 --> 00:06:53,410 +Bây giờ nếu Lorem ipsum hơi quá nhàm chán đối với bạn, thì thực sự có một số phiên bản mới lạ của điều này. + +75 +00:06:53,440 --> 00:06:59,650 +Một trong những món ưa thích của tôi là thịt xông khói ipsum. com và nó sẽ tạo ra tương tự như Lorem ipsum, + +76 +00:06:59,650 --> 00:07:05,710 +nhưng sau đó bạn sẽ nhận được các từ như thịt xông khói và sườn và thăn lợn và bụng lợn. + +77 +00:07:05,740 --> 00:07:11,950 +Bây giờ nếu bạn không phải là người ăn thịt, thì có lẽ bạn nên thử món gì đó như bro ipsum. com nơi bạn có thể có tất + +78 +00:07:11,950 --> 00:07:18,550 +cả các thuật ngữ bro ở định dạng Lorem ipsum. + +79 +00:07:18,580 --> 00:07:35,110 +Và rõ ràng những thứ mà anh em nói là những thứ như Taco pow và washboard và rail và heli paopao, bất kể nó có thể + +80 +00:07:35,200 --> 00:07:36,670 +là gì. + +81 +00:07:36,670 --> 00:07:42,370 +Và nếu không có thứ nào trong số này làm bạn thích, thì tôi khuyên bạn nên truy cập Google và bạn thực sự có + +82 +00:07:42,370 --> 00:07:46,270 +thể tìm thấy nhiều thứ hơn bằng cách chỉ tìm kiếm Lorem ipsum vui nhộn. + +83 +00:07:46,270 --> 00:07:52,780 +Và có rất nhiều loại khác nhau như ipsum thuần chay hoặc ipsum cướp biển và bạn sẽ bắt gặp tất + +84 +00:07:52,780 --> 00:07:56,170 +cả các loại trình tạo văn bản giữ chỗ khác nhau. + +85 +00:07:56,170 --> 00:08:02,290 +Nhưng điều quan trọng là bạn biết cách nắm giữ chúng và bạn có thể sử dụng nó trong mã của mình. + +86 +00:08:02,290 --> 00:08:10,300 +Vì vậy, như một thử thách bổ sung, nếu muốn, bạn có thể tạo phiên bản Lorem ipsum hoặc Bacon ipsum + +87 +00:08:10,300 --> 00:08:18,880 +hoặc bro ipsum của riêng mình và bạn có thể tạo một bài viết bằng cách sử dụng thẻ đoạn văn và Lorem ipsum + +88 +00:08:18,880 --> 00:08:20,200 +mà bạn đã tạo. + +89 +00:08:20,500 --> 00:08:26,500 +Vui lòng sửa đổi chỉ mục. html trong bài tập mã hóa mà chúng ta vừa hoàn thành. + +90 +00:08:26,980 --> 00:08:32,260 +Vì vậy, hãy chơi xung quanh vấn đề đó và nhớ bình luận trong phần Hỏi & Đáp bên dưới. + +91 +00:08:32,260 --> 00:08:39,400 +Nếu bạn tìm thấy một Lorem ipsum nào đó mà bạn cho là lố bịch hoặc thực sự buồn cười hoặc thực sự thú vị và tôi sẽ gặp bạn trong + +92 +00:08:39,400 --> 00:08:40,929 +bài học tiếp theo. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 2.3-Void-Elements.zip b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 2.3-Void-Elements.zip new file mode 100644 index 0000000000000000000000000000000000000000..0971be4e96c0711e8f427077dac27066f17b189b --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 2.3-Void-Elements.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69d5ddeacf62fc724a92c37c506d1365459f0e86c75ed77d91e1bddfd71141c3 +size 1469608 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Diff-Checker.url b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Diff-Checker.url new file mode 100644 index 0000000000000000000000000000000000000000..547abc80a7e9cdd12cb44894def504034d0f4b5d --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Diff-Checker.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.diffchecker.com/ \ No newline at end of file diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Self Closing Tags.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Self Closing Tags.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..64f434bb34580e3d19dcb5d35320b2f768ea7923 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Self Closing Tags.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acc9655ff7e441e6c30fec02926bf75555aee44944642bfc8b8189bbc84648e8 +size 134723656 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Self Closing Tags_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Self Closing Tags_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0fe6dcc44a2a416fc88abbdd2125f0256501b555 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/007 Self Closing Tags_vi.srt @@ -0,0 +1,572 @@ +1 +00:00:00,680 --> 00:00:01,040 +Được rồi. + +2 +00:00:01,040 --> 00:00:08,690 +Vì vậy, trong bài học này, chúng ta sẽ tìm hiểu tất cả về các phần tử void như thước kẻ ngang và phần + +3 +00:00:08,690 --> 00:00:09,770 +tử ngắt. + +4 +00:00:10,130 --> 00:00:12,420 +Chính xác thì các phần tử void là gì? + +5 +00:00:12,440 --> 00:00:19,700 +Chà, chúng ta đã biết phần tử không trống là gì, chẳng hạn như phần tử đoạn văn hoặc phần tử + +6 +00:00:19,700 --> 00:00:25,070 +tiêu đề, và chúng không trống vì chúng có nội dung ở ngay giữa. + +7 +00:00:25,490 --> 00:00:33,340 +Phần tử void là phần tử mà bạn bị cấm đưa bất kỳ nội dung nào vào bên trong thẻ. + +8 +00:00:33,350 --> 00:00:37,160 +Và trên thực tế, thẻ thậm chí trông rất khác. + +9 +00:00:37,160 --> 00:00:43,490 +Vì vậy, đây là một thành phần quy tắc nằm ngang và bạn có thể thấy rằng nó bắt đầu bằng một góc, dấu ngoặc kết thúc bằng + +10 +00:00:43,490 --> 00:00:44,660 +một dấu ngoặc góc. + +11 +00:00:44,660 --> 00:00:51,320 +Nhưng ngay tại đây, có một dấu gạch chéo về phía trước ngay trước khi kết thúc thẻ. + +12 +00:00:51,410 --> 00:00:58,520 +Bạn có thể nghĩ rằng nó trông hơi giống thẻ đóng của một phần tử HTML thông thường, nhưng nó + +13 +00:00:58,520 --> 00:01:07,500 +thực sự khác biệt một chút bởi vì ở đây trong thẻ đóng, dấu gạch chéo về phía trước đó nằm ngay sau dấu ngoặc nhọn mở. + +14 +00:01:07,500 --> 00:01:10,680 +Nó ở ngay đây trước bức thư. + +15 +00:01:10,710 --> 00:01:17,760 +Trong khi trong các phần tử void, dấu gạch chéo về phía trước thực sự ngay trước khi kết thúc thẻ. + +16 +00:01:17,850 --> 00:01:23,910 +Và thông thường, theo quy ước, bạn sẽ thấy một khoảng trống nhỏ ở đây giữa tên thẻ và dấu gạch chéo + +17 +00:01:23,910 --> 00:01:25,170 +về phía trước. + +18 +00:01:25,710 --> 00:01:28,740 +Đây chỉ là một cái gì đó để thực sự cẩn thận về. + +19 +00:01:28,740 --> 00:01:31,560 +Khi bạn đang tạo các phần tử khoảng trống này. + +20 +00:01:31,560 --> 00:01:38,400 +Đảm bảo rằng bạn có dấu gạch chéo về phía trước gạch chéo theo đúng hướng theo cách này chứ không phải dấu gạch chéo ngược + +21 +00:01:38,400 --> 00:01:39,150 +như thế này. + +22 +00:01:39,150 --> 00:01:47,700 +Vì vậy, khi nó trỏ về bên phải, thì đó là dấu gạch chéo về phía trước và khi nó trỏ về phía sau, thì đó là dấu gạch + +23 +00:01:47,700 --> 00:01:49,020 +chéo ngược. + +24 +00:01:49,770 --> 00:01:55,020 +Vậy nó trông như thế nào khi chúng ta thêm nó vào tài liệu HTML? + +25 +00:01:55,050 --> 00:02:02,250 +Chà, ở đây chúng ta có hai đoạn trước và ngay giữa hai đoạn tôi đã thêm một quy tắc + +26 +00:02:02,250 --> 00:02:10,860 +ngang, hy vọng sẽ giúp chúng ta phân chia nội dung để chỉ ra rằng phần này không liên quan đến phần + +27 +00:02:10,860 --> 00:02:11,670 +này. + +28 +00:02:11,670 --> 00:02:18,840 +Và chúng ta có một số loại phân tách ở giữa khi chúng ta chạy mã này hoặc khi chúng ta xem nó trong trình duyệt web, đây là + +29 +00:02:18,840 --> 00:02:20,130 +những gì bạn sẽ thấy. + +30 +00:02:20,160 --> 00:02:25,560 +Bạn sẽ thấy đoạn đầu tiên, đoạn thứ hai, và sau đó bạn sẽ thấy quy tắc ngang + +31 +00:02:25,560 --> 00:02:31,920 +này hoặc về cơ bản là một đường ngang nơi phần tử không khí sẽ nằm trong tài liệu đó. + +32 +00:02:32,130 --> 00:02:35,970 +Bây giờ quy tắc ngang không phải là yếu tố void duy nhất. + +33 +00:02:36,000 --> 00:02:38,910 +Một yếu tố phổ biến khác mà bạn sẽ thấy là phần tử ngắt. + +34 +00:02:38,910 --> 00:02:40,650 +Và nó trông như thế này. + +35 +00:02:40,680 --> 00:02:47,670 +Bây giờ, tương tự, một lần nữa, chúng ta có tên của thẻ và sau đó chúng ta có dấu gạch chéo về phía trước và sau + +36 +00:02:47,670 --> 00:02:50,190 +đó về cơ bản chúng ta kết thúc thẻ. + +37 +00:02:50,190 --> 00:02:51,810 +Vì vậy, không có thẻ mở. + +38 +00:02:51,810 --> 00:02:53,040 +Không có thẻ đóng. + +39 +00:02:53,040 --> 00:02:56,580 +Chỉ có một thẻ duy nhất trông như thế này. + +40 +00:02:56,580 --> 00:03:01,650 +Và tên của thẻ đi ngay trước dấu gạch chéo về phía trước. + +41 +00:03:01,770 --> 00:03:04,800 +Bây giờ, phần tử ngắt hoạt động như thế nào? + +42 +00:03:05,280 --> 00:03:11,220 +Chà, nó thực sự hữu ích khi bạn có những thứ mà bạn cần tách chúng thành các dòng riêng + +43 +00:03:11,220 --> 00:03:13,440 +biệt để có nghĩa chính xác. + +44 +00:03:13,470 --> 00:03:21,240 +Ví dụ, nếu bạn có những bài thơ, trên thực tế chúng nằm trong cùng một đoạn văn, nhưng chúng thực sự nên + +45 +00:03:21,240 --> 00:03:27,900 +nằm trên những dòng khác nhau để làm cho vần điệu hoạt động hoặc để làm cho cấu trúc của bài + +46 +00:03:27,900 --> 00:03:29,370 +thơ chính xác. + +47 +00:03:29,400 --> 00:03:34,350 +Đây là bài thơ của một trong những nhà thơ yêu thích của tôi, William Blake. + +48 +00:03:34,350 --> 00:03:42,840 +Và để nó hoạt động, chúng ta không thể có tất cả chạy trên một dòng, cho dù nó nằm trong cùng một đoạn văn. + +49 +00:03:42,930 --> 00:03:49,980 +Nếu chúng ta có đoạn mã này ngay tại đây, mặc dù đúng vậy, nhưng tất cả đều nằm trong cùng một đoạn, tất cả đều + +50 +00:03:49,980 --> 00:03:52,920 +liên quan đến nhau và điều này có ý nghĩa. + +51 +00:03:52,920 --> 00:03:54,960 +Nhưng bạn không nhìn thơ như thế này. + +52 +00:03:54,960 --> 00:03:56,250 +Nó không thực sự hoạt động. + +53 +00:03:56,250 --> 00:04:00,270 +Chúng tôi không biết mình phải thở ở đâu và phải đọc bài thơ như thế nào. + +54 +00:04:00,270 --> 00:04:04,350 +Vì vậy, thay vào đó, chúng ta có thể thêm các phần tử ngắt mà chúng ta vừa tìm hiểu. + +55 +00:04:04,590 --> 00:04:11,820 +Yếu tố khoảng trống của chúng tôi không có bất kỳ nội dung nào trong đó, nhưng nó chỉ cho thấy chỗ ngắt trong + +56 +00:04:11,820 --> 00:04:14,880 +đoạn văn này phải đi để bài thơ này có vẻ đúng. + +57 +00:04:14,880 --> 00:04:19,110 +Và khi tài liệu HTML này được hiển thị, đây là những gì bạn sẽ thấy. + +58 +00:04:19,140 --> 00:04:21,410 +Một bố cục hoàn hảo cho một bài thơ. + +59 +00:04:21,420 --> 00:04:25,230 +Thế giới trong một hạt cát và thiên đường trong một bông hoa chiến tranh. + +60 +00:04:25,260 --> 00:04:29,970 +Giữ vô hạn trong lòng bàn tay của bạn và vĩnh cửu trong một giờ. + +61 +00:04:30,390 --> 00:04:39,060 +Và tất cả đều được định dạng đẹp mắt nhờ mỗi phần tử ngắt của chúng tôi ở cuối mỗi dòng. + +62 +00:04:39,540 --> 00:04:45,120 +Vì vậy, bây giờ đến lượt bạn thử một bài tập sử dụng các phần tử khoảng trống này. + +63 +00:04:45,120 --> 00:04:53,160 +Vì vậy, hãy tiếp tục và tải xuống các tệp bắt đầu cho bài tập này từ tài nguyên khóa học cho bài học này. + +64 +00:04:53,700 --> 00:04:59,610 +Và khi bạn giải nén và mở nó ra, đây là những gì bạn sẽ thấy trong chỉ mục. + +65 +00:05:00,960 --> 00:05:07,170 +Chúng tôi đã biết tên của nhà thơ William Blake, và đây rõ ràng là địa chỉ thực của anh ấy mà anh ấy đã sống vào một + +66 +00:05:07,170 --> 00:05:08,900 +thời điểm nào đó trong đời. + +67 +00:05:08,910 --> 00:05:14,160 +Và sau đó chúng tôi có hai đoạn văn từ Wikipedia mô tả ngắn gọn về nhà thơ. + +68 +00:05:14,160 --> 00:05:20,790 +Và tôi muốn bạn sử dụng mọi thứ bạn đã học được cho đến nay để định dạng tài liệu này sao cho nó trông + +69 +00:05:20,790 --> 00:05:24,480 +giống như mục tiêu mà tôi dành cho bạn ngay tại đây. + +70 +00:05:24,600 --> 00:05:31,200 +Như bạn có thể thấy, cấp cao nhất này, tên của nhà thơ của chúng ta sẽ được hiển thị dưới dạng chữ + +71 +00:05:31,200 --> 00:05:35,450 +H, bởi vì đó là điều quan trọng nhất về trang web cụ thể này. + +72 +00:05:35,460 --> 00:05:40,800 +Và sau đó chúng ta có địa chỉ của nhà thơ, được hiển thị dưới dạng một đoạn văn. + +73 +00:05:40,800 --> 00:05:47,520 +Nhưng lưu ý rằng các địa chỉ, mặc dù chúng là một đoạn duy nhất, nhưng chúng lại cần được chia thành các dòng riêng + +74 +00:05:47,520 --> 00:05:50,670 +biệt bằng cách sử dụng phần tử ngắt của chúng ta. + +75 +00:05:50,670 --> 00:05:58,380 +Và cuối cùng, chúng ta có một quy tắc ngang tách biệt địa chỉ và tên tác giả khỏi một + +76 +00:05:58,380 --> 00:06:04,960 +chút mô tả về tác giả này, chúng nên nằm trong hai đoạn văn riêng biệt. + +77 +00:06:04,990 --> 00:06:12,720 +Bây giờ tôi muốn bạn tạm dừng video và chỉnh sửa chỉ mục. html để bạn kết thúc với PNG mục tiêu này. + +78 +00:06:13,000 --> 00:06:19,930 +Khi bạn xem trước trang web này thay vì khối văn bản lộn xộn này mà chúng tôi có vào lúc này. + +79 +00:06:20,650 --> 00:06:24,430 +Tạm dừng video ngay bây giờ và thực hiện thử thách này. + +80 +00:06:26,080 --> 00:06:26,620 +Được rồi. + +81 +00:06:26,620 --> 00:06:31,060 +Vì vậy, hy vọng bạn đã thử và mọi thứ đều suôn sẻ. + +82 +00:06:31,720 --> 00:06:33,850 +Tôi sẽ chạy qua các giải pháp. + +83 +00:06:33,850 --> 00:06:41,200 +Vì vậy, đầu tiên chúng tôi nói rằng chúng tôi sẽ có chữ H cho tên của anh ấy, và sau đó chúng tôi + +84 +00:06:41,200 --> 00:06:44,390 +sẽ có một thẻ đoạn bao quanh địa chỉ. + +85 +00:06:44,410 --> 00:06:52,240 +Bây giờ, để có địa chỉ đó trên các dòng khác nhau, chúng ta sẽ thêm phần tử ngắt vào + +86 +00:06:52,240 --> 00:06:53,860 +cuối mỗi dòng. + +87 +00:06:53,860 --> 00:06:57,730 +Và hãy nhớ rằng, phần tử break của chúng ta là một thẻ tự đóng. + +88 +00:06:57,730 --> 00:07:02,110 +Vì vậy, chúng tôi sẽ tạo ra nó như vậy. + +89 +00:07:02,350 --> 00:07:09,340 +Bây giờ tôi sẽ tiếp tục và chỉ cần sao chép và dán nó vào cuối mỗi dòng và bạn có thể thấy địa chỉ của chúng ta hiện + +90 +00:07:09,340 --> 00:07:11,710 +được định dạng độc đáo như thế nào. + +91 +00:07:11,710 --> 00:07:19,240 +Và cuối cùng, chúng tôi muốn hai đoạn văn ở cuối này được tách ra. + +92 +00:07:19,240 --> 00:07:22,750 +Vì vậy, tôi sẽ tiếp tục và chỉ cần làm điều đó. + +93 +00:07:22,870 --> 00:07:26,890 +Và bây giờ chúng tôi có khá nhiều vàng. + +94 +00:07:28,840 --> 00:07:31,960 +Chúng tôi đã đạt được đầu ra mục tiêu của chúng tôi. + +95 +00:07:31,990 --> 00:07:38,380 +Chúng tôi đã có H1, địa chỉ của chúng tôi được tách biệt và điều duy nhất chúng tôi cần làm + +96 +00:07:38,380 --> 00:07:42,340 +là thêm quy tắc ngang đó giữa địa chỉ và hai đoạn văn. + +97 +00:07:42,370 --> 00:07:46,690 +Hãy tiếp tục và thêm phần tử void khác mà chúng ta đã học. + +98 +00:07:46,690 --> 00:07:52,960 +Và bây giờ chúng ta đã hoàn thành thử thách và bạn có thể tự kiểm tra lại giải pháp để đảm + +99 +00:07:52,960 --> 00:07:56,530 +bảo rằng mọi thứ bạn đã làm đều giống hệt nhau. + +100 +00:07:56,680 --> 00:08:03,940 +Bây giờ, một mẹo hay mà tôi muốn sử dụng là chỉ cần sao chép giải pháp và chuyển đến trình kiểm tra khác biệt. com dán vào mã giải + +101 +00:08:03,940 --> 00:08:05,470 +pháp. + +102 +00:08:06,620 --> 00:08:12,710 +Và sau đó dán mã của bạn rồi tiếp tục và nhấp vào tìm sự khác biệt. + +103 +00:08:12,770 --> 00:08:18,320 +Và nó sẽ làm nổi bật tất cả những chỗ khác nhau trong trường hợp bạn viết sai chính tả hoặc bạn đã làm + +104 +00:08:18,320 --> 00:08:19,370 +sai điều gì đó. + +105 +00:08:19,370 --> 00:08:26,360 +Vì vậy, ví dụ, trong trường hợp này, trong phiên bản của chúng tôi, có một khoảng trắng sau từ Blake và thẻ + +106 +00:08:26,390 --> 00:08:30,830 +đóng, điều này về mặt HTML sẽ không tạo ra bất kỳ sự khác biệt nào. + +107 +00:08:30,980 --> 00:08:41,030 +Nhưng thay vào đó, tôi có thể đã viết H1 không chính xác và tôi đã không viết H cho thẻ đóng, thì bạn có thể thấy đầu ra của chúng tôi trông + +108 +00:08:41,030 --> 00:08:45,560 +hoàn toàn khác và chúng tôi đang xem qua tất cả văn bản này. + +109 +00:08:45,560 --> 00:08:51,590 +Chúng tôi không biết tại sao nó lại xảy ra, vì vậy chúng tôi tiếp tục và sao chép nó rồi phân biệt nó với giải pháp. + +110 +00:08:51,590 --> 00:09:00,770 +Và nó sẽ làm nổi bật thực tế rằng điều đó là không chính xác và bây giờ chúng ta sẽ được cảnh báo để kiểm tra sự khác biệt. + +111 +00:09:01,070 --> 00:09:04,490 +Đó là một mẹo mà tôi có cho bạn ngày hôm nay. + +112 +00:09:04,940 --> 00:09:13,800 +Và hãy để tôi quay lại chỉ mục của chúng tôi. html sửa lỗi này và bây giờ chúng ta đã sẵn sàng để bắt đầu. + +113 +00:09:14,690 --> 00:09:22,340 +Bây giờ, về những điều nên làm và không nên làm với phần tử void, đôi khi bạn thấy mọi người làm là + +114 +00:09:22,370 --> 00:09:28,010 +họ thêm thẻ ngắt để thêm dòng mới thay vì tạo phần tử đoạn riêng biệt. + +115 +00:09:28,040 --> 00:09:34,040 +Bây giờ, đây không phải là điều bạn muốn làm vì điều này không tốt cho khả năng truy cập, điều đó có nghĩa + +116 +00:09:34,040 --> 00:09:40,630 +là nó sẽ khiến người dùng khiếm thị có trình đọc màn hình khó hiểu nội dung trên trang web của bạn hơn. + +117 +00:09:40,640 --> 00:09:47,570 +Vì vậy, tôi khuyên bạn luôn tạo các phần tử đoạn văn mới khi bạn có các đoạn văn mới và chỉ + +118 +00:09:47,570 --> 00:09:54,110 +sử dụng phần tử ngắt khi có một số lý do khiến bạn muốn tách các dòng khác nhau trong + +119 +00:09:54,110 --> 00:09:55,220 +một đoạn văn. + +120 +00:09:55,220 --> 00:10:01,580 +Nhưng nó vẫn là một đoạn văn đơn lẻ, chẳng hạn như trong trường hợp của một bài thơ hoặc trong trường hợp của một địa chỉ mà chúng + +121 +00:10:01,610 --> 00:10:03,140 +ta đã đề cập trong bài học này. + +122 +00:10:03,830 --> 00:10:11,120 +Bây giờ, điều cuối cùng cần đề cập là đôi khi bạn nhìn vào phần tử quy tắc ngang hoặc phần tử ngắt, + +123 +00:10:11,120 --> 00:10:14,340 +bạn có thể thấy nó được biểu diễn. + +124 +00:10:14,340 --> 00:10:21,240 +Nếu không có thẻ đóng cuối cùng này, bạn có thể thấy mọi người chỉ cần viết cái này và đây là HTML hoàn toàn + +125 +00:10:21,450 --> 00:10:21,950 +hợp lệ. + +126 +00:10:21,960 --> 00:10:26,940 +Vì vậy, trên thực tế, bạn có thể có một quy tắc nằm ngang giống như thế này. + +127 +00:10:26,970 --> 00:10:34,620 +Bạn có thể có một phần tử ngắt trông như thế này thay vì phần tử có dấu gạch chéo về phía trước ở + +128 +00:10:34,620 --> 00:10:35,190 +cuối. + +129 +00:10:35,190 --> 00:10:38,370 +Và đây là cả hai lựa chọn hợp lệ. + +130 +00:10:38,370 --> 00:10:44,670 +Bạn có thể thực hiện điều này hoặc bạn có thể thực hiện điều này kể từ HTML5, phiên bản HTML mới nhất. + +131 +00:10:44,700 --> 00:10:50,490 +Những gì nó đang bắt đầu làm là nó bắt đầu bỏ qua dấu gạch chéo về phía trước này ở cuối để nó thậm chí không nhìn + +132 +00:10:50,490 --> 00:10:51,120 +vào nó. + +133 +00:10:51,120 --> 00:10:57,330 +Nó nhìn thấy phần đầu tiên và đã biết rằng dấu ngắt là phần tử void và quy tắc ngang là phần tử + +134 +00:10:57,330 --> 00:10:57,900 +void. + +135 +00:10:57,900 --> 00:11:00,300 +Vì vậy, nó không thực sự cần phải tiếp tục đọc. + +136 +00:11:00,420 --> 00:11:06,150 +Nhưng tôi khuyên bạn nên viết mã của mình với dấu gạch chéo cuối này. + +137 +00:11:06,150 --> 00:11:11,820 +Và lý do là vì khi bạn đọc mã của mình, bạn với tư cách là con người, bạn sẽ + +138 +00:11:11,820 --> 00:11:19,590 +dễ dàng nhận ra đây là phần tử void và nó không cần thẻ đóng để bạn không bị nhầm lẫn và bạn có thể xác + +139 +00:11:19,590 --> 00:11:26,370 +định các phần tử void và các phần tử không void một cách dễ dàng và phân biệt chúng với + +140 +00:11:26,370 --> 00:11:27,240 +nhau. + +141 +00:11:27,240 --> 00:11:34,260 +Vì vậy, đó chỉ là một mẹo nhanh và một cái gì đó để cảnh báo bạn khi bạn nhìn thấy nó được viết như thế này trên internet. + +142 +00:11:34,260 --> 00:11:35,850 +Cả hai phiên bản đều hợp lệ. + +143 +00:11:35,850 --> 00:11:39,720 +Bạn có thể chọn và chọn, nhưng tôi khuyên bạn nên sử dụng phiên bản này. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 2.4-Movie-Ranking-Project.zip b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 2.4-Movie-Ranking-Project.zip new file mode 100644 index 0000000000000000000000000000000000000000..7462281c88c099c9574e9d459ce18942777513b0 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 2.4-Movie-Ranking-Project.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfa7078fd1adf863d25eff02f314452b70e25449ec07bb559a522667fa7944bc +size 398123 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 Day 41 Project - Movie Ranking.mp4 b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 Day 41 Project - Movie Ranking.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d9ef0ee3c2a9d5c62020ac0ff10df6c2fe166792 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 Day 41 Project - Movie Ranking.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b52d863fd9fb4155669050c567e249e90d39d4f777cae9c00ed08e30a53d30d5 +size 44128009 diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 Day 41 Project - Movie Ranking_vi.srt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 Day 41 Project - Movie Ranking_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5063501bf454c2d2f44982ffc0151cb32df6aea5 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/008 Day 41 Project - Movie Ranking_vi.srt @@ -0,0 +1,264 @@ +1 +00:00:00,200 --> 00:00:07,310 +Vì vậy, bây giờ chúng ta đã có phần giới thiệu về HTML, tôi muốn bạn kết hợp mọi thứ bạn + +2 +00:00:07,310 --> 00:00:10,630 +đã học lại với nhau để tạo một dự án mới. + +3 +00:00:10,640 --> 00:00:15,530 +Vì vậy, dự án mà chúng ta sẽ xây dựng ngày hôm nay có tên là Dự án phim yêu thích. + +4 +00:00:15,530 --> 00:00:22,910 +Nó sẽ là một trang web để theo dõi tất cả các bộ phim yêu thích của bạn mà bạn đã xem + +5 +00:00:22,910 --> 00:00:28,580 +Khi bạn đến với Roger Ebert. com, ông là một trong những nhà phê bình phim vĩ đại nhất mọi thời đại. + +6 +00:00:28,580 --> 00:00:34,460 +Trên thực tế, giờ anh ấy đã qua đời, nhưng anh ấy có các bài đánh giá và xếp hạng phim cho tất cả các bộ phim mà anh + +7 +00:00:34,460 --> 00:00:35,120 +ấy đã xem. + +8 +00:00:35,120 --> 00:00:37,850 +Và bạn có thể thấy điều đó khi vào trang web của anh ấy. + +9 +00:00:38,150 --> 00:00:41,960 +Tôi nghĩ rằng đây là một cách thực sự tuyệt vời để theo dõi những gì bạn đã xem. + +10 +00:00:41,960 --> 00:00:47,450 +Bởi vì khi bạn bè hỏi tôi về các đề xuất, tôi không bao giờ có thể nhớ những gì tôi đã xem trong + +11 +00:00:47,450 --> 00:00:50,970 +năm nay mà tôi thực sự thích và những gì nên giới thiệu. + +12 +00:00:50,990 --> 00:00:54,890 +Vì vậy, những gì chúng ta sẽ xây dựng ngày hôm nay là một trang web rất đơn giản. + +13 +00:00:54,890 --> 00:01:02,580 +Nó sẽ là một trang web theo dõi những bộ phim yêu thích của bạn có thể là mọi thời đại, có thể là của năm ngoái, bất cứ thứ + +14 +00:01:02,580 --> 00:01:03,810 +gì bạn muốn làm. + +15 +00:01:03,810 --> 00:01:08,940 +Và yêu cầu là bạn phải có ít nhất ba bộ phim mà bạn đưa vào đây. + +16 +00:01:09,150 --> 00:01:17,640 +Vì vậy, những gì bạn cần là tạo H1 làm tiêu đề của trang web, sau đó bạn sẽ + +17 +00:01:17,640 --> 00:01:27,530 +có H2 làm phụ đề, sau đó bạn sẽ có một quy tắc ngang làm thành phần void trong ở đó. + +18 +00:01:27,540 --> 00:01:33,360 +Và sau đó, bạn sẽ có ba bộ phim mà bạn sắp liệt kê và tất cả chúng + +19 +00:01:33,360 --> 00:01:36,240 +sẽ được tạo bằng phần tử H3. + +20 +00:01:36,240 --> 00:01:44,010 +Và cuối cùng, bạn nên có một phần sẽ là yếu tố đoạn văn sẽ mô tả lý do tại sao + +21 +00:01:44,010 --> 00:01:47,190 +bạn thích những bộ phim đó. + +22 +00:01:47,190 --> 00:01:51,690 +Và về cơ bản đây là một định dạng rất đơn giản cho trang web này. + +23 +00:01:51,720 --> 00:01:58,710 +Bây giờ, hãy thoải mái khi bạn đã hoàn thành tất cả những điều này để tiếp tục sửa đổi trang web này, thay đổi nó, thêm các thứ, + +24 +00:01:58,710 --> 00:02:01,620 +thêm các yếu tố phá vỡ, bất cứ điều gì bạn muốn làm. + +25 +00:02:01,620 --> 00:02:06,930 +Nhưng ở mức tối thiểu, tôi muốn thấy tất cả những yếu tố này được thể hiện trên một trang. + +26 +00:02:06,930 --> 00:02:10,350 +Và tất nhiên, hãy thoải mái thêm phim của riêng bạn. + +27 +00:02:10,350 --> 00:02:17,070 +Và tôi rất muốn xem trong phần Hỏi và Đáp một hình ảnh về trang web của bạn để xem những bộ phim hàng đầu của bạn + +28 +00:02:17,070 --> 00:02:17,640 +là gì. + +29 +00:02:17,640 --> 00:02:19,440 +Và có lẽ tôi sẽ có được chút cảm hứng. + +30 +00:02:19,440 --> 00:02:23,010 +Vì vậy, lần tới khi tôi có buổi tối xem phim và tôi không thể biết nên xem gì. + +31 +00:02:23,160 --> 00:02:26,550 +Vì vậy, tôi cũng tò mò muốn xem các đề xuất của bạn. + +32 +00:02:26,730 --> 00:02:34,950 +Vì vậy, hãy tiếp tục và tải xuống tệp ZIP của dự án xếp hạng phim từ tài nguyên khóa học của bài học này. + +33 +00:02:34,950 --> 00:02:40,170 +Nếu bạn không biết cách thực hiện lại, hãy quay lại một trong những video đầu tiên của khóa + +34 +00:02:40,170 --> 00:02:46,170 +học ở phần đầu của Phần một, nơi tôi đã chỉ cho bạn trong một video cách tải xuống tài nguyên khóa học. + +35 +00:02:46,290 --> 00:02:53,490 +Và một khi bạn đã giải nén và trích xuất nó, hãy mở nó lên bằng mã và tiếp tục viết mã theo nội dung trái + +36 +00:02:53,490 --> 00:02:56,040 +tim của bạn bằng mọi thứ bạn đã học. + +37 +00:02:56,220 --> 00:02:58,680 +Tạm dừng video ngay bây giờ và tiếp tục. + +38 +00:03:02,510 --> 00:03:05,270 +Bây giờ chúng ta hãy đi qua các giải pháp. + +39 +00:03:05,270 --> 00:03:10,040 +Trong trường hợp của tôi, tôi sẽ có chữ H ở trên cùng, đây sẽ là tiêu đề. + +40 +00:03:10,040 --> 00:03:18,440 +Vì vậy, ừm, những bộ phim hay nhất mọi thời đại, theo Angela. + +41 +00:03:19,190 --> 00:03:28,580 +Và sau đó, tôi sẽ tạo một phụ đề mà tôi sẽ viết ba bộ phim hay nhất của mình. + +42 +00:03:29,870 --> 00:03:36,110 +Và sau đó, chúng tôi sẽ thêm một quy tắc ngang để tách phần này khỏi nội dung thực tế của trang web + +43 +00:03:36,110 --> 00:03:37,220 +của chúng tôi. + +44 +00:03:37,220 --> 00:03:42,530 +Và tôi sẽ tạo H ba để đại diện cho từng bộ phim mà tôi sẽ giới thiệu. + +45 +00:03:42,530 --> 00:03:49,430 +Vì vậy, tôi sẽ giới thiệu A Spirited Away, một trong những anime yêu thích của tôi. + +46 +00:03:50,390 --> 00:03:55,790 +Và tôi sẽ sử dụng thẻ đoạn văn để mô tả một chút về lý do tại sao tôi thích nó. + +47 +00:03:55,790 --> 00:03:58,370 +Vì vậy, tôi sẽ chỉ gọi nó là anime yêu thích. + +48 +00:03:59,360 --> 00:04:05,520 +Và sau đó bộ phim tiếp theo chúng ta sẽ là Ex Machina. + +49 +00:04:06,600 --> 00:04:11,940 +Và tôi thực sự thích nó vì đây là một bộ phim khoa học viễn tưởng thực sự hay. + +50 +00:04:13,120 --> 00:04:24,520 +Và cuối cùng, bộ phim thứ ba sẽ là bộ phim Drive với Ryan Gosling vì nó được quay + +51 +00:04:24,520 --> 00:04:26,080 +rất đẹp. + +52 +00:04:29,150 --> 00:04:29,910 +Mát mẻ. + +53 +00:04:29,930 --> 00:04:37,520 +Đây là những điều cơ bản về những gì bạn cần phải làm cho dự án này. + +54 +00:04:37,520 --> 00:04:45,890 +Nó có tất cả các thành phần được yêu cầu và bạn có thể thấy trong PNG mục tiêu rằng nó có tất cả những thứ mà chúng tôi đã + +55 +00:04:45,890 --> 00:04:49,160 +mô tả, ngay cả khi văn bản hơi khác một chút. + +56 +00:04:49,190 --> 00:04:53,510 +Tất nhiên sẽ không, theo Angela cho bạn, nó sẽ theo tên của bạn. + +57 +00:04:53,510 --> 00:04:59,600 +Và bây giờ bạn đã hoàn thành việc đó, hãy thoải mái thêm những thứ khác vào đây nếu bạn muốn. + +58 +00:04:59,630 --> 00:05:07,640 +Có thể thêm một chút nữa vào các thẻ đoạn văn, có thể thêm một bài thơ về bộ phim yêu thích của bạn, phát điên + +59 +00:05:07,670 --> 00:05:14,300 +lên, thử mọi thứ và chia sẻ trong phần Hỏi & Đáp dự án của bạn dưới dạng ảnh chụp màn hình. + +60 +00:05:14,660 --> 00:05:19,070 +Nếu bạn không biết cách chụp ảnh màn hình, hãy nhớ gõ nó vào Google. + +61 +00:05:19,070 --> 00:05:20,660 +Làm cách nào để tạo ảnh chụp màn hình? + +62 +00:05:20,660 --> 00:05:27,110 +Và sau đó bạn có thể thêm nó vào phần Hỏi & Đáp và tất cả chúng ta có thể xem những bộ phim yêu thích của bạn và được truyền cảm hứng. + +63 +00:05:27,110 --> 00:05:30,930 +Vì vậy, tôi hy vọng bạn thích xây dựng dự án với nhau. + +64 +00:05:30,930 --> 00:05:39,060 +Và trong phần tiếp theo, chúng ta sẽ tìm hiểu sâu hơn một chút về một số khía cạnh trung gian + +65 +00:05:39,060 --> 00:05:40,320 +hơn của HTML. + +66 +00:05:40,320 --> 00:05:43,350 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/41 - Day 41 - Web Foundation - Introduction to HTML/external-links.txt b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..228d5c6a495c4cbc593438b5d3fe5167cde2b240 --- /dev/null +++ b/part3/41 - Day 41 - Web Foundation - Introduction to HTML/external-links.txt @@ -0,0 +1,15 @@ + +001 Submarine-Cable-Map +https://www.submarinecablemap.com/ + +005 MDN-Docs-Headings +https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements + +005 Unzip-in-Windows +https://pureinfotech.com/extract-zip-file-windows-11-10/ + +005 Unzip-on-Mac +https://support.apple.com/en-gb/guide/mac-help/mchlp2528/mac + +007 Diff-Checker +https://www.diffchecker.com/ diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/001 HTML Boilerplate.mp4 b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/001 HTML Boilerplate.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..63353709bc33f6a6aba8627ca1bcefc05a3e2725 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/001 HTML Boilerplate.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4351fe3468a2c0d34a85dca3fd9e817ad59efbc3c3d9f25b28814b031ee52241 +size 91261457 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/001 HTML Boilerplate_vi.srt b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/001 HTML Boilerplate_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ae174803c43909d5c76d36396fd234bd1a5e8d91 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/001 HTML Boilerplate_vi.srt @@ -0,0 +1,608 @@ +1 +00:00:00,290 --> 00:00:07,370 +Bây giờ chúng ta đã thấy các phần tử và thẻ HTML hoạt động như thế nào, đã đến lúc khám phá bức tranh toàn cảnh hơn, + +2 +00:00:07,370 --> 00:00:09,430 +cái được gọi là bản tóm tắt HTML. + +3 +00:00:09,440 --> 00:00:16,880 +Và điều này sẽ cho phép chúng tôi hiểu cấu trúc của các tệp HTML của chúng tôi, giống như cách có cấu trúc + +4 +00:00:16,880 --> 00:00:19,380 +cho các chữ cái mà bạn sẽ viết. + +5 +00:00:19,400 --> 00:00:26,030 +Ví dụ: có phần bạn có địa chỉ của mình và sau đó bạn có thể sẽ bao gồm thân mến, v.v., + +6 +00:00:26,060 --> 00:00:32,810 +sau đó bạn có phần thân của bức thư và cuối cùng bạn sẽ viết một cái gì đó như chân + +7 +00:00:32,840 --> 00:00:36,660 +thành và sau đó là tên và chữ ký của bạn. + +8 +00:00:36,680 --> 00:00:43,760 +Tương tự, có một cấu trúc cho các tệp HTML của chúng tôi và nó trông giống như thế này. + +9 +00:00:43,760 --> 00:00:45,500 +Và đây được gọi là bản soạn sẵn. + +10 +00:00:45,530 --> 00:00:50,510 +Đó là những gì bạn thường bắt đầu khi tạo bất kỳ tệp HTML mới nào. + +11 +00:00:50,660 --> 00:00:54,050 +Và chúng ta sẽ đi qua nó từng dòng một để chúng ta hiểu nó. + +12 +00:00:54,080 --> 00:00:59,300 +Ở đầu mỗi tệp HTML, cần có một khai báo loại tài liệu. + +13 +00:00:59,300 --> 00:01:01,530 +Và đó là những gì thẻ này làm. + +14 +00:01:01,560 --> 00:01:06,610 +Nó cho trình duyệt biết phiên bản nào của tệp được viết. + +15 +00:01:06,630 --> 00:01:15,570 +Giờ đây, phiên bản mới nhất của HTML là HTML5 và phần khai báo Doctype trông như thế này với dấu ngoặc nhọn, dấu + +16 +00:01:15,570 --> 00:01:20,310 +chấm than, doctype viết hoa toàn bộ và sau đó là HTML. + +17 +00:01:20,310 --> 00:01:26,850 +Và dòng này cho bất kỳ trình duyệt nào đang đọc tệp HTML của chúng tôi biết rằng chúng tôi đã viết mã của mình trong phiên bản + +18 +00:01:26,850 --> 00:01:27,480 +HTML năm. + +19 +00:01:27,510 --> 00:01:31,120 +Phần tiếp theo mà chúng ta có là HTML thực tế. + +20 +00:01:31,140 --> 00:01:34,440 +Bây giờ, đây sẽ là thư mục gốc của tài liệu. + +21 +00:01:34,470 --> 00:01:41,310 +Nó có nghĩa là mọi thứ khác, mọi thành phần khác, bất kể đó là H1 hay hình + +22 +00:01:41,310 --> 00:01:52,440 +ảnh hay liên kết, tất cả sẽ đi vào bên trong thẻ mở và thẻ đóng của thành phần HTML và thuộc tính này có ghi Lang + +23 +00:01:52,440 --> 00:01:58,380 +Đây là ngôn ngữ của nội dung văn bản trong phần tử đó. + +24 +00:01:58,380 --> 00:02:05,160 +Vì vậy, ví dụ: nếu bạn đang viết một trang web nhắm mục tiêu đến những người nói tiếng Anh, thì bạn sẽ + +25 +00:02:05,160 --> 00:02:07,920 +đặt ngôn ngữ của mình thành tiếng Anh. + +26 +00:02:07,950 --> 00:02:08,550 +N. + +27 +00:02:08,580 --> 00:02:13,380 +Bây giờ điều này không quan trọng lắm đối với những người dùng có thể xem trang web của bạn. + +28 +00:02:13,410 --> 00:02:20,370 +Điều quan trọng hơn đối với những người dùng không thể vì có nhiều trình đọc màn hình và công nghệ hỗ + +29 +00:02:20,370 --> 00:02:25,770 +trợ sẽ xem xét thuộc tính ngôn ngữ này để khi họ đọc trang web, họ có thể phát âm + +30 +00:02:25,770 --> 00:02:27,000 +chính xác các từ. + +31 +00:02:27,150 --> 00:02:30,220 +Mở ảnh hồ sơ theo dõi bạn. + +32 +00:02:30,270 --> 00:02:31,590 +Nút Angela. + +33 +00:02:31,920 --> 00:02:36,870 +Bây giờ, với phần tử HTML, chúng ta bắt đầu thấy sự khởi đầu của một chiếc bánh hamburger. + +34 +00:02:36,900 --> 00:02:39,810 +Có một búi ở trên và có một búi ở dưới. + +35 +00:02:39,870 --> 00:02:45,180 +Đối với những bạn đã là bạn lâu năm của tôi, bạn biết tôi thích những phép loại suy về + +36 +00:02:45,180 --> 00:02:51,570 +thức ăn đến mức nào, nhưng đây là một điều tuyệt vời vì khi chúng ta có một phần tử HTML, thường sẽ có phần + +37 +00:02:51,570 --> 00:02:55,920 +mở đầu và phần kết thúc và mọi thứ thuộc về nó được kẹp bên trong. + +38 +00:02:55,950 --> 00:03:00,600 +Bây giờ, phần tiếp theo của bản tóm tắt HTML là phần tử đầu. + +39 +00:03:00,600 --> 00:03:07,590 +Và đây là khu vực đặt thông tin quan trọng về trang web của chúng tôi sẽ không được hiển + +40 +00:03:07,590 --> 00:03:09,450 +thị cho người dùng. + +41 +00:03:09,480 --> 00:03:15,450 +Nó bao gồm những thứ sẽ giúp trang web hiển thị chính xác trong trình duyệt, nhưng nó không bao gồm bất kỳ loại + +42 +00:03:15,450 --> 00:03:19,940 +nội dung nào như văn bản hoặc hình ảnh hoặc bất kỳ thứ gì mà người dùng sẽ thấy. + +43 +00:03:19,950 --> 00:03:27,180 +Vì vậy, một trong những thứ mà bạn phải luôn có trong phần đầu là thẻ meta để mã hóa bộ ký tự + +44 +00:03:27,180 --> 00:03:32,280 +của trang web và trong trường hợp này, nó được đặt là UTF tám. + +45 +00:03:32,310 --> 00:03:40,110 +Điều này đảm bảo rằng các ký tự bạn đang sử dụng trên trang web của mình được hiển thị chính xác. + +46 +00:03:40,110 --> 00:03:46,410 +Vì vậy, ví dụ: trong một số bộ ký tự nhất định, nó sẽ không cho phép biểu tượng cảm xúc hiển thị trong các bộ ký tự khác. + +47 +00:03:46,410 --> 00:03:50,580 +Chúng sẽ không có các ký hiệu nhất định như ký hiệu nhân và chia. + +48 +00:03:50,580 --> 00:03:54,210 +Và đó là điều mà thẻ meta này đảm nhận. + +49 +00:03:54,240 --> 00:04:01,740 +Thông thường, theo quy ước trong bản soạn sẵn HTML của chúng tôi, chúng tôi sẽ chỉ bao gồm thẻ này như đang sử dụng bộ tám + +50 +00:04:01,770 --> 00:04:05,310 +ký tự UTF, đây là một trong những bộ ký tự phổ biến nhất. + +51 +00:04:05,310 --> 00:04:07,260 +Vì vậy, bạn thậm chí không cần phải suy nghĩ về nó. + +52 +00:04:07,290 --> 00:04:14,340 +Bây giờ, một thứ khác mà bạn nên có trong phần đầu của mình là tiêu đề trang web của bạn + +53 +00:04:14,340 --> 00:04:20,519 +và tiêu đề đó thường là những gì được hiển thị ở đây trong Thanh tab. + +54 +00:04:20,519 --> 00:04:28,380 +Và trên thực tế, nếu bạn nhấp chuột phải vào bất kỳ trang web nào trong Chrome, bạn có thể nhấp để xem nguồn trang và bạn có thể thấy chúng + +55 +00:04:28,380 --> 00:04:36,120 +tôi có Loại tài liệu của mình, chúng tôi có phần tử HTML bên trong đó, chúng tôi có đầu của chúng tôi, của chúng tôi bộ ký tự. + +56 +00:04:36,120 --> 00:04:42,240 +Và sau đó nếu chúng ta cuộn thêm một chút nữa, bạn có thể thấy chúng ta có tiêu đề ở đây. + +57 +00:04:42,240 --> 00:04:48,840 +Và ở giữa thẻ mở và thẻ đóng của tiêu đề, nó cho bạn biết tiêu đề nào sẽ được hiển + +58 +00:04:48,840 --> 00:04:49,710 +thị ở đây. + +59 +00:04:50,070 --> 00:04:54,150 +Vì vậy, trong trường hợp của chúng tôi ở đây, tiêu đề chỉ đơn giản là trang web của tôi. + +60 +00:04:54,360 --> 00:04:59,880 +Bây giờ có nhiều thứ hơn có thể đi vào phần tử đầu, như bạn đã thấy khi chúng ta xem xét. + +61 +00:04:59,960 --> 00:05:01,520 +Trang chủ Google. + +62 +00:05:01,850 --> 00:05:09,050 +Nhưng hiện tại, đây là hai thứ quan trọng nhất sẽ luôn có trong tệp của bạn. + +63 +00:05:09,050 --> 00:05:10,700 +Và điều quan trọng là phải biết. + +64 +00:05:10,730 --> 00:05:13,490 +Chúng tôi sẽ bao gồm các thẻ khác khi chúng tôi bắt gặp chúng. + +65 +00:05:13,520 --> 00:05:19,520 +Bây giờ, món bánh mì tiếp theo bên trong bánh mì, nếu bạn muốn, là hai lát cà chua. + +66 +00:05:19,850 --> 00:05:20,990 +Không chỉ đùa thôi. + +67 +00:05:20,990 --> 00:05:23,000 +Nó thực sự là yếu tố cơ thể. + +68 +00:05:23,030 --> 00:05:24,140 +Cũng giống như một người. + +69 +00:05:24,140 --> 00:05:26,600 +Sau phần tử đầu là phần tử thân. + +70 +00:05:26,720 --> 00:05:33,920 +Bên trong phần tử body là nơi chúng ta sẽ dành phần lớn thời gian để tạo và viết trang web + +71 +00:05:33,920 --> 00:05:35,030 +của mình. + +72 +00:05:35,060 --> 00:05:38,530 +Đây là nơi mà tất cả các nội dung của trang web đi. + +73 +00:05:38,540 --> 00:05:45,090 +Vì vậy, văn bản, tiêu đề, hình ảnh, liên kết, mọi thứ bạn có thể làm với HTML. + +74 +00:05:45,110 --> 00:05:53,180 +Việc tạo nội dung và cấu trúc nằm giữa thẻ mở và thẻ đóng của phần tử nội dung. + +75 +00:05:53,180 --> 00:05:56,510 +Vì vậy, một nơi nào đó bên trong đây. + +76 +00:05:57,020 --> 00:05:58,580 +Bây giờ những gì có thể đi vào đây? + +77 +00:05:58,580 --> 00:06:06,660 +Chà, chúng ta đã thấy H1 hoạt động như thế nào để chúng ta có thể đặt tiêu đề, chúng ta có thể thêm hình ảnh, chúng ta có thể thêm nhiều + +78 +00:06:06,660 --> 00:06:07,380 +thứ. + +79 +00:06:07,380 --> 00:06:13,680 +Và đây thực chất là nơi phần cốt lõi của trang web của chúng tôi sẽ tồn tại. + +80 +00:06:14,280 --> 00:06:21,300 +Sau khi bánh mì kẹp thịt của chúng tôi sụp đổ, bạn có thể thấy rằng đây là thành phần mã HTML của một trang web điển + +81 +00:06:21,300 --> 00:06:21,990 +hình. + +82 +00:06:22,080 --> 00:06:26,490 +Vì vậy, bất kể bạn thêm gì vào cơ thể, bạn có thể thay đổi nó. + +83 +00:06:26,490 --> 00:06:32,430 +Nhưng theo mặc định, hầu hết các trang web sẽ bắt đầu với một bản mẫu giống như thế này. + +84 +00:06:32,610 --> 00:06:39,450 +Khi bạn mới bắt đầu, tôi thường khuyên sinh viên nên gõ phần này khi họ tạo trang web mới và trên + +85 +00:06:39,450 --> 00:06:47,640 +thực tế, bạn có thể bắt đầu thực hiện việc này ngay bây giờ bằng cách truy cập mã VS, nhập những phần tử này và tạo + +86 +00:06:47,640 --> 00:06:50,400 +trang web của bạn hoàn toàn từ đầu . + +87 +00:06:50,430 --> 00:06:57,900 +Bây giờ chúng ta bắt đầu thấy ý tưởng lồng nhau trong tài liệu HTML này và đây sẽ là một khái niệm sẽ trở + +88 +00:06:57,900 --> 00:07:02,970 +nên cực kỳ quan trọng khi chúng ta học lập trình ngày càng nhiều. + +89 +00:07:02,970 --> 00:07:08,850 +Nhưng thật đơn giản để hiểu nếu chúng ta quay lại với sự tương tự của chiếc bánh hamburger. + +90 +00:07:09,000 --> 00:07:18,150 +Vì vậy, chúng tôi có phần tử HTML có thẻ mở và thẻ đóng ở đây và nó giống hệt như chiếc bánh hamburger của + +91 +00:07:18,150 --> 00:07:19,410 +chúng tôi. + +92 +00:07:19,410 --> 00:07:26,220 +Vì vậy, đây là búi tóc trên cùng của chúng tôi và đây là bánh mì và bánh mì dưới cùng của chúng tôi. + +93 +00:07:26,220 --> 00:07:30,510 +Ở giữa là mọi thứ bên trong phần tử HTML. + +94 +00:07:30,810 --> 00:07:38,040 +Bây giờ, nếu chúng ta xem xét phần tử body của mình, thì bạn có thể thấy ở đây chúng ta có thẻ + +95 +00:07:38,040 --> 00:07:43,500 +body mở, thẻ này sẽ biểu thị bằng một lát cà chua và thẻ body đóng. + +96 +00:07:43,500 --> 00:07:48,570 +Và ở giữa hai lát cà chua đó là nội dung cho trang web của chúng tôi. + +97 +00:07:48,600 --> 00:07:55,890 +Bây giờ, bạn sẽ nhận thấy rằng một số thẻ HTML, mặc dù chúng có thẻ mở và thẻ đóng, nhưng chúng không + +98 +00:07:55,890 --> 00:07:58,380 +nằm trên các dòng khác nhau. + +99 +00:07:58,380 --> 00:08:04,380 +Và đó là bởi vì nếu chúng ta có thể đặt nó trên một dòng và chúng ta có thể nhìn thấy phần đầu và phần cuối rất dễ dàng, + +100 +00:08:04,380 --> 00:08:07,230 +thì chúng ta thực sự không cần phải tạo nhiều dòng. + +101 +00:08:07,230 --> 00:08:11,040 +Nhưng dù sao, nó vẫn có bắt đầu và kết thúc. + +102 +00:08:11,070 --> 00:08:17,280 +Bây giờ, điều quan trọng đối với chúng tôi khi chúng tôi viết mã và chúng tôi có tất cả quá trình + +103 +00:08:17,280 --> 00:08:26,040 +kẹp này đang diễn ra là chúng tôi thụt lề mã của mình đúng cách để bạn có thể thấy rằng điều này rõ ràng phù hợp với thẻ mở ở đây. + +104 +00:08:26,040 --> 00:08:29,640 +Vì vậy, họ rõ ràng đang kẹp một cái gì đó ở giữa. + +105 +00:08:29,640 --> 00:08:34,650 +Và sau đó chúng ta có hai khoảng trắng và chúng ta có mức thụt đầu dòng tiếp theo ở đây. + +106 +00:08:34,650 --> 00:08:43,320 +Vì vậy, cái này thẳng hàng với thẻ đóng và thông qua loại thụt đầu dòng này, bạn + +107 +00:08:43,320 --> 00:08:52,610 +có thể dễ dàng hình dung rằng phần đầu này được nhúng rõ ràng bên trong phần HTML. + +108 +00:08:52,620 --> 00:09:00,840 +Vì vậy, giống như rau diếp của chúng ta ở bên trong chiếc bánh hamburger của chúng ta, bằng cách thụt lề mã đúng cách, chúng ta sẽ có thể + +109 +00:09:00,840 --> 00:09:07,180 +giữ cho mã của mình gọn gàng hơn và chúng ta sẽ có thể nhìn nhanh chính xác mã của mình trông như thế nào. + +110 +00:09:07,200 --> 00:09:12,510 +Bây giờ, cuối cùng, vì chúng ta đang sử dụng so với mã, tôi muốn nói với bạn về một phím tắt. + +111 +00:09:12,510 --> 00:09:16,580 +Điều đó có nghĩa là bạn không phải gõ bản soạn sẵn này mỗi lần. + +112 +00:09:16,620 --> 00:09:22,800 +Sau khi bạn đã nhập nó một hoặc hai lần và bạn biết chính xác bản soạn sẵn này trông như thế nào, bạn có thể tiết + +113 +00:09:22,800 --> 00:09:26,760 +kiệm rất nhiều thời gian bằng cách chỉ cần nhập dấu chấm than. + +114 +00:09:26,790 --> 00:09:33,810 +Nhấn Enter trên lựa chọn đầu tiên và sau đó nó sẽ tự động chèn tất cả mã đó cho bạn, giúp bạn tiết kiệm + +115 +00:09:33,840 --> 00:09:39,060 +rất nhiều thời gian, đặc biệt là khi bạn đang tạo nhiều tài liệu. + +116 +00:09:39,270 --> 00:09:47,580 +Tuy nhiên, điều quan trọng ở đây là điều này chỉ hoạt động nếu bạn đã tạo một trang web HTML chấm. + +117 +00:09:47,850 --> 00:09:55,880 +Nên các bạn chú ý khi tạo 1 file mới bên trong vs code, nếu các bạn đặt tên và lưu dưới dạng html gì đó + +118 +00:09:55,890 --> 00:09:59,460 +chấm html thì thủ thuật này sẽ có tác dụng. + +119 +00:09:59,550 --> 00:10:03,450 +Nếu lưu bằng đuôi khác thì k đc. + +120 +00:10:03,960 --> 00:10:07,050 +Có một vài điều ở đây mà chúng ta chưa từng thấy trước đây. + +121 +00:10:07,080 --> 00:10:11,040 +Ghép thêm nhiều thẻ meta và có rất nhiều thẻ meta khác. + +122 +00:10:11,040 --> 00:10:19,140 +Nhưng ở đây chúng tôi có một dòng ở đây cho biết nội dung tương thích tương đương HTTP, i. đ. bờ rìa. + +123 +00:10:19,170 --> 00:10:24,690 +Điều này về cơ bản chỉ giữ cho mã của chúng tôi tương thích với Internet Explorer. + +124 +00:10:24,690 --> 00:10:30,150 +Và trên thực tế, tôi thường không viết dòng này nữa vì Internet Explorer đã ngừng hoạt động + +125 +00:10:30,150 --> 00:10:32,270 +và không còn được sử dụng nữa. + +126 +00:10:32,280 --> 00:10:38,430 +Vì vậy, nếu bạn muốn giữ cho mã của mình sạch sẽ, bạn thực sự có thể xóa mã này khỏi mã của mình hoặc bản soạn + +127 +00:10:38,430 --> 00:10:39,210 +sẵn đã tạo. + +128 +00:10:39,780 --> 00:10:48,420 +Bây giờ, phần tiếp theo cho bạn biết chế độ xem và nó xác định cách trang web sẽ được hiển thị tương + +129 +00:10:48,450 --> 00:10:51,840 +ứng với màn hình hiển thị trang web. + +130 +00:10:51,930 --> 00:10:57,990 +Và dòng mã này chỉ cho trình duyệt biết cách hiển thị trang web của bạn khi nó mở lần đầu tiên. + +131 +00:10:58,260 --> 00:11:04,530 +Vì vậy, bây giờ chúng ta đã học tất cả về các bản soạn sẵn HTML, đã đến lúc xây dựng bản soạn sẵn của riêng bạn, hoặc trong trường hợp này, + +132 +00:11:04,530 --> 00:11:06,570 +hãy tạo một chiếc burger của riêng bạn. + +133 +00:11:07,080 --> 00:11:13,650 +Như bạn nhận thấy, có vô số phần tử HTML và chúng ta sẽ tạo các phần tử HTML của riêng + +134 +00:11:13,650 --> 00:11:14,400 +mình. + +135 +00:11:14,400 --> 00:11:22,050 +Nhưng điều quan trọng ở đây mà tôi muốn bạn hiểu là cách lồng nhau hoạt động trong HTML và cách bạn có thể giữ cho mã của mình + +136 +00:11:22,050 --> 00:11:27,510 +gọn gàng bằng cách sử dụng cách thụt đầu dòng tốt và duy trì các thông lệ lập trình tốt. + +137 +00:11:27,690 --> 00:11:33,450 +Nếu chúng ta đang tạo ra chiếc bánh mì kẹp thịt tưởng tượng của riêng mình, hãy tưởng tượng ra chiếc bánh mì kẹp thịt ngon nhất thế giới. + +138 +00:11:33,450 --> 00:11:38,820 +Bạn có thể ăn thuần chay, bạn có thể ăn chay, bạn có thể ăn thịt xông khói, bạn có + +139 +00:11:38,820 --> 00:11:43,950 +thể ăn bất cứ thứ gì trái tim bạn mong muốn, nhưng bạn phải viết nó bằng mã. + +140 +00:11:44,400 --> 00:11:47,160 +Hãy bắt đầu bằng cách tạo một búi tóc. + +141 +00:11:47,250 --> 00:11:56,010 +Vì vậy, tôi có một phần tử bun mà tôi đã tạo có thẻ mở và thẻ đóng, đồng thời tôi đã thêm một thuộc + +142 +00:11:56,010 --> 00:11:56,790 +tính. + +143 +00:11:56,790 --> 00:11:59,490 +Bạn có thể thêm bao nhiêu thuộc tính này tùy thích. + +144 +00:11:59,490 --> 00:12:06,780 +Và hãy nhớ rằng, chúng ta thêm các thuộc tính bằng cách đặt tên cho nó, rồi sau dấu bằng, chúng ta đặt cho nó một giá trị. + +145 +00:12:06,930 --> 00:12:10,260 +Bây giờ phần tiếp theo là dành cho bạn để phát minh. + +146 +00:12:10,260 --> 00:12:16,020 +Vì vậy, hãy chuyển sang mã VS và xây dựng chiếc burger của riêng bạn, thêm vào bất kỳ yếu tố nào bạn muốn. + +147 +00:12:16,050 --> 00:12:24,780 +Thêm cà chua, thêm giăm bông, nhưng hãy đảm bảo rằng bạn đang giữ đúng cách thụt đầu dòng và bạn + +148 +00:12:24,780 --> 00:12:29,220 +đang làm việc với ý tưởng mở và đóng thẻ này. + +149 +00:12:29,310 --> 00:12:36,660 +Tuy nhiên, bạn có thể sáng tạo tùy thích và nhớ chia sẻ mã cho bánh mì kẹp thịt của mình trong phần Hỏi & Đáp. + +150 +00:12:36,660 --> 00:12:38,700 +Và nếu bạn muốn một chút cảm hứng. + +151 +00:12:38,700 --> 00:12:47,130 +Đây là cái mà tôi đã làm trước đó, nhưng tôi muốn bạn thực hành tự làm và làm theo cách của bạn. + +152 +00:12:47,160 --> 00:12:51,960 +Hãy thử làm điều đó và sau khi bạn hoàn thành, hãy chuyển sang bài học tiếp theo. + diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 3.0-List-Elements.zip b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 3.0-List-Elements.zip new file mode 100644 index 0000000000000000000000000000000000000000..7a5f0bfd0658eefcb63d975a8e85d64cbe8bcbe8 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 3.0-List-Elements.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d62237c348c11772fd0a7acc307e8c2202553644d6ddcbbbb6dd712938918378 +size 235436 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 The List Element.mp4 b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 The List Element.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5b21a0e06bfdcee1487ea41c22a97302d83d5c79 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 The List Element.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7a46898f85194a5b71ddc37bcd6bb06cb17e58f927b04562c1914d3c66f3f2b +size 129518355 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 The List Element_vi.srt b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 The List Element_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c7591b140387a7760f2ac80814292ac106e5bace --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/002 The List Element_vi.srt @@ -0,0 +1,508 @@ +1 +00:00:00,320 --> 00:00:01,250 +Này các cậu. + +2 +00:00:01,250 --> 00:00:06,320 +Trong bài học trước, bạn đã học nhiều về các loại phần tử HTML khác nhau và bạn đã + +3 +00:00:06,320 --> 00:00:08,960 +bắt đầu sử dụng chúng để tạo trang web. + +4 +00:00:08,990 --> 00:00:13,670 +Bây giờ trong phần này, chúng ta sẽ đi xa hơn một chút và khám phá một số khái niệm trung + +5 +00:00:13,670 --> 00:00:15,770 +cấp và nâng cao hơn trong HTML. + +6 +00:00:15,890 --> 00:00:21,320 +Chúng ta sẽ bắt đầu bài học này bằng cách tìm hiểu về các thành phần của danh sách, danh sách có thứ tự và danh sách không + +7 +00:00:21,320 --> 00:00:22,070 +có thứ tự. + +8 +00:00:22,430 --> 00:00:27,170 +Bây giờ, nếu bạn đã dành thời gian trên Internet gần đây, bạn sẽ nhận thấy rằng nó hoàn toàn + +9 +00:00:27,170 --> 00:00:28,520 +chứa đầy các danh sách. + +10 +00:00:28,520 --> 00:00:36,020 +Nếu bạn tiếp tục với BuzzFeed hoặc bất kỳ bài báo nào thuộc loại clickbaity này, thông thường họ sẽ tạo một danh sách về những + +11 +00:00:36,020 --> 00:00:41,300 +thứ chẳng hạn như những món đồ tuyệt vời chắc chắn phải do các thiên tài phát minh ra. + +12 +00:00:41,300 --> 00:00:47,660 +Nhưng ngoài ra, nếu bạn nhìn vào một cái gì đó như Mười kẻ đào tẩu bị truy nã gắt gao nhất của FBI, thì điều này cũng được tạo ra trên trang + +13 +00:00:47,660 --> 00:00:49,700 +web này bằng cách sử dụng một danh sách. + +14 +00:00:49,700 --> 00:00:52,690 +Vậy làm thế nào để chúng ta tự tạo ra những danh sách này? + +15 +00:00:52,700 --> 00:00:57,080 +Chà, hãy bắt đầu với một trong những loại phổ biến nhất, danh sách không có thứ tự. + +16 +00:00:57,080 --> 00:01:04,260 +Và nó cực kỳ đơn giản để tạo một cách đơn giản, bạn có thẻ bắt đầu bằng UL và sau đó có thẻ đóng. + +17 +00:01:04,260 --> 00:01:11,880 +Bây giờ, thông thường chúng ta có các phần tử một dòng như thế này, nơi chúng ta có thể thêm một số nội dung vào giữa + +18 +00:01:11,880 --> 00:01:13,730 +các thẻ mở và thẻ đóng. + +19 +00:01:13,740 --> 00:01:16,920 +Tuy nhiên, trong trường hợp này, nó hơi khác một chút. + +20 +00:01:16,950 --> 00:01:23,940 +Trên thực tế, chúng nằm trên các dòng riêng biệt vì ở giữa hai thẻ mở và thẻ đóng này, chúng ta cần thêm một + +21 +00:01:23,940 --> 00:01:27,600 +loại thẻ để hoàn thành danh sách không có thứ tự này. + +22 +00:01:27,600 --> 00:01:30,570 +Và chúng được gọi là các mục danh sách. + +23 +00:01:30,570 --> 00:01:38,730 +Vì vậy, ở đây bạn có thể thấy chúng tôi có ba mục danh sách và mỗi mục chứa một số nội dung. + +24 +00:01:38,820 --> 00:01:44,270 +Nhưng cả ba mục đều nằm trong danh sách không có thứ tự này. + +25 +00:01:44,280 --> 00:01:50,850 +Vì vậy, để bất kỳ danh sách nào hoạt động và hiển thị nội dung, thì bạn sẽ phải thêm các mục danh sách vào đó. + +26 +00:01:51,000 --> 00:01:54,150 +Vì vậy, điều này trông như thế nào nếu chúng ta thực sự chạy mã? + +27 +00:01:54,150 --> 00:01:55,770 +Vâng, đây là những gì bạn sẽ thấy. + +28 +00:01:55,800 --> 00:02:03,420 +Về cơ bản, các mục trong danh sách không có thứ tự sẽ tạo ra các dấu đầu dòng này vì chẳng hạn như trong trường + +29 +00:02:03,420 --> 00:02:08,190 +hợp danh sách mua sắm ở đây, thứ tự của các mục không thành vấn đề. + +30 +00:02:08,190 --> 00:02:11,970 +Vì vậy, đó là lý do tại sao một danh sách không có thứ tự sẽ là lựa chọn hoàn hảo cho tình huống này. + +31 +00:02:12,390 --> 00:02:19,200 +Tuy nhiên, mặt khác, nếu bạn cần sắp xếp các mục trong danh sách của mình theo một thứ tự cụ thể, thì bạn sẽ + +32 +00:02:19,200 --> 00:02:21,060 +tạo một danh sách có thứ tự. + +33 +00:02:21,210 --> 00:02:27,570 +Và một khi bạn đã thêm các mục danh sách bên trong đó, điều này sẽ làm là nó sẽ cung cấp cho bạn các con số. + +34 +00:02:27,570 --> 00:02:35,700 +Vì vậy, nó sẽ bắt đầu từ một và số bên cạnh mỗi mục danh sách sẽ phụ thuộc vào thứ tự mà bạn đặt vào + +35 +00:02:35,700 --> 00:02:39,420 +thành phần danh sách được sắp xếp này. + +36 +00:02:39,420 --> 00:02:44,960 +Nếu sữa này ở dưới đây, thì nó sẽ lấy số ba, vân vân và vân vân. + +37 +00:02:44,970 --> 00:02:46,530 +Đó là tất cả khá đơn giản. + +38 +00:02:46,530 --> 00:02:54,990 +Vì vậy, nếu chúng ta so sánh danh sách có thứ tự, phần tử ol cung cấp cho chúng ta các số và so với UL, mục danh sách không có thứ tự, chỉ + +39 +00:02:54,990 --> 00:02:58,830 +cung cấp cho chúng ta các dấu đầu dòng, đơn giản như vậy. + +40 +00:02:58,830 --> 00:03:05,310 +Và quay trở lại trang web Mười kẻ chạy trốn bị truy nã gắt gao nhất của FBI, bạn có thể thấy họ thực sự đã tạo trang web + +41 +00:03:05,310 --> 00:03:07,230 +này bằng cách sử dụng danh sách. + +42 +00:03:07,230 --> 00:03:14,160 +Vì vậy, khi bạn nhấp chuột phải vào bất kỳ hình ảnh nào trong số này và chọn kiểm tra, bạn có thể thấy rằng mỗi bức + +43 +00:03:14,160 --> 00:03:19,170 +ảnh này thực sự là một mục danh sách được đặt bên trong danh sách không có thứ tự. + +44 +00:03:19,200 --> 00:03:23,910 +Bây giờ có rất nhiều trang web này mà chúng ta sẽ học trong các bài học sau. + +45 +00:03:23,910 --> 00:03:30,060 +Nhưng điều thực sự quan trọng là bạn phải thấy rằng đây là một phần thực sự quan trọng mà bạn thấy trong + +46 +00:03:30,060 --> 00:03:32,100 +các trang web trên Internet. + +47 +00:03:32,100 --> 00:03:35,280 +Vì vậy, điều thực sự quan trọng là chúng ta hiểu cách sử dụng chúng. + +48 +00:03:35,520 --> 00:03:41,490 +Vì vậy, bây giờ chúng ta đã học được một chút về danh sách có thứ tự và không có thứ tự, hãy thử làm một bài tập + +49 +00:03:41,490 --> 00:03:43,680 +để đảm bảo rằng bạn đã hiểu mọi thứ. + +50 +00:03:43,800 --> 00:03:50,400 +Hãy tiếp tục và tải xuống tệp zip phần tử danh sách từ bài học hiện tại này. + +51 +00:03:50,400 --> 00:03:57,000 +Và như thường lệ, nếu bạn quên cách thực hiện hoặc nếu bạn mới bắt đầu học bài này, thì tôi khuyên bạn nên chuyển sang một + +52 +00:03:57,000 --> 00:04:01,860 +trong những bài học trước, nơi tôi chỉ cho bạn cách tải xuống tài nguyên khóa học. + +53 +00:04:01,860 --> 00:04:10,830 +Bây giờ, khi bạn đã tải xuống và giải nén thư mục 3. 0 và kéo nó vào mã VS hoặc thư mục dự án phát triển + +54 +00:04:10,830 --> 00:04:16,860 +web của bạn, thì bạn sẽ có thể thấy nó ở đây trên tệp Explorer ở bên + +55 +00:04:16,860 --> 00:04:17,790 +trái. + +56 +00:04:17,820 --> 00:04:24,420 +Nếu chúng tôi khám phá một số tệp cho bài tập mã hóa hiện tại này, bạn có thể thấy chúng tôi có tệp index. html có chứa một số văn bản thuần + +57 +00:04:24,450 --> 00:04:29,280 +túy mà bạn sẽ định dạng thành danh sách. + +58 +00:04:29,280 --> 00:04:36,330 +Và nếu chúng ta xem xét mục tiêu, vui lòng chọn bất kỳ kích thước tiêu đề nào bạn muốn. + +59 +00:04:36,330 --> 00:04:43,830 +Nhưng đối với tôi, tôi nghĩ điều hợp lý nhất là có một H1, sau đó là các thành phần và hướng + +60 +00:04:43,830 --> 00:04:50,850 +dẫn là h2, sau đó là bất kỳ tiêu đề nào khác như phần này và phần này là h3. + +61 +00:04:50,850 --> 00:04:56,730 +Nhưng điều quan trọng nhất mà tôi quan tâm trong bài tập này là bạn quản lý để tạo các danh sách này. + +62 +00:04:56,730 --> 00:04:59,690 +Vì vậy, chúng tôi đã có một danh sách không có thứ tự cho. + +63 +00:05:00,110 --> 00:05:03,110 +Phần một của các thành phần để tạo ra bột. + +64 +00:05:03,110 --> 00:05:07,460 +Và sau đó chúng ta có một danh sách không có thứ tự khác cho các nguyên liệu làm nhân. + +65 +00:05:07,460 --> 00:05:13,550 +Và cuối cùng, chúng ta có tất cả các hướng dẫn còn lại dưới dạng danh sách có thứ tự. + +66 +00:05:13,580 --> 00:05:18,710 +Hãy suy nghĩ về cách bạn sẽ tạo cái này và đừng lo lắng về việc gõ tất cả văn bản vì nếu + +67 +00:05:18,710 --> 00:05:23,510 +bạn nhìn vào bên trong tệp index. html, bạn sẽ thấy tất cả văn bản được nhập sẵn cho bạn. + +68 +00:05:23,510 --> 00:05:30,830 +Tất cả những gì bạn cần làm là thêm các thẻ HTML và định dạng tài liệu thành một trang web HTML. + +69 +00:05:30,830 --> 00:05:37,640 +Và cuối cùng, chúng ta nên kết thúc trang web công thức này để tạo ra những chiếc bánh quế thơm ngon. + +70 +00:05:37,850 --> 00:05:44,120 +Bây giờ, nếu bạn đã xem Instagram gần đây của tôi về việc tiếp quản tài khoản Udemy, bạn sẽ thấy tôi làm những chiếc bánh + +71 +00:05:44,120 --> 00:05:45,110 +quế giống như vậy. + +72 +00:05:45,110 --> 00:05:48,920 +Và nếu bạn cũng muốn làm như vậy, thì đây là công thức dành cho bạn. + +73 +00:05:49,100 --> 00:05:54,200 +Đây là những gì bạn đang hướng tới và sử dụng những gì bạn đã học về các phần tử danh sách. + +74 +00:05:54,200 --> 00:05:58,550 +Tôi muốn bạn tiếp tục và tạm dừng video và hoàn thành thử thách này. + +75 +00:06:02,620 --> 00:06:03,040 +Được rồi. + +76 +00:06:03,040 --> 00:06:04,510 +Vì vậy, bạn đã quản lý để làm điều đó? + +77 +00:06:04,510 --> 00:06:06,970 +Hãy tiếp tục và cùng nhau tìm hiểu giải pháp. + +78 +00:06:06,970 --> 00:06:12,610 +Vì vậy, tôi sẽ cho bạn xem bản xem trước ở phía bên phải để bạn có thể xem cập nhật trang web khi tôi nhập. + +79 +00:06:12,610 --> 00:06:15,670 +Đầu tiên, chúng ta sẽ bắt đầu với các thẻ tiêu đề. + +80 +00:06:15,670 --> 00:06:18,850 +Vì vậy, tôi sẽ thêm một loạt các tiêu đề vào khá nhanh. + +81 +00:06:24,090 --> 00:06:26,800 +Được rồi, vì vậy đó là tất cả các tiêu đề ra khỏi con đường. + +82 +00:06:26,820 --> 00:06:31,320 +Vì vậy, bây giờ chúng tôi đang làm công việc thích hợp, đó là tạo danh sách của chúng tôi. + +83 +00:06:31,350 --> 00:06:36,810 +Như tôi đã nói, các thành phần không thực sự cần thứ tự, vì vậy chúng ta sẽ tạo một danh sách không có thứ tự. + +84 +00:06:36,840 --> 00:06:43,740 +Vì vậy, ở giữa các thẻ UL bắt đầu và kết thúc của chúng tôi, chúng tôi sẽ có mỗi thẻ này dưới dạng một mục danh sách. + +85 +00:06:43,740 --> 00:06:46,980 +Vì vậy, tôi sẽ tạo thẻ mục danh sách. + +86 +00:06:46,980 --> 00:06:55,650 +Và khi tôi đã tạo xong, thì tất cả những gì tôi cần làm là kéo mục danh sách đầu tiên của mình vào giữa mục danh + +87 +00:06:55,650 --> 00:06:56,360 +sách. + +88 +00:06:56,370 --> 00:07:01,440 +Bây giờ, nếu nhấp và kéo không hiệu quả với bạn, nếu điều này không hiển thị, thì bạn + +89 +00:07:01,440 --> 00:07:05,190 +cũng có thể nhấp chuột phải, sao chép và dán cũng hoạt động. + +90 +00:07:05,310 --> 00:07:12,580 +Bây giờ tôi cần làm điều này nhiều lần, vì vậy để đạt hiệu quả, tôi sẽ chỉ dán vào 4 hoặc 5 + +91 +00:07:12,580 --> 00:07:20,100 +mục khác trong số này và kéo tất cả các nguyên liệu khác vào từng mục trong danh sách này. + +92 +00:07:21,360 --> 00:07:26,340 +Bây giờ, khi bạn đang thực sự viết mã này từ đầu, bạn sẽ không cần thực hiện tất cả + +93 +00:07:26,340 --> 00:07:33,020 +thao tác kéo này vì bạn sẽ nhập mục danh sách của mình và sau đó bạn sẽ viết tên mục của mình vào đây như vậy. + +94 +00:07:33,030 --> 00:07:38,790 +Nhưng bởi vì chúng tôi đã viết tất cả văn bản cho bạn, hy vọng sẽ giúp bạn tiết kiệm thời gian để bạn thực + +95 +00:07:38,790 --> 00:07:44,040 +sự viết mã nhiều hơn và ít phải làm công việc bận rộn hơn, nên đây là cách chúng tôi thực hiện. + +96 +00:07:44,490 --> 00:07:45,780 +Một lần nữa cho điền. + +97 +00:07:45,780 --> 00:07:51,900 +Chúng ta có một danh sách không có thứ tự khác và bên trong có ba mục danh sách. + +98 +00:07:51,900 --> 00:07:59,820 +Vì vậy, hãy để tôi tiếp tục và dán ba mục danh sách đó vào và kéo từng mục vào giữa các thẻ như + +99 +00:07:59,820 --> 00:08:00,450 +vậy. + +100 +00:08:00,960 --> 00:08:08,040 +Vì vậy, bây giờ chúng tôi đã có các thành phần của mình và chúng tôi có hai danh sách không theo thứ tự hiển thị một cách hoàn hảo. + +101 +00:08:08,040 --> 00:08:13,530 +Bây giờ tất cả những gì chúng ta phải làm là tạo danh sách cuối cùng, danh sách này sẽ là một danh sách có thứ tự, bởi vì nếu + +102 +00:08:13,530 --> 00:08:16,200 +bạn nghĩ về nó, các hướng dẫn đều có thứ tự, phải không? + +103 +00:08:16,200 --> 00:08:20,370 +Trước tiên, bạn không thể nướng thứ nếu bạn chưa tạo ra nó. + +104 +00:08:20,400 --> 00:08:28,390 +Bên trong danh sách thứ tự này, chúng ta lại cần các phần tử mục danh sách này và chúng ta cần tạo bao nhiêu phần tử trong + +105 +00:08:28,390 --> 00:08:31,270 +số chúng tùy theo số bước chúng ta có. + +106 +00:08:31,270 --> 00:08:36,370 +Vì vậy, tôi sẽ kéo từng dòng vào các phần tử danh sách. + +107 +00:08:41,130 --> 00:08:42,600 +Và chúng tôi đã có nó. + +108 +00:08:42,630 --> 00:08:50,150 +Chúng tôi đã có tất cả các mục trong danh sách của mình và tất cả các hướng dẫn của chúng tôi hiển thị hoàn hảo trong một danh sách có thứ tự. + +109 +00:08:50,160 --> 00:08:55,530 +Và nếu chúng tôi đối chiếu với mục tiêu, thì bạn có thể thấy chúng tôi đã hoàn thành mọi thứ khá hoàn hảo. + +110 +00:08:56,520 --> 00:09:05,850 +Bây giờ, một điều cần nói ở điểm này là lưu ý cách một số phần tử HTML nằm trên một dòng và các phần tử HTML + +111 +00:09:06,000 --> 00:09:08,520 +khác nằm trên nhiều dòng. + +112 +00:09:08,640 --> 00:09:17,010 +Khi bạn dán những dòng văn bản dài vào giữa thẻ bắt đầu và thẻ kết thúc của một phần tử, đôi khi vs code + +113 +00:09:17,010 --> 00:09:20,970 +sẽ tự động đưa thẻ đóng vào dòng tiếp theo. + +114 +00:09:21,000 --> 00:09:28,590 +Giờ đây, bạn có thể chỉnh sửa phần này để tất cả nằm trên cùng một dòng hoặc bạn có thể cố ý chắc chắn rằng chúng nằm + +115 +00:09:28,590 --> 00:09:33,360 +trên các dòng khác nhau và bạn thấy nó bị kẹp giữa thẻ mở và thẻ đóng. + +116 +00:09:33,780 --> 00:09:39,450 +Bây giờ, đây là sở thích cá nhân, vì vậy việc bạn muốn thực hiện việc này như thế nào thực sự không quan trọng vì vậy bạn có thể thực hiện việc này + +117 +00:09:39,450 --> 00:09:40,810 +theo bất kỳ cách nào bạn muốn. + +118 +00:09:40,810 --> 00:09:45,310 +Nhưng đối với tôi, tôi muốn có tất cả các mục danh sách trên cùng một dòng. + +119 +00:09:45,340 --> 00:09:53,470 +Điều này chỉ giúp tôi xem trực quan có bao nhiêu mục trong danh sách và nó không làm lộn xộn danh sách với tất cả các + +120 +00:09:53,500 --> 00:09:55,600 +mục trong danh sách này. + +121 +00:09:55,600 --> 00:10:02,080 +Vì vậy, hãy suy nghĩ xem liệu bạn có muốn xem tất cả các yếu tố của mình như thế này trên + +122 +00:10:02,080 --> 00:10:10,510 +một dòng với nội dung kèm theo hay bạn muốn có nội dung như thế này khi mọi thứ được thụt vào nhiều hơn và bạn có + +123 +00:10:10,510 --> 00:10:14,880 +nội dung ở giữa hai dòng trong danh sách của mình mục. + +124 +00:10:14,890 --> 00:10:20,320 +Trong bài học tiếp theo, chúng ta sẽ nói thêm một chút về loại thụt đầu dòng này. + +125 +00:10:20,320 --> 00:10:22,840 +Vì vậy, đừng lo lắng nếu điều đó vẫn chưa có ý nghĩa. + +126 +00:10:22,870 --> 00:10:27,910 +Chúng ta sẽ nói về việc lồng vào nhau và chúng ta sẽ nói về việc thụt lề các phần tử HTML. + +127 +00:10:27,910 --> 00:10:31,690 +Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và chúng ta sẽ tiếp tục từ đó. + diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 3.1-Nesting-and-Indentation.zip b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 3.1-Nesting-and-Indentation.zip new file mode 100644 index 0000000000000000000000000000000000000000..bac10eefd625c1379b06d779813a2e2aa78f939a --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 3.1-Nesting-and-Indentation.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20a9529dab4ef7539a64e7261f145ca9964eaf156bd92639c80669f5d9195713 +size 38652 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 Nesting and Indentation.mp4 b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 Nesting and Indentation.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ddd21a85ec1a30bd7cf3b7d8dd693e2d07783933 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 Nesting and Indentation.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee16519725761aadaa51a2ed0930eca8fe8fb65826f17beaa51316a4a1279a30 +size 50291395 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 Nesting and Indentation_vi.srt b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 Nesting and Indentation_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9b12a6a4173c8a0d322825bf7eb01e6b66c6d96b --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/003 Nesting and Indentation_vi.srt @@ -0,0 +1,684 @@ +1 +00:00:00,140 --> 00:00:04,910 +Bây giờ, trong bài học trước, chúng ta đã học một chút về danh sách có thứ tự và không có thứ tự. + +2 +00:00:04,939 --> 00:00:08,510 +Bây giờ trong bài học này, chúng ta sẽ đi xa hơn một chút về khái niệm đó. + +3 +00:00:08,550 --> 00:00:12,180 +Tôi muốn chỉ cho bạn cách bạn có thể lồng mọi thứ vào bên trong những thứ khác. + +4 +00:00:12,200 --> 00:00:21,020 +Ví dụ, chúng ta đã thấy rằng chúng ta có thể lồng các phần tử danh sách vào trong một danh sách không có thứ tự và bạn sẽ thấy nó + +5 +00:00:21,020 --> 00:00:23,110 +được thụt vào như thế này. + +6 +00:00:23,120 --> 00:00:29,810 +Nhưng chúng ta thực sự có thể tiến thêm một bước và chúng ta thực sự có thể lồng một danh sách vào trong một danh sách khác. + +7 +00:00:29,840 --> 00:00:37,520 +Vì vậy, trong trường hợp này, những gì bạn thấy là chúng ta có danh sách không có thứ tự đầu tiên bắt đầu từ đây và + +8 +00:00:37,520 --> 00:00:39,260 +đây là nơi nó kết thúc. + +9 +00:00:39,470 --> 00:00:42,890 +Nhưng chúng ta cũng có một danh sách không có thứ tự khác ở đây. + +10 +00:00:42,890 --> 00:00:48,050 +Và đây là nơi cái thứ hai bắt đầu và kết thúc. + +11 +00:00:48,140 --> 00:00:51,950 +Khi điều này được hiển thị trong một trang web, đây là những gì bạn sẽ thấy. + +12 +00:00:51,980 --> 00:00:55,010 +Bạn sẽ thấy nó trông như thế này. + +13 +00:00:55,010 --> 00:00:59,970 +Vậy là bạn đã có danh sách đầu tiên là toàn bộ phần này. + +14 +00:00:59,970 --> 00:01:04,830 +Và bên trong danh sách đầu tiên, chúng ta có một danh sách riêng. + +15 +00:01:04,950 --> 00:01:07,530 +Dưới điểm gạch đầu dòng cụ thể này. + +16 +00:01:07,950 --> 00:01:10,190 +Bây giờ, mã trông như thế nào? + +17 +00:01:10,200 --> 00:01:12,380 +Vâng, nó trông khá đơn giản. + +18 +00:01:12,390 --> 00:01:17,010 +Tất cả những gì bạn phải làm là bên trong một mục danh sách. + +19 +00:01:17,010 --> 00:01:20,520 +Bạn thấy mục danh sách bắt đầu như thế nào ngay tại đây. + +20 +00:01:20,520 --> 00:01:27,450 +Và mục danh sách kết thúc ở đây bên trong mục danh sách này. + +21 +00:01:27,450 --> 00:01:34,620 +Thay vì chỉ có một dòng văn bản như những gì chúng tôi có ở đây, thay vào đó, chúng tôi thực sự + +22 +00:01:34,620 --> 00:01:38,080 +đã nhúng toàn bộ danh sách không có thứ tự. + +23 +00:01:38,100 --> 00:01:46,290 +Vì vậy, trước tiên, chúng tôi sẽ viết văn bản cho mục danh sách, sau đó, sau văn bản, chúng tôi nhúng danh sách không có thứ tự của mình, giống + +24 +00:01:46,290 --> 00:01:49,890 +như bạn sẽ thấy trong bất kỳ danh sách bình thường nào khác. + +25 +00:01:50,820 --> 00:01:55,770 +Và sau đó chúng tôi kết thúc với cái được gọi là danh sách lồng nhau. + +26 +00:01:56,410 --> 00:02:04,690 +Đây là phần mà việc thụt lề mã của bạn trở nên cực kỳ quan trọng vì hãy tưởng tượng mã trông + +27 +00:02:04,690 --> 00:02:07,990 +như thế này chứ không phải thế này. + +28 +00:02:08,020 --> 00:02:16,360 +Khi bạn nhìn lướt qua mã này, sẽ khó nhận ra rằng bạn có một danh sách được nhúng bên trong. + +29 +00:02:16,360 --> 00:02:17,410 +Một danh sách khác. + +30 +00:02:17,410 --> 00:02:17,980 +Phải. + +31 +00:02:18,070 --> 00:02:24,490 +Bởi vì bạn phải thực sự đọc từng thẻ này là gì thay vì sử dụng các manh mối được + +32 +00:02:24,490 --> 00:02:26,560 +cung cấp bởi vết lõm đó. + +33 +00:02:27,100 --> 00:02:34,260 +Và như bạn có thể tưởng tượng, chúng ta có thể có những danh sách lồng nhau thậm chí còn điên rồ hơn như những gì tôi có ở đây. + +34 +00:02:34,270 --> 00:02:37,480 +Vì vậy, thực sự có ba danh sách ở đây. + +35 +00:02:37,510 --> 00:02:39,550 +Một là lên đây. + +36 +00:02:39,580 --> 00:02:41,860 +Đây là danh sách đầu tiên. + +37 +00:02:41,950 --> 00:02:44,530 +Đây là một danh sách không có thứ tự. + +38 +00:02:44,680 --> 00:02:51,400 +Và sau đó chúng ta có một danh sách thứ hai ngay tại đây, một lần nữa, một danh sách không có thứ tự. + +39 +00:02:51,400 --> 00:02:56,000 +Và điều đó được nhúng dưới mục danh sách. + +40 +00:02:56,300 --> 00:03:05,270 +Và sau đó để làm phức tạp thêm mọi thứ, tôi đã thêm một danh sách có thứ tự thứ ba được liệt kê dưới mục thứ hai ngay + +41 +00:03:05,270 --> 00:03:06,410 +tại đây. + +42 +00:03:06,650 --> 00:03:12,800 +Mức độ điên rồ này bắt đầu thực sự làm nổi bật các vấn đề mà bạn sẽ gặp phải khi đọc đoạn mã + +43 +00:03:12,800 --> 00:03:13,340 +này. + +44 +00:03:13,370 --> 00:03:18,410 +Hãy tưởng tượng ai đó đưa cho bạn mã này và bạn phải tìm ra mà không cần nhìn vào phía + +45 +00:03:18,440 --> 00:03:21,500 +bên tay phải, điều gì đang diễn ra ngay tại đây. + +46 +00:03:21,680 --> 00:03:30,860 +Sẽ dễ dàng hơn nhiều nếu chúng ta thụt lề, phải không, Bởi vì chúng ta có thể thấy rõ ràng một danh sách không có thứ tự, danh + +47 +00:03:30,860 --> 00:03:39,770 +sách không có thứ tự thứ hai và danh sách có thứ tự thứ ba vì tất cả chúng đều được thụt vào một cách độc đáo và dễ dàng hơn + +48 +00:03:39,770 --> 00:03:42,480 +rất nhiều khi chúng ta đọc mã . + +49 +00:03:42,500 --> 00:03:48,410 +Vì vậy, khi bạn đang viết mã, bạn cũng đang nghĩ về việc người khác sẽ tìm cách đọc mã của bạn + +50 +00:03:48,410 --> 00:03:49,220 +như thế nào. + +51 +00:03:49,760 --> 00:03:53,480 +Bây giờ chúng ta cùng thử thực hiện bài tập khoan thai này nha. + +52 +00:03:54,020 --> 00:03:59,840 +Tôi muốn bạn tải xuống tệp zip lồng và thụt đầu dòng từ bài học hiện tại này và + +53 +00:03:59,840 --> 00:04:04,010 +tôi muốn bạn mở bên trong mã như bạn đã làm trước đây. + +54 +00:04:04,100 --> 00:04:10,760 +Bây giờ, trong trường hợp này, nếu chúng ta xem xét mục tiêu của mình là tạo một danh sách lồng nhau siêu phức tạp. + +55 +00:04:10,880 --> 00:04:17,120 +Trong bài học trước, bạn đã thấy cách tạo các thành phần danh sách đơn giản, cho dù đó là danh sách không + +56 +00:04:17,120 --> 00:04:19,370 +có thứ tự hay danh sách có thứ tự. + +57 +00:04:19,399 --> 00:04:23,740 +Khá đơn giản để chỉ tạo một danh sách với một số mục danh sách. + +58 +00:04:23,750 --> 00:04:29,460 +Nhưng trong thử thách này, tôi muốn bạn tạo ra thứ gì đó phức tạp hơn nhiều. + +59 +00:04:29,480 --> 00:04:30,980 +Hãy để tôi hướng dẫn bạn qua nó. + +60 +00:04:30,980 --> 00:04:40,010 +Vì vậy, đầu tiên, chúng ta có một danh sách không có thứ tự chỉ có ba mục danh sách A, B và C, nhưng dưới mục + +61 +00:04:40,040 --> 00:04:44,720 +B, hãy lưu ý ở đây chúng ta có một danh sách có thứ tự. + +62 +00:04:45,050 --> 00:04:55,850 +Danh sách có thứ tự này cũng có ba mục và từ mục B đến mục thứ hai, chúng ta có một danh sách không có thứ tự + +63 +00:04:55,850 --> 00:04:56,510 +khác. + +64 +00:04:56,750 --> 00:05:01,220 +Và bên trong mục đầu tiên, chúng tôi đã lồng một danh sách không có thứ tự khác. + +65 +00:05:01,220 --> 00:05:06,380 +Và bên trong mục thứ ba, chúng tôi đã nhúng một danh sách có thứ tự khác. + +66 +00:05:06,710 --> 00:05:12,590 +Điều này hơi phức tạp một chút và để thực sự hiểu nó, bạn cần + +67 +00:05:12,590 --> 00:05:20,920 +xem qua phần này của video vì ở đây tôi có đoạn mã sẽ tạo ra cấu trúc đơn giản hơn này. + +68 +00:05:20,930 --> 00:05:28,280 +Và điều quan trọng cần lưu ý là trong khi thông thường, bạn có thể có một mục danh sách + +69 +00:05:28,280 --> 00:05:33,920 +bắt đầu như thế này và sau đó bạn sẽ đóng nó lại như thế này. + +70 +00:05:35,340 --> 00:05:44,370 +Trong trường hợp khi chúng ta nhúng một danh sách, thẻ đóng đó không nằm ở đây mà thay + +71 +00:05:44,370 --> 00:05:49,590 +vào đó, nó sẽ nằm ở cuối danh sách lồng nhau. + +72 +00:05:49,680 --> 00:05:57,000 +Sau khi chúng ta lồng xong, danh sách không có thứ tự này ngay tại đây, thì chúng ta có đóng mục danh sách đó không? + +73 +00:05:57,000 --> 00:06:00,710 +Vì vậy, đây là một điều thực sự quan trọng cần chú ý. + +74 +00:06:00,720 --> 00:06:08,340 +Và sau đó, tôi muốn bạn nghiên cứu trang này một chút để xem cách tôi tạo danh sách này bằng cách + +75 +00:06:08,340 --> 00:06:14,910 +sử dụng mã này và sau đó lấy mã này và áp dụng nó vào thử thách trong bài tập viết mã. + +76 +00:06:15,300 --> 00:06:16,800 +Có một suy nghĩ tốt về nó. + +77 +00:06:16,800 --> 00:06:19,440 +Hãy dành chút thời gian để thử và hoàn thành thử thách này. + +78 +00:06:19,470 --> 00:06:25,170 +Tôi tin rằng bạn có thể làm được điều này nếu bạn dành thời gian suy nghĩ và thử nó. + +79 +00:06:25,170 --> 00:06:32,100 +Và như mọi khi, hãy nhớ rằng bạn có thể sử dụng tính năng xem trước để xem cách mã của bạn được tạo ra và định + +80 +00:06:32,100 --> 00:06:34,140 +hình trong khi bạn viết mã. + +81 +00:06:34,140 --> 00:06:36,160 +Và tôi nghĩ điều đó sẽ giúp bạn khá nhiều. + +82 +00:06:36,250 --> 00:06:39,310 +Tạm dừng video ngay bây giờ và bắt đầu thực hiện bài tập mã hóa đó. + +83 +00:06:40,800 --> 00:06:41,280 +Được rồi. + +84 +00:06:41,280 --> 00:06:42,330 +Vì vậy, làm thế nào mà đi? + +85 +00:06:42,330 --> 00:06:45,630 +Bây giờ, nếu bạn không thử, tôi muốn bạn dừng video ngay bây giờ. + +86 +00:06:45,660 --> 00:06:47,280 +Hãy chắc chắn rằng bạn đã thử nó. + +87 +00:06:47,280 --> 00:06:50,250 +Bạn sẽ không học viết mã chỉ bằng cách xem tôi viết mã. + +88 +00:06:50,280 --> 00:06:54,540 +Bạn sẽ chỉ học lập trình bằng cách thực sự làm việc đó. + +89 +00:06:54,540 --> 00:06:59,010 +Giải quyết các thử thách, cảm thấy ngu ngốc, đôi khi cảm thấy mình không đủ tốt. + +90 +00:06:59,010 --> 00:07:03,750 +Nhưng cuối cùng, khi bạn làm được, khi bạn thành công, bạn sẽ cảm thấy thật tuyệt vời. + +91 +00:07:03,750 --> 00:07:07,860 +Và tôi hứa với bạn rằng mọi người đã trải qua cuộc hành trình này đều giống nhau. + +92 +00:07:08,040 --> 00:07:13,980 +Vì vậy, những gì tôi sẽ làm là lướt qua giải pháp và tôi sẽ kéo mục tiêu của mình + +93 +00:07:13,980 --> 00:07:19,020 +lên đây để tôi có thể so sánh nó với bản xem trước khi thực hiện. + +94 +00:07:19,020 --> 00:07:28,200 +Vì vậy, bước đầu tiên là tạo danh sách không có thứ tự đầu tiên với ba mục A, B và C. Việc này khá dễ thực + +95 +00:07:28,200 --> 00:07:29,190 +hiện. + +96 +00:07:29,190 --> 00:07:32,580 +Và hãy tiếp tục và tạo ra điều đó. + +97 +00:07:35,850 --> 00:07:41,670 +Được rồi, vậy bây giờ chúng ta đã có phần trên cùng của tổ, đó là A, B và C. + +98 +00:07:41,850 --> 00:07:44,940 +Nếu chúng ta nhìn vào mục tiêu của mình, hãy so sánh nó. + +99 +00:07:44,970 --> 00:07:48,690 +Chúng ta có A, B, C bên trong viên đạn. + +100 +00:07:48,720 --> 00:07:53,760 +B, chúng ta sẽ nhúng ngay tại đây, một danh sách có thứ tự. + +101 +00:07:53,760 --> 00:07:58,860 +Vì vậy, nó sẽ lại có ba mục B1, B2 và B3. + +102 +00:07:58,860 --> 00:08:04,050 +Và chúng ta biết đó là một danh sách có thứ tự vì nó bắt đầu bằng các số một, hai và ba. + +103 +00:08:04,920 --> 00:08:10,760 +Hãy tiếp tục và nhúng nó vào trong mục danh sách B thứ hai này. + +104 +00:08:10,770 --> 00:08:16,830 +Hãy nhớ những gì tôi đã nói khi bạn nhúng một danh sách vào một danh sách khác, bạn tìm thấy mục danh sách mà bạn muốn nhúng + +105 +00:08:16,830 --> 00:08:17,340 +nó vào. + +106 +00:08:17,340 --> 00:08:25,260 +Và sau nội dung của mục danh sách, tất nhiên là chữ B ngay tại đây, chúng ta tiếp tục và nhấn + +107 +00:08:25,260 --> 00:08:29,820 +enter và đó là nơi chúng ta tạo danh sách của mình. + +108 +00:08:29,850 --> 00:08:36,280 +Chúng ta sẽ tạo một danh sách có thứ tự trong trường hợp này và nó sẽ có ba mục. + +109 +00:08:36,280 --> 00:08:42,520 +Người đầu tiên sẽ là B1 và sau đó là B2 và B3. + +110 +00:08:43,030 --> 00:08:45,880 +Bây giờ chúng ta hãy so sánh và đối chiếu lại. + +111 +00:08:45,910 --> 00:08:52,750 +Chúng tôi đã có B1, B2, B3, nhưng hãy xem bên trong mục B2 này. + +112 +00:08:52,750 --> 00:09:01,240 +Một lần nữa, chúng ta sẽ lồng một danh sách khác và ở đây chúng ta có một danh sách không có thứ tự B2, B2B và B2C. + +113 +00:09:01,390 --> 00:09:03,460 +Hãy tiếp tục và làm điều đó. + +114 +00:09:06,400 --> 00:09:14,020 +Ngay tại đây bên trong mục danh sách B2, chúng ta sẽ tạo danh sách không có + +115 +00:09:14,020 --> 00:09:19,720 +thứ tự, UL của chúng ta và chúng ta sẽ có B2, B2B và B2C. + +116 +00:09:21,100 --> 00:09:22,180 +Hãy so sánh. + +117 +00:09:22,180 --> 00:09:26,650 +Chúng tôi đã có B2B, B2B, B2C, vì vậy chúng tôi đã hoàn thành hầu hết các phần. + +118 +00:09:26,740 --> 00:09:35,140 +Tổ cuối cùng trong chuỗi dài lớn này nằm dưới B đến A, chúng ta cần thêm một danh sách không có thứ tự, B đến A + +119 +00:09:35,140 --> 00:09:36,010 +và B đến B. + +120 +00:09:36,430 --> 00:09:40,630 +Bây giờ, cách mà tôi đã đặt tên cho từng thứ này hy vọng sẽ giúp ích cho bạn trong việc lồng ghép. + +121 +00:09:40,630 --> 00:09:46,000 +Nếu không, thì bạn chỉ cần so sánh với mục tiêu và thử khớp nó một cách trực quan. + +122 +00:09:46,240 --> 00:09:51,910 +Trong trường hợp này, thay vì nằm dưới mục thứ hai, nó thực sự được lồng dưới mục đầu tiên. + +123 +00:09:51,910 --> 00:10:03,700 +Và một lần nữa, đó là một danh sách không có thứ tự chỉ với hai mục danh sách B đến A và B đến B. + +124 +00:10:05,140 --> 00:10:10,180 +Bây giờ chúng ta đã sắp xếp gần như toàn bộ phần này. + +125 +00:10:10,300 --> 00:10:19,030 +Tất cả những gì chúng ta cần làm bây giờ chỉ là thêm danh sách có thứ tự cuối cùng trên giường dưới mục danh sách B ba. + +126 +00:10:19,600 --> 00:10:22,010 +Hãy tìm B ba mục danh sách của chúng tôi. + +127 +00:10:22,010 --> 00:10:27,560 +Sau văn bản, hãy nhấn enter để tạo một dòng mới và sau + +128 +00:10:27,560 --> 00:10:38,540 +đó chúng ta sẽ tạo một danh sách có thứ tự như thế này và chúng ta sẽ thêm hai mục danh sách B31 và B32. + +129 +00:10:39,020 --> 00:10:45,650 +Vì vậy, bây giờ nếu chúng ta so sánh mục tiêu của mình và những gì chúng ta có trong bản xem trước, bạn sẽ thấy nó hoàn toàn giống nhau. + +130 +00:10:45,650 --> 00:10:50,210 +Và thông qua quá trình này, hy vọng bạn đã học được thêm một chút về cách lồng ghép. + +131 +00:10:50,300 --> 00:10:58,370 +Và một trong những điều thú vị về Visual Studio Code là nó sẽ tự động thụt lề mọi thứ khi + +132 +00:10:58,370 --> 00:10:59,570 +bạn viết mã. + +133 +00:10:59,600 --> 00:11:04,190 +Nó biết, ví dụ, liệt kê các mục, đi vào bên trong một danh sách. + +134 +00:11:04,190 --> 00:11:12,410 +Vì vậy, cho dù đó là UL hay O, L, khi bạn vào tệp và lưu hoặc sử dụng lệnh tắt ở đây, trong trường hợp của + +135 +00:11:12,410 --> 00:11:14,810 +tôi trên mac, đó là lệnh s. + +136 +00:11:14,840 --> 00:11:17,420 +Nếu bạn đang ở trên cửa sổ, thì đó có thể là Ctrl s. + +137 +00:11:17,450 --> 00:11:21,800 +Khi bạn làm điều đó, nó sẽ tự động thụt lề mọi thứ. + +138 +00:11:21,800 --> 00:11:29,270 +Vì vậy, ngay cả khi bạn làm mọi thứ rối tung lên khi bạn gõ như tôi đã đến đây và bạn đã làm cho tất + +139 +00:11:29,270 --> 00:11:31,520 +cả cấu trúc trông rất kỳ lạ. + +140 +00:11:31,760 --> 00:11:40,280 +Nếu bạn lưu mã Visual Studio sẽ thụt lề mọi thứ cho bạn, do đó bạn không nhất thiết phải thụt lề mọi thứ, nhưng điều + +141 +00:11:40,310 --> 00:11:43,910 +quan trọng là bạn hiểu ý nghĩa của việc thụt lề. + +142 +00:11:43,910 --> 00:11:52,430 +Vì vậy, ở đây bạn thấy một dòng ngay tại đây và nó liên kết UL mở với thẻ đóng phù hợp, và + +143 +00:11:52,430 --> 00:12:02,150 +sau đó nó đã thụt lề hai mục danh sách này để bạn có thể thấy hai mục này có thể thuộc danh sách không + +144 +00:12:02,180 --> 00:12:03,650 +có thứ tự này. + +145 +00:12:04,070 --> 00:12:09,140 +Và rất thường xuyên trong HTML, bạn sẽ có các thẻ phù hợp. + +146 +00:12:09,140 --> 00:12:12,620 +Nếu có một thẻ mở, thì có thể có một thẻ đóng. + +147 +00:12:12,620 --> 00:12:15,800 +Và tất cả những thứ này trên màn hình chẳng hạn như những dòng này. + +148 +00:12:15,800 --> 00:12:22,490 +Và phần thụt đầu dòng ở đây để giúp bạn hiểu mã của bạn trông như thế nào để nếu bạn thực sự gặp lỗi, + +149 +00:12:22,490 --> 00:12:29,540 +chẳng hạn như nếu bạn quên đóng UL này và khi bạn thấy mã của mình làm những điều kỳ lạ chẳng hạn như, trong + +150 +00:12:29,540 --> 00:12:36,020 +trường hợp này, tại sao C của tôi lại nằm trong danh sách có thứ tự trong khi nó phải ở cấp cao nhất + +151 +00:12:36,020 --> 00:12:38,960 +với danh sách không có thứ tự khác? + +152 +00:12:38,990 --> 00:12:40,700 +Chuyện gì đang xảy ra ở đây? + +153 +00:12:40,910 --> 00:12:44,420 +Chà, sau đó tôi có thể làm theo những vết lõm này. + +154 +00:12:44,750 --> 00:12:52,580 +Tôi có thể thấy rằng UL này rõ ràng khớp với dòng này cho đến dòng kết thúc này. + +155 +00:12:52,580 --> 00:12:55,880 +Và cái tiếp theo này là một mục danh sách. + +156 +00:12:55,880 --> 00:13:05,300 +Vì vậy, hai cái này nằm trên một dòng, chúng được khớp và sau đó mục danh sách tiếp theo này được khớp với cái này. + +157 +00:13:05,300 --> 00:13:07,720 +Nhưng rồi đợi một chút, chuyện gì đang xảy ra ở đây vậy? + +158 +00:13:07,730 --> 00:13:13,670 +Tại sao ol này phù hợp với một mục danh sách? + +159 +00:13:13,670 --> 00:13:17,330 +Hoặc có thể có một cái gì đó mất tích ngay tại đây? + +160 +00:13:17,330 --> 00:13:21,560 +Tất nhiên, đó là thẻ đóng bị thiếu. + +161 +00:13:21,560 --> 00:13:25,730 +Vì vậy, theo cách này, tôi có thể bắt đầu tìm ra lỗi của mình đến từ đâu. + +162 +00:13:25,730 --> 00:13:31,070 +Vì vậy, chúng ta sẽ thực hiện nhiều hơn nữa kiểu kiểm tra lỗi và sửa lỗi này, mà chúng ta gọi + +163 +00:13:31,100 --> 00:13:33,110 +là gỡ lỗi trong các bài học sau. + +164 +00:13:33,110 --> 00:13:39,860 +Nhưng đây chỉ là phần thử nghiệm trong bài học này về cách bạn có thể sử dụng một số công cụ để giúp bạn đảm bảo rằng + +165 +00:13:39,860 --> 00:13:43,010 +mã của bạn đang hoạt động và bạn đang viết đúng. + +166 +00:13:43,010 --> 00:13:50,750 +Và khi bạn mắc lỗi, giống như tất cả chúng ta, bạn có thể sử dụng tính năng lồng trong thụt đầu dòng để chẩn đoán + +167 +00:13:50,750 --> 00:13:54,290 +mã của bạn có vấn đề gì và giúp bạn sửa lỗi đó. + +168 +00:13:55,100 --> 00:13:58,400 +Vì vậy, đó là tất cả cho lồng và thụt đầu dòng. + +169 +00:13:58,400 --> 00:14:05,300 +Trong bài học tiếp theo, chúng ta sẽ tìm hiểu về các phần tử neo và chúng ta sẽ bắt đầu tạo siêu liên kết trong các trang + +170 +00:14:05,300 --> 00:14:06,440 +web của mình. + +171 +00:14:06,440 --> 00:14:09,740 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 3.2-Anchor-Elements.zip b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 3.2-Anchor-Elements.zip new file mode 100644 index 0000000000000000000000000000000000000000..aaa3d893608d813bdd400cdf080c72f4736d21e8 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 3.2-Anchor-Elements.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bff43b1b5309f626bee3193c4a27220706e11d6145dd4f436e72d638acbe308b +size 233701 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 Anchor Elements.mp4 b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 Anchor Elements.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2db2a9e51041f3f10ba1a68c660131ff406bbb33 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 Anchor Elements.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e97a4520cc325da5d1ceac2b7c95c7ae8752f1d1547a1c6fc8065b3dfdd0c4d +size 46191513 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 Anchor Elements_vi.srt b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 Anchor Elements_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..324d4e5fdb59902395ccf1908e8ea3506c9fbd3c --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/004 Anchor Elements_vi.srt @@ -0,0 +1,532 @@ +1 +00:00:00,170 --> 00:00:00,770 +Này các cậu. + +2 +00:00:00,770 --> 00:00:08,210 +Trong bài học này, chúng ta sẽ hiểu thêm một chút về khía cạnh khác của HTML, đó là các thuộc tính của chúng + +3 +00:00:08,210 --> 00:00:13,850 +và hiểu rằng chúng ta sẽ tìm hiểu tất cả về phần tử neo, cho phép chúng ta tạo siêu + +4 +00:00:13,850 --> 00:00:15,240 +liên kết. + +5 +00:00:15,260 --> 00:00:21,620 +Đây là giao diện của một phần tử neo và tương tự như các phần tử trước đó, chúng ta có thẻ mở + +6 +00:00:21,620 --> 00:00:27,620 +và thẻ đóng, nhưng có điều gì đó hơi đặc biệt về phần này bởi vì ngay bây giờ nếu bạn viết + +7 +00:00:27,620 --> 00:00:32,299 +mã như ở đây, thì đây không phải là một siêu liên kết hoạt động. + +8 +00:00:32,330 --> 00:00:39,590 +Những gì bạn cần là thêm một thuộc tính bổ sung và thuộc tính cho phần tử HTML nằm trong + +9 +00:00:39,590 --> 00:00:40,820 +thẻ mở. + +10 +00:00:40,820 --> 00:00:49,490 +Nó đi vào phần ngay sau tên của thẻ và ngay trước phần cuối của thẻ mở nơi chúng ta có dấu + +11 +00:00:49,490 --> 00:00:51,530 +ngoặc nhọn đóng. + +12 +00:00:51,740 --> 00:00:58,730 +Và chức năng của một thuộc tính là thêm thông tin bổ sung vào phần tử HTML này, chẳng hạn như trong trường hợp + +13 +00:00:58,730 --> 00:01:01,260 +này liên kết này sẽ liên kết đến đâu. + +14 +00:01:01,290 --> 00:01:05,069 +Bây giờ, cách chúng ta cấu trúc một thuộc tính trông như thế này. + +15 +00:01:05,069 --> 00:01:15,270 +Vì vậy, chúng tôi có tên của phần tử và sau đó chúng tôi có một khoảng trắng và sau đó chúng tôi có tên của thuộc tính. + +16 +00:01:15,450 --> 00:01:18,960 +Và sau đó chúng ta có một dấu bằng. + +17 +00:01:18,960 --> 00:01:23,640 +Và sau dấu bằng, chúng ta có giá trị của thuộc tính. + +18 +00:01:24,300 --> 00:01:31,350 +Giờ đây, bạn có thể có bao nhiêu thuộc tính tùy thích và tất cả những gì bạn phải làm chỉ đơn giản là tách + +19 +00:01:31,350 --> 00:01:37,590 +từng thuộc tính đó bằng khoảng trắng và đảm bảo rằng tất cả chúng đều được đưa vào thẻ mở. + +20 +00:01:37,860 --> 00:01:45,600 +Bây giờ, trong trường hợp phần tử hình ảnh của chúng tôi, nếu bạn xem tài liệu mạng của nhà + +21 +00:01:45,600 --> 00:01:55,230 +phát triển Mozilla cho phần tử neo, thì bạn có thể thấy nó có thuộc tính đặc biệt là href và href là phần mà chúng + +22 +00:01:55,260 --> 00:02:01,380 +tôi thêm URL mà siêu liên kết nên đi đến mà không có thuộc tính. + +23 +00:02:01,380 --> 00:02:02,820 +Đây là những gì bạn sẽ thấy. + +24 +00:02:02,850 --> 00:02:10,979 +Nó là một phần tử neo và bạn thấy nội dung ở giữa các thẻ, nhưng bạn không thấy một liên kết hoạt động khi nhấp + +25 +00:02:10,979 --> 00:02:11,970 +vào nó. + +26 +00:02:11,970 --> 00:02:13,110 +Chẳng có gì xảy ra. + +27 +00:02:13,140 --> 00:02:13,620 +Hiện nay. + +28 +00:02:13,620 --> 00:02:20,910 +Ngay sau khi bạn thêm thuộc tính href đó và bạn cung cấp cho nó mục tiêu trong trường hợp này. + +29 +00:02:20,910 --> 00:02:25,170 +Vậy siêu liên kết này sẽ đi đến đâu? + +30 +00:02:25,170 --> 00:02:31,980 +Liên kết này thực sự được tạo kiểu để cho bạn thấy rằng đây hiện là một liên kết đang hoạt động với màu xanh quen thuộc + +31 +00:02:31,980 --> 00:02:32,970 +có gạch dưới. + +32 +00:02:32,970 --> 00:02:40,710 +Và tại thời điểm này, nếu bạn nhấp vào nó, nó sẽ chuyển thẳng đến URL này mà chúng tôi đã chỉ định + +33 +00:02:41,100 --> 00:02:44,130 +cùng với các thuộc tính cụ thể. + +34 +00:02:44,130 --> 00:02:51,720 +Vì vậy, ví dụ: trong tài liệu về phần tử neo, chúng tôi thấy rằng nó có tất cả các thuộc tính + +35 +00:02:51,720 --> 00:02:55,740 +cụ thể có liên quan đến phần tử cụ thể này. + +36 +00:02:55,770 --> 00:03:01,920 +Bây giờ chúng tôi sẽ không sử dụng tất cả chúng và một số trong số chúng cũng không được dùng nữa và không còn được + +37 +00:03:01,920 --> 00:03:03,240 +sử dụng trong HTML5. + +38 +00:03:03,330 --> 00:03:09,680 +Nhưng ngoài các thuộc tính cụ thể này, còn có các thuộc tính toàn cầu mà mọi phần tử HTML đơn lẻ + +39 +00:03:09,690 --> 00:03:11,370 +đều có quyền truy cập. + +40 +00:03:12,000 --> 00:03:18,570 +Và nếu bạn xem qua một số trong số này, một ví dụ giống như có thể kéo được, phải không? + +41 +00:03:19,080 --> 00:03:26,010 +Và về cơ bản, nó cho phép chúng ta đặt true hoặc false để nói liệu phần tử có thể được kéo hay không, + +42 +00:03:26,520 --> 00:03:31,560 +bạn có thể áp dụng thuộc tính toàn cầu cho bất kỳ phần tử cụ thể nào. + +43 +00:03:31,560 --> 00:03:35,730 +Vì vậy, trong trường hợp này, chúng ta có thể áp dụng nó ngay cả với phần tử neo của chúng ta. + +44 +00:03:35,730 --> 00:03:44,400 +Một lần nữa, chúng ta có tên của thuộc tính, chúng ta có dấu bằng và chúng ta có giá trị của thuộc tính. + +45 +00:03:44,400 --> 00:03:50,610 +Vì vậy, trong trường hợp này, tên của thuộc tính là Có thể kéo và chúng tôi đã đặt nó bằng true. + +46 +00:03:50,820 --> 00:03:57,930 +Vì vậy, khi thuộc tính này được đặt, điều xảy ra là bạn có thể nhấp và kéo thẻ neo đó xung quanh. + +47 +00:03:58,020 --> 00:04:03,510 +Bây giờ, nếu thuộc tính đó chưa được đặt, thì khi bạn cố kéo nó, nó sẽ làm nổi bật + +48 +00:04:03,510 --> 00:04:06,240 +dòng và không cho phép hành vi đó. + +49 +00:04:06,540 --> 00:04:12,390 +Vì vậy, chúng tôi đã biết rằng có các thuộc tính cụ thể chỉ dành riêng cho một số phần tử nhất định, + +50 +00:04:12,390 --> 00:04:19,529 +chẳng hạn như href cho thẻ neo và có các thuộc tính toàn cầu có thể được sử dụng trên bất kỳ phần tử HTML nào. + +51 +00:04:19,829 --> 00:04:27,150 +Vì vậy, bây giờ hãy thử làm một bài tập và xem bạn đã hiểu cách sử dụng các phần tử neo hay chưa và cụ thể hơn, + +52 +00:04:27,180 --> 00:04:32,070 +hãy xem bạn đã hiểu cách viết thuộc tính HTML trong mã HTML chưa. + +53 +00:04:32,400 --> 00:04:39,390 +Trong bài tập này, chúng ta sẽ tạo một trang web hiển thị năm trang web yêu thích hàng đầu của chúng ta. + +54 +00:04:39,840 --> 00:04:45,960 +Tôi đã viết sẵn H1 cho bạn, nhưng mục tiêu của chúng tôi là một cái gì đó như thế này. + +55 +00:04:45,960 --> 00:04:54,210 +Vì vậy, bạn có một danh sách ở đây và lưu ý rằng đây thực sự là một danh sách có thứ tự vì nó đi + +56 +00:04:54,210 --> 00:04:59,850 +từ một đến năm và thực tế là danh sách không được đánh dấu. + +57 +00:04:59,880 --> 00:05:09,300 +Có màu xanh lam sẽ cho bạn thấy rằng điều này thực sự được tạo bằng cách sử dụng phần tử danh sách chứ không phải là một phần của + +58 +00:05:09,300 --> 00:05:10,470 +thẻ liên kết. + +59 +00:05:10,500 --> 00:05:12,510 +Nó không phải là một phần của nội dung. + +60 +00:05:12,510 --> 00:05:15,870 +Và thẻ neo chỉ bắt đầu từ đây. + +61 +00:05:16,530 --> 00:05:24,810 +Tôi muốn bạn ghi lại năm trang web yêu thích hàng đầu mọi thời đại của mình và thoải mái truy cập Google hoặc kiểm tra trang web của tôi + +62 +00:05:24,810 --> 00:05:26,700 +nếu bạn muốn xem họ làm gì. + +63 +00:05:26,790 --> 00:05:33,420 +Đây là một số trang web mà tôi truy cập khi cảm thấy buồn chán hoặc khi tôi đang cố gắng tìm kiếm một số ý tưởng mới + +64 +00:05:33,420 --> 00:05:34,800 +và nguồn cảm hứng mới. + +65 +00:05:35,160 --> 00:05:40,770 +Vì vậy, tôi muốn bạn sử dụng những gì bạn đã học trước đây về cách tạo danh sách. + +66 +00:05:40,770 --> 00:05:47,100 +Và trong các danh sách đó, tôi muốn bạn tạo năm thẻ neo, mỗi thẻ trỏ đến một trang web + +67 +00:05:47,100 --> 00:05:48,870 +khác mà bạn thích. + +68 +00:05:49,350 --> 00:05:54,240 +Và nếu bạn đã làm mọi thứ hoạt động, thì cuối cùng bạn sẽ có một trang web giống như mục tiêu. + +69 +00:05:54,240 --> 00:06:00,040 +Và khi bạn nhấp vào bất kỳ liên kết nào trong số này, thì chúng sẽ đưa bạn đến đúng trang web. + +70 +00:06:00,070 --> 00:06:00,850 +Tạm dừng video. + +71 +00:06:00,850 --> 00:06:06,340 +Bây giờ, hãy thực hiện thử thách này và sau khi bạn hoàn thành, hãy quay lại đây và tôi sẽ cùng bạn tìm ra + +72 +00:06:06,340 --> 00:06:07,030 +giải pháp. + +73 +00:06:12,400 --> 00:06:12,880 +Được rồi. + +74 +00:06:12,880 --> 00:06:14,290 +Vì vậy, làm thế nào mà đi? + +75 +00:06:14,500 --> 00:06:18,370 +Điều đầu tiên chúng tôi muốn làm là tạo một danh sách có thứ tự. + +76 +00:06:18,400 --> 00:06:21,330 +Chúng ta đã thấy cách thực hiện điều này trong bài học trước. + +77 +00:06:21,340 --> 00:06:27,730 +Chúng tôi tạo các thẻ của mình và bên trong chúng tôi thêm các thành phần danh sách của mình. + +78 +00:06:27,880 --> 00:06:32,260 +Bên trong phần tử danh sách là nơi thẻ neo của chúng ta sẽ đi đến. + +79 +00:06:32,290 --> 00:06:42,220 +Đó là thẻ neo, nằm trong phần tử danh sách, sau đó nằm trong danh sách có thứ tự. + +80 +00:06:42,520 --> 00:06:46,150 +Vì vậy, một số lớp lồng nhau đang diễn ra ở đây. + +81 +00:06:46,720 --> 00:06:53,530 +Bây giờ, khi bạn đã tạo thẻ neo của mình, thì ở giữa thẻ mở và thẻ đóng, chúng tôi sẽ thêm văn bản cho liên kết + +82 +00:06:53,530 --> 00:06:54,590 +của chúng tôi. + +83 +00:06:54,610 --> 00:07:00,910 +Vì vậy, trong trường hợp của tôi, đó sẽ là tên của trang web mà tôi đang liên kết tới, có tên là Product Hunt. + +84 +00:07:01,000 --> 00:07:07,720 +Và đây là nơi bạn có thể xem tất cả các lần ra mắt sản phẩm mới nhất cũng như các trang web và công ty khởi nghiệp tuyệt vời mà + +85 +00:07:07,720 --> 00:07:09,700 +mọi người đang xây dựng hàng ngày. + +86 +00:07:09,940 --> 00:07:14,950 +Phần quan trọng đến đây khi chúng ta tạo thuộc tính cho thẻ neo đó. + +87 +00:07:14,960 --> 00:07:23,840 +Vì vậy, hãy nhớ rằng thuộc tính để liên kết thẻ neo được gọi là href và chúng tôi sẽ thêm + +88 +00:07:23,840 --> 00:07:25,970 +nó sau dấu bằng. + +89 +00:07:26,520 --> 00:07:31,640 +Khi bạn bắt đầu nhập, bạn có thể thấy mã, bắt đầu đề xuất những gì bạn đang tìm kiếm. + +90 +00:07:31,650 --> 00:07:37,380 +Vì vậy, nếu bạn chọn giới thiệu và nhấn enter, thì nó sẽ định dạng mọi thứ để bạn sẵn sàng + +91 +00:07:37,380 --> 00:07:38,340 +nhập URL. + +92 +00:07:38,730 --> 00:07:45,690 +Nếu bạn thắc mắc tại sao lại có những dấu ngoặc kép này ở đây, thì đó là bởi vì nó thực sự là một + +93 +00:07:45,690 --> 00:07:48,950 +đoạn văn bản mà chúng tôi sẽ thêm vào đây. + +94 +00:07:48,960 --> 00:07:52,230 +Vì vậy, điều này được xử lý hơi khác trong mã. + +95 +00:07:52,230 --> 00:07:59,140 +Vì vậy, bất cứ khi nào bạn có văn bản, thông thường bạn sẽ thấy chúng được đặt bên trong một bộ dấu ngoặc kép. + +96 +00:07:59,160 --> 00:08:07,050 +Điều này là để phân biệt với các từ dành riêng như, bạn biết đấy, tôi hoặc a hoặc h giới thiệu. + +97 +00:08:07,080 --> 00:08:08,820 +Đây đều là những từ đặc biệt. + +98 +00:08:08,820 --> 00:08:13,890 +Và để chứng tỏ rằng bạn không tạo ra điều gì đặc biệt, bạn chỉ đang trỏ đến URL của chúng tôi, đây + +99 +00:08:13,890 --> 00:08:15,210 +chỉ là một đoạn văn bản. + +100 +00:08:15,240 --> 00:08:17,670 +Chúng tôi có dấu ngoặc kép của chúng tôi xung quanh nó. + +101 +00:08:18,420 --> 00:08:26,380 +Bên trong đây, tôi sẽ dán URL của tìm kiếm sản phẩm, và bây giờ tôi có một liên kết cho mình và nếu tôi tiếp tục và hiển + +102 +00:08:26,380 --> 00:08:32,590 +thị bản xem trước, thì bạn sẽ thấy rằng chúng tôi đã có một mục trong danh sách của mình. + +103 +00:08:32,590 --> 00:08:39,580 +Và khi tôi nhấp vào nó, nó sẽ chuyển đến trang web mà tôi đã liên kết. + +104 +00:08:39,760 --> 00:08:47,410 +Bạn có thể lặp lại quá trình này và liên kết đến tất cả năm trang web yêu thích của mình và bạn sẽ nhận + +105 +00:08:47,410 --> 00:08:50,680 +được một cái gì đó giống như thế này. + +106 +00:08:50,680 --> 00:08:58,510 +Và như một thử thách bổ sung, tôi muốn bạn chuyển đến tài liệu dành cho nhà phát triển về danh sách được sắp xếp mà bạn + +107 +00:08:58,540 --> 00:09:01,750 +đang sử dụng trong bài tập mã hiện tại này. + +108 +00:09:01,750 --> 00:09:03,850 +Và nhìn vào các thuộc tính. + +109 +00:09:04,000 --> 00:09:12,130 +Tôi muốn bạn xem liệu bạn có thể thay đổi một trong các thuộc tính, thuộc tính bắt đầu, để + +110 +00:09:12,130 --> 00:09:17,290 +danh sách của bạn, thay vì bắt đầu từ một bắt đầu từ năm. + +111 +00:09:17,470 --> 00:09:19,300 +Đây là những gì bạn đang hướng tới. + +112 +00:09:19,390 --> 00:09:23,950 +Tạm dừng video, thử xem và sau đó chúng ta sẽ cùng nhau tìm ra giải pháp. + +113 +00:09:26,750 --> 00:09:28,940 +Chúng ta hãy xem tài liệu. + +114 +00:09:28,940 --> 00:09:31,400 +Chúng ta có thể thấy điều đó đối với danh sách có thứ tự. + +115 +00:09:31,430 --> 00:09:34,370 +Một trong những thuộc tính được gọi là START. + +116 +00:09:34,460 --> 00:09:42,680 +Và trong phần giải thích, nó nói, Tất cả những gì chúng ta phải làm là đặt thuộc tính này thành một số để nó + +117 +00:09:42,680 --> 00:09:43,430 +bắt đầu. + +118 +00:09:43,430 --> 00:09:45,020 +Vì vậy, đó là khá đơn giản. + +119 +00:09:45,020 --> 00:09:47,690 +Nhưng chúng ta cần nhớ các thuộc tính của chúng ta đi đâu. + +120 +00:09:47,690 --> 00:09:55,250 +Vì vậy, họ đi vào thẻ bắt đầu, ở đây, và tên của thuộc tính là Bắt đầu, và chúng ta có + +121 +00:09:55,250 --> 00:09:57,140 +thể đặt nó bằng năm. + +122 +00:09:57,170 --> 00:10:02,930 +Bây giờ khi chúng tôi đã hoàn thành việc đó, nếu chúng tôi xem trang web của chúng tôi, bạn có thể thấy danh sách + +123 +00:10:02,930 --> 00:10:07,970 +đơn hàng hiện bắt đầu từ năm và kết thúc lúc chín giờ vì chúng tôi đã thay đổi thuộc tính đó. + +124 +00:10:08,390 --> 00:10:12,680 +Hy vọng rằng điều đó không quá khó khăn và bạn đã xoay sở để làm cho nó hoạt động. + +125 +00:10:12,710 --> 00:10:17,390 +Xem lại nhanh các khái niệm được đề cập trong bài học này. + +126 +00:10:17,390 --> 00:10:21,920 +Và hãy nhớ rằng, chúng ta luôn cố gắng lặp lại những điều đã học trước đó chỉ để + +127 +00:10:21,920 --> 00:10:25,830 +đảm bảo rằng chúng ta củng cố những phần kiến thức đó từ trước đó. + +128 +00:10:25,830 --> 00:10:32,220 +Và một điều tôi thích làm khi học là ghi chú lại những điều mới mẻ đối với tôi mà trước đây + +129 +00:10:32,220 --> 00:10:33,600 +tôi không nhận ra. + +130 +00:10:33,600 --> 00:10:38,700 +Vì vậy, nếu có điều gì mới trong bài học này mà bạn muốn viết ra, hãy ghi nhanh lại và sau đó + +131 +00:10:38,700 --> 00:10:42,840 +chuyển sang bài học tiếp theo, nơi chúng ta nói về các yếu tố hình ảnh. + +132 +00:10:43,230 --> 00:10:44,850 +Đối với tất cả điều đó và nhiều hơn nữa. + +133 +00:10:44,850 --> 00:10:45,450 +Tôi sẽ gặp bạn ở đó. + diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 3.3-Image-Elements.zip b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 3.3-Image-Elements.zip new file mode 100644 index 0000000000000000000000000000000000000000..16b825fa25ee9e52f82f4f6159eac0d71b2270c0 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 3.3-Image-Elements.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e1ccf5ea18ce0be14af6e343c01cfba58e4cd8319f23a6ced47e859bab43593 +size 2303406 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 Image Elements.mp4 b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 Image Elements.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ca29f50765c062c84f392ba6ea50759740eda6a5 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 Image Elements.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9197372d219b7edabddc427b47f92121acd0e4071fa605f5d6d23b215ff64c95 +size 75520570 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 Image Elements_vi.srt b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 Image Elements_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0b5ccdf91f39f77dd1b5dc5fd3ad955912e4099d --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/005 Image Elements_vi.srt @@ -0,0 +1,408 @@ +1 +00:00:00,170 --> 00:00:04,490 +Bây giờ, một trang web sẽ khá nhàm chán nếu không có hình ảnh trên đó, phải không? + +2 +00:00:04,490 --> 00:00:11,330 +Vì vậy, trong bài học này, chúng ta sẽ học cách thêm hình ảnh vào trang web của mình bằng phần tử hình ảnh. + +3 +00:00:11,720 --> 00:00:13,430 +Bây giờ đây là những gì nó trông giống như. + +4 +00:00:13,430 --> 00:00:14,660 +Nó khá đơn giản. + +5 +00:00:14,660 --> 00:00:20,630 +Và bạn sẽ nhận thấy rằng tương tự như thẻ neo hoặc phần tử neo mà chúng ta đã học + +6 +00:00:20,630 --> 00:00:27,950 +trong bài học trước, thành phần chính của thẻ hình ảnh hiển thị hình ảnh là thuộc tính này, + +7 +00:00:27,950 --> 00:00:30,410 +được gọi là nguồn hoặc SRC. + +8 +00:00:30,950 --> 00:00:38,810 +Và điều này làm là nó cho phần tử hình ảnh biết đâu là nguồn gốc của hình ảnh. + +9 +00:00:39,710 --> 00:00:47,510 +Và đó là lý do tại sao sau dấu bằng, giá trị sẽ là vị trí của hình ảnh. + +10 +00:00:48,650 --> 00:00:56,300 +Một điều cuối cùng cần lưu ý về thẻ hình ảnh là, không giống như thẻ neo, nó không có thẻ + +11 +00:00:56,330 --> 00:00:56,960 +đóng. + +12 +00:00:56,960 --> 00:01:03,540 +Thay vào đó, nó là thẻ tự đóng, còn được gọi là phần tử void. + +13 +00:01:03,570 --> 00:01:09,390 +Hãy nhớ rằng, trước đây chúng ta đã học về các phần tử void, nơi chúng ta biết rằng bạn có thể có các phần + +14 +00:01:09,390 --> 00:01:12,540 +tử quy tắc ngang, bạn cũng có thể có các phần tử ngắt. + +15 +00:01:12,540 --> 00:01:19,230 +Và tương tự phần tử image cũng là phần tử void không có thẻ đóng. + +16 +00:01:19,230 --> 00:01:23,150 +Bởi vì nếu bạn nghĩ về nó, nội dung văn bản của một hình ảnh là gì? + +17 +00:01:23,170 --> 00:01:24,390 +Không thực sự có ý nghĩa, phải không? + +18 +00:01:24,390 --> 00:01:29,970 +Nội dung chính thực sự là hình ảnh sẽ được hiển thị từ nguồn. + +19 +00:01:30,390 --> 00:01:31,800 +điều này như thế nào? + +20 +00:01:31,800 --> 00:01:39,810 +Chà, đây là một yếu tố hình ảnh ví dụ mà chúng tôi đã đặt nguồn thành một bức ảnh trực tiếp ngoài đời thực trên Internet. + +21 +00:01:40,110 --> 00:01:44,940 +Bây giờ, khi mã này được hiển thị trên một trang web, nó sẽ hiển thị một hình ảnh ngẫu nhiên. + +22 +00:01:44,940 --> 00:01:48,570 +Vì vậy, trong trường hợp này, hình ảnh ngẫu nhiên mà tôi nhận được là một khu rừng. + +23 +00:01:48,780 --> 00:01:56,430 +Và lý do nó ngẫu nhiên là vì tôi lấy những bức ảnh này từ một nguồn có tên là pixham. ảnh. + +24 +00:01:56,430 --> 00:02:02,460 +Vì vậy, nếu bạn nhập nội dung này vào trình duyệt của mình, bạn sẽ thấy một trang web và ý tưởng này + +25 +00:02:02,460 --> 00:02:05,310 +giống như Lorem ipsum dành cho ảnh giữ chỗ. + +26 +00:02:05,310 --> 00:02:11,220 +Vì vậy, khi bạn không thực sự quan tâm bức ảnh đó là gì, nhưng bạn cần một bức ảnh trên trang + +27 +00:02:11,220 --> 00:02:17,070 +web của mình khi bạn đang tạo nó để xem nó trông như thế nào, thì bạn có thể sử dụng trang + +28 +00:02:17,100 --> 00:02:21,390 +web này và bạn có thể nhập URL , đó là tiêu chuẩn như ở đây. + +29 +00:02:21,390 --> 00:02:26,040 +Và sau dấu gạch chéo về phía trước, bạn có thể thêm kích thước hình ảnh của mình. + +30 +00:02:26,040 --> 00:02:32,640 +Vì vậy, trong trường hợp này, tôi đang nói rằng tôi muốn một hình vuông có kích thước 200 pixel x 200 pixel. + +31 +00:02:32,880 --> 00:02:38,400 +Nó cung cấp cho tôi một hình ảnh ngẫu nhiên từ ngân hàng dữ liệu của nó, ví dụ như trong trường hợp này là một khu rừng. + +32 +00:02:38,670 --> 00:02:47,160 +Thuộc tính khác cho thẻ hình ảnh cực kỳ quan trọng và là thuộc tính mà bạn phải luôn có là thuộc + +33 +00:02:47,160 --> 00:02:48,480 +tính alt. + +34 +00:02:48,690 --> 00:02:53,820 +Và thuộc tính alt là viết tắt của Alternative Text Description. + +35 +00:02:54,030 --> 00:02:59,910 +Điều này thực sự quan trọng vì những người mù hoặc khiếm thị, họ không nhìn Internet giống như + +36 +00:02:59,910 --> 00:03:01,440 +cách chúng ta nhìn. + +37 +00:03:01,440 --> 00:03:03,780 +Họ thường sử dụng một thứ gọi là trình đọc màn hình. + +38 +00:03:03,780 --> 00:03:10,830 +Và điều mà trình đọc màn hình sẽ làm khi chạm vào một hình ảnh là nó sẽ xem xét văn bản thay thế được + +39 +00:03:10,830 --> 00:03:11,760 +cung cấp. + +40 +00:03:11,760 --> 00:03:17,460 +Vì vậy, trong trường hợp này, tôi đã cung cấp rằng đây là khu rừng lúc hoàng hôn hoặc bình minh. + +41 +00:03:17,460 --> 00:03:22,830 +Tôi không chắc lắm, nhưng điều đó có nghĩa là người khiếm thị sẽ đọc nội dung này + +42 +00:03:22,830 --> 00:03:26,760 +cho họ nghe và nó sẽ giúp họ hiểu nội dung của trang web. + +43 +00:03:26,790 --> 00:03:29,400 +Vậy quy trình này như thế nào? + +44 +00:03:29,610 --> 00:03:36,840 +Ví dụ: tôi đang sử dụng Thanh công cụ Silktide, một tiện ích mở rộng của trình duyệt Chrome, để mô phỏng nội dung mà + +45 +00:03:36,870 --> 00:03:40,530 +một người khiếm thị có thể nghe thấy khi họ đang duyệt. + +46 +00:03:40,530 --> 00:03:42,420 +Trong trường hợp này, trang web BBC. + +47 +00:03:42,510 --> 00:03:48,300 +Khi tôi nhấp qua phần tiếp theo, bạn có thể thấy nó mô tả những thứ khác nhau trên màn hình. + +48 +00:03:48,300 --> 00:03:53,670 +Và nếu tôi xem qua hình ảnh, nó sẽ mô tả hình ảnh đó cho tôi. + +49 +00:03:55,380 --> 00:03:58,740 +Tiết hai Hình ảnh cá heo nhảy từ biển. + +50 +00:03:58,770 --> 00:04:01,470 +Vậy nó lấy mô tả này từ đâu? + +51 +00:04:01,470 --> 00:04:08,070 +Chà, nếu chúng ta nhấp chuột phải vào hình ảnh và kiểm tra nó, và nếu chúng ta tìm kiếm hình ảnh mà tôi nghĩ + +52 +00:04:08,100 --> 00:04:14,490 +nên ở dưới đây, bạn có thể thấy khi tôi đánh dấu các phần khác nhau, nó sẽ cho tôi biết phần nào. + +53 +00:04:14,490 --> 00:04:22,350 +Vì vậy, trong phần tử này, tôi có thể sẽ tìm thấy một hình ảnh ở cuối ngay tại đây và bạn có thể thấy văn bản thay + +54 +00:04:22,380 --> 00:04:25,590 +thế nói rằng cá heo đang nhảy lên từ biển. + +55 +00:04:25,590 --> 00:04:30,630 +Và đó là những gì được đọc ra từ trình đọc màn hình giúp đỡ ai đó bị mù. + +56 +00:04:30,660 --> 00:04:33,570 +Có thể hiểu những gì trên trang web này. + +57 +00:04:34,410 --> 00:04:40,860 +Bây giờ, nếu bạn muốn dùng thử công cụ này, thì đó là một tiện ích mở rộng của trình duyệt Chrome có tên là Silktide + +58 +00:04:40,860 --> 00:04:48,030 +và nó phải là một plugin miễn phí, nhưng nó có thể chỉ hoạt động trên Mac hoặc một số phiên bản Windows nhất định, nhưng nó không + +59 +00:04:48,030 --> 00:04:55,590 +nói nhiều về công cụ này, nhưng tôi muốn cho bạn thấy tầm quan trọng của văn bản thay thế mà bạn cung cấp cho khả năng truy cập và cho người + +60 +00:04:55,590 --> 00:04:58,620 +dùng bị vô hiệu hóa đang duyệt trang web của bạn. + +61 +00:04:58,710 --> 00:04:59,730 +Bây giờ chúng ta hãy thử. + +62 +00:04:59,780 --> 00:05:02,930 +Một bài tập và tạo ra một số hình ảnh của riêng chúng tôi. + +63 +00:05:03,080 --> 00:05:10,280 +Tải xuống tệp zip từ bài học hiện tại này và tiếp tục kéo tệp đó vào thư mục dự án phát triển web + +64 +00:05:10,280 --> 00:05:13,400 +của bạn và mở tệp bên trong so với mã. + +65 +00:05:13,610 --> 00:05:21,110 +Nếu bạn xem bên trong tệp index. html, bạn có thể thấy tôi đã cung cấp cho bạn hai ví dụ về URL hình ảnh + +66 +00:05:21,110 --> 00:05:22,320 +mà bạn có thể sử dụng. + +67 +00:05:22,340 --> 00:05:28,610 +Và mục tiêu của chúng tôi là tìm hiểu xem bạn là người thích mèo hay bạn thích chó. + +68 +00:05:28,760 --> 00:05:34,430 +Tôi muốn bạn tạo một H1 cho biết tôi là người yêu mèo hoặc tôi là người yêu chó. + +69 +00:05:34,430 --> 00:05:39,350 +Và tôi cũng muốn bạn thêm một yếu tố hình ảnh ngay sau đó. + +70 +00:05:39,380 --> 00:05:44,970 +Bây giờ bạn có thể sử dụng URL cho con chó hoặc con mèo. + +71 +00:05:44,990 --> 00:05:50,960 +Điều đó không thực sự quan trọng vào cuối ngày, miễn là bạn hiểu cách tạo hình ảnh. + +72 +00:05:51,140 --> 00:05:52,640 +Đó là thách thức. + +73 +00:05:52,670 --> 00:05:55,760 +Tạm dừng video và tiếp tục. + +74 +00:05:58,260 --> 00:05:58,680 +Được rồi. + +75 +00:05:58,680 --> 00:06:02,280 +Vì vậy, về mặt cá nhân, tôi là một người thích chó hơn. + +76 +00:06:02,280 --> 00:06:08,680 +Và nếu bạn cũng là một người yêu chó, thì bạn có thể thấy quả trứng Phục sinh nhỏ của tôi mà tôi đã chôn trong đó. + +77 +00:06:08,700 --> 00:06:16,570 +Vì vậy, trước tiên, hãy tiếp tục và tạo H1 của chúng ta, sau đó chúng ta sẽ tạo hình ảnh của mình. + +78 +00:06:16,590 --> 00:06:22,530 +Hãy nhớ rằng, chúng tôi tạo một thẻ hình ảnh và đó là thẻ tự đóng. + +79 +00:06:22,560 --> 00:06:33,630 +Sau đó, chúng tôi thêm nguồn của mình làm nguồn hình ảnh và chúng tôi sẽ đặt URL của mình ngay bên trong đó. + +80 +00:06:34,110 --> 00:06:40,650 +Bây giờ, nếu chúng ta tiếp tục và hiển thị bản xem trước, bạn có thể thấy chú chó nhỏ của chúng ta đang đào cát. + +81 +00:06:40,680 --> 00:06:46,350 +Vì nếu bạn để ý thì thực chất đây là ảnh gif. + +82 +00:06:46,620 --> 00:06:52,200 +Ảnh GIF hoạt động giống hệt như ảnh bình thường, JPEG hoặc PNG. + +83 +00:06:52,230 --> 00:06:57,780 +Miễn là bạn đặt nó vào nguồn, nó sẽ được hiển thị trong một trang web và nó sẽ bắt đầu hoạt + +84 +00:06:57,880 --> 00:06:58,990 +ảnh hoặc tự nó. + +85 +00:06:58,990 --> 00:07:01,810 +Và bạn có một chú chó nhỏ dễ thương đang đào cát. + +86 +00:07:02,110 --> 00:07:08,500 +Bây giờ nếu bạn là một người thích mèo, thì đây chỉ là một jpeg tĩnh vì mèo lạnh lùng hơn. + +87 +00:07:09,790 --> 00:07:12,880 +Vì vậy, tôi hy vọng bạn quản lý để có được phần đó đúng. + +88 +00:07:13,120 --> 00:07:17,530 +Nhưng chúng tôi vẫn chưa hoàn thành việc tạo thành phần hình ảnh của mình. + +89 +00:07:17,560 --> 00:07:20,530 +Hãy nhớ những gì tôi đã nói về thẻ alt? + +90 +00:07:20,530 --> 00:07:25,990 +Bạn nên luôn thêm thẻ alt để mô tả hình ảnh của mình khi có thể. + +91 +00:07:26,020 --> 00:07:31,990 +Bây giờ, có một số trường hợp bạn không tạo thẻ alt vì nó không thực sự liên quan đến việc ai đó đọc + +92 +00:07:31,990 --> 00:07:36,400 +qua nội dung của trang web và trên thực tế, bạn có thể để trống thẻ này. + +93 +00:07:36,850 --> 00:07:38,710 +Nhưng trong trường hợp này, nó rất đơn giản. + +94 +00:07:38,710 --> 00:07:43,630 +Chúng tôi có một con chó con đang đào cát. + +95 +00:07:44,800 --> 00:07:51,970 +Và bây giờ khi chúng tôi xem bản xem trước của mình, thì không có gì thay đổi về mặt trực quan đối với chúng tôi. + +96 +00:07:51,970 --> 00:07:57,550 +Nhưng đằng sau hậu trường, chúng tôi sẽ giúp những người bạn khiếm thị của chúng tôi có thể hiểu trang web của chúng + +97 +00:07:57,550 --> 00:07:58,900 +tôi tốt hơn một chút. + +98 +00:07:59,230 --> 00:08:03,310 +Vì vậy, tôi hy vọng bạn quản lý để đạt được một trong những mục tiêu này. + +99 +00:08:03,310 --> 00:08:09,130 +Và khi bạn đã sẵn sàng, chúng ta có thể chuyển sang bài học tiếp theo, nơi chúng ta có dự án cuối cùng để + +100 +00:08:09,160 --> 00:08:14,410 +tạo một trang web mời sinh nhật bằng tất cả các kỹ năng mà chúng ta đã học được cho đến nay. + +101 +00:08:14,410 --> 00:08:16,250 +Vì vậy, tất cả điều đó và nhiều hơn nữa. + +102 +00:08:16,270 --> 00:08:17,110 +Tôi sẽ gặp bạn ở đó. + diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 3.4-Birthday-Invite-Project.zip b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 3.4-Birthday-Invite-Project.zip new file mode 100644 index 0000000000000000000000000000000000000000..c87e027b39a1b08c15865ee8a23f65e7c6f96377 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 3.4-Birthday-Invite-Project.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18f79467c070017dee56fb228853878198b3ca957239ccdf7618ac065220ad6c +size 1562658 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 Day 42 Project - Birthday Invite Website.mp4 b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 Day 42 Project - Birthday Invite Website.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e14ae3cd73ebcbb5d60fe9135d2a0993eb5c2700 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 Day 42 Project - Birthday Invite Website.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63f5e725ca6846444375a00a3d258c13b73bbb778b819a7646c3f7e1771ccfc3 +size 57870733 diff --git a/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 Day 42 Project - Birthday Invite Website_vi.srt b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 Day 42 Project - Birthday Invite Website_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ed04fd983bce64048b372ce9bc2af580ce8ff2a2 --- /dev/null +++ b/part3/42 - Day 42 - Web Foundation - Intermediate HTML/006 Day 42 Project - Birthday Invite Website_vi.srt @@ -0,0 +1,224 @@ +1 +00:00:01,040 --> 00:00:01,490 +Được rồi. + +2 +00:00:01,490 --> 00:00:07,060 +Đã đến lúc kết hợp mọi thứ chúng ta đã học được cho đến nay và tạo một dự án. + +3 +00:00:07,070 --> 00:00:13,760 +Trong dự án này, chúng tôi sẽ tạo một trang web cho bữa tiệc tiếp theo của bạn để giúp bạn mời tất cả khách của mình. + +4 +00:00:13,760 --> 00:00:19,880 +Bởi vì giấy mời và lời mời WhatsApp chỉ dành cho những người không thể tạo trang web. + +5 +00:00:20,420 --> 00:00:21,230 +Tôi có đúng không? + +6 +00:00:21,710 --> 00:00:23,540 +Chúng tôi có thể làm điều đó tốt hơn. + +7 +00:00:23,570 --> 00:00:25,400 +Đây là những gì chúng tôi đang hướng tới. + +8 +00:00:25,430 --> 00:00:31,970 +Chúng tôi đang nhắm đến một trang web có giao diện hoài cổ của những năm 90 bởi vì chúng tôi chưa tìm hiểu về các trang web tạo kiểu, + +9 +00:00:31,970 --> 00:00:34,970 +điều này vẫn chưa xuất hiện, nhưng điều này đã khá tốt rồi. + +10 +00:00:34,970 --> 00:00:41,630 +Chúng tôi sẽ tạo một trang web để nói với mọi người rằng hôm nay là sinh nhật của chúng tôi, hôm nay là ngày nào và chúng + +11 +00:00:41,630 --> 00:00:43,460 +tôi sẽ thêm một số hình ảnh. + +12 +00:00:43,490 --> 00:00:46,790 +Chúng tôi sẽ cho mọi người biết cần mang theo những gì bằng cách sử dụng danh sách. + +13 +00:00:46,790 --> 00:00:51,140 +Và chúng tôi cũng sẽ thêm một thẻ neo để hiển thị cho mọi người nơi họ cần đến. + +14 +00:00:51,320 --> 00:00:55,970 +Hy vọng rằng chúng ta sẽ kết hợp nhiều điều mà bạn đã học được trong các bài học trước. + +15 +00:00:55,970 --> 00:01:01,290 +Và khi bạn đã sẵn sàng, hãy chuyển đến tài nguyên khóa học cho bài học này. + +16 +00:01:01,290 --> 00:01:05,160 +Tải xuống và giải nén tệp zip để bắt đầu. + +17 +00:01:05,190 --> 00:01:12,900 +Khi bạn nhìn vào index. html, bạn có thể thấy tôi đã cung cấp URL hình ảnh mẫu và liên kết + +18 +00:01:12,930 --> 00:01:14,040 +Google Maps mẫu. + +19 +00:01:14,040 --> 00:01:19,650 +Vì vậy, nếu bạn nhìn vào bên trong mục tiêu, bạn có thể thấy hình ảnh ví dụ sẽ đưa bạn đến đâu. + +20 +00:01:19,650 --> 00:01:25,230 +Và nếu bạn đã sẵn sàng cho một bất ngờ nho nhỏ chém trứng Phục sinh, bạn có thể truy cập liên + +21 +00:01:25,230 --> 00:01:27,990 +kết bản đồ Google và xem vị trí của nó. + +22 +00:01:28,440 --> 00:01:32,580 +Vì vậy, đây là một dự án và nó không phải là một bài tập mã hóa. + +23 +00:01:32,580 --> 00:01:35,520 +Đó không phải là thứ mà tôi đang kiểm tra bạn. + +24 +00:01:35,550 --> 00:01:36,780 +Tất cả mọi thứ tôi đang nói. + +25 +00:01:36,780 --> 00:01:38,430 +Nó chỉ là một hướng dẫn. + +26 +00:01:38,430 --> 00:01:47,610 +Tôi muốn bạn ở mức tối thiểu, có một hình ảnh trong đó, có một danh sách trong đó và cũng có một thẻ liên kết trong + +27 +00:01:47,610 --> 00:01:48,360 +đó. + +28 +00:01:48,660 --> 00:01:51,120 +Mọi thứ khác hoàn toàn phụ thuộc vào bạn. + +29 +00:01:51,120 --> 00:01:56,010 +Bạn có thể loay hoay với nó bao nhiêu tùy thích hoặc thay đổi bao nhiêu tùy thích, hoặc giữ nó đơn giản như + +30 +00:01:56,010 --> 00:01:56,550 +bạn muốn. + +31 +00:01:56,550 --> 00:01:58,110 +Nó không thực sự quan trọng. + +32 +00:01:58,140 --> 00:02:05,760 +Tạm dừng video và bắt đầu dự án này và chúc mừng sinh nhật nếu hôm nay là sinh nhật của bạn. + +33 +00:02:09,050 --> 00:02:09,500 +Được rồi. + +34 +00:02:09,500 --> 00:02:13,190 +Vì vậy, muốn đi qua một giải pháp có thể? + +35 +00:02:13,490 --> 00:02:16,430 +Tôi chỉ muốn nói rằng đây chỉ là một khả năng. + +36 +00:02:16,460 --> 00:02:18,680 +Bạn có thể thay đổi nó nhiều như bạn muốn. + +37 +00:02:18,680 --> 00:02:20,900 +Không có đúng hay sai trong dự án. + +38 +00:02:20,930 --> 00:02:24,970 +Đó là tất cả về thực hành và cũng là phong cách cá nhân của riêng bạn. + +39 +00:02:24,980 --> 00:02:30,590 +Vì vậy, trong trường hợp của tôi, tôi đã tạo H1 cho tiêu đề cấp cao nhất, đây là điều quan trọng nhất. + +40 +00:02:30,590 --> 00:02:36,170 +Đó là sinh nhật của tôi và sau đó tôi có một số h2 và một số H3. + +41 +00:02:36,200 --> 00:02:42,110 +Vì vậy, những gì cần mang theo và nơi bạn cần đến trong thẻ hình ảnh. + +42 +00:02:42,110 --> 00:02:50,000 +Tôi đã thêm một nguồn vào hình ảnh mà tôi đã cung cấp trong mã bắt đầu và tôi cũng đã cung cấp một văn bản thay thế + +43 +00:02:50,000 --> 00:02:53,840 +để cho mọi người thấy hình ảnh này nói về điều gì. + +44 +00:02:54,560 --> 00:03:01,370 +Nếu bạn quản lý để lấy nguồn hình ảnh và văn bản thay thế và hình ảnh của bạn hiển thị, thì xin chúc mừng. + +45 +00:03:01,370 --> 00:03:02,600 +Bạn đã làm một công việc tuyệt vời. + +46 +00:03:02,630 --> 00:03:09,720 +Bây giờ, phần tiếp theo tôi có là một danh sách không có thứ tự để cho mọi người biết họ nên mang theo những gì với mỗi mục + +47 +00:03:09,720 --> 00:03:12,660 +trong thành phần mục danh sách của chính nó. + +48 +00:03:12,660 --> 00:03:17,790 +Và cuối cùng, tôi đã tạo một thẻ neo để cho mọi người biết nơi họ cần đến. + +49 +00:03:17,790 --> 00:03:25,470 +Vì vậy, tôi đã thêm một thuộc tính href và tôi đã sử dụng liên kết mà tôi đã cung cấp trong mã bắt đầu và tôi đã nói với mọi + +50 +00:03:25,470 --> 00:03:33,660 +người rằng văn bản liên kết là một liên kết bản đồ của Google, hy vọng rằng liên kết này sẽ đưa họ đến nơi họ cần đến, đó là một nơi + +51 +00:03:33,660 --> 00:03:38,400 +nào đó trong Tokyo nơi tất cả những người bồ câu gặp nhau, rõ ràng. + +52 +00:03:39,300 --> 00:03:42,660 +Vì vậy, nếu bạn tìm thấy quả trứng Phục sinh đó, thì xin chúc mừng. + +53 +00:03:43,020 --> 00:03:48,270 +Nhưng nếu bạn thực sự tự hào về những gì bạn đã làm được cho dự án của mình, thì hãy nhớ chụp ảnh màn hình của nó và đăng + +54 +00:03:48,300 --> 00:03:51,810 +nó trong phần Hỏi & Đáp để chia sẻ với những người còn lại trong chúng tôi. + +55 +00:03:51,810 --> 00:03:56,640 +Tôi rất muốn xem những gì bạn nghĩ ra, nhưng đó là tất cả từ tôi cho phần này. + +56 +00:03:56,640 --> 00:04:01,710 +Tôi hy vọng bạn thích tìm hiểu thêm về các phần tử HTML và tôi sẽ sớm gặp lại bạn. + diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/001 Why do we need CSS.mp4 b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/001 Why do we need CSS.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e75044a58896420b2c437213dafae1ca2e5c8737 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/001 Why do we need CSS.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5b9c1a54710645c178ff74e4eefbbbe5b3a6ba8e9d359d3d2b37f74539e9acf +size 141738800 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/001 Why do we need CSS_vi.srt b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/001 Why do we need CSS_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c18579bbbeac9acda4d55ab6ad931356d19f72aa --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/001 Why do we need CSS_vi.srt @@ -0,0 +1,412 @@ +1 +00:00:00,380 --> 00:00:05,689 +Xin chào các bạn, chào mừng đến với phần giới thiệu về CSS. + +2 +00:00:05,689 --> 00:00:10,430 +Và trong bài học đầu tiên này, chúng tôi sẽ giới thiệu với bạn về CSS. + +3 +00:00:10,460 --> 00:00:16,760 +Bạn sẽ tìm hiểu nó là gì, nó hoạt động như thế nào và tại sao chúng ta cần nó để có thể tạo kiểu cho các trang web của mình + +4 +00:00:16,760 --> 00:00:18,740 +và làm cho chúng trông đẹp mắt. + +5 +00:00:19,400 --> 00:00:21,470 +CSS chính xác là gì? + +6 +00:00:21,500 --> 00:00:25,610 +Chà, nó là viết tắt của cascading style sheet. + +7 +00:00:25,640 --> 00:00:29,270 +Nó gợi lên hình ảnh của một dòng thác. + +8 +00:00:29,270 --> 00:00:29,570 +Phải. + +9 +00:00:29,600 --> 00:00:33,540 +Và một thác nước đơn giản giống như một thác nước. + +10 +00:00:33,560 --> 00:00:39,880 +Bạn có nước ở một cấp độ, sau đó chảy xuống thác nước ở một cấp độ khác. + +11 +00:00:39,890 --> 00:00:46,940 +Và chúng ta sẽ xem khi chúng ta bắt đầu sử dụng các biểu định kiểu xếp tầng này, tại sao phép loại suy đó lại phù hợp đến vậy. + +12 +00:00:46,940 --> 00:00:51,960 +Bởi vì cách mà phong cách được áp dụng theo tầng như thác nước. + +13 +00:00:51,980 --> 00:00:59,000 +Chúng tôi bắt đầu từ những điều chung chung nhất cho đến các yêu cầu về kiểu dáng cụ thể nhất và chúng tôi sẽ thấy điều + +14 +00:00:59,000 --> 00:01:03,560 +đó được sử dụng khi chúng tôi sử dụng các biểu định kiểu xếp tầng này. + +15 +00:01:03,800 --> 00:01:07,550 +Phần khác của tên này là biểu định kiểu. + +16 +00:01:07,820 --> 00:01:17,150 +Biểu định kiểu là một loại ngôn ngữ tương tự như cách chúng ta có HTML, là ngôn ngữ đánh dấu. + +17 +00:01:17,150 --> 00:01:20,810 +Đó là những gì một phần của viết tắt cho. + +18 +00:01:21,200 --> 00:01:29,150 +Chúng tôi có biểu định kiểu, đó là ý nghĩa của phần SS và đây là ngôn ngữ cho phép chúng tôi chỉ định mọi thứ + +19 +00:01:29,150 --> 00:01:33,200 +sẽ trông như thế nào trong trang web của chúng tôi. + +20 +00:01:33,200 --> 00:01:36,770 +Và có rất nhiều loại ngôn ngữ stylesheet khác nhau. + +21 +00:01:36,800 --> 00:01:42,710 +Điều quan trọng nhất và chúng ta sẽ tìm hiểu tất cả về phần này là biểu định kiểu xếp + +22 +00:01:42,710 --> 00:01:43,340 +tầng. + +23 +00:01:43,550 --> 00:01:52,520 +Nhưng cũng có những thứ khác như Sass, viết tắt của cú pháp tuyệt vời biểu định kiểu và Ít hơn, viết + +24 +00:01:52,520 --> 00:01:57,110 +tắt của Leaner CSS và nhiều, nhiều thứ khác. + +25 +00:01:57,110 --> 00:02:03,530 +Nhưng điều quan trọng nhất mà mọi nhà phát triển web cần biết là CSS. + +26 +00:02:03,530 --> 00:02:05,990 +Và đó là những gì chúng ta sẽ tập trung vào ngày hôm nay. + +27 +00:02:06,290 --> 00:02:09,770 +Vậy tại sao chúng ta cần CSS? + +28 +00:02:09,800 --> 00:02:14,030 +Nó đến từ đâu và lịch sử chính xác của toàn bộ điều này là gì? + +29 +00:02:14,060 --> 00:02:20,820 +Chà, ngay từ đầu khi Internet còn rất, rất mới, không có CSS, chỉ có + +30 +00:02:21,090 --> 00:02:21,800 +HTML. + +31 +00:02:21,810 --> 00:02:28,350 +Và một trong những điều mà các nhà phát triển bắt đầu muốn làm là họ muốn tạo phong cách cho trang web của mình + +32 +00:02:28,350 --> 00:02:33,830 +và khiến nó trông giống như cách họ muốn, nhưng họ thực sự, thực sự bị giới hạn bởi HTML. + +33 +00:02:33,840 --> 00:02:42,780 +Và đây là một email nổi tiếng hiện nay được gửi bởi Marc Andreessen, người sáng lập ra Mosaic, một trong những trình duyệt Internet + +34 +00:02:42,780 --> 00:02:49,320 +sớm nhất, người sau này thành lập Netscape và giờ là Quỹ đầu tư mạo hiểm Andreessen Horowitz rất + +35 +00:02:49,350 --> 00:02:50,550 +nổi tiếng. + +36 +00:02:50,550 --> 00:02:57,270 +Và trong email này, anh ấy đã nói một cách nổi tiếng rằng câu trả lời mà anh ấy có cho rất nhiều nhà phát triển, những người + +37 +00:02:57,270 --> 00:03:03,810 +chỉ muốn kiểm soát tài liệu của họ trông như thế nào, nghĩa là trang web của họ trông như thế nào theo cách tầm thường, chẳng + +38 +00:03:03,810 --> 00:03:05,880 +hạn như trong Microsoft Word. + +39 +00:03:05,910 --> 00:03:09,330 +Câu trả lời của anh ấy dành cho những nhà phát triển này chỉ là xin lỗi, bạn bị lừa rồi. + +40 +00:03:09,480 --> 00:03:14,430 +Không có cách nào để làm điều đó rất dễ dàng vào thời điểm đó trong HTML. + +41 +00:03:14,590 --> 00:03:17,490 +Đó là lý do tại sao tất cả các trang web trông khá giống nhau. + +42 +00:03:17,490 --> 00:03:18,390 +Khá nhàm chán. + +43 +00:03:18,390 --> 00:03:20,460 +Và không có biến thể. + +44 +00:03:20,460 --> 00:03:21,930 +Vì vậy, những gì đã xảy ra tiếp theo? + +45 +00:03:21,930 --> 00:03:31,140 +Chà, tập đoàn W3C đã phản hồi bằng cách phát hành một phiên bản HTML mới, HTML 3. 2, và nó ra mắt vào năm 1997, vì vậy nó vẫn còn + +46 +00:03:31,140 --> 00:03:35,040 +ở những ngày đầu tiên của Internet. + +47 +00:03:35,160 --> 00:03:44,700 +Và cái gì đây 3. 2 HTML được cho phép là nó đã giới thiệu các thẻ HTML mới như thẻ phông chữ, thẻ này + +48 +00:03:44,700 --> 00:03:48,870 +cho phép bạn xác định kích thước phông chữ, màu sắc và mặt phông chữ. + +49 +00:03:48,870 --> 00:03:52,950 +Vì vậy, loại phông chữ bạn muốn sử dụng cho tài liệu của mình. + +50 +00:03:53,160 --> 00:03:57,630 +Tương tự, cũng có thuộc tính màu cho phông chữ. + +51 +00:03:57,660 --> 00:04:02,670 +Có thuộc tính khuôn mặt, thuộc tính kích thước và những thuộc tính này cho phép bạn thay + +52 +00:04:02,670 --> 00:04:06,360 +đổi tất cả mọi thứ về giao diện của văn bản trên trang web của bạn. + +53 +00:04:06,660 --> 00:04:14,340 +Và sau đó cũng có phần tử trung tâm cho phép bạn định dạng tài liệu của mình và xác định cách nó sẽ được + +54 +00:04:14,340 --> 00:04:16,380 +trình bày trên màn hình. + +55 +00:04:16,470 --> 00:04:23,680 +Bây giờ, điều mà bạn sẽ nhận thấy trong cả ba trang Web này là biểu tượng không được dùng nữa bên cạnh nó. + +56 +00:04:23,700 --> 00:04:31,380 +Tất cả những thứ này đều không được dùng nữa, theo thuật ngữ lập trình, đơn giản có nghĩa là bạn không nên sử dụng + +57 +00:04:31,380 --> 00:04:34,140 +các thuộc tính và thành phần này nữa. + +58 +00:04:34,140 --> 00:04:41,730 +Và lý do cho điều này là bởi vì, như bạn có thể tưởng tượng, HTML của chúng tôi được cho là dành cho nội dung. + +59 +00:04:41,760 --> 00:04:49,710 +Bây giờ, nếu bạn thêm rất nhiều kiểu dáng vào tất cả nội dung đó, bạn sẽ cho trang web biết nội dung đó nên được căn giữa + +60 +00:04:49,710 --> 00:04:56,400 +như thế nào, bố cục ra sao, phông chữ sẽ trông như thế nào, màu sắc của nội dung đó, loại đường viền + +61 +00:04:56,400 --> 00:05:01,680 +của bạn. các bảng nên có và một loạt các kiểu dáng khác một cách hiệu quả. + +62 +00:05:01,710 --> 00:05:06,990 +Sau đó, điều này sẽ làm lộn xộn toàn bộ HTML của bạn. + +63 +00:05:06,990 --> 00:05:12,600 +Và bạn có thể tưởng tượng đây là một trang web thực sự, rất ngắn và nó đã có quá nhiều thứ rác rưởi + +64 +00:05:12,600 --> 00:05:18,510 +trong đó đến mức chúng ta không thể biết chính xác cấu trúc và nội dung của trang web là gì. + +65 +00:05:18,530 --> 00:05:24,560 +Nếu bạn mở rộng nó sang một trang web lớn hơn và bạn chỉ muốn thực hiện một số thao tác + +66 +00:05:24,560 --> 00:05:32,270 +đơn giản như thêm một số màu sắc hoặc đặt mọi thứ vào trung tâm, thì toàn bộ tệp HTML của bạn sẽ dài rất nhiều + +67 +00:05:32,270 --> 00:05:37,790 +hàng nghìn dòng và điều đó là không thể để phân biệt nội dung với kiểu dáng. + +68 +00:05:38,060 --> 00:05:40,340 +Vì vậy, những gì đã xảy ra tiếp theo? + +69 +00:05:40,880 --> 00:05:52,940 +Chà, vào năm 1996, một khuyến nghị mới đã được đề xuất bởi tập đoàn W3 và điều này được dẫn dắt bởi Hakon Wium. + +70 +00:05:53,930 --> 00:05:56,180 +Làm thế nào mà? + +71 +00:05:56,420 --> 00:05:59,980 +Làm thế nào đến bởi làm thế nào đến? + +72 +00:05:59,990 --> 00:06:04,250 +Và về cơ bản, anh ấy là cha đẻ của biểu định kiểu xếp tầng. + +73 +00:06:04,250 --> 00:06:11,540 +Và điều mà đề xuất này cho phép chúng tôi làm là cho phép chúng tôi đính kèm các kiểu như màu phông + +74 +00:06:11,540 --> 00:06:15,380 +chữ và khoảng cách vào tài liệu HTML của mình. + +75 +00:06:15,500 --> 00:06:22,890 +Và đây là bước đột phá cho phép chúng tôi tách phong cách khỏi nội dung. + +76 +00:06:23,010 --> 00:06:31,110 +Và cũng như trong nhiều tình huống khác nhau, sự phân chia các mối quan tâm để ai đó chịu trách nhiệm + +77 +00:06:31,140 --> 00:06:36,750 +lắp đèn pha ô tô và người khác chịu trách nhiệm xử lý bánh xe thay vì một + +78 +00:06:36,750 --> 00:06:39,590 +người chế tạo toàn bộ chiếc ô tô. + +79 +00:06:39,600 --> 00:06:46,710 +Loại mô-đun này, như bạn sẽ thấy trong các bài học sắp tới, là cực kỳ quan trọng, không chỉ trong sản xuất và + +80 +00:06:46,710 --> 00:06:49,830 +trong cuộc sống thực, mà còn trong lập trình. + +81 +00:06:50,100 --> 00:06:54,450 +Nếu bạn muốn xem những gì CSS có thể đạt được. + +82 +00:06:54,540 --> 00:06:57,490 +Tôi đã xây dựng trang web này để bạn có thể làm điều đó. + +83 +00:06:57,510 --> 00:07:05,010 +Nếu bạn truy cập App Brewery, Github. io và sau đó chuyển tiếp Slash, chỉ cần thêm CSS, bạn sẽ có + +84 +00:07:05,010 --> 00:07:06,540 +thể xem trang web này. + +85 +00:07:06,540 --> 00:07:13,020 +Và khi bạn lần đầu tiên đến đó, bạn sẽ thấy rằng đó chỉ là một trang web rất, rất đơn giản, khá nhạt nhẽo. + +86 +00:07:13,050 --> 00:07:15,210 +Tất cả những gì nó có là HTML. + +87 +00:07:15,210 --> 00:07:22,710 +Và bây giờ nếu chúng ta tiếp tục và nhấn nút này để chuyển đổi và bật CSS, thì bạn sẽ thấy toàn bộ trang + +88 +00:07:22,710 --> 00:07:26,300 +web chuyển đổi và trông đẹp hơn rất nhiều. + +89 +00:07:26,340 --> 00:07:30,840 +Bây giờ nó có các phông chữ khác nhau, màu sắc khác nhau và bố cục khác nhau. + +90 +00:07:30,840 --> 00:07:39,270 +Nhưng bạn sẽ nhận thấy rằng nếu bạn tiếp tục và nhấp chuột phải và xem nguồn trang trong hai phiên bản này, thì + +91 +00:07:39,270 --> 00:07:41,580 +HTML không thay đổi chút nào. + +92 +00:07:41,580 --> 00:07:47,320 +Vì vậy, hãy quay lại và sau đó tiếp tục và xem lại nguồn trang. + +93 +00:07:47,340 --> 00:07:49,710 +Bạn sẽ thấy điều đó trong hai phiên bản này. + +94 +00:07:49,710 --> 00:07:56,730 +Khi bạn thấy tôi bật nó trên màn hình, không có gì thay đổi trong chỉ mục của chúng tôi. html. + +95 +00:07:56,820 --> 00:08:02,220 +Điều khác biệt duy nhất là CSS được thêm vào. + +96 +00:08:02,250 --> 00:08:08,910 +Bây giờ, đừng lo lắng quá nhiều về các thẻ tập lệnh ở đây hoặc cách chúng tôi đã tạo các nút của mình. + +97 +00:08:08,910 --> 00:08:12,870 +Chúng ta sẽ học tất cả những điều đó sau khi học JavaScript. + +98 +00:08:13,050 --> 00:08:19,890 +Nhưng tôi đã tạo trang web này để bạn có thể thử bật và tắt CSS để xem cách nó có thể chuyển + +99 +00:08:19,890 --> 00:08:27,000 +đổi một trang web HTML đơn giản mà không cần chạm vào bất kỳ mã nào bên trong HTML. + +100 +00:08:27,000 --> 00:08:34,260 +Và tất cả những gì chúng tôi đang làm là thêm phong cách vào trang web của mình bằng một ngôn ngữ hoàn toàn riêng biệt. + +101 +00:08:34,289 --> 00:08:36,059 +Biểu định kiểu xếp tầng. + +102 +00:08:36,270 --> 00:08:42,570 +Để tìm hiểu thêm về cách thức hoạt động của CSS, hãy chuyển sang bài học tiếp theo, nơi chúng ta sẽ bắt đầu thiết + +103 +00:08:42,570 --> 00:08:43,740 +kế một trang web. + diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 5.1-Adding-CSS.zip b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 5.1-Adding-CSS.zip new file mode 100644 index 0000000000000000000000000000000000000000..634de018da09a49d8dec626050ccc94794606060 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 5.1-Adding-CSS.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fb953a633801df9704dd5beae6fb248535aaeaeb89d8114ab836b939f4bbb95 +size 3160 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 How to add CSS.mp4 b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 How to add CSS.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e0b9cb24722b26f3bc29b25024f0c5a496994a80 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 How to add CSS.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42fc7dd1b745eb395d464f2d6848e629e94d4db6dfda9ea60fbde5003761489c +size 49003694 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 How to add CSS_vi.srt b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 How to add CSS_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f61c39c007a8e876b1100883854a1c345728b0be --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/002 How to add CSS_vi.srt @@ -0,0 +1,676 @@ +1 +00:00:00,320 --> 00:00:07,310 +Bây giờ, tôi hy vọng bạn đã thử với trang web ví dụ này, nơi bạn có thể bật và tắt + +2 +00:00:07,340 --> 00:00:08,029 +CSS. + +3 +00:00:08,300 --> 00:00:13,880 +Chính xác thì tôi đã thêm CSS vào trang web HTML đơn giản này như thế nào? + +4 +00:00:14,270 --> 00:00:17,840 +Vâng, đó là những gì chúng ta sẽ học trong bài học này. + +5 +00:00:18,200 --> 00:00:23,420 +Có ba cách để thêm CSS vào trang web HTML. + +6 +00:00:23,720 --> 00:00:28,670 +Nội tuyến, nội bộ và bên ngoài. + +7 +00:00:28,940 --> 00:00:34,580 +Chúng ta sẽ khám phá cả ba kiểu thêm CSS khác nhau này và tôi sẽ cho bạn thấy lý do tại sao chúng + +8 +00:00:34,580 --> 00:00:39,380 +lại quan trọng và bạn sẽ sử dụng kiểu nào trong những tình huống nào. + +9 +00:00:39,800 --> 00:00:44,840 +Bây giờ, cái đầu tiên là kiểu thêm CSS nội tuyến. + +10 +00:00:44,870 --> 00:00:51,170 +Như tên gợi ý, nó đi vào cùng một dòng với một phần tử HTML cụ thể. + +11 +00:00:51,260 --> 00:00:58,130 +Vì vậy, trong trường hợp này, bạn có thể thấy chúng ta có thẻ mở HTML và thẻ đóng HTML. + +12 +00:00:58,280 --> 00:01:04,640 +Bây giờ, khi tìm hiểu về HTML soạn sẵn, chúng ta biết rằng đây là một thành phần có trong tất cả các tài liệu HTML + +13 +00:01:04,640 --> 00:01:05,570 +của chúng ta. + +14 +00:01:05,690 --> 00:01:08,240 +Không có gì đặc biệt về yếu tố cụ thể này. + +15 +00:01:08,270 --> 00:01:12,830 +Nó chỉ cho trình duyệt biết rằng tệp này được tạo thành từ HTML. + +16 +00:01:13,220 --> 00:01:21,020 +Bây giờ, trong trường hợp này, CSS nội tuyến đi vào thẻ mở của HTML. + +17 +00:01:21,050 --> 00:01:24,110 +Đây là nơi CSS tồn tại. + +18 +00:01:24,140 --> 00:01:27,830 +Nó cùng dòng với thẻ HTML. + +19 +00:01:28,640 --> 00:01:34,520 +CSS nội tuyến trông như thế này. + +20 +00:01:34,940 --> 00:01:44,990 +Bạn có một thuộc tính kiểu, đây là một thuộc tính có sẵn trên toàn cầu cho tất cả các thẻ, không chỉ HTML + +21 +00:01:45,290 --> 00:01:47,390 +mà bất kỳ thứ gì khác. + +22 +00:01:47,420 --> 00:01:51,440 +Hình ảnh hoặc phá vỡ hoặc bất cứ điều gì bạn có thể nghĩ đến. + +23 +00:01:51,470 --> 00:01:54,200 +Bạn có thể thêm thuộc tính style vào nó. + +24 +00:01:54,470 --> 00:01:57,340 +Như chúng ta biết, thông thường các thuộc tính trông như thế này. + +25 +00:01:57,350 --> 00:02:01,530 +Họ có một tên của thuộc tính. + +26 +00:02:01,560 --> 00:02:04,440 +Sau đó, chúng tôi thêm dấu bằng. + +27 +00:02:04,440 --> 00:02:09,180 +Và cuối cùng, chúng tôi thêm một giá trị cho thuộc tính. + +28 +00:02:09,930 --> 00:02:14,400 +Trong phần giá trị này là nơi chúng tôi thêm mã CSS của mình. + +29 +00:02:14,700 --> 00:02:18,210 +Mã CSS của chúng tôi được chia nhỏ như thế này. + +30 +00:02:18,240 --> 00:02:23,610 +Phần đầu tiên của nó là thuộc tính mà bạn muốn thay đổi. + +31 +00:02:24,810 --> 00:02:31,650 +Và phần thứ hai là giá trị của thuộc tính mà bạn muốn đặt. + +32 +00:02:32,400 --> 00:02:38,130 +Vì vậy, trong trường hợp này, những gì chúng tôi đang cố gắng thực hiện là đặt nền trang web của chúng tôi thành màu xanh lam. + +33 +00:02:38,250 --> 00:02:46,230 +Và nếu tôi tiếp tục chạy đoạn mã này và tải nó lên một trình duyệt, bạn sẽ chỉ thấy một trang web có + +34 +00:02:46,230 --> 00:02:47,700 +nền màu xanh lam. + +35 +00:02:47,880 --> 00:02:51,600 +Và điều này đạt được bằng cách sử dụng CSS nội tuyến của chúng tôi. + +36 +00:02:52,300 --> 00:03:01,320 +Các phần tử nội tuyến thực sự hữu ích để thêm kiểu CSS vào chỉ một phần tử trên trang HTML của bạn. + +37 +00:03:01,330 --> 00:03:07,720 +Nhưng thông thường, điều đó khá cồng kềnh vì như bạn có thể tưởng tượng, có rất nhiều phần tử HTML khác nhau. + +38 +00:03:07,750 --> 00:03:13,120 +Nếu bạn có ngày càng nhiều trong số chúng và bạn muốn chúng chia sẻ các kiểu tương + +39 +00:03:13,120 --> 00:03:19,720 +tự, thì bạn sẽ phải thêm các kiểu nội tuyến này cho từng kiểu trong số chúng, điều này khá tẻ nhạt. + +40 +00:03:19,750 --> 00:03:25,720 +Thông thường, bạn không nên sử dụng các kiểu nội tuyến trong toàn bộ tài liệu của mình. + +41 +00:03:25,720 --> 00:03:33,100 +Nó chỉ dành cho các phần cụ thể hoặc khi bạn đang thử nghiệm hoặc khi bạn chỉ muốn nó trong một phần tử hoặc + +42 +00:03:33,100 --> 00:03:35,860 +một dòng trong tài liệu HTML của mình. + +43 +00:03:36,190 --> 00:03:42,100 +Bây giờ, cách thứ hai bạn có thể thêm CSS là thông qua cái được gọi là CSS nội bộ. + +44 +00:03:42,250 --> 00:03:48,400 +Bây giờ điều này được thực hiện thông qua một thẻ HTML đặc biệt được gọi là Phần tử kiểu. + +45 +00:03:48,430 --> 00:03:52,550 +Chúng ta có thẻ kiểu mở và thẻ kiểu đóng. + +46 +00:03:52,550 --> 00:03:58,610 +Và ở giữa hai dòng đó là nơi chúng tôi thêm tất cả CSS của mình. + +47 +00:03:58,760 --> 00:04:02,060 +Tất cả điều này là CSS của chúng tôi. + +48 +00:04:02,540 --> 00:04:08,140 +CSS trông hơi khác một chút so với những gì bạn đã thấy trước đây, phải không? + +49 +00:04:08,150 --> 00:04:11,480 +Bởi vì trước đây tất cả những gì chúng tôi có là dòng này. + +50 +00:04:11,510 --> 00:04:14,750 +Bây giờ, trong trường hợp này, chúng ta có thêm một chút gì đó ở đây. + +51 +00:04:14,780 --> 00:04:16,100 +Tại sao vậy? + +52 +00:04:16,130 --> 00:04:26,060 +Chà, điều này là do lần trước khi chúng tôi có quy tắc CSS, chúng tôi đã đặt nó nội tuyến bên trong một phần tử cụ thể. + +53 +00:04:26,060 --> 00:04:32,420 +Vì vậy, chúng tôi đã nói đối với phần tử HTML này, chúng tôi muốn áp dụng màu nền. + +54 +00:04:33,020 --> 00:04:40,790 +Bây giờ, trong trường hợp này, nó hơi khác một chút vì kiểu bên trong của chúng ta có thể áp dụng cho bất kỳ đâu + +55 +00:04:40,790 --> 00:04:43,010 +trong cùng một tài liệu HTML. + +56 +00:04:43,010 --> 00:04:49,400 +Vì vậy, nó có thể đi sâu vào bất kỳ yếu tố nào trong số này, HTML hoặc phần đầu hoặc bất kỳ thứ gì mà + +57 +00:04:49,400 --> 00:04:50,930 +bạn sẽ nghĩ ra sau này. + +58 +00:04:51,110 --> 00:05:00,040 +Thứ chúng ta phải thêm vào thường xuyên là cái mà chúng ta gọi là bộ chọn và bộ chọn này xuất hiện trước + +59 +00:05:00,040 --> 00:05:07,300 +một bộ dấu ngoặc nhọn và sau đó CSS sẽ nằm giữa hai bộ dấu ngoặc nhọn này. + +60 +00:05:07,510 --> 00:05:15,310 +Bây giờ, khi tôi nói ở giữa một tập hợp các dấu ngoặc nhọn, bạn phải tưởng tượng một chút như thế này. + +61 +00:05:15,310 --> 00:05:19,450 +Đây là dấu ngoặc nhọn mở và đây là dấu ngoặc nhọn đóng. + +62 +00:05:19,450 --> 00:05:28,090 +Và nếu bạn có tất cả trên một dòng, thì nó sẽ giống như thế này với CSS của bạn ở giữa trên + +63 +00:05:28,090 --> 00:05:29,780 +nhiều dòng. + +64 +00:05:29,800 --> 00:05:34,030 +Đó là lý do tại sao chúng tôi mở và đóng chúng trên các dòng riêng biệt. + +65 +00:05:34,030 --> 00:05:38,620 +Nhưng nếu bạn tưởng tượng nó là một dòng, thì nó sẽ giống như thế này. + +66 +00:05:39,550 --> 00:05:49,660 +Kiểu nội bộ của chúng tôi có thể áp dụng cho bất kỳ đâu trong tài liệu HTML của chúng tôi và bên trong chúng tôi có thể nhắm mục tiêu hoặc chọn bao + +67 +00:05:49,660 --> 00:05:51,730 +nhiêu thành phần tùy thích. + +68 +00:05:51,760 --> 00:05:59,450 +Có thể nói hãy áp dụng nền màu đỏ cho HTML và khi mã này được hiển thị trong trình duyệt, bạn sẽ + +69 +00:05:59,450 --> 00:06:03,500 +thấy nền của toàn bộ HTML chuyển sang màu đỏ. + +70 +00:06:03,950 --> 00:06:10,700 +Các kiểu bên trong thực sự hữu ích khi chỉ áp dụng nó cho một tài liệu HTML. + +71 +00:06:10,700 --> 00:06:18,200 +Như bạn có thể thấy, phong cách này và bất kỳ mã nào đi vào trong đó đều bị giới hạn ở HTML chứa nó. + +72 +00:06:18,200 --> 00:06:25,690 +Vì vậy, điều đó có nghĩa là nếu bạn có một trang web nhiều trang thì có lẽ bạn không nên sử dụng kiểu nội bộ. + +73 +00:06:25,700 --> 00:06:31,610 +Thay vào đó, bạn nên sử dụng thứ gọi là kiểu dáng CSS bên ngoài. + +74 +00:06:31,700 --> 00:06:39,290 +Bây giờ, điểm khác biệt lớn nhất giữa kiểu bên ngoài và kiểu bên trong và kiểu nội tuyến là kiểu này thực sự tồn tại trong một tệp hoàn + +75 +00:06:39,290 --> 00:06:47,900 +toàn riêng biệt mà bạn thường thấy là Kiểu. css hoặc Chính. css hoặc bất kỳ thứ gì có phần + +76 +00:06:47,900 --> 00:06:57,290 +mở rộng CSS dấu chấm bên trong tệp CSS này là nơi chúng tôi viết các quy tắc CSS của mình. + +77 +00:06:57,290 --> 00:07:04,430 +Vì vậy, chúng tôi có bộ chọn của mình, chúng tôi có thuộc tính của mình và chúng tôi có các giá trị và chúng tôi có thể tạo nhiều, rất nhiều + +78 +00:07:04,430 --> 00:07:06,350 +trong số này bên trong tệp này. + +79 +00:07:06,500 --> 00:07:12,950 +Bây giờ làm cách nào để liên kết tệp biểu định kiểu với tệp index. Html? + +80 +00:07:13,130 --> 00:07:23,390 +Chà, bên trong phần đầu của HTML, chúng tôi sẽ thêm một yếu tố liên kết mà bạn sẽ nhận thấy là một thẻ tự đóng. + +81 +00:07:23,390 --> 00:07:25,850 +Vì vậy, nó không cần thẻ đóng. + +82 +00:07:25,940 --> 00:07:29,000 +Và chúng tôi có hai điều mà chúng tôi thường viết. + +83 +00:07:29,030 --> 00:07:38,510 +Một trong đó là một mối quan hệ đề cập đến vai trò của điều này mà chúng ta đang liên kết đến là gì? + +84 +00:07:38,840 --> 00:07:45,320 +Và điều thứ hai là href, nó nằm ở đâu? + +85 +00:07:45,890 --> 00:07:51,500 +Trong trường hợp này, chúng tôi đang nói rằng nó nằm trong cùng một thư mục và nó nằm trong một tệp có tên là Styles. + +86 +00:07:52,170 --> 00:07:56,430 +CSS, trỏ đến tệp này ngay tại đây. + +87 +00:07:56,430 --> 00:08:04,590 +Và khi chúng ta tiếp tục chạy cái này và hiển thị nó trong trình duyệt, bạn sẽ thấy nó chuyển nền HTML của + +88 +00:08:04,590 --> 00:08:06,810 +chúng ta sang màu xanh lục. + +89 +00:08:06,930 --> 00:08:13,320 +Và phong cách CSS bên ngoài này là thứ được sử dụng phổ biến nhất trong phát triển web. + +90 +00:08:13,320 --> 00:08:16,710 +Và đây là những gì chúng ta sẽ tập trung vào hầu hết thời gian. + +91 +00:08:16,710 --> 00:08:24,540 +Nhưng điều quan trọng là phải nhận thức được hai phong cách khác là nội tuyến, nội bộ, bởi vì bạn sẽ thấy + +92 +00:08:24,540 --> 00:08:27,980 +nó ngoài kia trong mã CSS của người khác. + +93 +00:08:27,990 --> 00:08:34,169 +Vì vậy, hãy nhớ rằng nội tuyến thực sự hữu ích khi bạn chỉ muốn nhắm mục tiêu một phần tử duy nhất. + +94 +00:08:34,860 --> 00:08:40,590 +Và nội bộ thực sự hữu ích khi bạn chỉ muốn nhắm mục tiêu một trang web. + +95 +00:08:41,730 --> 00:08:49,290 +Nhưng đối với hầu hết các trường hợp và khi bạn có một trang web nhiều trang, thì điều bạn + +96 +00:08:49,290 --> 00:08:56,950 +cần là cách thêm CSS bên ngoài thông qua việc sử dụng một tệp riêng biệt, tệp này sẽ được gọi + +97 +00:08:56,980 --> 00:09:05,170 +là gì đó, CSS gì đó, và nó ở bên trong tệp này nơi bạn sẽ viết mã CSS có thể nhắm mục tiêu toàn bộ trang + +98 +00:09:05,170 --> 00:09:09,070 +web với tất cả các trang web của nó. + +99 +00:09:09,640 --> 00:09:14,950 +Vì vậy, đây là ba cách mà bạn có thể thêm CSS vào tài liệu HTML của mình. + +100 +00:09:14,950 --> 00:09:20,500 +Và đừng lo lắng, chúng ta sẽ thực hành điều này và tất cả các dạng của nó rất nhiều lần để bạn + +101 +00:09:20,500 --> 00:09:22,660 +hiểu nó hoạt động như thế nào. + +102 +00:09:23,290 --> 00:09:30,340 +Hãy thử làm một bài tập và xem cách thêm CSS theo nhiều cách khác nhau vào tệp HTML của chúng ta. + +103 +00:09:31,430 --> 00:09:31,790 +Được rồi. + +104 +00:09:31,790 --> 00:09:38,930 +Vì vậy, khi bạn đã tải xuống và giải nén tệp dự án và mở nó bên trong mã, bạn sẽ thấy + +105 +00:09:38,930 --> 00:09:40,250 +thư mục này. + +106 +00:09:40,250 --> 00:09:45,880 +Và ở đây lưu ý rằng năm tệp của chúng tôi đã được tạo cho bạn. + +107 +00:09:45,890 --> 00:09:52,190 +Và trong bài tập này có một chút chỉnh sửa về việc tạo nhiều trang web về đường dẫn + +108 +00:09:52,190 --> 00:09:52,820 +tệp. + +109 +00:09:52,820 --> 00:10:00,800 +Nhưng quan trọng hơn, chúng tôi muốn bạn thực hành sử dụng ba cách khác nhau để thêm CSS nội + +110 +00:10:01,100 --> 00:10:03,800 +tuyến, nội bộ và bên ngoài. + +111 +00:10:03,800 --> 00:10:10,700 +Vì vậy, bắt đầu bên trong index. html, điều đầu tiên tôi muốn bạn làm là tạo ba liên kết đến + +112 +00:10:10,700 --> 00:10:12,260 +ba trang web khác nhau. + +113 +00:10:12,650 --> 00:10:16,040 +Cái này, cái này và cái này. + +114 +00:10:16,040 --> 00:10:21,140 +Và khi bạn đã hoàn thành việc đó, thì bạn có thể vào bên trong từng trang web đó. + +115 +00:10:21,140 --> 00:10:27,380 +Vì vậy, hãy bắt đầu với nội tuyến và sau đó là nội bộ bên ngoài, và bạn sẽ làm theo hướng + +116 +00:10:27,380 --> 00:10:29,040 +dẫn mà người H yêu cầu. + +117 +00:10:29,060 --> 00:10:38,010 +Vì vậy, trong trường hợp này, chúng tôi muốn sử dụng kiểu dáng nội tuyến để tạo kiểu dáng cho chiếc h này bằng màu xanh lam và sau đó bạn có thể vào bên + +118 +00:10:38,010 --> 00:10:44,130 +trong và làm điều tương tự, nhưng lần này sử dụng kiểu dáng bên trong và tạo kiểu dáng cho chiếc H màu + +119 +00:10:44,130 --> 00:10:52,800 +đỏ và sau đó cuối cùng sử dụng kiểu dáng bên ngoài bằng kiểu dáng này. css và tạo kiểu cho tệp h có màu xanh lá + +120 +00:10:52,800 --> 00:10:53,610 +cây. + +121 +00:10:53,700 --> 00:10:59,430 +Nếu bạn muốn xem kết quả cuối cùng sẽ như thế nào, bạn có thể vào thư mục giải pháp, nhấp chuột phải + +122 +00:10:59,430 --> 00:11:06,030 +vào giải pháp, chấm HTML và hiển thị bản xem trước, sau đó đảm bảo rằng bạn thu gọn thư mục giải pháp này. + +123 +00:11:06,030 --> 00:11:10,920 +Vì moi hết ra 2 bản mỗi file nên rất dễ nhầm lẫn. + +124 +00:11:10,920 --> 00:11:16,290 +Vì vậy, tôi khuyên bạn chỉ nên thu gọn thư mục đó để không bị nhầm lẫn và đây là điều bạn đang + +125 +00:11:16,290 --> 00:11:19,380 +hướng tới trên chỉ mục. html, đó là trang chủ. + +126 +00:11:19,380 --> 00:11:22,320 +Chúng tôi có một H và sau đó chúng tôi có ba liên kết. + +127 +00:11:22,320 --> 00:11:28,260 +Và nếu chúng ta nhấp vào từng cái trong số này, bạn có thể thấy chúng có một H1 cho biết tạo kiểu cho tôi theo kiểu + +128 +00:11:28,260 --> 00:11:34,740 +màu xanh lam, tôi theo kiểu màu đỏ và xanh lục và chúng ta sẽ đạt được điều đó bằng cách sử dụng ba cách thêm CSS khác nhau. + +129 +00:11:34,920 --> 00:11:41,190 +Khi bạn đã sẵn sàng, hãy tiếp tục và tải xuống các tệp bắt đầu và thực hiện thử thách này. + +130 +00:11:41,550 --> 00:11:42,750 +Tạm dừng video ngay bây giờ. + +131 +00:11:45,230 --> 00:11:45,560 +Được rồi. + +132 +00:11:45,560 --> 00:11:46,760 +Vì vậy, làm thế nào mà đi? + +133 +00:11:46,790 --> 00:11:51,620 +Tôi sẽ cùng bạn xem qua mã giải pháp để giải thích một số điều bạn cần làm để + +134 +00:11:51,620 --> 00:11:53,420 +hoàn thành thử thách này. + +135 +00:11:53,450 --> 00:11:57,770 +Điều đầu tiên chúng tôi nói là tạo kiểu cho trang chủ. + +136 +00:11:57,770 --> 00:12:02,650 +Vì vậy, chúng tôi đã thêm vào ba thẻ neo, đó là cách chúng tôi tạo liên kết. + +137 +00:12:02,660 --> 00:12:11,300 +Và một khi chúng tôi đã làm điều đó, chúng tôi có thể sử dụng href của từng thẻ neo để liên kết đến + +138 +00:12:11,300 --> 00:12:13,550 +trang web có liên quan. + +139 +00:12:13,580 --> 00:12:22,130 +Cái đầu tiên liên kết đến trang web nội tuyến, HTML nội tuyến, nội bộ bên ngoài và chúng tôi sử dụng ký hiệu + +140 +00:12:22,130 --> 00:12:26,600 +dấu gạch chéo để tiếp cận trong thư mục hiện tại. + +141 +00:12:26,600 --> 00:12:29,630 +Vì vậy, giải pháp dot html nằm trong giải pháp. + +142 +00:12:29,630 --> 00:12:34,910 +Và trong trường hợp này, để truy cập html dấu chấm nội tuyến, chúng tôi sử dụng dấu gạch chéo để đến thư mục này + +143 +00:12:34,910 --> 00:12:39,800 +và sau đó chúng tôi chuyển tiếp dấu gạch chéo để chuyển đến html dấu chấm nội tuyến ngay tại đây. + +144 +00:12:41,120 --> 00:12:48,720 +Bây giờ, khi bạn đã tạo ba liên kết của mình, giai đoạn tiếp theo là đi vào nội tuyến của trang web đầu tiên + +145 +00:12:48,720 --> 00:12:54,390 +và ở đây chúng tôi muốn tạo kiểu cho H1 bằng CSS, nhưng thêm nó vào nội tuyến. + +146 +00:12:54,510 --> 00:13:03,840 +Như tôi đã nói, nó nằm trong dòng chữ của phần tử H1, vì vậy nó chỉ áp dụng cho phần tử H1 này và chúng tôi + +147 +00:13:03,840 --> 00:13:12,900 +đã thêm nó vào ngay tại đây để nói rằng kiểu nên được đặt sao cho màu của văn bản này là màu xanh lam. + +148 +00:13:13,530 --> 00:13:23,190 +Và hãy nhớ rằng kiểu nội tuyến nằm trong thẻ mở của phần tử mà bạn muốn nhắm mục tiêu. + +149 +00:13:24,630 --> 00:13:34,470 +Cái tiếp theo là bên trong, vì vậy chúng tôi thêm kiểu dáng bên trong, thường bằng cách đặt nó bên trong phần đầu. + +150 +00:13:34,470 --> 00:13:41,790 +Vì vậy, giữa các thẻ mở và thẻ đóng của phần tử đầu và đây là quy ước mà hầu hết các nhà phát triển sẽ tuân + +151 +00:13:41,790 --> 00:13:46,770 +theo, mặc dù điều này sẽ hoạt động bất kể bạn đặt phần tử kiểu ở đâu. + +152 +00:13:46,920 --> 00:13:54,240 +Vì vậy, ở đây chúng ta có một thẻ kiểu mở và đóng và ở giữa chúng ta đã thêm vào CSS của mình. + +153 +00:13:54,240 --> 00:14:01,590 +Vì vậy, chúng tôi đang nói rằng bộ chọn của chúng tôi sẽ chọn tất cả H1 trên trang này, trong đó chỉ có một + +154 +00:14:01,590 --> 00:14:05,550 +và chúng tôi sẽ thay đổi màu văn bản của nó thành màu đỏ. + +155 +00:14:05,880 --> 00:14:11,400 +Và cuối cùng chúng ta có phiên bản cuối cùng, đó là HTML bên ngoài. + +156 +00:14:11,400 --> 00:14:19,410 +Và chúng tôi làm điều này bằng cách tạo lại một yếu tố liên kết ngay trong phần đầu của trang web của bạn. + +157 +00:14:19,440 --> 00:14:27,450 +Chúng tôi thiết lập mối quan hệ là chúng tôi đang thiết lập một biểu định kiểu và sau đó chúng tôi cung cấp một href cho vị trí + +158 +00:14:27,450 --> 00:14:33,840 +đặt biểu định kiểu của chúng ta, nằm trong thư mục hiện tại và sau đó nó nằm trong một tệp có tên là + +159 +00:14:33,840 --> 00:14:35,310 +Style. css. + +160 +00:14:35,310 --> 00:14:38,310 +Vì vậy, chúng ta có thể thấy rằng ngay tại đây. + +161 +00:14:39,030 --> 00:14:46,950 +Và bên trong đây, chúng tôi đã nhắm mục tiêu H1 một lần nữa và chúng tôi đã đặt màu thành xanh lục và tất cả những + +162 +00:14:46,950 --> 00:14:55,470 +thứ đó cùng nhau tạo ra các trang web khác nhau này trong trang web nhiều trang của chúng tôi với mã đặt kiểu theo ba cách + +163 +00:14:55,470 --> 00:14:56,670 +khác nhau. + +164 +00:14:56,670 --> 00:14:58,270 +Vậy bạn đã hiểu đúng chưa? + +165 +00:14:58,290 --> 00:15:04,710 +Nếu bạn gặp bất kỳ sự cố nào, hãy nhớ quay lại mã của mình và sửa bất kỳ lỗi nào và đảm + +166 +00:15:04,710 --> 00:15:09,030 +bảo rằng bạn đã hiểu ba cách khác nhau để thêm CSS. + +167 +00:15:09,510 --> 00:15:14,910 +Trong bài học tiếp theo, chúng ta sẽ tìm hiểu thêm về các bộ chọn khác nhau mà chúng ta có thể sử dụng + +168 +00:15:14,910 --> 00:15:17,220 +để chọn các phần khác nhau của tệp HTML. + +169 +00:15:17,220 --> 00:15:19,920 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/003 CSS Quiz.html b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/003 CSS Quiz.html new file mode 100644 index 0000000000000000000000000000000000000000..2a5f8c6bd143d33c7ac5f90f1d83b9e5b113df7d --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/003 CSS Quiz.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 5.3-CSS-Selectors.zip b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 5.3-CSS-Selectors.zip new file mode 100644 index 0000000000000000000000000000000000000000..0887c7649032666c9d5923795af8996b8840271e --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 5.3-CSS-Selectors.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72969a38c3a40d1bf0a32328a90b62b2a4f440c5cb2522a8ea49888dc79b6da7 +size 141393 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 CSS Selectors.mp4 b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 CSS Selectors.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b6d32ee35c33e345e9481bef7ffd62c847a9d979 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 CSS Selectors.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea6464cfc59712f4124840041623dcfaf170991ff02c2fa577ec1647e203e560 +size 201173235 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 CSS Selectors_vi.srt b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 CSS Selectors_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..bb614f1b0a207de56973c7e5f83bdbb46b804e17 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/004 CSS Selectors_vi.srt @@ -0,0 +1,1028 @@ +1 +00:00:00,470 --> 00:00:01,070 +Chào các cậu. + +2 +00:00:01,070 --> 00:00:04,280 +Chào mừng bạn đến với một bài học khác về CSS. + +3 +00:00:04,310 --> 00:00:11,570 +Trong bài học này, chúng ta sẽ nói về bộ chọn CSS và điều này sẽ giúp chúng ta chọn + +4 +00:00:11,570 --> 00:00:14,150 +nơi áp dụng CSS của mình. + +5 +00:00:14,480 --> 00:00:21,220 +Trước đây chúng ta đã thấy rằng chúng ta có thể tạo các quy tắc CSS bằng cách chỉ định hai điều. + +6 +00:00:21,230 --> 00:00:31,400 +Một là thuộc tính mà chúng ta muốn thay đổi và sau dấu hai chấm, chúng ta có thể chỉ định giá trị để thay đổi thuộc tính + +7 +00:00:31,400 --> 00:00:31,990 +đó. + +8 +00:00:32,210 --> 00:00:38,900 +Trong trường hợp này, điều chúng ta đang nói là chúng ta muốn thay đổi màu văn bản thành màu xanh lam. + +9 +00:00:39,320 --> 00:00:45,110 +Bây giờ chúng ta đã xem qua một số quy tắc này và tôi sẽ chỉ cho bạn trong bài học sau trong phần tiếp + +10 +00:00:45,110 --> 00:00:48,230 +theo về cách tìm hiểu thêm về các quy tắc này. + +11 +00:00:48,230 --> 00:00:54,680 +Nhưng quan trọng hơn, trong bài học này, điều tôi muốn nói đến là phần nằm ngoài các quy tắc này. + +12 +00:00:54,680 --> 00:00:57,860 +Đó là phần đến ngay tại đây. + +13 +00:00:57,860 --> 00:01:02,280 +Và đây được gọi là bộ chọn CSS. + +14 +00:01:02,550 --> 00:01:04,769 +Bộ chọn CSS là gì? + +15 +00:01:04,769 --> 00:01:14,190 +Chà, đó là phần chọn HTML để áp dụng bất kỳ quy tắc nào nằm giữa các dấu ngoặc nhọn + +16 +00:01:14,190 --> 00:01:15,120 +này. + +17 +00:01:15,330 --> 00:01:20,910 +Làm cách nào để chúng tôi biết phần nào của tệp HTML sẽ tạo màu xanh cho văn bản? + +18 +00:01:20,940 --> 00:01:25,650 +Chà, chúng ta nhìn vào phần này và có thể thấy chúng ta đang nhắm mục tiêu H1. + +19 +00:01:25,740 --> 00:01:30,750 +Bây giờ, kiểu bộ chọn này là một trong những bộ chọn CSS đơn giản nhất. + +20 +00:01:30,780 --> 00:01:32,640 +Nó được gọi là bộ chọn phần tử. + +21 +00:01:32,640 --> 00:01:38,070 +Và tất cả những gì nó làm là chọn một thẻ HTML cụ thể. + +22 +00:01:38,070 --> 00:01:42,000 +Vì vậy, trong trường hợp này, nó nhắm mục tiêu đến tất cả những cái h. + +23 +00:01:42,000 --> 00:01:49,710 +Nếu HTML của bạn tốt, bạn chỉ nên có một H1 duy nhất, nhưng nó sẽ khác đối với các thẻ khác. + +24 +00:01:49,710 --> 00:01:57,150 +Nếu bạn có thẻ neo hoặc nếu bạn có thẻ đoạn văn hoặc h twos hoặc bất kỳ thẻ HTML nào khác. + +25 +00:01:57,150 --> 00:02:07,430 +Sau đó, khi bạn chọn từng thẻ này trong CSS của mình, điều đó có nghĩa là áp dụng cho tất cả các thành phần có thẻ cụ + +26 +00:02:07,430 --> 00:02:08,240 +thể đó. + +27 +00:02:08,360 --> 00:02:12,260 +Hãy xem điều này trong hành động ở đây. + +28 +00:02:12,260 --> 00:02:13,910 +Tôi có hai tệp . + +29 +00:02:13,910 --> 00:02:18,890 +Một là chỉ số. html và một cái khác là stylesheet của chúng ta. + +30 +00:02:18,980 --> 00:02:26,450 +Và bên trong index. html chúng ta vừa có ba H twos, đỏ, lục và lam. + +31 +00:02:26,450 --> 00:02:30,140 +Và khi hiển thị hoặc chạy chúng sẽ như thế này. + +32 +00:02:30,140 --> 00:02:31,520 +Ba tiêu đề. + +33 +00:02:31,520 --> 00:02:40,640 +Bây giờ, nếu chúng ta tiếp tục và thêm một chút CSS và nhắm mục tiêu phần tử H hai của chúng ta, trong trường hợp này, chúng + +34 +00:02:40,640 --> 00:02:45,260 +ta đang sử dụng một bộ chọn phần tử đơn giản là tên của thẻ. + +35 +00:02:45,260 --> 00:02:50,870 +Và sau dấu ngoặc nhọn, chúng ta có thể xác định bất kỳ quy tắc CSS nào chúng ta muốn. + +36 +00:02:50,900 --> 00:02:54,590 +Trong trường hợp này, chuyển màu của văn bản thành màu đỏ. + +37 +00:02:54,680 --> 00:03:00,230 +Nếu chúng ta tiếp tục và chạy đoạn mã này, tôi muốn bạn tưởng tượng những gì bạn mong đợi sẽ xảy ra. + +38 +00:03:00,230 --> 00:03:03,010 +Văn bản nào trong số này sẽ chuyển sang màu đỏ? + +39 +00:03:03,030 --> 00:03:04,950 +Vì vậy, hãy đi và chạy mã. + +40 +00:03:04,950 --> 00:03:10,920 +Và một khi sự thay đổi này được kết hợp, đây là những gì chúng ta thấy Màu đỏ, xanh lá cây và xanh dương đều chuyển + +41 +00:03:10,920 --> 00:03:13,020 +sang màu đỏ vì chúng đều là h hai. + +42 +00:03:13,020 --> 00:03:18,750 +Và bộ chọn phần tử này ở đây chọn tất cả các h twos chuyển chúng thành màu đỏ. + +43 +00:03:18,750 --> 00:03:20,670 +Vì vậy, khá đơn giản cho đến nay. + +44 +00:03:20,790 --> 00:03:25,710 +Bây giờ hãy xem xét một loại bộ chọn khác, bộ chọn lớp. + +45 +00:03:25,770 --> 00:03:30,540 +Điều này yêu cầu một biểu tượng đặc biệt, đó là dấu chấm. + +46 +00:03:30,570 --> 00:03:39,750 +Và sau dấu chấm đó ngay lập tức không có khoảng trắng ở đây, thì bạn có tên của lớp. + +47 +00:03:39,750 --> 00:03:45,150 +Vì vậy, đây là tên thật của lớp mà chúng tôi đang chọn. + +48 +00:03:45,150 --> 00:03:47,670 +Trong trường hợp này, tôi đã gọi nó là Tiêu đề gạch ngang màu đỏ. + +49 +00:03:47,790 --> 00:03:52,890 +Và sau dấu ngoặc nhọn một lần nữa, chúng ta có quy tắc CSS tương tự để áp dụng. + +50 +00:03:52,920 --> 00:03:55,050 +Thay đổi màu văn bản thành màu đỏ. + +51 +00:03:55,830 --> 00:03:58,230 +Bây giờ, một lớp học là gì? + +52 +00:03:58,230 --> 00:04:05,490 +Chà, lớp là thứ mà chúng ta có thể thêm làm thuộc tính cho bất kỳ phần tử HTML nào. + +53 +00:04:05,880 --> 00:04:14,130 +Và thuộc tính này giống như nói rằng, hãy nhóm các phần tử cụ thể này thành một lớp. + +54 +00:04:14,130 --> 00:04:21,779 +Vì vậy, nó được sử dụng để nhóm các thành phần trong tệp HTML của bạn để áp dụng cùng một quy tắc CSS cho tất cả chúng. + +55 +00:04:21,779 --> 00:04:29,910 +Vì vậy, trong trường hợp này, chúng tôi chỉ có một H2 có một lớp và lớp được đặt thành văn bản màu đỏ. + +56 +00:04:30,090 --> 00:04:39,390 +Bây giờ, khi tôi tiếp tục và viết một số CSS và tôi nhắm mục tiêu lớp, hãy nhớ yêu cầu DOT và sau đó là tên + +57 +00:04:39,390 --> 00:04:45,420 +của lớp, chính là cái này và nó phải được đánh vần giống hệt nhau. + +58 +00:04:45,420 --> 00:04:47,760 +Hai điều này không thể có bất kỳ sự khác biệt nào. + +59 +00:04:47,760 --> 00:04:53,970 +Vì vậy, bạn không thể có, chẳng hạn như chữ R viết hoa hoặc chữ T viết hoa, Điều này sẽ không hiệu quả. + +60 +00:04:54,510 --> 00:04:59,820 +Thay vào đó, những gì chúng tôi có là bộ chọn lớp và quy tắc CSS của chúng tôi. + +61 +00:05:00,460 --> 00:05:07,900 +Bạn mong đợi điều gì sẽ xảy ra khi mã được chạy trong trình duyệt khi CSS này được áp dụng? + +62 +00:05:07,930 --> 00:05:10,360 +Chà, nó sẽ trông như thế này. + +63 +00:05:10,390 --> 00:05:16,990 +Nó chọn phần tử duy nhất có lớp đó và biến màu văn bản thành màu đỏ. + +64 +00:05:17,470 --> 00:05:22,330 +Bây giờ nếu chúng ta có nhiều phần tử trong cùng một lớp thì sao? + +65 +00:05:22,330 --> 00:05:27,640 +Vì vậy, ở đây bạn có thể thấy chúng ta thực sự có hai loại phần tử HTML khác nhau. + +66 +00:05:27,670 --> 00:05:32,800 +Một là H2 và một là phần tử đoạn văn. + +67 +00:05:32,920 --> 00:05:38,470 +Mặc dù hai yếu tố này hoàn toàn khác nhau nhưng chúng ta có thể gắn thẻ chúng bằng cách sử dụng cùng một lớp. + +68 +00:05:38,470 --> 00:05:43,900 +Chúng tôi đang nói rằng H2 nên có loại văn bản màu đỏ, cũng như đoạn văn. + +69 +00:05:44,020 --> 00:05:54,070 +Bây giờ nếu chúng ta viết CSS và chúng ta chọn lại tất cả các lớp có chữ màu đỏ, thì bạn nghĩ điều gì sẽ + +70 +00:05:54,070 --> 00:05:55,110 +xảy ra? + +71 +00:05:55,120 --> 00:06:01,850 +Chà, trong trường hợp này, nó là H2 hay là một đoạn văn không quan trọng. + +72 +00:06:01,850 --> 00:06:08,870 +Miễn là chúng có lớp đó, chúng đã được chuyển đổi thành văn bản màu đỏ và kiểu dáng đã được + +73 +00:06:08,870 --> 00:06:11,900 +áp dụng cho hai phần tử HTML này. + +74 +00:06:12,380 --> 00:06:16,520 +Như bạn có thể thấy, bộ chọn lớp thực sự linh hoạt. + +75 +00:06:16,520 --> 00:06:22,430 +Nó cho phép bạn nhóm các phần khác nhau của tệp HTML của mình để có cùng kiểu dáng. + +76 +00:06:22,430 --> 00:06:28,010 +Và điều này có thể thực sự, thực sự hữu ích trên các trang web nhiều trang với nhiều yếu tố khác nhau. + +77 +00:06:28,010 --> 00:06:32,840 +Và bạn không chỉ muốn chọn một loại phần tử HTML cụ thể. + +78 +00:06:33,650 --> 00:06:39,800 +Phần tiếp theo tôi muốn cho bạn xem được gọi là Bộ chọn ID và Bộ chọn ID. + +79 +00:06:39,800 --> 00:06:47,300 +Nó có ký hiệu đặc biệt của riêng nó, đó là dấu thăng hoặc thẻ băm, và bạn đặt dấu thăng + +80 +00:06:47,300 --> 00:06:57,320 +đó lặp đi lặp lại, không có khoảng cách giữa dấu thăng và tên thực của ID và điều này sẽ chọn tất cả các thành + +81 +00:06:57,320 --> 00:07:00,590 +phần có ID cụ thể thuộc tính. + +82 +00:07:00,590 --> 00:07:07,190 +Đây là giao diện của một thuộc tính ID, nó chỉ đơn giản là các từ ID, và sau dấu + +83 +00:07:07,190 --> 00:07:14,870 +bằng, chúng ta có thể đặt cho nó một ID cụ thể và nó hoạt động tương tự như bộ chọn lớp, bởi vì + +84 +00:07:14,870 --> 00:07:24,770 +nếu tôi tiếp tục và chọn ID này của Chính và Tôi áp dụng những thay đổi này, sau đó bạn có thể thấy nó sẽ thêm kiểu dáng + +85 +00:07:24,770 --> 00:07:28,520 +và áp dụng nó cho phần tử duy nhất có ID đó. + +86 +00:07:29,120 --> 00:07:35,160 +Vậy thì sự khác biệt giữa ID và bộ chọn lớp là gì? + +87 +00:07:35,180 --> 00:07:44,390 +Chà, bộ chọn lớp có thể được áp dụng cho nhiều phần tử, trong khi ID chỉ nên được áp dụng cho một phần tử trong một tệp HTML + +88 +00:07:44,390 --> 00:07:52,220 +trong một tệp HTML như chỉ mục của chúng tôi. html. + +89 +00:07:52,250 --> 00:07:58,490 +Chỉ nên có một ID của tên chính cụ thể này. + +90 +00:07:58,490 --> 00:08:04,090 +Nó phải là hoàn toàn độc đáo và đây là sự khác biệt. + +91 +00:08:04,090 --> 00:08:13,840 +Nếu bạn đã nói ba h2, bạn không thể chọn tất cả chúng bằng bộ chọn phần tử như thế này + +92 +00:08:13,840 --> 00:08:17,530 +vì điều đó sẽ chọn tất cả h2. + +93 +00:08:17,560 --> 00:08:27,610 +Thay vào đó, bạn áp dụng ID cho thành phần duy nhất mà bạn muốn áp dụng kiểu của mình và nó sẽ chọn nó + +94 +00:08:27,610 --> 00:08:29,590 +trong tệp HTML. + +95 +00:08:30,310 --> 00:08:38,530 +Một lần nữa, hãy nhớ rằng, ID chỉ là một phần tử duy nhất trên mỗi tệp và các lớp bạn có thể đặt bao nhiêu phần tử tùy thích + +96 +00:08:38,530 --> 00:08:40,690 +để nhóm chúng lại với nhau. + +97 +00:08:41,440 --> 00:08:49,060 +Một cách khác mà bạn có thể chọn các phần trong HTML của mình là sử dụng bộ chọn thuộc tính để chúng tôi biết + +98 +00:08:49,060 --> 00:08:54,850 +rằng chúng tôi có thể tạo thẻ HTML và thêm bao nhiêu thuộc tính tùy thích. + +99 +00:08:54,850 --> 00:09:09,670 +Vì vậy, chúng tôi có các thuộc tính như ID hoặc lớp hoặc có thể kéo hoặc nguồn cho hình ảnh hoặc RF cho thẻ neo hoặc alt cho + +100 +00:09:09,670 --> 00:09:17,110 +hình ảnh và nhiều thứ khác sẽ được thấy trong tương lai. + +101 +00:09:17,380 --> 00:09:26,020 +Bây giờ chúng ta có thể chọn những phần tử này có thuộc tính cụ thể hoặc giá trị thuộc tính cụ thể bằng cách + +102 +00:09:26,020 --> 00:09:27,910 +sử dụng ký hiệu này. + +103 +00:09:27,940 --> 00:09:39,010 +Chú ý phần đầu tiên ở đây là phần tử HTML mà bạn muốn chọn, sau đó sử dụng một tập hợp các dấu ngoặc vuông, những dấu ngoặc + +104 +00:09:39,010 --> 00:09:41,380 +vuông này ngay tại đây. + +105 +00:09:41,410 --> 00:09:46,390 +Sau đó, bên trong chúng ta có thể bao gồm thuộc tính mà bạn muốn chọn. + +106 +00:09:46,630 --> 00:09:57,640 +Điều mà toàn bộ bộ chọn này nói là chọn tất cả các thành phần đoạn văn có thuộc tính có thể kéo và sau đó áp + +107 +00:09:57,640 --> 00:09:59,680 +dụng kiểu CSS này. + +108 +00:09:59,820 --> 00:10:00,270 +Để nó. + +109 +00:10:00,750 --> 00:10:03,860 +Điều này trông như thế nào trong mã HTML? + +110 +00:10:03,870 --> 00:10:10,680 +Chà, ở đây chúng ta có ba thẻ đoạn văn, nhưng chỉ một trong số chúng có thuộc tính draggable được đặt thành + +111 +00:10:10,710 --> 00:10:11,370 +true. + +112 +00:10:11,490 --> 00:10:21,780 +Nếu chúng ta tiếp tục và áp dụng kiểu CSS trong đó chúng ta chọn thành phần đoạn văn có thuộc tính có thể kéo và + +113 +00:10:21,780 --> 00:10:31,020 +đặt kiểu CSS này cho nó, thì khi CSS này được áp dụng cho HTML của chúng ta, đây là điều sẽ xảy ra. + +114 +00:10:31,020 --> 00:10:37,260 +Nó sẽ tìm thẻ đoạn duy nhất với thuộc tính cụ thể đó. + +115 +00:10:37,290 --> 00:10:41,130 +Bây giờ bạn có thể tiến thêm một bước với bộ chọn thuộc tính. + +116 +00:10:41,310 --> 00:10:47,980 +Bạn thực sự có thể chọn giá trị của thuộc tính mà bạn muốn áp dụng CSS của mình. + +117 +00:10:48,000 --> 00:10:54,840 +Vì vậy, trong trường hợp này, bạn có thể thấy chúng tôi có cả ba đoạn văn có cùng một thuộc tính. + +118 +00:10:54,870 --> 00:10:59,070 +Tất cả các thuộc tính có thể kéo được đặt, nhưng được đặt thành các giá trị khác nhau. + +119 +00:10:59,170 --> 00:11:03,320 +Vì vậy, cái đầu tiên được đặt thành true và hai cái còn lại được đặt thành false. + +120 +00:11:03,340 --> 00:11:07,670 +Vì vậy, bây giờ chúng ta thực sự có thể viết CSS của mình như thế này. + +121 +00:11:07,690 --> 00:11:16,470 +Chúng tôi có thể chọn tất cả các thành phần đoạn văn có thuộc tính có thể kéo được đặt bằng sai. + +122 +00:11:16,480 --> 00:11:25,330 +Và điều mà bộ chọn này sẽ thực hiện tất cả những điều này là nó sẽ xem xét bên trong tệp của chúng ta + +123 +00:11:25,330 --> 00:11:35,590 +và nó sẽ tìm thấy hai thành phần đoạn văn này để chọn và áp dụng CSS khi CSS này được áp dụng thay vì CSS đầu tiên, + +124 +00:11:35,590 --> 00:11:43,540 +trước đây là được chọn, chúng tôi thực sự có hai cái còn lại được chọn và chuyển sang màu + +125 +00:11:43,540 --> 00:11:44,290 +đỏ. + +126 +00:11:44,620 --> 00:11:51,250 +Đây lại là một cách thực sự linh hoạt để áp dụng CSS, nhưng như bạn có thể thấy, nó chọn những thứ khác với những + +127 +00:11:51,250 --> 00:11:53,460 +gì chúng ta đã thấy trước đây. + +128 +00:11:53,470 --> 00:11:58,990 +Phần tử, ID hoặc bộ chọn lớp, bộ chọn cuối cùng. + +129 +00:11:58,990 --> 00:12:01,960 +Tôi muốn nói đến là bộ chọn phổ quát. + +130 +00:12:01,960 --> 00:12:03,580 +Và nó thực sự đơn giản. + +131 +00:12:03,580 --> 00:12:05,470 +Nó chỉ là một dấu hoa thị. + +132 +00:12:05,470 --> 00:12:08,740 +Và sau Asterix, bạn có các quy tắc CSS của mình. + +133 +00:12:08,740 --> 00:12:12,460 +Nhưng điều này có nghĩa là nó có nghĩa là chọn tất cả. + +134 +00:12:12,910 --> 00:12:19,240 +Và khi bạn áp dụng điều này, không quan trọng bạn có lớp nào, ID nào, bộ thuộc tính nào, các phần + +135 +00:12:19,240 --> 00:12:20,320 +tử khác nhau. + +136 +00:12:20,350 --> 00:12:27,610 +Nếu bạn chọn tất cả, nó sẽ áp dụng kiểu cho mọi thứ mà biểu định kiểu đang hoạt động. + +137 +00:12:27,610 --> 00:12:31,540 +Và đây có lẽ là một trong những bộ chọn đơn giản nhất để hiểu. + +138 +00:12:31,900 --> 00:12:38,530 +Vì vậy, bây giờ chúng ta đã thấy tất cả các cách khác nhau mà chúng ta có thể áp dụng CSS của mình cho các phần khác nhau + +139 +00:12:38,560 --> 00:12:46,000 +của HTML bằng cách sử dụng bộ chọn, hãy thử thực hiện một bài tập mà chúng ta thực hành thử nghiệm và xem liệu bạn đã hiểu tất cả các khái + +140 +00:12:46,000 --> 00:12:47,830 +niệm trong bài học này chưa. + +141 +00:12:48,130 --> 00:12:55,600 +Bây giờ, khi bạn đã tải xuống và giải nén các tệp bắt đầu và mở nó bằng mã, sau đó + +142 +00:12:55,600 --> 00:13:02,350 +tôi muốn bạn truy cập vào chỉ mục. html và tại đây bạn sẽ nhận thấy một vài điều. + +143 +00:13:02,350 --> 00:13:09,400 +Đầu tiên, chúng tôi đã thiết lập biểu định kiểu cho bạn, vì vậy chúng tôi đã thiết lập biểu định kiểu bên ngoài bằng liên kết + +144 +00:13:09,400 --> 00:13:14,590 +và nó trỏ đến tệp này ngay tại đây, tệp Style. css. + +145 +00:13:15,100 --> 00:13:22,240 +Phần mà chúng tôi muốn bạn làm là xem lại những gì bạn đã học về bộ chọn CSS. + +146 +00:13:22,240 --> 00:13:26,830 +Và tôi đã thiết lập năm việc cần làm cho bạn và tôi muốn bạn thực hiện chúng theo thứ tự. + +147 +00:13:26,830 --> 00:13:31,120 +Vì vậy, hãy bắt đầu từ một rồi đến hai và tiếp tục đi xuống. + +148 +00:13:31,390 --> 00:13:37,000 +Điều này sẽ liên quan đến việc bạn viết mã CSS thực tế. + +149 +00:13:37,030 --> 00:13:44,650 +Tôi không muốn bạn thực sự chạm vào bất cứ thứ gì bên trong chỉ mục. html vì tôi không muốn bạn thay đổi bất kỳ + +150 +00:13:44,650 --> 00:13:48,970 +HTML nào bằng các lớp hoặc giá trị hoặc ID. + +151 +00:13:48,970 --> 00:13:51,340 +Tôi muốn bạn để nó chính xác như nó là. + +152 +00:13:51,370 --> 00:13:57,280 +Và thay vào đó, công việc của bạn là viết các bộ chọn theo kiểu dot CSS. + +153 +00:13:57,430 --> 00:14:04,660 +Chú ý khi bạn mở style. css đã có một ít CSS ở đây dành cho bạn và tôi muốn bạn để + +154 +00:14:04,660 --> 00:14:05,770 +yên phần này. + +155 +00:14:05,800 --> 00:14:07,540 +Đừng chạm vào nó, đừng thay đổi nó. + +156 +00:14:07,540 --> 00:14:13,780 +Điều quan trọng là kiểu dáng cuối cùng trông phù hợp khi chúng ta chưa đề cập đến tất cả các quy tắc tạo + +157 +00:14:13,780 --> 00:14:15,160 +kiểu CSS khác nhau. + +158 +00:14:15,160 --> 00:14:19,180 +Trong phần tiếp theo, chúng ta sẽ nói về tất cả những điều này một cách chi tiết hơn. + +159 +00:14:19,180 --> 00:14:22,480 +Nơi để tìm hiểu về các quy tắc khác nhau và cách sử dụng chúng. + +160 +00:14:22,480 --> 00:14:27,640 +Nhưng bây giờ, tôi muốn bạn bỏ qua phần này và viết CSS của bạn bên dưới. + +161 +00:14:28,240 --> 00:14:34,780 +Tương tự, tôi không mong bạn biết nên sử dụng quy tắc CSS nào vì tôi sẽ cung cấp tất cả các + +162 +00:14:34,780 --> 00:14:36,730 +quy tắc để bạn thực hiện. + +163 +00:14:36,730 --> 00:14:42,640 +Tôi muốn bạn thay đổi màu văn bản thành màu đỏ và để thực hiện hai việc, tôi muốn bạn thay đổi kích thước phông chữ + +164 +00:14:42,640 --> 00:14:48,220 +hoặc thay đổi căn chỉnh văn bản và tất cả những điều này sẽ được cung cấp cho bạn ở định dạng hoàn chỉnh. + +165 +00:14:48,220 --> 00:14:53,590 +Vì vậy, nó có thuộc tính, dấu hai chấm và giá trị mà tôi muốn bạn đặt cho nó. + +166 +00:14:53,620 --> 00:14:59,710 +Bây giờ, phần mà bạn cần suy nghĩ và thách thức của bạn xuất hiện ở đâu là cách chọn. + +167 +00:14:59,940 --> 00:15:01,080 +Các đường dẫn chính xác. + +168 +00:15:01,080 --> 00:15:07,860 +Vậy làm thế nào để chọn tất cả các đoạn văn, ví dụ, hoặc làm thế nào để chọn các phần với một lớp của cái này hoặc + +169 +00:15:07,860 --> 00:15:09,240 +một ID của cái này? + +170 +00:15:09,240 --> 00:15:10,620 +Vì vậy, đó là thách thức. + +171 +00:15:10,620 --> 00:15:14,040 +Và đây là những gì bạn cần làm trong bài tập này. + +172 +00:15:14,490 --> 00:15:21,540 +Và nếu bạn xem bản xem trước ngay bây giờ, nó rất đơn giản, toàn màu đen, không có kiểu dáng gì cả. + +173 +00:15:21,570 --> 00:15:27,630 +Nhưng nếu bạn nhìn vào PNG mục tiêu, bạn sẽ thấy đây là kết quả cuối cùng sẽ như thế nào. + +174 +00:15:27,630 --> 00:15:33,330 +Nó sẽ được căn giữa, nó sẽ có các màu khác nhau và thậm chí bạn có thể + +175 +00:15:33,330 --> 00:15:42,720 +sử dụng trang web này như một công cụ sửa đổi vì mỗi dấu đầu dòng được liên kết với một kiểu lựa chọn CSS cụ thể. + +176 +00:15:43,020 --> 00:15:50,820 +Hy vọng đây sẽ là một thử thách khá thú vị đối với bạn và nếu bạn gặp khó khăn, hãy nhớ tua lại video một chút để + +177 +00:15:50,850 --> 00:15:56,280 +xem cách thực hiện những việc khác nhau như đã thấy trong các ví dụ trước. + +178 +00:15:56,280 --> 00:16:01,750 +Và tôi muốn bạn thực sự cố gắng trước khi tiếp tục và xem giải pháp. + +179 +00:16:02,410 --> 00:16:03,460 +Tạm dừng video ngay bây giờ. + +180 +00:16:03,460 --> 00:16:04,450 +Cho cái này đi. + +181 +00:16:09,440 --> 00:16:09,860 +Được rồi. + +182 +00:16:09,860 --> 00:16:14,210 +Vì vậy, điều đầu tiên chúng tôi sẽ làm là mở bản xem trước của mình lên để đảm bảo rằng chúng + +183 +00:16:14,210 --> 00:16:15,470 +tôi đang làm đúng. + +184 +00:16:15,470 --> 00:16:23,660 +Và để bắt đầu, việc đầu tiên cần làm là đặt CSS cho tất cả các thẻ đoạn thành màu này. + +185 +00:16:23,660 --> 00:16:29,750 +Bây giờ, hãy nhớ rằng, tôi đã nói rằng chúng tôi không viết bất kỳ mã nào hoặc thay đổi bất kỳ thứ gì ở phía HTML. + +186 +00:16:29,750 --> 00:16:37,730 +Chúng tôi đang làm tất cả trong CSS của mình, nhưng điều thực sự quan trọng là chúng tôi xem xét những gì trong mã HTML + +187 +00:16:37,730 --> 00:16:41,030 +của mình để hoàn thành từng bước của thử thách. + +188 +00:16:41,180 --> 00:16:42,350 +Cái đầu tiên thì dễ. + +189 +00:16:42,350 --> 00:16:47,180 +Chúng tôi sẽ nhắm mục tiêu tất cả các thẻ đoạn văn và chúng tôi sẽ áp dụng kiểu CSS này. + +190 +00:16:47,180 --> 00:16:54,140 +Vì vậy, hãy để tôi sao chép kiểu CSS, dán nó vào và bây giờ tôi gặp lỗi vì tôi chưa chọn kiểu + +191 +00:16:54,140 --> 00:16:56,030 +này sẽ được áp dụng cho. + +192 +00:16:56,240 --> 00:17:01,790 +Trong trường hợp này, chúng tôi đang áp dụng nó cho tất cả các thành phần đoạn văn, vì vậy chúng tôi + +193 +00:17:01,790 --> 00:17:09,150 +đang sử dụng bộ chọn thành phần và tất cả những gì chúng tôi phải làm ở đó chỉ đơn giản là thêm tên của thẻ, sau đó áp dụng nó và bạn có thể + +194 +00:17:09,150 --> 00:17:12,750 +thấy dòng đầu tiên của viên đạn của chúng tôi hiện đã được đọc. + +195 +00:17:13,170 --> 00:17:15,030 +Đó là để làm số một. + +196 +00:17:15,030 --> 00:17:15,569 +Xong. + +197 +00:17:15,569 --> 00:17:17,910 +Hãy chuyển sang phần tiếp theo để làm như vậy. + +198 +00:17:17,910 --> 00:17:26,430 +Trong phần này, chúng tôi muốn đặt CSS cho tất cả các phần tử có lớp this theo quy tắc CSS này. + +199 +00:17:26,430 --> 00:17:30,960 +Vì vậy, hãy để tôi sao chép lại quy tắc CSS và sau đó dán nó vào bên dưới. + +200 +00:17:31,140 --> 00:17:37,020 +Và bây giờ chúng ta sẽ sử dụng bộ chọn lớp và chọn tất cả các phần tử. + +201 +00:17:37,020 --> 00:17:42,270 +Vì vậy, hãy lưu ý cách chúng ta có nhiều phần tử với cùng một lớp, mặc dù chúng được áp dụng cho các phần + +202 +00:17:42,270 --> 00:17:46,680 +tử khác nhau, nhưng chúng ta có thể chọn giữa chúng bằng cách sử dụng bộ chọn lớp. + +203 +00:17:46,950 --> 00:17:52,530 +Bộ chọn lớp, nếu bạn còn nhớ, yêu cầu dấu chấm, và ngay sau đó chúng tôi thêm tên + +204 +00:17:52,530 --> 00:17:58,350 +của lớp, rồi chúng tôi đặt lại quy tắc CSS của mình vào giữa các dấu ngoặc nhọn. + +205 +00:17:58,350 --> 00:18:06,570 +Và điều này đã làm được là nó đã áp dụng kích thước phông chữ lớn hơn cho tất cả các phần tử HTML có lớp đó được áp dụng cho chúng, + +206 +00:18:06,570 --> 00:18:11,970 +đó là tất cả các dấu đầu dòng ở đây, nhưng không phải là H một hoặc H hai. + +207 +00:18:12,390 --> 00:18:14,610 +Vậy là xong việc thứ hai. + +208 +00:18:14,640 --> 00:18:22,890 +Bước tiếp theo là đặt CSS cho phần tử có ID duy nhất cụ thể và ID là ID này. + +209 +00:18:22,890 --> 00:18:24,450 +Vậy cái nào có ID đó? + +210 +00:18:24,690 --> 00:18:31,710 +Đây là phần tử danh sách cụ thể này và chúng tôi sẽ đặt nó để có quy tắc truy cập để chuyển sang màu xanh lục với tên ID + +211 +00:18:33,660 --> 00:18:37,530 +hoặc tên lớp hoặc tên thuộc tính, bất kỳ thứ nào trong số đó. + +212 +00:18:37,530 --> 00:18:41,340 +Điều rất quan trọng là bạn không mắc bất kỳ lỗi chính tả nào. + +213 +00:18:41,340 --> 00:18:48,090 +Những gì tôi thường làm là tôi thường sao chép nó và sau đó dán nó vào để tôi không thực sự thêm + +214 +00:18:48,090 --> 00:18:52,470 +nhầm chữ s viết hoa hoặc thứ gì khác mà tôi có thể viết sai. + +215 +00:18:52,470 --> 00:18:57,270 +Vì vậy, hãy nhớ rằng bộ chọn ID là dấu thăng hoặc dấu thăng. + +216 +00:18:57,270 --> 00:19:05,490 +Và sau khi chúng tôi đưa quy tắc của mình vào bên trong bộ chọn đó, bạn sẽ thấy dấu đầu dòng số ba chuyển sang + +217 +00:19:05,490 --> 00:19:11,610 +màu xanh lục, bởi vì đó là mục duy nhất và nó phải là mục duy nhất có cùng ID. + +218 +00:19:12,690 --> 00:19:21,480 +Bây giờ, hãy chuyển sang Công việc cần làm số bốn, đó là đặt CSS cho các phần tử có thuộc tính giá trị + +219 +00:19:21,480 --> 00:19:23,520 +được đặt thành bốn. + +220 +00:19:23,760 --> 00:19:32,610 +Và bây giờ hãy chú ý rằng tất cả các mục trong danh sách được sắp xếp, tôi đã đặt một thuộc tính giá trị. + +221 +00:19:32,610 --> 00:19:42,210 +Và điều này có tác dụng gì, nếu bạn xem tài liệu web về thành phần mục danh sách thì thuộc tính này có thể cho biết + +222 +00:19:42,210 --> 00:19:46,290 +giá trị thứ tự hiện tại của mục danh sách. + +223 +00:19:46,290 --> 00:19:56,640 +Theo mặc định, khi bạn có một mục danh sách trong danh sách được sắp xếp theo thứ tự, nó sẽ bắt đầu đánh số từ một mục như vậy, vì vậy đây + +224 +00:19:56,640 --> 00:19:58,410 +là mục danh sách này. + +225 +00:19:58,410 --> 00:20:04,560 +Nhưng vì tôi có thẻ đoạn văn ở trên và tôi muốn định dạng thẻ này để chúng + +226 +00:20:04,560 --> 00:20:14,700 +ta có một bài tập CSS thú vị, tôi đã đặt thuộc tính giá trị để danh sách bắt đầu từ hai, điều này hoàn toàn hợp lệ và tôi đã + +227 +00:20:14,700 --> 00:20:20,100 +đặt nó cho tất cả các mục khác để chúng tôi tiếp tục danh sách. + +228 +00:20:21,420 --> 00:20:28,260 +Trong trường hợp này, chúng ta sẽ sử dụng bộ chọn thuộc tính để chọn thuộc tính giá trị này và chuyển văn bản thành + +229 +00:20:28,260 --> 00:20:29,520 +màu xanh lam. + +230 +00:20:29,610 --> 00:20:36,120 +Hãy dán quy tắc CSS và sau đó nhớ rằng, cách chúng tôi sử dụng trình kiểm tra thuộc tính là trước tiên chúng + +231 +00:20:36,120 --> 00:20:42,420 +tôi chọn phần tử trong mục danh sách trường hợp này, sau đó chúng tôi thêm một số dấu ngoặc vuông. + +232 +00:20:42,420 --> 00:20:48,540 +Và bên trong dấu ngoặc vuông, chúng tôi thêm thuộc tính mà chúng tôi muốn chọn, trong trường hợp này được + +233 +00:20:48,540 --> 00:20:49,410 +gọi là giá trị. + +234 +00:20:49,410 --> 00:20:57,150 +Và nếu ngay bây giờ tôi đã đóng các dấu ngoặc nhọn này, vì vậy chúng tôi chọn thuộc tính đó sẽ + +235 +00:20:57,150 --> 00:21:05,160 +chuyển tất cả các mục trong danh sách có thuộc tính của tập giá trị, về cơ bản là cả bốn mục này. + +236 +00:21:05,190 --> 00:21:08,550 +Bây giờ, một số bạn có thể đã nhận thấy dấu đầu dòng thứ ba, mà. + +237 +00:21:08,610 --> 00:21:13,470 +Giữ nguyên màu xanh lục thay vì chuyển sang màu xanh dương như các phần tử còn lại trong danh sách. + +238 +00:21:13,500 --> 00:21:19,650 +Bây giờ, nếu bạn tò mò về lý do tại sao lại như vậy, thì điều này liên quan đến một thứ gọi là tính đặc hiệu của + +239 +00:21:19,680 --> 00:21:22,380 +CSS liên quan đến mức độ cụ thể của quy tắc. + +240 +00:21:22,410 --> 00:21:28,560 +Bây giờ, chúng ta sẽ trình bày vấn đề này trong Phần bảy cho mô-đun CSS nâng cao của chúng ta. + +241 +00:21:28,560 --> 00:21:32,070 +Vì vậy, đó là điều bạn có thể mong đợi trong tương lai. + +242 +00:21:32,700 --> 00:21:39,930 +Bây giờ, nếu chúng ta muốn đặt thuộc tính mà chúng ta muốn chọn thành một giá trị cụ thể, trong + +243 +00:21:39,930 --> 00:21:47,100 +trường hợp này là giá trị bằng bốn, thì tôi phải đi xa hơn một chút và đặt giá trị này bằng bốn. + +244 +00:21:47,280 --> 00:21:52,830 +Và bây giờ bạn có thể thấy nó chỉ chọn viên đạn thứ tư này và biến nó thành màu xanh lam. + +245 +00:21:54,380 --> 00:21:56,780 +Bây giờ, bộ chọn thuộc tính có thể hơi phức tạp một chút. + +246 +00:21:56,780 --> 00:22:02,450 +Vì vậy, nếu bạn hoàn toàn không hiểu điều này, hãy nhớ tua lại video và xem lại phần đó của + +247 +00:22:02,450 --> 00:22:08,000 +video, chỉ để đảm bảo rằng bạn hoàn toàn hiểu những gì đang diễn ra trước khi tiếp tục. + +248 +00:22:08,540 --> 00:22:11,510 +Cuối cùng để làm là dễ dàng nhất. + +249 +00:22:11,540 --> 00:22:17,480 +Tất cả những gì chúng ta phải làm là đặt tất cả các thành phần thành văn bản, căn chỉnh vào giữa. + +250 +00:22:17,810 --> 00:22:23,570 +Khi chúng tôi muốn chọn tất cả các phần tử, chúng tôi sử dụng bộ chọn chung, đó là dấu hoa thị. + +251 +00:22:23,570 --> 00:22:31,490 +Và sau đó, khi chúng tôi dán quy tắc này, bây giờ bạn sẽ thấy bản xem trước của chúng tôi trông giống hệt như những gì chúng tôi muốn + +252 +00:22:31,490 --> 00:22:34,370 +cho mục tiêu của mình. Mọi thứ được căn giữa. + +253 +00:22:34,400 --> 00:22:41,690 +Có rất nhiều kiểu dáng khác nhau đang được áp dụng và giờ đây chúng tôi đã xoay sở để đạt được tất cả những việc + +254 +00:22:41,690 --> 00:22:44,030 +cần làm trong bài tập của mình. + +255 +00:22:44,450 --> 00:22:45,830 +Vì vậy, hy vọng rằng có ý nghĩa. + +256 +00:22:45,830 --> 00:22:49,680 +Và nó đã giúp bạn xem lại tất cả những điều chúng ta đã học được trong bài học này. + +257 +00:22:49,700 --> 00:22:55,590 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo, nơi chúng ta có dự án cuối cùng cho phần này. + diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 5.4-Color-Vocab-Project.zip b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 5.4-Color-Vocab-Project.zip new file mode 100644 index 0000000000000000000000000000000000000000..5105f4e99df8f38c67a5e121253da4fa88494b50 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 5.4-Color-Vocab-Project.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cdb1bc05447de14cdf838d41910c6444901e6babc3e3e5630b92ac7d7b8aba2 +size 894657 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 Day 43 Project - Colour Vocab Website.mp4 b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 Day 43 Project - Colour Vocab Website.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..20f34605d66ae9f291d3e5acfdcaab6dc036ae7e --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 Day 43 Project - Colour Vocab Website.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d710113588341775bb098297128744eaec899949549d2ae1c1e9019d001bfa20 +size 54406336 diff --git a/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 Day 43 Project - Colour Vocab Website_vi.srt b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 Day 43 Project - Colour Vocab Website_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..357b53e74379c23c64ee62f2e4153f61cc711014 --- /dev/null +++ b/part3/43 - Day 43 - Web Foundation - Introduction to CSS/005 Day 43 Project - Colour Vocab Website_vi.srt @@ -0,0 +1,456 @@ +1 +00:00:00,290 --> 00:00:00,680 +Được rồi. + +2 +00:00:00,680 --> 00:00:04,220 +Vì vậy, bây giờ là lúc cho dự án cuối cùng của chúng tôi trong phần này. + +3 +00:00:04,220 --> 00:00:09,320 +Và trong dự án này, chúng tôi sẽ xây dựng một trang web để giúp bạn học tiếng Tây Ban Nha. + +4 +00:00:09,440 --> 00:00:14,900 +Bây giờ, bạn có thể đã biết tiếng Tây Ban Nha, nhưng tôi hiện đang học tiếng Tây Ban Nha và có rất nhiều từ vựng + +5 +00:00:14,900 --> 00:00:15,760 +cần phải học. + +6 +00:00:15,770 --> 00:00:21,050 +Tôi nghĩ, Tại sao chúng ta không xây dựng một trang web flashcard từ vựng? + +7 +00:00:21,050 --> 00:00:22,820 +Nhưng một cái thực sự, thực sự đơn giản. + +8 +00:00:22,820 --> 00:00:30,650 +Sử dụng mọi thứ chúng ta biết cho đến nay trong dự án này, chúng ta sẽ tạo một trang web nơi chúng ta liệt kê các + +9 +00:00:30,680 --> 00:00:34,400 +từ, trong trường hợp này là tiếng Tây Ban Nha. + +10 +00:00:34,400 --> 00:00:40,370 +Đó có thể là bất kỳ ngôn ngữ nào khác mà bạn chọn và chúng ta sẽ ghép ngôn ngữ đó với một hình ảnh có màu cụ thể + +11 +00:00:40,370 --> 00:00:44,300 +để chúng ta học tất cả các màu trong ngôn ngữ nước ngoài của mình. + +12 +00:00:44,480 --> 00:00:47,450 +Đây là giao diện của trang web cuối cùng. + +13 +00:00:47,450 --> 00:00:55,370 +Chúng tôi đã có từ nước ngoài có màu sắc phù hợp với hình ảnh. + +14 +00:00:55,370 --> 00:01:02,640 +Và chúng ta có tất cả các hình ảnh được xếp thành những ô vuông nhỏ xinh xắn để chúng ta có thể cuộn qua trang web này và học + +15 +00:01:02,640 --> 00:01:05,160 +các từ chỉ màu sắc bằng tiếng Tây Ban Nha. + +16 +00:01:05,340 --> 00:01:11,700 +Khi bạn đã sẵn sàng, hãy tiếp tục và tải xuống các tệp bắt đầu dự án từ vựng màu, giải nén và mở + +17 +00:01:11,700 --> 00:01:16,800 +nó bên trong so với mã trong chỉ mục. html. + +18 +00:01:16,830 --> 00:01:20,330 +Bạn sẽ thấy rằng tôi đã thiết lập cho bạn một số mã bắt đầu. + +19 +00:01:20,340 --> 00:01:29,460 +Nếu bạn tiếp tục và hiển thị nó dưới dạng bản xem trước, bạn sẽ thấy một số từ chỉ các màu bằng tiếng Tây Ban Nha và các hình ảnh khác + +20 +00:01:29,460 --> 00:01:31,500 +nhau cho các màu khác nhau. + +21 +00:01:31,530 --> 00:01:34,650 +Bây giờ đừng lo lắng về thực tế là các hình ảnh đều có kích thước khác nhau. + +22 +00:01:34,650 --> 00:01:38,490 +Chúng tôi sẽ sớm khắc phục điều đó bằng CSS trong dự án. + +23 +00:01:38,700 --> 00:01:46,320 +Điều đầu tiên cần lưu ý là chúng tôi đã thiết lập cho bạn một liên kết đến biểu định kiểu bên ngoài nằm trong + +24 +00:01:46,320 --> 00:01:48,210 +Style. css. + +25 +00:01:48,210 --> 00:01:55,680 +Nhưng lưu ý rằng chúng tôi chưa tạo tệp đó cho bạn, vì vậy tôi muốn bạn tạo một tệp mới bên trong vị + +26 +00:01:55,680 --> 00:02:03,450 +trí chính xác bằng cách sử dụng nút này trong mã VS và sau đó đặt tên cho nó sau khi bạn đã tạo để nó thực + +27 +00:02:03,450 --> 00:02:04,560 +sự hoạt động. + +28 +00:02:04,560 --> 00:02:11,670 +Và một trong những điều mà tôi thường kiểm tra để đảm bảo rằng CSS bên ngoài của tôi được liên + +29 +00:02:11,670 --> 00:02:17,790 +kết với nhau là nhắm mục tiêu mọi thứ trên trang và đặt màu nền thành màu đỏ. + +30 +00:02:17,820 --> 00:02:24,330 +Bằng cách đó, bạn biết rằng nếu nó thực sự hoạt động, thì nó được liên kết chính xác và nó thực sự rõ ràng + +31 +00:02:24,330 --> 00:02:26,460 +khi nó không thích ngay bây giờ. + +32 +00:02:26,460 --> 00:02:32,070 +Và lý do ở đây là vì phong cách của tôi. css thực sự nằm ngoài thư mục này. + +33 +00:02:32,070 --> 00:02:39,000 +Nó chỉ trôi nổi ở đâu đó và tôi phải lấy nó sao cho nó ở vị trí mà tôi đã chỉ định trong liên + +34 +00:02:39,000 --> 00:02:41,580 +kết biểu định kiểu bên ngoài. + +35 +00:02:41,580 --> 00:02:47,250 +Vì vậy, tôi không muốn bạn thay đổi bất cứ điều gì bên trong chỉ mục. html. + +36 +00:02:47,250 --> 00:02:55,080 +Thay vào đó, tất cả công việc của bạn sẽ diễn ra bên trong tệp CSS mà bạn sẽ tạo và bạn sẽ kết hợp vào dự án của mình + +37 +00:02:55,080 --> 00:03:03,270 +bằng cách sử dụng đường dẫn tệp này để đảm bảo rằng bạn hiểu cách thức hoạt động của đường dẫn tệp và cách bạn có thể tạo + +38 +00:03:03,270 --> 00:03:06,330 +tệp này cho chính mình trong tương lai. + +39 +00:03:07,500 --> 00:03:14,280 +Bây giờ, nếu chúng ta cuộn xuống, bạn có thể thấy có 5 màu khác nhau, 5 hình ảnh khác + +40 +00:03:14,280 --> 00:03:16,950 +nhau và có một số màu h2 và H. + +41 +00:03:17,460 --> 00:03:24,540 +Để hoàn thành dự án này, tôi đã tạo cho bạn một số bước về việc cần làm mà bạn có thể làm theo. + +42 +00:03:24,540 --> 00:03:29,610 +Ngoài ra, bạn có thể chỉ cần nhìn vào hình ảnh mục tiêu và cố gắng tìm ra chính mình. + +43 +00:03:29,640 --> 00:03:36,000 +Bạn có thể sử dụng cách tiếp cận từng bước trong việc cần làm hoặc bạn có thể sử dụng mục tiêu và tự mình làm mọi thứ. + +44 +00:03:36,000 --> 00:03:37,890 +Nó hoàn toàn phụ thuộc vào bạn. + +45 +00:03:38,640 --> 00:03:45,870 +Tuy nhiên, những gì bạn đang hướng tới là phiên bản cuối cùng của trang web, bạn có thể xem phiên bản này bằng cách nhấp chuột + +46 +00:03:45,870 --> 00:03:49,290 +phải vào giải pháp chấm HTML, mở nó trong bản xem trước. + +47 +00:03:49,290 --> 00:03:55,590 +Và điều quan trọng nhất tôi muốn chỉ ra là hình ảnh là hình vuông. + +48 +00:03:55,620 --> 00:04:02,120 +Chúng có kích thước 200 pixel x 200 pixel, cao 200 pixel, rộng 200 pixel. + +49 +00:04:02,120 --> 00:04:09,590 +Thứ hai, độ dày phông chữ của h twos này khác với h twos bình thường. + +50 +00:04:09,620 --> 00:04:11,510 +Chúng thực sự nhẹ hơn rất nhiều. + +51 +00:04:11,510 --> 00:04:18,140 +Vì vậy, chúng tôi đã đặt trọng lượng phông chữ thành bình thường thay vì mặc định, đó là h để được in đậm. + +52 +00:04:18,320 --> 00:04:23,450 +Điều tiếp theo là màu sắc của văn bản phải phù hợp với ý nghĩa. + +53 +00:04:23,450 --> 00:04:27,320 +Vì vậy, rojo có nghĩa là màu đỏ azul có nghĩa là màu xanh. + +54 +00:04:27,320 --> 00:04:32,300 +Và bởi vì trong chỉ mục của chúng tôi. html Tôi đã ghép từng cái với nhau. + +55 +00:04:32,300 --> 00:04:39,020 +Nhưng bạn cũng có thể xem ID nếu bạn không biết các từ tiếng Tây Ban Nha vì chúng ta đang + +56 +00:04:39,020 --> 00:04:45,040 +học chúng, vì vậy màu vàng là Amarillo, màu xanh lá cây là Verde, v.v. + +57 +00:04:45,050 --> 00:04:53,510 +Vì vậy, tôi muốn bạn đảm bảo rằng các h twos này có màu văn bản phù hợp với bất kỳ màu nào mà nó được cho + +58 +00:04:53,510 --> 00:04:53,900 +là. + +59 +00:04:53,900 --> 00:04:56,780 +Vì vậy, màu xanh hoặc màu cam hoặc màu xanh lá cây hoặc bất kỳ thứ gì. + +60 +00:04:56,780 --> 00:04:59,420 +Vì vậy, nếu bạn bối rối, hãy nhìn vào dấu chấm mục tiêu PNG. + +61 +00:04:59,960 --> 00:05:03,380 +Nếu bạn muốn đi từng bước, hãy xem phần việc cần làm ở phía dưới. + +62 +00:05:03,380 --> 00:05:09,050 +Nhưng quan trọng, không viết bất cứ điều gì hoặc thay đổi bất cứ điều gì trong chỉ mục. html. + +63 +00:05:09,080 --> 00:05:11,600 +Tất cả công việc của bạn đi vào tệp CSS. + +64 +00:05:11,900 --> 00:05:14,600 +Tạm dừng video và thử ngay bây giờ. + +65 +00:05:19,890 --> 00:05:20,250 +Được rồi. + +66 +00:05:20,250 --> 00:05:22,230 +Vì vậy, hãy cùng nhau tìm hiểu giải pháp. + +67 +00:05:22,230 --> 00:05:27,450 +Vì vậy, điều đầu tiên chúng ta sẽ làm là đảm bảo rằng thư mục giải pháp đã được thu gọn. + +68 +00:05:27,450 --> 00:05:29,160 +Vì vậy, nó không khó hiểu. + +69 +00:05:29,160 --> 00:05:37,200 +Và sau đó chúng ta sẽ chọn thư mục này và sau đó thêm một tệp mới, mà tôi sẽ gọi là style dot CSS. + +70 +00:05:37,230 --> 00:05:41,310 +Hãy nhớ rằng, tên tệp phải khớp với tên được đề cập ở đây. + +71 +00:05:41,310 --> 00:05:42,330 +Chính xác. + +72 +00:05:42,330 --> 00:05:48,630 +Đôi khi bạn sẽ thấy mọi người có phong cách. css, đôi khi bạn sẽ thấy dấu chấm CSS chính, nhưng miễn là tên tệp phù + +73 +00:05:48,630 --> 00:05:50,520 +hợp thì điều đó không thực sự quan trọng. + +74 +00:05:50,520 --> 00:05:52,770 +Bạn muốn đặt tên như thế nào là tùy bạn. + +75 +00:05:53,130 --> 00:06:00,360 +Khi tôi đã tạo xong, hãy đảm bảo rằng tệp CSS của tôi được liên kết đúng cách bằng cách thực hiện + +76 +00:06:00,360 --> 00:06:01,950 +thay đổi màu nền đó. + +77 +00:06:01,950 --> 00:06:06,090 +Vì vậy, hãy thay đổi nó thành Màu đỏ và sau đó hãy tiếp tục và xem trước phần này. + +78 +00:06:06,090 --> 00:06:10,290 +Và nếu nền có màu đỏ, thì nó có nghĩa là nó hoạt động. + +79 +00:06:10,290 --> 00:06:14,550 +Vì vậy, bây giờ tôi có thể xóa cái này và thoát khỏi nền kinh khủng đó. + +80 +00:06:15,120 --> 00:06:23,230 +Bước tiếp theo là tiếp tục và sử dụng CSS để tạo kiểu cho từng tiêu đề màu sao cho màu phù hợp với + +81 +00:06:23,230 --> 00:06:24,070 +ý nghĩa. + +82 +00:06:24,460 --> 00:06:34,360 +Cái đầu tiên mà chúng tôi muốn chọn là H2 này, hiển thị Rojo và nó có ID màu đỏ. + +83 +00:06:34,360 --> 00:06:37,930 +Vì vậy, hãy nhớ rằng ID là duy nhất, vì vậy chúng ta chỉ cần chọn ID đó. + +84 +00:06:37,930 --> 00:06:45,190 +Vì vậy, hãy chọn phần tử có ID màu đỏ và đặt màu của nó thành màu đỏ. + +85 +00:06:45,580 --> 00:06:49,390 +Và vì vậy chúng ta có thể làm điều tương tự cho các màu còn lại. + +86 +00:06:49,390 --> 00:06:52,390 +Vì vậy, bây giờ tất cả chúng đều phù hợp với ý nghĩa của chúng. + +87 +00:06:52,660 --> 00:06:59,620 +Bước tiếp theo là sử dụng CSS để thay đổi tất cả các tiêu đề màu, để có độ dày phông chữ khác. + +88 +00:06:59,620 --> 00:07:02,710 +Và đây là những gì chúng tôi muốn trọng lượng phông chữ bình thường. + +89 +00:07:02,710 --> 00:07:10,180 +Nếu chúng tôi muốn chọn tất cả các h2, thì chúng tôi sẽ gặp sự cố vì cái này cũng là H2 và chúng tôi không muốn + +90 +00:07:10,180 --> 00:07:13,690 +cái đó có trọng lượng phông chữ bình thường. + +91 +00:07:13,690 --> 00:07:15,640 +Chúng tôi vẫn muốn điều đó được táo bạo. + +92 +00:07:15,640 --> 00:07:18,970 +Chúng tôi muốn những thứ này có trọng lượng phông chữ thấp hơn. + +93 +00:07:19,000 --> 00:07:22,060 +Vì vậy, những gì là duy nhất cho tất cả những điều này? + +94 +00:07:22,060 --> 00:07:29,200 +Chà, chúng tôi đã áp dụng một lớp tiêu đề màu cho mỗi người trong số họ, điều mà H2 này không có. + +95 +00:07:29,230 --> 00:07:36,880 +Sau đó, điều đó có nghĩa là chúng ta có thể chỉ cần chọn tiêu đề gạch ngang màu và sau đó áp dụng trọng lượng phông chữ cho tất cả những + +96 +00:07:36,880 --> 00:07:38,680 +tiêu đề có cùng loại đó. + +97 +00:07:38,680 --> 00:07:43,540 +Và bạn có thể thấy sự khác biệt giữa H2 này và H2 này. + +98 +00:07:43,540 --> 00:07:49,780 +Và thay vào đó, tất cả những thứ được nhóm lại với nhau đều được áp dụng kiểu đó. + +99 +00:07:50,020 --> 00:07:53,410 +Bây giờ điều cuối cùng chúng ta cần làm là sử dụng CSS. + +100 +00:07:53,440 --> 00:08:00,070 +Không, không phải HTML để làm cho tất cả các hình ảnh có chiều cao 200 pixel và chiều rộng 200 pixel. + +101 +00:08:00,790 --> 00:08:02,200 +Làm thế nào chúng ta có thể làm điều đó? + +102 +00:08:02,200 --> 00:08:06,670 +Chà, chúng ta chỉ cần chọn phần tử hình ảnh. + +103 +00:08:06,670 --> 00:08:17,230 +Vì vậy, điều này đang sử dụng bộ chọn phần tử và chúng ta có thể đặt chiều cao thành 200 pixel và chiều rộng thành 200 pixel. + +104 +00:08:17,410 --> 00:08:19,180 +Và bạn có nó rồi đấy! + +105 +00:08:19,180 --> 00:08:26,140 +Tất cả các hình ảnh của chúng tôi hiện là hình vuông phù hợp với chiều cao và chiều rộng mà chúng tôi đã chỉ định. + +106 +00:08:26,380 --> 00:08:30,820 +Tất nhiên, bạn có thể thay đổi điều này và cá nhân hóa nó bao nhiêu tùy thích. + +107 +00:08:30,820 --> 00:08:36,820 +Thay đổi màu sắc hoặc thay đổi từ ngữ, học màu sắc bằng một ngôn ngữ khác, làm cho mọi thứ trở nên đẹp + +108 +00:08:36,820 --> 00:08:39,789 +hơn bằng cách sử dụng kiểu dáng mà bạn đã học. + +109 +00:08:39,820 --> 00:08:46,180 +Nhưng trong phần tiếp theo, chúng ta sẽ đề cập nhiều hơn về các quy tắc CSS khác nhau và bạn sẽ có nhiều + +110 +00:08:46,180 --> 00:08:50,320 +công cụ hơn để tùy ý sử dụng để tạo kiểu cho trang web của mình. + +111 +00:08:50,470 --> 00:08:56,680 +Vì vậy, tôi hy vọng bạn thấy vui vẻ trong phần này khi chúng tôi giới thiệu bạn với CSS khi bạn đã sẵn sàng. + +112 +00:08:56,710 --> 00:09:03,760 +Có thể là ngày mai, có thể là ngày hôm sau, hãy chuyển sang phần tiếp theo và tiếp tục tìm hiểu về các khía + +113 +00:09:03,760 --> 00:09:05,740 +cạnh trung gian của CSS. + +114 +00:09:05,770 --> 00:09:08,440 +Vì tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 6.0-CSS-Colors.zip b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 6.0-CSS-Colors.zip new file mode 100644 index 0000000000000000000000000000000000000000..fe13781c58e1eae6ced4ec6b5316b0bc3316b020 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 6.0-CSS-Colors.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:468589e20cc4fdc8743a246d1b802ebe5a4886f34b1742c5c017e9a091919607 +size 18783 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 CSS Colours.mp4 b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 CSS Colours.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1b58ec6c9260825244f5048c247ad89f4cd40884 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 CSS Colours.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6362debd64a068a13bbb2900265f6e772e8ccb456338a71ca0a433f83aa9444c +size 53221104 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 CSS Colours_vi.srt b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 CSS Colours_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..0c0e8745163a70f851dd66ba745cfa8b00f965ad --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 CSS Colours_vi.srt @@ -0,0 +1,372 @@ +1 +00:00:00,110 --> 00:00:08,300 +Bây giờ, chúng ta đã sử dụng một số thuộc tính CSS để áp dụng cho các phần tử HTML khác nhau của mình, nhưng trong phần + +2 +00:00:08,300 --> 00:00:13,220 +này, chúng ta sẽ đi sâu vào một số thuộc tính CSS quan trọng nhất mà bạn + +3 +00:00:13,220 --> 00:00:14,690 +sẽ thấy và sử dụng. + +4 +00:00:14,720 --> 00:00:20,300 +Và chúng ta sẽ bắt đầu với CSS, thuộc tính màu, một số thuộc tính màu mà bạn đã + +5 +00:00:20,300 --> 00:00:21,410 +thấy trước đó. + +6 +00:00:21,530 --> 00:00:28,640 +Tôi đã chỉ cho bạn cách đặt màu nền của một phần tử HTML cụ thể bằng cách sử dụng thuộc + +7 +00:00:29,180 --> 00:00:30,800 +tính màu nền. + +8 +00:00:30,800 --> 00:00:36,920 +Và trước đây chúng tôi đã đặt nó thành các màu cơ bản như đỏ hoặc xanh dương hoặc xanh lá cây. + +9 +00:00:37,040 --> 00:00:45,080 +Và hãy nhớ rằng cách mà các quy tắc CSS hoạt động là phần đầu tiên là thuộc tính. + +10 +00:00:46,280 --> 00:00:52,850 +Và phần đứng sau dấu hai chấm là giá trị mà bạn muốn đặt thuộc tính đó. + +11 +00:00:52,880 --> 00:00:59,630 +Vì vậy, trong trường hợp này, chúng tôi đang đặt màu nền của phần tử HTML, phần tử này chứa mọi thứ trên trang web + +12 +00:00:59,630 --> 00:01:00,660 +của chúng tôi. + +13 +00:01:00,660 --> 00:01:04,769 +Vì vậy, toàn bộ trang web có màu đỏ. + +14 +00:01:04,769 --> 00:01:06,510 +Đó là những gì quy tắc đó làm. + +15 +00:01:06,690 --> 00:01:10,170 +Bây giờ, có nhiều loại thuộc tính màu sắc khác nhau. + +16 +00:01:10,170 --> 00:01:15,090 +Có màu nền, nhưng bạn cũng có thể chỉ cần sử dụng thuộc tính màu. + +17 +00:01:15,090 --> 00:01:19,080 +Và điều này làm là nó thiết lập màu sắc cho văn bản. + +18 +00:01:19,080 --> 00:01:21,900 +Vì vậy, luôn luôn kiểm tra các tài liệu. + +19 +00:01:21,930 --> 00:01:25,200 +Nếu bạn không chắc tài sản nào làm gì. + +20 +00:01:26,370 --> 00:01:32,460 +Lưu ý rằng trong trường hợp này, chúng tôi có hai màu, chúng tôi đặt tên là Đỏ và Xanh lam. + +21 +00:01:32,490 --> 00:01:35,640 +Chà, làm thế nào để chúng ta biết rằng chúng ta có thể sử dụng những màu này? + +22 +00:01:35,640 --> 00:01:37,380 +Và chính xác thì chúng là gì? + +23 +00:01:37,500 --> 00:01:39,810 +Chà, chúng được gọi là màu sắc được đặt tên. + +24 +00:01:39,810 --> 00:01:47,910 +Và có cả đống chúng ngoài kia với những cái tên thơ mộng như Cornflower Blue hoặc Cadet + +25 +00:01:47,910 --> 00:01:51,390 +Blue hoặc xám mờ hoặc xám ô liu, v.v. + +26 +00:01:51,390 --> 00:01:56,340 +Và tất nhiên, bạn có thể tìm thấy tất cả chúng bằng cách truy cập tài liệu dành cho nhà phát triển. + +27 +00:01:56,430 --> 00:02:03,140 +Nếu bạn tìm trên Google các tài liệu có tên color, liên kết đầu tiên sẽ đưa bạn đến trang web này. + +28 +00:02:03,150 --> 00:02:08,580 +Ngoài ra, bạn cũng có thể sử dụng URL này và cú pháp khá đơn giản. + +29 +00:02:08,580 --> 00:02:16,080 +Bạn chỉ cần sử dụng tên của màu và nếu cuộn qua bảng này, bạn sẽ thấy tất cả các màu khác + +30 +00:02:16,080 --> 00:02:16,740 +nhau. + +31 +00:02:16,740 --> 00:02:20,880 +Và đừng lo lắng quá nhiều về CSS cấp một hoặc cấp hai hoặc cấp ba. + +32 +00:02:20,910 --> 00:02:24,870 +Nó chỉ mô tả lịch sử khi mỗi màu được giới thiệu. + +33 +00:02:24,870 --> 00:02:28,330 +Vì vậy, những thứ này được giới thiệu đầu tiên vì về cơ bản nó là cầu vồng. + +34 +00:02:28,330 --> 00:02:35,650 +Và rồi theo thời gian, chúng tôi có thêm một số màu vui nhộn hơn như lục lam và kaki sẫm và tất cả các màu khác nhau này. + +35 +00:02:35,650 --> 00:02:42,490 +Vì vậy, bạn có thể chỉ cần sao chép tên của màu và dán vào mã của mình và bạn sẽ có thể thấy màu đó được hiển thị + +36 +00:02:42,490 --> 00:02:44,380 +trên trang web của mình. + +37 +00:02:44,530 --> 00:02:49,900 +Tất nhiên, mặc dù có nhiều màu có sẵn trong các màu có tên CSS mặc định. + +38 +00:02:49,900 --> 00:02:54,460 +Nhưng đôi khi bạn vẫn có thể muốn có một bảng màu độc đáo hơn. + +39 +00:02:54,460 --> 00:02:56,410 +Vậy bạn sẽ làm gì trong trường hợp đó? + +40 +00:02:56,410 --> 00:03:01,510 +Chà, một trong những bảng màu yêu thích của tôi là săn màu. đồng + +41 +00:03:01,900 --> 00:03:09,070 +Đó là một công cụ miễn phí do các nhà thiết kế tạo ra cho các nhà thiết kế và tất nhiên, cho cả chúng tôi. + +42 +00:03:09,250 --> 00:03:15,610 +Tại đây, bạn có các bảng màu được thiết kế chuyên nghiệp cho các màu xếp chồng lên nhau trông hoàn hảo trên bất + +43 +00:03:15,610 --> 00:03:16,840 +kỳ trang web nào. + +44 +00:03:16,870 --> 00:03:22,450 +Bạn có thể tưởng tượng rằng nếu bạn chọn bất kỳ trang web ngẫu nhiên nào trong số này, có thể đây sẽ là màu + +45 +00:03:22,450 --> 00:03:23,500 +nền của trang web. + +46 +00:03:23,500 --> 00:03:28,090 +Đây có thể là màu H1, đây có thể là màu phụ đề hoặc H2. + +47 +00:03:28,090 --> 00:03:33,310 +Bạn có tông màu nhấn, bạn có tông màu chính và bạn có thể sử dụng tất cả các màu này trong trang web của mình. + +48 +00:03:33,310 --> 00:03:38,110 +Nhưng làm thế nào để chúng ta sử dụng chúng nếu chúng ta không có tên gắn liền với nó? + +49 +00:03:38,110 --> 00:03:40,960 +Thay vào đó, chúng ta có tất cả những con số và chữ cái này. + +50 +00:03:40,960 --> 00:03:42,730 +Chính xác thì đây là gì? + +51 +00:03:42,760 --> 00:03:51,820 +Chà, đây là những mã hex và chúng là cách biểu thị mã số lớn hơn cho màu cụ thể + +52 +00:03:51,820 --> 00:03:52,450 +đó. + +53 +00:03:52,450 --> 00:04:00,010 +Vì vậy, ví dụ, trong trường hợp này, đây là màu tím được tạo thành từ ba phân số, đỏ, lục + +54 +00:04:00,010 --> 00:04:01,030 +và lam. + +55 +00:04:01,090 --> 00:04:04,720 +Và đây là những màu trong số 255. + +56 +00:04:04,720 --> 00:04:15,160 +Vì vậy, nếu bạn tưởng tượng một phân số, 93 trên 255 màu đỏ, 56 trên 255 màu xanh lá cây và 1 trên 5 trên 255 màu xanh lam. + +57 +00:04:15,160 --> 00:04:21,160 +Và khi bạn trộn cả ba màu cơ bản này, bạn có thể nhận được rất nhiều loại sắc thái khác nhau. + +58 +00:04:21,160 --> 00:04:24,550 +Vậy trong trường hợp này, ta có 93, 56, một bốn, năm. + +59 +00:04:24,580 --> 00:04:37,300 +Vậy 93 trên hai, năm năm, 56, xanh trên hai, năm, năm và một, bốn năm. + +60 +00:04:37,300 --> 00:04:44,860 +Vì vậy, thêm một chút màu xanh lam và chúng tôi kết thúc với sắc thái chính xác giống như màu tím này mà bạn + +61 +00:04:45,370 --> 00:04:49,480 +thấy ngay tại đây khi chuyển đổi RGB đó thành mã hex. + +62 +00:04:49,480 --> 00:04:52,600 +Vì vậy, một cách khác để đại diện cho số đó. + +63 +00:04:52,600 --> 00:04:55,210 +Chúng tôi nhận được mã hex cụ thể này. + +64 +00:04:55,210 --> 00:04:56,860 +Điều này có nghĩa gì với bạn? + +65 +00:04:56,860 --> 00:05:01,780 +Chà, khi bạn đang sử dụng thứ gì đó như săn màu và bạn muốn áp dụng các màu + +66 +00:05:01,780 --> 00:05:08,080 +khác nhau này cho trang web của mình, bạn chỉ cần sao chép mã hex và sử dụng nó thay vì tên. + +67 +00:05:08,080 --> 00:05:14,770 +Và ngay cả trên tài liệu về các màu được đặt tên, bạn có thể thấy mã hex của chúng được xếp cạnh + +68 +00:05:14,770 --> 00:05:18,220 +tên và trong mã, chúng trông khá giống nhau. + +69 +00:05:18,220 --> 00:05:20,860 +Thay vì tên, bạn chỉ cần đặt mã hex. + +70 +00:05:21,370 --> 00:05:23,650 +Vì vậy, bây giờ là lúc để thử một bài tập. + +71 +00:05:23,680 --> 00:05:30,730 +Hãy tiếp tục và tải xuống tệp zip này từ bài học hiện tại này, giải nén và mở tệp bên trong so với mã. + +72 +00:05:30,910 --> 00:05:36,970 +Khi bạn ở đây, bạn sẽ thấy đó là một trang web khá đơn giản chỉ với hai yếu tố bên trong + +73 +00:05:37,210 --> 00:05:38,950 +phần thân là H1 và H2. + +74 +00:05:38,950 --> 00:05:44,740 +Và nếu chúng ta xem bản xem trước, thì bạn có thể thấy đó rõ ràng là một thế giới đen trắng buồn tẻ. + +75 +00:05:44,860 --> 00:05:48,370 +Chúng tôi sẽ thay đổi tất cả điều đó bằng cách thêm màu CSS. + +76 +00:05:48,370 --> 00:05:54,610 +Vì vậy, bạn có năm bước cần hoàn thành ở đây và bạn nên làm theo từng bước một và khi kết thúc + +77 +00:05:54,610 --> 00:06:00,010 +cả năm bước, bạn sẽ có một trang web trông giống như thế này với nhiều màu sắc + +78 +00:06:00,010 --> 00:06:02,980 +khác nhau và màu nền khác nhau như Tốt. + +79 +00:06:03,160 --> 00:06:05,980 +Tạm dừng video ngay bây giờ và thực hiện thử thách này. + +80 +00:06:09,620 --> 00:06:10,040 +Được rồi. + +81 +00:06:10,040 --> 00:06:12,500 +Vì vậy, hãy cùng nhau tìm hiểu giải pháp. + +82 +00:06:12,680 --> 00:06:20,330 +Chúng ta có màu nền của phần thân, được đặt thành màu trắng cổ điển, chính là màu này ở + +83 +00:06:20,330 --> 00:06:20,890 +đây. + +84 +00:06:20,900 --> 00:06:25,400 +Và chúng ta có màu văn bản của chữ H được đặt thành khói trắng. + +85 +00:06:25,430 --> 00:06:29,430 +Nhưng bạn cũng có thể đặt màu nền của H. + +86 +00:06:29,450 --> 00:06:35,390 +Đó là một thuộc tính có sẵn trên bất kỳ phần tử nào và nó chỉ lấy vùng hiện có + +87 +00:06:35,390 --> 00:06:37,700 +của phần tử đó và tô màu nền. + +88 +00:06:37,910 --> 00:06:41,870 +Bây giờ, điều đó có thể đòi hỏi một chút suy nghĩ bên lề, nhưng hy vọng cuối cùng bạn đã đạt được + +89 +00:06:41,870 --> 00:06:42,440 +điều đó. + +90 +00:06:42,440 --> 00:06:49,910 +Và lưu ý rằng trong hình H chúng ta có tất cả các màu được đặt tên và trong hình H hai, tôi đã yêu cầu bạn sử dụng + +91 +00:06:49,910 --> 00:06:55,760 +màu hex và điều này chỉ để bạn thực hành thêm màu bằng hai phương pháp khác nhau. + +92 +00:06:56,630 --> 00:06:58,280 +Hy vọng rằng bạn đã đến đó cuối cùng. + +93 +00:06:58,280 --> 00:07:05,090 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và tìm hiểu thêm về cách định dạng phông chữ bằng CSS. + diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 Named-Colours.url b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 Named-Colours.url new file mode 100644 index 0000000000000000000000000000000000000000..af9cd13f026ac35dc3c8d50f824ddf4e65b12fcc --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 Named-Colours.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://developer.mozilla.org/en-US/docs/Web/CSS/named-color \ No newline at end of file diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 RGB-Colour-Mixer.url b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 RGB-Colour-Mixer.url new file mode 100644 index 0000000000000000000000000000000000000000..46409b2da8677a1ab2eaf49f4f1597654db7efd3 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/001 RGB-Colour-Mixer.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.csfieldguide.org.nz/en/interactives/rgb-mixer/ \ No newline at end of file diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 6.1-Font-Properties.zip b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 6.1-Font-Properties.zip new file mode 100644 index 0000000000000000000000000000000000000000..9beefb93a91e3f3e298c4800449f48f233667036 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 6.1-Font-Properties.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1e73c405481633d8679dc0c45a883ce67ddb42f6e3df5f2e7f70d6a85719fbe +size 341512 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 Font Properties.mp4 b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 Font Properties.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..757759dee6d4ecb4fedf52f34073c40b000ced53 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 Font Properties.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a287ec1ce0b4e548672ef3df33287b7bda1614b430c4b39219a88d0bc99024b0 +size 160094894 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 Font Properties_vi.srt b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 Font Properties_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..551f6865e58d0b0a07fdbfcd8e21f511c8654bd2 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/002 Font Properties_vi.srt @@ -0,0 +1,1008 @@ +1 +00:00:00,290 --> 00:00:05,510 +Bây giờ, trong bài học này, chúng ta sẽ nói thêm một chút về các thuộc tính CSS khác nhau mà chúng + +2 +00:00:05,510 --> 00:00:11,060 +ta có thể đặt cho phông chữ để chúng ta có thể thay đổi hình thức của văn bản trong trang web của mình. + +3 +00:00:11,630 --> 00:00:18,050 +Và chúng ta đã thấy một số thuộc tính này, chẳng hạn như thuộc tính color đặt màu cho văn bản, nhưng + +4 +00:00:18,050 --> 00:00:25,820 +cũng có những thuộc tính khác, chẳng hạn như độ đậm của phông chữ, kích thước phông chữ và cả họ phông chữ, là kiểu + +5 +00:00:25,820 --> 00:00:28,140 +chữ mà chúng ta muốn sử dụng. + +6 +00:00:28,160 --> 00:00:30,680 +Hãy khám phá một số trong những cái mới hơn này. + +7 +00:00:30,710 --> 00:00:33,910 +Điều đầu tiên tôi sẽ nói đến là kích thước phông chữ. + +8 +00:00:33,920 --> 00:00:42,320 +Chúng ta có thể thay đổi kích thước của một phông chữ đơn giản bằng cách sử dụng thuộc tính kích thước phông chữ và sau đó đặt nó thành một + +9 +00:00:42,320 --> 00:00:45,890 +kích thước pixel cụ thể, như bạn có thể đã thấy tôi đã làm. + +10 +00:00:46,280 --> 00:00:51,350 +Nhưng nếu chúng ta nghĩ về nó, chính xác cỡ chữ 20 pixel có nghĩa là gì? + +11 +00:00:51,350 --> 00:00:53,110 +Nó thực sự lớn như thế nào? + +12 +00:00:53,120 --> 00:00:55,040 +Vâng, đây là cách nó lớn. + +13 +00:00:55,040 --> 00:01:00,750 +Một pixel bằng khoảng 1/96 inch. + +14 +00:01:00,750 --> 00:01:07,560 +Và lý do tại sao chúng tôi đang sử dụng các đơn vị đo lường Anh là bởi vì rất nhiều định cỡ cho các trang web và cho công + +15 +00:01:07,560 --> 00:01:12,330 +việc thiết kế thực sự bắt nguồn từ thời xa xưa của việc in sách, đóng sách. + +16 +00:01:12,330 --> 00:01:14,010 +Và nó rất truyền thống. + +17 +00:01:14,010 --> 00:01:20,220 +Nếu bạn biết một inch lớn như thế nào, thì bạn sẽ biết một inch trên 96 inch lớn như thế nào. + +18 +00:01:20,220 --> 00:01:26,640 +Nó hoàn toàn rất nhỏ, nhưng nếu bạn không biết một inch lớn như thế nào, thì tính theo đơn vị số + +19 +00:01:26,670 --> 00:01:29,550 +liệu, nó sẽ bằng 0. 26mm. + +20 +00:01:29,550 --> 00:01:32,310 +Đó là về độ lớn của một pixel. + +21 +00:01:32,310 --> 00:01:39,150 +Nó là 0. rộng 26mm và 0. cao 26mm. + +22 +00:01:39,150 --> 00:01:43,620 +Vì vậy, nó là một khối lập phương nhỏ rất, rất nhỏ. + +23 +00:01:44,500 --> 00:01:50,800 +Có nhiều cách khác mà chúng ta có thể biểu thị kích thước phông chữ khi chúng ta viết CSS. + +24 +00:01:50,920 --> 00:01:58,090 +Một cách phổ biến mà bạn sẽ thấy ngoài pixel là sử dụng một thứ gọi là điểm. + +25 +00:01:58,540 --> 00:02:06,010 +A là viết tắt của một pixel và P là viết tắt của một điểm. + +26 +00:02:06,100 --> 00:02:07,950 +Bây giờ một điểm lớn như thế nào? + +27 +00:02:07,960 --> 00:02:10,630 +Chà, nó lớn hơn pixel một chút. + +28 +00:02:10,630 --> 00:02:15,070 +Đó là khoảng một trên 72 giây của một inch. + +29 +00:02:15,070 --> 00:02:17,320 +Vì vậy, đó chỉ là lớn hơn một chút. + +30 +00:02:17,350 --> 00:02:30,880 +Nếu 1. 96 của một inch là 0. 26mm, một trên 72 inch là khoảng 0. 35mm, chỉ lớn hơn một chút. + +31 +00:02:30,940 --> 00:02:36,220 +Bây giờ điểm thực sự thường được sử dụng trong nhiều ứng dụng khác nhau. + +32 +00:02:36,220 --> 00:02:45,350 +Vì vậy, khi bạn chọn một phông chữ có kích thước 12 trong từ, chẳng hạn, bạn đang thực sự chọn 12 điểm. + +33 +00:02:45,350 --> 00:02:50,930 +Vì vậy, điều đó có nghĩa là khi bạn đang sử dụng 12 điểm trên trang web của mình, bạn có thể mong đợi rằng + +34 +00:02:50,930 --> 00:02:56,000 +khi trang web ở mức 100%, nó sẽ trông giống như phông chữ 12 trên tài liệu từ của bạn. + +35 +00:02:56,090 --> 00:03:04,040 +Ngoài ra còn một số cách thể hiện cỡ chữ khác là M và M. + +36 +00:03:04,160 --> 00:03:06,140 +Những đơn vị này là gì? + +37 +00:03:06,170 --> 00:03:13,520 +Chà, chữ M thực ra không được phát âm là M Nó được phát âm là M, vì vậy nó được phát âm giống như cách + +38 +00:03:13,520 --> 00:03:16,100 +chữ cái này có trong bảng chữ cái. + +39 +00:03:16,370 --> 00:03:17,660 +Tại sao vậy? + +40 +00:03:17,660 --> 00:03:24,170 +Chà, một M được định nghĩa là toàn bộ chiều rộng của M. + +41 +00:03:24,260 --> 00:03:32,150 +Chữ M có lẽ là một trong những chữ cái rộng nhất trong bảng chữ cái tiếng Anh và đơn vị này chỉ đại diện cho + +42 +00:03:32,150 --> 00:03:33,950 +toàn bộ chiều rộng đó. + +43 +00:03:34,430 --> 00:03:37,700 +Nhưng nó thực sự có ý nghĩa gì khi chúng ta sử dụng nó? + +44 +00:03:37,730 --> 00:03:46,850 +Chà, điều đó có nghĩa là khi bạn đặt một H có kích thước phông chữ là một M, mã CSS của bạn sẽ trông giống + +45 +00:03:46,850 --> 00:03:48,570 +như thế này. + +46 +00:03:48,590 --> 00:03:58,910 +Sau đó, điều đó có nghĩa là nếu nó có cha mẹ, chẳng hạn, nếu chúng ta có thẻ body bao quanh + +47 +00:03:58,910 --> 00:04:13,100 +thẻ h one này, thì nếu body này có kích thước phông chữ là 20 pixel, thì h này nếu chúng ta đặt nó thành một M hoặc một M, thì + +48 +00:04:13,100 --> 00:04:19,120 +điều đó có nghĩa là nó sẽ bằng 100% kích thước gốc. + +49 +00:04:19,130 --> 00:04:21,829 +Vì vậy, nó có nghĩa là nó sẽ là 20 pixel. + +50 +00:04:22,070 --> 00:04:31,760 +Tuy nhiên, bây giờ, nếu chúng ta đặt nó thành hai M thay vào đó, thì trong trường hợp này, nó sẽ gấp hai lần kích thước + +51 +00:04:31,760 --> 00:04:32,450 +gốc. + +52 +00:04:32,450 --> 00:04:37,940 +Vì vậy, hai lần 20 pixel, thay vào đó sẽ là 40 pixel. + +53 +00:04:38,030 --> 00:04:41,090 +Về cơ bản nó là một kích thước tương đối. + +54 +00:04:41,450 --> 00:04:45,260 +Và tôi sẽ giải thích cho bạn tại sao điều này lại quan trọng ngay sau đây. + +55 +00:04:45,260 --> 00:04:52,730 +Nhưng liên quan chặt chẽ với chữ M hoặc chữ M là chữ M, và nó có thêm từ đó. + +56 +00:04:52,760 --> 00:04:55,670 +Ah, và về cơ bản nó hoạt động giống nhau. + +57 +00:04:55,670 --> 00:05:00,860 +Đó là một kích thước tương đối, nhưng bây giờ nó là tương đối thay vì cha mẹ. + +58 +00:05:00,860 --> 00:05:08,840 +Nó liên quan đến thư mục gốc của tệp HTML của bạn, nếu bạn còn nhớ thì thư mục gốc thường là một phần + +59 +00:05:08,840 --> 00:05:11,750 +tử HTML bao gồm mọi thứ bên trong. + +60 +00:05:12,770 --> 00:05:17,840 +Sự khác biệt sau đó, giữa M và M là gì? + +61 +00:05:18,170 --> 00:05:26,930 +Nếu chúng ta xem mã này, nơi chúng ta có thẻ nội dung bao quanh H1 và sau đó chúng ta có thẻ chân trang, đây là một trong những + +62 +00:05:26,930 --> 00:05:33,950 +thẻ mà bạn có thể sử dụng để xác định một phần trong mã của mình cho chân trang khu vực trang web của + +63 +00:05:33,950 --> 00:05:34,940 +bạn. + +64 +00:05:35,030 --> 00:05:39,680 +Sau đó, bên trong đây, chúng tôi có một chiếc H2 được bao bọc. + +65 +00:05:40,220 --> 00:05:52,250 +Nếu tôi đặt H2 của mình có cỡ chữ là hai M và chân trang của tôi có cỡ chữ là 20 pixel, thì hai M bằng hai + +66 +00:05:52,280 --> 00:05:57,860 +nhân 20 pixel, tương đương với 40 pixel. + +67 +00:05:57,860 --> 00:06:00,860 +Vì vậy, H2 này bây giờ là 40 pixel. + +68 +00:06:01,310 --> 00:06:08,810 +Tuy nhiên, nếu tôi vào đây và thay đổi chân trang này thành 80 pixel, thì đột nhiên + +69 +00:06:08,810 --> 00:06:16,760 +điều này sẽ thay đổi và nó sẽ không còn là 40 pixel nữa mà thay vào đó, nó sẽ là hai lần + +70 +00:06:16,790 --> 00:06:20,840 +80, tức là bây giờ bằng 160 pixel. + +71 +00:06:20,840 --> 00:06:25,310 +Vì vậy, nó đang di chuyển so với kích thước gốc của nó. + +72 +00:06:25,610 --> 00:06:37,100 +Mặt khác, nếu tôi đã đặt H2 này có kích thước là hai REM và tôi thay đổi kích thước chân trang của mình từ 20 + +73 +00:06:37,100 --> 00:06:43,760 +pixel thành 80 pixel, thì nó không ảnh hưởng đến điều này. + +74 +00:06:43,820 --> 00:06:44,510 +Bất cứ điều gì. + +75 +00:06:44,510 --> 00:06:47,200 +Nó vẫn giữ nguyên kích thước. + +76 +00:06:47,210 --> 00:06:55,340 +Chỉ khi tôi thay đổi phần tử gốc, mà nếu bạn để ý, nó là thứ bao quanh tất cả phần + +77 +00:06:55,340 --> 00:06:59,440 +còn lại của mã, thường là phần tử HTML. + +78 +00:06:59,450 --> 00:07:07,580 +Nếu tôi thay đổi kích thước này thành thứ gì đó lớn hơn, chẳng hạn như 90 pixel, thì đó là điều sẽ ảnh hưởng + +79 +00:07:07,580 --> 00:07:09,170 +đến kích thước này. + +80 +00:07:09,170 --> 00:07:19,100 +Vì vậy, sự khác biệt chính giữa M và M là đây là cách thay đổi kích thước nhất quán + +81 +00:07:19,100 --> 00:07:20,210 +hơn. + +82 +00:07:20,210 --> 00:07:27,230 +Vì vậy, tôi thường khuyên tất cả những người phát triển trang web khi bạn đặt kích thước phông chữ + +83 +00:07:27,230 --> 00:07:32,960 +nên sử dụng REM, bởi vì cách bạn nhúng những thứ khác nhau vào những thứ khác. + +84 +00:07:32,960 --> 00:07:39,170 +Vì vậy, H hai này nằm trong phần chân trang bên trong phần thân, bên trong HTML. + +85 +00:07:39,200 --> 00:07:46,100 +Sau đó, mối quan hệ với cha mẹ có thể rất nhanh chóng bị nhầm lẫn và bạn không biết mình đang đề cập đến cha mẹ nào, đặc + +86 +00:07:46,100 --> 00:07:49,730 +biệt là khi bạn đang làm việc trong một tệp CSS riêng biệt. + +87 +00:07:49,820 --> 00:07:53,300 +Vì vậy, hãy hiểu cách hoạt động của REM. + +88 +00:07:53,300 --> 00:07:58,670 +Hãy nhớ rằng, nó là kích thước được chia tỷ lệ của kích thước gốc. + +89 +00:07:58,910 --> 00:08:03,980 +M là một x, kích thước gốc hai M là hai x, kích thước gốc. + +90 +00:08:03,980 --> 00:08:09,770 +Và đây là một cách dễ dàng hơn nhiều để kiểm soát các kích thước khác nhau của các thành phần khác nhau trên + +91 +00:08:09,770 --> 00:08:15,440 +màn hình của bạn và hiểu rõ hơn về những gì đang diễn ra trong tệp bắt đầu mà bạn đã tải xuống trước đó. + +92 +00:08:15,440 --> 00:08:17,750 +Tôi đã có một số mã mẫu cho bạn. + +93 +00:08:17,780 --> 00:08:25,040 +Nếu chúng ta xem xét tất cả các cách khác nhau để đặt kích thước phông chữ, bạn có thể thấy rằng chúng ta có thể sử dụng kích thước + +94 +00:08:25,040 --> 00:08:33,080 +pixel, chúng ta có thể sử dụng kích thước điểm, chúng ta có thể sử dụng M REM và chúng ta cũng có thể sử dụng các kích thước phông chữ được đặt tên + +95 +00:08:33,080 --> 00:08:34,970 +chẳng hạn như cực lớn hoặc lớn. + +96 +00:08:34,970 --> 00:08:40,159 +Và khi tất cả những thứ này được hiển thị, bạn sẽ thấy các kích thước khác nhau đang phát. + +97 +00:08:40,190 --> 00:08:48,780 +Thực tế là một pixel nhỏ hơn nhiều so với một điểm, nhưng hai điểm này là kích thước phông chữ tĩnh và + +98 +00:08:48,780 --> 00:08:53,490 +sau đó M có liên quan đến gốc và M có liên quan đến gốc. + +99 +00:08:53,490 --> 00:08:55,920 +Nhưng đây là những kích thước tương đối. + +100 +00:08:56,160 --> 00:09:02,190 +Nếu bạn muốn xem đoạn mã này và có thể chỉnh sửa, thay đổi và xem nó hoạt động, hãy tải xuống tệp + +101 +00:09:02,190 --> 00:09:07,200 +zip từ bài học hiện tại có tên là 6. 1 thuộc tính phông chữ. + +102 +00:09:07,590 --> 00:09:10,710 +Giải nén xong thì mở lên bên trong vs code. + +103 +00:09:10,710 --> 00:09:17,130 +Chuyển đến font size dot HTML và bạn sẽ thấy chính xác mã giống như trong bản trình diễn. + +104 +00:09:17,130 --> 00:09:20,190 +Nhưng trong trường hợp này, tất nhiên là trong mã VS. + +105 +00:09:20,190 --> 00:09:26,820 +Vì vậy, bạn có thể thay đổi những thứ như REM, m, kích thước phông chữ khác nhau, kích thước phông chữ gốc và bạn + +106 +00:09:26,820 --> 00:09:29,280 +sẽ thấy nó được phản ánh trên màn hình. + +107 +00:09:29,400 --> 00:09:36,360 +Ví dụ: nếu tôi thay đổi kích thước phông chữ gốc này từ cực lớn xuống còn 20 + +108 +00:09:36,390 --> 00:09:44,790 +pixel, thì bạn sẽ thấy đoạn này thay đổi tương ứng vì kích thước của nó dựa trên REM. + +109 +00:09:44,790 --> 00:09:48,960 +Vì vậy, hãy chơi xung quanh điều đó để bạn có thể hiểu chuyện gì đang xảy ra. + +110 +00:09:49,710 --> 00:09:53,940 +Có một số thuộc tính phông chữ khác mà tôi muốn trình bày ngắn gọn. + +111 +00:09:53,940 --> 00:09:57,840 +Một là trọng lượng phông chữ, tương đối đơn giản. + +112 +00:09:57,840 --> 00:10:01,710 +Bạn có thể có bình thường hoặc bạn có thể có đậm, và tất cả chúng ta đều biết điều đó có nghĩa là gì. + +113 +00:10:01,710 --> 00:10:04,050 +Nó chỉ làm cho phông chữ trông nặng hơn một chút. + +114 +00:10:04,290 --> 00:10:09,210 +Nhưng ngoài tự nhiên, bạn có thể thấy một số cách khác mà mọi người sử dụng để thay đổi độ đậm của phông chữ. + +115 +00:10:09,210 --> 00:10:16,230 +Ngoài các từ khóa cơ bản, bạn có thể có trọng lượng phông chữ tương đối so với từ gốc + +116 +00:10:16,230 --> 00:10:19,320 +để phông chữ nhẹ hơn hoặc đậm hơn. + +117 +00:10:19,320 --> 00:10:29,520 +Ngoài ra, bạn cũng có thể sử dụng một số từ 100 đến 900 để xác định mức độ nhạt hoặc đậm mà bạn muốn phông + +118 +00:10:29,520 --> 00:10:30,690 +chữ. + +119 +00:10:30,690 --> 00:10:37,710 +Và tương tự, khi chúng ta nói nhẹ hơn, về cơ bản nó sẽ trừ đi 100. + +120 +00:10:37,710 --> 00:10:41,370 +Và nếu chúng ta nói táo bạo hơn, nó chỉ làm cho nó táo bạo hơn 100 lần. + +121 +00:10:41,370 --> 00:10:49,560 +Ở đâu đó dọc theo phạm vi này, ngoài kích thước phông chữ và độ đậm của phông chữ, còn có tất cả các họ phông + +122 +00:10:49,560 --> 00:10:50,880 +chữ quan trọng. + +123 +00:10:50,880 --> 00:10:55,380 +Và điều này xác định bạn muốn văn bản của mình trông như thế nào. + +124 +00:10:55,410 --> 00:11:01,320 +Ví dụ: trong ví dụ đầu tiên này, chúng tôi có họ phông chữ được đặt thành Helvetica. + +125 +00:11:01,350 --> 00:11:10,260 +Đây là một kiểu chữ cụ thể và tên được gọi là Helvetica, nhưng đây là một kiểu chữ dành riêng cho mac. + +126 +00:11:10,260 --> 00:11:15,360 +Vì vậy, có rất nhiều máy tính Windows không sở hữu kiểu chữ này. + +127 +00:11:15,480 --> 00:11:23,400 +Đó là lý do tại sao chúng ta thường viết một họ phông chữ, chúng ta không chỉ viết tên phông chữ, chúng ta có + +128 +00:11:23,520 --> 00:11:28,350 +dấu phẩy và sau đó chúng ta có một loại phông chữ chung dự phòng. + +129 +00:11:28,830 --> 00:11:31,920 +Vì vậy, trong trường hợp này, đó là sans serif. + +130 +00:11:32,310 --> 00:11:38,550 +Sans serif đơn giản là loại phông chữ trong đó tất cả các cạnh gần như vuông góc. + +131 +00:11:38,550 --> 00:11:43,230 +Nếu bạn có những bàn chân nhỏ này hoặc những đồ trang trí nhỏ này ở các cạnh. + +132 +00:11:43,340 --> 00:11:48,790 +Trong số các chữ cái của bạn, thì rất thường những gì bạn đang xem là một phông chữ kiểu serif. + +133 +00:11:48,820 --> 00:11:52,450 +Vì vậy, đó là hai loại chính của kiểu chữ khác nhau. + +134 +00:11:52,450 --> 00:11:54,370 +Và trong những bài học sau, chúng ta. + +135 +00:11:54,400 --> 00:11:56,620 +Bao gồm các kiểu chữ chi tiết hơn. + +136 +00:11:56,620 --> 00:12:01,000 +Vì vậy, bạn có thể tìm kiếm bài học đó hoặc đợi cho đến khi nó xuất hiện để tìm hiểu thêm về bài học đó. + +137 +00:12:01,570 --> 00:12:05,750 +Tuy nhiên, điều quan trọng là có kiểu chữ chung này. + +138 +00:12:05,770 --> 00:12:13,180 +Điều này có nghĩa là khi bạn có bộ này, người dùng Mac sẽ thấy phông chữ này, nhưng người dùng Windows sẽ thấy + +139 +00:12:13,180 --> 00:12:18,610 +một cái gì đó tương đối giống nhau và nó sẽ tự động hiển thị cho họ khi nó không hoạt + +140 +00:12:18,610 --> 00:12:19,330 +động. + +141 +00:12:20,020 --> 00:12:23,860 +Bây giờ nếu bạn có một phông chữ có nhiều từ trong đó thì sao? + +142 +00:12:23,860 --> 00:12:27,550 +Ví dụ, times new Roman bao gồm ba từ. + +143 +00:12:27,580 --> 00:12:32,450 +Chà, trong trường hợp này, chúng ta không thể chỉ gõ nó ra như thế này rồi có dấu phẩy. + +144 +00:12:32,470 --> 00:12:38,890 +Chúng tôi thực sự cần các dấu ngoặc kép xung quanh nó để chúng tôi có thể cho tệp CSS biết rằng có khoảng + +145 +00:12:38,890 --> 00:12:41,050 +trắng trong tên của họ phông chữ. + +146 +00:12:41,050 --> 00:12:43,850 +Vì vậy, hãy cẩn thận về điều đó khi bạn đang sử dụng nó. + +147 +00:12:44,180 --> 00:12:52,220 +Và bởi vì times new Roman là một phông chữ kiểu serif, nên sao lưu, kiểu chung cũng là một serif. + +148 +00:12:52,730 --> 00:12:59,120 +Bây giờ nếu bạn muốn một phông chữ hoàn toàn tùy chỉnh mà có thể người dùng không có thì sao? + +149 +00:12:59,150 --> 00:13:05,390 +Chà, một trong những nơi tốt nhất để tìm phông chữ miễn phí là truy cập Phông chữ. Google. com. + +150 +00:13:05,570 --> 00:13:12,050 +Và ở đây bạn có thể tìm thấy tất cả các loại phông chữ khác nhau và có rất nhiều phông chữ để bạn lựa chọn và bạn có + +151 +00:13:12,050 --> 00:13:14,570 +thể duyệt đến nội dung yêu thích của mình. + +152 +00:13:14,720 --> 00:13:16,550 +Bây giờ tôi muốn bạn làm điều này với tôi. + +153 +00:13:16,580 --> 00:13:20,480 +Chuyển đến Phông chữ. Google. com, tìm một phông chữ mà bạn thích. + +154 +00:13:20,510 --> 00:13:27,710 +Vì vậy, có thể tôi thực sự thích một phông chữ cụ thể và nếu bạn nhấp vào nó, đôi khi bạn sẽ thấy rằng nó có các mặt + +155 +00:13:27,710 --> 00:13:31,100 +phông chữ khác nhau cho các trọng lượng khác nhau. + +156 +00:13:31,100 --> 00:13:34,850 +Vì vậy, có Bold, là 700 hoặc 400 thông thường. + +157 +00:13:34,850 --> 00:13:40,700 +Nhưng sau đó, các phông chữ khác mà bạn có thể thấy ở đây thực sự không có bất kỳ trọng lượng nào ngoài + +158 +00:13:40,700 --> 00:13:45,240 +phông chữ thông thường mà bạn có thể sử dụng tùy thuộc vào loại nào bạn có. + +159 +00:13:45,260 --> 00:13:48,740 +Đơn giản chỉ cần chọn trọng lượng mà bạn quan tâm. + +160 +00:13:48,740 --> 00:13:57,800 +Ví dụ: với phông chữ này, có thể tôi muốn cỡ trung bình và với phông chữ này, có thể tôi sẽ chọn một phông chữ + +161 +00:13:57,800 --> 00:13:59,420 +thông thường. + +162 +00:13:59,540 --> 00:14:04,940 +Và khi bạn đã chọn xong, nếu bạn đi tới góc trên cùng bên phải, bạn có thể thấy tất cả các lựa chọn của mình. + +163 +00:14:04,940 --> 00:14:09,470 +Vì vậy, bạn có thể xóa tất cả hoặc bạn có thể xóa những cái mà bạn không quan tâm. + +164 +00:14:09,470 --> 00:14:13,480 +Nhưng dù bằng cách nào, bạn cũng nên chọn một phông chữ mà bạn muốn đưa vào. + +165 +00:14:13,490 --> 00:14:19,520 +Bây giờ hãy đảm bảo rằng liên kết đó được chọn và sau đó sao chép liên kết đó vào tệp bắt đầu của bạn. + +166 +00:14:19,520 --> 00:14:26,450 +Vì vậy, hãy chọn họ phông chữ dot html bên trong phần tử head ngay sau thẻ kiểu. + +167 +00:14:26,450 --> 00:14:33,680 +Hãy tiếp tục và dán tất cả những thứ đó vào và về cơ bản, đây là một liên kết sẽ lấy phông chữ Google cho bất kỳ + +168 +00:14:33,680 --> 00:14:35,870 +người dùng nào trên internet. + +169 +00:14:35,870 --> 00:14:41,330 +Vì vậy, không quan trọng nếu họ có máy mac hay PC hoặc họ đã tải xuống phông chữ nào trên máy tính của mình, tất + +170 +00:14:41,360 --> 00:14:45,680 +cả họ sẽ có thể truy cập phông chữ này vì chúng tôi đã đưa phông chữ đó vào liên kết. + +171 +00:14:45,680 --> 00:14:51,680 +Và sau đó, hãy tiếp tục và sao chép quy tắc CSS mà Google đã đưa vào rất hữu ích cho chúng ta. + +172 +00:14:51,680 --> 00:14:57,980 +Và nếu bạn cuộn lên, bạn sẽ thấy rằng tôi lại có một kiểu nội bộ được thiết lập ở đây để chúng ta có thể + +173 +00:14:57,980 --> 00:15:01,760 +dễ dàng nhìn thấy CSS cùng với HTML trên cùng một tệp. + +174 +00:15:01,760 --> 00:15:03,530 +Trong khi chúng ta đang làm bài tập. + +175 +00:15:03,530 --> 00:15:11,210 +Hãy tiếp tục và tạo một H1 ở đây và tôi sẽ chỉ viết các từ họ phông chữ vì đó là tất cả nội + +176 +00:15:11,210 --> 00:15:13,160 +dung của trang này. + +177 +00:15:13,160 --> 00:15:16,430 +Và sau đó hãy nhấp chuột phải và hiển thị nó trong bản xem trước. + +178 +00:15:16,520 --> 00:15:23,070 +Bây giờ tôi muốn bạn đặt kiểu CSS H1 thành kiểu mà bạn vừa sao chép. + +179 +00:15:23,090 --> 00:15:26,120 +Tạm dừng video và làm điều đó ngay bây giờ. + +180 +00:15:27,990 --> 00:15:28,320 +Được rồi. + +181 +00:15:28,320 --> 00:15:34,710 +Vì vậy, chúng tôi cần nhắm mục tiêu H, một trong số đó chúng tôi chỉ có một để chúng tôi có thể sử dụng bộ chọn phần + +182 +00:15:34,710 --> 00:15:38,490 +tử và sau đó chúng tôi dán vào kiểu CSS của mình một cách dễ dàng. + +183 +00:15:38,490 --> 00:15:45,510 +Và bạn sẽ nhận thấy ngay rằng phông chữ đó được cập nhật thành phông chữ tùy chỉnh của chúng tôi từ Google. + +184 +00:15:45,510 --> 00:15:50,790 +Và việc bạn chọn gì không quan trọng, điều này sẽ luôn hoạt động miễn là bạn + +185 +00:15:50,790 --> 00:15:55,770 +đã bao gồm tất cả các liên kết được yêu cầu và thêm vào CSS có liên quan. + +186 +00:15:56,040 --> 00:16:02,730 +Cũng trên trang này, bạn sẽ thấy các họ phông chữ khác nhau, chẳng hạn như Helvetica và sans + +187 +00:16:02,730 --> 00:16:03,390 +serif. + +188 +00:16:03,390 --> 00:16:05,700 +Hoặc trên cửa sổ. + +189 +00:16:05,700 --> 00:16:09,000 +Sans serif mặc định sẽ là phông chữ kiểu Ariel. + +190 +00:16:09,000 --> 00:16:14,940 +Và sau đó, bạn có phông chữ kiểu serif, là những phông chữ có chân nhỏ mà tôi đã đề cập. + +191 +00:16:14,970 --> 00:16:22,230 +Bạn đã có các phông chữ sans serif này và bạn đã có tất cả các kiểu chữ chung chung khác, chẳng hạn như + +192 +00:16:22,230 --> 00:16:25,830 +chữ thảo đơn cách và chữ thảo giả tưởng hơi xoăn. + +193 +00:16:25,830 --> 00:16:26,970 +Đó là cách tôi nhớ nó. + +194 +00:16:27,000 --> 00:16:34,600 +Monospace có tất cả các chữ cái chiếm cùng chiều rộng, tương tự như máy đánh chữ hoặc mã, và trí tưởng tượng thường là + +195 +00:16:34,600 --> 00:16:36,250 +một thứ gì đó hoang dã. + +196 +00:16:36,250 --> 00:16:41,740 +Và những phông chữ chung này sẽ khác nhau tùy thuộc vào máy tính bạn sử dụng và trình duyệt bạn sử + +197 +00:16:41,740 --> 00:16:42,190 +dụng. + +198 +00:16:42,190 --> 00:16:49,240 +Vì vậy, bạn có thể không thấy cùng loại phông chữ mà tôi có ở đây, nhưng nếu bạn chỉ định một phông chữ cụ thể và đảm + +199 +00:16:49,240 --> 00:16:55,300 +bảo rằng nó được liên kết với, thì tất cả chúng ta sẽ nhìn vào cùng một phông chữ ngay tại đây. + +200 +00:16:55,780 --> 00:17:04,420 +Và lưu ý khi chúng tôi sao chép nó lên nó đã chỉ định phông chữ cụ thể, nhưng cũng là phông chữ dự phòng trong trường hợp các liên kết + +201 +00:17:04,420 --> 00:17:09,640 +này không hoạt động hoặc có gì đó không ổn và nó sẽ mặc định là phông chữ thảo. + +202 +00:17:09,819 --> 00:17:13,480 +Khi đó, phông chữ thảo chung sẽ trông như thế này. + +203 +00:17:14,200 --> 00:17:21,069 +Vì vậy, điều cuối cùng tôi muốn nói về phong cách văn bản là căn chỉnh. + +204 +00:17:21,069 --> 00:17:22,720 +Vì vậy, căn chỉnh văn bản. + +205 +00:17:22,720 --> 00:17:30,120 +Và cái này, thuộc tính này được gọi là căn chỉnh văn bản nơi bạn có thể đặt văn bản ở giữa hoặc bạn có thể đặt + +206 +00:17:30,120 --> 00:17:32,580 +văn bản sang trái hoặc sang phải. + +207 +00:17:32,580 --> 00:17:36,810 +Và bạn cũng có một số giá trị như bắt đầu và kết thúc. + +208 +00:17:36,810 --> 00:17:43,500 +Và về cơ bản bắt đầu là khi bạn có văn bản có thể bắt đầu viết từ phải sang trái, chẳng hạn như bằng + +209 +00:17:43,500 --> 00:17:44,520 +tiếng Ả Rập. + +210 +00:17:44,520 --> 00:17:49,680 +Và trong trường hợp này, bắt đầu thực sự ở đây và kết thúc ở đây. + +211 +00:17:49,680 --> 00:17:56,220 +Nhưng sau đó, nếu bạn đang làm việc với văn bản phương Tây, thì bắt đầu sẽ ở ngay đây và kết thúc sẽ + +212 +00:17:56,220 --> 00:17:57,000 +ở ngay đây. + +213 +00:17:57,120 --> 00:18:01,800 +Đó chỉ là một cách linh hoạt hơn để xác định căn chỉnh văn bản. + +214 +00:18:01,800 --> 00:18:10,410 +Nhưng nhìn chung, đây là một thuộc tính khá đơn giản và bạn có thể xem nó trong tài liệu để tìm hiểu thêm + +215 +00:18:10,410 --> 00:18:18,780 +về các giá trị khác ngoài start end là gì và thử bản demo để xem chúng hoạt động như thế nào. + +216 +00:18:19,200 --> 00:18:27,690 +Bây giờ khi bạn đã hoàn thành tất cả những điều đó, tôi có một bài tập cuối cùng dành cho bạn và bài tập đó nằm trong chỉ mục. html ở đây. + +217 +00:18:27,930 --> 00:18:36,160 +Có một số việc cần làm tôi muốn bạn hoàn thành và tôi muốn bạn thực hiện từng việc một. + +218 +00:18:36,160 --> 00:18:43,000 +Nó liên quan đến việc thay đổi một số màu sắc, thay đổi một số kích thước phông chữ, trọng lượng phông chữ, phông + +219 +00:18:43,000 --> 00:18:48,070 +chữ, họ, căn chỉnh văn bản và cũng thay đổi kích thước phông chữ của phần tử gốc. + +220 +00:18:48,580 --> 00:18:54,400 +Điều quan trọng là bạn không thay đổi bất kỳ CSS nào đã được bao gồm, mà thay vào đó hãy viết + +221 +00:18:54,400 --> 00:19:01,750 +CSS của bạn bên dưới trong phần tử kiểu nội bộ này để bạn có thể nhanh chóng tham khảo những việc cần làm và xem mình + +222 +00:19:01,750 --> 00:19:03,760 +cần viết gì trong CSS. + +223 +00:19:03,790 --> 00:19:06,700 +Đừng lo lắng quá nhiều về việc thiết lập CSS bên ngoài. + +224 +00:19:06,730 --> 00:19:10,330 +Chúng tôi chỉ hoàn thành điều này như một bài tập nhanh. + +225 +00:19:10,600 --> 00:19:15,190 +Và hãy nhớ rằng, trong khi bạn đang làm điều này, nếu bạn muốn xem kết quả cuối cùng sẽ như thế nào, + +226 +00:19:15,190 --> 00:19:17,110 +hãy tiếp tục với dấu chấm mục tiêu PNG. + +227 +00:19:17,410 --> 00:19:22,000 +Để xem tất cả màu sắc, bố cục và kích thước tương đối của mọi thứ. + +228 +00:19:22,030 --> 00:19:25,570 +Tạm dừng video ngay bây giờ và xem qua từng điều trong số hai điều này. + +229 +00:19:28,500 --> 00:19:28,890 +Được rồi. + +230 +00:19:28,890 --> 00:19:31,070 +Vì vậy, chúng ta hãy cùng nhau đi qua các giải pháp. + +231 +00:19:31,080 --> 00:19:38,670 +Bây giờ, bước một là thay đổi màu của phần tử cụ thể này thành một màu được đặt tên là san hô. + +232 +00:19:38,670 --> 00:19:41,370 +Và giải pháp sẽ giống như thế này. + +233 +00:19:42,090 --> 00:19:49,200 +Cách thứ hai là thay đổi kích thước phông chữ của phần tử này thành hai lần kích thước của phần tử gốc. + +234 +00:19:49,350 --> 00:19:56,340 +Hãy nhớ rằng, để làm được điều đó, chúng ta phải sử dụng REM và hai lần kích thước là hai REM. + +235 +00:19:56,700 --> 00:20:01,980 +Tôi đã chọn nó dựa trên ID kích thước và tôi đã thay đổi kích thước phông chữ thành đó. + +236 +00:20:03,050 --> 00:20:04,010 +Bước tiếp theo. + +237 +00:20:04,010 --> 00:20:12,380 +Tôi đã thay đổi độ dày phông chữ của phần tử này thành 900 bằng cách sử dụng thuộc tính độ nặng phông chữ và sau đó chúng tôi + +238 +00:20:12,380 --> 00:20:19,460 +thay đổi họ phông chữ của phần tử này để sử dụng phông chữ báo trước với độ dày phông chữ thông thường. + +239 +00:20:19,670 --> 00:20:28,040 +Vì vậy, tôi đã chọn phông chữ đó từ đó và sau đó tôi đã thêm vào tất cả các liên kết cần thiết ngay trước khi kết thúc + +240 +00:20:28,040 --> 00:20:28,790 +phần đầu. + +241 +00:20:28,790 --> 00:20:33,860 +Nhưng bên ngoài phần phong cách, điều này rất quan trọng về vị trí. + +242 +00:20:33,860 --> 00:20:39,140 +Và sau đó tôi đã thêm vào họ phông chữ và một phông chữ dự phòng trong trường hợp nó bị lỗi. + +243 +00:20:39,620 --> 00:20:44,990 +Tiếp theo, tôi đã thay đổi thành phần đoạn cụ thể này để nó được căn phải. + +244 +00:20:44,990 --> 00:20:51,650 +Và cuối cùng tôi thay đổi route, đó là phần tử HTML để có phông chữ 30 pixel. + +245 +00:20:51,800 --> 00:21:00,350 +Và khi điều đó được thay đổi, thì hai REM một, là yếu tố kích thước phông chữ ở đây, thực sự thay đổi theo + +246 +00:21:00,350 --> 00:21:00,800 +nó. + +247 +00:21:00,800 --> 00:21:05,100 +Vì vậy, nó trở nên lớn hơn hoặc nhỏ hơn tùy thuộc vào kích thước tuyến đường. + +248 +00:21:05,100 --> 00:21:11,010 +Vì vậy, hy vọng rằng điều đó đủ dễ dàng để bạn hoàn thành và nó đã kiểm tra bạn về tất cả những điều mà chúng ta đã học được + +249 +00:21:11,010 --> 00:21:12,820 +trong bài học này cho đến nay. + +250 +00:21:12,840 --> 00:21:18,540 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo, nơi chúng ta sẽ tìm hiểu thêm về kiểm tra CSS và cách bạn có thể + +251 +00:21:18,540 --> 00:21:23,700 +tìm hiểu điều gì đang xảy ra với CSS của mình bằng cách sử dụng các công cụ dành cho nhà phát triển Chrome. + +252 +00:21:23,700 --> 00:21:26,220 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Inspecting CSS.mp4 b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Inspecting CSS.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f4b75718182e26e0031d7c4d5a5031eb24360beb --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Inspecting CSS.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77849bf8f4a696c6645d50a6523c8eb3095ff18c60bb0531d62767bd1cbcd643 +size 70705247 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Inspecting CSS_vi.srt b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Inspecting CSS_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..36f11d3003777f0dadd5c2ce6392a8fbc95fa159 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Inspecting CSS_vi.srt @@ -0,0 +1,608 @@ +1 +00:00:00,260 --> 00:00:05,570 +Xin chào các bạn, chào mừng bạn đến với một bài học khác, nơi chúng ta tìm hiểu thêm về CSS. + +2 +00:00:05,689 --> 00:00:12,950 +Bây giờ trong bài học này, chúng ta sẽ đi sâu vào kiểm tra CSS và tìm hiểu về các công cụ dành cho nhà phát triển + +3 +00:00:12,950 --> 00:00:20,300 +Chrome cho phép chúng ta tìm hiểu xem CSS của mình đang làm gì và có khả năng chẩn đoán mọi lỗi hoặc giải quyết + +4 +00:00:20,300 --> 00:00:21,320 +mọi vấn đề. + +5 +00:00:22,550 --> 00:00:28,220 +Như tôi đã đề cập trước đây, các công cụ dành cho nhà phát triển Chrome là một bộ công cụ thực sự mạnh + +6 +00:00:28,220 --> 00:00:31,800 +mẽ, hoàn toàn miễn phí và đi kèm với trình duyệt Chrome. + +7 +00:00:31,820 --> 00:00:35,570 +Nếu bạn không sử dụng trình duyệt Chrome, bạn sẽ không có quyền truy cập vào trình duyệt đó. + +8 +00:00:35,570 --> 00:00:41,780 +Và điều thực sự quan trọng, ít nhất là đối với khóa học này, là bạn có cùng trình duyệt mà tôi đang sử dụng để chúng ta + +9 +00:00:41,780 --> 00:00:44,090 +có thể cùng nhau tìm hiểu các công cụ này. + +10 +00:00:44,360 --> 00:00:50,960 +Nếu bạn truy cập URL này, URL mà chúng ta đã truy cập trước đó trong phần trước, nơi tôi đã chỉ cho bạn cách CSS hoạt + +11 +00:00:50,990 --> 00:00:57,920 +động và cách chúng ta có thể thêm CSS một cách đơn giản để làm cho trang web của mình trông đẹp mắt, thì chúng ta có thể sử + +12 +00:00:57,920 --> 00:01:01,160 +dụng URL này làm ví dụ để tìm hiểu thêm về CSS điều tra. + +13 +00:01:01,430 --> 00:01:07,460 +Để hiển thị các công cụ dành cho nhà phát triển Chrome, chúng tôi chuyển đến ba dấu chấm này, sau đó chúng tôi chuyển đến các công cụ khác + +14 +00:01:07,460 --> 00:01:10,160 +và chúng tôi chuyển đến các công cụ dành cho nhà phát triển. + +15 +00:01:10,400 --> 00:01:19,310 +Bây giờ, bạn sẽ nhận thấy rằng ở phía bên phải của lựa chọn này, bạn có lối tắt cho máy tính của mình về cách bạn + +16 +00:01:19,340 --> 00:01:21,980 +có thể hiển thị nhanh chóng. + +17 +00:01:21,980 --> 00:01:22,810 +Trên máy Mac. + +18 +00:01:22,820 --> 00:01:33,050 +Nó thường được đặt theo mặc định thành tùy chọn lệnh và tôi trên Windows, nó thường điều khiển cộng với shift cộng với tôi. + +19 +00:01:33,080 --> 00:01:35,810 +Vì vậy, giữ ba phím đó cùng nhau. + +20 +00:01:35,990 --> 00:01:41,840 +Nhưng nếu bạn có các phím chức năng ở đây, nhấn F12 thường cũng sẽ hiển thị bảng điều khiển dành cho nhà phát triển + +21 +00:01:41,840 --> 00:01:42,650 +chrome. + +22 +00:01:42,650 --> 00:01:44,900 +Nhưng lối tắt có thể hoàn toàn khác đối với bạn. + +23 +00:01:44,900 --> 00:01:49,730 +Vì vậy, hãy chắc chắn rằng bạn đã xem qua ở đây để tìm ra phím tắt chính xác của bạn là gì. + +24 +00:01:50,030 --> 00:01:55,370 +Một cách khác để hiển thị bảng điều khiển dành cho nhà phát triển này chỉ đơn giản là nhấp chuột phải vào bất kỳ yếu tố nào bạn quan + +25 +00:01:55,370 --> 00:01:55,730 +tâm. + +26 +00:01:55,730 --> 00:02:00,740 +Ví dụ nút này rồi bấm vào kiểm tra nó cũng làm y như vậy. + +27 +00:02:00,740 --> 00:02:06,200 +Nhưng ngoài ra, nó sẽ làm nổi bật phần tử mà bạn đã chọn trong HTML. + +28 +00:02:06,230 --> 00:02:10,370 +Bây giờ nếu bạn muốn chọn một yếu tố khác khi bạn đang ở đây thì sao? + +29 +00:02:10,400 --> 00:02:17,210 +Chà, bạn có thể sử dụng nút này ở đây để chọn một phần tử một cách trực quan để bạn có thể nhấp vào đó và sau đó nói, + +30 +00:02:17,240 --> 00:02:22,500 +được rồi, tôi muốn xem phần chân trang ở đây, đoạn này, Chà, sau đó nó sẽ chọn nó cho bạn + +31 +00:02:22,500 --> 00:02:23,450 +trong HTML. + +32 +00:02:23,460 --> 00:02:30,240 +Hoặc tôi muốn xem H1 này để bạn có thể chọn nó một cách trực quan hoặc bạn có thể chọn nó bằng HTML. + +33 +00:02:30,810 --> 00:02:37,860 +Đây là tab Thành phần và chúng ta sẽ khám phá một phần phụ của phần này, đó là phần kiểu + +34 +00:02:37,860 --> 00:02:38,700 +dáng. + +35 +00:02:38,850 --> 00:02:45,570 +Lưu ý rằng khi tôi chọn bất kỳ phần tử nào trong số này, nó sẽ hiển thị cho tôi các kiểu đã được áp dụng cho các + +36 +00:02:45,570 --> 00:02:46,330 +phần tử đó. + +37 +00:02:46,350 --> 00:02:52,590 +Ví dụ: nếu chúng ta xem xét nút này, ít nhất là trong phiên bản CSS trên, bạn sẽ thấy rằng nút + +38 +00:02:52,590 --> 00:02:54,480 +này có màu nền mà tôi đã đặt. + +39 +00:02:54,510 --> 00:02:59,340 +Tôi đã đặt màu cho văn bản và nhiều thứ khác mà chúng ta không cần phải lo lắng quá nhiều vào lúc + +40 +00:02:59,340 --> 00:03:03,930 +này vì trong bài học tiếp theo, chúng ta sẽ tìm hiểu thêm về các thuộc tính CSS khác nhau. + +41 +00:03:03,930 --> 00:03:09,990 +Nhưng điều quan trọng là lưu ý rằng nếu tôi tiếp tục và nhấn nút đó và tắt tất cả CSS + +42 +00:03:09,990 --> 00:03:17,250 +và tôi chọn lại nút đó, thì bạn có thể thấy rằng hầu hết kiểu phần tử thực sự hoàn toàn tự động. + +43 +00:03:17,250 --> 00:03:24,780 +Bất cứ khi nào bạn chèn một phần tử HTML, phần tử đó sẽ đi kèm với CSS được tải trước tự động và đó là những gì bạn sẽ nhận được. + +44 +00:03:24,780 --> 00:03:31,200 +Theo mặc định, nó trông giống như thế này, nhưng khi bạn thực sự áp dụng CSS của riêng mình, thì nó sẽ hiển + +45 +00:03:31,200 --> 00:03:34,410 +thị ở đây và thậm chí bạn có thể xem nó đến từ tệp nào. + +46 +00:03:34,410 --> 00:03:41,460 +Trong trường hợp này, đó là Styles. css ngay tại đây và bạn có thể nhấp vào nó để xem mã nguồn + +47 +00:03:41,460 --> 00:03:42,300 +của CSS đó. + +48 +00:03:43,290 --> 00:03:49,350 +Điều tiếp theo tôi muốn chỉ cho bạn là cách bạn thực sự có thể thay đổi CSS trực tiếp trong các công cụ dành cho nhà phát triển + +49 +00:03:49,350 --> 00:03:50,070 +Chrome. + +50 +00:03:50,160 --> 00:03:59,100 +Ngay bây giờ, bạn có thể thấy tôi đã chọn H1 của mình và chỉ cần nhấp vào thêm, tôi có thể thêm kiểu cho H1 này. + +51 +00:03:59,100 --> 00:04:07,710 +Vì vậy, tôi có thể nói hãy thay đổi màu sắc của nó thay vì màu trắng thành màu đen, có thể là màu đen. + +52 +00:04:07,710 --> 00:04:10,610 +Và bạn có thể thấy điều đó được phản ánh trực tiếp ở đây. + +53 +00:04:10,620 --> 00:04:16,440 +Bây giờ tôi có thể tắt tính năng đó bằng cách di chuột qua đây và nhấp vào nút để đặt dấu gạch + +54 +00:04:16,440 --> 00:04:18,660 +chéo qua nó và nó sẽ xóa CSS đó. + +55 +00:04:18,690 --> 00:04:24,720 +Bây giờ, điều quan trọng cần nhớ là bất kỳ thay đổi nào bạn thực hiện trong công cụ dành cho nhà phát triển + +56 +00:04:24,750 --> 00:04:28,020 +Chrome đều không ảnh hưởng đến tệp gốc của bạn. + +57 +00:04:28,050 --> 00:04:35,400 +Trước đây, hãy nhớ rằng chúng tôi đã xem TechCrunch bằng cách sử dụng công cụ dành cho nhà phát triển Chrome và chúng tôi có thể thay + +58 +00:04:35,400 --> 00:04:40,050 +đổi văn bản bằng cách chỉ cần nhập vào công cụ dành cho nhà phát triển Chrome. + +59 +00:04:40,500 --> 00:04:46,590 +Điều này không thay đổi trang web của Techcrunch và một số bạn đã hỏi Điều này có bất hợp pháp không? + +60 +00:04:46,620 --> 00:04:47,760 +Tôi đang làm điều gì đó xấu? + +61 +00:04:47,790 --> 00:04:48,360 +Không, nó không. + +62 +00:04:48,360 --> 00:04:53,730 +Chỉ là bạn đang ảnh hưởng đến bản sao cục bộ của mình được tải lên bên trong trình duyệt Chrome. + +63 +00:04:53,730 --> 00:04:59,490 +Nó không ảnh hưởng đến bất kỳ người dùng nào khác và chắc chắn không thay đổi bất cứ điều gì trên máy chủ của Techcrunch. + +64 +00:04:59,820 --> 00:05:07,470 +Tương tự, quay lại đây, khi chúng tôi chỉnh sửa CSS, khi chúng tôi chọn hoặc bỏ chọn hoặc thêm các quy tắc mới, + +65 +00:05:07,470 --> 00:05:11,040 +điều đó không ảnh hưởng đến trang web thực tế. + +66 +00:05:11,370 --> 00:05:16,560 +Ngay cả khi bạn tải lên một trong những trang web địa phương mà bạn đang phát triển và bạn thay đổi rất + +67 +00:05:16,560 --> 00:05:18,390 +nhiều thứ, đây chỉ là tạm thời. + +68 +00:05:18,390 --> 00:05:21,630 +Đó là để bạn nhìn và thử mọi thứ và. + +69 +00:05:21,860 --> 00:05:28,130 +Hãy xem bạn thích nó như thế nào trước khi thêm các quy tắc này vào mã nguồn CSS thực tế của mình. + +70 +00:05:28,130 --> 00:05:32,720 +Và bạn có thể xác nhận thêm điều này bằng cách thấy rằng tôi có một H1 có màu đen. + +71 +00:05:32,720 --> 00:05:39,950 +Nhưng nếu tôi đi vào các nguồn, phong cách của tôi. css cho tệp này và tôi nhìn vào tệp này, bạn có thể thấy rằng + +72 +00:05:39,950 --> 00:05:41,810 +không có gì thay đổi ở đây. + +73 +00:05:42,140 --> 00:05:47,270 +Không có H1 nào có màu đen. + +74 +00:05:47,600 --> 00:05:50,840 +Một lần nữa, tôi khuyên bạn không nên lo lắng quá nhiều về các thuộc tính khác nhau. + +75 +00:05:50,840 --> 00:05:53,840 +Có rất nhiều trong số chúng sắp xuất hiện mà chúng ta sẽ nói đến. + +76 +00:05:53,840 --> 00:05:59,780 +Nhưng điều chính cần tập trung ở đây là cách sử dụng trình kiểm tra để hiểu những người khác cũng + +77 +00:05:59,780 --> 00:06:03,080 +như trang web của riêng bạn và cách trình bày CSS. + +78 +00:06:03,560 --> 00:06:07,820 +Nếu bạn tiếp tục và kiểm tra một trong các thẻ neo này. + +79 +00:06:07,820 --> 00:06:11,240 +Vì vậy, khi bạn nhấp vào đây và di chuột qua nó, bạn sẽ thấy thẻ A hiển thị. + +80 +00:06:11,240 --> 00:06:14,390 +Vì vậy, hãy nhấp vào nó và nó sẽ chọn nó trong HTML. + +81 +00:06:14,420 --> 00:06:20,720 +Bây giờ, nếu bạn nhìn qua đây, bạn có thể thấy rằng nó có một số thuộc tính mặc định đã + +82 +00:06:20,720 --> 00:06:30,150 +bị gạch bỏ và lý do của điều này là do khi chúng tôi áp dụng quy tắc CSS xung đột với một số quy tắc được áp dụng tự động, chẳng hạn như + +83 +00:06:30,150 --> 00:06:35,820 +màu của thẻ neo đó, hãy nhớ rằng, theo mặc định, màu của bất kỳ thẻ neo nào bắt + +84 +00:06:35,820 --> 00:06:37,710 +đầu là màu xanh lam. + +85 +00:06:37,740 --> 00:06:39,810 +Nhưng ở đây chúng ta có một cái màu trắng. + +86 +00:06:39,840 --> 00:06:42,690 +Chà, chúng tôi đã ghi đè nó đơn giản bằng dòng này. + +87 +00:06:42,690 --> 00:06:46,170 +Vì vậy, nếu tôi tắt cái này, bạn có thể thấy cái kia được bật lại. + +88 +00:06:46,170 --> 00:06:51,480 +Nhưng nếu tôi có các quy tắc của riêng mình, thì nó có thể ghi đè lên các quy tắc hiện có khác. + +89 +00:06:51,480 --> 00:06:55,860 +Vậy làm thế nào để bạn biết những gì đang thực sự được áp dụng cho phần tử CSS của bạn? + +90 +00:06:55,890 --> 00:07:01,230 +Chà, đó là nơi tab máy tính xuất hiện, bởi vì khi bạn nhấp vào nó, bạn sẽ thấy màu + +91 +00:07:01,230 --> 00:07:03,030 +thực tế dưới dạng RGB. + +92 +00:07:03,030 --> 00:07:09,600 +Vì vậy, bao nhiêu màu đỏ, xanh lá cây và xanh dương đang được áp dụng cho màu văn bản và các thuộc tính khác. + +93 +00:07:09,600 --> 00:07:14,190 +Và nó loại bỏ tất cả sự điên rồ của tất cả những thứ bị gạch bỏ này. + +94 +00:07:14,190 --> 00:07:18,780 +Và bạn thực sự có thể nhìn thấy ở một nơi những gì đang được áp dụng. + +95 +00:07:19,140 --> 00:07:25,620 +Giờ đây, một tính năng khác của công cụ Nhà phát triển Chrome mà tôi thấy thực sự hữu ích là chuyển đến ba dấu + +96 +00:07:25,650 --> 00:07:33,270 +chấm, chuyển đến nhiều công cụ hơn và hãy nhớ rằng đây là ba dấu chấm dành cho cài đặt của các công cụ dành cho nhà phát triển Chrome, + +97 +00:07:33,270 --> 00:07:35,160 +không phải cho Chrome. + +98 +00:07:35,160 --> 00:07:40,830 +Điều này rất dễ bị nhầm lẫn, nhưng khi bạn vào đây và tìm đến nhiều công cụ hơn, bạn sẽ tìm thấy phần tổng quan về CSS. + +99 +00:07:40,830 --> 00:07:47,310 +Và đây là một tính năng thú vị mà bạn có thể chọn tổng quan về chụp và nó sẽ hiển thị cho bạn một loạt + +100 +00:07:47,310 --> 00:07:51,210 +những thứ hữu ích, chẳng hạn như có hai màu nền ở đây. + +101 +00:07:51,210 --> 00:07:55,410 +Có một loại màu xám trắng và có một loại màu tím đang diễn ra. + +102 +00:07:55,440 --> 00:07:59,160 +Có hai màu văn bản khác nhau, trắng và đen. + +103 +00:07:59,280 --> 00:08:04,470 +Và chúng tôi cũng có thông tin về các phông chữ khác nhau đang được sử dụng trên trang web. + +104 +00:08:05,160 --> 00:08:10,080 +Tôi thấy điều này thực sự hay khi tôi bắt gặp một trang web mà tôi thực sự thích và tôi đang cố gắng + +105 +00:08:10,080 --> 00:08:11,850 +tìm ra, Ồ, phông chữ đó là gì? + +106 +00:08:11,880 --> 00:08:18,120 +Chà, có vẻ như họ đang sử dụng Helvetica Neue hoặc Màu xanh lục này chính xác là màu gì. + +107 +00:08:18,120 --> 00:08:24,330 +Chà, tôi thực sự có thể tìm ra điều đó đơn giản bằng cách nhìn vào trình kiểm tra này và có lẽ tôi có thể sao chép nó + +108 +00:08:24,330 --> 00:08:25,380 +để sử dụng sau này. + +109 +00:08:25,380 --> 00:08:27,840 +Vì vậy, bạn có thể nhìn thấy màu sắc, bạn có thể nhìn thấy phông chữ. + +110 +00:08:27,840 --> 00:08:31,290 +Và bây giờ, chúng tôi sẽ không lo lắng quá nhiều về hai điều cuối cùng. + +111 +00:08:31,320 --> 00:08:34,200 +Chúng ta sẽ đề cập đến điều đó trong các mô-đun sau. + +112 +00:08:34,530 --> 00:08:42,179 +Chơi thử với trình kiểm tra CSS và tôi muốn bạn xem qua việc chọn các thành phần khác nhau, xem xét kiểu của chúng, + +113 +00:08:42,179 --> 00:08:48,780 +cố gắng thêm một số kiểu trong công cụ dành cho nhà phát triển Chrome và xem xung quanh một số thứ + +114 +00:08:48,780 --> 00:08:51,030 +khác mà chúng tôi đã đề cập. + +115 +00:08:51,480 --> 00:08:57,100 +Sau khi bạn hài lòng vì biết cách thực hiện điều đó, tôi muốn + +116 +00:08:57,120 --> 00:09:06,030 +bạn truy cập URL này tại Brewery dot Github. io gạch chéo kiểm tra dấu gạch ngang CSS và tôi đã tạo một trang web để bạn kiểm tra trên trang web này. + +117 +00:09:06,030 --> 00:09:15,870 +Chúng tôi có một số thứ trên màn hình và đây là thẻ H1 và H2 và thẻ đoạn văn. + +118 +00:09:15,870 --> 00:09:24,780 +Bây giờ, tôi muốn bạn sử dụng trình kiểm tra CSS để trả lời bốn câu hỏi trắc nghiệm này và khi bạn đã nhập câu trả lời, hãy + +119 +00:09:24,780 --> 00:09:28,950 +nhấp vào gửi và bạn sẽ biết mình trả lời đúng hay sai. + +120 +00:09:29,370 --> 00:09:32,940 +Tạm dừng video và cố gắng hoàn thành thử thách này. + +121 +00:09:34,940 --> 00:09:35,300 +Được rồi. + +122 +00:09:35,300 --> 00:09:40,280 +Vì vậy, câu hỏi đầu tiên là, màu sắc được đặt tên của cơ thể là gì? + +123 +00:09:40,310 --> 00:09:41,810 +Vâng, màu sắc là gì? + +124 +00:09:41,810 --> 00:09:48,350 +Vì vậy, hãy tiếp tục và mở trình kiểm tra của chúng ta và chọn phần tử nội dung nếu chúng ta + +125 +00:09:48,350 --> 00:09:50,330 +chưa chọn nó trong HTML. + +126 +00:09:50,330 --> 00:09:53,380 +Và chúng ta hãy xem những phong cách nào được áp dụng. + +127 +00:09:53,390 --> 00:09:56,810 +Bạn có thể thấy nó có một màu nền đang được áp dụng. + +128 +00:09:56,810 --> 00:10:01,430 +Và nếu chúng ta tắt nó đi, bạn có thể thấy nó thay đổi nó thành mặc định, màu trắng. + +129 +00:10:01,430 --> 00:10:05,630 +Đây là màu nền của cơ thể và nó được gọi là Alice Blue. + +130 +00:10:05,660 --> 00:10:11,720 +Nếu tôi nhập nó vào đây và nhấp vào gửi, thì tôi sẽ nhận được câu trả lời đúng. + +131 +00:10:11,960 --> 00:10:14,000 +Bây giờ chúng ta hãy chuyển sang câu hỏi thứ hai. + +132 +00:10:14,000 --> 00:10:16,580 +Kích thước phông chữ của H1 là gì? + +133 +00:10:16,580 --> 00:10:23,300 +Hãy chọn H1 ngay tại đây và hãy xem kích thước phông chữ được đề cập ở đây. + +134 +00:10:23,300 --> 00:10:28,130 +Chà, nó nói đó là ba REM, khiến nó lớn hơn nhiều so với mặc định. + +135 +00:10:28,130 --> 00:10:32,840 +Vì vậy, hãy nhập ba REM vào đây, nhấn gửi. + +136 +00:10:32,840 --> 00:10:39,660 +Và chúng tôi có câu hỏi ngay đến câu hỏi thứ ba là độ dày phông chữ của H2 là bao nhiêu? + +137 +00:10:39,690 --> 00:10:45,900 +Chọn H2, nhìn vào độ đậm của phông chữ, độ đậm của phông chữ là 500. + +138 +00:10:46,170 --> 00:10:46,740 +Được rồi. + +139 +00:10:46,740 --> 00:10:48,180 +Và nhấn gửi. + +140 +00:10:48,600 --> 00:10:54,000 +Và cuối cùng, họ phông chữ của thẻ đoạn văn là gì? + +141 +00:10:54,000 --> 00:10:59,640 +Vì vậy, hãy chọn thẻ đoạn văn và sau đó xem họ phông chữ. + +142 +00:10:59,640 --> 00:11:06,240 +Và cái này hơi lắt léo vì thực ra nó không được áp trực tiếp vào đoạn văn mà thực + +143 +00:11:06,270 --> 00:11:10,680 +ra nó là một trong những phần tự động kế thừa. + +144 +00:11:10,680 --> 00:11:13,710 +Vì vậy, bạn có thể thấy ở đây nó nói họ phông chữ. + +145 +00:11:13,710 --> 00:11:19,470 +Và ngoài ra, nếu bạn truy cập vào máy tính, nơi mọi thứ được xếp chồng lên nhau, như tôi đã đề cập, nơi bạn không + +146 +00:11:19,470 --> 00:11:24,570 +cần phải xem qua toàn bộ danh sách những gì bị loại bỏ, những gì đang được áp dụng, v.v. + +147 +00:11:24,570 --> 00:11:29,310 +Bạn có thể thấy họ phông chữ là Ariel comma sans serif. + +148 +00:11:29,310 --> 00:11:37,560 +Vì vậy, dấu phẩy Ariel, sans serif và nhấn gửi và chúng tôi nhận được tất cả các câu trả lời đúng. + +149 +00:11:37,560 --> 00:11:39,360 +Vì vậy, bạn đã quản lý để làm điều đó? + +150 +00:11:39,360 --> 00:11:43,200 +Bạn có quản lý để sử dụng trình kiểm tra để tìm ra câu trả lời cho những câu hỏi này không? + +151 +00:11:43,200 --> 00:11:48,870 +Nếu không, hãy nhớ xem lại các phần trước của video này để bạn hiểu chính xác điều gì đang diễn ra + +152 +00:11:48,870 --> 00:11:51,450 +trước khi chuyển sang bài học tiếp theo. + diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Pesticide.url b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Pesticide.url new file mode 100644 index 0000000000000000000000000000000000000000..b436abfb0da34bbd001163fdc8ba70ce9527673c --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/003 Pesticide.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://chrome.google.com/webstore/detail/pesticide-for-chrome/bakpbgckdnepkmkeaiomhmfcnejndkbi \ No newline at end of file diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 6.3-CSS-Box-Model.zip b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 6.3-CSS-Box-Model.zip new file mode 100644 index 0000000000000000000000000000000000000000..e642dbd53527d15cfa4ceaf6eb4eb505ecf7a8bd --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 6.3-CSS-Box-Model.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff5abbf59b9e66eb008fc6fc633b37e9af8cd0ea94352aa260d8ed066aafec18 +size 822480 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 The CSS Box Model - Margin, Padding and Border.mp4 b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 The CSS Box Model - Margin, Padding and Border.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7b32d5c11e88fbcb3f92a0d6617505ac358440dc --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 The CSS Box Model - Margin, Padding and Border.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4efb9387c63bf46ce4b0fa5f30caab92eea3a1f4eff5ec41ca39005d53875e5 +size 158158369 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 The CSS Box Model - Margin, Padding and Border_vi.srt b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 The CSS Box Model - Margin, Padding and Border_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8eeb0a4d081d17abf69cba5ba21a4291c74bb459 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/004 The CSS Box Model - Margin, Padding and Border_vi.srt @@ -0,0 +1,916 @@ +1 +00:00:00,350 --> 00:00:00,980 +Này các cậu. + +2 +00:00:00,980 --> 00:00:07,190 +Trong bài học này, chúng ta sẽ nói về một số thuộc tính thực sự quan trọng khác và những thuộc + +3 +00:00:07,190 --> 00:00:12,140 +tính mà bạn có thể đã thấy nếu bạn tìm hiểu một chút trên Internet. + +4 +00:00:12,140 --> 00:00:19,670 +Và đây là phần đệm lề và thuộc tính đường viền và ba thuộc tính này, cùng với chiều rộng và chiều + +5 +00:00:19,670 --> 00:00:25,760 +cao, tạo thành một khái niệm CSS thực sự quan trọng được gọi là mô hình hộp. + +6 +00:00:25,760 --> 00:00:27,830 +Vậy chính xác nó là gì? + +7 +00:00:27,860 --> 00:00:33,110 +Chà, nếu bạn nghĩ về một trang web điển hình ở đây, tôi đã tạo một trang có tên là I Love Bacon. + +8 +00:00:33,140 --> 00:00:38,000 +Sau đó, bạn có các thành phần khác nhau trên màn hình, các thành phần HTML khác nhau. + +9 +00:00:38,000 --> 00:00:46,820 +Và mặc dù chúng ta không thể thực sự nhìn thấy nó một cách hiệu quả, nhưng bản thân mỗi phần tử là một hộp và chúng ta có thể thay đổi kích thước của + +10 +00:00:46,820 --> 00:00:51,110 +các hộp đó bằng cách thay đổi những thứ như chiều rộng và chiều cao. + +11 +00:00:51,110 --> 00:00:54,230 +Vì vậy, trong trường hợp này, tôi đã làm thịt xông khói của mình to hơn rất nhiều. + +12 +00:00:54,230 --> 00:01:00,290 +Và hộp vô hình đó xung quanh phần tử mô tả cách nó sẽ được trình bày trên màn hình. + +13 +00:01:00,290 --> 00:01:06,980 +Nếu chúng tôi có một phần tử có chiều cao 300 pixel, chúng tôi có thể thay đổi chiều cao đó để cho phép phần tử của chúng + +14 +00:01:06,980 --> 00:01:10,100 +tôi chiếm nhiều khoảng cách dọc hơn trên trang web. + +15 +00:01:10,130 --> 00:01:18,020 +Và khi điều này xảy ra, nó sẽ đẩy hộp của bất kỳ thành phần nào khác xuống thấp hơn trên trang web. + +16 +00:01:18,380 --> 00:01:24,470 +Bây giờ, tương tự, chúng ta cũng có thể thay đổi chiều rộng của một phần tử để cho phép nó chiếm nhiều không gian hơn theo chiều ngang. + +17 +00:01:24,470 --> 00:01:31,280 +Và chúng tôi có thể thực hiện việc này bằng cách sử dụng pixel như được xác định tại đây hoặc chúng tôi có thể sử dụng tỷ lệ phần trăm. + +18 +00:01:31,280 --> 00:01:38,390 +Vì vậy, trong trường hợp này, chúng ta đã có phần tử màu xanh chiếm toàn bộ chiều rộng của trang web và điều đó có thể + +19 +00:01:38,390 --> 00:01:43,580 +được thực hiện bằng cách sử dụng tỷ lệ phần trăm bên cạnh chiều rộng và chiều cao. + +20 +00:01:43,610 --> 00:01:48,500 +Chúng ta cũng có thể đặt đường viền cho từng phần tử HTML. + +21 +00:01:48,500 --> 00:01:55,250 +Nếu bạn tưởng tượng, mỗi phần tử HTML lại là một hộp, thì đây sẽ là đường viền của hộp. + +22 +00:01:55,970 --> 00:02:01,950 +Và cách mà thuộc tính đường viền hoạt động hơi khác một chút so với những gì bạn có thể đã thấy trước đây. + +23 +00:02:02,070 --> 00:02:07,650 +Nó có thể nhận ba giá trị cách nhau bởi một khoảng trắng. + +24 +00:02:07,860 --> 00:02:13,680 +Giá trị đầu tiên mà bạn nên cung cấp là độ dày của đường viền. + +25 +00:02:14,190 --> 00:02:18,510 +Và đây, như bạn có thể thấy ở đây, là độ dày của đường này. + +26 +00:02:18,510 --> 00:02:21,720 +Nếu tôi làm cho nó dày hơn, thì nó sẽ trông như thế này. + +27 +00:02:21,720 --> 00:02:26,910 +Và vì vậy, chúng tôi có thể cung cấp giá trị pixel cho độ dày làm mục đầu tiên. + +28 +00:02:27,090 --> 00:02:31,140 +Bây giờ, mục thứ hai là kiểu đường viền. + +29 +00:02:31,170 --> 00:02:37,440 +Ví dụ, bạn có thể có nét liền, nhưng bạn cũng có thể có nét đứt, trong trường hợp đó, + +30 +00:02:37,440 --> 00:02:43,710 +đường viền sẽ trông giống như thế này thay vì nét liền như chúng ta đã có ở đây. + +31 +00:02:44,700 --> 00:02:52,500 +Và cuối cùng, chúng ta có màu của đường viền mà bạn có thể đặt thành bất kỳ màu được đặt tên hoặc màu hex nào + +32 +00:02:52,500 --> 00:02:59,400 +như chúng ta đã trình bày trong bài học về thuộc tính màu. Đây là ba mục cùng nhau xác định đường + +33 +00:02:59,400 --> 00:03:01,790 +viền sẽ trông như thế nào. + +34 +00:03:01,790 --> 00:03:09,380 +Vì vậy, nếu tôi thay đổi đường viền từ 10 pixel thành 30 pixel, thì chúng ta sẽ có đường viền dày hơn rất + +35 +00:03:09,380 --> 00:03:10,040 +nhiều. + +36 +00:03:10,040 --> 00:03:18,350 +Nhưng hãy nhớ rằng, điều quan trọng là chiều cao và chiều rộng của phần tử HTML, hộp của bạn + +37 +00:03:18,350 --> 00:03:19,840 +không thay đổi. + +38 +00:03:19,850 --> 00:03:23,870 +Nó hoàn toàn giống như những gì trước đây. + +39 +00:03:23,870 --> 00:03:28,580 +Vì vậy, đường viền này thực sự đi ra ngoài chứ không phải vào trong. + +40 +00:03:28,580 --> 00:03:31,100 +Và đó là điều quan trọng cần nhớ ở đây. + +41 +00:03:32,030 --> 00:03:38,780 +Bây giờ, khi bạn đã xác định đường viền, bạn có thể sửa đổi thêm đường viền đó bằng các quy tắc cụ thể hơn. + +42 +00:03:38,780 --> 00:03:46,430 +Vì vậy, ví dụ, trong trường hợp này, tôi có một đường viền màu đen đặc khoảng 30 pixel xung quanh phần tử của mình. + +43 +00:03:46,430 --> 00:03:53,270 +Nhưng sau đó ở dòng tiếp theo và điều này rất quan trọng khi dòng này đi tới đâu, nó phải đi sau điểm + +44 +00:03:53,270 --> 00:03:55,730 +mà chúng ta đã tạo đường viền. + +45 +00:03:56,240 --> 00:04:02,550 +Trong trường hợp này, tôi đang nói rằng tôi muốn phần trên cùng của đường viền đó là 0 pixel thay thế. + +46 +00:04:02,550 --> 00:04:09,030 +Và, vâng, cách mà các quy tắc này được đánh giá là đầu tiên chúng sẽ nhìn vào đường tạo đường viền + +47 +00:04:09,030 --> 00:04:11,970 +này, có kích thước 30 pixel xung quanh. + +48 +00:04:11,970 --> 00:04:18,480 +Nhưng sau đó khi nó đến dòng tiếp theo, nó sẽ đánh giá quy tắc này và thấy rằng tôi thực sự nên sửa đổi phần + +49 +00:04:18,510 --> 00:04:21,570 +trên cùng của đường viền thành không có pixel. + +50 +00:04:21,570 --> 00:04:25,770 +Vì vậy, loại bỏ đường viền ở trên cùng một cách hiệu quả. + +51 +00:04:26,520 --> 00:04:33,270 +Độ rộng đường viền này hoạt động tương tự như cách hoạt động của thuộc tính đường viền, cụ thể + +52 +00:04:33,270 --> 00:04:35,970 +là nó có thể nhận tối đa bốn giá trị. + +53 +00:04:36,000 --> 00:04:45,570 +Giá trị đầu tiên là trên cùng, giá trị thứ hai là bên phải, thứ ba là dưới cùng và giá trị thứ tư là bên trái. + +54 +00:04:45,600 --> 00:04:48,930 +Nó đi theo chiều kim đồng hồ. + +55 +00:04:49,110 --> 00:04:54,690 +Ngoài ra, bạn cũng có thể chỉ cung cấp hai giá trị cho độ rộng đường viền. + +56 +00:04:54,720 --> 00:04:59,790 +Và những gì nó làm là nó thiết lập một và ba. + +57 +00:05:00,040 --> 00:05:03,460 +Và sau đó nó thiết lập hai và bốn. + +58 +00:05:03,700 --> 00:05:12,940 +Ví dụ: nếu chiều rộng đường viền của tôi, tôi đã đặt thành 0 pixel và 20 pixel, thì điều đó sẽ làm là nó sẽ đặt + +59 +00:05:12,940 --> 00:05:19,720 +hai và bốn, tức là bên trái và bên phải thành 20 pixel, sau đó nó sẽ đặt một và 3 + +60 +00:05:19,720 --> 00:05:21,700 +thành 0 điểm ảnh. + +61 +00:05:21,730 --> 00:05:24,850 +Điều này sau đó trở thành trên cùng và dưới cùng. + +62 +00:05:26,190 --> 00:05:29,730 +Và sau đó chúng tôi đã có bên trái và bên phải của chúng tôi. + +63 +00:05:31,560 --> 00:05:37,530 +Bây giờ, một thuộc tính khác mà tôi muốn nói về mô hình hộp được gọi là phần đệm. + +64 +00:05:37,530 --> 00:05:41,760 +Và điều này dễ thấy nhất khi chúng ta có nội dung chẳng hạn như văn bản. + +65 +00:05:41,850 --> 00:05:48,210 +Vì vậy, trong trường hợp này, hãy tưởng tượng rằng hộp màu xanh này là một phần tử đoạn văn. + +66 +00:05:48,300 --> 00:05:53,460 +Và trong phần tử đoạn văn, chúng ta có Hello world được lặp đi lặp lại rất nhiều lần. + +67 +00:05:53,610 --> 00:06:02,070 +Phần tử đoạn văn này có thuộc tính đường viền và đó là đường viền màu đen cố định, rộng 30 pixel xung + +68 +00:06:02,070 --> 00:06:03,120 +quanh. + +69 +00:06:04,160 --> 00:06:14,030 +Nếu tại thời điểm này, tôi thêm một thuộc tính đệm vào phần tử này, thì điều sẽ xảy ra là nó sẽ + +70 +00:06:14,030 --> 00:06:18,770 +đẩy đường viền của tôi ra ngoài 20 pixel. + +71 +00:06:18,770 --> 00:06:23,900 +Và trong trường hợp này, tôi đang đẩy nó lên 20 ở tất cả các phía. + +72 +00:06:24,260 --> 00:06:33,260 +Và lưu ý, một lần nữa, trong tình huống này, chiều cao và chiều rộng của hộp này không thay đổi. + +73 +00:06:33,260 --> 00:06:34,690 +Nó vẫn vậy. + +74 +00:06:34,700 --> 00:06:43,190 +Phần đệm chỉ cần thêm phần đệm này hoặc khoảng trắng giữa phần tử và đường viền. + +75 +00:06:43,880 --> 00:06:48,180 +Ngoài phần đệm, còn có một thứ gọi là lề. + +76 +00:06:48,200 --> 00:06:54,330 +Và lề thực sự là phần bên ngoài đường viền. + +77 +00:06:54,350 --> 00:07:03,170 +Vì vậy, đây một lần nữa là đường viền ở giữa đường viền và chiều rộng và chiều cao của phần tử. + +78 +00:07:03,860 --> 00:07:12,680 +Phần đệm và phần giữa đường viền và bất kỳ nội dung nào khác trên màn hình có phải là lề không. + +79 +00:07:12,680 --> 00:07:18,410 +Vì vậy, trong trường hợp này, chúng tôi đã thêm lề mười pixel trên cả bốn cạnh. + +80 +00:07:19,010 --> 00:07:27,170 +Nếu bạn tưởng tượng, chúng ta có hai phần tử, mỗi phần tử có cùng phần đệm, lề và đường viền, thì lề này hoặc + +81 +00:07:27,170 --> 00:07:35,060 +khoảng cách này giữa hai phần tử trong trường hợp này sẽ thực sự là 20 pixel vì nó cách bên này 10 pixel + +82 +00:07:35,060 --> 00:07:37,700 +và cách bên này 10 pixel . + +83 +00:07:37,700 --> 00:07:43,390 +Và nó thêm khoảng cách này giữa các phần tử mà bạn sẽ không nhận được với phần đệm. + +84 +00:07:43,400 --> 00:07:45,980 +Vì vậy, đó là sự khác biệt chính. + +85 +00:07:47,020 --> 00:07:56,530 +Khi kiểm tra, bạn có thể đã thấy mô hình hộp đã được hiển thị trong trình kiểm tra và nó hiển thị cho bạn lề, đường + +86 +00:07:56,530 --> 00:08:01,090 +viền, phần đệm cũng như chiều rộng và chiều cao. + +87 +00:08:01,180 --> 00:08:05,330 +Vì vậy, đó là những gì tất cả các màu sắc khác nhau đại diện. + +88 +00:08:05,350 --> 00:08:13,450 +Và khi bạn xem mô hình hộp khi kiểm tra, thì bạn thực sự có thể thay đổi từng giá trị này để xem + +89 +00:08:13,450 --> 00:08:18,460 +nó sẽ trông khác như thế nào nếu bạn đi đến địa chỉ này. + +90 +00:08:18,490 --> 00:08:25,960 +Ứng dụng chấm Github. io chuyển tiếp mô hình gạch chéo hộp gạch chéo, sau đó chúng tôi tiếp + +91 +00:08:25,960 --> 00:08:34,690 +tục và mở các công cụ dành cho nhà phát triển và chúng tôi chọn hình ảnh đầu tiên ở đây, hình ảnh này hiển thị thế giới ban ngày và chúng tôi chuyển sang mô hình + +92 +00:08:34,690 --> 00:08:36,390 +hộp bên dưới tab Kiểu. + +93 +00:08:36,400 --> 00:08:43,720 +Nếu tôi tiếp tục và thêm một lề ngay tại đây, giả sử, tôi không biết, 100 pixel, thì nó sẽ thêm + +94 +00:08:43,720 --> 00:08:45,220 +khoảng cách đó. + +95 +00:08:45,220 --> 00:08:50,630 +Bạn có nhìn thấy nó ngay bây giờ không, khoảng cách giữa hình ảnh đó và bất cứ thứ gì bên dưới nó? + +96 +00:08:50,780 --> 00:09:00,470 +Và tương tự, nếu tôi thêm một chút lề ở trên, chẳng hạn như 100 pixel, thì bạn có thể thấy nó thêm một khoảng cách giữa + +97 +00:09:00,470 --> 00:09:05,840 +hình ảnh đó và phần tử tiếp theo ở trên, đó là thẻ đoạn văn. + +98 +00:09:05,930 --> 00:09:14,720 +Tuy nhiên, nếu tôi đã thêm phần đệm là 100 pixel thì bạn sẽ thấy nó cũng thêm khoảng trắng. + +99 +00:09:14,720 --> 00:09:19,520 +Nhưng nó thực sự nằm bên trong đường viền của hình ảnh. + +100 +00:09:20,030 --> 00:09:30,200 +Nếu phần tử này thực sự có đường viền sẽ được đặt thành màu đen đặc 10 pixel, thì bạn có thể thấy phần đệm đó chuyển sang + +101 +00:09:30,200 --> 00:09:35,060 +vị trí khác như thế nào so với vị trí của đường viền. + +102 +00:09:35,060 --> 00:09:41,960 +Và mô hình hộp này sẽ trở nên thực sự, thực sự tiện dụng khi bạn bắt đầu thử và bố trí các mục khác nhau trên + +103 +00:09:41,960 --> 00:09:48,290 +trang web của mình để xác định hình thức của chúng và vị trí chúng được đặt Tương đối với nhau. + +104 +00:09:48,620 --> 00:09:57,350 +Điều cuối cùng tôi muốn đề cập đến là phần đệm và lề, tương tự như những gì chúng ta đã thấy đối với + +105 +00:09:57,680 --> 00:10:07,460 +đường viền và cả hàm độ rộng đường viền giống như cách mà chúng ta có một, hai, ba và bốn giá trị mà chúng ta có + +106 +00:10:07,460 --> 00:10:16,190 +thể cung cấp và nếu chúng tôi cung cấp một giá trị khác nhau cho mỗi pixel, vì vậy 0, 10, 20 và 30 pixel, + +107 +00:10:16,190 --> 00:10:22,490 +sau đó giá trị này sẽ xác định giao diện của nó trên cả bốn mặt. + +108 +00:10:22,490 --> 00:10:30,830 +Và bạn phải nhớ rằng đây là nơi mà giá trị thứ nhất đứng thứ hai, và nó quay vòng theo chiều kim + +109 +00:10:30,830 --> 00:10:31,790 +đồng hồ. + +110 +00:10:32,240 --> 00:10:37,460 +Một lần nữa, với độ rộng đường viền, bạn có thể thay đổi để chỉ cung cấp hai giá trị. + +111 +00:10:37,460 --> 00:10:47,390 +Vì vậy, giả sử 10 pixel và 40 pixel, thì điều này sẽ được áp dụng cho trên cùng và dưới cùng cũng như bên + +112 +00:10:47,390 --> 00:10:49,490 +trái và bên phải. + +113 +00:10:49,910 --> 00:10:57,980 +Vì vậy, đây chỉ là một cách cụ thể về cách ba thuộc tính này có thể chấp nhận nhiều giá trị. + +114 +00:10:57,980 --> 00:11:06,140 +Nếu bạn chỉ đặt một giá trị, chẳng hạn như 10 pixel, thì điều đó sẽ ảnh hưởng đến tất cả các mặt ngoài các hộp được tạo bởi các phần + +115 +00:11:06,140 --> 00:11:13,670 +tử, chúng tôi thực sự có thể tạo các hộp của riêng mình độc lập với giá trị đó và điều đó thực sự hữu ích khi chúng tôi muốn + +116 +00:11:13,670 --> 00:11:20,030 +nhóm các giá trị khác nhau các bit nội dung với nhau để chúng ta có thể tạo kiểu cho nó cùng nhau. + +117 +00:11:20,030 --> 00:11:22,250 +Hoặc có lẽ chúng ta muốn đặt nó ra cùng nhau. + +118 +00:11:22,250 --> 00:11:31,100 +Ví dụ: ở đây chúng tôi có một hình ảnh và có thể tôi muốn hình ảnh có chú thích và tôi có thể muốn tạo kiểu + +119 +00:11:31,100 --> 00:11:38,390 +cho hai phần này lại với nhau để tôi có thể bọc một hộp xung quanh hai phần tử này. + +120 +00:11:38,510 --> 00:11:46,130 +Và cách mà tôi tạo ra những hộp nhân tạo này là thông qua việc sử dụng một phần tử HTML, được gọi + +121 +00:11:46,130 --> 00:11:48,980 +là phần tử phân chia nội dung. + +122 +00:11:48,980 --> 00:11:55,300 +Chẳng ích gì khi tìm hiểu về phần tử div trước khi chúng ta có thể tìm + +123 +00:11:55,300 --> 00:12:04,960 +hiểu về CSS bởi vì chúng hoàn toàn vô hình trừ khi bạn áp dụng kiểu CSS cho nó và toàn bộ mục đích là hoạt + +124 +00:12:04,990 --> 00:12:12,100 +động như một hộp vô hình có thể chứa nội dung ở giữa thẻ mở và thẻ đóng . + +125 +00:12:12,250 --> 00:12:20,290 +Ở giữa, chúng ta có thể đặt bao nhiêu phần tử tùy thích và chúng ta có thể nhóm chúng vào các hộp riêng biệt + +126 +00:12:20,290 --> 00:12:21,640 +được gọi là Div. + +127 +00:12:22,540 --> 00:12:30,640 +Vì vậy, ở đây tôi có mã HTML từ trang web mà tôi đã cho bạn xem trước đó với hai phiên bản của thế giới chúng ta là Chế + +128 +00:12:30,640 --> 00:12:32,980 +độ xem buổi sáng và Buổi tối. + +129 +00:12:32,980 --> 00:12:38,620 +Và nó thực sự đơn giản và tôi chỉ mới lấy phần nội dung của HTML. + +130 +00:12:38,620 --> 00:12:45,610 +Nhưng ở đây lưu ý rằng chúng ta có thẻ đoạn văn và thẻ hình ảnh và chúng được nhóm lại với nhau thông qua việc sử + +131 +00:12:45,610 --> 00:12:46,060 +dụng. + +132 +00:12:46,260 --> 00:12:52,800 +của phần tử div này và lưu ý rằng phần tử div không thực sự làm bất cứ điều gì khác ngoài + +133 +00:12:52,800 --> 00:13:00,690 +hoạt động như một thùng chứa để nhóm phần này lại với nhau sao cho nó tách biệt với nội dung khác. + +134 +00:13:00,690 --> 00:13:03,240 +Ví dụ, phần này ngay tại đây. + +135 +00:13:04,290 --> 00:13:11,400 +Và bây giờ chúng ta không chỉ thêm ý nghĩa cho HTML của mình bằng cách nói đây là một phần nội dung và đây là một phần + +136 +00:13:11,400 --> 00:13:17,070 +nội dung khác, mà ngoài ra, chúng ta có thể định kiểu chúng theo cách khác trong CSS. + +137 +00:13:17,700 --> 00:13:21,210 +Khi chúng tôi chạy mã của mình, đây là giao diện của trang web. + +138 +00:13:21,240 --> 00:13:29,220 +Bạn sẽ không nhìn thấy bất kỳ phần tử div nào trong số này, nhưng nếu chúng ta có thể nhìn thấy chúng thì chúng sẽ trông như thế + +139 +00:13:29,220 --> 00:13:29,640 +này. + +140 +00:13:29,640 --> 00:13:35,010 +Nhóm các phần tử của chúng ta lại với nhau vì các div này là vô hình. + +141 +00:13:35,010 --> 00:13:41,010 +Đôi khi có thể thực sự khó để gỡ lỗi chúng và hiểu điều gì đang xảy ra hoặc nhiều khả năng là điều gì đang + +142 +00:13:41,010 --> 00:13:42,690 +xảy ra với CSS của bạn. + +143 +00:13:42,900 --> 00:13:50,640 +Vì vậy, có một tiện ích mở rộng Chrome miễn phí mà tôi khuyên bạn nên tải xuống để làm cho quá trình gỡ lỗi này dễ dàng hơn + +144 +00:13:50,640 --> 00:13:54,510 +một chút và đó là lý do tại sao nó được gọi là thuốc trừ sâu. + +145 +00:13:54,540 --> 00:13:57,630 +Chúng tôi sẽ sử dụng nó để loại bỏ các lỗi trong CSS của chúng tôi. + +146 +00:13:58,200 --> 00:14:05,410 +Tôi sẽ thêm một liên kết tới tiện ích mở rộng này của Chrome và tất cả những gì bạn phải làm là nhấp vào thêm vào Chrome rồi thêm + +147 +00:14:05,410 --> 00:14:06,430 +tiện ích mở rộng. + +148 +00:14:06,430 --> 00:14:12,910 +Và khi bạn đã có nó, thì bạn sẽ có thể xem bên trong các tiện ích mở rộng của mình rồi mở + +149 +00:14:12,910 --> 00:14:14,410 +nó ra để kích hoạt. + +150 +00:14:14,440 --> 00:14:16,000 +Bây giờ nó làm gì? + +151 +00:14:16,030 --> 00:14:17,320 +Vâng, hãy demo nó. + +152 +00:14:17,410 --> 00:14:23,800 +Ngoài bộ công cụ dành cho nhà phát triển mà bạn hiện có, bạn cũng có loại thuốc trừ sâu phù hợp với + +153 +00:14:23,800 --> 00:14:24,300 +mình. + +154 +00:14:24,310 --> 00:14:32,950 +Và khi bạn kích hoạt nó, bạn có thể thấy các hộp div này hiện hiển thị trên màn hình và bạn cũng có thể thấy các thành phần khác nhau + +155 +00:14:32,950 --> 00:14:38,890 +được đánh dấu trong các hộp và nó thực sự giúp bạn chẩn đoán điều gì không ổn với mô hình hộp + +156 +00:14:38,890 --> 00:14:40,750 +của mình khi nó gặp sự cố. + +157 +00:14:40,840 --> 00:14:46,360 +Ngoài ra, nếu bạn đóng các công cụ dành cho nhà phát triển Chrome và giữ phím điều + +158 +00:14:46,390 --> 00:14:53,980 +khiển, khi bạn di chuột qua từng hộp này ở cuối màn hình, bạn có thể thấy cách nó cho bạn biết bạn thực sự đang di + +159 +00:14:53,980 --> 00:14:55,360 +chuột vào nút nào. + +160 +00:14:55,360 --> 00:15:02,200 +Vì vậy, trong trường hợp này, tôi đang ở trong một div và nó cũng cho bạn biết liệu có bất kỳ lớp hoặc ID nào trên div đó hay không. + +161 +00:15:02,200 --> 00:15:09,070 +Và sau đó, ở đây tôi đang di chuột trên một thành phần hình ảnh và ở đây tôi đang di chuột trên một thành phần đoạn văn và điều này + +162 +00:15:09,070 --> 00:15:15,850 +có thể thực sự hữu ích để bạn xem chính xác những gì trên màn hình và gần giống như đeo kính nhìn ban đêm để chúng ta có thể nhìn + +163 +00:15:15,850 --> 00:15:21,010 +thấy div của mình và các yếu tố của chúng tôi và sự liên kết của chúng và kích thước của chúng. + +164 +00:15:21,640 --> 00:15:27,090 +Cuối cùng, chúng ta sẽ sử dụng mọi thứ mà chúng ta đã học được và kết hợp tất cả lại với nhau trong bài tập này. + +165 +00:15:27,230 --> 00:15:30,070 +Chúng ta sẽ viết một số mã và áp dụng kiến thức của mình. + +166 +00:15:30,250 --> 00:15:37,300 +Hãy tiếp tục và tải xuống tệp zip này từ bài học hiện tại này, giải nén và mở tệp bên trong so với mã. + +167 +00:15:37,630 --> 00:15:43,930 +Bây giờ, khi bạn đã hoàn thành việc đó, hãy mở tệp index. html và bạn sẽ thấy rất nhiều việc phải làm. + +168 +00:15:44,110 --> 00:15:50,800 +Tôi muốn bạn làm theo từng bước một, giống như thể bạn là nhà phát triển web làm theo hướng dẫn của + +169 +00:15:50,800 --> 00:15:51,790 +khách hàng. + +170 +00:15:51,790 --> 00:15:57,250 +Và chúng ta sẽ sử dụng mọi thứ bạn đã học được cho đến nay để tạo ra thứ gì đó giống như + +171 +00:15:57,250 --> 00:15:57,860 +thế này. + +172 +00:15:57,880 --> 00:16:03,420 +Bây giờ, tôi đã đánh dấu trang này một chút để tôi có thể chỉ cho bạn những phần quan trọng của các yêu cầu. + +173 +00:16:03,430 --> 00:16:11,050 +Ví dụ: lưu ý rằng ở đây tôi đã nói phần đệm 20 pixel và điều đó áp dụng cho khoảng cách + +174 +00:16:11,050 --> 00:16:14,110 +giữa thẻ đoạn đó và đường viền. + +175 +00:16:14,620 --> 00:16:20,740 +Và ở đây, tôi đã nói nó nên có đường viền 20 pixel ở trên cùng và ở dưới cùng, nhưng sau đó chỉ có + +176 +00:16:20,740 --> 00:16:23,560 +đường viền 10 pixel ở bên trái và bên phải. + +177 +00:16:23,680 --> 00:16:27,270 +Và lưu ý rằng bố cục rất cụ thể ở đây. + +178 +00:16:27,280 --> 00:16:31,330 +Mỗi hộp này phải được chạm vào góc này sang góc khác. + +179 +00:16:31,330 --> 00:16:37,570 +Vì vậy, bạn sẽ phải tìm ra cách sử dụng thuộc tính lề để đẩy các hộp này xung quanh sao cho chúng + +180 +00:16:37,570 --> 00:16:42,400 +được căn chỉnh theo đúng nghĩa đen với nhau trên cùng một pixel. + +181 +00:16:42,850 --> 00:16:50,200 +Tôi sẽ để bạn tạm dừng video và xem qua từng yêu cầu này và hy vọng bạn sẽ có thể tạo + +182 +00:16:50,200 --> 00:16:54,730 +một trang web trông giống như hình ảnh mục tiêu. + +183 +00:16:54,850 --> 00:16:58,930 +Tạm dừng video ngay bây giờ và hoàn thành thử thách này. + +184 +00:17:01,460 --> 00:17:01,850 +Được rồi. + +185 +00:17:01,850 --> 00:17:04,230 +Vì vậy, chúng ta hãy cùng nhau đi qua các giải pháp. + +186 +00:17:04,250 --> 00:17:12,319 +Bây giờ, điều đầu tiên bạn sẽ nhận thấy là chúng tôi đã tạo ba Div và tôi đã thêm thẻ đoạn văn vào div đầu tiên để chúng + +187 +00:17:12,319 --> 00:17:16,490 +tôi có thể thấy phần đệm của mình dễ dàng hơn một chút. + +188 +00:17:16,790 --> 00:17:23,569 +Điều tiếp theo là chúng tôi đã đặt chiều cao và chiều rộng của từng div thành kích thước pixel, cụ thể là 200 pixel. + +189 +00:17:23,900 --> 00:17:31,400 +Tiếp theo, tôi đã thêm một phần tử đoạn văn bên trong div đầu tiên để chúng ta có thể thấy bất kỳ phần đệm nào được thêm + +190 +00:17:31,400 --> 00:17:32,600 +vào rất dễ dàng. + +191 +00:17:32,810 --> 00:17:40,280 +Và tôi đã đặt div đầu tiên có 20 pixel đệm xung quanh với đường viền 10 pixel màu đen và bạn có + +192 +00:17:40,280 --> 00:17:42,860 +thể thấy điều đó bên dưới đây. + +193 +00:17:42,950 --> 00:17:50,780 +Bây giờ, hãy lưu ý cách tôi đã sử dụng các ID khác nhau cho các hộp hoặc div khác nhau và bằng cách này, tôi có thể xác định + +194 +00:17:50,780 --> 00:17:54,440 +duy nhất từng div và đặt kiểu dáng khác nhau cho chúng. + +195 +00:17:55,510 --> 00:17:56,410 +Bước tiếp theo. + +196 +00:17:56,410 --> 00:18:03,460 +Tôi đã nhắm mục tiêu phần tử đoạn văn để loại bỏ bất kỳ phần tử nào có lề trên đó, bởi vì nếu + +197 +00:18:03,460 --> 00:18:13,240 +chúng tôi xem trước giải pháp của mình và mở phần tử này bên trong Chrome, bạn có thể thấy điều đó theo mặc định, mỗi phần + +198 +00:18:13,240 --> 00:18:17,800 +tử đoạn văn thực sự có một m lề tại bắt đầu và kết thúc. + +199 +00:18:17,800 --> 00:18:23,650 +Vì vậy, nếu tôi hủy bỏ điều này, bạn có thể thấy cách nó đẩy điều đó ra khỏi div chứa. + +200 +00:18:23,680 --> 00:18:29,380 +Vì vậy, chúng tôi muốn thêm lề bằng 0 để chúng tôi đặt nó ở giữa và nó sẽ không bị ảnh hưởng bởi kiểu + +201 +00:18:29,380 --> 00:18:30,750 +dáng mặc định của nó. + +202 +00:18:30,760 --> 00:18:38,230 +Tiếp theo, chúng tôi yêu cầu bạn đặt div thứ hai có đường viền 20 pixel, trên và dưới và đường viền 10 pixel bên trái + +203 +00:18:38,230 --> 00:18:39,250 +và bên phải. + +204 +00:18:39,250 --> 00:18:46,510 +Và nếu bạn còn nhớ từ bài học, điều này đạt được thông qua phương pháp thiết lập độ rộng đường viền đa giá + +205 +00:18:46,510 --> 00:18:46,870 +trị. + +206 +00:18:46,870 --> 00:18:50,110 +Vì vậy, giá trị đầu tiên là trên cùng và dưới cùng. + +207 +00:18:50,110 --> 00:18:53,890 +Và sau dấu cách, chúng ta có giá trị thứ hai cho bên trái và bên phải. + +208 +00:18:53,890 --> 00:18:59,900 +Và ngay cả khi bạn di chuột qua phần này, thường thì mã này khá hữu ích để lấy tham chiếu về phần này và nó cho + +209 +00:18:59,900 --> 00:19:02,570 +bạn biết các quy tắc hoạt động như thế nào. + +210 +00:19:02,570 --> 00:19:03,980 +Vì vậy, đó là một mẹo nhanh chóng. + +211 +00:19:04,670 --> 00:19:11,900 +Cuối cùng, chúng tôi đặt div thứ ba để có đường viền mười pixel và tôi muốn bạn đặt lề sao cho chúng + +212 +00:19:11,900 --> 00:19:14,360 +chạm vào từng góc với góc. + +213 +00:19:14,390 --> 00:19:18,020 +Bây giờ điều đó có thể được thực hiện bằng cách thử và sai. + +214 +00:19:18,050 --> 00:19:24,290 +Ngoài ra, bạn cũng có thể tính toán nó vì nếu bạn nghĩ về div đầu tiên này ngay + +215 +00:19:24,290 --> 00:19:29,990 +tại đây, nó có chiều rộng là 200 pixel, vì vậy phần này là 200. + +216 +00:19:29,990 --> 00:19:35,420 +Nhưng ngoài ra, nó cũng có một đường viền mười điểm ảnh xung quanh. + +217 +00:19:35,420 --> 00:19:39,590 +Vì vậy, sau đó chúng ta phải thêm mười và mười ở đây. + +218 +00:19:39,770 --> 00:19:42,590 +Bây giờ điều đó đưa chúng ta lên tới 220. + +219 +00:19:42,590 --> 00:19:47,060 +Nhưng ngoài ra, hãy nhớ rằng chúng tôi đã thêm 20 pixel đệm xung quanh. + +220 +00:19:47,060 --> 00:19:51,080 +Vì vậy, có 20 ở đây và 20 ở đây. + +221 +00:19:51,080 --> 00:20:00,710 +Vậy nếu chúng ta cộng tất cả lại, 200 cộng 20 cộng 20 cộng 10, 10, sẽ có 260 pixel. + +222 +00:20:00,710 --> 00:20:08,630 +Vì vậy, sau đó chúng tôi biết rằng chúng tôi phải đẩy div thứ hai lên 260 pixel và chúng tôi có thể làm điều đó bằng cách + +223 +00:20:08,630 --> 00:20:13,610 +sử dụng cài đặt lề trái, đó là cách chúng tôi quản lý để đẩy hộp này qua. + +224 +00:20:13,610 --> 00:20:19,340 +Và theo cách tương tự, chúng ta cũng có thể tính xem cần đẩy hộp thứ ba này bao nhiêu. + +225 +00:20:20,300 --> 00:20:26,330 +Tôi hy vọng thử thách này đủ thách thức đối với bạn, nhưng đừng lo lắng nếu không phải vậy + +226 +00:20:26,330 --> 00:20:31,430 +vì sẽ có nhiều bố cục thử thách hơn xuất hiện trong phần còn lại của khóa học + +227 +00:20:31,460 --> 00:20:37,010 +và bạn sẽ có thể uốn dẻo cơ bắp mô hình hộp của mình trong phần tiếp theo là tốt. + +228 +00:20:37,040 --> 00:20:42,740 +Nhưng khi bạn đã sẵn sàng và bạn đã xem lại mã của mình cũng như sửa bất kỳ lỗi nào, hãy chuyển sang bài học tiếp + +229 +00:20:42,740 --> 00:20:45,590 +theo nơi chúng ta có dự án cuối cùng cho phần này. + diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 6.4-Motivation-Meme-Project.zip b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 6.4-Motivation-Meme-Project.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e333f04885e5035b62c388e5e2bd5dde56eab61 --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 6.4-Motivation-Meme-Project.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:943fe9b7363baf32f402ae4293bf1210d9c3106e98b699edbe31add02b768019 +size 4603188 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 Day 44 Project - Motivational Poster Website.mp4 b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 Day 44 Project - Motivational Poster Website.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5df83b63a6fbc11409040a346fe119ea88db83cb --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 Day 44 Project - Motivational Poster Website.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:450d95c0dd7b33a4d6824eb68b6033f6fa6fc86957190219c862eebc913459e1 +size 115592627 diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 Day 44 Project - Motivational Poster Website_vi.srt b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 Day 44 Project - Motivational Poster Website_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d1a1b5479e7502524a53c52ad428e6e3a793defa --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/005 Day 44 Project - Motivational Poster Website_vi.srt @@ -0,0 +1,376 @@ +1 +00:00:00,290 --> 00:00:00,680 +Được rồi. + +2 +00:00:00,680 --> 00:00:07,070 +Vì vậy, đối với dự án cuối cùng, chúng tôi sẽ xây dựng một trang web áp phích động lực và chúng tôi sẽ + +3 +00:00:07,070 --> 00:00:09,000 +tạo các meme của riêng mình. + +4 +00:00:09,020 --> 00:00:11,880 +Bạn có thể đã thấy một số trong số này trên Internet. + +5 +00:00:11,900 --> 00:00:17,780 +Có những thứ nghiêm túc dựa trên những tấm áp phích tạo động lực dài 90 giây này, trong đó + +6 +00:00:17,780 --> 00:00:23,280 +bạn có một số loại tiêu đề và bạn có một số loại văn bản tạo động lực như tiềm năng. + +7 +00:00:23,300 --> 00:00:27,620 +Tất cả chúng ta đều có những công cụ để trở nên vĩ đại bên trong mình và tôi tin điều đó là đúng. + +8 +00:00:27,620 --> 00:00:29,650 +Và bạn đã có một chú cáo Bắc cực nhỏ dễ thương. + +9 +00:00:29,660 --> 00:00:33,510 +Nhưng cũng có một số thứ khá vui nhộn như Coolness. + +10 +00:00:33,530 --> 00:00:36,410 +Bạn có thể ngầu, nhưng bạn sẽ không bao giờ hợp với những chiếc áo cổ lọ. + +11 +00:00:36,410 --> 00:00:37,850 +Lạnh lùng như anh chàng này. + +12 +00:00:37,970 --> 00:00:43,850 +Vì vậy, mục tiêu là tạo trang web của riêng chúng tôi, nơi chúng tôi có thể tạo áp phích động lực của riêng mình. + +13 +00:00:44,030 --> 00:00:50,090 +Phần quan trọng của một tấm áp phích tạo động lực là có một hình ảnh sẽ trở nên nổi bật. + +14 +00:00:50,090 --> 00:00:53,870 +Có một đường viền xung quanh hình ảnh. + +15 +00:00:53,870 --> 00:00:56,970 +Vì vậy, bây giờ chúng tôi biết tất cả về biên giới và chúng tôi có thể làm điều đó. + +16 +00:00:56,990 --> 00:01:04,690 +Chúng tôi có nền đen và điều đó thật dễ dàng vì chúng tôi biết tất cả về các thuộc tính màu CSS. + +17 +00:01:04,709 --> 00:01:13,560 +Chúng tôi có một tiêu đề chính lớn, chúng tôi sẽ sử dụng phông chữ tùy chỉnh để bắt chước phông chữ này tốt hơn một + +18 +00:01:13,560 --> 00:01:14,250 +chút. + +19 +00:01:14,250 --> 00:01:20,910 +Và cuối cùng, chúng ta có một đoạn văn ở dưới cùng và chúng ta sẽ tìm hiểu cách căn giữa mọi thứ trên + +20 +00:01:20,910 --> 00:01:26,850 +màn hình, cách thêm đường viền và cách áp dụng cơ bản mọi thứ mà chúng ta đã học cho đến nay + +21 +00:01:26,850 --> 00:01:28,260 +trong phần này . + +22 +00:01:28,620 --> 00:01:35,520 +Hãy tiếp tục và tải xuống các tệp dự án bắt đầu cho Dự án Motivation Meme và giải nén nó, + +23 +00:01:35,520 --> 00:01:38,100 +sau đó mở nó bên trong vs mã. + +24 +00:01:38,310 --> 00:01:44,190 +Tôi đã tạo nhiệm vụ theo kiểu phân tích danh sách việc cần làm cho bạn. + +25 +00:01:44,220 --> 00:01:49,740 +Bây giờ, vấn đề chính là đó là trang web của bạn, đó là dự án của bạn và cũng như tất cả các dự án trong khóa học, + +26 +00:01:49,740 --> 00:01:52,920 +việc bạn muốn tạo nó như thế nào hoàn toàn phụ thuộc vào bạn. + +27 +00:01:52,920 --> 00:01:59,100 +Nhưng có một số lưu ý và điều quan trọng là bạn phải chạm vào tất cả các điểm học tập. + +28 +00:01:59,100 --> 00:02:06,690 +Vì vậy, sáu điểm này rất quan trọng và sau khi hoàn thành sáu điểm này, bạn có thể thay đổi trang web của mình, bạn có + +29 +00:02:06,690 --> 00:02:12,120 +thể xáo trộn nó theo cách bạn muốn, nhưng muốn đảm bảo rằng mọi thứ bạn đã học cho đến + +30 +00:02:12,120 --> 00:02:15,150 +nay đã được củng cố và tất cả đều có ý nghĩa. + +31 +00:02:15,570 --> 00:02:23,040 +Chúng ta sẽ sử dụng phông chữ tùy chỉnh từ Google có tên là The Libre Baskerville, trông hơi giống + +32 +00:02:23,040 --> 00:02:26,550 +với phông chữ tiêu đề chính tạo động lực. + +33 +00:02:26,910 --> 00:02:32,850 +Bạn nên thêm hình ảnh của riêng mình vào thư mục hình ảnh trong thư mục nội dung. + +34 +00:02:32,850 --> 00:02:38,760 +Tôi có một hình ảnh ví dụ ở đây cho bạn phòng trường hợp bạn muốn sử dụng nó, nhưng tôi khuyên bạn nên đưa + +35 +00:02:38,760 --> 00:02:41,190 +hình ảnh của riêng bạn vào để thực hành. + +36 +00:02:41,280 --> 00:02:50,280 +Và hình ảnh đó phải có đường viền màu trắng năm pixel và văn bản phải được căn giữa và bạn nên điều chỉnh lề để + +37 +00:02:50,280 --> 00:02:54,060 +hình ảnh và văn bản được căn giữa trên trang. + +38 +00:02:54,060 --> 00:03:01,050 +Bây giờ, đây sẽ là phần khó nhất vì bản thân việc căn giữa các phần tử bằng CSS là cả một môn khoa học, nhưng chúng + +39 +00:03:01,050 --> 00:03:03,450 +ta sẽ thực hiện nó một cách đơn giản. + +40 +00:03:03,480 --> 00:03:09,990 +Chúng ta sẽ căn giữa div theo chiều ngang bằng cách cho div đó có chiều rộng là 50% để chiếm 50% màn hình. + +41 +00:03:09,990 --> 00:03:13,620 +Và sau đó nếu bạn nghĩ về nó, chỉ còn lại 25% cho mỗi bên. + +42 +00:03:13,620 --> 00:03:19,770 +Vì vậy, nếu chúng ta còn lại 20% lợi nhuận trên div đó, thì nó sẽ đẩy nó vào trung tâm. + +43 +00:03:20,040 --> 00:03:25,680 +Ngoài ra, bạn có thể thấy hữu ích khi đặt hình ảnh có chiều rộng 100% để nó lấp đầy + +44 +00:03:25,680 --> 00:03:30,660 +toàn bộ div vùng chứa để bạn không phải căn giữa hình ảnh cùng với div. + +45 +00:03:30,690 --> 00:03:35,670 +Một số gợi ý này sẽ chỉ có ý nghĩa khi bạn bắt đầu viết mã cho nó, vì vậy đừng quá lo + +46 +00:03:35,670 --> 00:03:36,540 +lắng về nó. + +47 +00:03:36,540 --> 00:03:42,030 +Bây giờ tôi chỉ nhấn mạnh một số điểm cần làm để khi bạn bắt tay vào thực hiện, hãy chú ý hơn đến + +48 +00:03:42,030 --> 00:03:47,100 +những phần này và những mẹo hữu ích này, những điều mà bạn có thể sẽ cần bởi vì đặc biệt + +49 +00:03:47,130 --> 00:03:52,860 +là ở điểm thứ năm, nó khá là phức tạp. nhiệm vụ khó khăn và bạn sẽ mất một thời gian để tìm ra cách làm + +50 +00:03:52,860 --> 00:03:54,630 +cho nó trông như thế này. + +51 +00:03:55,380 --> 00:04:02,850 +Và nếu bạn muốn đẩy div xuống theo chiều dọc, thì tôi khuyên bạn chỉ cần thêm lề trên để đẩy nó + +52 +00:04:02,850 --> 00:04:04,770 +xuống một lượng pixel. + +53 +00:04:04,800 --> 00:04:10,590 +Nó không nhất thiết phải là điểm nhấn ở giữa trung tâm bởi vì như tôi đã nói, bản thân đó là cả một ngành khoa + +54 +00:04:10,590 --> 00:04:15,750 +học và chúng ta sẽ đề cập đến nó trong các phần tiếp theo, nhưng nó chỉ phức tạp hơn một chút. + +55 +00:04:15,750 --> 00:04:21,269 +Vì vậy, bây giờ chúng ta sẽ đánh giá dự án này bằng mắt thường, để có được thứ + +56 +00:04:21,269 --> 00:04:29,340 +gì đó trông giống như hình ảnh mục tiêu, tôi khuyên bạn nên đặt H1, đoạn văn và hình ảnh bên trong một div. + +57 +00:04:29,370 --> 00:04:36,300 +Bằng cách đó, bạn có thể căn giữa div trên màn hình và bạn sẽ không phải loay hoay với cả ba yếu tố và căn + +58 +00:04:36,300 --> 00:04:39,330 +giữa chúng, vốn đã là một nhiệm vụ đủ khó. + +59 +00:04:40,230 --> 00:04:49,710 +Cuối cùng, bạn sẽ sử dụng các kỹ năng đọc tài liệu dành cho nhà phát triển của mình và tự tìm hiểu về một thuộc tính có tên + +60 +00:04:49,710 --> 00:04:58,140 +là biến đổi văn bản và tìm ra cách làm cho H1 trông giống chữ hoa giống như những gì tôi có trong trang web mục + +61 +00:04:58,140 --> 00:04:59,640 +tiêu giải pháp. + +62 +00:05:00,130 --> 00:05:01,900 +Tất cả những yếu tố này đều có trên màn hình. + +63 +00:05:01,900 --> 00:05:07,660 +Chúng tôi có bảng trắng xung quanh hình ảnh, chúng tôi có nền đen, văn bản màu trắng, + +64 +00:05:07,660 --> 00:05:15,520 +phông chữ tùy chỉnh và H1 của chúng tôi hoàn toàn bằng chữ hoa mà chúng tôi không cần phải nhập chữ hoa. + +65 +00:05:15,520 --> 00:05:18,730 +Vì vậy, đó là nơi thuộc tính chuyển đổi văn bản xuất hiện. + +66 +00:05:18,730 --> 00:05:25,510 +Và lưu ý cách div toàn bộ nội dung này gần như ở đâu đó ở trung tâm, theo chiều ngang và chiều dọc, chỉ cần đánh giá + +67 +00:05:25,510 --> 00:05:26,800 +nó bằng mắt thường. + +68 +00:05:26,830 --> 00:05:33,100 +Nó không hoàn hảo, nhưng miễn là bạn tìm được quả bơ hoàn hảo, mọi thứ khác trong cuộc sống đều trở nên dễ dàng. + +69 +00:05:33,520 --> 00:05:40,420 +Tạm dừng video ngay bây giờ và hoàn thành dự án này và sau khi bạn hoàn thành, hãy quay lại và tôi sẽ cùng bạn + +70 +00:05:40,420 --> 00:05:41,980 +xem qua mã giải pháp. + +71 +00:05:44,810 --> 00:05:45,140 +Được rồi. + +72 +00:05:45,140 --> 00:05:47,290 +Vì vậy, hy vọng rằng đó không phải là quá khó khăn. + +73 +00:05:47,300 --> 00:05:56,570 +Nếu chúng ta xem giải pháp HTML, bạn có thể thấy rằng tôi đã hoàn thành tất cả các nhiệm vụ đó với một HTML + +74 +00:05:56,690 --> 00:06:01,010 +nhỏ và một tệp CSS nhỏ, vì vậy nó không quá khó. + +75 +00:06:01,160 --> 00:06:06,650 +Bây giờ, một số bước khá dễ hiểu, nhưng có một số điều tôi muốn đề cập + +76 +00:06:06,650 --> 00:06:07,750 +ngắn gọn. + +77 +00:06:07,760 --> 00:06:17,930 +Một là bạn sẽ cần các liên kết phông chữ Google trong phần đầu nếu bạn muốn có phông chữ tùy chỉnh đó + +78 +00:06:17,930 --> 00:06:19,520 +trên màn hình. + +79 +00:06:19,520 --> 00:06:21,530 +Và đây là phông chữ tùy chỉnh. + +80 +00:06:22,040 --> 00:06:29,600 +Ngoài ra, chúng tôi muốn có tất cả các yếu tố của chúng tôi bên trong một div để chúng tôi có thể tạo kiểu cho tất cả chúng cùng nhau. + +81 +00:06:29,600 --> 00:06:32,090 +Và điều đó khá quan trọng về mặt định vị. + +82 +00:06:32,090 --> 00:06:34,580 +Vì vậy, tôi đã tạo một lớp cho div. + +83 +00:06:35,180 --> 00:06:41,450 +Trong trường hợp này, bạn cũng có thể sử dụng ID, nhưng nếu bạn định mở rộng trang web này thì sử dụng + +84 +00:06:41,450 --> 00:06:42,920 +lớp sẽ an toàn hơn. + +85 +00:06:42,920 --> 00:06:46,380 +Vì vậy, bạn có thể sử dụng lại CSS trong tương lai. + +86 +00:06:46,740 --> 00:06:54,570 +Áp phích là phần ít nhiều được căn giữa và chúng tôi sử dụng thủ thuật đó bằng cách đặt chiều rộng và đặt lề của nó, sử dụng + +87 +00:06:54,570 --> 00:06:59,670 +tỷ lệ phần trăm để căn giữa nhiều hơn hoặc ít hơn ở giữa theo chiều ngang. + +88 +00:06:59,670 --> 00:07:05,580 +Và sau đó, tôi chỉ cần đặt lề trên cùng là 100 pixel, chỉ cần đánh giá nó bằng mắt để đặt nó ở đâu đó ở giữa. + +89 +00:07:06,030 --> 00:07:16,200 +Và tôi đã thêm phông chữ tùy chỉnh và đường viền vào hình ảnh và làm cho hình ảnh rộng 100% để nó có thể + +90 +00:07:16,200 --> 00:07:21,840 +vừa khít với div áp phích đó nếu bạn gặp bất kỳ sự cố nào. + +91 +00:07:21,840 --> 00:07:26,910 +Đây là lúc bạn có thể xem mã giải pháp và xem mã của chính mình và xem liệu có bất kỳ bản sửa lỗi + +92 +00:07:26,910 --> 00:07:28,860 +nào bạn muốn thực hiện hay không. + +93 +00:07:28,890 --> 00:07:35,850 +Và một khi bạn đã có, thì bạn cũng có thể sửa đổi trang web theo bất kỳ cách nào bạn muốn để cá nhân hóa trang web và biến nó thành + +94 +00:07:35,850 --> 00:07:36,720 +của riêng bạn. + diff --git a/part3/44 - Day 44 - Web Foundation - Intermediate CSS/external-links.txt b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..0150cff1f40fa8ed341270b380cf9933f75b49cd --- /dev/null +++ b/part3/44 - Day 44 - Web Foundation - Intermediate CSS/external-links.txt @@ -0,0 +1,9 @@ + +001 Named-Colours +https://developer.mozilla.org/en-US/docs/Web/CSS/named-color + +001 RGB-Colour-Mixer +https://www.csfieldguide.org.nz/en/interactives/rgb-mixer/ + +003 Pesticide +https://chrome.google.com/webstore/detail/pesticide-for-chrome/bakpbgckdnepkmkeaiomhmfcnejndkbi diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/001 Day 45 Goals what you will make by the end of the day.mp4 b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/001 Day 45 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..47178b2ed333dc5dbf83b4b81bd786f8c324ef75 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/001 Day 45 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef7ebaceb9ac159a7eedd22313a7ff234e91336530f518968b3ad78c0b8328df +size 33573825 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/001 Day 45 Goals what you will make by the end of the day_vi.srt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/001 Day 45 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8fdebc54987758ee06c5d7f2ee9f8fafc51c4c45 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/001 Day 45 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,160 @@ +1 +00:00:00,060 --> 00:00:00,750 +Xin chào các + +2 +00:00:00,750 --> 00:00:05,330 +bạn, chào mừng đến với Ngày thứ 45 của 100 Ngày viết mã. Bây giờ, hôm nay, chúng ta sẽ + +3 +00:00:05,330 --> 00:00:08,450 +quay lại với việc viết mã bằng Python và chúng + +4 +00:00:08,900 --> 00:00:12,080 +ta sẽ học cách quét dữ liệu trên web bằng cách + +5 +00:00:12,320 --> 00:00:14,810 +sử dụng một mô-đun có tên là BeautifulSoup. + +6 +00:00:15,770 --> 00:00:19,040 +Bây giờ chúng tôi đã làm việc với API được một thời gian và chúng + +7 +00:00:19,550 --> 00:00:20,600 +tôi biết rằng chúng + +8 +00:00:20,630 --> 00:00:25,630 +tôi có thể sử dụng API của trang web để truy cập vào dữ liệu của chúng hoặc để tương tác với + +9 +00:00:26,120 --> 00:00:27,860 +trang web bằng cách sử dụng mã. + +10 +00:00:28,520 --> 00:00:32,810 +Nhưng một số trang web không có API hoặc API của họ không cho phép chúng + +11 +00:00:32,810 --> 00:00:35,630 +tôi làm tất cả những điều chúng tôi muốn. + +12 +00:00:36,500 --> 00:00:40,460 +Vì vậy, đây là lúc chúng tôi bắt đầu nghĩ đến việc sử dụng tính năng + +13 +00:00:41,090 --> 00:00:44,540 +tìm kiếm trên web, nơi chúng tôi xem qua mã HTML cơ + +14 +00:00:44,570 --> 00:00:48,110 +bản của một trang web để nắm bắt thông tin mà chúng tôi muốn. + +15 +00:00:49,130 --> 00:00:52,880 +Vì vậy, mục đích của ngày hôm nay là học cách làm súp, + +16 +00:00:53,390 --> 00:00:57,410 +nhưng không phải loại súp này. Chúng tôi sẽ tạo ra BeautifulSoup. + +17 +00:00:57,980 --> 00:00:59,960 +Chính xác thì BeautifulSoup là gì? Đó là + +18 +00:00:59,990 --> 00:01:04,989 +một mô-đun giúp các nhà phát triển như chúng tôi hiểu được các trang web. + +19 +00:01:06,170 --> 00:01:09,770 +Chúng ta có thể nghĩ nhiều trang web giống như một món súp mì Ý, + +20 +00:01:10,190 --> 00:01:14,000 +thậm chí là một thứ tưởng chừng đơn giản như trang đầu của Google, khi bạn + +21 +00:01:14,270 --> 00:01:16,850 +nhấp chuột phải vào nó và xem nguồn trang, + +22 +00:01:17,120 --> 00:01:20,060 +bạn có thể thấy rằng nó phức tạp một cách khủng khiếp. + +23 +00:01:20,570 --> 00:01:25,100 +Và nếu bạn muốn hiểu trang web này và lấy ra các phần có + +24 +00:01:25,100 --> 00:01:25,933 +liên quan + +25 +00:01:26,270 --> 00:01:31,130 +của dữ liệu, thì bạn sẽ cần một trình phân tích cú pháp HTML như BeautifulSoup + +26 +00:01:31,130 --> 00:01:36,130 +để bạn có thể tìm và lấy ra các phần tử HTML mà bạn quan tâm + +27 +00:01:36,680 --> 00:01:39,140 +từ món súp này mã HTML lộn xộn. + +28 +00:01:39,770 --> 00:01:42,380 +Và một khi chúng ta đã thành thạo kỹ năng này, + +29 +00:01:42,500 --> 00:01:46,040 +thì chúng ta sẽ có thể lấy bất kỳ trang web nào, chẳng hạn như + +30 +00:01:46,070 --> 00:01:48,980 +100 bộ phim hay nhất mọi thời đại của Empire, đây là + +31 +00:01:49,220 --> 00:01:53,000 +một danh sách khổng lồ gồm hàng trăm bộ phim mà dường như ai cũng nên + +32 +00:01:53,000 --> 00:01:54,950 +xem tại một thời điểm nào đó. cuộc + +33 +00:01:55,400 --> 00:01:58,460 +sống của họ và chúng tôi có thể lấy ra các phần liên + +34 +00:01:58,700 --> 00:02:02,540 +quan đến chúng tôi, cụ thể là tiêu đề và thứ hạng của từng bộ phim và + +35 +00:02:02,840 --> 00:02:07,840 +chúng tôi sẽ sử dụng nó để tổng hợp danh sách các bộ phim mà chúng tôi phải xem để chúng tôi + +36 +00:02:07,880 --> 00:02:11,390 +có thể xem danh sách, gạch bỏ những bộ phim mà chúng ta đã xem, + +37 +00:02:11,720 --> 00:02:16,280 +rồi chọn ngẫu nhiên một bộ phim từ danh sách để chúng ta có thể xem tất cả hàng trăm + +38 +00:02:16,280 --> 00:02:19,550 +bộ phim mọi thời đại. Đó là mục tiêu. + +39 +00:02:19,760 --> 00:02:24,290 +Và khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và chúng ta sẽ + +40 +00:02:24,350 --> 00:02:25,850 +bắt đầu sử dụng BeautifulSoup. + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Beautiful-Soup-Documentation.url b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Beautiful-Soup-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..90ec343f1512e9594aa806f0a94241060808a940 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Beautiful-Soup-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.crummy.com/software/BeautifulSoup/bs4/doc/ \ No newline at end of file diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Parsing HTML and Making Soup.mp4 b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Parsing HTML and Making Soup.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c8874609537bc4e8fc74ed39f3eeb0a461f6e8ad --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Parsing HTML and Making Soup.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d07bdf2bfc71fe52e8a75cdeb9390e2ef24d0e92378bf43cd04a458912b88daa +size 96086757 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Parsing HTML and Making Soup_vi.srt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Parsing HTML and Making Soup_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..fdbb330170861ba7ed3ef9f620be3d06a67da749 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 Parsing HTML and Making Soup_vi.srt @@ -0,0 +1,564 @@ +1 +00:00:00,480 --> 00:00:01,230 +Trong bài học + +2 +00:00:01,230 --> 00:00:06,230 +này, chúng ta sẽ bắt đầu sử dụng một thư viện có tên là Beautiful Soup để chuyển một + +3 +00:00:06,930 --> 00:00:08,280 +tệp HTML. Phân tích cú pháp + +4 +00:00:08,280 --> 00:00:13,280 +tệp HTML là bước đầu tiên để trích xuất dữ liệu có trong một trang web. Để bắt đầu, điều đầu tiên tôi + +5 +00:00:13,620 --> 00:00:17,160 +muốn bạn làm là truy cập các tài nguyên của + +6 +00:00:17,160 --> 00:00:21,480 +khóa học và tải xuống dự án bắt đầu cho ngày hôm nay. + +7 +00:00:21,930 --> 00:00:26,010 +Nó được gọi là bs4-start và khi bạn đã giải nén nó và mở nó trong + +8 +00:00:26,010 --> 00:00:30,600 +PyCharm, thì tôi muốn bạn xem bên trong. Đầu tiên, chúng ta có một main + +9 +00:00:30,600 --> 00:00:31,800 +trống. tệp + +10 +00:00:31,830 --> 00:00:36,810 +py mà chúng tôi sẽ viết để sử dụng Beautiful Soup và trích xuất dữ + +11 +00:00:36,810 --> 00:00:41,670 +liệu mà chúng tôi muốn. Và dữ liệu sẽ đến từ trang web này. html. + +12 +00:00:42,270 --> 00:00:46,590 +Bây giờ, một điều thực sự thú vị về PyCharm là khi bạn có một tệp HTML, bạn luôn + +13 +00:00:46,620 --> 00:00:49,620 +có thể chỉ cần nhấp vào biểu tượng trình duyệt yêu thích của + +14 +00:00:50,160 --> 00:00:52,770 +mình ở đây và nó sẽ mở ra trang web. + +15 +00:00:53,430 --> 00:00:58,430 +Và bạn có thể thấy rằng đây là phiên bản đơn giản hóa của trang CV HTML mà chúng tôi + +16 +00:00:59,130 --> 00:01:02,190 +đã xây dựng vào ngày 41. Bây giờ, nếu + +17 +00:01:02,220 --> 00:01:05,550 +bạn đã bỏ qua ngày 41 đến ngày 44 + +18 +00:01:05,580 --> 00:01:08,070 +vì bạn đã biết HTML và + +19 +00:01:08,640 --> 00:01:11,190 +CSS, thì hãy đọc nhanh qua HTML. + +20 +00:01:11,520 --> 00:01:15,420 +Đó là một tài liệu rất đơn giản với một loạt các thẻ + +21 +00:01:15,840 --> 00:01:18,030 +HTML khác nhau, các thuộc tính như + +22 +00:01:18,570 --> 00:01:23,190 +lớp và ID, và cả một danh sách. Tôi đã giữ điều này đơn giản nhất có thể + +23 +00:01:23,220 --> 00:01:25,560 +để chúng tôi dễ dàng thực hiện nó khi chúng + +24 +00:01:25,890 --> 00:01:27,600 +tôi cố gắng nắm bắt mọi thứ + +25 +00:01:27,630 --> 00:01:30,840 +bằng cách sử dụng Beautiful Soup. Trong các tài nguyên của + +26 +00:01:30,900 --> 00:01:34,380 +khóa học, tôi cũng có một liên kết đến tài liệu Beautiful Soup. + +27 +00:01:34,860 --> 00:01:39,120 +Vì vậy, đây là nơi bạn có thể tìm hiểu mọi thứ mà + +28 +00:01:39,120 --> 00:01:43,920 +bạn có thể làm với Beautiful Soup. Nhưng tôi muốn hướng dẫn bạn một số thành phần thường được sử dụng nhất. + +29 +00:01:44,610 --> 00:01:45,360 +Như họ + +30 +00:01:45,360 --> 00:01:50,360 +nói, Beautiful Soup là một thư viện Python để lấy dữ liệu ra khỏi các tệp HTML và XML. + +31 +00:01:51,420 --> 00:01:56,190 +Vì vậy, HTML và XML đều là ngôn ngữ cấu trúc và chúng chịu trách nhiệm cấu + +32 +00:01:56,190 --> 00:02:00,960 +trúc dữ liệu như dữ liệu trong một trang web bằng cách sử dụng các thẻ này. + +33 +00:02:01,680 --> 00:02:03,330 +Và điều tuyệt vời về + +34 +00:02:03,380 --> 00:02:07,850 +Beautiful Soup 1: nó siêu dễ sử dụng và nó có thể giúp bạn tiết kiệm hàng + +35 +00:02:07,910 --> 00:02:12,910 +giờ hoặc 0: ngày làm việc để nắm bắt dữ liệu bạn muốn từ một trang web cụ thể. + +36 +00:02:13,520 --> 00:02:18,410 +Và bạn có thể thấy tài liệu cũng đã được dịch bởi những người dùng tốt bụng sang + +37 +00:02:18,440 --> 00:02:21,320 +một số ngôn ngữ khác. Vì vậy, nếu bạn thấy nó dễ dàng hơn, thì những ngôn + +38 +00:02:21,590 --> 00:02:24,170 +ngữ này cũng có thể giúp ích cho bạn. Bây giờ, điều đầu + +39 +00:02:24,170 --> 00:02:29,170 +tiên tôi phải làm ở đây trong chính của tôi. py là để thực sự nắm giữ + +40 +00:02:30,290 --> 00:02:32,270 +tệp cụ thể này. + +41 +00:02:32,840 --> 00:02:35,600 +Bây giờ bạn có thể nhớ từ các bài học + +42 +00:02:35,660 --> 00:02:38,240 +trước, cách chúng ta mở một tệp bằng Python. + +43 +00:02:38,900 --> 00:02:43,900 +Vì vậy, hãy suy nghĩ nhanh và xem liệu bạn có thể tìm ra cách giữ nội dung + +44 +00:02:44,330 --> 00:02:49,330 +trong tệp HTML này dưới dạng một chuỗi hoặc dưới dạng một đoạn văn bản hay không. + +45 +00:02:50,060 --> 00:02:53,840 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. Chỉ là một gợi ý, + +46 +00:02:53,960 --> 00:02:57,380 +bạn có thể cần từ khóa với và từ khóa + +47 +00:02:57,380 --> 00:02:58,330 +1: mở. + +48 +00:03:01,030 --> 00:03:04,660 +0: Được rồi. Vì vậy, cách chúng tôi làm điều này, như chúng tôi nói với + +49 +00:03:05,020 --> 00:03:09,010 +mở, và sau đó chúng tôi cung cấp tên của tệp, đó là trang web. html. + +50 +00:03:09,520 --> 00:03:13,540 +Và chúng ta có thể mở nó dưới dạng tên bí danh mà chúng ta sẽ gọi là tệp, và bây giờ chúng ta có quyền + +51 +00:03:14,140 --> 00:03:18,580 +truy cập vào tệp này và chúng ta có thể nói là tệp. đọc. + +52 +00:03:19,240 --> 00:03:21,010 +Bây giờ, khi chúng ta + +53 +00:03:21,040 --> 00:03:24,730 +đã đọc xong tệp này, chúng ta có thể lưu nó vào một + +54 +00:03:24,730 --> 00:03:29,590 +biến mà chúng ta sẽ gọi là nội dung. Và khi chúng ta đã nắm được những nội + +55 +00:03:29,770 --> 00:03:32,740 +dung này, thì chúng ta có thể bắt đầu sử dụng Beautiful Soup. + +56 +00:03:33,460 --> 00:03:36,940 +Vì vậy, như mọi khi, chúng tôi luôn bắt đầu với việc + +57 +00:03:37,120 --> 00:03:42,120 +nhập, vì vậy tên của thư viện mà chúng tôi sẽ cài đặt được gọi là bs4 + +58 +00:03:43,600 --> 00:03:45,850 +và đây là Beautiful Soup phiên + +59 +00:03:45,970 --> 00:03:49,210 +bản bốn, hiện là phiên bản mới nhất của Beautiful Soup. + +60 +00:03:49,870 --> 00:03:53,620 +Và từ gói cụ thể này, chúng ta muốn nhập lớp + +61 +00:03:53,620 --> 00:03:57,130 +có tên là Beautiful Soup. Bây giờ, nếu bạn đã + +62 +00:03:57,160 --> 00:04:00,460 +tải xuống dự án này từ các tài nguyên của + +63 +00:04:00,820 --> 00:04:05,820 +khóa học, bạn sẽ thấy rằng không có lỗi gạch dưới dòng này vì bs4 + +64 +00:04:06,430 --> 00:04:09,610 +đã được cài đặt. Nếu bạn thấy một số + +65 +00:04:09,670 --> 00:04:13,660 +gạch dưới nguệch ngoạc, chỉ cần nhấp vào bóng đèn màu đỏ và cài đặt + +66 +00:04:13,750 --> 00:04:17,230 +mô-đun cần thiết có tên là bs4. Bây giờ, khi chúng ta + +67 +00:04:17,230 --> 00:04:20,380 +đã nắm được lớp BeautifulSoup của mình thì chúng ta + +68 +00:04:20,500 --> 00:04:24,220 +đã sẵn sàng để nấu súp. Để nấu súp, chúng tôi + +69 +00:04:24,280 --> 00:04:29,280 +sử dụng lớp BeautifulSoup của mình và chúng tôi tạo một đối tượng mới từ lớp + +70 +00:04:29,770 --> 00:04:34,360 +đó và chúng tôi truyền vào một chuỗi. Vì vậy, đây là đánh dấu, + +71 +00:04:34,720 --> 00:04:39,460 +và đó chính là M mà bạn tìm thấy trong HTML và XML. + +72 +00:04:39,760 --> 00:04:44,760 +Đó là ngôn ngữ đánh dấu siêu văn bản và ngôn ngữ đánh dấu có thể mở rộng. + +73 +00:04:47,170 --> 00:04:51,580 +Vì vậy, đánh dấu về cơ bản đề cập đến tất cả những điều này. + +74 +00:04:52,570 --> 00:04:55,480 +Chúng tôi đã nắm được thông qua nội dung này vì vậy chúng + +75 +00:04:55,720 --> 00:04:57,520 +ta hãy tiếp tục và chuyển nó vào. + +76 +00:04:58,300 --> 00:05:02,680 +Vì vậy, bây giờ chúng tôi đã chỉ định những gì chúng tôi muốn sử dụng để tạo súp của mình, + +77 +00:05:03,370 --> 00:05:06,340 +điều tiếp theo chúng tôi phải cung cấp là trình phân tích cú pháp. + +78 +00:05:06,850 --> 00:05:09,370 +Điều này sẽ giúp mô-đun BeautifulSoup + +79 +00:05:09,430 --> 00:05:14,430 +hiểu nội dung cụ thể này được cấu trúc bằng ngôn ngữ nào. + +80 +00:05:15,370 --> 00:05:18,490 +Như họ đã đề cập, nó có thể phân tích cú pháp HTML và + +81 +00:05:18,700 --> 00:05:22,660 +XML, vì vậy chúng tôi phải cho nó biết loại tài liệu cụ thể mà chúng tôi có. + +82 +00:05:23,260 --> 00:05:26,920 +Và cách dễ nhất là sử dụng html + +83 +00:05:27,040 --> 00:05:28,420 +Python. trình phân tích cú pháp. + +84 +00:05:29,650 --> 00:05:34,030 +Vì vậy, sau khi chúng ta đã phân tích cú pháp văn bản mà chúng ta muốn biến thành súp, chúng + +85 +00:05:34,600 --> 00:05:39,600 +ta sẽ thêm trình phân tích cú pháp dưới dạng html. trình phân tích cú pháp. + +86 +00:05:41,740 --> 00:05:45,940 +Và điều này sẽ giúp Canh Đẹp hiểu được những nội dung này. + +87 +00:05:47,200 --> 00:05:50,590 +Bây giờ, tùy thuộc vào trang web mà bạn đang làm việc, đôi khi, bạn có + +88 +00:05:50,590 --> 00:05:55,390 +thể cần sử dụng trình phân tích cú pháp của lxml. Và làm điều đó, tất cả + +89 +00:05:55,480 --> 00:05:59,990 +những gì bạn phải làm là nhập lxml và sau đó + +90 +00:06:00,290 --> 00:06:05,290 +cài đặt gói cụ thể này, và ở đây trong một chuỗi thay + +91 +00:06:06,290 --> 00:06:10,730 +vì sử dụng html. phân tích cú pháp, bạn có thể sử dụng lxml. + +92 +00:06:11,450 --> 00:06:16,400 +Và về cơ bản đây chỉ là một cách khác để phân tích cú pháp hoặc hiểu nội dung + +93 +00:06:16,400 --> 00:06:18,380 +mà bạn đang chuyển cho Beautiful Soup. + +94 +00:06:18,890 --> 00:06:23,750 +Và tôi thấy rằng với một số trang web nhất định thì html. trình phân tích cú pháp có thể không hoạt động và + +95 +00:06:23,750 --> 00:06:26,990 +bạn có thể gặp lỗi cho bạn biết điều gì đó về trình phân + +96 +00:06:26,990 --> 00:06:31,070 +tích cú pháp của bạn không hoạt động. Vì vậy, bạn có thể cân nhắc sử dụng lxml để thay thế. + +97 +00:06:32,450 --> 00:06:36,710 +Vì vậy, một dòng mã này về cơ bản hoàn thành quá trình phân tích cú pháp của chúng ta. + +98 +00:06:37,280 --> 00:06:42,280 +Và món súp này hiện là một đối tượng cho phép chúng ta truy cập vào các phần khác nhau của + +99 +00:06:43,550 --> 00:06:47,270 +trang web, nhưng sử dụng mã Python. Ví dụ: nếu tôi muốn + +100 +00:06:47,270 --> 00:06:51,470 +thẻ tiêu đề này ra khỏi toàn bộ trang web này, tất cả những + +101 +00:06:51,770 --> 00:06:55,610 +gì tôi phải làm là nói súp. Tiêu đề. + +102 +00:06:57,680 --> 00:07:01,760 +Và bây giờ nếu tôi in món súp này. tiêu đề, bạn có + +103 +00:07:02,360 --> 00:07:07,360 +thể thấy rằng chúng tôi sẽ in toàn bộ thẻ tiêu đề. + +104 +00:07:09,710 --> 00:07:14,710 +Khi Beautiful Soup đã hiểu trang web này bằng cách phân tích cú pháp HTML, bây giờ + +105 +00:07:17,300 --> 00:07:19,460 +chúng ta có thể khai thác đối + +106 +00:07:19,520 --> 00:07:23,510 +tượng đó là mã HTML như thể nó là một đối tượng Python. + +107 +00:07:23,840 --> 00:07:25,730 +Vì vậy, chúng ta có thể khai thác tiêu + +108 +00:07:26,000 --> 00:07:30,200 +đề, nhưng chúng ta có thể tìm hiểu sâu hơn nữa. Thay vì chỉ khai thác vào tiêu đề, chúng + +109 +00:07:30,500 --> 00:07:35,500 +ta cũng có thể nắm bắt những thứ khác như tiêu đề. tên, và điều này sẽ cung + +110 +00:07:36,200 --> 00:07:41,200 +cấp cho chúng ta tên của thẻ tiêu đề cụ thể đó. + +111 +00:07:41,960 --> 00:07:44,900 +Vì vậy, hãy nhớ điều này đã cung cấp cho chúng tôi + +112 +00:07:44,930 --> 00:07:49,930 +thẻ tiêu đề, vì vậy tất cả những điều này, và giai đoạn tiếp theo này đi sâu hơn vào tên của + +113 +00:07:50,900 --> 00:07:54,200 +thẻ này, bạn sẽ thấy rằng nó cung cấp cho chúng tôi tiêu đề. + +114 +00:07:54,710 --> 00:07:57,590 +Vì vậy, tên của thẻ tiêu đề này được gọi là tiêu đề + +115 +00:07:58,250 --> 00:08:01,460 +và chúng ta cũng có thể nắm được chuỗi được chứa trong thẻ tiêu đề + +116 +00:08:01,700 --> 00:08:06,700 +bằng cách sử dụng đơn giản. Tiêu đề. sợi dây. + +117 +00:08:07,280 --> 00:08:11,840 +Và bạn có thể thấy đây là chuỗi thực sự bên trong thẻ tiêu đề đó. + +118 +00:08:13,280 --> 00:08:16,130 +Nếu chúng ta nghĩ về nó, toàn bộ đối + +119 +00:08:16,190 --> 00:08:19,520 +tượng súp này hiện đại diện cho mã HTML của chúng ta. + +120 +00:08:20,030 --> 00:08:24,440 +Vì vậy, tôi cũng có thể thực sự chỉ cần in ra toàn bộ đối tượng súp. + +121 +00:08:24,950 --> 00:08:29,180 +Và bạn có thể thấy rằng đây về cơ bản chỉ là tất cả HTML. + +122 +00:08:29,990 --> 00:08:34,100 +Và nếu bạn muốn, thậm chí còn có một phương pháp gọi là quy + +123 +00:08:34,460 --> 00:08:37,820 +trình xác minh sẽ thụt lề mã HTML súp của bạn. + +124 +00:08:38,120 --> 00:08:43,120 +Vì vậy, bây giờ, hãy so sánh điều này khi mọi thứ đều nằm trên một dòng, với phiên bản đã được + +125 +00:08:43,909 --> 00:08:47,900 +kiểm chứng này, nơi mọi thứ đều được thụt vào đúng cách và dễ đọc hơn. + +126 +00:08:49,130 --> 00:08:53,780 +Ngoài việc lấy thẻ tiêu đề, chúng ta cũng có + +127 +00:08:53,810 --> 00:08:56,700 +thể nắm giữ, ví dụ: thẻ. + +128 +00:08:57,060 --> 00:09:02,060 +Vì vậy, điều này sẽ cung cấp cho chúng tôi thẻ liên kết đầu tiên mà nó tìm thấy trong trang web + +129 +00:09:02,700 --> 00:09:05,220 +của chúng tôi, tình cờ là thẻ này ngay tại đây. + +130 +00:09:06,180 --> 00:09:11,180 +Và chúng ta có thể hoán đổi điều đó bằng chữ li đầu tiên hoặc đoạn văn đầu tiên. + +131 +00:09:14,910 --> 00:09:18,450 +Về cơ bản những gì chúng tôi đang làm với món súp + +132 +00:09:18,480 --> 00:09:23,370 +đẹp mắt là chúng tôi chỉ đi sâu vào tệp HTML này, tìm các thẻ HTML + +133 +00:09:23,850 --> 00:09:26,040 +mà chúng tôi quan tâm và + +134 +00:09:26,100 --> 00:09:30,660 +sau đó nắm được tên của thẻ hoặc văn bản thực tế của thẻ . + +135 +00:09:31,470 --> 00:09:36,470 +Nhưng điều gì sẽ xảy ra nếu chúng ta muốn tất cả các đoạn văn hoặc tất cả các thẻ liên kết trong trang web + +136 +00:09:37,380 --> 00:09:41,880 +của mình, chúng ta sẽ làm điều đó như thế nào? Trong bài học tiếp theo, chúng ta sẽ + +137 +00:09:42,030 --> 00:09:47,030 +đi sâu hơn vào việc tìm kiếm trên các trang web cho tất cả các thành phần mà chúng + +138 +00:09:47,190 --> 00:09:49,500 +ta đang tìm kiếm. Ví dụ: tất cả + +139 +00:09:49,740 --> 00:09:52,410 +các thẻ P hoặc tất cả các thẻ liên kết. + +140 +00:09:52,770 --> 00:09:57,770 +Và chúng ta sẽ xem cách chúng ta có thể tinh chỉnh tìm kiếm của mình và chỉ + +141 +00:09:58,140 --> 00:10:02,610 +định chính xác những gì chúng ta muốn. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 bs4-start.zip b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 bs4-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..26d29329baea30c14fbc29c8145947103c361a6f --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/002 bs4-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aabc8a1d134a4ddbe9be670c468a7f6905418b5f65b685f6a6d85f2303c27533 +size 668 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/003 Finding and Selecting Particular Elements with BeautifulSoup.mp4 b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/003 Finding and Selecting Particular Elements with BeautifulSoup.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1125d8f34a15228e4f07425e6a04d3915368ee82 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/003 Finding and Selecting Particular Elements with BeautifulSoup.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92aec4b9151087a2081ec5bcf058e3eed5079b1a9916e43c606a937e0ed6a746 +size 125334323 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/003 Finding and Selecting Particular Elements with BeautifulSoup_vi.srt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/003 Finding and Selecting Particular Elements with BeautifulSoup_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4f5701716c08515044806911f1bf3fa52b2dfb29 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/003 Finding and Selecting Particular Elements with BeautifulSoup_vi.srt @@ -0,0 +1,668 @@ +1 +00:00:00,210 --> 00:00:02,190 +Bây giờ có hai điều bạn sẽ nhận thấy ở đây. + +2 +00:00:02,580 --> 00:00:06,900 +Một là chúng tôi chỉ nắm giữ thẻ đầu tiên, ví dụ, thẻ + +3 +00:00:06,900 --> 00:00:11,730 +p hoặc một thẻ, nhưng chúng tôi không nắm giữ bất kỳ thẻ nào khác. + +4 +00:00:12,120 --> 00:00:14,970 +Vì vậy, điều gì sẽ xảy ra nếu chúng ta muốn lấy tất cả các thẻ liên kết, tất + +5 +00:00:15,000 --> 00:00:18,420 +cả các đoạn văn trong trang web của chúng ta? Vậy thì chúng ta + +6 +00:00:18,450 --> 00:00:23,450 +có thể sử dụng một hàm đi kèm với Beautiful Soup có tên là find_all. + +7 +00:00:24,570 --> 00:00:27,990 +Đây có lẽ là một trong những phương pháp được sử dụng phổ biến nhất khi nói + +8 +00:00:27,990 --> 00:00:28,823 +đến Beautiful Soup + +9 +00:00:29,730 --> 00:00:34,730 +Và ở đây chúng ta có thể tìm kiếm bằng rất nhiều thứ. Chúng tôi có thể tìm kiếm theo + +10 +00:00:34,950 --> 00:00:35,783 +tên, vì + +11 +00:00:35,790 --> 00:00:40,790 +vậy chúng tôi có thể nói tìm tất cả các thẻ có tên thẻ bằng a. + +12 +00:00:43,080 --> 00:00:46,050 +Vì vậy, điều này sẽ cung cấp cho chúng ta tất cả các thẻ liên + +13 +00:00:46,190 --> 00:00:47,023 +kết, 1: phải không? + +14 +00:00:49,220 --> 00:00:50,840 +0: Và nếu tôi in nó, bạn + +15 +00:00:51,140 --> 00:00:56,140 +có thể thấy rằng nó cung cấp cho chúng tôi một danh sách và nó cung cấp cho chúng tôi cả ba liên kết + +16 +00:00:57,650 --> 00:00:59,450 +tồn tại trong trang web của chúng tôi. + +17 +00:01:00,350 --> 00:01:03,290 +Và nếu tôi thay đổi điều này thành p chẳng hạn, thì nó + +18 +00:01:03,470 --> 00:01:08,470 +sẽ tìm thấy tất cả các đoạn văn và chúng tôi có thể thay đổi điều này về cơ bản thành bất kỳ + +19 +00:01:09,650 --> 00:01:13,850 +tên thẻ nào trong trang web của chúng tôi. Bây giờ, nếu chúng ta muốn + +20 +00:01:13,850 --> 00:01:16,280 +tìm hiểu sâu hơn một chút thì sao? + +21 +00:01:16,820 --> 00:01:19,190 +Chúng tôi đã có danh sách tất cả các thẻ + +22 +00:01:19,490 --> 00:01:23,870 +liên kết, nhưng điều gì sẽ xảy ra nếu tôi chỉ muốn văn bản trong thẻ liên kết đó? + +23 +00:01:23,870 --> 00:01:28,730 +Vì vậy, tôi chỉ muốn phần này. Chà, làm thế nào tôi nắm được tất cả chúng? Đầu tiên, chúng + +24 +00:01:28,760 --> 00:01:31,730 +ta có thể cần một vòng lặp for. + +25 +00:01:32,030 --> 00:01:37,030 +Vì vậy, chúng tôi có thể nói cho thẻ trong tất cả các thẻ liên kết và chúng tôi có thể lặp lại tất cả các thẻ + +26 +00:01:39,560 --> 00:01:44,560 +liên kết đó và sử dụng một phương pháp được gọi là thẻ. getText. + +27 +00:01:46,220 --> 00:01:49,040 +Và bây giờ nếu tôi tiếp tục và in cái này, + +28 +00:01:49,130 --> 00:01:54,130 +bạn có thể thấy rằng về cơ bản nó sẽ in ra cả ba văn bản nằm trong cả ba + +29 +00:01:55,490 --> 00:01:59,810 +thẻ liên kết mà nó tìm thấy. Bây giờ, điều gì sẽ + +30 +00:01:59,810 --> 00:02:02,420 +xảy ra nếu tôi không muốn nhận + +31 +00:02:02,510 --> 00:02:07,340 +văn bản, mà thay vào đó tôi muốn nắm giữ href thực tế, + +32 +00:02:07,370 --> 00:02:11,870 +vì vậy liên kết, phải không? Vì vậy, hãy in lại all_anchor_tags của chúng ta. + +33 +00:02:12,650 --> 00:02:13,483 +1: Được rồi. + +34 +00:02:15,800 --> 00:02:20,150 +0: Và bạn có thể thấy rằng có một thuộc tính + +35 +00:02:20,420 --> 00:02:25,190 +gọi là href lưu trữ liên kết thực tế mà thẻ chuyển đến. + +36 +00:02:25,700 --> 00:02:30,200 +Vì vậy, rất thường xuyên, bạn sẽ muốn cô lập liên kết đó. Vậy bạn sẽ làm điều đó như thế nào? + +37 +00:02:30,800 --> 00:02:31,280 +Chà, + +38 +00:02:31,280 --> 00:02:36,280 +bạn có thể nhấn vào từng thẻ và có thể sử dụng một phương pháp khác được gọi là get. + +39 +00:02:38,390 --> 00:02:42,140 +Và ở đây bạn có thể nhận giá trị của bất kỳ thuộc tính nào. + +40 +00:02:42,590 --> 00:02:46,250 +Vì vậy, nếu tôi chuyển vào href ở đây và tôi in nó, thì nó + +41 +00:02:46,940 --> 00:02:51,200 +sẽ cung cấp cho tôi tất cả các liên kết và nó sẽ không cung cấp cho tôi + +42 +00:02:51,200 --> 00:02:54,080 +bất kỳ thứ gì khác. Về cơ bản, nó + +43 +00:02:54,200 --> 00:02:59,090 +chỉ loại bỏ liên kết mà tôi quan tâm. Tương tự như vậy, khi chúng ta sử dụng find_all, + +44 +00:02:59,920 --> 00:03:04,920 +chúng ta cũng có thể tìm thấy mọi thứ theo thuộc tính của chúng, vì vậy ngay khi chúng ta + +45 +00:03:05,410 --> 00:03:08,950 +tìm kiếm theo tên thẻ, nhưng chúng ta cũng có thể nắm bắt mọi + +46 +00:03:09,040 --> 00:03:11,860 +thứ theo tên thuộc tính. Ví dụ, nếu tôi + +47 +00:03:11,860 --> 00:03:16,780 +muốn nắm giữ mặt hàng này, tất nhiên tôi có thể tìm kiếm h1. + +48 +00:03:17,080 --> 00:03:19,660 +Nhưng nếu tôi có nhiều h1s thì sao? Vâng, sau đó tôi + +49 +00:03:19,660 --> 00:03:24,430 +có thể cô lập nó bằng ID này. Vì vậy, tôi có + +50 +00:03:27,210 --> 00:03:27,990 +thể + +51 +00:03:27,990 --> 00:03:32,990 +nói, 1: soup 0 :. find_all sẽ cung cấp cho tôi danh sách tất cả các mục + +52 +00:03:34,680 --> 00:03:35,513 +phù hợp với + +53 +00:03:35,760 --> 00:03:40,760 +truy vấn tìm kiếm hoặc tôi có thể sử dụng phương pháp find để chỉ tìm mục đầu tiên phù hợp với truy vấn. + +54 +00:03:42,900 --> 00:03:45,450 +Trong trường hợp của tôi, chỉ có một thứ tôi đang tìm kiếm. + +55 +00:03:45,690 --> 00:03:50,610 +Và thẻ cụ thể này có tên + +56 +00:03:51,270 --> 00:03:56,270 +là h1 nhưng nó cũng có tên ID. + +57 +00:03:58,440 --> 00:03:59,280 +Như bạn + +58 +00:03:59,520 --> 00:04:03,510 +có thể thấy, ID này bằng tên và nó cũng là một thẻ h1. + +59 +00:04:04,110 --> 00:04:07,290 +Vì vậy, điều này sẽ cung cấp cho chúng ta yếu tố cụ thể đó. + +60 +00:04:07,380 --> 00:04:12,380 +Vì vậy, nếu tôi in ra tiêu đề này và chúng ta hãy bình luận mọi thứ + +61 +00:04:16,920 --> 00:04:21,600 +khác, thì bây giờ bạn có thể thấy tôi vừa cô lập một h1 đó. + +62 +00:04:22,260 --> 00:04:25,830 +Và điều này cũng có nghĩa là nếu tôi chỉ thêm một h1 khác ở + +63 +00:04:26,130 --> 00:04:26,963 +đây, 1: ... + +64 +00:04:29,220 --> 00:04:31,080 +0: và tôi chạy lại + +65 +00:04:31,350 --> 00:04:36,150 +mã này, mã này sẽ không hiển thị vì tôi đã nói nó phải có tên + +66 +00:04:36,570 --> 00:04:40,020 +là h1 và ID khớp với giá trị cụ thể này. + +67 +00:04:41,670 --> 00:04:42,900 +Bây giờ, như bạn + +68 +00:04:42,900 --> 00:04:47,040 +có thể tưởng tượng, bạn cũng có thể làm điều tương tự với thuộc tính class. + +69 +00:04:47,640 --> 00:04:49,110 +Vì vậy, chúng ta có thể nói, + +70 +00:04:52,920 --> 00:04:53,430 +1: ... + +71 +00:04:53,430 --> 00:04:56,520 +0: súp. tìm lại bởi vì tôi chỉ đang tìm một. + +72 +00:04:57,240 --> 00:05:01,290 +Và thứ mà tôi đang tìm kiếm có một + +73 +00:05:01,680 --> 00:05:04,290 +cái tên là h3 1: + +74 +00:05:04,380 --> 00:05:05,213 +... + +75 +00:05:07,140 --> 00:05:12,140 +0: nhưng nó cũng có một lớp bằng với tiêu đề. + +76 +00:05:13,200 --> 00:05:17,220 +Vì vậy, tôi sẽ sao chép nó và dán nó vào đây. Bây giờ, một trong những điều + +77 +00:05:17,250 --> 00:05:22,250 +bạn sẽ nhận được ở đây là lỗi vì từ khóa lớp này là một + +78 +00:05:23,700 --> 00:05:25,710 +từ khóa dành riêng trong Python. + +79 +00:05:26,190 --> 00:05:29,100 +Và điều đó có nghĩa là nó là một từ đặc biệt chỉ + +80 +00:05:29,370 --> 00:05:34,170 +có thể được sử dụng để tạo các lớp. Bây giờ, trong trường hợp này, chúng tôi chắc chắn không tạo + +81 +00:05:34,200 --> 00:05:38,100 +một lớp hoặc một đối tượng ở đây. Thay vào đó, chúng tôi đang cố + +82 +00:05:38,100 --> 00:05:39,990 +gắng khai thác một thuộc tính. + +83 +00:05:40,470 --> 00:05:43,410 +Vì vậy, để không xung đột với từ + +84 +00:05:43,680 --> 00:05:46,980 +khóa class, thuộc tính này thực sự được gọi là class_re. + +85 +00:05:48,330 --> 00:05:52,920 +Bây giờ nó sẽ tìm kiếm tất cả các h3 trong đó thuộc tính lớp + +86 +00:05:52,920 --> 00:05:54,360 +bằng với tiêu đề. + +87 +00:05:54,970 --> 00:05:59,970 +Hãy tiếp tục và in section_heading này và bạn sẽ thấy bây giờ chúng ta sẽ nhận được + +88 +00:06:01,220 --> 00:06:05,810 +h3 đó với lớp tiêu đề hiển thị. Và một lần nữa, nếu chúng + +89 +00:06:05,810 --> 00:06:09,080 +ta muốn nắm giữ văn bản có trong h3 + +90 +00:06:09,110 --> 00:06:14,060 +đó, thì chúng ta chỉ cần sử dụng phương thức getText hoặc nếu chúng + +91 +00:06:14,600 --> 00:06:19,490 +ta muốn biết tên của thẻ cụ thể đó, thì chúng ta có thể + +92 +00:06:19,550 --> 00:06:21,080 +nói. Tên. + +93 +00:06:23,920 --> 00:06:24,370 +1: Được rồi. + +94 +00:06:24,370 --> 00:06:29,230 +0: Và nếu chúng ta muốn nắm giữ giá trị của một thuộc tính, + +95 +00:06:29,260 --> 00:06:32,680 +ví dụ, lấy giá trị lớp, thì chúng ta có + +96 +00:06:32,830 --> 00:06:36,430 +thể làm như thế này. Bây giờ, mặc dù đó là + +97 +00:06:36,460 --> 00:06:41,460 +một cách khá tốt để chọn các phần tử từ toàn bộ trang web, nhưng vẫn có một số trường hợp + +98 +00:06:42,130 --> 00:06:46,360 +nhất định mà nó có thể không hoạt động. Ví dụ, tại thời + +99 +00:06:46,990 --> 00:06:51,100 +điểm này, chúng tôi có ba thẻ liên kết. + +100 +00:06:51,640 --> 00:06:55,300 +Nếu chúng tôi muốn nắm giữ một thẻ liên kết cụ thể, + +101 +00:06:55,540 --> 00:06:59,950 +giả sử chúng tôi muốn thẻ liên kết này, sau đó chúng tôi phải làm gì? + +102 +00:07:00,340 --> 00:07:05,640 +Chà, sau đó chúng ta có thể chỉ cần tìm tất cả các thẻ neo và sau đó + +103 +00:07:06,820 --> 00:07:09,280 +tìm thẻ đầu tiên. Nhưng như bạn có + +104 +00:07:09,310 --> 00:07:12,400 +thể tưởng tượng, đây là một trang web cực kỳ đơn giản. + +105 +00:07:12,700 --> 00:07:15,490 +Hầu hết các trang web sẽ có hàng nghìn, nếu không muốn + +106 +00:07:15,520 --> 00:07:19,000 +nói là hàng chục nghìn liên kết. Trong tình huống đó, thật khó + +107 +00:07:19,180 --> 00:07:24,180 +để biết bạn muốn liên kết cụ thể nào từ danh sách tất cả các thẻ + +108 +00:07:24,880 --> 00:07:25,713 +liên kết. + +109 +00:07:26,320 --> 00:07:31,320 +Vì vậy, chúng tôi muốn có một cách mà chúng tôi có thể đi sâu vào một phần tử cụ thể. + +110 +00:07:32,440 --> 00:07:35,770 +Có gì độc đáo về thẻ liên kết cụ thể này? Chà, nó nằm bên + +111 +00:07:35,800 --> 00:07:40,800 +trong một thẻ mạnh và nó nằm bên trong một thẻ nhấn mạnh và nó + +112 +00:07:41,830 --> 00:07:46,390 +nằm bên trong một thẻ đoạn văn, chính nó nằm trong phần nội dung. + +113 +00:07:47,080 --> 00:07:52,080 +Chúng tôi có thể thu hẹp nó bằng cách sử dụng các bước sau. Trong trang web hiện tại của chúng + +114 +00:07:52,540 --> 00:07:57,340 +tôi, không nơi nào khác có thẻ liên kết nằm bên trong thẻ đoạn văn. + +115 +00:07:57,940 --> 00:08:02,940 +Và bạn sẽ nhớ từ các bài học trước của chúng tôi về CSS rằng bạn + +116 +00:08:03,670 --> 00:08:08,670 +có thể sử dụng các bộ chọn CSS để thu hẹp một phần tử cụ thể + +117 +00:08:09,580 --> 00:08:13,600 +nhằm chỉ định kiểu của nó. Và nếu chúng ta viết mã + +118 +00:08:15,370 --> 00:08:17,680 +CSS, thì nó sẽ giống như thế này. + +119 +00:08:19,000 --> 00:08:24,000 +Vì vậy, trước tiên chúng tôi sẽ chọn đoạn văn và sau đó chúng tôi sẽ + +120 +00:08:24,670 --> 00:08:29,670 +chọn thẻ liên kết và sau đó chúng tôi có thể chỉ định kiểu nên là + +121 +00:08:32,200 --> 00:08:32,830 +1:. + +122 +00:08:32,830 --> 00:08:34,690 +0: Bây giờ. Khi chúng ta sử + +123 +00:08:34,840 --> 00:08:37,990 +dụng Beautiful Soup, chúng ta cũng có thể sử dụng các bộ chọn CSS. + +124 +00:08:38,620 --> 00:08:43,270 +Tôi có thể nắm được URL của công ty đó chỉ bằng cách nói + +125 +00:08:43,720 --> 00:08:48,370 +súp và thay vì sử dụng find hoặc find_all, tôi sẽ sử dụng select_one. + +126 +00:08:49,210 --> 00:08:54,210 +Có select và select_one. Select_one sẽ cung cấp cho chúng tôi mục phù hợp đầu + +127 +00:08:54,430 --> 00:08:58,620 +tiên và select sẽ cung cấp cho chúng tôi tất cả các mục phù hợp trong một danh sách. + +128 +00:08:59,280 --> 00:09:04,050 +Bây giờ chúng ta phải chỉ định bộ chọn dưới dạng một chuỗi. Và một lần nữa, tôi sẽ sử dụng + +129 +00:09:04,080 --> 00:09:07,020 +cùng một bộ chọn mà tôi đã chỉ cho bạn trước đây. + +130 +00:09:07,350 --> 00:09:11,820 +Vì vậy, chúng tôi đang tìm kiếm một thẻ nằm bên trong thẻ p. + +131 +00:09:12,240 --> 00:09:17,040 +Và chuỗi này là bộ chọn CSS. Vì vậy, bạn có thể viết bất cứ + +132 +00:09:17,040 --> 00:09:21,810 +điều gì ở đây thực sự. Điều này có nghĩa là chúng tôi sẽ có thể nhận được thẻ liên kết đó. + +133 +00:09:22,080 --> 00:09:27,080 +Và khi tôi đã nắm được URL của công ty và in nó ra, bạn có + +134 +00:09:27,720 --> 00:09:31,290 +thể thấy thẻ liên kết chính xác mà chúng tôi muốn. + +135 +00:09:32,610 --> 00:09:36,270 +Chúng ta không cần chỉ chăm chăm vào các bộ chọn HTML. + +136 +00:09:36,300 --> 00:09:40,890 +Bạn cũng có thể sử dụng lớp hoặc ID trong bộ chọn CSS của mình. + +137 +00:09:41,280 --> 00:09:44,220 +Vì vậy, hãy nhớ rằng, để chọn trên một ID, chúng + +138 +00:09:44,520 --> 00:09:47,550 +tôi sử dụng dấu thăng. Vì vậy, giả + +139 +00:09:47,880 --> 00:09:51,720 +sử chúng ta muốn nắm giữ h1 này, có ID + +140 +00:09:51,990 --> 00:09:53,820 +là tên, chúng ta có + +141 +00:09:54,180 --> 00:09:58,740 +thể nói #name, và bây giờ nó sẽ giống với tên của tôi. + +142 +00:09:59,160 --> 00:10:01,740 +Và nếu bây giờ tôi chạy nó, bạn + +143 +00:10:01,950 --> 00:10:06,570 +có thể thấy cái cuối cùng đó, phần tử được chọn là h1 với ID là tên. + +144 +00:10:07,650 --> 00:10:12,210 +Và cuối cùng, bạn có thể sử dụng bộ chọn CSS để chọn một phần tử theo lớp. + +145 +00:10:12,390 --> 00:10:16,680 +Vì vậy, ví dụ, ở đây, chúng tôi đã có tiêu đề và ở đây chúng tôi cũng có tiêu đề. + +146 +00:10:17,160 --> 00:10:22,160 +Vì vậy, nếu chúng ta muốn chọn tất cả các phần tử có một lớp tiêu đề, thì + +147 +00:10:22,980 --> 00:10:26,940 +chúng ta có thể nói là súp. chọn để điều này sẽ cung cấp + +148 +00:10:27,060 --> 00:10:32,060 +cho chúng tôi một danh sách và sau đó bộ chọn là mục đầu tiên đi vào phương thức. + +149 +00:10:32,520 --> 00:10:37,470 +Vì vậy, tương tự như điều này, chúng ta có thể có đối số từ khóa này ở đó hoặc chúng ta có thể xóa nó. + +150 +00:10:38,070 --> 00:10:43,070 +Và bộ chọn này sẽ sử dụng. đầu đề để chọn phần tử có + +151 +00:10:45,060 --> 00:10:47,130 +một lớp đầu đề. + +152 +00:10:49,410 --> 00:10:53,430 +Và đây sẽ là một danh sách nếu chúng ta in nó ra. + +153 +00:10:55,620 --> 00:10:56,580 +Ngay tại đây. + +154 +00:10:56,630 --> 00:10:58,530 +2: Vì vậy, 0: + +155 +00:10:58,880 --> 00:11:03,500 +bạn có thể sử dụng mọi thứ bạn đã học về bộ chọn CSS + +156 +00:11:03,500 --> 00:11:06,560 +để chọn một mục cụ thể từ tệp HTML. + +157 +00:11:07,040 --> 00:11:11,330 +Và điều này thường thực sự hữu ích vì rất nhiều phần tử này sẽ được lồng + +158 +00:11:11,330 --> 00:11:14,600 +vào bên trong div và div sẽ có ID và sau đó + +159 +00:11:14,870 --> 00:11:19,190 +tất cả những gì bạn phải làm là thu hẹp div và sau đó thu hẹp phần + +160 +00:11:19,190 --> 00:11:20,023 +tử bạn muốn. + +161 +00:11:20,240 --> 00:11:25,240 +Vì vậy, về cơ bản bạn có thể đi sâu vào việc sử dụng các bộ chọn CSS để truy cập bất kỳ mục + +162 +00:11:26,180 --> 00:11:27,260 +nào bạn muốn trên trang. + +163 +00:11:28,460 --> 00:11:33,460 +Bây giờ chúng ta đã xem xét cách tìm các mục khác nhau từ HTML bằng Beautiful + +164 +00:11:33,980 --> 00:11:37,610 +Soup, trong bài học tiếp theo, tôi có một bài kiểm tra cho + +165 +00:11:37,910 --> 00:11:42,910 +bạn để bạn tham khảo và thực hành một số cách chọn và tìm các phần tử + +166 +00:11:43,850 --> 00:11:46,760 +từ tệp HTML bằng cách sử dụng Beautiful Soup. + +167 +00:11:47,240 --> 00:11:50,330 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, hãy chuyển sang bài học tiếp theo. + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/004 Beautiful Soup Exercises.html b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/004 Beautiful Soup Exercises.html new file mode 100644 index 0000000000000000000000000000000000000000..875f131cc69fde9177baa4fd665b91f10573a3e8 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/004 Beautiful Soup Exercises.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 SOLUTION.url b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 SOLUTION.url new file mode 100644 index 0000000000000000000000000000000000000000..bde5275331d04cdf9a8cd0202945eec965607be9 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 SOLUTION.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://replit.com/@appbrewery/Day-45-Hacker-News-Solution \ No newline at end of file diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Scraping a Live Website.mp4 b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Scraping a Live Website.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6d52a17e977c354a0b0d3465a5ca8bf0c1b7364e --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Scraping a Live Website.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:daeefdc4128ebc5240b9c698503142217245abd2948eccd676f957990aaa0dd2 +size 250485977 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Scraping a Live Website_vi.srt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Scraping a Live Website_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5882d1d51835a10682c2d6f6e1a0011af9618fb2 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Scraping a Live Website_vi.srt @@ -0,0 +1,980 @@ +1 +00:00:00,420 --> 00:00:05,420 +Trong bài học trước, chúng ta đã bắt đầu sử dụng Beautiful Soup và chúng ta đã thấy cách chúng ta có thể + +2 +00:00:05,430 --> 00:00:10,430 +sử dụng nó để phân tích cú pháp thông qua HTML của một trang web và rút ra những phần mà chúng + +3 +00:00:10,560 --> 00:00:11,393 +ta quan tâm. + +4 +00:00:12,210 --> 00:00:16,920 +Bây giờ không có gì vui khi tìm kiếm một trang web mà bạn đã có quyền truy cập cục bộ. + +5 +00:00:17,490 --> 00:00:21,900 +Sẽ tốt hơn nhiều nếu chúng ta có thể nắm bắt được thứ gì + +6 +00:00:21,900 --> 00:00:26,520 +đó hiện đang tồn tại trên internet. Vì vậy, tôi sẽ tiếp tục và bình luận về tất + +7 +00:00:27,960 --> 00:00:32,960 +cả mã này, và tôi sẽ sử dụng Beautiful Soup để nắm giữ một trang web đang hoạt động và lấy dữ + +8 +00:00:33,900 --> 00:00:34,800 +liệu từ nó. + +9 +00:00:35,580 --> 00:00:40,170 +Và trang web mà chúng tôi sẽ sử dụng là trang web Tin tức Hacker + +10 +00:00:40,170 --> 00:00:41,003 +của YCombinator. + +11 +00:00:41,670 --> 00:00:46,650 +Đây là nơi mà bất kỳ ai cũng có thể đăng liên kết đến một mẩu tin tức mà họ đã phát hiện + +12 +00:00:46,650 --> 00:00:51,300 +ra có liên quan đến công nghệ hoặc bạn có thể giới thiệu những thứ mà bạn đã xây dựng. + +13 +00:00:51,660 --> 00:00:52,200 +Ví dụ: + +14 +00:00:52,200 --> 00:00:56,430 +tôi vừa mới xem trang web của anh chàng này mà anh ấy đã xây dựng có tên My Desk + +15 +00:00:57,030 --> 00:00:59,760 +Tour, nơi bạn có thể đăng ảnh về thiết lập bàn làm + +16 +00:01:00,150 --> 00:01:04,110 +việc của mình và bạn có thể xem tất cả các công cụ và thiết bị mà họ có. + +17 +00:01:04,860 --> 00:01:08,160 +Vì vậy, chúng tôi sẽ rà soát trang web Tin + +18 +00:01:08,190 --> 00:01:10,980 +tặc chính nằm dưới URL cụ thể này. + +19 +00:01:11,520 --> 00:01:15,450 +Và đây thường là nơi tôi đến để tìm những tin tức công nghệ mới nhất. + +20 +00:01:16,200 --> 00:01:20,760 +Chúng tôi sẽ sao chép URL này và chúng tôi sẽ quay lại trang chính của chúng tôi. py + +21 +00:01:21,270 --> 00:01:25,050 +Và để tải xuống dữ liệu từ trang web đó, chúng ta sẽ + +22 +00:01:25,080 --> 00:01:28,860 +sử dụng người bạn tiện dụng của mình, đó là các yêu cầu. + +23 +00:01:29,520 --> 00:01:34,520 +Giờ đây, các yêu cầu cho phép chúng tôi giữ lại dữ liệu từ một URL cụ thể, trong trường hợp + +24 +00:01:36,060 --> 00:01:39,240 +này là tin tức. ycombinator. com. + +25 +00:01:40,500 --> 00:01:43,080 +Và khi chúng tôi đã thực hiện yêu cầu đó, + +26 +00:01:43,110 --> 00:01:48,110 +thì chúng tôi có thể lưu dữ liệu mà chúng tôi nhận được trở lại trong một biến phản hồi. + +27 +00:01:49,070 --> 00:01:50,840 +Và khi chúng tôi đã có + +28 +00:01:50,870 --> 00:01:54,350 +phản hồi, chúng tôi thực sự có thể in ra văn bản của phản + +29 +00:01:54,890 --> 00:01:59,890 +hồi và điều này về cơ bản tương đương với những gì chúng tôi đã làm khi chúng tôi mở tệp + +30 +00:02:00,590 --> 00:02:04,040 +HTML của mình và chúng tôi đọc nội dung tệp, văn bản của tệp. + +31 +00:02:04,700 --> 00:02:06,950 +Vì vậy, bây giờ nếu tôi tiếp + +32 +00:02:07,010 --> 00:02:10,850 +tục và chạy nó, thì bạn có thể thấy rằng nó sẽ in ra + +33 +00:02:11,150 --> 00:02:15,860 +vô số thứ, nhưng về cơ bản đây là mã đại diện cho trang cụ thể này. + +34 +00:02:16,310 --> 00:02:19,700 +Vì vậy, trên thực tế, nếu bạn nhấp chuột phải và + +35 +00:02:19,730 --> 00:02:24,470 +nhấp vào xem nguồn trang, bạn sẽ thấy rằng đây chính xác là mã HTML mà + +36 +00:02:24,470 --> 00:02:28,790 +chúng tôi đang lấy lại ở đây. Vì vậy, chúng tôi thực sự không muốn tất cả những thứ lộn xộn lộn xộn này. + +37 +00:02:29,180 --> 00:02:34,180 +Điều chúng tôi quan tâm hơn là các tiêu đề cụ thể và các + +38 +00:02:34,760 --> 00:02:37,100 +liên kết cho từng phần này. + +39 +00:02:37,730 --> 00:02:41,480 +Theo mặc định, nó hiển thị 30 trong số các bài báo hàng đầu và điều + +40 +00:02:41,870 --> 00:02:43,940 +này được xếp hạng bởi một thuật toán. + +41 +00:02:43,970 --> 00:02:48,970 +Vì vậy, nó gần đây nhất và cũng nhận được rất nhiều lực kéo, rất nhiều lượt bình chọn, + +42 +00:02:49,040 --> 00:02:50,420 +nhưng nó không đại diện + +43 +00:02:50,840 --> 00:02:55,730 +cho các mặt hàng được ủng hộ nhiều nhất. Vì vậy, bạn có thể thấy ở đây, trên + +44 +00:02:55,760 --> 00:02:58,340 +thực tế, người được ủng hộ nhiều nhất, ít nhất là + +45 +00:02:58,430 --> 00:03:01,210 +cho đến ngày hôm nay, là Mozilla sa thải 250 nhân viên. + +46 +00:03:01,960 --> 00:03:06,960 +Vì vậy, điều gì sẽ xảy ra nếu tôi muốn nắm giữ tiêu đề bài viết và liên kết của + +47 +00:03:07,840 --> 00:03:10,300 +bài đăng từ trang có điểm cao nhất này. + +48 +00:03:10,690 --> 00:03:14,590 +Tôi không muốn phải kiểm tra thủ công tất cả những điều này. Tôi muốn làm điều đó với mã. + +49 +00:03:15,280 --> 00:03:18,040 +Vì vậy, chúng ta hãy tiếp tục và cạo nó. Bây giờ, nếu + +50 +00:03:18,070 --> 00:03:21,970 +tôi nhấp chuột phải vào từng tiêu đề này và nhấp + +51 +00:03:22,420 --> 00:03:26,530 +vào kiểm tra, thì tôi sẽ đến dòng mã chính xác trong + +52 +00:03:26,560 --> 00:03:30,070 +HTML chịu trách nhiệm hiển thị thành phần này. + +53 +00:03:30,550 --> 00:03:34,210 +Đây thực sự là một thẻ liên kết, vì + +54 +00:03:34,240 --> 00:03:39,240 +vậy đó là một thẻ. Và văn bản trong thẻ liên kết là tiêu đề của bài viết, và sau đó + +55 +00:03:41,470 --> 00:03:45,430 +href là liên kết sẽ đưa tôi đến câu chuyện thực tế. Vì vậy, nếu tôi nhấp vào + +56 +00:03:45,460 --> 00:03:47,230 +đây, bạn có thể + +57 +00:03:47,230 --> 00:03:51,820 +thấy nó đưa tôi đến mẩu tin tức thực tế về Joan Feynman. + +58 +00:03:52,960 --> 00:03:54,880 +Vậy điểm này thì sao? Vâng, hãy tiếp + +59 +00:03:54,880 --> 00:03:57,850 +tục và nhấp chuột phải vào nó và nhấp vào kiểm tra. + +60 +00:03:58,180 --> 00:04:03,180 +Bạn có thể thấy đây là một khoảng thời gian và nó có một loại điểm trong khi tiêu đề + +61 +00:04:06,910 --> 00:04:10,570 +này là một giới thiệu và nó có một lớp liên kết câu chuyện. + +62 +00:04:11,170 --> 00:04:13,420 +Vì vậy, với hai phần thông tin đó, chúng + +63 +00:04:13,570 --> 00:04:17,350 +ta có thể sử dụng Beautiful Soup để loại bỏ tất cả các tiêu đề, tất + +64 +00:04:17,500 --> 00:04:20,019 +cả các liên kết và tất cả các điểm của chúng. + +65 +00:04:20,470 --> 00:04:24,550 +Và chúng tôi có thể so sánh tất cả những điểm đó và tìm ra điểm nào + +66 +00:04:24,550 --> 00:04:28,030 +có điểm cao nhất trên trang này. Vì vậy, chúng ta hãy tiếp tục và làm điều đó. + +67 +00:04:29,020 --> 00:04:33,310 +Vì vậy, tôi sẽ lưu trang yc_webpage làm phản hồi. và sau đó tôi sẽ + +68 +00:04:34,300 --> 00:04:38,710 +sử dụng Beautiful Soup để phân tích cú pháp trang web đó. + +69 +00:04:39,220 --> 00:04:40,480 +Vì vậy, BeautifulSoup và + +70 +00:04:40,540 --> 00:04:45,540 +sau đó tôi sẽ chuyển vào tài liệu HTML thực tế mà chúng tôi muốn phân tích cú pháp. + +71 +00:04:45,910 --> 00:04:48,220 +Vì vậy, đây là trang web YC, sau + +72 +00:04:48,820 --> 00:04:52,750 +đó chúng tôi cung cấp phương pháp mà chúng tôi sẽ phân tích cú pháp nó. + +73 +00:04:52,750 --> 00:04:56,890 +Vì vậy, html. phân tích cú pháp, với ER ở cuối. + +74 +00:04:57,580 --> 00:05:01,930 +Và đây là món súp của chúng tôi. Khi chúng ta đã tạo xong món súp của + +75 +00:05:02,620 --> 00:05:06,580 +mình, bước tiếp theo thực sự là tìm hiểu món súp và tìm những phần chúng ta muốn. + +76 +00:05:06,730 --> 00:05:11,290 +Vì vậy, nếu, ví dụ, nếu tôi muốn nắm giữ tiêu đề của tất cả những thứ đó, thì + +77 +00:05:11,290 --> 00:05:16,060 +tôi có thể nói print soup. Tiêu đề. Và bây giờ bạn sẽ + +78 +00:05:16,060 --> 00:05:19,000 +thấy nó đặt cho tôi tiêu đề là Tin tức Hacker. + +79 +00:05:19,780 --> 00:05:24,100 +Và điều đó cũng giống như những gì bạn thấy ở đây trong thanh tab. + +80 +00:05:24,910 --> 00:05:26,710 +Bây giờ, điều gì sẽ xảy ra nếu tôi không muốn danh hiệu? + +81 +00:05:26,710 --> 00:05:31,150 +Điều gì sẽ xảy ra nếu tôi thực sự muốn nắm giữ văn bản này ở + +82 +00:05:31,750 --> 00:05:34,120 +đây, tiêu đề của mỗi bài báo này? + +83 +00:05:34,810 --> 00:05:39,810 +Xem liệu bạn có thể tìm ra cách nắm giữ văn bản này và in nó ra + +84 +00:05:40,330 --> 00:05:44,590 +trong mã của bạn hay không. Hãy nhớ rằng nó có lớp là liên kết câu chuyện + +85 +00:05:44,950 --> 00:05:46,360 +và đó là thẻ liên kết. + +86 +00:05:46,960 --> 00:05:50,410 +Hãy tạm dừng video và xem liệu bạn có thể nhận được tiêu đề này hay không, vì vậy tất + +87 +00:05:50,590 --> 00:05:53,380 +nhiên, video của bạn có thể khác với những gì tôi đã có trên màn hình. + +88 +00:05:53,440 --> 00:05:57,590 +Nó phụ thuộc vào những gì hiển thị trên Hacker News vào ngày bạn làm việc này. + +89 +00:05:58,010 --> 00:06:02,810 +Nhưng lấy tiêu đề của bài báo đầu tiên được in ra bằng BeautifulSoup. + +90 +00:06:03,490 --> 00:06:04,323 +1: Được rồi. + +91 +00:06:05,800 --> 00:06:08,920 +0: Được rồi. Những gì chúng tôi muốn làm là chúng tôi muốn sử dụng tìm. + +92 +00:06:09,430 --> 00:06:14,430 +Vì vậy, chúng tôi sẽ tìm trường hợp đầu tiên từ trang web này + +93 +00:06:15,850 --> 00:06:20,080 +trong đó tên thực của thẻ bằng a, vì vậy đó + +94 +00:06:20,770 --> 00:06:25,770 +là thẻ liên kết và sau đó lớp bằng với liên kết câu chuyện. + +95 +00:06:27,250 --> 00:06:29,530 +Vì vậy, tôi sẽ sao chép nó và dán nó vào. + +96 +00:06:30,220 --> 00:06:34,600 +Hãy nhớ rằng để không đụng độ với từ khóa lớp dành riêng, chúng + +97 +00:06:34,630 --> 00:06:37,210 +ta phải thêm dấu gạch dưới sau đó. + +98 +00:06:38,200 --> 00:06:41,350 +Bây giờ đây sẽ là thẻ bài viết của chúng tôi. + +99 +00:06:42,100 --> 00:06:44,230 +Và nếu chúng tôi tiếp tục và + +100 +00:06:44,470 --> 00:06:49,470 +in nó, thì bạn có thể thấy rằng chúng tôi nhận được thẻ neo chính xác này. + +101 +00:06:50,350 --> 00:06:54,130 +Nhưng nếu chúng ta muốn nắm bắt văn bản thực sự nằm trong + +102 +00:06:54,190 --> 00:06:58,450 +thẻ liên kết, thì chúng ta phải tiến thêm một bước nữa và gọi + +103 +00:06:58,570 --> 00:07:03,190 +phương thức getText cũng từ Beautiful Soup. Vì vậy, bây giờ khi tôi chạy nó, bạn + +104 +00:07:03,310 --> 00:07:06,670 +có thể thấy tôi chỉ nhận được văn bản thực sự của bài báo. + +105 +00:07:07,510 --> 00:07:12,310 +Hãy làm việc với một số phần khác. Vì vậy, đây là nội dung bài báo. + +106 +00:07:13,840 --> 00:07:18,840 +Và sau đó nếu chúng ta muốn nắm giữ liên kết article_upvotes và article_upvotes. + +107 +00:07:22,300 --> 00:07:26,020 +Xem liệu bạn có thể tìm ra cách hoàn thành cả hai phần này không. + +108 +00:07:26,200 --> 00:07:30,880 +Vì vậy, chúng tôi muốn liên kết HTML tất nhiên là của tất + +109 +00:07:30,880 --> 00:07:34,330 +cả HTTP này, v.v. Và sau đó chúng tôi cũng muốn nắm + +110 +00:07:34,390 --> 00:07:37,150 +giữ số phiếu ủng hộ là con số nhỏ này ngay tại đây. + +111 +00:07:38,110 --> 00:07:41,080 +Nó nằm trong một khoảng với một lớp điểm. + +112 +00:07:41,380 --> 00:07:42,213 +1: Đúng không? + +113 +00:07:44,500 --> 00:07:48,190 +0: Được rồi. Vì vậy, chúng ta hãy làm điều đầu tiên, đó là liên kết bài viết. Chà, chúng ta thực + +114 +00:07:48,190 --> 00:07:52,840 +sự đã có thể khai thác cùng một thẻ bài viết mà chúng ta đã có ở đây. + +115 +00:07:53,260 --> 00:07:55,060 +Và thay vì nói getText, chúng + +116 +00:07:55,090 --> 00:08:00,090 +ta có thể sử dụng phương thức get để lấy giá trị cụ thể của một thuộc tính. + +117 +00:08:02,080 --> 00:08:04,990 +Vì vậy, những gì chúng tôi muốn tất nhiên là href. + +118 +00:08:06,520 --> 00:08:09,190 +Và sau đó là article_upvote, chúng ta + +119 +00:08:09,250 --> 00:08:14,250 +sẽ phải nhấn vào món súp của mình và tìm thẻ có tên kéo dài + +120 +00:08:17,140 --> 00:08:21,400 +vì đây là thứ chúng ta đang tìm và có một loại điểm. + +121 +00:08:21,880 --> 00:08:22,713 +1: Đúng không? + +122 +00:08:24,400 --> 00:08:29,400 +0: Như thế này. Tìm thẻ cụ thể này là không đủ. + +123 +00:08:29,680 --> 00:08:34,570 +Điều này thực sự chỉ giúp chúng tôi nhận được thẻ. Nếu chúng ta muốn đi xa hơn + +124 +00:08:34,570 --> 00:08:38,350 +và chúng ta thực sự muốn lấy văn bản bên trong khoảng + +125 +00:08:38,650 --> 00:08:41,230 +đó, tất nhiên là 19 điểm, thì chúng + +126 +00:08:41,799 --> 00:08:45,280 +ta phải đào sâu hơn một bước và gọi phương + +127 +00:08:45,310 --> 00:08:49,450 +thức getText như thế này. Bây giờ, nếu tôi tiếp + +128 +00:08:49,480 --> 00:08:54,480 +tục và in ra article_text và article_link, và cuối cùng là article_upvote, + +129 +00:08:55,710 --> 00:08:59,550 +thì bạn có thể thấy tôi nhận được cả ba + +130 +00:09:00,090 --> 00:09:01,200 +phần dữ + +131 +00:09:01,200 --> 00:09:05,730 +liệu mà tôi quan tâm. Bây giờ, thay vì nhận được lần + +132 +00:09:05,790 --> 00:09:10,620 +xuất hiện đầu tiên, tôi muốn nhận được tất cả những lần xuất hiện trên trang + +133 +00:09:10,650 --> 00:09:15,570 +này, vì vậy tất cả 30 kết quả. Bây giờ, để làm điều đó, + +134 +00:09:15,810 --> 00:09:20,810 +tôi phải thay đổi tìm kiếm thành find_all cả ở đây và ở đây. + +135 +00:09:23,280 --> 00:09:23,790 +Bằng + +136 +00:09:23,790 --> 00:09:28,790 +cách này, chúng tôi nhận được danh sách tất cả các bài báo và tôi sẽ nhận được danh sách tất cả + +137 +00:09:31,860 --> 00:09:32,693 +các bài báo _upvotes. + +138 +00:09:33,990 --> 00:09:38,040 +Vì vậy, bây giờ nó sẽ khác một chút. Để có được tất cả văn + +139 +00:09:38,070 --> 00:09:41,730 +bản và tất cả liên kết, tôi phải sử dụng vòng lặp for. + +140 +00:09:42,450 --> 00:09:46,410 +Vì vậy, tôi sẽ nói về thẻ bài viết trong các bài báo, vì vậy tất + +141 +00:09:46,740 --> 00:09:47,940 +nhiên là các bài + +142 +00:09:47,940 --> 00:09:52,410 +báo, danh sách này nơi chúng tôi tìm thấy tất cả các thẻ liên kết với một lớp + +143 +00:09:53,130 --> 00:09:56,820 +liên kết câu chuyện và sau đó tôi sẽ lặp lại từng thẻ một và + +144 +00:09:56,850 --> 00:10:00,030 +từng các thẻ, tôi sẽ lấy văn bản và cũng lấy Href. + +145 +00:10:02,100 --> 00:10:06,150 +Tôi sẽ tạo hai danh sách mới, article_text và article_links. + +146 +00:10:08,550 --> 00:10:12,930 +Và sau đó tôi sẽ lưu từng bài báo mới vào danh sách đó. + +147 +00:10:19,700 --> 00:10:20,533 +2: ... + +148 +00:10:20,690 --> 00:10:23,000 +0: Như thế này. Và trên thực tế, + +149 +00:10:23,030 --> 00:10:28,030 +chúng ta có thể đơn giản hóa điều này một chút bằng cách cấu trúc lại và + +150 +00:10:30,020 --> 00:10:31,040 +đổi tên + +151 +00:10:31,070 --> 00:10:35,240 +văn bản bài viết, do đó, phiên bản số ít chỉ thành văn bản + +152 +00:10:36,770 --> 00:10:38,420 +và article_link chỉ thành liên kết. + +153 +00:10:39,740 --> 00:10:44,300 +Vì vậy, bây giờ chúng ta hãy in ra các danh sách. Vì vậy, + +154 +00:10:45,530 --> 00:10:49,010 +article_texts, article_links và article_upvotes. + +155 +00:10:49,760 --> 00:10:51,440 +Và find_all này cung cấp + +156 +00:10:51,440 --> 00:10:55,760 +cho tôi một danh sách và tôi không thể gọi getText trong danh sách. + +157 +00:10:56,120 --> 00:10:59,720 +Vì vậy, tôi cũng sẽ cần tạo một danh sách mới. + +158 +00:11:00,050 --> 00:11:02,360 +Vì vậy, tôi sẽ chọn sử dụng khả năng hiểu danh sách ở đây. + +159 +00:11:03,260 --> 00:11:08,260 +Vì vậy, tôi sẽ nói về điểm số trong tất cả các điểm số, chúng tôi sẽ tạo + +160 +00:11:10,370 --> 00:11:13,850 +một danh sách bằng cách sử dụng từng điểm số đó và + +161 +00:11:14,090 --> 00:11:17,450 +chúng tôi sẽ gọi getText để lấy từng điểm số đó. + +162 +00:11:18,500 --> 00:11:21,560 +Điều này cũng giống như viết ra một vòng lặp for như thế + +163 +00:11:21,650 --> 00:11:26,180 +này nhưng rõ ràng là nó ngắn hơn nhiều. Bây giờ, khi tôi nhấn run, bạn có thể thấy + +164 +00:11:26,210 --> 00:11:28,880 +rằng mỗi danh sách của tôi được sắp xếp theo thứ tự. + +165 +00:11:29,150 --> 00:11:33,950 +Vì vậy, đây là nội dung của bài viết đầu tiên, đây là liên kết của bài viết đầu tiên, + +166 +00:11:34,220 --> 00:11:36,560 +và đây là điểm của bài viết đầu tiên. + +167 +00:11:38,660 --> 00:11:43,660 +Những gì chúng tôi muốn làm là chúng tôi muốn đưa article_upvotes thành một định dạng số, vì + +168 +00:11:45,080 --> 00:11:47,750 +vậy một số nguyên. Và để làm được + +169 +00:11:47,780 --> 00:11:51,380 +điều đó, tất nhiên chúng ta phải loại bỏ những điểm đến sau đó. + +170 +00:11:51,830 --> 00:11:56,740 +Nhưng hãy chú ý cách mỗi mục này là chuỗi. Vì vậy, điều đó có nghĩa là chúng ta + +171 +00:11:56,890 --> 00:12:01,270 +có thể chia chuỗi theo không gian và chỉ nắm giữ mục đầu tiên trong không gian đó. + +172 +00:12:02,110 --> 00:12:06,070 +Hãy để tôi chỉ cho bạn những gì tôi muốn nói. Vì vậy, chúng tôi đã có tất cả các + +173 +00:12:06,190 --> 00:12:09,670 +phiếu tán thành của bài báo, hãy tiếp tục và chỉ cần in ra mục đầu tiên. + +174 +00:12:10,380 --> 00:12:11,213 +2: Đúng. + +175 +00:12:13,770 --> 00:12:18,090 +0: Vì vậy, bây giờ chúng tôi chỉ nhận được mục đầu tiên, đó là 40 điểm. Bây giờ, nếu tôi lấy + +176 +00:12:18,090 --> 00:12:21,840 +mục đó và tôi gọi phương thức tách, thì nó + +177 +00:12:21,900 --> 00:12:26,400 +sẽ tách từng từ trong câu. Theo mặc định, nó + +178 +00:12:26,400 --> 00:12:31,350 +phân chia theo không gian. Bây giờ, nếu tôi chạy mã này, bạn có + +179 +00:12:32,220 --> 00:12:32,910 +thể thấy + +180 +00:12:32,910 --> 00:12:37,910 +tôi nhận được danh sách mà tôi có mục đầu tiên là 40 và mục thứ hai là điểm. + +181 +00:12:39,390 --> 00:12:42,900 +Vì vậy, về cơ bản nó chia chuỗi đó theo khoảng trắng. + +182 +00:12:43,740 --> 00:12:48,300 +Bây giờ giai đoạn tiếp theo là tôi có thể nắm giữ chỉ mục đầu tiên xuất phát từ + +183 +00:12:48,300 --> 00:12:50,130 +danh sách đó, bây giờ là 40. + +184 +00:12:50,820 --> 00:12:54,180 +Nếu bây giờ cuối cùng tôi quấn nó quanh một số nguyên, thì + +185 +00:12:54,270 --> 00:12:59,130 +tôi có thể biến nó thành một số thực. Đừng lo lắng nếu số của bạn thay đổi vì bạn + +186 +00:12:59,130 --> 00:13:03,600 +đang lấy dữ liệu trực tiếp từ một trang web. Số phiếu ủng hộ đó có thể thay đổi + +187 +00:13:03,600 --> 00:13:06,540 +trong bất kỳ giây nào. Vì vậy, đây là phương pháp + +188 +00:13:06,540 --> 00:13:10,260 +làm thế nào chúng ta có thể nắm được số lượng thực tế từ các phiếu ủng hộ. + +189 +00:13:10,890 --> 00:13:14,790 +Bây giờ chúng ta sẽ áp dụng tất cả những điều này. tách và cũng + +190 +00:13:14,850 --> 00:13:19,740 +nắm giữ mục đầu tiên trong danh sách của chúng tôi. + +191 +00:13:20,100 --> 00:13:22,920 +Vì vậy, đối với mỗi điểm số mà súp tìm được, + +192 +00:13:23,160 --> 00:13:27,420 +chúng ta sẽ nắm bắt văn bản và sau đó tách văn bản và sau đó lấy mục + +193 +00:13:27,420 --> 00:13:30,150 +đầu tiên từ văn bản. Và cuối cùng, chúng ta quấn tất cả + +194 +00:13:30,180 --> 00:13:35,180 +những điều này xung quanh một số nguyên và biến nó thành một số nguyên. Sau đó, nếu tôi tiếp tục và bỏ ghi chú + +195 +00:13:36,960 --> 00:13:39,120 +tất cả các dòng mã này, thì bạn có + +196 +00:13:39,540 --> 00:13:43,350 +thể thấy tôi đã in ra tất cả những con số này, có nghĩa là bây + +197 +00:13:43,980 --> 00:13:46,110 +giờ tôi có thể sắp xếp chúng. + +198 +00:13:47,670 --> 00:13:51,930 +Tôi muốn lấy chỉ mục của mục danh sách có giá trị cao nhất. + +199 +00:13:52,140 --> 00:13:55,950 +Và sau đó tôi muốn sử dụng chỉ mục đó để chọn tiêu đề, văn + +200 +00:13:56,100 --> 00:13:58,920 +bản và cả liên kết từ hai danh sách này, + +201 +00:13:59,400 --> 00:14:02,610 +bởi vì tất cả chúng đều được sắp xếp theo cùng một cách. + +202 +00:14:02,610 --> 00:14:07,610 +Vì vậy, mục đầu tiên này tương ứng với liên kết đầu tiên này tương + +203 +00:14:07,950 --> 00:14:12,690 +ứng với ủng hộ đầu tiên này. Và tôi muốn đặt ra điều này với bạn như một thách thức. + +204 +00:14:13,050 --> 00:14:16,080 +Bạn có thể in tiêu đề và liên kết cho câu chuyện + +205 +00:14:16,080 --> 00:14:18,840 +Hacker News có số lượt ủng hộ cao nhất không? + +206 +00:14:19,350 --> 00:14:22,080 +Vì chúng tôi đang làm việc với ba danh sách khác + +207 +00:14:22,320 --> 00:14:27,320 +nhau tại thời điểm này, bạn sẽ phải tìm chỉ mục của số lớn nhất bên trong danh sách article_upvotes + +208 +00:14:27,390 --> 00:14:28,830 +để thực hiện điều này. + +209 +00:14:29,310 --> 00:14:32,910 +Tôi sẽ cho bạn một vài giây để tạm dừng video trước khi tôi chỉ cho bạn giải pháp. + +210 +00:14:36,330 --> 00:14:41,750 +Được rồi, đây là giải pháp. + +211 +00:14:42,660 --> 00:14:46,440 +Chúng ta có thể sử dụng hàm max mà Python đi kèm để lấy số lớn nhất từ article_upvotes của chúng ta. + +212 +00:14:48,450 --> 00:14:52,970 +Và sau đó chúng ta có thể in ra con số lớn nhất này và xem nó có hoạt động không. + +213 +00:14:53,660 --> 00:14:58,040 +Vì vậy, chúng tôi có 1,312. Bây giờ, khi chúng ta đã + +214 +00:14:58,040 --> 00:15:00,650 +nắm được số lớn nhất, thì chúng ta + +215 +00:15:00,800 --> 00:15:04,160 +có thể tìm chỉ mục của nó từ danh sách này. + +216 +00:15:04,610 --> 00:15:07,640 +Vì vậy, chúng ta có thể nói article_upvotes. chỉ mục và sau + +217 +00:15:07,700 --> 00:15:11,300 +đó chúng tôi tìm chỉ số của số lớn nhất này. + +218 +00:15:11,410 --> 00:15:12,243 +2: Đúng. + +219 +00:15:16,270 --> 00:15:19,780 +0: Bây giờ, nếu chúng tôi nhấn run, bạn có thể thấy rằng chúng tôi đang nhận được chỉ số số 27. + +220 +00:15:20,470 --> 00:15:22,870 +Vì vậy, thay vì chỉ in ra + +221 +00:15:22,960 --> 00:15:27,960 +chỉ mục đó, chúng ta có thể in, thay vào đó, article_texts với chỉ mục đó, do + +222 +00:15:30,010 --> 00:15:35,010 +đó, chuyển vào chỉ mục lớn nhất, cũng như article_links và chuyển vào cùng một chỉ mục. + +223 +00:15:37,690 --> 00:15:38,980 +Vì vậy, bây giờ nếu + +224 +00:15:39,070 --> 00:15:44,070 +tôi nhấn run, bạn có thể thấy rằng bài viết phổ biến nhất vào thời điểm hiện tại trên trang này có văn bản + +225 +00:15:45,100 --> 00:15:48,640 +tiêu đề này và liên kết cụ thể này. Tất nhiên đối với bạn nó + +226 +00:15:48,640 --> 00:15:52,870 +sẽ khác vì nó phụ thuộc vào những gì hiện đang hiển thị + +227 +00:15:52,870 --> 00:15:55,600 +trên Hacker News. Nhưng nếu tôi làm + +228 +00:15:55,630 --> 00:16:00,630 +mới trang này, bạn có thể thấy rằng bài báo với 1.313 điểm này tất nhiên là + +229 +00:16:02,500 --> 00:16:05,890 +bài viết phổ biến nhất và nó là bài viết về Mozilla. + +230 +00:16:07,030 --> 00:16:12,030 +Bạn có thể tưởng tượng một trường hợp sử dụng cho trường hợp này, trong đó hàng ngày chúng tôi + +231 +00:16:12,250 --> 00:16:16,840 +thu thập tất cả dữ liệu trên Y Combinator và sau đó chúng tôi gửi cho mình thông + +232 +00:16:17,170 --> 00:16:20,860 +qua tin nhắn văn bản qua email, tiêu đề và bài viết được ủng hộ + +233 +00:16:21,100 --> 00:16:24,040 +nhiều nhất để chúng tôi có thể xem xét một thứ. + +234 +00:16:25,150 --> 00:16:30,150 +Và bây giờ bạn đã thấy cách chúng tôi có thể sử dụng mô-đun yêu cầu để nắm giữ + +235 +00:16:31,090 --> 00:16:34,750 +văn bản mã HTML từ một trang web cụ thể và sau đó sử + +236 +00:16:35,020 --> 00:16:38,350 +dụng Beautiful Soup để phân tích cú pháp qua trang web đó + +237 +00:16:38,770 --> 00:16:43,770 +và sau đó để nắm giữ các phần cụ thể mà chúng tôi muốn bằng cách sử dụng find_all + +238 +00:16:44,470 --> 00:16:45,303 +hoặc find, + +239 +00:16:45,460 --> 00:16:49,900 +và sau đó nắm giữ văn bản hoặc nắm giữ liên kết hoặc nắm giữ bất kỳ + +240 +00:16:49,900 --> 00:16:51,640 +thứ nào khác mà chúng tôi muốn. + +241 +00:16:52,480 --> 00:16:56,920 +Vì vậy, bây giờ chúng ta đã thấy cách chúng ta có thể cạo trang web bằng Beautiful + +242 +00:16:56,920 --> 00:16:57,670 +Soup, trong + +243 +00:16:57,670 --> 00:17:02,670 +bài học tiếp theo, tôi muốn nói một chút về đạo đức của việc cạo các trang web và khi nào + +244 +00:17:03,370 --> 00:17:06,339 +nên làm điều đó và những gì bạn có thể sử dụng + +245 +00:17:06,339 --> 00:17:10,420 +dữ liệu bạn nhận được từ việc này vì. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Y-Combinator-Hacker-News.url b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Y-Combinator-Hacker-News.url new file mode 100644 index 0000000000000000000000000000000000000000..acd4d76218ad3c55de6f2a743ac90418112cd836 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/005 Y-Combinator-Hacker-News.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://news.ycombinator.com/ \ No newline at end of file diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/006 Is Web Scraping Legal.mp4 b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/006 Is Web Scraping Legal.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b68e67f3cec90588554fdbcea83dfe13584c6895 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/006 Is Web Scraping Legal.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e60a7b020728decd8c4b7b66d8ceb8da02f7cbfb90d1fac24a185ea07b2879a +size 97650436 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/006 Is Web Scraping Legal_vi.srt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/006 Is Web Scraping Legal_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..8f27bf3fd74596c5f03333d3410104a88d37ef41 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/006 Is Web Scraping Legal_vi.srt @@ -0,0 +1,708 @@ +1 +00:00:00,510 --> 00:00:05,250 +Bây giờ chúng ta đã học được cách làm web tìm kiếm theo yêu cầu và Beautiful + +2 +00:00:05,880 --> 00:00:10,880 +Soup, đã đến lúc lùi lại một chút và suy nghĩ về những gì chúng ta được phép + +3 +00:00:11,490 --> 00:00:16,490 +làm và những gì có thể không phải là một ý tưởng hay khi chúng ta đang cạo + +4 +00:00:16,710 --> 00:00:20,640 +dữ liệu từ các trang web khác. Bởi vì suy cho cùng, chúng ta không sở hữu dữ liệu đó, phải không? + +5 +00:00:21,450 --> 00:00:26,370 +Khi bạn nghĩ về các dịch vụ như Google hoặc Bing hoặc bất kỳ công cụ tìm kiếm nào + +6 +00:00:26,790 --> 00:00:31,790 +khác, về cơ bản những gì họ đang làm là liên tục thu thập dữ liệu từ tất cả + +7 +00:00:32,940 --> 00:00:35,280 +các trang web được liệt kê trên internet. + +8 +00:00:35,850 --> 00:00:39,780 +Và đó là cách họ quản lý để lấy thông tin về nội dung trên mỗi trang và + +9 +00:00:40,110 --> 00:00:43,740 +để trang đó hiển thị cho người dùng sử dụng dịch vụ tìm kiếm của họ. + +10 +00:00:44,490 --> 00:00:49,490 +Bây giờ chúng ta phải lùi lại một chút và suy nghĩ xem luật cạo + +11 +00:00:49,920 --> 00:00:52,530 +web là gì? Cái gì là hợp pháp và cái gì là bất hợp pháp? + +12 +00:00:53,250 --> 00:00:55,530 +Ngay cả khi chúng tôi đang xem Tin tức + +13 +00:00:55,530 --> 00:00:59,850 +về Hacker vừa rồi, tôi nhận thấy rằng một trong những bài báo trên thực tế + +14 +00:00:59,880 --> 00:01:04,170 +nói về vụ kiện Genius với Google. Và xét về lịch sử gần + +15 +00:01:04,170 --> 00:01:08,310 +đây, có hai trường hợp thực sự nổi tiếng, đó là Genius kiện Google + +16 +00:01:08,640 --> 00:01:12,810 +vì họ nói rằng Google đang cắt lời bài hát khỏi trang web của + +17 +00:01:12,810 --> 00:01:17,340 +họ và họ thực sự hiển thị nó mà không đưa mọi người đến Genius. + +18 +00:01:17,910 --> 00:01:21,270 +Ví dụ: nếu chúng ta đang xem lời bài hát cho Code + +19 +00:01:21,930 --> 00:01:26,930 +m Khỉ thật, bạn có thể thấy rằng Google tự động hiển thị lời bài hát ngay bên + +20 +00:01:26,940 --> 00:01:27,773 +trong Google. + +21 +00:01:27,810 --> 00:01:32,760 +Điều đó có nghĩa là người dùng có thể chỉ nhận được tất cả thông tin họ + +22 +00:01:33,120 --> 00:01:34,410 +cần, nói tất cả lời + +23 +00:01:34,410 --> 00:01:39,410 +bài hát của bài hát này mà không cần phải truy cập trang web nơi có lời bài + +24 +00:01:39,960 --> 00:01:40,793 +hát này. + +25 +00:01:41,430 --> 00:01:45,600 +Và lời bài hát đó có thể đã được biên soạn bởi ai đó trên Genius. + +26 +00:01:46,170 --> 00:01:50,190 +Genius có một trang web chú thích lời bài hát. Và tất nhiên, như với tất cả các + +27 +00:01:50,280 --> 00:01:51,510 +trang web, họ dựa + +28 +00:01:51,510 --> 00:01:56,510 +vào việc người dùng thực sự truy cập trang web của họ để kiếm tiền hoặc để hiển thị quảng cáo. + +29 +00:01:57,630 --> 00:02:00,570 +Và nếu Google chỉ hiển thị nó trong kết quả tìm kiếm của họ, + +30 +00:02:00,870 --> 00:02:03,930 +thì đây có thể là một vấn đề đối với các trang web như Genius. + +31 +00:02:04,470 --> 00:02:09,470 +Vì vậy, họ đã kiện họ về điều này và thực sự cuối cùng đã thua kiện. + +32 +00:02:10,560 --> 00:02:15,560 +Một ví dụ thực sự nổi tiếng khác về một vụ kiện về việc cạo + +33 +00:02:17,130 --> 00:02:22,080 +mủ là hiQ so với LinkedIn. Vì vậy, hiQ đã lấy dữ liệu từ LinkedIn để sử dụng cho mục đích thương mại. + +34 +00:02:22,620 --> 00:02:27,360 +Vì vậy, LinkedIn đã kiện họ và cuối cùng thua trong vụ kiện. + +35 +00:02:28,050 --> 00:02:29,250 +Dựa trên các vụ + +36 +00:02:29,280 --> 00:02:33,960 +kiện này, chúng tôi có một chút ý tưởng tốt hơn về điều gì là hợp pháp khi nói đến việc + +37 +00:02:33,960 --> 00:02:36,180 +cạo trang web và điều gì là không hợp pháp. + +38 +00:02:36,780 --> 00:02:41,460 +Luật pháp thực sự có vẻ ủng hộ việc thu thập dữ liệu web theo nghĩa + +39 +00:02:41,460 --> 00:02:43,350 +là bạn được phép thu thập + +40 +00:02:43,920 --> 00:02:47,430 +dữ liệu trang web miễn là bạn nghĩ về một vài điều. + +41 +00:02:48,090 --> 00:02:53,090 +Rất nhiều người đã viết về việc nạo web là hợp pháp dựa + +42 +00:02:53,370 --> 00:02:55,860 +trên trường hợp LinkedIn và hiQ. + +43 +00:02:56,250 --> 00:03:01,060 +Nhưng điều quan trọng cần nhớ là đây không phải là một kiểu tổng hợp, bạn có thể làm bất + +44 +00:03:01,300 --> 00:03:04,690 +cứ điều gì bạn muốn, quét dữ liệu của bất kỳ trang web nào. + +45 +00:03:05,320 --> 00:03:10,320 +Nó chỉ có nghĩa là dữ liệu có sẵn công khai và không có bản quyền có thể hợp + +46 +00:03:11,560 --> 00:03:16,390 +pháp để các công ty thu thập dữ liệu. Bây giờ, nếu bạn đang sử dụng dữ liệu này + +47 +00:03:16,420 --> 00:03:18,400 +một cách riêng tư giống như chúng tôi + +48 +00:03:18,400 --> 00:03:22,510 +đang tạo ra một số loại dịch vụ cho chính mình, thì điều đó không thực sự + +49 +00:03:22,510 --> 00:03:24,160 +quan trọng. Bạn chỉ là một người dùng. + +50 +00:03:24,820 --> 00:03:28,150 +Khó khăn xảy ra khi bạn đang cố gắng thương mại hóa dữ liệu + +51 +00:03:28,150 --> 00:03:32,590 +đó, khi bạn thành lập một doanh nghiệp và loại hình kinh doanh của bạn liên quan đến dữ + +52 +00:03:32,590 --> 00:03:35,890 +liệu của người khác. Đó là một chút của một khu vực màu xám. Bây giờ, những + +53 +00:03:35,950 --> 00:03:38,170 +điều mà chúng tôi chắc chắn biết là bạn + +54 +00:03:38,170 --> 00:03:40,720 +không thể thương mại hóa nội dung có bản quyền. + +55 +00:03:40,990 --> 00:03:45,790 +Vì vậy, nếu bạn thu thập dữ liệu từ YouTube và bạn đã thu thập dữ liệu video, bạn không thể chỉ + +56 +00:03:45,820 --> 00:03:50,820 +sử dụng video đó trên trang web của riêng mình. Điều đó vẫn không được phép vì video + +57 +00:03:51,040 --> 00:03:56,040 +đó có bản quyền và được tạo bởi người dùng YouTube và bản quyền thuộc về + +58 +00:03:56,650 --> 00:04:00,820 +người dùng đó, không phải bạn. Vì vậy, điều này vẫn là bất hợp pháp. + +59 +00:04:01,600 --> 00:04:05,620 +Điều này cũng có thể áp dụng cho những thứ khác như một bài đăng trên blog Medium + +60 +00:04:05,620 --> 00:04:09,310 +mà người khác đã viết hoặc một bản nhạc đang được lưu trữ trên Spotify. + +61 +00:04:09,760 --> 00:04:12,430 +Vì vậy nội dung có bản quyền bạn không thể thương mại hóa. + +62 +00:04:13,030 --> 00:04:17,110 +Điều thứ hai là bạn không thể quét dữ liệu đằng sau quá trình xác thực. + +63 +00:04:17,470 --> 00:04:21,100 +Vì vậy, nếu bạn phải đăng nhập vào Facebook để lấy dữ liệu, thì đó + +64 +00:04:21,310 --> 00:04:22,810 +là điều bất hợp pháp. + +65 +00:04:23,380 --> 00:04:27,460 +Và lý do cho điều này là khi bạn đăng ký với tư cách là người dùng + +66 +00:04:27,460 --> 00:04:30,400 +của bất kỳ dịch vụ nào trong số này như Facebook + +67 +00:04:30,820 --> 00:04:35,020 +hoặc Twitter hoặc Instagram, có một chính sách mà bạn đồng ý khi đăng ký nói rằng tôi + +68 +00:04:35,050 --> 00:04:39,610 +đồng ý không sử dụng dữ liệu này mà tôi thu được trên trang web này về mặt thương mại. + +69 +00:04:40,180 --> 00:04:43,120 +Tuy nhiên, dữ liệu không đứng sau xác thực, vì vậy bất + +70 +00:04:43,420 --> 00:04:46,720 +kỳ trang web nào bạn có thể truy cập như nó vốn có, chúng + +71 +00:04:47,140 --> 00:04:51,490 +không thể ràng buộc bạn với một chính sách vì bạn chưa đồng ý với bất kỳ điều gì. + +72 +00:04:51,970 --> 00:04:56,260 +Vì vậy, nếu trang web có dữ liệu mở mà bạn có thể truy cập mà không cần đăng + +73 +00:04:56,260 --> 00:05:00,430 +nhập và nội dung không phải là thứ có thể có bản quyền, thì đó là trò chơi + +74 +00:05:00,670 --> 00:05:03,640 +công bằng về mặt pháp lý. Bây giờ, chỉ vì nó + +75 +00:05:03,670 --> 00:05:07,780 +hợp pháp không có nghĩa là bạn thực sự có thể làm điều đó. + +76 +00:05:08,350 --> 00:05:13,350 +Rất nhiều trang web sẽ sử dụng captcha hoặc recaptcha để ngăn các bot như mã Python của chúng + +77 +00:05:13,750 --> 00:05:18,610 +tôi lấy dữ liệu từ trang web của họ. Mỗi lần, bạn đồng ý với một trong những hình ảnh + +78 +00:05:18,640 --> 00:05:21,850 +xác thực này, nó đang kiểm tra xem liệu bạn có thực sự là + +79 +00:05:21,850 --> 00:05:24,100 +người thật hay bạn chỉ là một đoạn mã đang + +80 +00:05:24,340 --> 00:05:28,840 +cố gắng truy cập vào dữ liệu của họ. Captcha là phiên bản cũ mà bạn + +81 +00:05:28,840 --> 00:05:33,340 +có thể nhập một số chữ cái ngoằn ngoèo và recaptcha là phiên bản mới mà + +82 +00:05:33,340 --> 00:05:36,130 +bạn chỉ cần đánh dấu vào một hộp kiểm. + +83 +00:05:36,460 --> 00:05:38,560 +Và nó thực sự thú vị về cách nó hoạt động. + +84 +00:05:39,400 --> 00:05:43,210 +Nó xem xét những thứ như cách con chuột của bạn tiếp cận hộp kiểm, + +85 +00:05:43,210 --> 00:05:47,020 +cách bạn có thể rung một chút trước khi thực sự kiểm tra nó và + +86 +00:05:47,260 --> 00:05:51,280 +những thứ khác như cookie của bạn và dữ liệu lưu trữ mà chúng có trên bạn. + +87 +00:05:51,970 --> 00:05:56,170 +Về cơ bản, dịch vụ này được các trang web sử dụng để ngăn mọi người + +88 +00:05:56,230 --> 00:06:00,590 +lấy dữ liệu của họ bằng bot. Điều khác cần nhớ là, bạn biết + +89 +00:06:00,830 --> 00:06:03,560 +đấy, nếu bạn bị ai đó như LinkedIn kiện vì + +90 +00:06:03,560 --> 00:06:08,420 +bạn đang sử dụng dữ liệu của họ và bạn đang xây dựng doanh nghiệp trên đó như + +91 +00:06:08,450 --> 00:06:10,970 +hiQ, thì bất cứ lúc nào bạn cũng có + +92 +00:06:10,970 --> 00:06:14,060 +thể bị kiện tụng tốn kém và bạn sẽ phải trả + +93 +00:06:14,450 --> 00:06:18,620 +rất nhiều tiền cho luật sư để tranh chấp điều này và thực sự để + +94 +00:06:18,620 --> 00:06:20,420 +chống lại họ trước tòa. + +95 +00:06:20,930 --> 00:06:25,400 +Trừ khi bạn có đủ tiền để làm luật sư và chống lại một công ty như LinkedIn, điều thực sự + +96 +00:06:26,000 --> 00:06:29,810 +quan trọng là phải biết những tác động của việc thu thập dữ liệu web là gì, đặc + +97 +00:06:29,930 --> 00:06:33,590 +biệt là khi bạn đang bán dữ liệu đó như một phần của doanh nghiệp của mình. + +98 +00:06:34,250 --> 00:06:37,040 +Nhưng ngoài khía cạnh pháp lý của mọi thứ, một phần + +99 +00:06:37,190 --> 00:06:40,940 +khác mà bạn thực sự nên nghĩ đến là đạo đức của việc nạo web. + +100 +00:06:41,390 --> 00:06:44,810 +Điều này về cơ bản là gạt những gì là hợp pháp và bất hợp + +101 +00:06:45,020 --> 00:06:46,640 +pháp sang một bên, nhưng hãy + +102 +00:06:46,640 --> 00:06:51,640 +suy nghĩ nhiều hơn về điều gì là đúng và điều gì sai bởi vì giả sử rằng bạn đã xây dựng + +103 +00:06:51,770 --> 00:06:56,000 +một trang web và bạn có một số loại bot liên tục quét nó để lấy dữ liệu, + +104 +00:06:56,300 --> 00:06:58,730 +dữ liệu mà bạn biết đấy, đã được tạo ra + +105 +00:06:58,970 --> 00:07:03,950 +bởi chính người dùng của bạn, điều đó thực sự quý giá và bạn thậm chí có thể tính phí cho nó, + +106 +00:07:03,980 --> 00:07:07,400 +vậy thì, liệu ai đó làm điều đó có thực sự đúng đắn không? + +107 +00:07:07,940 --> 00:07:11,780 +Vì vậy, tôi thường tuân theo quy tắc nếu tôi không muốn điều gì đó xảy ra với mình, + +108 +00:07:11,840 --> 00:07:16,160 +tôi cố gắng không làm điều đó với người khác. Về mặt đạo đức, một số + +109 +00:07:16,170 --> 00:07:18,470 +điều tôi khuyên bạn nên tuân thủ là + +110 +00:07:18,770 --> 00:07:21,800 +nếu bạn bắt gặp một trang web và họ có + +111 +00:07:21,860 --> 00:07:26,210 +một API công khai mà chúng tôi đã tìm hiểu và chúng tôi biết cách + +112 +00:07:26,210 --> 00:07:30,770 +sử dụng, thì hãy luôn sử dụng API. Nếu nó yêu cầu một ứng dụng, sau đó áp dụng cho nó. + +113 +00:07:31,100 --> 00:07:35,570 +Đừng chỉ tiếp tục và cố gắng lấy dữ liệu của họ khi bạn đã có một lộ trình để sử + +114 +00:07:35,570 --> 00:07:37,310 +dụng và truy cập dữ liệu của họ. + +115 +00:07:38,480 --> 00:07:42,590 +Điều thứ hai là tôn trọng chủ sở hữu web, bởi vì bạn biết đấy, bạn không + +116 +00:07:42,590 --> 00:07:46,550 +muốn ai đó truy cập vào trang web của mình hàng triệu lần một giây, có + +117 +00:07:46,610 --> 00:07:49,520 +khả năng làm cho trang web của bạn bị sập hoặc nó + +118 +00:07:49,670 --> 00:07:51,680 +có thể bị coi là một cuộc + +119 +00:07:51,680 --> 00:07:55,310 +tấn công DDoS ảnh hưởng đến những người dùng khác đang sử dụng trang web. + +120 +00:07:56,090 --> 00:07:57,290 +Khi bạn ở trên một + +121 +00:07:57,590 --> 00:08:02,360 +trang web, chúng thực sự cung cấp một cách để bạn phân biệt đâu là trang bạn có thể cạo và + +122 +00:08:02,360 --> 00:08:02,810 +đâu + +123 +00:08:02,810 --> 00:08:07,810 +là thứ bạn không thể. Ở cuối URL sau. com hoặc. co. uk, nếu bạn đặt + +124 +00:08:08,930 --> 00:08:13,220 +một dấu gạch chéo về phía trước và đặt rô bốt. txt, bạn có thể thấy đây là + +125 +00:08:13,220 --> 00:08:18,220 +lời khuyên mà họ dành cho bất kỳ bot nào có khả năng làm hỏng trang web + +126 +00:08:18,260 --> 00:08:19,093 +của họ. + +127 +00:08:19,610 --> 00:08:24,610 +Tác nhân người dùng là người đang cạo, người hoặc bot đang cạo và nó cho bạn + +128 +00:08:25,280 --> 00:08:27,890 +biết những điều mà nó không cho phép. + +129 +00:08:28,220 --> 00:08:32,690 +Vì vậy, nó không muốn bạn truy cập vào / bỏ phiếu? , /Đáp lại? / đã nộp? , / chủ đề ?. + +130 +00:08:32,690 --> 00:08:35,299 +Vì vậy, về cơ bản + +131 +00:08:35,600 --> 00:08:39,950 +bất kỳ điểm cuối nào trong số này đều là những điểm họ không thực sự muốn bạn sử dụng. Ví dụ, ở đây tôi đã truy cập vào / + +132 +00:08:39,950 --> 00:08:41,840 +reply? + +133 +00:08:41,840 --> 00:08:45,050 +đó là một cách để đăng nhập và trả lời một bình luận cụ thể. + +134 +00:08:45,380 --> 00:08:48,890 +Bây giờ đó thực sự không nên là một loại hành động của bot vì khi đó + +135 +00:08:49,280 --> 00:08:51,740 +nó có nghĩa là dữ liệu được tạo hoặc các + +136 +00:08:51,740 --> 00:08:54,230 +câu trả lời ở đây sẽ được tự động hóa, phải không? + +137 +00:08:54,530 --> 00:08:57,690 +Bạn thực sự muốn con người bình luận và + +138 +00:08:57,690 --> 00:09:01,980 +trả lời về các bài báo hơn là một số loại rô bốt. + +139 +00:09:01,980 --> 00:09:02,813 +Vì vậy, đây là những đường dẫn mà họ không muốn bạn truy cập với tư cách là một bot. + +140 +00:09:03,660 --> 00:09:07,590 +Và cuối cùng, nó thậm chí còn cho bạn biết độ trễ thu thập thông tin. + +141 +00:09:08,040 --> 00:09:10,890 +Vì vậy, đây là số giây mà + +142 +00:09:10,920 --> 00:09:15,630 +bạn nên để lại giữa mỗi lần bạn truy cập trang web. + +143 +00:09:15,630 --> 00:09:16,463 +Nếu chúng ta đang + +144 +00:09:17,250 --> 00:09:22,200 +viết mã Python và chúng ta đang sử dụng Beautiful Soup và phản hồi để thu thập dữ liệu từ YCombinator, chúng ta có thể có được + +145 +00:09:22,200 --> 00:09:24,210 +mã đó để chạy từng phần của giây phải không? + +146 +00:09:24,480 --> 00:09:28,590 +Tôi chỉ có thể viết một vòng lặp for + +147 +00:09:28,590 --> 00:09:33,450 +và chỉ cần lấy nó để tiếp tục ghi lại nhiều lần. + +148 +00:09:33,450 --> 00:09:34,283 +Nhưng điều đó + +149 +00:09:34,350 --> 00:09:38,880 +có nghĩa là bạn đang thêm rất nhiều lưu lượng truy cập bổ sung và nhiều nhu + +150 +00:09:38,880 --> 00:09:43,560 +cầu bổ sung trên máy chủ của họ, điều này có thể có nghĩa là người dùng thực, + +151 +00:09:43,560 --> 00:09:48,560 +người thực muốn truy cập trang web của họ có thể không thực hiện được với tốc độ nhanh. Vì vậy, đây là lý do tại sao khi nhiều người truy cập vào cùng một trang + +152 +00:09:48,780 --> 00:09:51,090 +web, nói rằng + +153 +00:09:51,120 --> 00:09:53,880 +khi một vé mới được phát hành cho Glastonbury + +154 +00:09:53,910 --> 00:09:58,910 +hoặc một buổi hòa nhạc lớn nào đó, trang web đó có thể ngừng hoạt động. + +155 +00:09:59,100 --> 00:10:01,950 +Đó là bởi vì rất nhiều máy chủ không thể đáp ứng được quá nhiều nhu cầu. + +156 +00:10:02,010 --> 00:10:05,430 +Và khi nhu cầu đó đến từ vòng lặp for, thì + +157 +00:10:05,850 --> 00:10:08,070 +bạn có thể tưởng tượng rằng bạn + +158 +00:10:08,340 --> 00:10:12,150 +chỉ đang thêm rất nhiều công việc bổ sung vào máy chủ web. Vì vậy, hãy luôn tôn trọng độ trễ thu thập thông tin của chúng nếu bạn nhìn + +159 +00:10:12,150 --> 00:10:15,480 +thấy một trong các rô bốt. txt, và ngay cả khi bạn không nhìn thấy, chỉ cần cố + +160 +00:10:15,480 --> 00:10:20,190 +gắng giới hạn tỷ lệ của bạn để bạn không sử dụng tối đa máy chủ của họ. + +161 +00:10:20,280 --> 00:10:24,450 +Tôi khuyên bạn không nên cạo nhiều hơn một lần một phút. + +162 +00:10:24,840 --> 00:10:27,450 +YCombinator của robot. txt thực sự khá dễ dãi. + +163 +00:10:28,200 --> 00:10:32,340 +Nó cho phép bạn làm bất cứ điều + +164 +00:10:32,370 --> 00:10:35,430 +gì bạn muốn, nhưng điều đó không đúng với tất cả các trang web. + +165 +00:10:35,760 --> 00:10:37,950 +Nếu bạn nhìn vào các robot. txt cho LinkedIn, bạn có thể thấy rằng họ thực sự không muốn + +166 +00:10:38,160 --> 00:10:40,260 +bất kỳ ai cạo nó. + +167 +00:10:40,590 --> 00:10:43,770 +Có một chút biệt ngữ pháp lý, có rất nhiều điều không tốt mà + +168 +00:10:43,770 --> 00:10:45,450 +bạn có thể thấy, phải không? + +169 +00:10:45,480 --> 00:10:49,470 +Đây có lẽ không phải là một trang web mà tôi sẽ thu thập dữ + +170 +00:10:49,950 --> 00:10:53,820 +liệu của họ và cố gắng xây dựng một công ty xung quanh. + +171 +00:10:53,820 --> 00:10:54,690 +Vì vậy, hãy nhớ rằng đây + +172 +00:10:55,620 --> 00:10:59,940 +là một đoạn văn bản mà chủ sở hữu trang web đã viết cho bạn xem để biết những gì bạn có thể làm và bạn không thể làm với trang web của họ. + +173 +00:11:00,180 --> 00:11:04,920 +Vì vậy, trước khi bạn tìm kiếm một trang web, hãy luôn truy cập vào thư mục gốc của URL của chúng và + +174 +00:11:05,280 --> 00:11:06,990 +kiểm tra các rô bốt của chúng. txt và tuân theo các quy tắc ứng + +175 +00:11:07,320 --> 00:11:12,320 +xử đạo đức khi bạn đang cố gắng thương mại hóa một dự án. + +176 +00:11:14,490 --> 00:11:18,420 +Vì vậy, đây chỉ là mẹo nhanh về luật và đạo đức + +177 +00:11:18,810 --> 00:11:22,770 +của việc cạo trang web để bạn không gặp rắc rối trong tương lai. + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 100 Movies that You Must Watch.mp4 b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 100 Movies that You Must Watch.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..362ccee3a490a9857495dd10dd53478eba96ac53 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 100 Movies that You Must Watch.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80fdd965e0ca671a45ca6be940a2879db0489e1c22a34f24b9932bf2c3f2cb3f +size 133142770 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 100 Movies that You Must Watch_vi.srt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 100 Movies that You Must Watch_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..d2fba7a038cc223a962290bfcc98cb3181ef8ea0 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 100 Movies that You Must Watch_vi.srt @@ -0,0 +1,648 @@ +1 +00:00:00,690 --> 00:00:01,859 +Bây giờ đây là một câu hỏi. + +2 +00:00:02,310 --> 00:00:07,310 +Bạn đã bao giờ rơi vào tình huống là buổi tối và bạn muốn xem một bộ + +3 +00:00:07,920 --> 00:00:10,710 +phim, nhưng bạn không biết phải xem gì? + +4 +00:00:11,160 --> 00:00:15,000 +Giống như không có ý tưởng nào nảy ra trong đầu bạn và mọi người đang ngồi xung quanh + +5 +00:00:15,000 --> 00:00:16,500 +TV, như, chúng ta phải làm gì? + +6 +00:00:17,400 --> 00:00:22,400 +Vậy điều gì sẽ xảy ra nếu chúng tôi có danh sách 100 bộ phim hay nhất mọi thời đại và bạn chọn một bộ + +7 +00:00:25,320 --> 00:00:26,153 +phim từ đó? + +8 +00:00:26,700 --> 00:00:31,700 +Vì vậy, gần đây tôi đã xem qua bài viết này về đế chế, nơi họ liệt kê + +9 +00:00:32,040 --> 00:00:34,590 +100 bộ phim hay nhất mọi thời đại. + +10 +00:00:35,220 --> 00:00:40,220 +Và bạn có thể thấy rằng nó tăng từ 100 xuống còn một. + +11 +00:00:41,820 --> 00:00:45,960 +Đây được cho là những bộ phim được đánh giá cao nhất từng được + +12 +00:00:46,440 --> 00:00:51,440 +sản xuất và tôi luôn muốn xem hết 100 bộ phim trong số đó và kiểm + +13 +00:00:51,810 --> 00:00:56,790 +tra từng bộ phim khi đi cùng. Vì vậy, đây là những gì chúng tôi sẽ làm cho dự án cuối cùng của chúng tôi ngày hôm nay. + +14 +00:00:57,180 --> 00:01:02,040 +Bạn sẽ tìm thấy từ trang web này 100 bộ phim và bạn sẽ sử dụng + +15 +00:01:02,430 --> 00:01:06,570 +mã Python để tạo một tệp văn bản có tên là phim. văn bản liệt kê chúng theo thứ tự, bắt đầu từ một. + +16 +00:01:06,570 --> 00:01:11,040 +Hãy để ý xem mỗi trong số này chỉ là tiêu đề của mỗi bộ phim này. + +17 +00:01:11,760 --> 00:01:16,760 +Về cơ bản, đó là phần này mà bạn muốn. + +18 +00:01:17,730 --> 00:01:20,160 +Và bởi vì danh sách bắt + +19 +00:01:20,730 --> 00:01:23,520 +đầu từ 100, bạn phải tìm cách lật + +20 +00:01:23,790 --> 00:01:27,090 +nó theo cách khác để bắt đầu từ một. Nhưng thực chất đây là mục tiêu. + +21 +00:01:27,090 --> 00:01:30,270 +Và đây là dự án cho ngày hôm nay. + +22 +00:01:30,450 --> 00:01:32,910 +Bạn sẽ phải sử dụng những gì bạn đã học về cách tìm kiếm trên web, cũng + +23 +00:01:32,970 --> 00:01:35,190 +như những thứ khác mà bạn đã học trong suốt quá trình về Python. + +24 +00:01:35,460 --> 00:01:38,580 +Tạm dừng video ngay bây giờ và cố gắng hoàn thành thử thách này. + +25 +00:01:39,330 --> 00:01:42,540 +1: Được rồi. + +26 +00:01:45,230 --> 00:01:45,770 +0: Vì vậy, ở + +27 +00:01:45,770 --> 00:01:49,340 +đây tôi đã tạo một dự án trống hoàn toàn mới, mà tôi gọi là 100 phim hàng đầu, nhưng tất nhiên, điều đó không quan trọng. + +28 +00:01:49,370 --> 00:01:52,670 +Nhưng trong chính. py là nơi chúng tôi sẽ làm tất cả những việc nghiêm túc. + +29 +00:01:53,210 --> 00:01:56,900 +Vì vậy, điều đầu tiên chúng ta cần là sao chép URL. + +30 +00:01:57,200 --> 00:02:01,160 +Và tại thời điểm bạn đang thực hiện dự án này, URL này có thể thay đổi. + +31 +00:02:01,670 --> 00:02:05,870 +Vì vậy, đừng lấy nó từ đây. Thay vào đó, hãy truy cập tài nguyên của khóa học và sao chép + +32 +00:02:06,110 --> 00:02:08,090 +URL từ đó. + +33 +00:02:08,360 --> 00:02:11,480 +Khi bạn đã có URL, chúng tôi sẽ dán nó vào + +34 +00:02:12,380 --> 00:02:13,790 +chính của chúng tôi. py và lưu nó dưới dạng một hằng số. + +35 +00:02:13,820 --> 00:02:18,020 +Ngoài ra, chúng ta sẽ phải nhập + +36 +00:02:18,710 --> 00:02:21,980 +tất cả những thứ chúng ta cần, bao gồm cả yêu + +37 +00:02:22,010 --> 00:02:23,480 +cầu và cả mô-đun + +38 +00:02:23,870 --> 00:02:27,500 +bs4 nơi chúng ta có thể nắm giữ Beautiful Soup của mình. + +39 +00:02:28,790 --> 00:02:31,280 +Tôi sẽ cần cài đặt cả hai thứ này vì tôi chưa có chúng. + +40 +00:02:33,980 --> 00:02:37,640 +Vì vậy, tôi sẽ nhấp vào dòng chữ nguệch ngoạc màu + +41 +00:02:38,510 --> 00:02:42,440 +đỏ, cài đặt các yêu cầu và cũng cài đặt súp đẹp. Khi tất cả đã hoàn tất, sau đó các dòng chữ nguệch ngoạc màu đỏ + +42 +00:02:43,070 --> 00:02:47,330 +của tôi sẽ biến mất và bây giờ + +43 +00:02:47,390 --> 00:02:52,390 +tôi có thể bắt đầu sử dụng mô-đun yêu cầu của mình để thực hiện yêu cầu nhận URL + +44 +00:02:52,880 --> 00:02:53,870 +cụ thể này. Và tôi sẽ + +45 +00:02:53,870 --> 00:02:58,870 +lưu câu trả lời mà tôi nhận lại làm phản hồi. + +46 +00:02:59,100 --> 00:03:01,750 +Các tệp HTML thực tế, vì vậy HTML của trang + +47 +00:03:03,280 --> 00:03:05,200 +web, thực sự đang được phản hồi. chữ. + +48 +00:03:05,200 --> 00:03:10,200 +Vì vậy, đây sẽ là văn bản HTML thô, và đây là những + +49 +00:03:11,560 --> 00:03:14,440 +gì tôi sẽ sử dụng để sử dụng Beautiful Soup để phân tích cú pháp. + +50 +00:03:14,800 --> 00:03:18,820 +Vì vậy, bây giờ chúng tôi làm súp và chúng tôi sẽ sử + +51 +00:03:19,480 --> 00:03:24,010 +dụng Beautiful Soup và chúng tôi sẽ phân tích cú pháp trong trang web của + +52 +00:03:24,010 --> 00:03:26,110 +chúng tôi HTML và cả html. phân tích cú pháp là phương pháp mà chúng tôi sẽ sử dụng để phân + +53 +00:03:26,530 --> 00:03:29,170 +tích cú pháp thông qua trang web này. + +54 +00:03:29,620 --> 00:03:33,220 +Bây giờ chúng ta đã làm xong món súp, hãy tiếp tục và in + +55 +00:03:34,360 --> 00:03:35,710 +súp của chúng tôi + +56 +00:03:35,740 --> 00:03:40,720 +ra theo định dạng được xác định trước để chúng ta có thể xem nó trông như thế nào. + +57 +00:03:40,720 --> 00:03:41,980 +Vì vậy, hãy chạy chính của chúng tôi. py và chúng ta + +58 +00:03:42,160 --> 00:03:46,660 +có thể thấy rằng về cơ bản chúng ta + +59 +00:03:46,660 --> 00:03:49,750 +đã có toàn bộ HTML của trang web được in ra ở đây. Bây giờ đến phần mà chúng ta cần sử dụng trình kiểm tra Google Chrome của mình. + +60 +00:03:49,750 --> 00:03:54,750 +Phần mà chúng tôi muốn từ trang web này chỉ là những dòng này. Tất nhiên bây giờ, nếu chúng ta không biết + +61 +00:03:56,020 --> 00:04:00,700 +cách viết mã, chúng ta sẽ ở đây + +62 +00:04:00,730 --> 00:04:02,500 +sao chép và dán hàng + +63 +00:04:02,740 --> 00:04:06,490 +giờ liên tục, và chúng ta sẽ chết vì buồn chán hoặc chúng ta + +64 +00:04:06,910 --> 00:04:11,890 +sẽ bị chấn thương do căng thẳng lặp đi lặp lại do sao chép và dán quá nhiều. Nhưng bởi vì chúng tôi biết mã, chúng tôi biết tốt hơn thế. + +65 +00:04:11,890 --> 00:04:15,760 +Vì vậy, chúng ta hãy nắm giữ phần mà chúng ta muốn. Hãy nhấp chuột phải và + +66 +00:04:15,910 --> 00:04:19,510 +nhấp vào kiểm tra. Bây giờ, chúng ta có thể thấy rằng nó sống bên + +67 +00:04:19,510 --> 00:04:22,270 +trong và h3 với lớp tiêu đề. + +68 +00:04:22,270 --> 00:04:27,220 +Bây giờ chúng ta chỉ cần kiểm tra một trong những phần khác mà chúng tôi + +69 +00:04:27,790 --> 00:04:31,630 +muốn và chỉ cần đảm bảo rằng chúng có cùng cấu trúc. + +70 +00:04:31,630 --> 00:04:33,880 +Vì vậy, đây cũng là bên trong một h3 với lớp tiêu đề. + +71 +00:04:34,330 --> 00:04:38,470 +Vì vậy, về cơ bản, miễn là chúng ta có thể cạo + +72 +00:04:38,950 --> 00:04:43,180 +toàn bộ trang này và lấy tất cả h3 với lớp tiêu đề + +73 +00:04:43,210 --> 00:04:48,040 +và lấy văn bản chứa bên trong phần tử h3, thì chúng ta sẽ là vàng. Hãy tiếp tục và làm điều đó. + +74 +00:04:48,070 --> 00:04:52,120 +Vì vậy, thay vì in súp của chúng tôi. chuẩn bị trước, tôi sẽ khai + +75 +00:04:52,600 --> 00:04:55,120 +thác vào súp + +76 +00:04:55,150 --> 00:04:57,550 +và tôi sẽ nói tìm tất cả. Thứ mà tôi muốn tìm có tên + +77 +00:04:57,550 --> 00:05:02,550 +thẻ là h3 và nó có lớp tiêu đề. + +78 +00:05:04,360 --> 00:05:07,300 +Vì vậy, tất cả đều đến từ việc kiểm tra của chúng tôi ngay tại đây. + +79 +00:05:08,080 --> 00:05:11,710 +Điều này sẽ giúp chúng ta có được danh sách tất cả các phần + +80 +00:05:12,400 --> 00:05:15,940 +tử h3 với lớp này và chúng ta có thể lưu nó vào + +81 +00:05:15,970 --> 00:05:17,620 +một biến gọi là all_movies. + +82 +00:05:18,160 --> 00:05:23,110 +Hãy in all_movies và xem những gì chúng ta nhận được. + +83 +00:05:23,980 --> 00:05:28,450 +Bây giờ, chúng tôi đã có một danh sách tất cả các h3 của + +84 +00:05:30,190 --> 00:05:33,430 +chúng tôi, và bây giờ chúng tôi sẽ tiến thêm + +85 +00:05:33,970 --> 00:05:38,970 +một bước nữa và tìm nạp văn bản từ bên trong các phần tử h3 này. Chúng tôi làm điều đó bằng cách sử dụng + +86 +00:05:41,380 --> 00:05:45,340 +phương thức getText. Nhưng chúng tôi không thể làm điều đó trong danh sách, vì vậy + +87 +00:05:45,640 --> 00:05:49,000 +chúng tôi sẽ sử dụng khả năng hiểu danh sách. + +88 +00:05:49,030 --> 00:05:51,820 +Vì vậy, chúng ta sẽ nói rằng movie_titles ngang bằng với + +89 +00:05:52,390 --> 00:05:57,390 +một danh sách mới và trong danh sách này, mỗi mục sẽ được hình thành từ một bộ phim trong + +90 +00:05:58,850 --> 00:05:59,780 +danh sách all_movies. + +91 +00:05:59,930 --> 00:06:04,930 +Và mục mới này sẽ được tạo bằng cách lấy từng bộ phim + +92 +00:06:09,710 --> 00:06:13,970 +trong danh sách và sau đó gọi getText trên đó. Bây giờ, nếu tôi tiếp tục và in movie_titles của mình + +93 +00:06:13,970 --> 00:06:17,900 +thay vì all_movies, thì + +94 +00:06:17,900 --> 00:06:21,380 +đây là những gì chúng tôi nhận được. + +95 +00:06:21,410 --> 00:06:25,940 +Chúng tôi nhận được tất cả các tiêu đề của tất cả 100 bộ phim. + +96 +00:06:25,940 --> 00:06:29,930 +Bây giờ chúng tôi muốn đảo ngược danh sách này để chúng + +97 +00:06:32,120 --> 00:06:37,120 +tôi có thể đưa nó vào một tệp văn bản bắt đầu từ 1, giảm xuống 100. + +98 +00:06:38,060 --> 00:06:40,490 +Vì vậy, có một số cách mà chúng tôi có thể làm điều này. + +99 +00:06:41,000 --> 00:06:43,070 +Một là chúng ta có thể sử dụng toán tử mối nối Python. + +100 +00:06:43,130 --> 00:06:46,520 +Vì vậy, chúng tôi thêm một tập hợp các dấu ngoặc vuông và + +101 +00:06:46,910 --> 00:06:49,100 +sau đó chúng tôi thêm một :: + +102 +00:06:49,520 --> 00:06:52,220 +- 1, và điều này sẽ đảo ngược thứ tự. Và như mọi khi, bạn có thể tìm hiểu + +103 +00:06:54,650 --> 00:06:58,400 +thông tin này bằng Google + +104 +00:06:58,760 --> 00:07:03,260 +hoặc thông qua những gì bạn đã học trước đây trong các bài học trước. Vì vậy, đây là cú pháp mà chúng tôi đang sử dụng, xuất + +105 +00:07:03,260 --> 00:07:07,700 +phát từ toán tử lát cắt + +106 +00:07:08,180 --> 00:07:12,380 +nơi chúng tôi có điểm bắt đầu, điểm dừng và một bước. Vì vậy, trong trường hợp này, điểm bắt đầu là ở đầu danh sách, điểm dừng ở cuối + +107 +00:07:12,680 --> 00:07:15,620 +danh sách nên chúng ta + +108 +00:07:15,800 --> 00:07:18,410 +không phải chỉ định những nguyên nhân đó là mặc định, + +109 +00:07:18,470 --> 00:07:20,330 +và sau đó về cơ bản bước là + +110 +00:07:20,360 --> 00:07:22,940 +-1 và cú pháp này sẽ đảo ngược danh sách đó. + +111 +00:07:23,360 --> 00:07:28,360 +Ngoài ra, bây giờ, bạn cũng có thể sử dụng vòng lặp for trong đó bạn tạo một + +112 +00:07:31,040 --> 00:07:32,480 +số loại n trong + +113 +00:07:32,480 --> 00:07:37,480 +một phạm vi và phạm vi đó một lần nữa, có thể bắt đầu, dừng và bước. + +114 +00:07:40,370 --> 00:07:44,150 +Vì vậy, bạn có thể bắt đầu ở cuối, vì vậy độ dài + +115 +00:07:44,630 --> 00:07:46,820 +của movie_titles-1 của chúng tôi vì + +116 +00:07:46,850 --> 00:07:50,930 +hãy nhớ danh sách trong Python bắt đầu được đánh số từ 0. + +117 +00:07:51,020 --> 00:07:55,370 +Vì vậy, mục cuối cùng thực sự là ở tổng số trừ một. + +118 +00:07:55,730 --> 00:08:00,680 +Và tiếp theo sẽ là kết thúc, sẽ là số không, và + +119 +00:08:01,370 --> 00:08:05,690 +cuối cùng sẽ là bước, mỗi lần trừ đi một. + +120 +00:08:05,690 --> 00:08:09,770 +Vì vậy, lần này chúng ta bắt đầu từ cuối danh + +121 +00:08:09,890 --> 00:08:13,790 +sách, quay lại đầu, từng bước trừ đi một. Và theo cách này, nếu chúng ta in n, bạn + +122 +00:08:13,790 --> 00:08:18,620 +có thể thấy rằng điều này + +123 +00:08:18,620 --> 00:08:19,880 +sẽ cung cấp + +124 +00:08:19,940 --> 00:08:24,940 +cho chúng ta về cơ bản tất cả các cách từ 99 xuống 1. + +125 +00:08:26,090 --> 00:08:26,923 +Và chúng ta + +126 +00:08:27,590 --> 00:08:32,590 +có thể sử dụng nó để khai thác tiêu đề phim của mình và nắm giữ từng mục ở chỉ mục n. + +127 +00:08:35,330 --> 00:08:36,620 +Và bởi vì phạm + +128 +00:08:41,110 --> 00:08:45,580 +vi thực sự không vượt quá mức kết thúc, chúng tôi thực sự phải + +129 +00:08:45,610 --> 00:08:50,110 +đặt -1 ở đó nếu chúng tôi muốn lấy số cuối cùng là số 100. Và bạn cũng sẽ nhận thấy rằng có một chút lỗi chính tả ở + +130 +00:08:50,110 --> 00:08:55,000 +đây cho số 93, và đây + +131 +00:08:55,200 --> 00:08:58,110 +thực sự không phải là lỗi của chúng tôi. + +132 +00:08:58,530 --> 00:09:00,990 +Trên thực tế, trong bài viết gốc của đế chế. + +133 +00:09:00,990 --> 00:09:04,380 +Họ thực sự đã vặn vẹo và đây phải là số 93. Bởi vì chúng tôi đang thu thập dữ liệu, chúng + +134 +00:09:04,440 --> 00:09:09,440 +tôi không thể thực sự kén chọn. + +135 +00:09:10,650 --> 00:09:12,150 +Chúng tôi sẽ kết thúc với những gì chúng tôi kết thúc. + +136 +00:09:12,480 --> 00:09:15,090 +Vì vậy, tôi sẽ chọn phương pháp mà chúng tôi + +137 +00:09:15,870 --> 00:09:20,870 +thực sự lấy tiêu đề phim và sau đó chúng tôi sử dụng mối nối để giữ nó ngược lại. + +138 +00:09:20,910 --> 00:09:25,910 +Và tôi sẽ gọi đó là những bộ phim. + +139 +00:09:27,090 --> 00:09:29,460 +Và bây giờ chúng ta có thể tạo tệp văn bản mới của mình. Vì vậy, với việc mở, chúng tôi + +140 +00:09:30,690 --> 00:09:35,640 +sẽ tạo một tệp mới có tên là phim. txt, và tất nhiên chúng ta phải + +141 +00:09:35,730 --> 00:09:38,670 +thay đổi chế + +142 +00:09:39,090 --> 00:09:44,090 +độ ghi mode hai để chúng ta thực sự có thể tạo tệp này. Và sau đó vì tập tin này + +143 +00:09:44,490 --> 00:09:47,370 +phim. txt không tồn tại, khi dòng này chạy, + +144 +00:09:47,430 --> 00:09:51,810 +nó sẽ tạo tệp đó và sau đó chúng ta sẽ ghi vào nó. + +145 +00:09:51,810 --> 00:09:55,230 +Vì vậy, chúng ta sẽ nói tập tin. viết và chúng tôi sẽ viết từng dòng trong danh sách các bộ phim + +146 +00:09:55,230 --> 00:09:57,060 +của chúng tôi. + +147 +00:09:57,510 --> 00:10:02,510 +Một lần nữa chúng ta có thể sử dụng vòng lặp for để + +148 +00:10:03,060 --> 00:10:05,160 +đối với phim trong phim, + +149 +00:10:05,460 --> 00:10:08,370 +hãy tiếp tục và viết tên của + +150 +00:10:08,850 --> 00:10:13,850 +phim rồi cho phép thêm toán tử dòng mới, \ n, để chúng + +151 +00:10:16,800 --> 00:10:20,040 +ta đưa từng phim vào dòng riêng của nó. + +152 +00:10:20,040 --> 00:10:25,040 +Bây giờ, cuối cùng, nếu tôi chạy mã này, thì nó sẽ tạo ra + +153 +00:10:26,250 --> 00:10:28,710 +các bộ phim của chúng ta. txt. Và nếu tôi nhìn vào nó, bạn có + +154 +00:10:28,830 --> 00:10:32,790 +thể thấy nó + +155 +00:10:32,820 --> 00:10:37,820 +hiện có tất cả 100 bộ phim được liệt kê ở đây từ 1 đến 100. + +156 +00:10:38,250 --> 00:10:39,083 +Và bây giờ bạn có + +157 +00:10:39,900 --> 00:10:43,710 +thể xem qua danh sách này và xóa những video bạn đã xem rồi tiếp tục xem qua phần còn lại của danh sách. + +158 +00:10:43,710 --> 00:10:47,970 +Tôi hy vọng bạn đã vui vẻ khi thử tự mình tìm kiếm trang web trong dự án này. + +159 +00:10:48,660 --> 00:10:52,470 +Vì vậy, đó là tất cả cho ngày hôm nay. Hãy xem những gì bạn đã làm. + +160 +00:10:52,740 --> 00:10:56,100 +Nếu có bất kỳ điều gì khó + +161 +00:10:56,130 --> 00:11:00,600 +hiểu về lớp học hoặc ID hoặc HTML, hãy nhớ xem lại một số bài học trong bốn ngày trước. + +162 +00:11:00,750 --> 00:11:04,410 +Đó là tất cả cho ngày hôm nay. + diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Course-Fixes-Report-an-Issue.url b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Empires-Top-100-Movies-of-All-Time-from-Web-Archive-.url b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Empires-Top-100-Movies-of-All-Time-from-Web-Archive-.url new file mode 100644 index 0000000000000000000000000000000000000000..982b280f61016af521524354cf8aa2fe2162b473 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Empires-Top-100-Movies-of-All-Time-from-Web-Archive-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://web.archive.org/web/20200518073855/https://www.empireonline.com/movies/features/best-movies-2/ \ No newline at end of file diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Solution-100-movies-to-watch-end.zip b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Solution-100-movies-to-watch-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..c8267ae0dda34c95ced70fe4fd69ac83d0c0db25 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Solution-100-movies-to-watch-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b4f74e041081655431a0d16ed1ced7046d362a93302f0db432558db48dabbbd +size 2969 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Starting-Code-100-movies-to-watch-start.zip b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Starting-Code-100-movies-to-watch-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..50711891c438a27c7b5dfe644c2b970f08496d0e --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/007 Starting-Code-100-movies-to-watch-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8b800341097e52d1d41c6a4acc403d5baea11190fd38866bd7fc9d5b171f392 +size 1220 diff --git a/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/external-links.txt b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..de5216ae66d42142659d1094716fca4524602981 --- /dev/null +++ b/part3/45 - Day 45 - Intermediate+ Web Scraping with Beautiful Soup/external-links.txt @@ -0,0 +1,15 @@ + +002 Beautiful-Soup-Documentation +https://www.crummy.com/software/BeautifulSoup/bs4/doc/ + +005 Y-Combinator-Hacker-News +https://news.ycombinator.com/ + +005 SOLUTION +https://replit.com/@appbrewery/Day-45-Hacker-News-Solution + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +007 Empires-Top-100-Movies-of-All-Time-from-Web-Archive- +https://web.archive.org/web/20200518073855/https://www.empireonline.com/movies/features/best-movies-2/ diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/001 Day 46 Goals what you will make by the end of the day.mp4 b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/001 Day 46 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9b77aee132ebe410d8edd34a344e79c9b5aa80bc --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/001 Day 46 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9b6f9d87cba14b1827533f939bc5791acd697abc50d30e52eb341e66e229850 +size 33554405 diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/001 Day 46 Goals what you will make by the end of the day_vi.srt b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/001 Day 46 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a8f0239357a15b64b5d87ee82fcfb369f2f45aee --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/001 Day 46 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,244 @@ +1 +00:00:00,720 --> 00:00:01,350 +Xin chào các + +2 +00:00:01,350 --> 00:00:05,730 +bạn, chào mừng đến với Ngày thứ 46 của 100 Ngày viết mã. Hôm nay chúng tôi có một + +3 +00:00:05,730 --> 00:00:08,310 +dự án khá đặc biệt dành cho bạn. + +4 +00:00:08,880 --> 00:00:13,380 +Đó là một dự án về cỗ máy thời gian âm nhạc. Vậy điều đó có ý nghĩa gì? + +5 +00:00:14,040 --> 00:00:14,520 +À, + +6 +00:00:14,520 --> 00:00:19,520 +gần đây tôi nhận được một cuốn băng trộn từ một người bạn và cuốn băng trộn đó + +7 +00:00:21,750 --> 00:00:25,950 +gồm toàn những bài hát hay nhất của thời còn đi học cùng nhau. + +8 +00:00:26,400 --> 00:00:28,230 +Và đó là một món quà thực sự, thực + +9 +00:00:28,230 --> 00:00:33,000 +sự đẹp và đó là một cách thực sự tốt đẹp để ghi lại những kỷ niệm của bạn về thời điểm cụ + +10 +00:00:33,000 --> 00:00:35,820 +thể đó trong cuộc đời bạn. Điều này khiến tôi suy + +11 +00:00:35,880 --> 00:00:40,880 +nghĩ, và tôi nghĩ về cách âm nhạc có thể đưa bạn trở lại một thời điểm cụ thể trong + +12 +00:00:41,580 --> 00:00:46,580 +cuộc đời như thể nó vừa vận chuyển bạn. Bằng cách nghe những bài hát đã trở thành + +13 +00:00:48,300 --> 00:00:49,770 +hit trong khoảng thời + +14 +00:00:50,100 --> 00:00:55,100 +gian đó, tôi giống như được vận chuyển trở lại và có thể sống lại một khoảnh khắc + +15 +00:00:56,340 --> 00:00:59,910 +trong thời thơ ấu của mình. Và bạn có thể có kinh nghiệm tương tự. + +16 +00:01:00,120 --> 00:01:04,470 +Có thể có một số bài hát thực sự nổi tiếng trong thời thơ ấu của bạn + +17 +00:01:04,470 --> 00:01:08,880 +gợi lại những kỷ niệm, hoặc có thể cho một mối quan hệ cụ thể, hoặc có thể + +18 +00:01:08,940 --> 00:01:13,940 +là một kỳ nghỉ mà bạn đã trải qua. Cố gắng chạy lại những kỷ niệm này bằng cách sử + +19 +00:01:15,810 --> 00:01:16,470 +dụng âm + +20 +00:01:16,470 --> 00:01:21,470 +nhạc là một cách thực sự, thực sự tuyệt vời để hồi tưởng và tận hưởng một số khoảnh khắc yêu thích + +21 +00:01:21,540 --> 00:01:22,373 +của bạn đúng lúc. + +22 +00:01:22,740 --> 00:01:27,420 +Vì vậy, những gì chúng ta sẽ xây dựng ngày hôm nay là một cỗ máy thời gian + +23 +00:01:28,050 --> 00:01:32,100 +Python, không phải loại cỗ máy thời gian có thể đưa con người quay ngược + +24 +00:01:32,340 --> 00:01:37,340 +thời gian, nhưng nó sẽ quay ngược thời gian để tìm ra bản nhạc nằm trong 100 bức ảnh + +25 +00:01:39,120 --> 00:01:44,120 +hàng đầu. đang được phát trên radio để bạn có thể hồi tưởng lại khoảng thời gian đó một + +26 +00:01:44,550 --> 00:01:47,760 +lần nữa qua âm nhạc. Billboard tổng hợp + +27 +00:01:47,790 --> 00:01:51,480 +danh sách 100 bài hát hàng đầu. + +28 +00:01:51,480 --> 00:01:55,650 +Vì vậy, đây là những bài hát được phát nhiều nhất trong một tuần cụ thể. + +29 +00:01:56,160 --> 00:02:01,110 +Và nếu bạn truy cập biểu đồ / hot-100, bạn sẽ thấy nó cho tuần hiện tại, nhưng + +30 +00:02:01,560 --> 00:02:06,560 +cũng có một tính năng mà bạn có thể thay đổi ngày thành bất kỳ dữ liệu nào trong + +31 +00:02:06,960 --> 00:02:07,793 +20 năm qua. + +32 +00:02:08,280 --> 00:02:12,180 +Vì vậy, nếu chúng tôi chọn một ngày ngẫu nhiên vào năm 2000, + +33 +00:02:12,540 --> 00:02:17,280 +bạn có thể thấy các bài hát xuất hiện ở đây, và nó phụ thuộc vào độ + +34 +00:02:17,310 --> 00:02:18,360 +tuổi của bạn + +35 +00:02:18,360 --> 00:02:23,360 +nhưng một số nghệ sĩ trong số này bạn có thể chưa bao giờ nghe đến như N + +36 +00:02:23,790 --> 00:02:28,020 +Sync hoặc Destiny's child hoặc Vertical Horizon. Nhưng nếu bạn nghe những bản + +37 +00:02:28,260 --> 00:02:33,260 +nhạc này theo thứ tự, thì bạn sẽ gần giống như bạn đã được chuyển về năm + +38 +00:02:33,420 --> 00:02:37,380 +2000, ngày 12 tháng 8 và bạn chỉ đang nghe những thứ trên radio. + +39 +00:02:38,190 --> 00:02:42,020 +Đây là cách chúng ta sẽ tiếp cận nhiệm vụ này. Đầu tiên, chúng tôi sẽ sử + +40 +00:02:42,050 --> 00:02:47,050 +dụng Beautiful Soup để lọc 100 bài hát hàng đầu từ một ngày cụ thể + +41 +00:02:48,470 --> 00:02:49,640 +mà bạn chọn. + +42 +00:02:50,360 --> 00:02:54,950 +Và sau đó chúng tôi sẽ trích xuất tất cả các tên bài hát từ danh sách + +43 +00:02:55,430 --> 00:03:00,430 +và sau đó chúng tôi sẽ sử dụng API Spotify để tạo danh sách phát cho ngày cụ + +44 +00:03:00,670 --> 00:03:01,503 +thể đó. + +45 +00:03:02,310 --> 00:03:07,290 +Và chúng tôi sẽ xem ngay qua Spotify cho từng bài hát và thêm những bài hát đó + +46 +00:03:07,290 --> 00:03:12,150 +vào danh sách phát mới của chúng tôi. Vì vậy, khi kết thúc toàn bộ quá trình + +47 +00:03:12,390 --> 00:03:17,390 +này, chúng tôi sẽ nhận được danh sách phát có 100 bài hát hàng đầu cho một ngày cụ thể + +48 +00:03:19,440 --> 00:03:20,273 +trong quá khứ. + +49 +00:03:20,610 --> 00:03:24,510 +Vì vậy, nếu bạn có một ngày kỷ niệm sắp tới hoặc một sinh + +50 +00:03:24,720 --> 00:03:29,720 +nhật sắp tới, đây có thể chỉ là món quà hoàn hảo khi bạn tạo một danh sách phát + +51 +00:03:30,090 --> 00:03:35,090 +gồm 100 bài hát được phát vào ngày bạn gặp vợ hoặc chồng của mình, hoặc có thể khi + +52 +00:03:35,160 --> 00:03:40,020 +bạn bắt đầu một tình bạn hoặc bắt đầu một công việc mới, và bạn có thể gửi + +53 +00:03:40,440 --> 00:03:45,440 +danh sách phát này như một món quà của bạn để ghi lại những kỷ niệm của họ và + +54 +00:03:46,200 --> 00:03:48,660 +nhắc họ về ngày đó trong quá khứ. + +55 +00:03:49,710 --> 00:03:51,630 +Vậy bạn đã sẵn sàng để chế tạo cỗ máy thời gian chưa? + +56 +00:03:52,080 --> 00:03:55,860 +Nếu đúng như vậy, hãy chuyển sang bài học tiếp theo trong khi bạn + +57 +00:03:55,860 --> 00:03:58,800 +sẽ tìm thấy hướng dẫn từng bước và rất nhiều thử + +58 +00:03:59,280 --> 00:04:03,630 +thách sẽ giúp bạn sử dụng tất cả các kỹ năng bạn đã học về cách + +59 +00:04:03,630 --> 00:04:04,463 +bạn sử + +60 +00:04:04,740 --> 00:04:09,150 +dụng Beautiful Soup cũng như API Spotify theo thứ tự để hoàn thành dự án này. + +61 +00:04:09,510 --> 00:04:10,500 +Vì vậy, hãy đến đó ngay bây giờ. + diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/002 Step 1 - Scraping the Billboard Hot 100.html b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/002 Step 1 - Scraping the Billboard Hot 100.html new file mode 100644 index 0000000000000000000000000000000000000000..8c5ca5d7ee45480d898d4d2682a8c7c9c2037284 --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/002 Step 1 - Scraping the Billboard Hot 100.html @@ -0,0 +1 @@ +

1. Create a new project in PyCharm and create the main.py file.

2. Create an input() prompt that asks what year you would like to travel to in YYY-MM-DD format. e.g.

2. Using what you've learnt about BeautifulSoup, scrape the top 100 song titles on that date into a Python List.

Hint: Take a look at the URL of the chart on a historical date: https://www.billboard.com/charts/hot-100/2000-08-12

SOLUTION

\ No newline at end of file diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/003 Step 2 - Authentication with Spotify.html b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/003 Step 2 - Authentication with Spotify.html new file mode 100644 index 0000000000000000000000000000000000000000..f985aff760c352a540069f572bf5839e37b94a64 --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/003 Step 2 - Authentication with Spotify.html @@ -0,0 +1 @@ +

1. In order to create a playlist in Spotify you must have an account with Spotify. If you don't already have an account, you can sign up for a free one here: http://spotify.com/signup/

2. Once you've signed up/ signed in, go to the developer dashboard and create a new Spotify App:

https://developer.spotify.com/dashboard/

3. Once you've created a Spotify app, copy the Client ID and Client Secret into your Python project.

Spotify uses OAuth to allow third-party applications (e.g. our Python code) to access a Spotify user's account without giving them the username or password. We'll explore OAuth more in later modules on web development, but if you want you can read more about it here: https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth

Authenticating with Spotify is quite complicated, especially when you want to access a user's account. So instead, we're going to use one of the most popular Python Spotify modules - Spotipy to make things easier.

Now that you've come so far and completed 45 days of Python, you're going to approach this challenge like a real developer, figuring things out from the documentation.


4. Using the Spotipy documentation, figure out how to authenticate your Python project with Spotify using your unique Client ID/ Client Secret.


5. Use http://example.com as your Redirect URI. You're looking to get the currentuser id (your Spotify username). As per the documentation, make sure you set the redirect URI in the Spotify Dashboard as well.

HINT 1: You need your own Spotify app Client ID and Secret, the ones in the image above won't work.

HINT 2: This is the method you'll need: https://spotipy.readthedocs.io/en/2.13.0/#spotipy.oauth2.SpotifyOAuth

HINT 3: Try passing the Client ID and Secret directly into the SpotifyOAuth() constructor instead of using export or set.

HINT 4: You need the "playlist-modify-private" scope in order to create a private playlist on Spotify.

HINT 5:  If successful, you should see the page below show up automatically (be sure to click Agree):

Then it will take you to the page below, example.com and you need to copy the entire URL in the address bar:

Finally, you need to paste the URL into the prompt in PyCharm:

Now if you close PyCharm and restart, you should see a new file in this project called token.txt

5. Get the user id of the authenticated user (your Spotify username).

HINT 1: You'll need this method: https://spotipy.readthedocs.io/en/2.13.0/#spotipy.client.Spotify.current_user

HINT 2: The output of the above method is a dictionary, look for the value of the "id" key.

HINT 3: If you see the error "HTTP Error for GET to https://api.spotify.com/v1/me/ with Params: {} returned 403 due to User not registered in the Developer Dashboard" double check you are passing a username during the authorisation flow.

SOLUTION

\ No newline at end of file diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/004 Step 3 - Search Spotify for the Songs from Step 1.html b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/004 Step 3 - Search Spotify for the Songs from Step 1.html new file mode 100644 index 0000000000000000000000000000000000000000..6cbc48533e0d05d8dc0ebfeee990d55b88a067d9 --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/004 Step 3 - Search Spotify for the Songs from Step 1.html @@ -0,0 +1 @@ +

1. Using the Spotipy documentation, create a list of Spotify song URIs for the list of song names you found from step 1 (scraping billboard 100).

HINT 1: You can use the query format "track: {name} year: {YYYY}" to narrow down on a track name from a particular year.

HINT 2: Sometimes a song is not available in Spotify, you'll want to use exception handling to skip over those songs.

HINT 3: pprint() might help you visualise the result better. https://docs.python.org/3/library/pprint.html


SOLUTION

\ No newline at end of file diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/005 Course-Fixes-Report-an-Issue.url b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/005 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/005 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/005 Step 4 - Creating and Adding to Spotify Playlist.html b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/005 Step 4 - Creating and Adding to Spotify Playlist.html new file mode 100644 index 0000000000000000000000000000000000000000..8796e75434ad42f4b2032039ffbad6e5f4467d4e --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/005 Step 4 - Creating and Adding to Spotify Playlist.html @@ -0,0 +1 @@ +

1. Using the Spotipy documentation, create a new private playlist with the name "YYYY-MM-DD Billboard 100", where the date is the date you inputted in step 1.

HINT: You'll need the user id you got from Step 2.

2. Add each of the songs found in Step 3 to the new playlist.

HINT: You'll need the playlist id which is returned as an output once you've successfully created a new playlist.


SOLUTION


COMPLETED PROJECT

\ No newline at end of file diff --git a/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/external-links.txt b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..fcf5226fb7585d90081fd06f0b036945af98ade4 --- /dev/null +++ b/part3/46 - Day 46 - Intermediate+ Create a Spotify Playlist using the Musical Time Machine/external-links.txt @@ -0,0 +1,3 @@ + +005 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/001 Day 47 Goals what you will make by the end of the day.mp4 b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/001 Day 47 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..38d6a2e8a90862aa3f01b38f8b556f54237818d2 --- /dev/null +++ b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/001 Day 47 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52e3b00e83bf822f1d906e0c606f464f8accfb3f8e83a883d0a5e80e1cde6721 +size 81107519 diff --git a/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/001 Day 47 Goals what you will make by the end of the day_vi.srt b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/001 Day 47 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4738893bdcf12c2fd4a398791d327632c18cfc64 --- /dev/null +++ b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/001 Day 47 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,324 @@ +1 +00:00:00,300 --> 00:00:01,080 +Xin chào các bạn, + +2 +00:00:01,080 --> 00:00:05,580 +chào mừng đến với Ngày thứ 47 của 100 Ngày viết mã. Hôm nay chúng ta sẽ xây + +3 +00:00:05,580 --> 00:00:09,600 +dựng một dự án mà cá nhân tôi thấy thực sự hữu ích. + +4 +00:00:10,680 --> 00:00:15,350 +Đó là một dự án theo dõi giá của Amazon. + +5 +00:00:15,380 --> 00:00:17,390 +Vì vậy, tôi không biết bạn thế + +6 +00:00:17,390 --> 00:00:22,310 +nào, nhưng tôi thấy tiết kiệm thời gian hơn khi lên mạng và tìm kiếm thứ tôi + +7 +00:00:22,310 --> 00:00:25,580 +cần thay vì phải đi và lướt qua các cửa hàng, + +8 +00:00:25,880 --> 00:00:30,050 +tìm thứ tôi muốn và tôi chỉ tìm thấy toàn bộ trải nghiệm mua sắm, + +9 +00:00:30,050 --> 00:00:33,170 +thực sự mệt mỏi. Trong khi với việc mua hàng + +10 +00:00:33,170 --> 00:00:36,230 +trực tuyến, bạn có thể chỉ cần truy cập Amazon, nhập thứ bạn + +11 +00:00:36,470 --> 00:00:39,470 +muốn và sau đó vài ngày bạn sẽ được giao hàng tận nơi. + +12 +00:00:40,160 --> 00:00:44,720 +Nhưng một trong những điều tôi nhận thấy khi mua sắm trực tuyến là giá cả của mọi + +13 +00:00:44,720 --> 00:00:49,130 +thứ thay đổi đáng kể theo từng ngày. Ví dụ, một trong những + +14 +00:00:49,130 --> 00:00:53,690 +thứ tôi thực sự muốn mua là một cái nồi ăn liền. + +15 +00:00:53,960 --> 00:00:57,350 +Ừm, về cơ bản nó giống như một nồi áp suất nấu súp. + +16 +00:00:57,950 --> 00:01:00,890 +Nó có thể làm tất cả những việc bình thường như nấu + +17 +00:01:01,190 --> 00:01:05,660 +cơm của bạn hoặc làm nồi nấu chậm, hoặc áp suất nấu thịt của bạn cho đến + +18 +00:01:06,230 --> 00:01:11,230 +khi nó thực sự mềm, nhưng nó thậm chí có thể làm những việc điên rồ như nướng bánh trong + +19 +00:01:12,980 --> 00:01:17,150 +nồi áp suất hoặc làm sữa chua. Đây là điều mà tôi đã để mắt đến + +20 +00:01:17,180 --> 00:01:21,320 +trong một thời gian, nhưng tôi thậm chí còn chưa thực sự có thể bóp cò chỉ vì + +21 +00:01:21,320 --> 00:01:26,320 +tôi thực sự không thể biện minh cho việc trả 120 đô la cho một thứ mà tôi có thể làm + +22 +00:01:26,960 --> 00:01:30,980 +với những thứ khác. có, phải không? Bạn có thể nướng bánh bằng lò nướng, bạn + +23 +00:01:31,100 --> 00:01:32,540 +có thể, ừm, bạn có + +24 +00:01:32,990 --> 00:01:35,420 +thể làm mọi thứ trên bếp, nhưng đó là điều mà + +25 +00:01:35,420 --> 00:01:40,040 +tôi thực sự bị cuốn hút và tôi tự hỏi liệu mình có thể cắt giảm thời gian nấu nướng để + +26 +00:01:40,040 --> 00:01:43,400 +tôi không. có thể làm một số việc khác như làm hướng dẫn Lập trình. + +27 +00:01:44,000 --> 00:01:49,000 +Nhưng một trong những điều tôi nhận thấy về mặt hàng này hoặc rất nhiều mặt hàng trên + +28 +00:01:49,100 --> 00:01:51,650 +Amazon là giá cả thực sự dao động. + +29 +00:01:52,010 --> 00:01:55,310 +Vì vậy, tôi đã để mắt đến sản phẩm này trong + +30 +00:01:55,340 --> 00:01:59,540 +một thời gian và tôi đã thấy nó lên xuống thất thường thậm chí hàng ngày. + +31 +00:02:00,080 --> 00:02:05,080 +Và có một trang web thực sự thú vị mà tôi đã khám phá ra tên là camelcamelcamel. com, nơi bạn có thể chỉ cần lấy + +32 +00:02:05,420 --> 00:02:08,660 +URL của sản phẩm, vì vậy bạn chọn kích thước bạn + +33 +00:02:08,660 --> 00:02:13,430 +muốn, kiểu dáng, mặt hàng, bất kể nó có thể là gì, sau đó bạn lấy + +34 +00:02:13,490 --> 00:02:17,990 +URL và bạn dán nó vào camelcamelcamel. com và nó sẽ cung cấp + +35 +00:02:18,440 --> 00:02:21,350 +cho bạn lịch sử giá của sản phẩm + +36 +00:02:21,380 --> 00:02:22,580 +đó. nó không phải là mát mẻ? + +37 +00:02:22,880 --> 00:02:27,880 +Vì vậy, bây giờ bạn có thể xem và nhận dữ liệu thực tế về giá của sản phẩm đó + +38 +00:02:28,790 --> 00:02:33,560 +trong vài tháng hoặc năm qua và bây giờ bạn có thể xem đâu là giá thấp nhất, đâu + +39 +00:02:33,860 --> 00:02:38,210 +là giá cao nhất và xem nó biến động gần như ngẫu nhiên như thế nào. + +40 +00:02:38,660 --> 00:02:41,600 +Bây giờ, thông thường tôi sẽ nghĩ rằng vào những ngày + +41 +00:02:41,660 --> 00:02:46,370 +giảm giá lớn như thứ Sáu đen hoặc ngày cao điểm, bạn sẽ nhận được giá rẻ nhất, nhưng + +42 +00:02:46,730 --> 00:02:51,020 +thực tế, không phải lúc nào cũng vậy. Ví dụ, trong trường hợp này, + +43 +00:02:51,020 --> 00:02:55,400 +giá rẻ nhất cho mặt hàng này xảy ra vào ngày 25 tháng 5, + +44 +00:02:55,760 --> 00:02:58,310 +theo tôi, đó chỉ là một ngày bình thường. + +45 +00:02:58,310 --> 00:03:01,870 +Tôi thực sự không hiểu tại sao nó lại giảm giá đến mức đó. + +46 +00:03:03,060 --> 00:03:08,060 +Vì vậy, giả sử rằng chúng tôi đã định sẵn một mức giá mà tại thời điểm đó, tôi đã sẵn + +47 +00:03:09,150 --> 00:03:10,920 +sàng mua hàng. Vì vậy, + +48 +00:03:11,400 --> 00:03:15,930 +đối với tôi, có thể nếu mặt hàng này giảm xuống từ $ + +49 +00:03:16,020 --> 00:03:20,910 +119 um, giả sử là $ 99, thì tôi sẽ thực sự mua nó. + +50 +00:03:21,720 --> 00:03:24,870 +Bây giờ chúng tôi thực sự có thể làm điều này bằng cách sử dụng + +51 +00:03:25,290 --> 00:03:30,270 +những gì chúng tôi đã học, và sau đó vào ngày hôm đó, tôi nhận được email và nó cho tôi biết thông báo + +52 +00:03:30,330 --> 00:03:35,250 +giá Instant Pot, giá sản phẩm hiện là $ 99. 99 thấp hơn giá mục tiêu của bạn, hãy tiếp tục và mua ngay bây giờ. + +53 +00:03:35,850 --> 00:03:40,350 +Vì vậy, về cơ bản đây là chức năng mà chúng tôi muốn xây dựng bằng cách sử dụng kiến thức của + +54 +00:03:40,350 --> 00:03:42,150 +chúng tôi về Python và tìm kiếm web. + +55 +00:03:42,930 --> 00:03:47,400 +Và bot Python của chúng tôi sẽ là bot liên tục kiểm + +56 +00:03:47,400 --> 00:03:49,710 +tra giá. Và khi đến đúng thời + +57 +00:03:49,740 --> 00:03:53,280 +điểm, nó sẽ là thứ cảnh báo chúng ta bằng cách sử dụng email, + +58 +00:03:53,460 --> 00:03:57,900 +yêu cầu chúng ta mua hàng để chúng ta không phải dành hàng ngày để xem trang web, + +59 +00:03:57,900 --> 00:03:58,440 +kiểm + +60 +00:03:58,440 --> 00:04:02,850 +tra giá cả và làm điều gì đó bot Python của chúng tôi có thể tự làm. + +61 +00:04:04,170 --> 00:04:09,090 +Ý tưởng ở đây là phần thân Python nhỏ của chúng tôi sẽ có một khoảng thời gian nhất định, + +62 +00:04:09,090 --> 00:04:13,290 +giả sử 9:00 sáng mỗi ngày, nơi nó kiểm tra URL mà chúng tôi nhận được. + +63 +00:04:13,740 --> 00:04:18,000 +Vì vậy, nó sẽ xem xét một điều cụ thể trên trang + +64 +00:04:18,029 --> 00:04:22,290 +web đó, đó là giá cả. Vì vậy, vào lúc này, đã đúng, đăng ký + +65 +00:04:22,290 --> 00:04:24,690 +với giá $ 119. 99 và thời điểm + +66 +00:04:25,110 --> 00:04:30,110 +khi nó kiểm tra giá đó và nó thấy 99. 9 thứ gì đó, vì vậy bất kỳ thứ + +67 +00:04:31,290 --> 00:04:34,920 +gì thấp hơn mục tiêu đặt ra của chúng tôi là một trăm đô + +68 +00:04:35,280 --> 00:04:39,480 +la, thì nó sẽ gửi cho chúng tôi một email và thông báo cho chúng tôi. + +69 +00:04:40,440 --> 00:04:45,000 +Vì vậy, sau đó chúng ta có thể truy cập URL và mua sản phẩm đó. + +70 +00:04:45,300 --> 00:04:47,040 +Thay vì phải tự mình kiểm tra, giờ + +71 +00:04:47,370 --> 00:04:50,760 +đây chúng tôi nhận được thông báo khi tình trạng của chúng tôi được đáp ứng. + +72 +00:04:51,720 --> 00:04:55,350 +Như bạn có thể tưởng tượng, điều này sẽ liên quan đến một chút thao tác trên + +73 +00:04:55,500 --> 00:05:00,500 +web, nơi chúng tôi cố gắng nắm bắt giá trị của giá này và chúng tôi chuyển nó thành một con số và chúng + +74 +00:05:02,250 --> 00:05:07,230 +tôi kiểm tra nó với giá mục tiêu của chúng tôi. Và sau đó khi các điều kiện được đáp + +75 +00:05:07,290 --> 00:05:10,950 +ứng, sau đó chúng tôi sử dụng mô-đun SMTP để gửi email cho chính mình. + +76 +00:05:11,880 --> 00:05:14,100 +Vì vậy, đó là mục tiêu của dự án hôm + +77 +00:05:14,250 --> 00:05:18,210 +nay và tôi nghĩ nếu bạn là ai đó giống như tôi, người mua rất nhiều thứ trực + +78 +00:05:18,510 --> 00:05:20,940 +tuyến, thì điều này sẽ khá thú vị đối với bạn. + +79 +00:05:21,090 --> 00:05:23,970 +Và tôi hy vọng điều đó cũng sẽ có ích vào một lúc nào đó. + +80 +00:05:24,840 --> 00:05:29,370 +Vì vậy, hãy chuyển sang bài học tiếp theo và bắt đầu xây dựng bot theo dõi giá Amazon + +81 +00:05:29,370 --> 00:05:30,090 +của chúng tôi. + diff --git a/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/002 Step 1 - Use BeautifulSoup to Scrape the Product Price.html b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/002 Step 1 - Use BeautifulSoup to Scrape the Product Price.html new file mode 100644 index 0000000000000000000000000000000000000000..6e2deaa6b99c94ff699e9b0b557d818ba7faaf63 --- /dev/null +++ b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/002 Step 1 - Use BeautifulSoup to Scrape the Product Price.html @@ -0,0 +1 @@ +

1. Find a product on Amazon that you want to track and get the product URL or just use the one I'm tracking.

https://www.amazon.com/dp/B075CYMYK6?psc=1&ref_=cm_sw_r_cp_ud_ct_FM9M699VKHTT47YD50Q6

In addition to the URL, when your browser tries to load up a page in Amazon, it also passes a bunch of other information. e.g. Which browser you're using, which computer you have etc.

These additional pieces of information are passed along in the request Headers.

You can see your browser headers by going to this website:

http://myhttpheader.com/

2. Use the requests library to request the HTML page of the Amazon product using the URL you got from 1.

HINT 1: You'll need to pass along some headers in order for the request to return the actual website HTML. At minimum you'll need to give your "User-Agent" and "Accept-Language" values in the request header.

HINT 2: Remember this is how you pass headers with the requests library:

https://stackoverflow.com/questions/6260457/using-headers-with-the-python-requests-librarys-get-method

HINT 3: Print the output of the get request and make sure the actual HTML of the web page is printed, if not try adding more items from your header from hint1. Sometimes, Amazon might just return the Captcha page.

3. Use BeautifulSoup to make soup with the web page HTML you get back. You'll need to use the "lxml" parser instead of the "html.parser" for this to work.


HINT: If you get an error that says "bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html-parser." Then it means you're not using the right parser, you'll need to import lxml at the top and install the module then use "lxml" instead of "html.parser" when you make soup.


4. Use BeautifulSoup to get hold of the price of the item as a floating point number and print it out.

HINT: You might need to use the split() method: https://www.w3schools.com/python/ref_string_split.asp

SOLUTION

\ No newline at end of file diff --git a/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/003 Course-Fixes-Report-an-Issue.url b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/003 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/003 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/003 Step 2 - Email Alert When Price Below Preset Value.html b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/003 Step 2 - Email Alert When Price Below Preset Value.html new file mode 100644 index 0000000000000000000000000000000000000000..fa72d1da2fd6d629256a89c861098c81bc36eed1 --- /dev/null +++ b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/003 Step 2 - Email Alert When Price Below Preset Value.html @@ -0,0 +1 @@ +

We want to get an email when the price of our product is below a certain value. e.g in the case of the Instant Pot, we'll set the target price as $100.

1. So when the price is below 100 then use the smtp module to send an email to yourself. In the email, include the title of the product, the current price and a link to buy the product.

e.g.

HINT: You can test the email by changing the target price to above the current live price of the product, e.g. $200.


SOLUTION


NOTE: If you have issues and keep getting this error:

1. Make sure you've got the correct smtp address for your email provider:

Gmail: smtp.gmail.com

Hotmail: smtp.live.com

Outlook: outlook.office365.com

Yahoo: smtp.mail.yahoo.com

If you use another email provider, just Google for your email provider e.g. "Gmail SMTP address"



Below are steps specific to users sending email from Gmail and Yahoo addresses as outlined in the Birthday Wisher on Day 32.

2. Turn on 2-Step Verification for your email under the Security settings for your account. For example, Manage Your Google Account -> Security.

3. Add an App Password under your email settings. Select "Other" from the drop-down settings and choose a password. Use this app password in your Python code.

4. Add a port number by changing your code to this:

smtplib.SMTP("smtp.gmail.com", port=587)

\ No newline at end of file diff --git a/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/external-links.txt b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..6d4072e58452e895e3c13f2b10423ac7b7909701 --- /dev/null +++ b/part3/47 - Day 47 - Intermediate+ Create an Automated Amazon Price Tracker/external-links.txt @@ -0,0 +1,3 @@ + +003 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Addiction-Warning-The-Cookie-Clicker-Game.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Addiction-Warning-The-Cookie-Clicker-Game.url new file mode 100644 index 0000000000000000000000000000000000000000..1dc2eb8e425ae8c24611e12a655301767c40320c --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Addiction-Warning-The-Cookie-Clicker-Game.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://orteil.dashnet.org/cookieclicker/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Day 48 Goals what you will make by the end of the day.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Day 48 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e1b9c69665559dc27f2034f70359762e8a8654b1 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Day 48 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62c52b636413e9bccf2f945f6514c353dff21ae1679fc11b9794f9c9da76142f +size 27186619 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Day 48 Goals what you will make by the end of the day_vi.srt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Day 48 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..440f46880fde1ade2ba1fdf147c6bc5b59c2f013 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/001 Day 48 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,164 @@ +1 +00:00:00,030 --> 00:00:00,660 +Xin chào các + +2 +00:00:00,660 --> 00:00:05,190 +bạn, chào mừng đến với Ngày thứ 48 của 100 Ngày viết mã. Hôm nay chúng ta + +3 +00:00:05,190 --> 00:00:10,190 +sẽ giới thiệu một công nghệ mới để quét web tiên + +4 +00:00:10,890 --> 00:00:13,200 +tiến và đó là Selenium WebDriver. + +5 +00:00:13,680 --> 00:00:16,170 +Bây giờ bạn có thể đã nghe nói về Selenium WebDriver + +6 +00:00:16,200 --> 00:00:21,030 +trước đây vì nó có lẽ là một trong những công cụ kiểm tra và tự động hóa nổi tiếng nhất dành + +7 +00:00:21,300 --> 00:00:25,200 +cho các nhà phát triển web hiện có. Nhưng bạn có thể tự + +8 +00:00:25,230 --> 00:00:29,550 +hỏi, chúng ta đã có Beautiful Soup. Vậy tại sao chúng ta cần học một công nghệ mới? + +9 +00:00:30,180 --> 00:00:30,450 +Chà, + +10 +00:00:30,450 --> 00:00:35,450 +một trong những điều mà chúng tôi thực sự bị hạn chế là chúng tôi thực sự không thể sử dụng tất + +11 +00:00:35,970 --> 00:00:38,370 +cả các khả năng mà trình duyệt có thể làm. + +12 +00:00:38,580 --> 00:00:42,930 +Vì vậy, khi chúng ta tải lên một trang web với món súp đẹp đẽ, chẳng hạn như chúng ta không thể gõ một cái + +13 +00:00:42,990 --> 00:00:47,990 +gì đó vào trang web và sau đó nhấp vào một cái gì đó. Và để tạo ra các chuỗi hành động liên + +14 +00:00:48,120 --> 00:00:49,920 +tục này, nơi về cơ bản + +15 +00:00:50,280 --> 00:00:55,280 +chúng tôi tự động hóa toàn bộ quy trình của một công việc cụ thể hoặc một nhiệm + +16 +00:00:55,950 --> 00:00:58,320 +vụ cụ thể. Để làm được + +17 +00:00:58,380 --> 00:01:01,230 +điều đó, chúng ta sẽ cần sử dụng Selenium WebDriver. + +18 +00:01:02,070 --> 00:01:07,070 +Bây giờ, đây là một công cụ miễn phí và về cơ bản nó cho phép chúng ta tự động hóa trình + +19 +00:01:08,250 --> 00:01:11,520 +duyệt, đưa trình duyệt thực hiện mọi thứ tự động tùy thuộc vào một + +20 +00:01:11,760 --> 00:01:16,760 +tập lệnh hoặc một đoạn mã mà chúng ta viết. Bây giờ, điều này sẽ + +21 +00:01:17,580 --> 00:01:22,580 +cho phép chúng ta nhập cũng như nhấp chuột cũng như cuộn. + +22 +00:01:25,560 --> 00:01:30,560 +Về cơ bản, bất cứ điều gì mà con người có thể làm trên một trang web, bạn đều có thể thực hiện + +23 +00:01:30,930 --> 00:01:33,030 +bằng cách sử dụng trình duyệt điều khiển Selenium. + +24 +00:01:33,600 --> 00:01:37,860 +Nó giống như chúng ta đang chế tạo một con rô bốt và yêu cầu nó phải làm gì trên trình duyệt. + +25 +00:01:38,310 --> 00:01:43,290 +Và selen là công cụ cho phép robot tương tác và giao tiếp + +26 +00:01:43,290 --> 00:01:46,080 +với trình duyệt. Và khi chúng tôi đã + +27 +00:01:46,140 --> 00:01:49,290 +tăng cấp, chúng tôi sẽ có thể làm tất cả những việc + +28 +00:01:49,590 --> 00:01:54,590 +như, chẳng hạn như chơi các trò chơi dựa trên web như trình nhấp cookie tự động để tự động + +29 +00:01:56,820 --> 00:02:01,820 +nhấp vào cookie này bằng cách sử dụng mã thay vì chúng tôi phải thực hiện thủ công làm điều + +30 +00:02:02,820 --> 00:02:07,820 +đó và sau đó để chọn các nâng cấp và mua chúng, một lần nữa, hoàn toàn tự động. + +31 +00:02:09,090 --> 00:02:13,530 +Nếu bạn từng muốn trở thành người giỏi nhất trong trình nhấp cookie hoặc bất kỳ trò + +32 +00:02:13,530 --> 00:02:18,150 +chơi dựa trên web nào khác và bạn không muốn đầu tư thời gian vào việc mở rộng + +33 +00:02:18,420 --> 00:02:23,220 +quy mô và tự mình làm tốt nó, thì đây là nơi tự động hóa có thể giúp bạn. + +34 +00:02:23,940 --> 00:02:25,560 +Nhưng có một lưu ý nghiêm + +35 +00:02:25,590 --> 00:02:29,100 +túc hơn, bạn có thể sử dụng một thứ gì đó như selen để + +36 +00:02:29,100 --> 00:02:34,100 +tự động điền vào biểu mẫu hoặc chuyển thông tin từ bảng tính Excel sang biểu mẫu trực tuyến của + +37 +00:02:35,190 --> 00:02:36,600 +Google hoặc về cơ bản + +38 +00:02:36,630 --> 00:02:40,470 +làm bất cứ điều gì lặp đi lặp lại và tẻ nhạt và bạn không + +39 +00:02:40,770 --> 00:02:42,390 +muốn làm điều đó chính bạn. + +40 +00:02:43,050 --> 00:02:45,690 +Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang bài + +41 +00:02:45,900 --> 00:02:49,440 +học tiếp theo và chúng ta hãy bắt đầu tìm hiểu về siêu năng lực mới này. + diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 Download-and-Install-the-Chrome-Browser.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 Download-and-Install-the-Chrome-Browser.url new file mode 100644 index 0000000000000000000000000000000000000000..26de0ad4b4c3562836a0259c8719eb401aecc6a1 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 Download-and-Install-the-Chrome-Browser.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.google.com/intl/en_uk/chrome/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 How to Install & Set Up Selenium.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 How to Install & Set Up Selenium.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..279b17bcefb812833fbfc4e537b7cab4f5bacdc2 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 How to Install & Set Up Selenium.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:638f889e1cc1fefe1407d68f4c6456ce711e55ebd3d3c4687aac3a311fc1945e +size 52822103 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 How to Install & Set Up Selenium_vi.srt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 How to Install & Set Up Selenium_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ad48fb1b89ac936b49a5ff5c244785c233446ab4 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/002 How to Install & Set Up Selenium_vi.srt @@ -0,0 +1,344 @@ +1 +00:00:00,230 --> 00:00:06,260 +Để bắt đầu sử dụng Selenium Webdriver, chúng ta sẽ phải thực hiện một số bước để + +2 +00:00:06,260 --> 00:00:11,060 +thiết lập trình duyệt cũng như cài đặt và thiết lập Selenium. + +3 +00:00:11,270 --> 00:00:16,920 +Bây giờ, bước đầu tiên, nếu bạn chưa cài đặt, là cài đặt trình duyệt Chrome. + +4 +00:00:16,940 --> 00:00:23,240 +Bây giờ, trong khi bạn có thể làm việc với Selenium bằng các trình duyệt khác như Firefox hoặc Safari, chúng ta sẽ sử dụng một + +5 +00:00:23,240 --> 00:00:25,610 +số công cụ dành cho nhà phát triển Chrome. + +6 +00:00:25,610 --> 00:00:31,490 +Và cũng để các bạn có thể hợp tác thực hiện chính xác những gì tôi đang làm, sẽ dễ dàng hơn nhiều nếu các bạn làm việc + +7 +00:00:31,490 --> 00:00:34,190 +trên cùng một trình duyệt và cùng một công nghệ. + +8 +00:00:34,300 --> 00:00:39,230 +Nếu bạn chưa có Chrome, hãy truy cập tài nguyên khóa học nơi bạn sẽ tìm thấy liên kết + +9 +00:00:39,230 --> 00:00:42,500 +để tải xuống phiên bản mới nhất cho máy tính của mình. + +10 +00:00:43,040 --> 00:00:51,380 +Vì vậy, bây giờ chúng ta đã cài đặt Chrome, bước tiếp theo và cuối cùng là cài đặt và thiết lập Selenium trong tệp main. + +11 +00:00:51,380 --> 00:00:51,380 +py. + +12 +00:00:51,410 --> 00:00:58,580 +Tôi sẽ nhập selen và đảm bảo rằng bạn viết đúng chính tả để nó trông như thế này. + +13 +00:00:58,580 --> 00:01:04,459 +Và sau đó chúng ta sẽ nhấp vào bóng đèn màu đỏ này như mọi khi để cài đặt gói của chúng ta. + +14 +00:01:05,519 --> 00:01:11,400 +Bây giờ, khi selen đã được cài đặt thành công, tôi sẽ thay đổi câu lệnh nhập. + +15 +00:01:11,400 --> 00:01:19,020 +Tôi sắp nói rằng từ gói selen mới được cài đặt này, tôi sẽ nhập một mô-đun có tên là Webdriver và + +16 +00:01:19,020 --> 00:01:26,070 +chính Webdriver này sẽ điều khiển trình duyệt Chrome và thực hiện tất cả các tác vụ tự động + +17 +00:01:26,070 --> 00:01:27,840 +của chúng tôi. + +18 +00:01:28,020 --> 00:01:33,110 +Hãy tạo một trình điều khiển mới từ mô-đun mới đó. + +19 +00:01:33,120 --> 00:01:36,630 +Vì vậy, trình điều khiển bằng dấu chấm Webdriver. + +20 +00:01:36,630 --> 00:01:40,470 +Và sau đó chúng ta có thể khởi tạo bất kỳ trình duyệt nào mà chúng ta chọn. + +21 +00:01:40,470 --> 00:01:46,350 +Vì vậy, trong trường hợp của chúng ta, chúng ta sẽ tạo một trình duyệt Chrome để lái xe, nhưng bạn có thể thấy + +22 +00:01:46,350 --> 00:01:51,360 +rằng bạn cũng có thể có Firefox hoặc Safari và một số lượng lớn các trình duyệt khác. + +23 +00:01:52,050 --> 00:01:58,140 +Chúng ta sẽ chọn Chrome và lưu ý rằng đây là Chrome có chữ C viết hoa, vì vậy chúng ta đang khởi tạo một đối + +24 +00:01:58,140 --> 00:01:59,190 +tượng mới ở đây. + +25 +00:02:00,090 --> 00:02:05,650 +Và bây giờ chúng ta đã tạo xong trình điều khiển, chúng ta đã hoàn thành khá nhiều việc cài đặt và thiết lập Selenium + +26 +00:02:05,650 --> 00:02:06,520 +Webdriver. + +27 +00:02:06,820 --> 00:02:11,530 +Nhưng nếu bạn đang thắc mắc trình điều khiển Chrome này là gì thì đây là cách để suy nghĩ về nó. + +28 +00:02:11,560 --> 00:02:17,720 +Chúng tôi có gói selen chứa mã để chúng tôi có thể tương tác với trình duyệt. + +29 +00:02:17,740 --> 00:02:23,680 +Giờ đây, nó có thể tương tác với trình duyệt Chrome, đó là điều chúng tôi đang chọn thực hiện, nhưng nó cũng có thể tương + +30 +00:02:23,680 --> 00:02:26,920 +tác với nhiều trình duyệt khác như Safari hoặc Firefox. + +31 +00:02:27,130 --> 00:02:34,360 +Bây giờ, làm cách nào để đảm bảo rằng gói này, có thể xử lý cả ba, biết cụ thể cách hoạt động với trình + +32 +00:02:34,360 --> 00:02:35,650 +duyệt Chrome? + +33 +00:02:36,520 --> 00:02:45,850 +Chà, chúng ta sẽ cần một loại cầu nối nào đó kết nối mã selen để hoạt động với trình duyệt Chrome. + +34 +00:02:45,850 --> 00:02:49,720 +Và cây cầu này được cung cấp bởi trình điều khiển Chrome. + +35 +00:02:49,960 --> 00:02:54,910 +Vì vậy sẽ có một trình điều khiển khác cho Safari và sẽ có một trình điều khiển khác cho Firefox. + +36 +00:02:54,910 --> 00:03:01,300 +Và chỉ bằng cách bật các trình điều khiển đó, nó sẽ cho Selenium biết cách làm việc với phiên bản mới nhất của các + +37 +00:03:01,300 --> 00:03:02,380 +trình duyệt này. + +38 +00:03:02,650 --> 00:03:05,110 +Tất cả những gì chúng ta phải làm bây giờ là sử dụng nó. + +39 +00:03:05,230 --> 00:03:12,010 +Vì vậy, điều đầu tiên tôi sẽ sử dụng trình điều khiển của mình để làm là tôi sẽ lấy nó để mở một trang web. + +40 +00:03:12,040 --> 00:03:16,510 +Chúng tôi sẽ sử dụng trình điều khiển dot get và sau đó chúng tôi có thể chuyển URL vào đây. + +41 +00:03:16,870 --> 00:03:18,970 +Nó sẽ là Https. + +42 +00:03:18,970 --> 00:03:22,060 +Và sau đó tôi sẽ truy cập Amazon. com. + +43 +00:03:22,570 --> 00:03:28,570 +Bây giờ, nếu bạn đang sử dụng Windows và tiếp tục chạy mã thì mã sẽ chạy mà không gặp bất kỳ sự cố nào. + +44 +00:03:28,570 --> 00:03:31,660 +Nhưng nếu bạn đang dùng máy Mac thì điều này sẽ xảy ra. + +45 +00:03:33,360 --> 00:03:39,510 +Bạn sẽ nhận được thông báo bật lên cho biết không thể mở trình điều khiển Chrome vì không thể xác minh nhà phát + +46 +00:03:39,510 --> 00:03:45,240 +triển, mặc dù chúng tôi biết rằng điều này thực sự được Google tạo riêng cho trình duyệt Chrome. + +47 +00:03:45,420 --> 00:03:51,180 +Vì vậy, nếu điều này xảy ra, bạn sẽ nhấp vào hủy và bạn sẽ gặp tất cả các lỗi này vì không thể + +48 +00:03:51,180 --> 00:03:52,560 +truy cập vào tệp đó. + +49 +00:03:52,740 --> 00:03:58,230 +Bây giờ, để kích hoạt nó, chúng ta sẽ đi tới tùy chọn hệ thống Biểu tượng Apple. + +50 +00:03:59,550 --> 00:04:02,370 +Và sau đó chúng ta sẽ chuyển sang vấn đề bảo mật và quyền riêng tư. + +51 +00:04:02,370 --> 00:04:08,460 +Và ở đây, vì chúng tôi cố gắng chạy nó trước khi nhận được thông báo cho biết Chromedriver đã bị chặn + +52 +00:04:08,460 --> 00:04:09,050 +sử dụng. + +53 +00:04:09,060 --> 00:04:12,180 +Vì vậy, chúng tôi sẽ nhấp vào cho phép. + +54 +00:04:12,240 --> 00:04:19,440 +Và bây giờ nếu chúng ta chạy lại cái này, nó sẽ hiển thị cho chúng ta cửa sổ bật lên này và tất cả những gì chúng ta phải làm là nhấp vào mở. + +55 +00:04:19,740 --> 00:04:28,650 +Và khi chúng ta đã hoàn thành tất cả những điều đó, bây giờ cuối cùng nó cũng sẽ mở ra trang web mà chúng ta muốn truy cập Amazon. com bằng cách sử dụng phiên bản + +56 +00:04:28,650 --> 00:04:32,370 +Chrome tự động này. + +57 +00:04:32,370 --> 00:04:38,430 +Và bạn có thể thấy điều này vì ở phía bên phải trên cùng ở đây có ghi Chrome đang được kiểm soát bởi phần mềm kiểm + +58 +00:04:38,460 --> 00:04:39,240 +tra tự động. + +59 +00:04:39,270 --> 00:04:41,130 +Đó là selen của chúng tôi. + +60 +00:04:41,460 --> 00:04:48,000 +Tuy nhiên, bạn cũng sẽ nhận thấy rằng trình duyệt Chrome cũng bị đóng ngay sau khi chương trình của chúng tôi + +61 +00:04:48,000 --> 00:04:48,720 +chạy xong. + +62 +00:04:48,720 --> 00:04:55,170 +Vì vậy, để giữ cho trình duyệt mở sau khi chương trình của chúng tôi kết thúc, chúng tôi phải định cấu hình trình quản trị web của mình. + +63 +00:04:55,260 --> 00:04:59,050 +Vì vậy, để làm được điều đó, chúng ta phải nắm giữ các tùy chọn Chrome. + +64 +00:04:59,050 --> 00:05:03,190 +Chúng tôi có thể lấy những thứ đó thông qua các tùy chọn chrome dot webdriver. + +65 +00:05:04,730 --> 00:05:11,150 +Và sau đó chúng tôi phải thêm một tùy chọn thử nghiệm trong Chrome có tên là tách ra và đặt tùy chọn đó thành đúng. + +66 +00:05:13,270 --> 00:05:18,760 +Bây giờ chúng tôi chuyển cấu hình đó cho trình điều khiển web của mình thông qua tham số được gọi là tùy chọn. + +67 +00:05:19,450 --> 00:05:25,720 +Và bây giờ khi chúng tôi chạy chương trình Python, trình duyệt Chrome của chúng tôi không tự động đóng nữa. + +68 +00:05:27,190 --> 00:05:33,580 +Vì vậy, chúng tôi đã xem xét việc định cấu hình trình duyệt của mình để giữ trình duyệt luôn mở nhưng chúng tôi cũng có thể đóng các tab và thoát + +69 +00:05:33,580 --> 00:05:35,200 +khỏi Chrome theo chương trình. + +70 +00:05:35,770 --> 00:05:41,920 +Để làm điều đó, tất cả những gì chúng ta phải làm là nhấn vào Driver và sau đó chúng ta có thể gọi phương thức close. + +71 +00:05:41,950 --> 00:05:47,560 +Bây giờ khi tôi nhấn nút chạy, bạn có thể thấy bây giờ nó sẽ mở Amazon. com. + +72 +00:05:47,560 --> 00:05:51,880 +Và ngay khi trang đó được tải, gần như nó sẽ đóng nó lại. + +73 +00:05:52,060 --> 00:05:57,250 +Bây giờ còn có một phương pháp khác gọi là Driver Dot Quit. + +74 +00:05:57,280 --> 00:05:59,620 +Bây giờ, sự khác biệt giữa đóng và thoát là gì? + +75 +00:05:59,650 --> 00:06:00,400 +Bạn có thể thắc mắc. + +76 +00:06:00,400 --> 00:06:07,810 +Chà, Đóng thực ra chỉ đóng một tab duy nhất, tab đang hoạt động nơi bạn đã mở một trang + +77 +00:06:07,810 --> 00:06:08,470 +cụ thể. + +78 +00:06:08,500 --> 00:06:12,010 +Bây giờ Quit thực sự sẽ thoát khỏi toàn bộ trình duyệt. + +79 +00:06:12,050 --> 00:06:16,710 +Có một số trường hợp bạn có nhiều tab chạy cùng lúc. + +80 +00:06:16,720 --> 00:06:22,480 +Đóng sẽ đóng tab cụ thể đó trong khi thoát sẽ thực sự thoát khỏi toàn bộ chương trình. + +81 +00:06:22,660 --> 00:06:30,290 +Khi tôi sử dụng xong trình điều khiển của mình, tôi thực sự thích sử dụng quit để tắt toàn bộ trình duyệt. + +82 +00:06:30,380 --> 00:06:35,750 +Bằng cách đó, chúng ta luôn có thể bắt đầu lại từ đầu và chúng ta sẽ có một trình duyệt mới để làm việc. + +83 +00:06:36,170 --> 00:06:42,260 +Và trong các bài học tiếp theo, chúng tôi sẽ chỉ cho bạn cách sử dụng Selenium để làm bất cứ điều gì về cơ bản mà chúng + +84 +00:06:42,260 --> 00:06:45,170 +ta có thể làm với chuột và bàn phím như con người. + +85 +00:06:45,170 --> 00:06:49,740 +Nhưng thay vào đó, chúng tôi sẽ tự động hóa toàn bộ quy trình và quy trình làm việc. + +86 +00:06:49,760 --> 00:06:53,360 +Vì vậy, với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 How to Find and Select Elements on a Website with Selenium.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 How to Find and Select Elements on a Website with Selenium.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8a4b5252c44247879ad2e717b18df939f6b69182 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 How to Find and Select Elements on a Website with Selenium.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca675414bd3797235ebdbbe6a4ae5118aa105bb900608f40f15f61c809272455 +size 222359330 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 How to Find and Select Elements on a Website with Selenium_vi.srt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 How to Find and Select Elements on a Website with Selenium_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5531857f0e8a585dbae32b2e2dec7d3db3686e7b --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 How to Find and Select Elements on a Website with Selenium_vi.srt @@ -0,0 +1,732 @@ +1 +00:00:00,140 --> 00:00:06,860 +Bây giờ chúng ta đã biết cách có thể bắt đầu sử dụng Selenium Webdriver để tự động hóa trình duyệt + +2 +00:00:06,860 --> 00:00:14,960 +của mình, bước tiếp theo là tìm hiểu cách sử dụng Selenium để tìm và định vị các thành phần HTML cụ thể trên trang web. + +3 +00:00:16,000 --> 00:00:22,150 +Chỉ giữa nơi chúng tôi thoát trình điều khiển và nơi chúng tôi nắm giữ một trang cụ thể. + +4 +00:00:22,150 --> 00:00:29,920 +Tôi sẽ cho bạn thấy việc hoàn thành nhiệm vụ trước đó ở ngày thứ 47 dễ dàng như thế nào, khi chúng ta cố gắng nắm được giá của một + +5 +00:00:29,920 --> 00:00:33,850 +mặt hàng cụ thể trên Amazon. com. + +6 +00:00:34,780 --> 00:00:36,910 +Đây là mặt hàng mà chúng tôi quan tâm. + +7 +00:00:36,940 --> 00:00:40,240 +Đây là nồi tức thì và đây là giá. + +8 +00:00:40,240 --> 00:00:49,210 +Vì vậy, nếu tôi tiếp tục lấy URL này và thay thế URL trước đó chỉ là Amazon. com bằng URL đưa chúng ta đến trang này thì chúng + +9 +00:00:49,210 --> 00:00:54,850 +ta có thể bắt đầu kiểm tra thành phần cụ thể này. + +10 +00:00:55,270 --> 00:01:02,890 +Bây giờ, nếu nhìn vào HTML, chúng ta có thể thấy rằng chúng ta đã hiển thị giá và tại thời + +11 +00:01:02,890 --> 00:01:06,760 +điểm ghi, giá được chia thành hai phần. + +12 +00:01:06,880 --> 00:01:15,670 +Vậy bạn có một lớp được gọi là Giá Toàn bộ, là số đô la và một lớp được gọi + +13 +00:01:15,670 --> 00:01:18,550 +là phần giá, là xu. + +14 +00:01:18,550 --> 00:01:23,020 +Vì vậy, rõ ràng Amazon có thể thay đổi trang web của họ bất cứ lúc nào. + +15 +00:01:23,020 --> 00:01:29,860 +Ví dụ: trước đây, giá thường nằm trong một phần tử có khối giá hoặc giá ID. + +16 +00:01:29,860 --> 00:01:37,640 +Vì vậy, bạn phải xem bên trong phần tử nào có giá bằng cách nhấp chuột phải vào phần tử kiểm tra + +17 +00:01:37,640 --> 00:01:41,060 +và sau đó kiểm tra xem ID được gọi là gì. + +18 +00:01:41,060 --> 00:01:43,880 +Bởi vì Amazon có thể thay đổi điều này bất cứ lúc nào. + +19 +00:01:43,880 --> 00:01:50,690 +Bây giờ, khi bạn đã ghi lại, nếu bạn muốn một lớp cụ thể hoặc một ID cụ thể, hãy xem các chiến + +20 +00:01:50,690 --> 00:01:53,090 +lược định vị Selenium. + +21 +00:01:53,510 --> 00:02:00,680 +Bạn có thể thấy ở đây trong tài liệu Selenium, có nhiều cách để chúng ta có thể tìm thấy các phần tử khác nhau trên một trang. + +22 +00:02:00,680 --> 00:02:06,890 +Sử dụng Selenium, bạn có thể thấy rằng Selenium cung cấp hỗ trợ cho 8 chiến lược vị trí truyền thống này. + +23 +00:02:06,920 --> 00:02:13,490 +Trong trường hợp của chúng tôi, chúng tôi đang tìm kiếm thành phần giá trên trang của Amazon bằng cách chọn một tên lớp + +24 +00:02:13,490 --> 00:02:14,090 +cụ thể. + +25 +00:02:14,090 --> 00:02:19,100 +Hiện tại, tài liệu Selenium khá tốt và bao gồm các đoạn mã nhỏ tiện dụng cho mọi thứ bạn muốn + +26 +00:02:19,100 --> 00:02:19,630 +làm. + +27 +00:02:19,640 --> 00:02:26,420 +Vì vậy, ví dụ, ở đây bạn có thể xem cách tìm một phần tử theo tên lớp và đó chính xác là những gì chúng ta + +28 +00:02:26,420 --> 00:02:27,170 +cần làm. + +29 +00:02:27,170 --> 00:02:33,650 +Và bạn có thể làm điều đó bằng cách sử dụng phương thức tìm phần tử tùy thuộc vào việc bạn đang + +30 +00:02:33,650 --> 00:02:43,610 +tìm kiếm một phần tử theo tên lớp hay theo ID, chúng ta cần sử dụng một lớp được gọi bởi và nó có các trợ giúp chẳng hạn như theo tên lớp. + +31 +00:02:43,610 --> 00:02:49,100 +Và sau đó tất cả những gì chúng ta cần làm chỉ là chỉ định tên của lớp mà chúng ta muốn tìm. + +32 +00:02:49,250 --> 00:02:59,540 +Vì vậy, điều đầu tiên tôi sẽ làm là nhập theo lớp và đó chỉ là từ Selenium Webdriver chấm dấu chấm + +33 +00:02:59,540 --> 00:03:02,990 +chung bằng và sau đó nhập theo. + +34 +00:03:03,860 --> 00:03:10,070 +Sau đó, chúng ta có thể tạo một biến có tên là giá gạch dưới đô la để giữ phần tử giá đô + +35 +00:03:10,070 --> 00:03:11,660 +la từ trang Amazon. + +36 +00:03:15,900 --> 00:03:20,580 +Đối với giá trị sẽ lấy tên lớp của khoảng từ trang Amazon. + +37 +00:03:20,580 --> 00:03:28,080 +Vì vậy, lớp này được gọi là toàn bộ giá và chúng ta sẽ dán nó vào mã của mình và có lẽ sẽ dễ dàng hơn nếu bạn không mắc bất + +38 +00:03:28,080 --> 00:03:33,060 +kỳ lỗi chính tả nào, chỉ cần sao chép tên của lớp đó và dán vào mã của chúng ta. + +39 +00:03:33,570 --> 00:03:38,100 +Tiếp theo, chúng ta hãy làm điều tương tự cho phần thứ hai của giá, xu trên đồng đô la. + +40 +00:03:38,220 --> 00:03:45,240 +Vì vậy, chúng ta sẽ tạo một biến có tên là giá gạch dưới xu và chúng ta sẽ sử dụng dấu chấm trình + +41 +00:03:45,510 --> 00:03:51,750 +điều khiển, tìm phần tử theo tên lớp rồi đặt giá trị tên lớp bằng một phần giá. + +42 +00:03:53,010 --> 00:03:55,280 +Một lần nữa, những điều này có thể thay đổi vào thời điểm đó. + +43 +00:03:55,290 --> 00:04:01,830 +Việc ghi lại được gọi là phần giá, nhưng hãy nhớ kiểm tra tình hình thực tế khi bạn thực hiện + +44 +00:04:01,830 --> 00:04:02,820 +bài tập này. + +45 +00:04:03,390 --> 00:04:07,140 +Bây giờ hãy in ra giá đầy đủ dưới dạng chuỗi F. + +46 +00:04:07,320 --> 00:04:13,380 +Chúng ta sẽ viết, in, F, sau đó là giá và chúng ta sẽ chèn giá đô la vào. + +47 +00:04:16,670 --> 00:04:19,339 +Dấu chấm và sau đó là ý nghĩa giá cả. + +48 +00:04:21,980 --> 00:04:29,810 +Bây giờ, điều sẽ xảy ra ở đây nếu bạn thử chạy mã này là chúng ta thực sự đã tìm thấy phần tử theo + +49 +00:04:29,810 --> 00:04:30,770 +tên lớp. + +50 +00:04:30,770 --> 00:04:35,180 +Nhưng hiện tại, giá đô la và giá xu thực sự là một phần tử HTML. + +51 +00:04:35,180 --> 00:04:42,110 +Vì vậy nếu chúng ta muốn có văn bản bên trong các phần tử đó thì chúng ta phải truy cập vào nội dung văn bản. + +52 +00:04:42,110 --> 00:04:48,380 +Và bạn có thể thấy ở đây trong tài liệu Selenium để lấy nội dung văn bản, tất cả những gì chúng ta + +53 +00:04:48,410 --> 00:04:56,600 +cần làm chỉ là viết văn bản dấu chấm sau khi tìm thấy phần tử để chúng ta có thể thêm văn bản dấu chấm vào giá đô la và xu giá. + +54 +00:04:56,600 --> 00:05:02,390 +Vì vậy, bây giờ chúng ta thực sự có thể nắm được nội dung bên trong các phần tử HTML đó. + +55 +00:05:02,750 --> 00:05:08,810 +Bây giờ, tất cả những gì chúng ta cần làm là bỏ ghi chú dấu chấm thoát trình điều khiển vì nếu không, chúng ta sẽ có một phiên + +56 +00:05:08,810 --> 00:05:11,210 +bản Chrome mới chạy mỗi khi tôi nhấn nút chạy. + +57 +00:05:12,020 --> 00:05:18,980 +Và bây giờ nếu tôi nhấn chạy, bạn sẽ thấy trình duyệt của chúng tôi mở nhanh đến trang có pot tức thì, sau + +58 +00:05:18,980 --> 00:05:23,010 +đó nó sẽ đóng lại và bạn có thể thấy giá được in ngay tại đây. + +59 +00:05:23,280 --> 00:05:30,420 +Bây giờ, lý do tại sao điều này ngắn hơn nhiều so với những gì bạn đã làm trong dự án trước là vì chúng ta đang điều + +60 +00:05:30,420 --> 00:05:31,950 +khiển một trình duyệt. + +61 +00:05:31,950 --> 00:05:38,430 +Vì vậy, trình duyệt đã gửi tất cả các tiêu đề đó, tất cả thông tin mà Amazon mong + +62 +00:05:38,430 --> 00:05:40,740 +đợi từ người dùng thực tế. + +63 +00:05:40,740 --> 00:05:49,200 +Thay vì sử dụng yêu cầu nhận bằng gói yêu cầu chỉ có ba dòng, chúng ta có thể làm được nhiều việc hơn những gì chúng ta có + +64 +00:05:49,230 --> 00:05:51,270 +thể làm với món súp đẹp mắt. + +65 +00:05:51,420 --> 00:05:57,600 +Về cơ bản, nếu bạn nghĩ về điều đó, món súp đẹp mắt thực sự rất tốt khi chỉ lấy và thu + +66 +00:05:57,600 --> 00:06:05,610 +thập các mẩu dữ liệu từ một trang web HTML, nhưng nó sẽ bị kẹt khi trang web đó được hiển thị bằng JavaScript + +67 +00:06:05,610 --> 00:06:17,040 +hoặc Angular hoặc React và nội dung là HTML đã bị xóa. mất thời gian để tải hoặc nó yêu cầu một số điều kiện nhất định để tải, trong khi trong trường + +68 +00:06:17,040 --> 00:06:24,390 +hợp này, trên thực tế, chúng tôi đang thực hiện chính xác điều tương tự như khi con người truy + +69 +00:06:24,390 --> 00:06:30,600 +cập URL cụ thể này và sau đó xem xét phần tử này cũng như giá trị của nó. + +70 +00:06:31,650 --> 00:06:35,850 +Tôi muốn chỉ cho bạn một vài cách khác để bạn có thể tìm thấy các phần tử. + +71 +00:06:35,880 --> 00:06:42,270 +Bạn có thể thấy có rất nhiều cách để tìm các phần tử và có nhiều phương pháp hơn bạn có + +72 +00:06:42,270 --> 00:06:44,370 +để tạo ra món súp đẹp mắt. + +73 +00:06:44,640 --> 00:06:50,190 +Một điều tôi muốn cho bạn thấy khá hữu ích là tìm phần tử theo tên. + +74 +00:06:50,310 --> 00:06:59,100 +Nếu chúng ta truy cập Python. org, bạn sẽ nhớ từ các bài học về HTML và CSS rằng hầu hết các biểu + +75 +00:06:59,100 --> 00:07:02,640 +mẫu các biểu mẫu nhập này sẽ có thuộc tính tên. + +76 +00:07:02,640 --> 00:07:09,120 +Vì vậy, nếu tôi tiếp tục và kiểm tra thanh tìm kiếm này, bạn có thể thấy nó có ID, có tên, + +77 +00:07:09,120 --> 00:07:13,290 +có loại, có vai trò, có lớp, có cả đống thuộc tính. + +78 +00:07:13,320 --> 00:07:22,440 +Bây giờ tôi sẽ tìm kiếm nó bằng tên này, đó là Q Vì vậy, tất cả những gì tôi cần làm ở đây là gọi phương thức phần + +79 +00:07:22,440 --> 00:07:23,400 +tử find. + +80 +00:07:23,400 --> 00:07:29,070 +Và đối với lớp by helper của chúng tôi, tôi xác định rằng tôi muốn tìm kiếm theo tên. + +81 +00:07:29,070 --> 00:07:35,920 +Vì vậy, tên của phần tử và sau đó tôi cung cấp tên của thanh tìm kiếm, đó là Q. + +82 +00:07:37,880 --> 00:07:43,760 +Bây giờ, tất nhiên tôi sẽ phải thay đổi URL này thành python. org. + +83 +00:07:44,630 --> 00:07:51,230 +Và bây giờ, khi đã tìm thấy tên phần tử của mình, chúng tôi sẽ gọi nó là thanh tìm kiếm. + +84 +00:07:53,960 --> 00:07:57,950 +Và sau đó chúng ta sẽ tiếp tục in ra thanh tìm kiếm này. + +85 +00:08:00,410 --> 00:08:04,730 +Sau đó, chúng tôi sẽ nhận xét mã mà chúng tôi đã sử dụng cho Amazon rồi nhấn chạy. + +86 +00:08:06,050 --> 00:08:12,400 +Khi Selenium định vị một phần tử cụ thể, nó sẽ không in ra HTML thực tế. + +87 +00:08:12,410 --> 00:08:17,030 +Nó sẽ cung cấp cho bạn dưới dạng phần tử selen như thế này. + +88 +00:08:17,060 --> 00:08:24,380 +Bây giờ, nếu bạn muốn khai thác các thuộc tính, văn bản hoặc tên thẻ khác nhau của nó thì thực tế bạn sẽ phải thực hiện việc + +89 +00:08:24,380 --> 00:08:26,330 +đó bằng cách sử dụng dấu chấm. + +90 +00:08:26,480 --> 00:08:31,340 +Vì vậy, chúng ta có thể nói tên thẻ dấu chấm trên thanh tìm kiếm và nó sẽ cung cấp cho chúng ta điều đó. + +91 +00:08:31,340 --> 00:08:33,559 +Đó là một thẻ đầu vào. + +92 +00:08:34,010 --> 00:08:40,940 +Hoặc chúng ta có thể nói tìm kiếm, dấu chấm thanh, lấy thuộc tính và chúng ta có thể chỉ định thuộc tính mà chúng ta muốn + +93 +00:08:40,940 --> 00:08:41,500 +giá trị. + +94 +00:08:41,510 --> 00:08:47,720 +Vì vậy, ví dụ: nếu tôi muốn biết giá trị giữ chỗ là gì, thì tất cả những gì tôi phải làm là đặt phần giữ chỗ + +95 +00:08:47,720 --> 00:08:54,320 +thuộc tính get và sau đó chúng ta có thể in nó ra và nó sẽ cho chúng ta biết rằng phần giữ chỗ nói tìm kiếm. + +96 +00:08:54,930 --> 00:09:00,210 +Vì vậy, đó là thứ mà bạn sẽ thấy mọi người thường sử dụng với selen tìm phần tử theo tên. + +97 +00:09:00,210 --> 00:09:06,960 +Và nó thực sự hữu ích khi điền vào biểu mẫu web, vì hầu hết các biểu mẫu sẽ có các thành phần + +98 +00:09:06,960 --> 00:09:13,290 +được sắp xếp theo tên, vì khi biểu mẫu được gửi, tên đó sẽ được mang cùng với giá trị + +99 +00:09:13,290 --> 00:09:15,420 +của dữ liệu đầu vào. + +100 +00:09:16,440 --> 00:09:22,050 +Ngoài việc tìm phần tử theo tên và tên lớp, tất nhiên bạn có thể tìm phần tử theo ID. + +101 +00:09:22,380 --> 00:09:28,140 +Vì vậy, ví dụ: nút gửi bên cạnh thanh tìm kiếm có ID gửi. + +102 +00:09:28,410 --> 00:09:31,290 +Và một lần nữa, chúng ta cần sử dụng phương pháp phần tử hữu hạn. + +103 +00:09:31,290 --> 00:09:39,210 +Nhưng lần này chúng tôi xác định rằng chúng tôi muốn tìm phần tử theo ID và chúng tôi có thể thêm giá trị của + +104 +00:09:39,210 --> 00:09:40,590 +ID đó là submit. + +105 +00:09:41,670 --> 00:09:49,890 +Vì vậy, mã trông giống như nút này bằng phần tử tìm dấu chấm trình điều khiển theo ID, sau đó chúng tôi chèn giá + +106 +00:09:49,890 --> 00:09:53,610 +trị của ID đó, được gửi và tương tự như trước. + +107 +00:09:53,610 --> 00:09:57,010 +Khi chúng tôi đã tìm thấy phần tử, chúng tôi có thể nắm giữ nhiều thuộc tính khác nhau. + +108 +00:09:57,010 --> 00:10:00,130 +Ví dụ: chúng ta thậm chí có thể in ra kích thước của phần tử. + +109 +00:10:00,160 --> 00:10:01,360 +Hãy xem nó là gì. + +110 +00:10:01,390 --> 00:10:07,210 +Hãy tiếp tục và in nút mà chúng tôi đã tìm thấy phần tử đó và sau đó chúng tôi sử dụng kích thước dấu chấm để xem trang web + +111 +00:10:07,210 --> 00:10:07,630 +là gì. + +112 +00:10:08,050 --> 00:10:13,730 +Và nếu chúng ta in nó ra, chúng ta có thể thấy nó có chiều cao là 40 và chiều rộng là 46. + +113 +00:10:13,750 --> 00:10:22,240 +Vì vậy, Selenium thực sự mạnh mẽ và khả năng sử dụng các phương thức trợ giúp của chúng để tìm phần tử theo tên ID hoặc tên lớp cho phép + +114 +00:10:22,240 --> 00:10:28,930 +chúng tôi tiếp cận khá nhiều với bất kỳ trang web nào và nắm giữ bất kỳ phần tử nào chúng tôi muốn. + +115 +00:10:28,930 --> 00:10:35,590 +Và sau đó bằng cách sử dụng các thuộc tính này như kích thước hoặc văn bản, chúng ta có thể truy cập bất kỳ phần nào của phần tử mà + +116 +00:10:35,590 --> 00:10:36,640 +chúng ta quan tâm. + +117 +00:10:38,370 --> 00:10:44,070 +Vì vậy, bạn có thể thấy rằng chúng ta có thể làm được nhiều điều với selen hơn là với món súp đẹp mắt. + +118 +00:10:45,300 --> 00:10:46,440 +Vậy là ổn rồi. + +119 +00:10:46,440 --> 00:10:50,010 +Phần tử theo ID, theo tên, theo tên lớp. + +120 +00:10:50,580 --> 00:10:55,770 +Nhưng tất nhiên cũng có tính năng tìm phần tử bằng bộ chọn CSS. + +121 +00:10:55,890 --> 00:11:01,350 +Và đây có lẽ là một trong những cách dễ dàng nhất để thu hẹp một yếu tố cụ thể. + +122 +00:11:02,260 --> 00:11:06,100 +Giả sử tôi muốn giữ liên kết này tới tài liệu. + +123 +00:11:06,130 --> 00:11:07,810 +Hãy tiếp tục và kiểm tra nó. + +124 +00:11:07,810 --> 00:11:10,140 +Và nó tồn tại bên trong thẻ neo. + +125 +00:11:10,150 --> 00:11:12,790 +Nhưng bạn có thể thấy thẻ neo này không có lớp. + +126 +00:11:12,790 --> 00:11:17,110 +Nó không có ID, không có cách nhận dạng dễ dàng. + +127 +00:11:17,110 --> 00:11:18,980 +Vậy làm sao chúng ta có thể nắm bắt được nó? + +128 +00:11:19,000 --> 00:11:25,450 +Chà, chúng ta có thể thấy rằng nó tồn tại trong một phần tử đoạn văn và sau đó đi sâu hơn, nó nằm trong + +129 +00:11:25,450 --> 00:11:27,610 +một div với lớp cụ thể này. + +130 +00:11:27,610 --> 00:11:31,450 +Vì vậy, cái này có một lớp tiện ích tài liệu. + +131 +00:11:31,450 --> 00:11:33,130 +Vì vậy, điều đó khá cụ thể. + +132 +00:11:33,130 --> 00:11:40,090 +Vì vậy, nếu chúng ta muốn giữ thẻ liên kết đó, chúng ta có thể chỉ cần nói, bên trong div tiện ích tài liệu + +133 +00:11:40,090 --> 00:11:43,630 +này, hãy tiếp tục và tìm bất kỳ thẻ liên kết nào. + +134 +00:11:44,110 --> 00:11:50,260 +Và để thể hiện điều đó dưới dạng bộ chọn CSS, chúng tôi sẽ chỉ định tiện ích tài liệu lớp. + +135 +00:11:50,260 --> 00:11:54,790 +Và bên trong phần tử có lớp đó, chúng ta đang tìm kiếm một thẻ liên kết. + +136 +00:11:54,790 --> 00:11:58,960 +Vì vậy, điều này sẽ giúp chúng tôi nhận được liên kết tài liệu của chúng tôi. + +137 +00:12:00,150 --> 00:12:08,340 +Và bây giờ nếu tôi tiếp tục và in văn bản chấm liên kết tài liệu, bạn có thể thấy rằng nó thực + +138 +00:12:08,340 --> 00:12:11,940 +sự đang nắm giữ liên kết cụ thể này. + +139 +00:12:12,150 --> 00:12:19,800 +Và điều này được thực hiện ngay cả khi liên kết thực tế không có bất kỳ tên, lớp hoặc ID nào có thể dễ dàng nhận dạng. + +140 +00:12:21,150 --> 00:12:28,630 +Tương tự, đôi khi rất khó để tìm thấy một phần tử ngay cả bằng bộ chọn CSS. + +141 +00:12:28,650 --> 00:12:30,670 +Vì vậy, nếu vẫn thất bại. + +142 +00:12:30,690 --> 00:12:33,960 +Một thứ sẽ luôn hoạt động là XPath. + +143 +00:12:34,110 --> 00:12:42,180 +XPath là cách định vị một phần tử HTML cụ thể theo cấu trúc đường dẫn. + +144 +00:12:42,180 --> 00:12:45,210 +Vậy là bạn đã thấy đường dẫn trông như thế nào rồi phải không? + +145 +00:12:45,210 --> 00:12:47,370 +Công dụng chém Angela phát triển. + +146 +00:12:47,370 --> 00:12:48,110 +Vân vân. + +147 +00:12:48,120 --> 00:12:53,520 +Chà, chúng ta cũng có thể diễn đạt điều hướng đến một phần tử cụ thể. + +148 +00:12:53,550 --> 00:12:59,850 +Đi sâu từ ngọn cây đến một nút cụ thể bằng XPath. + +149 +00:12:59,970 --> 00:13:04,710 +Giả sử tôi muốn giữ liên kết này ở cuối trang web gửi sách. + +150 +00:13:04,890 --> 00:13:11,640 +Hãy tiếp tục và kiểm tra nó và bạn có thể thấy nó không đặc biệt độc đáo về việc có ID hoặc + +151 +00:13:11,640 --> 00:13:19,860 +lớp hay tên và thậm chí về mặt cấu trúc của nó, nó giống như trong Ul này và sau đó là ly, và nó có thể Không + +152 +00:13:19,860 --> 00:13:27,370 +dễ dàng để có được nó, nhưng đây là lúc XPath của chúng ta trở nên hữu ích, hãy tiếp tục và nhấp + +153 +00:13:27,370 --> 00:13:35,470 +chuột phải vào nó rồi sao chép bản sao XPath và bây giờ chúng ta có thể quay lại mã của mình và sử dụng + +154 +00:13:35,470 --> 00:13:38,500 +nó để chạm vào phần tử đó . + +155 +00:13:38,500 --> 00:13:43,540 +Vì vậy, nó sẽ nói trình điều khiển và sau đó chúng ta sẽ nói tìm phần tử bằng XPath. + +156 +00:13:43,540 --> 00:13:47,080 +Và sau đó chúng ta sẽ dán XPath vào bên trong đây. + +157 +00:13:48,850 --> 00:13:56,350 +Bây giờ hãy lưu ý rằng bản thân XPath thực sự có một số dấu ngoặc kép, vì vậy chúng ta phải thay đổi dấu ngoặc + +158 +00:13:56,350 --> 00:14:01,630 +kép thành dấu ngoặc đơn để nó không xung đột với dấu ngoặc kép bên trong. + +159 +00:14:01,630 --> 00:14:02,920 +Vì vậy, như thế này. + +160 +00:14:02,950 --> 00:14:12,610 +Bây giờ, khi chúng tôi đã tìm thấy liên kết lỗi của mình, chúng tôi sẽ in liên kết đó và tôi sẽ lấy + +161 +00:14:12,610 --> 00:14:14,050 +href ở đây. + +162 +00:14:14,770 --> 00:14:20,350 +Vì vậy, bây giờ tôi sẽ in văn bản liên kết lỗi của mình chỉ để chứng minh rằng điều này đã hiệu quả. + +163 +00:14:20,350 --> 00:14:27,100 +Và nếu tôi nhấn chạy, bạn có thể thấy nó mở trình duyệt của chúng tôi và bạn có thể thấy nó + +164 +00:14:27,100 --> 00:14:35,410 +đã quản lý được liên kết cụ thể đó bằng cách sử dụng XPath rất cụ thể này, trông rất giống một đường dẫn tệp + +165 +00:14:35,410 --> 00:14:42,850 +mà chúng tôi đang sử dụng, nhưng nó về cơ bản là cách chúng tôi điều hướng qua các div, URL, các liên + +166 +00:14:42,880 --> 00:14:46,120 +kết cho đến thẻ liên kết cụ thể đó. + +167 +00:14:46,780 --> 00:14:54,700 +Và điều tuyệt vời nhất là tất nhiên bạn có thể sử dụng nút này trong Chrome để định vị bất kỳ phần tử nào và + +168 +00:14:54,700 --> 00:14:57,580 +sau đó sẽ chọn vị trí của nó trong mã. + +169 +00:14:57,580 --> 00:15:04,060 +Và sau đó bạn có thể nhấp chuột phải rồi sao chép XPath của nó để nắm giữ thứ cụ thể đó. + +170 +00:15:05,130 --> 00:15:10,690 +Bây giờ tôi sẽ liên kết tới tài liệu về XPath từ các trường W3. + +171 +00:15:10,710 --> 00:15:17,100 +Nó đi sâu vào chi tiết hơn một chút về cách xây dựng Xpath, nhưng bạn không cần phải biết điều này + +172 +00:15:17,100 --> 00:15:18,780 +để làm việc với chúng. + +173 +00:15:18,780 --> 00:15:25,380 +Như tôi đã trình bày, bạn chỉ cần sử dụng các công cụ dành cho nhà phát triển Chrome và nó sẽ giúp bạn truy cập + +174 +00:15:25,380 --> 00:15:27,060 +mục cụ thể mà bạn quan tâm. + +175 +00:15:28,590 --> 00:15:36,480 +Bây giờ chúng ta đang xem xét việc tìm kiếm các phần tử bằng selen, nhưng hãy chú ý rằng chúng ta luôn mắc + +176 +00:15:36,480 --> 00:15:40,590 +kẹt với phiên bản số ít của phương thức Tìm phần tử đó. + +177 +00:15:40,620 --> 00:15:48,630 +Bây giờ, đối với mỗi phương pháp mà tôi đã chỉ cho bạn, cũng có một phương pháp tương tự, đó là các phần tử find. + +178 +00:15:48,630 --> 00:15:55,440 +Vì vậy, ví dụ: tìm các phần tử bằng bộ chọn CSS và tất nhiên điều này sẽ chỉ tìm cho bạn mọi thứ trên màn hình + +179 +00:15:55,440 --> 00:15:59,660 +phù hợp với tiêu chí của bạn và đưa nó cho bạn trong danh sách. + +180 +00:15:59,670 --> 00:16:06,390 +Và có một phiên bản của điều này cho mọi phương pháp tìm kiếm mà chúng tôi đã trình bày cho đến nay. + +181 +00:16:06,690 --> 00:16:12,990 +Trong bài học tiếp theo, tôi có một thử thách nhanh dành cho bạn là áp dụng những gì bạn đã học vào thực tế và + +182 +00:16:12,990 --> 00:16:17,130 +có thể xác định vị trí của bất kỳ thành phần nào trên một trang web. + +183 +00:16:17,130 --> 00:16:20,520 +Vì vậy, với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 Selenium-Documentation.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 Selenium-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..251d7f463a03a2471a45e0c8b070c167a18995d2 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 Selenium-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://selenium-python.readthedocs.io/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 day-48-Selenium-Completed-Lesson-Code.py.zip b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 day-48-Selenium-Completed-Lesson-Code.py.zip new file mode 100644 index 0000000000000000000000000000000000000000..86fd93efb4399594882d054588eba9d0c92239ef --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 day-48-Selenium-Completed-Lesson-Code.py.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:872b9b369ec29b2fd357cb5f4f8bc4bfd8079b1e90548cc8f1e7477388ab839a +size 997 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 w3schools-XPath-Tutorial.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 w3schools-XPath-Tutorial.url new file mode 100644 index 0000000000000000000000000000000000000000..919bd3b20b1c02eb01dd52d0fc496f8a420c91a4 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/003 w3schools-XPath-Tutorial.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.w3schools.com/xml/xpath_intro.asp \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Challenge Use Selenium to Scrape Website Data.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Challenge Use Selenium to Scrape Website Data.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..913091a8a0040c47d0995ff976bfcaf819f6c064 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Challenge Use Selenium to Scrape Website Data.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02f23acf25d0cd27eea8773b186d75d476082df402adcba6aad065c9690f052e +size 115765744 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Locator-Strategies.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Locator-Strategies.url new file mode 100644 index 0000000000000000000000000000000000000000..025f5361814a64db812d23d2d4abeb497835cc98 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Locator-Strategies.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.selenium.dev/documentation/webdriver/elements/locators/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Python.org.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Python.org.url new file mode 100644 index 0000000000000000000000000000000000000000..ab73b8459b553b5b85f050213eb16611a134dfed --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/004 Python.org.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.python.org/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Challenge Use Selenium in a Blank Project & Scrape a Different Piece of Data.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Challenge Use Selenium in a Blank Project & Scrape a Different Piece of Data.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..aa4500d5508166943a003cac5a508d6f2e1863d6 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Challenge Use Selenium in a Blank Project & Scrape a Different Piece of Data.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dd32ec5fe3c493226b44f22131915a5d87af39da71048510832c3145a2c6474 +size 47044738 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Challenge Use Selenium in a Blank Project & Scrape a Different Piece of Data_vi.srt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Challenge Use Selenium in a Blank Project & Scrape a Different Piece of Data_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2ca3c4557ec6681cadb0de40718e628232eb240f --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Challenge Use Selenium in a Blank Project & Scrape a Different Piece of Data_vi.srt @@ -0,0 +1,340 @@ +1 +00:00:00,360 --> 00:00:01,290 +Angela: Trong bài + +2 +00:00:01,290 --> 00:00:03,390 +học này, tôi có một thử thách siêu nhanh + +3 +00:00:03,390 --> 00:00:06,660 +khác dành cho bạn để bạn có thể thực hành thiết lập trình điều + +4 +00:00:06,660 --> 00:00:09,720 +khiển web Selenium trong một dự án trống và lấy một phần + +5 +00:00:09,720 --> 00:00:11,730 +dữ liệu khác từ một trang web. + +6 +00:00:11,730 --> 00:00:15,000 +Lần này chúng ta sẽ làm việc với trang chính Wikipedia. + +7 +00:00:15,000 --> 00:00:17,400 +Vì vậy, bạn có thể truy cập vào tài nguyên khóa + +8 +00:00:17,400 --> 00:00:19,650 +học và tìm liên kết đến trang này hoặc bạn chỉ + +9 +00:00:19,650 --> 00:00:21,033 +cần nhập liên kết đó vào. + +10 +00:00:21,960 --> 00:00:25,950 +Quay lại dự án của chúng ta, tôi sẽ tạo một tệp mới và tôi sẽ + +11 +00:00:25,950 --> 00:00:28,883 +gọi tương tác này. py. + +12 +00:00:32,520 --> 00:00:36,510 +Bây giờ, trong tệp Python mới này, chúng ta sẽ tương tác + +13 +00:00:36,510 --> 00:00:38,850 +với trang web Wikipedia này. + +14 +00:00:38,850 --> 00:00:41,850 +Và như một thử thách dành cho bạn, điều đầu tiên + +15 +00:00:41,850 --> 00:00:45,000 +tôi muốn bạn làm là tìm ra cách bạn có thể nắm giữ con + +16 +00:00:45,000 --> 00:00:47,190 +số cụ thể này và in nó ra trong phần + +17 +00:00:47,190 --> 00:00:51,120 +tương tác của chúng ta. py. + +18 +00:00:51,120 --> 00:00:54,421 +Hãy nhớ rằng bạn sẽ cần nhập Selenium + +19 +00:00:54,421 --> 00:00:59,010 +và cũng sử dụng trình điều khiển web để lấy trang này, + +20 +00:00:59,010 --> 00:01:01,410 +sau đó tìm số cụ thể này và cuối + +21 +00:01:01,410 --> 00:01:03,090 +cùng in nó ra. + +22 +00:01:03,090 --> 00:01:04,890 +Và khi bạn đã sẵn sàng chạy nó, tất cả + +23 +00:01:04,890 --> 00:01:06,360 +những gì bạn phải làm là nhấp chuột + +24 +00:01:06,360 --> 00:01:09,870 +phải rồi chạy tương tác này. py và nó sẽ hoạt động và bạn + +25 +00:01:09,870 --> 00:01:13,140 +sẽ thấy kết quả được in trong bảng điều khiển + +26 +00:01:13,140 --> 00:01:14,280 +của mình. + +27 +00:01:14,280 --> 00:01:16,833 +Vì vậy, hãy tạm dừng video ngay bây giờ và thử xem. + +28 +00:01:19,920 --> 00:01:22,110 +Được rồi, đây là giải pháp. + +29 +00:01:22,110 --> 00:01:25,680 +Đầu tiên, chúng ta sẽ đi vào gói Selenium mà chúng + +30 +00:01:25,680 --> 00:01:28,050 +ta đã cài đặt vào dự án này nên không + +31 +00:01:28,050 --> 00:01:30,300 +phải cài đặt lại. + +32 +00:01:30,300 --> 00:01:33,450 +Và sau đó chúng ta sẽ nhập trình điều khiển web. + +33 +00:01:33,450 --> 00:01:37,770 +Bây giờ bằng cách sử dụng trình điều khiển web, chúng tôi sẽ tạo trình điều + +34 +00:01:37,770 --> 00:01:40,023 +khiển mới từ trình duyệt Chrome. Nhưng + +35 +00:01:43,620 --> 00:01:48,120 +đây là những gì chúng tôi đưa ra để khởi tạo trình điều khiển Chrome mới. + +36 +00:01:48,120 --> 00:01:52,770 +Bây giờ, khi chúng ta đã tạo trình điều khiển, bây giờ chúng ta có thể + +37 +00:01:52,770 --> 00:01:57,270 +sử dụng trình điều khiển để điều hướng đến trang web của mình, việc + +38 +00:01:57,270 --> 00:01:59,760 +này được thực hiện bằng cách sử dụng + +39 +00:01:59,760 --> 00:02:03,663 +get và đây là URL mà chúng ta sẽ sao chép và dán vào đây. + +40 +00:02:04,620 --> 00:02:07,860 +Và khi chúng ta đã nắm được trang này, chúng + +41 +00:02:07,860 --> 00:02:11,310 +ta sẽ cố gắng thu hẹp yếu tố cụ thể này. + +42 +00:02:11,310 --> 00:02:14,190 +Vì vậy chúng ta hãy tiếp tục và kiểm tra nó. + +43 +00:02:14,190 --> 00:02:17,520 +Và bạn có thể thấy rằng nó nằm trong thẻ liên + +44 +00:02:17,520 --> 00:02:20,040 +kết không có mã định danh cụ thể. + +45 +00:02:20,040 --> 00:02:23,880 +Không có id, không có tên, không có lớp. + +46 +00:02:23,880 --> 00:02:27,780 +Nhưng thẻ neo này nằm trong div có id. + +47 +00:02:27,780 --> 00:02:31,980 +Vì vậy, số lượng bài viết này sẽ là mã định danh duy + +48 +00:02:31,980 --> 00:02:35,940 +nhất cho div chứa thẻ liên kết cụ thể này. + +49 +00:02:35,940 --> 00:02:38,100 +Vì vậy, chúng tôi có thể thu hẹp thẻ liên + +50 +00:02:38,100 --> 00:02:40,650 +kết này bằng cách sử dụng bộ chọn CSS của mình. + +51 +00:02:40,650 --> 00:02:44,970 +Vì vậy, chúng ta có thể nói lái xe. find_element(By. CSS_SELECTOR) hãy đảm + +52 +00:02:44,970 --> 00:02:48,030 +bảo rằng đó là phần tử chứ không phải phần tử. + +53 +00:02:48,030 --> 00:02:50,820 +Và bên trong đây chúng ta sẽ đặt + +54 +00:02:50,820 --> 00:02:55,170 +bộ chọn, đầu tiên là id của số bài viết và việc + +55 +00:02:55,170 --> 00:02:58,950 +đó sẽ được thực hiện bằng dấu thăng. + +56 +00:02:58,950 --> 00:03:01,860 +Và sau đó bên trong div có id đó, chúng tôi đang + +57 +00:03:01,860 --> 00:03:04,203 +tìm kiếm thẻ liên kết đầu tiên. + +58 +00:03:05,520 --> 00:03:07,230 +Bây giờ hãy chú ý rằng bên trong + +59 +00:03:07,230 --> 00:03:09,540 +div đó thực sự có hai thẻ liên kết. + +60 +00:03:09,540 --> 00:03:13,530 +Nhưng bằng cách sử dụng find_element(By. CSS_SELECTOR), nó sẽ chỉ cung + +61 +00:03:13,530 --> 00:03:15,510 +cấp cho chúng tôi cái đầu tiên + +62 +00:03:15,510 --> 00:03:17,940 +phù hợp với tiêu chí này. + +63 +00:03:17,940 --> 00:03:18,897 +Vì vậy, đây + +64 +00:03:18,897 --> 00:03:23,343 +sẽ là bài viết_count của chúng tôi. + +65 +00:03:25,050 --> 00:03:28,230 +Và bây giờ điều chúng ta muốn làm là in + +66 +00:03:28,230 --> 00:03:31,830 +ra Article_count. chữ. + +67 +00:03:31,830 --> 00:03:33,960 +Vì vậy, bây giờ hãy tiếp tục và nhấp chuột phải và + +68 +00:03:33,960 --> 00:03:36,630 +chạy tương tác của chúng ta. py. + +69 +00:03:36,630 --> 00:03:39,840 +Nó sẽ mở trình duyệt của chúng tôi đến trang này. + +70 +00:03:39,840 --> 00:03:43,293 +Và bây giờ đáng lẽ nó phải tìm và in ra con số đó. + +71 +00:03:44,130 --> 00:03:46,410 +Vì vậy, đây là những gì chúng tôi đã + +72 +00:03:46,410 --> 00:03:49,182 +và đang làm cho đến nay, tạo trình điều khiển, + +73 +00:03:49,182 --> 00:03:51,666 +mở các trang web, sau đó tìm các phần tử + +74 +00:03:51,666 --> 00:03:54,540 +cụ thể và in một số loại thuộc tính. + +75 +00:03:54,540 --> 00:03:58,020 +Nhưng bước tiếp theo là thực sự hình thành một + +76 +00:03:58,020 --> 00:04:00,510 +số loại tương tác với trang web. + +77 +00:04:00,510 --> 00:04:02,280 +Ví dụ: nhấp vào liên kết hoặc + +78 +00:04:02,280 --> 00:04:05,400 +nhập nội dung nào đó vào thanh tìm kiếm. + +79 +00:04:05,400 --> 00:04:08,070 +Bởi vì xét cho cùng, khi làm việc với các + +80 +00:04:08,070 --> 00:04:11,040 +trang web, chúng ta thường cần phải tương + +81 +00:04:11,040 --> 00:04:12,600 +tác với nó để điều hướng + +82 +00:04:12,600 --> 00:04:16,589 +đến các trang mới và nắm được những thông tin cụ thể mà chúng + +83 +00:04:16,589 --> 00:04:18,300 +ta quan tâm. + +84 +00:04:18,300 --> 00:04:21,089 +Và đó là những gì tôi sẽ chỉ cho bạn trong bài học tiếp theo. + +85 +00:04:21,089 --> 00:04:22,190 +Vậy tôi sẽ gặp bạn ở đó. + diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Wikipedia-Main-Page.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Wikipedia-Main-Page.url new file mode 100644 index 0000000000000000000000000000000000000000..0b91b8af796655012353a679982131e2f47831ce --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/005 Wikipedia-Main-Page.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/Main_Page \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Challenge-URL-Form-Sign-Up.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Challenge-URL-Form-Sign-Up.url new file mode 100644 index 0000000000000000000000000000000000000000..2fbe6312f74081b9e50a7e44f616fb4f22e6460e --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Challenge-URL-Form-Sign-Up.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://secure-retreat-92358.herokuapp.com/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Day-48-Completed-code-from-the-lessons.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Day-48-Completed-code-from-the-lessons.url new file mode 100644 index 0000000000000000000000000000000000000000..b8514ff07174d23a66942546910b4a4196f7745b --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Day-48-Completed-code-from-the-lessons.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://gist.github.com/TheMuellenator/48649eb4f1482387d94b6c92ae7e4cdf \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 How to Automate Filling Out Forms and Clicking Buttons with Selenium.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 How to Automate Filling Out Forms and Clicking Buttons with Selenium.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7d96a8f8f6243fd43e5c21f30cbf113b9aa7138c --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 How to Automate Filling Out Forms and Clicking Buttons with Selenium.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95a1aafe8cecd80bab8e425c6be27279467bc8d6da629ba2160e53635b04a51d +size 104380154 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 How to Automate Filling Out Forms and Clicking Buttons with Selenium_vi.srt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 How to Automate Filling Out Forms and Clicking Buttons with Selenium_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2ac01bfc16d854704e51690372d09d6cb8f2348c --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 How to Automate Filling Out Forms and Clicking Buttons with Selenium_vi.srt @@ -0,0 +1,852 @@ +1 +00:00:00,330 --> 00:00:01,470 +Người hướng dẫn: Trong + +2 +00:00:01,470 --> 00:00:04,200 +bài học trước, chúng ta đã tìm hiểu cách tìm các + +3 +00:00:04,200 --> 00:00:07,140 +phần tử bằng Selenium trên trang web. + +4 +00:00:07,140 --> 00:00:11,490 +Trong bài học này, tôi muốn tập trung hơn vào cách tương tác với những + +5 +00:00:11,490 --> 00:00:13,470 +phần tử mà bạn đã tìm thấy. + +6 +00:00:13,470 --> 00:00:17,610 +Ví dụ: nhập vào trường nhập hoặc + +7 +00:00:17,610 --> 00:00:19,653 +nhấp vào nút. + +8 +00:00:20,880 --> 00:00:22,410 +Điều đầu tiên tôi muốn + +9 +00:00:22,410 --> 00:00:25,620 +chỉ cho bạn là cách nhấp vào thứ gì đó. + +10 +00:00:25,620 --> 00:00:29,460 +Trong trường hợp này, chúng ta đã có sẵn một thẻ liên kết nằm + +11 +00:00:29,460 --> 00:00:32,640 +bên trong một khác biệt có tên là Article count. + +12 +00:00:32,640 --> 00:00:35,190 +Về cơ bản nó là thẻ neo này. + +13 +00:00:35,190 --> 00:00:38,400 +Và nếu tôi muốn nhấp vào nó, không phải sử + +14 +00:00:38,400 --> 00:00:41,550 +dụng chuột mà sử dụng Selenium, tất cả những + +15 +00:00:41,550 --> 00:00:45,720 +gì tôi phải làm là giữ phần tử, đó là bài viết_count, + +16 +00:00:45,720 --> 00:00:48,720 +sau đó gọi . bấm vào phương pháp trên nó. + +17 +00:00:48,720 --> 00:00:50,640 +Nó đơn giản như vậy. + +18 +00:00:50,640 --> 00:00:53,310 +Và khi tôi nhấn Chạy, bạn sẽ thấy rằng + +19 +00:00:53,310 --> 00:00:55,050 +con trỏ của tôi không ở gần + +20 +00:00:55,050 --> 00:00:57,030 +liên kết, nhưng nó thực sự + +21 +00:00:57,030 --> 00:01:01,200 +đã nhấp qua và đến trang thống kê từ liên kết đó. + +22 +00:01:01,200 --> 00:01:03,810 +Vì vậy, về cơ bản nó tương đương với việc tôi làm + +23 +00:01:03,810 --> 00:01:06,243 +điều này, nhưng nó được thực hiện tự động. + +24 +00:01:07,170 --> 00:01:10,410 +Đây là một cách mà chúng tôi có thể lấy được một liên + +25 +00:01:10,410 --> 00:01:12,360 +kết và sau đó nhấp vào nó. + +26 +00:01:12,360 --> 00:01:14,670 +Vì đây là yêu cầu phổ biến để nhấp + +27 +00:01:14,670 --> 00:01:17,010 +vào liên kết trên trang web nên Selenium + +28 +00:01:17,010 --> 00:01:20,370 +thực sự có một phương pháp tìm cụ thể giúp việc + +29 +00:01:20,370 --> 00:01:22,680 +này thực sự dễ dàng. + +30 +00:01:22,680 --> 00:01:25,290 +Ví dụ: nếu chúng ta muốn nhấp vào liên kết này có + +31 +00:01:25,290 --> 00:01:27,660 +nội dung Cổng nội dung, nơi nó liệt kê tất cả + +32 +00:01:27,660 --> 00:01:31,020 +các cổng Wikipedia khác nhau, về cơ bản là các phần phụ của Wikipedia, + +33 +00:01:31,020 --> 00:01:33,900 +thì một trong những điều chúng ta có thể làm chỉ đơn giản + +34 +00:01:33,900 --> 00:01:35,610 +là lấy văn bản liên kết này, mà Cổng + +35 +00:01:35,610 --> 00:01:38,640 +nội dung cho biết. Sau đó, chúng tôi có thể tạo một đối tượng + +36 +00:01:38,640 --> 00:01:41,040 +bằng trình điều khiển của mình bằng cách nhấn + +37 +00:01:41,040 --> 00:01:47,517 +vào tìm. + +38 +00:01:47,517 --> 00:01:47,517 +phần tử Bởi. VĂN BẢN LIÊN KẾT. + +39 +00:01:48,553 --> 00:01:51,003 +Và tất cả những gì chúng ta phải đưa vào đó là văn bản liên kết. + +40 +00:01:53,640 --> 00:01:57,060 +Vì vậy bây giờ tôi có thể nói all_portals. nhấp chuột. + +41 +00:01:57,060 --> 00:02:00,690 +Và nếu chúng ta tiếp tục và bình luận phần này, thì bạn có + +42 +00:02:00,690 --> 00:02:03,360 +thể thấy nó sẽ mở ra trang web của chúng ta + +43 +00:02:03,360 --> 00:02:05,490 +và nó sẽ nhấp vào tất cả các cổng đưa + +44 +00:02:05,490 --> 00:02:07,320 +chúng ta đến trang này. + +45 +00:02:07,320 --> 00:02:11,130 +Vì vậy, đây là một phương pháp tìm kiếm khá cụ thể + +46 +00:02:11,130 --> 00:02:14,820 +đối với các liên kết mà chúng tôi chỉ tìm thấy nó + +47 +00:02:14,820 --> 00:02:17,910 +bằng văn bản nằm giữa thẻ liên kết. + +48 +00:02:17,910 --> 00:02:20,700 +Vì vậy, ví dụ, khi tôi kiểm tra trên cổng + +49 +00:02:20,700 --> 00:02:23,010 +đó, bạn có thể thấy đây là thẻ neo + +50 +00:02:23,010 --> 00:02:25,980 +và văn bản liên kết là phần giữa thẻ mở và + +51 +00:02:25,980 --> 00:02:27,570 +thẻ đóng. + +52 +00:02:27,570 --> 00:02:31,170 +Vì vậy, giờ đây nó đang tìm kiếm theo văn bản đó, đây là nhu + +53 +00:02:31,170 --> 00:02:34,650 +cầu phổ biến mà bạn có thể có khi truy cập một trang web. + +54 +00:02:34,650 --> 00:02:36,750 +Bây giờ chúng ta đã biết cách có thể nhấp vào + +55 +00:02:36,750 --> 00:02:39,900 +các liên kết sau khi đã xác định được chúng, còn việc gõ thì sao? + +56 +00:02:39,900 --> 00:02:43,180 +Giả sử chúng tôi muốn tìm kiếm Python + +57 +00:02:44,250 --> 00:02:46,680 +trong thanh tìm kiếm này. + +58 +00:02:46,680 --> 00:02:48,150 +Làm thế nào chúng ta có thể làm điều đó? + +59 +00:02:48,150 --> 00:02:52,440 +Chà, trước tiên chúng ta hãy tiếp tục và giữ thanh tìm kiếm. + +60 +00:02:52,440 --> 00:02:54,243 +Vì vậy, tôi sẽ kiểm tra điều + +61 +00:02:55,290 --> 00:02:57,990 +đó và nó đưa tôi đến phần tử đầu vào này. + +62 +00:02:57,990 --> 00:03:01,440 +Và thứ mà chúng ta có thể xác định được là tên của nó, tương + +63 +00:03:01,440 --> 00:03:03,093 +đương với tìm kiếm. + +64 +00:03:06,330 --> 00:03:10,170 +Vì vậy tôi có thể sử dụng phương pháp của chúng tôi, đó là find. phần tử Bởi. NAME và sau đó chuyển + +65 +00:03:10,170 --> 00:03:13,110 +vào tìm kiếm làm tên của thành phần + +66 +00:03:13,110 --> 00:03:15,540 +mà tôi muốn giữ. + +67 +00:03:15,540 --> 00:03:18,300 +Bây giờ, khi tôi đã nắm được phần tử đó, + +68 +00:03:18,300 --> 00:03:22,110 +tôi có thể sử dụng một phương thức có tên send_keys. + +69 +00:03:22,110 --> 00:03:24,930 +Và đây sẽ là các phím từ bàn phím + +70 +00:03:24,930 --> 00:03:28,410 +mà bạn muốn gửi tới phần tử cụ thể này. + +71 +00:03:28,410 --> 00:03:30,840 +Vì vậy, giả sử tôi muốn gõ Python vào đó. + +72 +00:03:30,840 --> 00:03:35,130 +Chà, tất cả những gì tôi phải làm là gõ send_keys Python, + +73 +00:03:35,130 --> 00:03:37,800 +và bây giờ khi tôi nhấn Run, bạn + +74 +00:03:37,800 --> 00:03:40,500 +có thể thấy nó sẽ tự động đi tới đó + +75 +00:03:40,500 --> 00:03:42,630 +và gõ từ Python. + +76 +00:03:42,630 --> 00:03:45,210 +Tay tôi hoàn toàn rời khỏi bàn phím và + +77 +00:03:45,210 --> 00:03:48,060 +con trỏ của tôi không ở gần thanh tìm kiếm, + +78 +00:03:48,060 --> 00:03:51,000 +vì vậy tất cả đều được thực hiện tự động. + +79 +00:03:51,000 --> 00:03:52,980 +Bây giờ, khi chúng ta đã nhập Python, + +80 +00:03:52,980 --> 00:03:56,250 +điều tiếp theo chúng ta muốn làm là nhấn phím Return, + +81 +00:03:56,250 --> 00:03:58,110 +phải hoặc phím Enter. + +82 +00:03:58,110 --> 00:04:01,290 +Bây giờ, khi chúng ta muốn gửi một khóa không phải là + +83 +00:04:01,290 --> 00:04:04,320 +một chữ cái hay một trong các số hay ký hiệu thì chúng + +84 +00:04:04,320 --> 00:04:07,383 +ta thực sự phải thực hiện một đầu vào riêng. + +85 +00:04:08,790 --> 00:04:10,410 +Từ gói Selenium, bên + +86 +00:04:10,410 --> 00:04:12,540 +trong thư mục Web Driver có + +87 +00:04:12,540 --> 00:04:14,730 +một thư mục tên là Common và + +88 +00:04:14,730 --> 00:04:17,820 +bên trong có một thứ gọi là khóa. + +89 +00:04:17,820 --> 00:04:22,050 +Khóa này chứa một lớp được gọi là khóa và + +90 +00:04:22,050 --> 00:04:25,140 +chứa một loạt các hằng số. + +91 +00:04:25,140 --> 00:04:28,620 +Những gì chúng tôi có thể làm là chúng tôi có thể nói tìm kiếm. send_keys và khóa mà + +92 +00:04:28,620 --> 00:04:30,330 +chúng tôi sẽ gửi đến + +93 +00:04:30,330 --> 00:04:32,580 +từ lớp khóa này và đó là một + +94 +00:04:32,580 --> 00:04:34,470 +trong các hằng số trong + +95 +00:04:34,470 --> 00:04:36,930 +đó, được gọi là ENTER. + +96 +00:04:36,930 --> 00:04:38,910 +Về cơ bản đây là phím Return, nhưng + +97 +00:04:38,910 --> 00:04:43,117 +bạn có thể thấy còn có những phím khác như Shift hoặc Tab. + +98 +00:04:44,190 --> 00:04:46,410 +Về cơ bản, bất kỳ phím nào bạn có trên + +99 +00:04:46,410 --> 00:04:49,560 +bàn phím đều có thể được sao chép bởi lớp phím. + +100 +00:04:49,560 --> 00:04:52,170 +Thực tế, những gì chúng tôi đang làm ở + +101 +00:04:52,170 --> 00:04:54,990 +đây là tìm thanh tìm kiếm đó, nhập Python + +102 +00:04:54,990 --> 00:04:56,940 +và sau đó nhấn phím Enter. + +103 +00:04:56,940 --> 00:04:59,433 +Vì vậy, hãy chạy cái này và xem nó hoạt động. + +104 +00:05:02,130 --> 00:05:05,760 +Và điều đó đưa chúng ta đến kết quả tìm kiếm. + +105 +00:05:05,760 --> 00:05:09,930 +Vì vậy, bây giờ chúng ta đã thấy cách chúng ta có thể nhấp vào các + +106 +00:05:09,930 --> 00:05:13,560 +nút, khi chúng ta đã xác định được thứ gì đó có thể nhấp được, + +107 +00:05:13,560 --> 00:05:15,780 +như nút hoặc thẻ liên kết. + +108 +00:05:15,780 --> 00:05:20,520 +Chúng ta đã biết cách có thể nhập nội dung nào đó vào một + +109 +00:05:20,520 --> 00:05:22,500 +trường bằng Khóa Gửi. + +110 +00:05:22,500 --> 00:05:25,050 +Và cuối cùng, chúng ta đã thấy cách + +111 +00:05:25,050 --> 00:05:26,790 +có thể nhập lớp khóa này, + +112 +00:05:26,790 --> 00:05:29,520 +lớp này chứa toàn bộ các hằng đại diện + +113 +00:05:29,520 --> 00:05:31,830 +cho mã khóa cho nhiều khóa phổ + +114 +00:05:31,830 --> 00:05:36,063 +biến như Enter, Shift, Control, v.v. + +115 +00:05:37,050 --> 00:05:39,870 +Bây giờ tôi có một thử thách dành cho bạn. + +116 +00:05:39,870 --> 00:05:43,680 +Tôi muốn bạn thử xem liệu bạn có thể tự tìm ra + +117 +00:05:43,680 --> 00:05:48,210 +cách sử dụng Selenium để tự động chèn tên, họ và địa chỉ + +118 +00:05:48,210 --> 00:05:50,550 +email của bạn không, sau đó + +119 +00:05:50,550 --> 00:05:52,440 +nhấn nút Đăng ký để điền + +120 +00:05:52,440 --> 00:05:54,600 +vào biểu mẫu này. + +121 +00:05:54,600 --> 00:05:57,520 +Bây giờ, nếu bạn thành công, nó sẽ đưa bạn + +122 +00:06:00,780 --> 00:06:03,090 +đến trang Thành công này. + +123 +00:06:03,090 --> 00:06:05,070 +Bây giờ đừng lo lắng liệu bạn có thực sự nhập địa + +124 +00:06:05,070 --> 00:06:06,630 +chỉ email thực của mình hay không. + +125 +00:06:06,630 --> 00:06:09,180 +Đây là trang web mà chúng tôi đã tạo như một phần + +126 +00:06:09,180 --> 00:06:11,490 +của Khóa học phát triển web hoàn chỉnh. + +127 +00:06:11,490 --> 00:06:13,290 +Đó là một khóa học khác mà tôi tham + +128 +00:06:13,290 --> 00:06:16,800 +gia, đi sâu vào chi tiết về các công nghệ web như JavaScript, Node, + +129 +00:06:16,800 --> 00:06:19,650 +React và đây là trang web mà chúng tôi đã xây dựng trong + +130 +00:06:19,650 --> 00:06:20,970 +khóa học đó. + +131 +00:06:20,970 --> 00:06:23,370 +Bây giờ, lý do tôi đưa bạn đến trang này là + +132 +00:06:23,370 --> 00:06:27,210 +vì tôi không muốn bạn truy cập vào một trang web ngẫu nhiên, giống + +133 +00:06:27,210 --> 00:06:28,650 +như một trang web thực sự + +134 +00:06:28,650 --> 00:06:31,740 +nơi họ thực sự đang thu thập dữ liệu hợp lệ. + +135 +00:06:31,740 --> 00:06:34,530 +Nếu chúng tôi đang thực hành và thực hiện các bài tập của mình trên một + +136 +00:06:34,530 --> 00:06:35,490 +trang web thực, thì cuối + +137 +00:06:35,490 --> 00:06:37,920 +cùng chúng tôi sẽ cung cấp cho họ rất nhiều lưu lượng truy cập + +138 +00:06:37,920 --> 00:06:39,930 +bot và điều đó không tốt cho trang web. + +139 +00:06:39,930 --> 00:06:43,260 +Đây là lý do tại sao tôi yêu cầu các bạn sử dụng trang web của riêng tôi, + +140 +00:06:43,260 --> 00:06:45,660 +trang web này được thiết lập để thử nghiệm. + +141 +00:06:45,660 --> 00:06:48,810 +Liên kết đến trang nằm trong tài nguyên khóa học hoặc bạn có + +142 +00:06:48,810 --> 00:06:51,570 +thể nhập liên kết đó vào như bạn có thể thấy ở đây. + +143 +00:06:51,570 --> 00:06:54,000 +Bây giờ, như tôi đã đề cập, đây không + +144 +00:06:54,000 --> 00:06:57,840 +phải là đăng ký nhận bản tin thực tế của chúng tôi, mà nằm trên + +145 +00:06:57,840 --> 00:07:01,440 +trang này, nơi hàng tháng tôi đích thân viết thư cho bạn + +146 +00:07:01,440 --> 00:07:04,770 +để cập nhật cho bạn về những gì chúng tôi đã làm, những + +147 +00:07:04,770 --> 00:07:06,944 +gì tôi đã làm và một số bài viết tôi + +148 +00:07:06,944 --> 00:07:09,300 +tìm thấy trên internet mà tôi thấy + +149 +00:07:09,300 --> 00:07:11,340 +thực sự thú vị về mặt lập trình, + +150 +00:07:11,340 --> 00:07:14,880 +thiết kế hoặc văn hóa khởi nghiệp. + +151 +00:07:14,880 --> 00:07:16,830 +Nếu bạn thực sự muốn đăng ký nhận bản tin, + +152 +00:07:16,830 --> 00:07:20,220 +hãy truy cập liên kết này và nhập địa chỉ email của bạn vào đây. + +153 +00:07:20,220 --> 00:07:23,550 +Nhưng để kiểm tra kỹ năng của bạn trên Selenium, chúng tôi + +154 +00:07:23,550 --> 00:07:26,010 +muốn bạn truy cập vào liên kết này và xem liệu + +155 +00:07:26,010 --> 00:07:28,740 +bạn có thể tự động điền vào biểu mẫu này bằng những + +156 +00:07:28,740 --> 00:07:30,210 +gì bạn đã học được hay không, + +157 +00:07:30,210 --> 00:07:33,480 +sau đó yêu cầu Selenium của bạn nhấp vào Đăng ký. + +158 +00:07:33,480 --> 00:07:34,530 +Hãy tạm dừng video ngay bây giờ + +159 +00:07:34,530 --> 00:07:36,723 +và xem liệu bạn có thể hoàn thành thử thách này không. + +160 +00:07:39,960 --> 00:07:43,390 +Vì vậy, điều đầu tiên chúng ta cần làm là sao chép + +161 +00:07:44,460 --> 00:07:46,470 +URL rồi quay lại đây và tôi sẽ + +162 +00:07:46,470 --> 00:07:51,470 +thay đổi trình điều khiển của mình để chuyển sang URL mới này. + +163 +00:07:51,870 --> 00:07:54,870 +Bây giờ, khi tôi đã có URL mới, tôi muốn tiếp + +164 +00:07:54,870 --> 00:07:58,800 +tục và cố gắng tìm và xác định từng trường này. + +165 +00:07:58,800 --> 00:08:01,020 +Vì vậy, hãy nhấp vào Kiểm tra. + +166 +00:08:01,020 --> 00:08:04,923 +Và bạn có thể thấy trường đầu tiên này có tên là fName. + +167 +00:08:05,910 --> 00:08:08,610 +Cái thứ hai có tên lName và + +168 +00:08:08,610 --> 00:08:11,730 +cái cuối cùng có tên email. + +169 +00:08:11,730 --> 00:08:15,690 +Vì vậy, hãy xác định những người sử dụng trình điều khiển của chúng tôi. tìm và chúng ta sẽ sử dụng + +170 +00:08:17,910 --> 00:08:20,760 +tìm. phần tử Bởi. NAME, chuyển + +171 +00:08:20,760 --> 00:08:25,760 +vào fName, sau đó là lName cho họ, và sau đó là + +172 +00:08:27,210 --> 00:08:28,653 +email. + +173 +00:08:30,720 --> 00:08:35,133 +Vì vậy, đây sẽ là tên, họ và email của chúng tôi. + +174 +00:08:39,480 --> 00:08:41,669 +Bước tiếp theo là thực sự điền nó vào. + +175 +00:08:41,669 --> 00:08:44,100 +Vì vậy chúng ta sẽ nói first_name. send_keys, sau + +176 +00:08:44,100 --> 00:08:47,340 +đó tôi sẽ nhập tên của mình và sau đó + +177 +00:08:47,340 --> 00:08:50,040 +sẽ là họ. send_keys, sau đó + +178 +00:08:50,040 --> 00:08:52,203 +tôi sẽ nhập họ của mình. + +179 +00:08:53,430 --> 00:08:55,950 +Và cuối cùng chúng ta đã nhận được email + +180 +00:08:55,950 --> 00:08:58,863 +của mình và tôi sẽ chuyển qua một email giả. + +181 +00:09:01,260 --> 00:09:04,230 +Vì vậy, bây giờ tôi sẽ thử tìm nút này bằng + +182 +00:09:04,230 --> 00:09:05,880 +cách kiểm tra nó và xem + +183 +00:09:05,880 --> 00:09:09,900 +cách tôi có thể xác định nó bằng mã của mình. + +184 +00:09:09,900 --> 00:09:14,640 +Vì vậy, đó là một nút có tất cả các lớp và loại này, nhưng + +185 +00:09:14,640 --> 00:09:16,620 +không có ID hoặc tên. + +186 +00:09:16,620 --> 00:09:21,150 +Vì đây là thành phần nút duy nhất bên trong biểu mẫu này nên tôi sẽ + +187 +00:09:21,150 --> 00:09:22,350 +tiếp tục và xác định + +188 +00:09:22,350 --> 00:09:25,143 +nó bằng cách sử dụng CSS_SELECTOR. + +189 +00:09:29,670 --> 00:09:33,513 +Vì vậy, nó ở bên trong biểu mẫu và là một thành phần nút. + +190 +00:09:34,800 --> 00:09:36,600 +Và cuối cùng, khi tôi đã tìm thấy + +191 +00:09:36,600 --> 00:09:38,493 +nó, tôi chỉ cần nhấp vào nó. + +192 +00:09:39,750 --> 00:09:41,850 +Vậy nên kịch bản của chúng ta sẽ diễn ra theo thứ tự. + +193 +00:09:41,850 --> 00:09:43,770 +Vì vậy, trước tiên nó sẽ tải trang + +194 +00:09:43,770 --> 00:09:47,250 +lên, nhập tất cả những thứ này và cuối cùng nhấp vào nó. + +195 +00:09:47,250 --> 00:09:49,593 +Vì vậy, hãy nhấn chạy và xem nó có hiệu quả không. + +196 +00:09:51,990 --> 00:09:54,000 +Tốc độ đó nhanh như chớp, vì + +197 +00:09:54,000 --> 00:09:56,370 +rõ ràng đó không phải là tôi đang + +198 +00:09:56,370 --> 00:09:58,080 +gõ và nó đã nhấp vào nút và + +199 +00:09:58,080 --> 00:10:01,110 +đưa chúng tôi đến trang Thành công. + +200 +00:10:01,110 --> 00:10:03,120 +Làm thế nào bạn tiếp tục với điều đó? + +201 +00:10:03,120 --> 00:10:06,990 +Vì vậy, bây giờ chúng ta đã biết cách sử dụng Selenium để + +202 +00:10:06,990 --> 00:10:11,130 +tìm các phần tử tương tác với chúng bằng cách nhấp và gõ. + +203 +00:10:11,130 --> 00:10:15,390 +Ngoài ra, chúng tôi đã biết cách có thể nhập hằng số phím để tương + +204 +00:10:15,390 --> 00:10:19,053 +tác với trang web bằng bất kỳ phím nào trên bàn phím. + +205 +00:10:19,950 --> 00:10:22,080 +Có khá nhiều phương pháp chúng tôi đã trải qua. + +206 +00:10:22,080 --> 00:10:24,060 +Có thể đáng để ghi lại và xem lại nhanh + +207 +00:10:24,060 --> 00:10:27,300 +về cách chúng ta đã thực hiện được tất cả những điều này + +208 +00:10:27,300 --> 00:10:29,940 +bằng cách sử dụng Selenium, vì trong bài học + +209 +00:10:29,940 --> 00:10:31,260 +tiếp theo, chúng ta sẽ + +210 +00:10:31,260 --> 00:10:33,300 +có dự án cuối cùng sắp ra mắt và tất + +211 +00:10:33,300 --> 00:10:37,020 +cả sẽ tùy thuộc vào bạn hãy thử và giải quyết nó. + +212 +00:10:37,020 --> 00:10:38,880 +Vì vậy, với tất cả những điều đó và hơn thế nữa, + +213 +00:10:38,880 --> 00:10:40,480 +tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 My-Web-Dev-Course.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 My-Web-Dev-Course.url new file mode 100644 index 0000000000000000000000000000000000000000..d9885c4fb1c0ce775edaf9f737e84e114735a574 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 My-Web-Dev-Course.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/the-complete-web-development-bootcamp/?referralCode=F2958B9D9447BDFC8244 \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Our-Actual-Newsletter.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Our-Actual-Newsletter.url new file mode 100644 index 0000000000000000000000000000000000000000..81853fb70850ce2741ca10e2b35a59a948503e55 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/006 Our-Actual-Newsletter.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.appbrewery.co/p/newsletter \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The Cookie Clicker Project.mp4 b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The Cookie Clicker Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a449511137c0ec7dca97c66123d0df831e43f07d --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The Cookie Clicker Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0144ed1805479ff11edc2f1853726520141c924c99527e1d044702a658ff71a4 +size 51847864 diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The Cookie Clicker Project_vi.srt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The Cookie Clicker Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ddc97e826e4020fef55eb71cf22a7bad0bb0b956 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The Cookie Clicker Project_vi.srt @@ -0,0 +1,212 @@ +1 +00:00:00,240 --> 00:00:04,800 +Bây giờ là lúc cho dự án cuối cùng, nơi chúng tôi đưa mọi thứ vào thực tế. + +2 +00:00:05,160 --> 00:00:08,430 +Bây giờ, trước khi tôi tiết lộ thông điệp tiếp theo, chỉ là một lời cảnh báo. + +3 +00:00:08,850 --> 00:00:12,930 +Nó có nội dung rõ ràng. Nếu bạn đang đói, nếu bạn + +4 +00:00:12,930 --> 00:00:16,590 +chưa ăn, nếu bạn đang nhịn ăn không liên tục như tôi, + +5 +00:00:17,130 --> 00:00:19,950 +có lẽ nên bỏ qua hình ảnh tiếp theo. + +6 +00:00:24,470 --> 00:00:26,630 +1: Hãy để chúng tôi mô tả những gì chúng + +7 +00:00:26,630 --> 00:00:30,020 +tôi sẽ làm 0: trong dự án này, chúng tôi sẽ nướng một số bánh quy. + +8 +00:00:30,620 --> 00:00:33,170 +Chúng ta sẽ chơi trò chơi clicker cookie, nhưng chúng + +9 +00:00:33,560 --> 00:00:36,560 +ta sẽ không làm điều đó bình thường như một người bình thường. + +10 +00:00:36,560 --> 00:00:40,130 +Chúng tôi sẽ không đi và nhấp vào cookie của chúng tôi và kết thúc không mệt mỏi với chấn thương căng thẳng lặp + +11 +00:00:40,130 --> 00:00:44,960 +đi lặp lại và chơi trò chơi như thể chúng ta là một con người. Không, chúng tôi sẽ chơi nó + +12 +00:00:44,990 --> 00:00:49,010 +bằng cách sử dụng một bot Python được tạo bằng selen. + +13 +00:00:49,610 --> 00:00:54,610 +Vì vậy, gần đây tôi đã tìm kiếm trên Reddit và có rất nhiều bài đăng nói về việc trò chơi + +14 +00:00:54,920 --> 00:00:59,180 +clicker cookie này gây nghiện như thế nào. Tại sao trò chơi này lại gây + +15 +00:00:59,180 --> 00:01:03,860 +nghiện, clicker cookie đã hủy hoại cuộc đời tôi. Và khi bạn nghĩ về nó, nó + +16 +00:01:03,860 --> 00:01:05,960 +là một trò chơi đơn giản. + +17 +00:01:06,680 --> 00:01:11,540 +Tất cả nó là một cookie khổng lồ lớn, bạn nhấp vào nó nhanh nhất có thể. + +18 +00:01:11,990 --> 00:01:15,020 +Và khi bạn đã có một số cookie, + +19 +00:01:15,230 --> 00:01:18,950 +sau đó bạn có thể mua một số nâng cấp nhất + +20 +00:01:19,010 --> 00:01:22,940 +định như con trỏ, sẽ tự động nhấp vào cookie cho bạn. + +21 +00:01:23,390 --> 00:01:27,560 +Và nếu bạn nhận được nhiều cookie hơn nữa, bạn có thể mua những thứ khác. + +22 +00:01:27,800 --> 00:01:29,990 +Ví dụ, khi bạn có một trăm chiếc + +23 +00:01:32,660 --> 00:01:36,860 +bánh quy, bạn có thể nhờ một người bà sẽ nướng nhiều bánh hơn cho bạn. + +24 +00:01:37,760 --> 00:01:42,760 +Nhưng chúng tôi sẽ không làm điều đó theo cách thủ công vì thực tế tôi không thể + +25 +00:01:43,370 --> 00:01:47,210 +nhấp vào với tốc độ này. Chúng tôi sẽ yêu cầu bot của mình quyết định + +26 +00:01:47,210 --> 00:01:51,860 +mua những tiện ích bổ sung nào phù hợp và mua càng nhiều tiện ích bổ sung này khi chúng tôi có tiền và + +27 +00:01:52,280 --> 00:01:55,760 +chúng tôi sẽ yêu cầu tất cả các bot liên tục nhấp vào cookie để nướng thậm chí + +28 +00:01:55,760 --> 00:01:56,593 +nhiều cookie hơn. + +29 +00:01:57,110 --> 00:02:01,760 +Vì vậy, mục tiêu là chúng tôi đang cố gắng tăng tối đa xếp hạng cookie mỗi + +30 +00:02:01,820 --> 00:02:05,030 +giây này, bởi vì bạn mua càng nhiều tiện ích bổ sung + +31 +00:02:05,030 --> 00:02:07,280 +này, bạn càng nhấp vào cookie thường xuyên + +32 +00:02:07,640 --> 00:02:10,729 +hơn, thì bạn càng nướng được nhiều cookie hơn mỗi giây. + +33 +00:02:11,810 --> 00:02:16,810 +Vì vậy, về cơ bản những gì chúng tôi muốn làm là thậm chí không chạm vào chuột và sử dụng selen để + +34 +00:02:18,440 --> 00:02:20,180 +chơi trò chơi này cho chúng tôi. + +35 +00:02:20,360 --> 00:02:24,230 +Và chúng tôi sẽ cố gắng đạt được một số điểm cao bằng cách gian lận về cơ bản. + +36 +00:02:25,160 --> 00:02:29,990 +Vì vậy, mục tiêu là tăng tối đa cookie mỗi giây và chúng tôi sẽ + +37 +00:02:30,410 --> 00:02:35,410 +chơi trò chơi này bằng cách tự động nhấp vào cookie này bằng cách sử + +38 +00:02:35,690 --> 00:02:36,680 +dụng selen. + +39 +00:02:37,100 --> 00:02:41,330 +Và khi chúng tôi đã nhấp trong năm giây, chúng tôi sẽ xem đâu là giá + +40 +00:02:41,360 --> 00:02:45,620 +trị gia tăng cao nhất mà chúng tôi có thể đạt được và sau đó chúng + +41 +00:02:45,950 --> 00:02:49,220 +tôi sẽ mua nó để giúp chúng tôi chơi trò chơi. + +42 +00:02:49,730 --> 00:02:54,110 +Vì vậy, mục tiêu vào cuối ngày là chúng ta sẽ chạy chương trình + +43 +00:02:54,110 --> 00:02:56,240 +trong năm phút. Và vào cuối năm + +44 +00:02:56,510 --> 00:02:59,180 +phút, chúng tôi sẽ kiểm tra cookie của mình mỗi giây. + +45 +00:02:59,800 --> 00:03:04,090 +Và chúng tôi sẽ cạnh tranh với nhau về con số đó vì tất nhiên bạn có thể nhận được + +46 +00:03:04,090 --> 00:03:08,770 +selen để chơi trò chơi theo những cách khác nhau. Vì vậy, những gì tôi khuyên bạn đầu + +47 +00:03:08,770 --> 00:03:13,450 +tiên trước khi bạn bắt đầu với dự án là chỉ cần truy cập liên kết này + +48 +00:03:13,480 --> 00:03:15,070 +trong tài nguyên khóa học + +49 +00:03:15,310 --> 00:03:20,310 +và thực sự chơi trò chơi trước với tư cách là con người để bạn có thể hiểu + +50 +00:03:20,350 --> 00:03:25,350 +cách nó hoạt động và xem những tiện ích này như thế nào. thực sự giúp chúng tôi + +51 +00:03:25,930 --> 00:03:29,950 +cải thiện tỷ lệ nướng bánh quy. Tạm dừng video ngay bây giờ, truy cập + +52 +00:03:30,130 --> 00:03:34,090 +liên kết này, chơi trò chơi có thể trong năm phút và sau đó chuyển sang bài + +53 +00:03:34,090 --> 00:03:37,720 +học tiếp theo, nơi có hướng dẫn đầy đủ về cách hoàn thành thử thách này. + diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The-Cookie-Clicker-Game.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The-Cookie-Clicker-Game.url new file mode 100644 index 0000000000000000000000000000000000000000..1dc2eb8e425ae8c24611e12a655301767c40320c --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/007 The-Cookie-Clicker-Game.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://orteil.dashnet.org/cookieclicker/ \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/008 Challenge Create an Automated Game Playing Bot.html b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/008 Challenge Create an Automated Game Playing Bot.html new file mode 100644 index 0000000000000000000000000000000000000000..37434c64eb142a5dafc3d92ea357672577a194d2 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/008 Challenge Create an Automated Game Playing Bot.html @@ -0,0 +1 @@ +

1. Go to the game website and familiarise yourself with how it works:

http://orteil.dashnet.org/experiments/cookie/ (classic version)

2. Create a bot using Selenium and Python to click on the cookie as fast as possible.

3. Every 5 seconds, check the right-hand pane to see which upgrades are affordable and purchase the most expensive one. You'll need to check how much money (cookies) you have against the price of each upgrade.

e.g. both Grandma and Cursor are affordable as we have 103 cookies, but Grandma is the more expensive one, so we'll purchase that instead of the cursor.

HINT 1: https://www.w3schools.com/python/ref_string_split.asp

HINT 2: https://www.w3schools.com/python/ref_string_strip.asp

HINT 3: https://www.w3schools.com/python/ref_string_replace.asp

HINT 4: https://stackoverflow.com/questions/13293269/how-would-i-stop-a-while-loop-after-n-amount-of-time

4. After 5 minutes have passed since starting the game, stop the bot and print the "cookies/second". e.g. this is mine:

5. Once you've managed to get the bot to work, feel free to tweak the algorithm if you think there is a better way to play the game. e.g. Change the time, instead of every 5 seconds to check the upgrades, what if you did every second. Or maybe the bot should buy all the affordable upgrades. Post your algorithm in the Q&A and impress us all if you manage to get a higher cookies/second with your algo.


SOLUTION

\ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/008 Course-Fixes-Report-an-Issue.url b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/external-links.txt b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..44659ecfc56667f1a9acc9afa9f38c46830466b9 --- /dev/null +++ b/part3/48 - Day 48 - Intermediate+ Selenium Webdriver Browser and Game Playing Bot/external-links.txt @@ -0,0 +1,39 @@ + +001 Addiction-Warning-The-Cookie-Clicker-Game +https://orteil.dashnet.org/cookieclicker/ + +002 Download-and-Install-the-Chrome-Browser +https://www.google.com/intl/en_uk/chrome/ + +003 w3schools-XPath-Tutorial +https://www.w3schools.com/xml/xpath_intro.asp + +003 Selenium-Documentation +https://selenium-python.readthedocs.io/ + +004 Python.org +https://www.python.org/ + +004 Locator-Strategies +https://www.selenium.dev/documentation/webdriver/elements/locators/ + +005 Wikipedia-Main-Page +https://en.wikipedia.org/wiki/Main_Page + +006 Challenge-URL-Form-Sign-Up +http://secure-retreat-92358.herokuapp.com/ + +006 Our-Actual-Newsletter +https://www.appbrewery.co/p/newsletter + +006 My-Web-Dev-Course +https://www.udemy.com/course/the-complete-web-development-bootcamp/?referralCode=F2958B9D9447BDFC8244 + +006 Day-48-Completed-code-from-the-lessons +https://gist.github.com/TheMuellenator/48649eb4f1482387d94b6c92ae7e4cdf + +007 The-Cookie-Clicker-Game +https://orteil.dashnet.org/cookieclicker/ + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 Day 49 Goals what you will make by the end of the day.mp4 b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 Day 49 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..226ab56e6fe25dd91035e7db8edccd2f8e5ce63f --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 Day 49 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89c28c04103d5ebb4cffe453e6e12eee553ff18c9df02b3cf276919d09e0463a +size 21508428 diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 Day 49 Goals what you will make by the end of the day_vi.srt b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 Day 49 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..eccef6cb3ab53a6c20a3d16aac6e688fca0c7968 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 Day 49 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,192 @@ +1 +00:00:00,780 --> 00:00:04,500 +Xin chào các bạn, chào mừng đến với Ngày 49 của 100 Ngày viết mã. + +2 +00:00:05,040 --> 00:00:09,960 +Chúng tôi đã đi gần nửa chặng đường và hôm nay chúng tôi có một dự án thực sự đặc biệt dành cho bạn. + +3 +00:00:10,350 --> 00:00:15,500 +Bây giờ, tôi biết rất nhiều bạn đang học Lập trình để kiếm một công việc mới hoặc thay đổi lĩnh + +4 +00:00:17,010 --> 00:00:18,660 +vực mà bạn làm việc, và + +5 +00:00:18,960 --> 00:00:22,110 +về cơ bản chỉ để tìm cơ hội tốt hơn cho bản thân. + +6 +00:00:22,620 --> 00:00:27,000 +Vì vậy, dự án hôm nay sẽ kiểm tra những gì bạn đã học về cách + +7 +00:00:27,000 --> 00:00:27,833 +làm việc + +8 +00:00:27,930 --> 00:00:32,310 +với selen và chúng tôi sẽ xây dựng một bot đơn xin việc tự động. + +9 +00:00:32,940 --> 00:00:36,480 +Điều này sẽ đưa tất cả các kỹ năng mà chúng ta đã học ngày + +10 +00:00:36,780 --> 00:00:40,740 +hôm qua vào sử dụng khi chúng ta có được trình điều khiển web selen để điều + +11 +00:00:40,800 --> 00:00:43,680 +khiển trình duyệt mở một trang web và nộp đơn xin việc. + +12 +00:00:44,280 --> 00:00:48,090 +Vì vậy, việc nộp đơn xin việc có thể khá tẻ nhạt khi làm việc + +13 +00:00:48,090 --> 00:00:48,930 +qua từng đơn + +14 +00:00:48,960 --> 00:00:53,960 +xin việc, điền vào các chi tiết được yêu cầu và hy vọng rằng đơn xin việc của bạn nổi bật. + +15 +00:00:55,950 --> 00:01:00,300 +Vì vậy, hãy xem liệu chúng ta có thể tự làm điều này dễ dàng hơn bằng cách tự động hóa quy trình hay không. + +16 +00:01:01,200 --> 00:01:05,519 +Bây giờ, một trong những cách mà rất nhiều người xin việc là trên LinkedIn. + +17 +00:01:05,820 --> 00:01:09,600 +Vì vậy, họ có phần này được gọi là việc làm. Và khi bạn đến đó, bạn có + +18 +00:01:09,600 --> 00:01:12,660 +thể tìm kiếm loại công việc bạn đang tìm kiếm, nơi bạn đang + +19 +00:01:12,990 --> 00:01:16,560 +muốn làm việc, thậm chí bạn có thể thêm vào các bộ lọc như chỉ + +20 +00:01:16,560 --> 00:01:20,880 +hiển thị công việc từ xa nơi bạn có thể làm việc từ mọi nơi trên thế giới. + +21 +00:01:21,240 --> 00:01:24,840 +Và họ cũng có tính năng thực sự gọn gàng này được gọi là dễ áp dụng. + +22 +00:01:25,500 --> 00:01:29,640 +Và tất cả những gì bạn phải làm là chỉ cần nhấp vào nút này, dễ dàng đăng ký, + +23 +00:01:29,910 --> 00:01:32,910 +điền vào bất kỳ trường nào mà bạn chưa điền trước đó và sau + +24 +00:01:33,150 --> 00:01:35,370 +đó chỉ cần nhấp vào gửi đơn đăng ký. + +25 +00:01:36,090 --> 00:01:39,210 +Một số ứng dụng phức tạp hơn một chút. + +26 +00:01:39,240 --> 00:01:41,550 +Đây là định dạng đơn giản nhất. Bây giờ, để thực + +27 +00:01:41,580 --> 00:01:45,360 +sự cho bạn thấy toàn bộ quá trình mà không làm xáo trộn đơn xin + +28 +00:01:45,360 --> 00:01:46,890 +việc của bất kỳ ai khác, + +29 +00:01:47,250 --> 00:01:51,330 +tôi quyết định tạo một tin tuyển dụng trên LinkedIn từ chính công ty của chúng tôi. + +30 +00:01:51,810 --> 00:01:56,430 +Vì vậy, chúng tôi hiện đang tìm kiếm một thực tập sinh tiếp thị để giúp chúng tôi khởi động các khóa học. + +31 +00:01:56,880 --> 00:02:01,170 +Và khi tôi nhấp vào công việc này, bạn có thể thấy nút ứng tuyển dễ dàng này hiển thị. + +32 +00:02:01,680 --> 00:02:06,000 +Vì vậy, nếu tôi nhấp vào ứng dụng dễ dàng và tôi điền vào số điện thoại giả của + +33 +00:02:06,540 --> 00:02:08,520 +mình, sau đó tôi nhấp vào tiếp theo. + +34 +00:02:09,210 --> 00:02:11,910 +Sau đó, tôi có thể bao gồm một sơ yếu lý lịch. + +35 +00:02:12,390 --> 00:02:15,930 +Bây giờ sơ yếu lý lịch đến từ cài đặt của bạn. + +36 +00:02:15,960 --> 00:02:20,960 +Vì vậy, nếu bạn đi đến cài đặt và quyền riêng tư của mình và bạn chuyển đến tùy chọn tìm kiếm việc làm + +37 +00:02:22,410 --> 00:02:26,370 +thì tại đây, bạn thực sự đã có thể tải lên trước sơ yếu lý lịch của mình. + +38 +00:02:27,060 --> 00:02:30,060 +Khi bạn đã hoàn thành điều đó, sau đó khi bạn nhấp vào dễ dàng áp dụng, bạn + +39 +00:02:31,260 --> 00:02:35,070 +sẽ thấy sơ yếu lý lịch đã được tải lên. Vì vậy, chúng tôi thậm chí không cần phải làm điều đó bằng + +40 +00:02:35,100 --> 00:02:37,080 +cách sử dụng bot của mình. Cuối cùng, chúng tôi + +41 +00:02:37,080 --> 00:02:42,080 +nhấp vào xem xét và chúng tôi đã sẵn sàng tiếp tục gửi và gửi đơn đăng ký của chúng tôi. + +42 +00:02:44,100 --> 00:02:47,130 +Vì vậy, đó là cách dễ dàng để nộp đơn của chúng + +43 +00:02:47,520 --> 00:02:52,080 +tôi và bạn có thể thấy rằng chỉ có bốn hoặc năm bước mà chúng tôi cần + +44 +00:02:52,080 --> 00:02:56,880 +tự động hóa để nộp đơn xin việc. Đó là dự án cho ngày hôm nay + +45 +00:02:56,910 --> 00:03:00,990 +và tôi hy vọng bạn cũng hào hứng như tôi khi thực hiện dự án này. + +46 +00:03:01,500 --> 00:03:04,770 +Và bạn thậm chí có thể thấy công dụng thực tế của nó trong tương lai. + +47 +00:03:05,370 --> 00:03:09,180 +Khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo, nơi bạn sẽ tìm thấy hướng + +48 +00:03:09,180 --> 00:03:11,640 +dẫn từng bước về cách hoàn thành dự án này. + diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 LinkedIn-Jobs.url b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 LinkedIn-Jobs.url new file mode 100644 index 0000000000000000000000000000000000000000..3860fdaf09ac26ae354a24d18c66efac1538d10f --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/001 LinkedIn-Jobs.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.linkedin.com/jobs/?showJobAlertsModal=false \ No newline at end of file diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/002 Step 1 - Setup Your LinkedIn Account.html b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/002 Step 1 - Setup Your LinkedIn Account.html new file mode 100644 index 0000000000000000000000000000000000000000..5b86fa884960f83801d4c031c4bf97f9165a43f7 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/002 Step 1 - Setup Your LinkedIn Account.html @@ -0,0 +1 @@ +

Project Objective

The goal of today's project is to learn to use Selenium to automate applying for jobs. Thus, by the end of today, you should have a program that can use LinkedIn's "Easy Apply" function to send applications to all the jobs that meet your criteria (instead of just a single listing).

If you have any reservations about sending job applications to the job listings on LinkedIn, an alternative is to "Save" all the jobs that meet your criteria and follow the company that posted the job instead.


Sign up to LinkedIn and Configure your Profile

We'll be using LinkedIn to apply for jobs automatically, so you'll need to set up your profile and account on the website before we get started.

1. Make sure you've signed up to LinkedIn and save your email and password somewhere for later use.

NOTE: Do not enable 2-factor authentication/phone number verification while we are using Selenium. If you don't want to use your primary account for this project, feel free to set up a new LinkedIn account.

2. Companies who look at your application will look through your LinkedIn profile to see if you have the skills and necessary work experience. If you are serious about applying for jobs make sure you update your LinkedIn Profile.

3. Upload your resume by going to:

Me -> Settings & Privacy -> Data privacy -> Job seeking preferences -> Job application settings

\ No newline at end of file diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/003 Step 2 - Automatically Login.html b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/003 Step 2 - Automatically Login.html new file mode 100644 index 0000000000000000000000000000000000000000..c3031a594ce541d24a2cde6214bfbe8c686531f5 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/003 Step 2 - Automatically Login.html @@ -0,0 +1 @@ +

1. Go to the Jobs tab and search for the job that you are interested in e.g. "Python developer". Add the "Easy Apply" filter and specify your desired location. e.g.

2. Copy the URL at the top of the address bar, it should contain all your requirements. e.g.

https://www.linkedin.com/jobs/search/?f_LF=f_AL&geoId=102257491&keywords=python%20developer&location=London%2C%20England%2C%20United%20Kingdom&redirect=false&position=1&pageNum=0

3. Using the URL and what you know about Selenium, try to open the page by using the webdriver. This is what you're aiming to see when you run your code:

4. Figure out how to automatically log in to LinkedIn using Selenium. This is what you're aiming to see when you run your code:

HINT: You might want to use sleep() to wait for page loads.


SOLUTION

\ No newline at end of file diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/004 Step 3 - Apply for a Job.html b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/004 Step 3 - Apply for a Job.html new file mode 100644 index 0000000000000000000000000000000000000000..2c4031c424287a9888f082dc3982e569dad969d4 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/004 Step 3 - Apply for a Job.html @@ -0,0 +1 @@ +

1. Use Selenium to automatically apply to the first job that only requires you to enter your phone number. e.g.

If successful, you should see:

NOTE: Occasionally, LinkedIn will show you a Captcha when you log in, which you will need to complete manually.

If you are seeing "This job is no longer accepting applications", or if the first job has a multi-step application process, try changing the job search to a different search term e.g. "marketing" or "web development". We'll address this issue by skipping over these jobs in the next step.

SOLUTION


What if I don't want to send an application right now?

If you're not comfortable sending applications to the job listings, I recommend adapting the project to save (all) the job(s) and follow the company that posted the listing(s) instead.

After all, the primary goal of the project is to get more practice programming and using Selenium.

\ No newline at end of file diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Course-Fixes-Report-an-Issue.url b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Solution-LinkedIn-Job-Application-Automation.zip b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Solution-LinkedIn-Job-Application-Automation.zip new file mode 100644 index 0000000000000000000000000000000000000000..439b43084a93bb66bbcb77e4b6588e3dcac66426 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Solution-LinkedIn-Job-Application-Automation.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ab0cd01327d43e412d0b62c49ba4c1a4b08f5011fc2011ed6b579dafb5a22aa +size 1435 diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Step 4 - Apply for all the jobs.html b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Step 4 - Apply for all the jobs.html new file mode 100644 index 0000000000000000000000000000000000000000..ea60862a33ecfe282646c1c10394a46a7fb7ac6d --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/005 Step 4 - Apply for all the jobs.html @@ -0,0 +1 @@ +

Now that we've verified that we can automatically apply to a job, the next step to apply to all the jobs on the page!

There's a couple of things that we're going to ignore to make it easier:

1. We're only going to apply to the standard, 1-step applications e.g.

2. We're going to ignore the applications that require a note, e.g.

3. We're going to ignore the complex, multi-step applications, e.g.

Using what you've learnt (and some creativity/Googling) figure out how to get your Selenium bot to apply to all the jobs on the page. Clicking on each job on the left hand side in-turn and applying to each one automatically.

HINT: Selenium has a custom exception that gets raised when an element cannot be found it's called NoSuchElementException

You'll need to import it to use it:

from selenium.common.exceptions import NoSuchElementException


SOLUTION

\ No newline at end of file diff --git a/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/external-links.txt b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..81b4f355f0fca9525d9849b8945b8e69b4196980 --- /dev/null +++ b/part3/49 - Day 49 - Intermediate+ Automating Job Applications on LinkedIn/external-links.txt @@ -0,0 +1,6 @@ + +001 LinkedIn-Jobs +https://www.linkedin.com/jobs/?showJobAlertsModal=false + +005 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Day 50 Goals what you will make by the end of the day.mp4 b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Day 50 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..29431739aa20e440282d08695a91df1ce93d03b8 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Day 50 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:213ff44f81bd796781826bb720df40562994bb0f5812f4ddd6d46ee119619bca +size 72904539 diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Day 50 Goals what you will make by the end of the day_vi.srt b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Day 50 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..89f3618897fa6938d79fa4de7da25259419f7ed1 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Day 50 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,424 @@ +1 +00:00:00,180 --> 00:00:04,770 +Xin chào các bạn, chào mừng đến với Ngày thứ 50 của 100 Ngày viết mã. Bạn đã làm được. + +2 +00:00:04,770 --> 00:00:08,430 +Đã đi được nửa chặng đường. Bạn đã đi rất xa ngay từ đầu. + +3 +00:00:08,820 --> 00:00:13,050 +Và hôm nay tôi có một dự án đặc biệt chỉ để kỷ niệm điều đó. Chúng tôi sẽ xây dựng + +4 +00:00:13,050 --> 00:00:15,450 +một bot tự động xới đất. + +5 +00:00:16,170 --> 00:00:19,350 +Vì vậy, đối với những bạn không biết Tinder là gì và tôi + +6 +00:00:19,410 --> 00:00:21,360 +không chắc liệu tôi có tin bạn + +7 +00:00:22,470 --> 00:00:26,520 +không, nhưng về cơ bản Tinder là một ứng dụng giúp mọi người hẹn hò trực tuyến. + +8 +00:00:26,850 --> 00:00:30,450 +Ý tưởng là bạn xem hồ sơ của ai đó, bạn nhấn thích và + +9 +00:00:30,540 --> 00:00:33,060 +nếu họ cũng thích hồ sơ của bạn, thì + +10 +00:00:33,300 --> 00:00:37,500 +bạn đã kết hợp và bạn có thể trò chuyện với nhau và có khả năng + +11 +00:00:37,500 --> 00:00:41,100 +thiết lập một cuộc hẹn hò. Siêu đơn giản và nó có lẽ là một trong những + +12 +00:00:41,130 --> 00:00:42,870 +ứng dụng được tải xuống nhiều nhất hiện nay. + +13 +00:00:43,530 --> 00:00:48,530 +Vì vậy, có một chút cốt truyện về cách dự án này ra đời. Một vài tuần trước, tôi đang dự một + +14 +00:00:48,660 --> 00:00:49,050 +bữa + +15 +00:00:49,050 --> 00:00:53,940 +tiệc nướng và một số người bạn bắt đầu nói về việc họ quá thất vọng + +16 +00:00:53,940 --> 00:00:58,260 +với việc hẹn hò trực tuyến. Một người bạn của tôi, hãy gọi anh + +17 +00:00:58,410 --> 00:01:03,410 +ấy là Jason nói rằng anh ấy dành khoảng hai giờ mỗi ngày để lướt và trò chuyện trên Tinder. + +18 +00:01:04,739 --> 00:01:07,200 +Nhưng ngay cả sau ngần ấy thời gian và nỗ + +19 +00:01:07,320 --> 00:01:10,020 +lực, anh ấy vẫn không nhận được bất kỳ cuộc hẹn hò nào. + +20 +00:01:10,710 --> 00:01:15,180 +Và tại một thời điểm tôi nhớ đã nhìn xung quanh và khá nhiều chàng + +21 +00:01:15,180 --> 00:01:19,920 +trai trong nhóm thực sự đồng ý với anh ấy và nói rằng họ cũng dành nhiều thời + +22 +00:01:19,940 --> 00:01:24,450 +gian để lướt trên Tinder, nhưng họ đều có chung một vấn đề, rất ít trùng khớp. + +23 +00:01:25,050 --> 00:01:28,710 +Vì vậy, điều này khiến tôi thực sự tò mò và tôi đã tìm hiểu một chút về Google. + +24 +00:01:29,010 --> 00:01:32,730 +Nó chỉ ra rằng Jason và bạn bè của tôi thực sự không đơn độc. + +25 +00:01:33,090 --> 00:01:35,880 +Không chỉ họ không nhận được đủ số lần vuốt. + +26 +00:01:36,570 --> 00:01:41,550 +Tôi đã tìm thấy một anh chàng trên Reddit, người đã yêu cầu dữ liệu của họ từ Tinder và anh ấy đã đăng số liệu thống kê + +27 +00:01:41,550 --> 00:01:42,420 +của mình lên mạng. + +28 +00:01:42,900 --> 00:01:47,900 +Vì vậy, rõ ràng anh ấy chỉ có tổng cộng 110 trận đấu trong số 26.800 lần vuốt + +29 +00:01:51,690 --> 00:01:55,200 +trong bốn năm, đó là 0. 41%. + +30 +00:01:55,500 --> 00:01:59,520 +Chàng trai tội nghiệp này gần như có cơ hội trúng số cao hơn với tỷ lệ đó. + +31 +00:02:00,090 --> 00:02:01,680 +Và đây không chỉ là một lần tắt. + +32 +00:02:01,710 --> 00:02:06,690 +Tôi đã tìm thấy một anh chàng khác đã đăng số liệu thống kê về đấu thầu của anh + +33 +00:02:06,690 --> 00:02:07,710 +ấy và anh + +34 +00:02:07,740 --> 00:02:12,740 +chàng này đã làm tốt hơn một chút, ừm, anh ấy có 133 trận đấu trong số 12.631 lần vuốt. + +35 +00:02:13,500 --> 00:02:17,340 +Vì vậy, về cơ bản chỉ có một trận đấu cho mỗi trăm lần vuốt. + +36 +00:02:18,090 --> 00:02:22,380 +Tất cả các thao tác vuốt có nghĩa là họ cũng phải dành nhiều thời gian bên + +37 +00:02:22,380 --> 00:02:23,213 +trong ứng dụng. + +38 +00:02:23,340 --> 00:02:28,320 +Và tôi đã xem xét các số liệu thống kê trên Tinder mà họ cung cấp cho các nhà đầu tư để + +39 +00:02:28,320 --> 00:02:32,700 +cho thấy mức độ tương tác của người dùng và lý do tại sao họ đáng giá bao nhiêu. + +40 +00:02:33,120 --> 00:02:36,390 +Vì vậy, trở lại vào năm 2014, tờ New York Times đã phỏng + +41 +00:02:36,450 --> 00:02:40,680 +vấn công ty và họ nói rằng người dùng đăng nhập khoảng 11 lần mỗi ngày và nam + +42 +00:02:41,040 --> 00:02:44,100 +giới sử dụng khoảng 7 lần. 2 phút mỗi phiên và + +43 +00:02:44,400 --> 00:02:47,670 +phụ nữ dành khoảng 8 phút. 5 phút mỗi phiên vì + +44 +00:02:47,970 --> 00:02:52,230 +chúng tôi kén chọn hơn một chút với tổng thời gian tương tác hàng ngày + +45 +00:02:52,230 --> 00:02:54,090 +trung bình là khoảng 90 phút. + +46 +00:02:54,570 --> 00:02:59,560 +Đó là một tiếng rưỡi vuốt mỗi ngày. Thật điên rồ. + +47 +00:03:00,340 --> 00:03:03,880 +Tôi không biết nhiều về Tinder, nhưng sau tất cả nghiên cứu này, + +48 +00:03:03,940 --> 00:03:08,440 +nó đã cho tôi một ý tưởng. Điều gì sẽ xảy ra nếu Jason không phải thực hiện tất cả việc lau này theo cách thủ công. + +49 +00:03:08,560 --> 00:03:12,850 +Điều gì sẽ xảy ra nếu anh ta có thể viết một chương trình tự động hóa toàn bộ quá trình này + +50 +00:03:12,850 --> 00:03:15,220 +và vuốt cho anh ta? Một câu chuyện ngắn, + +51 +00:03:15,280 --> 00:03:18,580 +tôi đã giới thiệu Jason với selen và Python, và bây giờ anh ấy + +52 +00:03:18,910 --> 00:03:22,870 +đã kết hôn hạnh phúc với ba đứa con. Chỉ đùa thôi. + +53 +00:03:22,960 --> 00:03:26,680 +Uhm, thực ra thì Jason vẫn đang dùng thử chương trình nhỏ của chúng tôi, nhưng anh + +54 +00:03:27,160 --> 00:03:31,210 +ấy đang làm khá tốt và tốt hơn nhiều so với trước đây và tiết kiệm được rất nhiều + +55 +00:03:31,210 --> 00:03:33,460 +thời gian cho bản thân. Nhưng quan trọng nhất, tôi + +56 +00:03:33,520 --> 00:03:38,320 +nghĩ nó tạo ra một dự án thú vị để chúng ta thực hành các kỹ năng Python và selen + +57 +00:03:38,320 --> 00:03:39,153 +của mình. + +58 +00:03:39,880 --> 00:03:44,830 +Bây giờ, lần đầu tiên tôi nhận ra rằng mọi người thực sự muốn tự động hóa việc này thay vì + +59 +00:03:44,830 --> 00:03:49,420 +chọn những người họ muốn vuốt là khi tôi bắt gặp sản phẩm này có tên là ngón tay Tinder, + +60 +00:03:49,540 --> 00:03:51,070 +một thứ mà bạn cắm vào + +61 +00:03:51,520 --> 00:03:55,780 +điện thoại của mình và nó cung cấp năng lượng cho ngón tay chỉ cần tiếp tục vuốt + +62 +00:03:55,780 --> 00:03:57,340 +sang phải, về cơ bản có nghĩa + +63 +00:03:57,730 --> 00:04:02,730 +là tôi thích tất cả mọi người cho đến khi ai đó thích bạn trở lại và sau đó bạn có + +64 +00:04:03,400 --> 00:04:07,390 +một kết quả phù hợp và bạn có thể trò chuyện với họ thay vì vuốt + +65 +00:04:07,390 --> 00:04:09,820 +sang phải liên tục. Trên thực tế, tôi + +66 +00:04:09,910 --> 00:04:12,910 +đã tìm thấy cả đống video YouTube ngoài kia về những người đang + +67 +00:04:12,910 --> 00:04:15,190 +xây dựng các cấu trúc để vuốt cho chúng. + +68 +00:04:15,880 --> 00:04:20,440 +Vì vậy, chúng tôi sẽ thử và tạo điều này chỉ bằng cách sử dụng phần mềm + +69 +00:04:20,470 --> 00:04:25,120 +đặc biệt hơn sử dụng Python và selen. Bây giờ chỉ là lời cảnh báo. + +70 +00:04:25,330 --> 00:04:27,460 +Nếu bạn định vuốt ngay trên Tinder, có + +71 +00:04:27,460 --> 00:04:31,060 +thể đáng để nói với nửa kia của bạn về điều đó phòng trường + +72 +00:04:31,060 --> 00:04:34,630 +hợp họ vô tình tìm thấy bạn trên Tinder qua khóe mắt của họ + +73 +00:04:34,630 --> 00:04:39,520 +và bạn sẽ rơi vào một tình huống tồi tệ nào đó mà họ thực sự gặp phải. giận bạn. + +74 +00:04:40,300 --> 00:04:43,270 +Ngoài ra, tôi biết rằng bạn có thể không tìm kiếm một ngày ngay bây + +75 +00:04:43,300 --> 00:04:46,030 +giờ hoặc bạn có thể nghi ngờ về việc đăng ký một + +76 +00:04:46,030 --> 00:04:50,050 +ứng dụng hẹn hò bằng tên và ảnh thật của bạn chỉ để thực hành một số lập trình Python. + +77 +00:04:50,470 --> 00:04:52,450 +Trong trường hợp đó, bạn có thể + +78 +00:04:52,480 --> 00:04:56,980 +thử một trang web có tên là thispersondoesnotexist. com để tự động tạo một số hình ảnh hồ sơ cho bạn. + +79 +00:04:57,340 --> 00:04:58,270 +Những hình + +80 +00:04:58,270 --> 00:05:03,270 +ảnh này, mỗi khi bạn làm mới là hình ảnh được tạo bởi + +81 +00:05:03,400 --> 00:05:07,150 +mạng nơ-ron bằng máy học. Và đây không phải là khuôn mặt của người thật, + +82 +00:05:07,450 --> 00:05:11,380 +nhưng dù sao thì chúng cũng trông khá thật đối với tôi. Và trên thực tế, bạn có + +83 +00:05:11,380 --> 00:05:15,070 +thể sử dụng hồ sơ này cho dự án vuốt Tinder tự động này. + +84 +00:05:15,880 --> 00:05:17,800 +Chọn ai đó, đăng ký Tinder, sau + +85 +00:05:18,310 --> 00:05:23,310 +đó chúng tôi sẽ sử dụng selen để tự động hóa toàn bộ quy trình bằng cách + +86 +00:05:24,010 --> 00:05:27,730 +vuốt trên trang web Tinder. Đây là những gì nó trông như thế này. + +87 +00:05:28,630 --> 00:05:31,120 +Bot của bạn sẽ đăng nhập bằng Facebook. + +88 +00:05:32,620 --> 00:05:37,620 +Và sau đó nó sẽ nhấp vào tất cả những thứ cần được nhấp để bạn có + +89 +00:05:38,260 --> 00:05:40,990 +thể thực sự hiển thị các nút để vuốt. + +90 +00:05:42,250 --> 00:05:46,540 +Và sau đó nó chỉ lướt qua mọi người. Và một khi nó chạm vào một trận đấu, đó sẽ là + +91 +00:05:46,780 --> 00:05:47,830 +một cửa sổ bật lên. + +92 +00:05:47,950 --> 00:05:52,900 +Vì vậy, nó sẽ nhấp vào quay lại Tinder và tiếp tục vuốt. Bây giờ, hãy nhớ rằng Tinder + +93 +00:05:52,900 --> 00:05:56,470 +có tối đa một trăm lần vuốt mỗi ngày. + +94 +00:05:56,560 --> 00:06:00,470 +Vì vậy, trừ khi nâng cấp lên một trong các cấp trả phí đó, bot của bạn sẽ chỉ + +95 +00:06:00,470 --> 00:06:04,340 +hoạt động với hàng trăm lần vuốt mỗi ngày, bất kể bạn tự động đến mức nào. + +96 +00:06:04,760 --> 00:06:08,390 +Nhưng tôi chắc rằng bạn là một người bận rộn, tiết kiệm hàng trăm lần vuốt của bạn + +97 +00:06:08,390 --> 00:06:10,070 +có lẽ đã đáng để tạo bot. + +98 +00:06:10,580 --> 00:06:14,210 +Và nếu bạn là một người nào đó đang sử dụng Tinder premium hoặc bất cứ thứ gì họ gọi là nó, + +99 +00:06:14,570 --> 00:06:18,290 +thì bạn thực sự có thể tiếp tục vuốt cả ngày. Bây giờ, nếu bạn là + +100 +00:06:18,320 --> 00:06:22,550 +người không muốn làm tổn thương cảm xúc của bất kỳ ai bằng cách tự + +101 +00:06:22,550 --> 00:06:26,570 +động kết hợp với họ bằng bot Tinder giống như bot mà chúng tôi + +102 +00:06:26,930 --> 00:06:31,930 +sắp viết, thì hãy hoàn thành thử thách chỉ bằng cách nhấn không thích ở mọi người để + +103 +00:06:32,090 --> 00:06:33,980 +bạn không hợp với bất kỳ ai. + +104 +00:06:34,910 --> 00:06:37,580 +Vì vậy, đó là dự án mà chúng tôi sẽ xây dựng ngày hôm nay. + +105 +00:06:37,970 --> 00:06:39,860 +Và nếu bạn chuyển sang bài học tiếp + +106 +00:06:39,880 --> 00:06:43,120 +theo, chúng ta có thể nhận được 1: bắt đầu với thử thách từng bước. + diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Machine-Learning-Generated-Profile-Pictures.url b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Machine-Learning-Generated-Profile-Pictures.url new file mode 100644 index 0000000000000000000000000000000000000000..ab775e70dabfa60175705a936af284e79266aa8b --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Machine-Learning-Generated-Profile-Pictures.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.thispersondoesnotexist.com/ \ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 NY-Times-Tinder-Article.url b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 NY-Times-Tinder-Article.url new file mode 100644 index 0000000000000000000000000000000000000000..71001742eb0aeb85446d973337adc4ed45b433ff --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 NY-Times-Tinder-Article.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.nytimes.com/2014/10/30/fashion/tinder-the-fast-growing-dating-app-taps-an-age-old-truth.html \ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Tinder.url b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Tinder.url new file mode 100644 index 0000000000000000000000000000000000000000..687fcd095b4c195d3823c9017e61fd19d142f528 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/001 Tinder.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://tinder.com/ \ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/002 Step 1 - Setup your account on Tinder.html b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/002 Step 1 - Setup your account on Tinder.html new file mode 100644 index 0000000000000000000000000000000000000000..536b45de8ae662f4907e0fb5328140e932eb0c75 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/002 Step 1 - Setup your account on Tinder.html @@ -0,0 +1 @@ +

1. If you don't already have an account on Tinder, set one up now. Make sure you can sign in to your account using Facebook or Google.

If you don't want to use your own details, ask a friend who is on Tinder or just set up a new Facebook account and use an AI-generated image from https://www.thispersondoesnotexist.com/

HINT: You can hit refresh on thispersondoesnotexist to generate new random images.

2. Manually go through the process of swiping on profiles and see which elements you'll need to target with your code.

NOTE: If you don't want to disappoint anyone (I'm sure you are very attractive/good dating material ), you can always complete the tutorial and hit "NOPE" on everyone. Least you break people's hearts by matching with them and then telling them "Sorry I just did it for a Python tutorial" .

\ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/003 Step 2 - Navigate to Login Page.html b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/003 Step 2 - Navigate to Login Page.html new file mode 100644 index 0000000000000000000000000000000000000000..8f0487f0339c7a49d76e1512632573e32281f400 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/003 Step 2 - Navigate to Login Page.html @@ -0,0 +1 @@ +

In order to avoid dual verification with a phone every time we log in, we'll need to use the Facebook/Google login. The Google login flow requires a lot more steps than Facebook login, so we'll go with Facebook in this challenge.

1. Using Selenium and Python Navigate to the Tinder website (https://tinder.com/) and click on LOG IN then LOGIN WITH FACEBOOK. See below:

If successful, you should see a pop-up for Facebook login:

HINT 1: Make sure you've already manually signed-in and verified your phone number with Tinder as we can't automate the phone number verification. You only have to do this once.

HINT 2: If you are getting a NoSuchElementException, make sure you've added some delay between clicking on buttons so that the new element has enough time to load.

HINT 3: You might find it easier to right click on the element and get the XPath to use with Selenium. e.g.



SOLUTION

\ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/004 Step 3 - Login with Facebook.html b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/004 Step 3 - Login with Facebook.html new file mode 100644 index 0000000000000000000000000000000000000000..dccecb649e3c9789eb14f88ea23b81806087b4fd --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/004 Step 3 - Login with Facebook.html @@ -0,0 +1,5 @@ +

1. The Facebook login page opens in a new window. In order for our selenium code to work on the new window, we have to switch to the window in front.

In Selenium, each window has a identification handle, we can get all the window handles with:

driver.window_handles

The above line of code returns a list of all the window handles. The first window is at position 0 e.g.

base_window = driver.window_handles[0]

New windows that have popped out from the base_window are further down in the sequence e.g.

fb_login_window = driver.window_handles[1]

We can switch our Selenium to target the new facebook login window by:

driver.switch_to.window(fb_login_window)

You can print the driver.title to verify that it's the facebook login window that is currently target:

print(driver.title)

The full code to switch to the new pop-up window is thus:

base_window = driver.window_handles[0]
+fb_login_window = driver.window_handles[1]
+driver.switch_to.window(fb_login_window)
+print(driver.title)

If successful the printed title should be "Facebook" and not "Tinder | Match. Chat. Date."

2.  Using what you have learnt about Selenium, fill in the Facebook login form and submit it to log in.

NOTE: Avoid invoking the Facebook Login too frequently, see if you can test your code without logging in, you don't want to appear like a bot to Facebook as there is always the chance that they might disable your FB account. Alternatively, you can try setting up an alternative Facebook account.

If successful, you should see the pop-up window disappear and you're back on the Tinder page. e.g.

3. At this point, you should revert back to the base_window and verify by printing the title of the Selenium controlled window title.

driver.switch_to.window(base_window)
+print(driver.title)

If successful, it should print "Tinder | Match. Chat. Date."


SOLUTION

\ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/005 Step 4 - Dismiss all requests.html b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/005 Step 4 - Dismiss all requests.html new file mode 100644 index 0000000000000000000000000000000000000000..df966f937cc1d73804e1426bba49b950bdde14dd --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/005 Step 4 - Dismiss all requests.html @@ -0,0 +1 @@ +

When you first login to Tinder, it will ask if it's ok to get your location, send you notifications and track your cookies. We need to dismiss all of these modal pop-ups.

Location Pop-up:

Notification Pop-up:

Cookies Pop-up:

1. Using Selenium and Python:

- Click ALLOW for location.

- Click NOT INTERESTED for notifications.

- Click I ACCEPT for cookies

HINT 1: Finding the XPath will make it easier to target each element.

HITN 2: Adding some delay before targeting these elements will allow time for them to load up.


SOLUTION

\ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Course-Fixes-Report-an-Issue.url b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Solution-auto-tinder-swiper-end.zip b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Solution-auto-tinder-swiper-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..cdbe30ef0786ffe56369883713b3529cbafebb19 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Solution-auto-tinder-swiper-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb60763e331df2c237d7fd95d9fd98abfdda6c85fc486e41a9e553701e0bb9e3 +size 831 diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Step 5 - Hit Like!.html b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Step 5 - Hit Like!.html new file mode 100644 index 0000000000000000000000000000000000000000..939dc3f883b4538f26eaabd584d8b69ad65f9918 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/006 Step 5 - Hit Like!.html @@ -0,0 +1 @@ +

1. The final step is to like some people. Because it's the web version, we don't have to swipe right, all we need to do is to click on the "Like" button. You'll want to add at least a 1 second delay between "Likes" so that Tinder doesn't block you because you seem like a bot.

HINT 1: It takes a while for Tinder to load up people near you, this is not a fixed time as it depends on a number of factors. When it's loading, the "Like" button will not be reachable and you will get a NoSuchElementException if you try to find it. Use exception handling to handle this situation and wait 2 seconds before you retry.

HINT 2: Sometimes, as you are swiping, you'll get a match which is a pop-up on the same page. But this will mean that your Like button will be hidden behind the pop up and you'll get a ElementClickInterceptedException. e.g.

You'll need to dismiss this by clicking on "BACK TO TINDER" to continue swiping.

NOTE: On the free tier, Tinder only allows 100 "Likes" per day.


SOLUTION

\ No newline at end of file diff --git a/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/external-links.txt b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..994fc1748d25d5daf34ea38b289e5bdbec045714 --- /dev/null +++ b/part3/50 - Day 50 - Intermediate+ Auto Tinder Swiping Bot/external-links.txt @@ -0,0 +1,12 @@ + +001 NY-Times-Tinder-Article +https://www.nytimes.com/2014/10/30/fashion/tinder-the-fast-growing-dating-app-taps-an-age-old-truth.html + +001 Tinder +https://tinder.com/ + +001 Machine-Learning-Generated-Profile-Pictures +https://www.thispersondoesnotexist.com/ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Comcast-Twitter-Bot.url b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Comcast-Twitter-Bot.url new file mode 100644 index 0000000000000000000000000000000000000000..93081032e309b17c5ddc9a2b372fbdbcbce96a79 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Comcast-Twitter-Bot.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.vice.com/en_us/article/yp3vzj/this-bot-will-tweet-at-comcast-whenever-your-internet-is-slower-than-advertised \ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Day 51 Goals what you will make by the end of the day.mp4 b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Day 51 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..43dcdd9142ac08e3bf955685b8c64d862969f0b4 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Day 51 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b13e6b261aed37f03911d852883ce6f38b3b85bd9b7d50bade45ea0d831aab0 +size 60105522 diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Day 51 Goals what you will make by the end of the day_vi.srt b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Day 51 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9cfea483817425221a000dc7d5965a67b2f49332 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Day 51 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,364 @@ +1 +00:00:00,180 --> 00:00:02,250 +Chào các bạn đến với ngày thứ 51 + +2 +00:00:02,250 --> 00:00:05,400 +của 100 Ngày viết mã. Hôm nay chúng + +3 +00:00:05,400 --> 00:00:09,090 +ta sẽ xây dựng một bot Twitter Khiếu nại. + +4 +00:00:09,870 --> 00:00:12,810 +Tôi không biết về bạn, nhưng tôi là loại người thực sự, rất + +5 +00:00:12,810 --> 00:00:16,920 +ghét giao dịch với dịch vụ khách hàng. Rất thường xuyên, nếu tôi mua một + +6 +00:00:17,010 --> 00:00:20,070 +sản phẩm và nó không hoạt động hoặc nó được + +7 +00:00:20,100 --> 00:00:22,020 +vận chuyển đến cho tôi + +8 +00:00:22,440 --> 00:00:26,610 +bị hỏng, tôi thực sự sẽ giải quyết vấn đề đó để tránh gặp + +9 +00:00:26,630 --> 00:00:31,040 +phải vấn đề 1: dịch vụ khách hàng. Tôi cảm thấy thật khó khăn khi gọi dịch vụ khách + +10 +00:00:31,130 --> 00:00:32,299 +hàng, 0: chờ đợi trên + +11 +00:00:32,689 --> 00:00:35,990 +đường dây và nói chung đó là một trải nghiệm thực sự khó khăn đối với tôi. + +12 +00:00:36,740 --> 00:00:40,580 +Nhưng nếu đó là điều gì đó thực sự khiến bạn khó chịu mà bạn cần phải phàn nàn + +13 +00:00:40,580 --> 00:00:42,860 +để khắc phục thì sao? Chà, người dùng internet + +14 +00:00:42,860 --> 00:00:47,860 +cụ thể này đã được hứa hẹn về tốc độ internet từ Comcast, vì vậy + +15 +00:00:48,770 --> 00:00:53,770 +Xfinity ở Hoa Kỳ, nơi anh ta có ý định giảm 150 kilobit và tăng + +16 +00:00:55,190 --> 00:00:56,300 +10 kilobit. + +17 +00:00:56,780 --> 00:01:00,230 +Nhưng những gì anh ấy tìm thấy là thực sự trong nhiều thời gian, + +18 +00:01:00,230 --> 00:01:03,140 +anh ấy không nhận được tốc độ internet như mong đợi. + +19 +00:01:03,470 --> 00:01:08,470 +Vì vậy, anh ta sẽ thực hiện một bài kiểm tra tốc độ và sau đó gửi tốc độ internet của mình + +20 +00:01:08,810 --> 00:01:12,380 +qua Twitter cho Comcast để phàn nàn. Bây giờ, tùy thuộc vào nhà + +21 +00:01:12,410 --> 00:01:16,190 +cung cấp internet của bạn là ai và số tiền bạn đang trả, họ có + +22 +00:01:16,220 --> 00:01:20,870 +xu hướng đảm bảo tốc độ internet tối thiểu. Tuy nhiên, hiện nay, hầu hết + +23 +00:01:20,930 --> 00:01:25,030 +mọi người thường không kiểm tra tốc độ internet của họ mỗi ngày. + +24 +00:01:25,110 --> 00:01:28,310 +Chỉ thỉnh thoảng bạn cảm thấy như, ồ, hôm nay hơi chậm. + +25 +00:01:28,310 --> 00:01:32,990 +Hoặc tại sao quá trình tải xuống của tôi mất quá nhiều thời gian? Nếu bạn nhìn vào hợp đồng của + +26 +00:01:32,990 --> 00:01:37,990 +mình, bạn thường thấy rằng tốc độ tối thiểu được đảm bảo tính theo megabit / giây. + +27 +00:01:39,680 --> 00:01:44,000 +Đối với hầu hết mọi người, nó có thể sẽ vào khoảng 30 megabit hoặc 60 megabit + +28 +00:01:44,240 --> 00:01:48,350 +tùy thuộc vào số tiền bạn phải trả. Hiện nay đối với nhiều nhà cung cấp, họ + +29 +00:01:48,380 --> 00:01:53,380 +thực sự có một sự đảm bảo rằng nếu bạn có thể chứng minh rằng tốc độ internet mà bạn đang nhận + +30 +00:01:53,540 --> 00:01:55,820 +không như những gì họ đã hứa, họ sẽ thực + +31 +00:01:56,060 --> 00:01:59,630 +sự trả lại tiền cho bạn hoặc thậm chí tốt hơn là họ có thể thử + +32 +00:01:59,660 --> 00:02:01,190 +và sửa lỗi đó . + +33 +00:02:01,850 --> 00:02:06,850 +Vì vậy, những gì người dùng Comcast này đã làm là anh ta sẽ kiểm tra tốc độ internet của mình và sau + +34 +00:02:07,280 --> 00:02:12,280 +đó tweet tự động lên Comcast và phàn nàn rằng tốc độ internet của anh ta chỉ là 23 giảm 5 trở lên + +35 +00:02:13,490 --> 00:02:17,780 +khi anh ta trả 150 giảm 10 trở lên. Bây giờ, lý do tại sao + +36 +00:02:17,780 --> 00:02:21,680 +mọi người tương tác với Twitter về dịch vụ khách hàng là vì + +37 +00:02:21,680 --> 00:02:22,760 +nó công khai. + +38 +00:02:22,790 --> 00:02:26,810 +Mọi người khác có thể thấy lời phàn nàn của bạn đối với một công ty cụ thể và + +39 +00:02:27,080 --> 00:02:29,540 +nếu họ là một thương hiệu lớn hoặc một công ty + +40 +00:02:29,810 --> 00:02:32,930 +lớn, thì họ có xu hướng theo dõi phương tiện truyền thông xã hội. + +41 +00:02:32,990 --> 00:02:37,280 +Và thường thì dịch vụ khách hàng mà bạn nhận được khi phàn nàn trên Twitter thậm chí còn tốt + +42 +00:02:37,280 --> 00:02:40,160 +hơn nếu bạn gọi điện cho họ hoặc gửi email cho họ. + +43 +00:02:40,610 --> 00:02:44,180 +Một trong những nhóm dịch vụ khách hàng tốt nhất trên Twitter là JetBlue. + +44 +00:02:44,540 --> 00:02:45,470 +Và trên internet, + +45 +00:02:45,470 --> 00:02:49,970 +bạn có rất nhiều ví dụ về những người có trải nghiệm thực sự tuyệt vời với nhóm dịch vụ khách + +46 +00:02:49,970 --> 00:02:53,450 +hàng trên Twitter từ JetBlue, chẳng hạn như anh chàng này đang trên một chuyến bay + +47 +00:02:53,450 --> 00:02:57,020 +và TV của anh ấy không hoạt động, và họ thực sự kết thúc bằng việc + +48 +00:02:57,320 --> 00:02:59,590 +cung cấp cho anh ta, ừm, tín dụng chuyến bay + +49 +00:02:59,680 --> 00:03:03,250 +ngay tại chỗ vì có một chiếc TV bị hỏng, tất cả đều đạt được bằng + +50 +00:03:03,550 --> 00:03:06,220 +cách sử dụng một vài tweet. Bây giờ, gần đây tôi thậm + +51 +00:03:06,220 --> 00:03:09,430 +chí đang đọc bài báo này trên tạp chí thời gian, nơi nó nói về 'Việc tweet + +52 +00:03:09,460 --> 00:03:13,510 +tại các công ty có thực sự hiệu quả không? 'Và rất thường xuyên, + +53 +00:03:13,540 --> 00:03:17,890 +vâng, nó thực sự có. Và ngay cả khi bạn nhìn vào bot Twitter + +54 +00:03:17,950 --> 00:03:18,783 +Python cơ bản + +55 +00:03:19,150 --> 00:03:23,950 +này, bạn có thể thấy rằng anh ta thường nhận được câu trả lời từ Comcast và những người dùng khác đang + +56 +00:03:23,950 --> 00:03:28,720 +cố gắng lấy lại Comcast để sửa chữa internet của họ. Bây giờ, Comcast có lẽ + +57 +00:03:28,810 --> 00:03:33,760 +khá nổi tiếng là có dịch vụ khách hàng khá tệ. + +58 +00:03:34,120 --> 00:03:36,850 +Trên thực tế, có bài đăng này mà tôi sẽ + +59 +00:03:36,880 --> 00:03:40,630 +liên kết tới, ừm, nơi một nhà báo đang cố gắng hủy dịch + +60 +00:03:40,810 --> 00:03:45,810 +vụ Comcast của họ và mất khoảng 5 hoặc 10 phút khi nhân viên dịch vụ khách hàng + +61 +00:03:46,300 --> 00:03:48,010 +chỉ đang cố gắng thực sự, + +62 +00:03:48,010 --> 00:03:53,010 +rất khó để không cho phép họ hủy bỏ thậm chí đôi khi khá trịch thượng và có + +63 +00:03:53,770 --> 00:03:56,860 +một chút xấu tính. Nhưng trong cuộc trò chuyện này, + +64 +00:03:56,860 --> 00:04:00,580 +bạn thực sự nghe thấy người trên Comcast nói rằng chúng tôi là những người duy nhất có + +65 +00:04:00,580 --> 00:04:05,140 +thể hứa với bạn tốc độ tải xuống hàng trăm megabit. Và trên thực tế, khi bạn nhìn vào các + +66 +00:04:05,140 --> 00:04:07,060 +tweet của người dùng Comcast, bạn có + +67 +00:04:07,300 --> 00:04:09,490 +thể thấy rằng thực tế không phải vậy. + +68 +00:04:09,790 --> 00:04:13,030 +Vì vậy, điều này cũng có thể củng cố lập luận của bạn khi bạn muốn rời + +69 +00:04:13,030 --> 00:04:15,160 +khỏi dịch vụ internet hoặc khi bạn muốn lấy lại + +70 +00:04:15,250 --> 00:04:17,800 +tiền hoặc khi bạn chỉ muốn ai đó sửa tốc độ internet của mình. + +71 +00:04:18,490 --> 00:04:21,700 +Trang web chúng tôi sẽ sử dụng là tốc độ kiểm tra. net có lẽ là một + +72 +00:04:21,730 --> 00:04:25,330 +trong những trang web kiểm tra tốc độ tốt nhất hiện có. + +73 +00:04:25,780 --> 00:04:30,670 +Và những gì chúng tôi sẽ làm là chúng tôi sẽ sử dụng các chương trình của chúng tôi bằng cách sử dụng + +74 +00:04:30,700 --> 00:04:31,780 +selen để nhấn đi. + +75 +00:04:32,110 --> 00:04:37,110 +Bạn có thể thấy nó sẽ bắt đầu tính toán tốc độ tải xuống và + +76 +00:04:37,180 --> 00:04:41,890 +tốc độ tải lên của tôi. Giờ đây, việc này thường mất khoảng từ nửa + +77 +00:04:41,920 --> 00:04:44,560 +phút đến hai phút tùy thuộc vào tốc độ internet của bạn. + +78 +00:04:46,960 --> 00:04:48,190 +Nhưng sau khi hoàn tất, chúng + +79 +00:04:48,220 --> 00:04:53,220 +tôi sẽ kết thúc với một ID kết quả cũng như tốc độ tải xuống và tốc độ tải lên của + +80 +00:04:53,830 --> 00:04:54,550 +chúng tôi. + +81 +00:04:54,550 --> 00:04:58,630 +Và sau đó, bạn có thể so sánh những điều này với những gì bạn đã được nhà + +82 +00:04:58,660 --> 00:05:03,370 +cung cấp dịch vụ internet của bạn hứa hẹn. Và sau đó chúng tôi sẽ tweet tại nhà cung cấp của chúng tôi. + +83 +00:05:03,580 --> 00:05:08,530 +Vì vậy, nếu đó là Comcast hoặc AT&T hoặc ở Anh, nó có thể là BT hoặc Sky, bất kể nó có + +84 +00:05:08,530 --> 00:05:09,400 +thể là gì. + +85 +00:05:09,820 --> 00:05:13,660 +Và sau đó chúng tôi sẽ nói với họ về tốc độ internet khủng khiếp của chúng tôi + +86 +00:05:13,660 --> 00:05:17,290 +so với những gì chúng tôi phải trả. Vì vậy, đó là mục tiêu. + +87 +00:05:18,370 --> 00:05:21,850 +Và khi tôi chạy bot Twitter tốc độ internet của mình, bạn có thể thấy đây là những + +88 +00:05:21,850 --> 00:05:22,870 +gì sẽ xảy ra. + +89 +00:05:23,160 --> 00:05:28,160 +2: [không nghe được], 0: Đó là mục + +90 +00:05:33,330 --> 00:05:35,970 +tiêu. Khi bạn đã sẵn sàng, + +91 +00:05:35,970 --> 00:05:38,310 +hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Huffington-Post-Comcast-Call-from-Hell.url b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Huffington-Post-Comcast-Call-from-Hell.url new file mode 100644 index 0000000000000000000000000000000000000000..507bd36c3243f91bb47bfaf44b7a93438e8348d2 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Huffington-Post-Comcast-Call-from-Hell.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.huffingtonpost.co.uk/2014/07/15/comcast-call-from-hell_n_5586679.html \ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Internet-Speed-Checker.url b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Internet-Speed-Checker.url new file mode 100644 index 0000000000000000000000000000000000000000..9fa3b06c3dd8369aef7a16481278d310c16c8af4 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Internet-Speed-Checker.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.speedtest.net/ \ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Time-Does-Tweeting-at-Companies-Really-Work-.url b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Time-Does-Tweeting-at-Companies-Really-Work-.url new file mode 100644 index 0000000000000000000000000000000000000000..f357ca4993d313d5e0e95d79c8cdd40f8f90fa2b --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/001 Time-Does-Tweeting-at-Companies-Really-Work-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://time.com/4894182/twitter-company-complaints/ \ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/002 Step 1 - Setup Your Twitter Account.html b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/002 Step 1 - Setup Your Twitter Account.html new file mode 100644 index 0000000000000000000000000000000000000000..4b12f607dfb3ea59bd4030d404339fffce6600b1 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/002 Step 1 - Setup Your Twitter Account.html @@ -0,0 +1 @@ +

In order to tweet at an internet provider, we of course need a twitter account. If you want, you can set up a new Twitter account instead of using your personal account.

1. Sign up for a Twitter account here:

https://twitter.com/i/flow/signup

2. Additionally, you'll need to get your Internet Service Provider (ISP)'s guaranteed internet speeds. This should be in your contract somewhere. Alternatively, you could just use an example speed, e.g. 150Mbps download, 10Mbps upload.

3. Create a new Python project and add these details as constants in the file. e.g.

\ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/003 Step 2 - Create a Class.html b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/003 Step 2 - Create a Class.html new file mode 100644 index 0000000000000000000000000000000000000000..a75ab02d7d95d21f7f8c4ec4787deea77c996f62 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/003 Step 2 - Create a Class.html @@ -0,0 +1 @@ +

Because there are multiple steps to this Selenium bot, it's easier if we make our code organised using a class.

1. Create a class called InternetSpeedTwitterBot

2. In the init() method, create the Selenium driver and 2 other properties down and up .

3. Create two methods - get_internet_speed() and tweet_at_provider() .

4. Outside of the class, initialise the object and call the two methods in order. Where you first get the internet speed and then tweet at the provider.

HINT: We talked about classes and object in Python extensively in day 16-20, this might be a good time to revise those lessons if you can't remember how to do the steps above.

SOLUTION

\ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/004 Step 3 - Get Internet Speeds.html b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/004 Step 3 - Get Internet Speeds.html new file mode 100644 index 0000000000000000000000000000000000000000..5f5500e41e324fdf2ee8214574508d0e964ee270 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/004 Step 3 - Get Internet Speeds.html @@ -0,0 +1 @@ +

1. Use this speedtest website to get your current live download and upload speeds manually. e.g.

2. Use Selenium and Python to get the same result printed out in your console. e.g.

HINT 1: First use Selenium to get the speedtest address, then see which steps you have to make your bot go through to get those results.

HINT 2: Depending on your internet speeds, you might need to add a 60-180s delay to wait for the results.

HINT 3: Consider using XPATH, if you can't figure out how to target the element.


SOLUTION

\ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Course-Fixes-Report-an-Issue.url b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Solution-internet-speed-twitter-bot-end.zip b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Solution-internet-speed-twitter-bot-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..c573bb0359b7f40be4be5b4bffedc9e8b455619a --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Solution-internet-speed-twitter-bot-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e796f60a1014d3bd1dd9f966ef67525f7b96880416e2e4a9ed87145d59ea76f7 +size 944 diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Step 4 - Building a Twitter Bot to Tweet at your Internet Provider.html b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Step 4 - Building a Twitter Bot to Tweet at your Internet Provider.html new file mode 100644 index 0000000000000000000000000000000000000000..f1b831069cf137c3ae831243199932d3d91fd467 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/005 Step 4 - Building a Twitter Bot to Tweet at your Internet Provider.html @@ -0,0 +1 @@ +

1. Go through the process of logging-in and tweeting on Twitter as a human to study which selectors/id/classes/XPATHs you could target.

2. Use Python and Selenium to complete the same process, login to Twitter, compose the tweet to include your up/down speeds and your promised speeds then send the tweet.
NOTE: If you don't want to mention (@) the internet provider, just compose a simple tweet like this:

NOTE: If you are logging into Twitter repeatedly, they will make you complete a Re-CAPTCHA/send a confirmation code to your email to prove you are human. Go through this process to continue testing.


SOLUTION

\ No newline at end of file diff --git a/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/external-links.txt b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..bc04e1683755246e39ddf74c9a486b033ddc3350 --- /dev/null +++ b/part3/51 - Day 51 - Intermediate+ Internet Speed Twitter Complaint Bot/external-links.txt @@ -0,0 +1,15 @@ + +001 Time-Does-Tweeting-at-Companies-Really-Work- +https://time.com/4894182/twitter-company-complaints/ + +001 Huffington-Post-Comcast-Call-from-Hell +https://www.huffingtonpost.co.uk/2014/07/15/comcast-call-from-hell_n_5586679.html + +001 Internet-Speed-Checker +https://www.speedtest.net/ + +001 Comcast-Twitter-Bot +https://www.vice.com/en_us/article/yp3vzj/this-bot-will-tweet-at-comcast-whenever-your-internet-is-slower-than-advertised + +005 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Day 52 Goals what you will make by the end of the day.mp4 b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Day 52 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6785c19f320c0930db657b472df8d44ad79ce3df --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Day 52 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:500b53f3bcc0c38224aba451bb8edd1e2497d5c0a01b6fc5377b45c4cd4edba9 +size 37378680 diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Day 52 Goals what you will make by the end of the day_vi.srt b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Day 52 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..56156c561f3fe69f1c43f212d878ea9977b92686 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Day 52 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,208 @@ +1 +00:00:00,420 --> 00:00:02,310 +Xin chào các bạn, chào mừng đến với ngày + +2 +00:00:02,310 --> 00:00:05,850 +thứ 52 của 100 Ngày viết mã. Hôm nay tôi có một + +3 +00:00:05,880 --> 00:00:08,970 +dự án khá thú vị khác dành cho bạn. + +4 +00:00:09,300 --> 00:00:12,780 +Nó là một bot theo dõi Instagram. + +5 +00:00:13,380 --> 00:00:16,920 +Vì vậy, đây là vấn đề. Bạn đã bao giờ cảm thấy một chút cô đơn? + +6 +00:00:17,370 --> 00:00:22,020 +Bạn đã bao giờ muốn có thêm bạn bè? Chà, tôi thực sự không thể giúp bạn có + +7 +00:00:22,110 --> 00:00:26,970 +thêm bạn bè, nhưng tôi có thể tìm ra cách để bạn có thêm người theo dõi trên Instagram. + +8 +00:00:27,840 --> 00:00:32,640 +Vì vậy, gần đây tôi đã nói chuyện với một nhà tư vấn Instagram. + +9 +00:00:32,759 --> 00:00:37,200 +Đây là người thực sự tư vấn cho các doanh nghiệp và công ty khởi nghiệp về cách họ + +10 +00:00:37,230 --> 00:00:40,080 +có thể xây dựng sự hiện diện trên Instagram của mình. + +11 +00:00:40,590 --> 00:00:43,380 +Và họ đã làm việc với rất nhiều công ty thành công. + +12 +00:00:43,680 --> 00:00:46,200 +Và một trong những bí mật mà họ đã + +13 +00:00:46,470 --> 00:00:51,000 +chia sẻ với tôi, mà tôi nghĩ thực sự rất hay, đó là hãy nói rằng bạn + +14 +00:00:51,000 --> 00:00:54,840 +là người đang cố gắng xây dựng thương hiệu xung quanh việc nấu ăn. + +15 +00:00:55,350 --> 00:01:00,350 +Vì vậy, bạn có thể làm là bạn có thể xem tất cả các tài khoản + +16 +00:01:01,170 --> 00:01:03,810 +trên Instagram có liên quan đến nấu ăn. + +17 +00:01:04,290 --> 00:01:09,290 +Một trong những công ty yêu thích nhất của tôi cho đến ngày nay là công ty có tên ChefSteps. + +18 +00:01:10,620 --> 00:01:15,300 +Họ chỉ có nội dung thú vị nhất và họ có những video YouTube + +19 +00:01:15,300 --> 00:01:19,320 +tuyệt vời kèm theo hướng dẫn. Và rất nhiều thứ mà họ làm ra + +20 +00:01:19,350 --> 00:01:23,760 +thật lộng lẫy, giống như ẩm thực phân tử thực sự và mọi thứ trông thật tuyệt vời. + +21 +00:01:24,330 --> 00:01:29,070 +Giả sử bạn đang cố gắng xây dựng một công ty, nơi công ty cũng đang kinh + +22 +00:01:29,070 --> 00:01:33,720 +doanh một lĩnh vực nào đó liên quan đến thực phẩm và bạn muốn có thêm người + +23 +00:01:33,720 --> 00:01:38,010 +theo dõi cho công ty của mình. Một trong những cách bạn có thể làm là + +24 +00:01:38,040 --> 00:01:43,040 +nếu bạn nghĩ về nó, nếu bạn tìm thấy một công ty có nhân khẩu học tương tự hoặc đối tượng tương + +25 +00:01:43,170 --> 00:01:43,860 +tự như + +26 +00:01:43,860 --> 00:01:48,200 +của bạn, về cơ bản là những người thích đồ ăn hoặc những người thích nấu ăn, tốt, bạn + +27 +00:01:48,200 --> 00:01:52,470 +có thể làm gì là bạn có thể truy cập tài khoản Instagram của họ và sau đó xem + +28 +00:01:52,470 --> 00:01:53,580 +những người theo dõi họ. + +29 +00:01:54,930 --> 00:01:59,930 +Và sau đó, bạn có thể xem qua danh sách những người theo dõi ChefSteps này và theo + +30 +00:02:00,090 --> 00:02:03,510 +dõi từng tài khoản này. Bây giờ, đối với nhiều người, + +31 +00:02:03,510 --> 00:02:07,680 +họ là những cá nhân nhỏ bé chỉ quan tâm đến nấu ăn hoặc thực phẩm. + +32 +00:02:07,980 --> 00:02:12,240 +Vì vậy, nếu bạn có thứ gì đó liên quan đến thực phẩm và bạn đang theo dõi ai đó, thì họ + +33 +00:02:12,570 --> 00:02:15,570 +cũng có thể để ý đến bạn. Và đến lượt nó, bạn có + +34 +00:02:15,570 --> 00:02:19,380 +thể sẽ nhận được nhiều người theo dõi hơn. Vì vậy, tôi nghĩ đây là một ý + +35 +00:02:19,380 --> 00:02:21,930 +tưởng thực sự tuyệt vời và đó là điều gì đó + +36 +00:02:21,930 --> 00:02:26,930 +thực sự chín muồi cho tự động hóa, bởi vì ai muốn xem qua danh sách 247.000 người và nhấp vào + +37 +00:02:28,140 --> 00:02:30,090 +từng nút này. Không ai cả, phải không? + +38 +00:02:30,450 --> 00:02:34,350 +Vì vậy, chúng tôi sẽ làm điều này bằng cách sử dụng mã. Cụ thể hơn + +39 +00:02:34,380 --> 00:02:38,970 +là Selenium và Python. Đây là những gì nó trông như thế nào khi tôi chạy mã của mình. + +40 +00:02:39,480 --> 00:02:42,180 +Nó sẽ tự động đăng nhập vào Instagram và + +41 +00:02:47,970 --> 00:02:52,140 +sau đó nó sẽ chuyển đến tài khoản mà tôi muốn tái tạo người theo dõi. + +42 +00:02:52,830 --> 00:02:55,440 +Và sau đó nó sẽ nhấp vào những người + +43 +00:02:55,650 --> 00:03:00,650 +theo dõi liên kết đó và nó sẽ bắt đầu theo dõi từng tài khoản riêng lẻ này + +44 +00:03:01,030 --> 00:03:03,610 +một cách tự động. Và bạn có thể thấy con chuột của tôi không ở đâu gần đó. + +45 +00:03:03,630 --> 00:03:04,463 +1: Vâng. + +46 +00:03:05,880 --> 00:03:08,280 +0: Đó là mục tiêu cho ngày hôm nay. Nếu bạn đang xây dựng một doanh + +47 +00:03:08,310 --> 00:03:11,460 +nghiệp, nếu bạn đang xây dựng một công ty khởi nghiệp hoặc nếu bạn đang xây dựng thương hiệu + +48 +00:03:11,820 --> 00:03:14,010 +tùy chỉnh của riêng mình hoặc nếu bạn chỉ muốn có nhiều người + +49 +00:03:14,070 --> 00:03:16,590 +theo dõi hơn trên Instagram, thì đây có thể là điều mà bạn quan tâm. + +50 +00:03:17,010 --> 00:03:21,570 +Và nó chắc chắn giúp bạn khai thác một số kỹ năng mới với Selenium và Python. + +51 +00:03:21,960 --> 00:03:23,010 +Vì vậy, khi bạn đã + +52 +00:03:23,040 --> 00:03:26,370 +sẵn sàng, hãy chuyển sang bài học tiếp theo và đưa các kỹ năng của bạn vào bài kiểm tra. + diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Follow-your-competitors-followers-to-grow-your-instagram-account.url b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Follow-your-competitors-followers-to-grow-your-instagram-account.url new file mode 100644 index 0000000000000000000000000000000000000000..b7d64b697c287130962ca7ebe84cd368d223e8d9 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Follow-your-competitors-followers-to-grow-your-instagram-account.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://hypeplanner.com/blogs/instagram-follow-unfollow-strategy-for-instagram-growth/#:~:text=The%20follow%2Funfollow%20Instagram%20strategy,after%20a%20period%20of%20time \ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Instagram.url b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Instagram.url new file mode 100644 index 0000000000000000000000000000000000000000..aa9b6126499afa85a58245d627d6878e8ab06388 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/001 Instagram.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.instagram.com/ \ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/002 Step 1 - Get Your Instagram Credentials.html b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/002 Step 1 - Get Your Instagram Credentials.html new file mode 100644 index 0000000000000000000000000000000000000000..713cfa4e46133883fe9e3dff98ec67bdb0f32cb3 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/002 Step 1 - Get Your Instagram Credentials.html @@ -0,0 +1 @@ +

In order to complete this project, you will need an Instagram account. I recommend setting up a new account for this project rather than using your main account (Facebook may disable accounts that exhibit bot-like behaviour).

1. Set up a fresh Instagram account: https://www.instagram.com/.

Go through the sign up steps. Verify your email address. And then add one or two posts, follow some accounts manually, and add a profile picture to your new account.


2. Take note of any pop-ups or cookie warnings that you encounter. Copy the XPath of the buttons on these pop up windows. 


3. Figure out which account you would like to target. Pick a large account that has a lot of followers.


4. You should set up these constants:

\ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/003 Step 2 - Create a Class.html b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/003 Step 2 - Create a Class.html new file mode 100644 index 0000000000000000000000000000000000000000..979412736d6379f34b2d47b7fea021e775b9aed8 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/003 Step 2 - Create a Class.html @@ -0,0 +1 @@ +

Because there are multiple steps to this Selenium bot, it's easier if we make our code organised using a class.

1. Create a class called InstaFollower

2. In the init() method, create the Selenium driver .

3. Create three methods - login() and find_followers() and follow().

4. Outside of the class, initialise the object and call the three methods in order.


SOLUTION

\ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/004 Step 3 - Login to Instagram.html b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/004 Step 3 - Login to Instagram.html new file mode 100644 index 0000000000000000000000000000000000000000..d282e40d8253f0c884900e056e069b260f91ef4d --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/004 Step 3 - Login to Instagram.html @@ -0,0 +1 @@ +

Visit Instagram.com using Selenium

1. If there is a pop up with a cookie warning, dismiss the cookie warning.

2. Use Selenium and Python to login to Instagram automatically using the email and password for your new account. Write your code in the login() method.

Here is the URL: https://www.instagram.com/accounts/login/

3. You will probably encounter some pop ups. These include prompts for saving your login information as well as turning on notifications. To dismiss any pop-ups or cookie warnings that you might encounter, you'll have to take a close look at them.

You'll probably notice that the XPATH and the selectors change every time you access the page! That's because they are dynamically generated on Instagram's side, so each time you visit the page, the elements will be different. How can we get around this problem? 

Hint: You'll need to use contains() and text() in your XPATH. For example, to find a button that has the words "Click me" on a page, you can use:


button = driver.find_element(by=By.XPATH, value="//button[contains(text(), 'Click me')]")


Note: Run your program sparingly and also interact with the instagram account as a human. Remember to manually log out while testing your code and don't run your code too often or in quick succession (e.g., 5x in a row) as this may result in triggering Instagram's bot detection and get the account banned. 



SOLUTION

\ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/005 Step 4 - Find the followers of the target account.html b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/005 Step 4 - Find the followers of the target account.html new file mode 100644 index 0000000000000000000000000000000000000000..501ab7b0576be79378d4b2605c946b44df2dc633 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/005 Step 4 - Find the followers of the target account.html @@ -0,0 +1 @@ +

When you go to a target Instagram account, you can click on their follower count to see all their followers e.g.

The URL is the name of the Instagram account added to the end of instagram.com

e.g. https://www.instagram.com/chefsteps/

The list of followers in the popup is limited to around 15 when it first loads, in order to see more followers, we need to scroll down in the popup (not the main webpage).

1. See if you can do some research using Google/StackOverflow to figure out how to scroll down on the followers popup. Write your code in the find_followers() method. This is what you're aiming for:


As a developer, one of the most common things is to find out how to do something you've never done before. This is a key skill we have to develop.

HINT 1: https://www.google.com/search?q=how+to+scroll+popup+selnium+python&oq=how+to+scroll+popup+selnium+python&aqs=chrome..69i57j0.19371j0j9&sourceid=chrome&ie=UTF-8

HINT 2: https://stackoverflow.com/questions/38041974/selenium-scroll-inside-of-popup-div

https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTop

https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight


SOLUTION

\ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/006 Course-Fixes-Report-an-Issue.url b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/006 Step 5 - Follow all the followers.html b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/006 Step 5 - Follow all the followers.html new file mode 100644 index 0000000000000000000000000000000000000000..f70cfc9cd2560cd2f908b7734c16b1bd6107adb7 --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/006 Step 5 - Follow all the followers.html @@ -0,0 +1 @@ +

1. Inside the follow() method find all the follow buttons in the modal (popup) and click on each of them in turn. Add a 1 second delay between each click, so you can seem more human. e.g.

2. Sometimes, you'll encounter an account that you have already followed, in this case, when you press on the button it will generate a popup asking if you want to unfollow that person e.g.

2. When this happens the follow button is hidden under the popup and you will get a ElementClickInterceptedException  if you try to continue clicking on the follow button. Handle this exception and when it occurs, simply click on the "Cancel" button to dismiss the popup and continue to follow other people. e.g.


SOLUTION to part 5


Here is the solution to the challenge all in one place:

Completed Code for the entire project

Note, Instagram will update it's website. So the CSS Selectors and XPATH may change.


\ No newline at end of file diff --git a/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/external-links.txt b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..14423dccf0fb008c4e1e5f00a99a2da6b464f59a --- /dev/null +++ b/part3/52 - Day 52 - Intermediate+ Instagram Follower Bot/external-links.txt @@ -0,0 +1,9 @@ + +001 Instagram +https://www.instagram.com/ + +001 Follow-your-competitors-followers-to-grow-your-instagram-account +https://hypeplanner.com/blogs/instagram-follow-unfollow-strategy-for-instagram-growth/#:~:text=The%20follow%2Funfollow%20Instagram%20strategy,after%20a%20period%20of%20time + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Automated-Job-Story.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Automated-Job-Story.url new file mode 100644 index 0000000000000000000000000000000000000000..571dcfc3bc2b330db1f8f67c3e76377c28dec2ed --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Automated-Job-Story.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://workplace.stackexchange.com/questions/93696/is-it-unethical-for-me-to-not-tell-my-employer-i-ve-automated-my-job \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Automating-Your-Job-Reddit.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Automating-Your-Job-Reddit.url new file mode 100644 index 0000000000000000000000000000000000000000..be9593577bc5690710cd9bbc594dec5c0272ce89 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Automating-Your-Job-Reddit.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.reddit.com/r/Python/comments/8uxifv/has_anyone_automated_their_job_completely/ \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Data-Entry-Jobs-on-Indeed.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Data-Entry-Jobs-on-Indeed.url new file mode 100644 index 0000000000000000000000000000000000000000..4688b20a8d1b1af4242acbe65885d4e374d9a723 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Data-Entry-Jobs-on-Indeed.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.indeed.com/jobs?q=data%20entry&l=remote \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Day 53 Goals what you will make by the end of the day.mp4 b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Day 53 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..37193e9cd1936edd5069498e09aaed84872cfec5 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Day 53 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42b181c518e586fee5368b9ec5a7be9cfb551b43ad823a28116f3e7f2ccdf4e8 +size 110285294 diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Day 53 Goals what you will make by the end of the day_vi.srt b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Day 53 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ab2693960acb3eb38087df31a9638052760aed9c --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Day 53 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,644 @@ +1 +00:00:00,300 --> 00:00:02,969 +Giảng viên: Chào các bạn, chào mừng đến + +2 +00:00:02,969 --> 00:00:05,430 +với ngày thứ 53 của trăm ngày Code. + +3 +00:00:05,430 --> 00:00:09,060 +Hôm nay là lúc bạn thực hiện dự án Capstone và đã đến + +4 +00:00:09,060 --> 00:00:11,880 +lúc bạn xem lại mọi thứ chúng ta đã học được + +5 +00:00:11,880 --> 00:00:14,190 +trong khoảng 10 ngày qua. + +6 +00:00:14,190 --> 00:00:17,070 +Mọi thứ liên quan đến việc quét web. + +7 +00:00:17,070 --> 00:00:18,870 +Dự án mà chúng tôi sắp thực + +8 +00:00:18,870 --> 00:00:21,360 +hiện là công việc nhập dữ liệu. + +9 +00:00:21,360 --> 00:00:23,970 +Hiện nay, có rất nhiều công việc nhập dữ liệu + +10 +00:00:23,970 --> 00:00:27,510 +mà bạn chỉ có nhiệm vụ chuyển dữ liệu từ định dạng này sang + +11 +00:00:27,510 --> 00:00:29,040 +định dạng khác. + +12 +00:00:29,040 --> 00:00:32,700 +Vì vậy, có thể bạn có nó ở dạng bản in hoặc có thể nó + +13 +00:00:32,700 --> 00:00:35,370 +ở trên trang web, có thể ở dạng PDF và + +14 +00:00:35,370 --> 00:00:37,620 +bạn chỉ cần chuyển nó sang nơi + +15 +00:00:37,620 --> 00:00:40,800 +khác, thường là nhập nó vào bảng tính. + +16 +00:00:40,800 --> 00:00:43,890 +Cảm hứng cho dự án này đến từ khi tôi đang duyệt + +17 +00:00:43,890 --> 00:00:45,810 +Reddit trên subreddit r/Python, + +18 +00:00:45,810 --> 00:00:48,090 +đây là một cộng đồng thực sự tốt để + +19 +00:00:48,090 --> 00:00:51,540 +bạn thực sự xem xét và xem những gì người khác đang làm + +20 +00:00:51,540 --> 00:00:54,000 +với Python cũng như xem những thứ mới + +21 +00:00:54,000 --> 00:00:56,880 +nhất và tuyệt vời nhất được xây dựng hoặc tin + +22 +00:00:56,880 --> 00:00:59,100 +tức về Python. + +23 +00:00:59,100 --> 00:01:01,650 +Bây giờ, một trong những bài đăng tôi thấy hỏi + +24 +00:01:01,650 --> 00:01:04,890 +liệu có ai đã tự động hóa hoàn toàn công việc của họ hay không, + +25 +00:01:04,890 --> 00:01:06,810 +về cơ bản là sử dụng Python. + +26 +00:01:06,810 --> 00:01:09,570 +Bây giờ chúng ta đã thấy Python có thể mạnh mẽ như thế + +27 +00:01:09,570 --> 00:01:11,640 +nào, đặc biệt là khi chúng ta áp dụng nó vào + +28 +00:01:11,640 --> 00:01:14,400 +việc quét web bằng Beautiful Soup và Selenium. + +29 +00:01:14,400 --> 00:01:17,040 +Và xem qua tất cả các bình luận, + +30 +00:01:17,040 --> 00:01:19,590 +thực sự có rất nhiều người đã làm + +31 +00:01:19,590 --> 00:01:22,170 +việc này, bao gồm cả một anh chàng + +32 +00:01:22,170 --> 00:01:27,170 +về cơ bản đã tự động hóa toàn bộ công việc của mình. + +33 +00:01:27,600 --> 00:01:30,420 +Và những công việc có xu hướng dễ dàng được tự động + +34 +00:01:30,420 --> 00:01:33,300 +hóa bằng Python là công việc nhập dữ liệu, di chuyển + +35 +00:01:33,300 --> 00:01:36,270 +dữ liệu từ định dạng này sang định dạng khác. + +36 +00:01:36,270 --> 00:01:39,690 +Và nếu bạn nghĩ về điều đó, nếu công việc đó thực sự ở xa, + +37 +00:01:39,690 --> 00:01:44,690 +thì nếu bạn tìm kiếm trên Indeed. com cho công việc nhập dữ liệu từ xa và bạn + +38 +00:01:44,790 --> 00:01:47,700 +bắt đầu làm việc với công ty và bắt đầu thực hiện + +39 +00:01:47,700 --> 00:01:49,440 +việc đó một cách thủ công, sau + +40 +00:01:49,440 --> 00:01:52,800 +đó khi bạn đã hiểu những gì bạn phải làm, chẳng hạn như + +41 +00:01:52,800 --> 00:01:56,910 +thu thập dữ liệu thống kê, chuẩn bị báo cáo và duy trì bảng tính, + +42 +00:01:56,910 --> 00:01:58,830 +nếu bạn nhận ra rằng đây là một + +43 +00:01:58,830 --> 00:02:02,190 +phần quan trọng trong công việc của bạn và bạn có thể + +44 +00:02:02,190 --> 00:02:05,610 +tự động hóa nó khá nhiều bằng Python, thì bạn có thể nhờ + +45 +00:02:05,610 --> 00:02:08,940 +Python thực hiện 70% công việc của mình và bạn dành 30% + +46 +00:02:08,940 --> 00:02:11,160 +thời gian còn lại trong ngày để làm + +47 +00:02:11,160 --> 00:02:13,950 +phần còn lại công việc nhưng vẫn được trả lương + +48 +00:02:13,950 --> 00:02:16,950 +đầy đủ với đầy đủ phúc lợi. + +49 +00:02:16,950 --> 00:02:18,450 +Vì vậy, đây là điều mà rất + +50 +00:02:18,450 --> 00:02:22,050 +nhiều người trong cộng đồng Python đã nói đến và khám phá. + +51 +00:02:22,050 --> 00:02:24,960 +Và đây là thứ mà chúng tôi sẽ thử sử dụng + +52 +00:02:24,960 --> 00:02:29,430 +cả Beautiful Soup và Selenium trong dự án này. + +53 +00:02:29,430 --> 00:02:31,140 +Trong trường hợp của chúng + +54 +00:02:31,140 --> 00:02:33,480 +tôi, chúng tôi sẽ giải quyết công việc + +55 +00:02:33,480 --> 00:02:36,450 +nhập dữ liệu nghiên cứu trong đó chúng tôi đang + +56 +00:02:36,450 --> 00:02:40,080 +nghiên cứu giá nhà phù hợp với tiêu chí cụ thể cho khách hàng + +57 +00:02:40,080 --> 00:02:41,580 +trên trang web Zillow và + +58 +00:02:41,580 --> 00:02:45,300 +sau đó chúng tôi sẽ chuyển dữ liệu đó sang một biểu mẫu. tạo + +59 +00:02:45,300 --> 00:02:48,420 +bảng tính trong Google Trang tính. + +60 +00:02:48,420 --> 00:02:52,380 +Và đó thường là cách mà một người nhập dữ liệu sẽ làm, đây là + +61 +00:02:52,380 --> 00:02:54,180 +cách chúng tôi kiếm tiền. + +62 +00:02:55,230 --> 00:02:58,110 +Bây giờ, vì đây là dự án Capstone nên + +63 +00:02:58,110 --> 00:03:00,360 +chúng ta sẽ sử dụng mọi thứ đã + +64 +00:03:00,360 --> 00:03:02,100 +học trong phần này. + +65 +00:03:02,100 --> 00:03:05,430 +Điều đó có nghĩa là súp Đẹp cũng như Selenium. + +66 +00:03:05,430 --> 00:03:06,810 +Bạn có thể phải ôn lại một số + +67 +00:03:06,810 --> 00:03:08,220 +điều bạn đã học, đặc biệt là + +68 +00:03:08,220 --> 00:03:10,290 +nội dung về Beautiful Soup mà chúng ta + +69 +00:03:10,290 --> 00:03:12,090 +đã trình bày cách đây vài ngày và chúng + +70 +00:03:12,090 --> 00:03:14,010 +ta sẽ kết hợp tất cả các kỹ năng mà bạn + +71 +00:03:14,010 --> 00:03:15,720 +đã làm cho đến nay. + +72 +00:03:15,720 --> 00:03:17,400 +Và dự án này thực sự sẽ kiểm tra + +73 +00:03:17,400 --> 00:03:20,640 +tất cả các kỹ năng quét web mà bạn đã có được cho đến nay và + +74 +00:03:20,640 --> 00:03:23,070 +xem bạn có thể chạy được bao xa với nó. + +75 +00:03:23,070 --> 00:03:24,480 +Vì đây là dự án Capstone nên + +76 +00:03:24,480 --> 00:03:26,610 +sẽ không có nhiều hướng dẫn nên bạn sẽ phải + +77 +00:03:26,610 --> 00:03:28,230 +kiên trì và cố gắng xem liệu mình + +78 +00:03:28,230 --> 00:03:30,570 +có thể giải quyết được vấn đề của mình hay không + +79 +00:03:30,570 --> 00:03:33,900 +và xem liệu bạn có thể đạt được kết quả cuối cùng hay không. + +80 +00:03:33,900 --> 00:03:36,960 +Giả sử bạn có một khách hàng muốn bạn lập + +81 +00:03:36,960 --> 00:03:41,100 +danh sách tất cả những địa điểm mà họ có thể thuê ở San + +82 +00:03:41,100 --> 00:03:45,570 +Francisco với số tiền lên tới 3.000 USD mỗi tháng và nơi + +83 +00:03:45,570 --> 00:03:48,870 +đó phải có ít nhất một phòng ngủ. + +84 +00:03:48,870 --> 00:03:50,790 +San Francisco nổi tiếng + +85 +00:03:50,790 --> 00:03:53,820 +là nơi có nhà ở cực kỳ đắt đỏ và thường + +86 +00:03:53,820 --> 00:03:55,440 +rất khó để tìm được + +87 +00:03:55,440 --> 00:03:58,350 +nơi nào đó mà bạn muốn sống. + +88 +00:03:58,350 --> 00:04:01,320 +Trên Zillow, bạn đã có thể lọc những thứ này. + +89 +00:04:01,320 --> 00:04:03,900 +Vì vậy, ví dụ, bạn có thể nói, đây + +90 +00:04:03,900 --> 00:04:06,810 +là khu vực, San Francisco, California + +91 +00:04:06,810 --> 00:04:09,060 +mà tôi muốn thuê và sau đó tất + +92 +00:04:09,060 --> 00:04:10,440 +nhiên đổi thành + +93 +00:04:10,440 --> 00:04:15,390 +cho thuê thay vì bán, chuyển giá tối đa lên tới 3.000 đô la và + +94 +00:04:15,390 --> 00:04:17,760 +sau đó thêm vào yêu cầu phải có + +95 +00:04:17,760 --> 00:04:20,910 +ít nhất một phòng ngủ. + +96 +00:04:20,910 --> 00:04:24,270 +Bây giờ, chúng ta có thể sử dụng phiên bản trực tiếp của Zillow + +97 +00:04:24,270 --> 00:04:25,860 +để thực hiện dự án này, nhưng + +98 +00:04:25,860 --> 00:04:29,280 +vấn đề là các trang web thường xuyên được cập nhật. + +99 +00:04:29,280 --> 00:04:32,790 +Các công ty như Zillow liên tục cải thiện trang + +100 +00:04:32,790 --> 00:04:36,060 +web của họ, do đó, họ có thể thay đổi cấu trúc + +101 +00:04:36,060 --> 00:04:38,460 +HTML, tên các lớp CSS và có cửa sổ + +102 +00:04:38,460 --> 00:04:42,660 +bật lên trên trang web hoặc giới thiệu các ảnh chụp gây + +103 +00:04:42,660 --> 00:04:45,300 +ra sự cố cho Selenium. + +104 +00:04:45,300 --> 00:04:46,890 +Đối với khóa học này, tôi muốn + +105 +00:04:46,890 --> 00:04:49,410 +đảm bảo rằng tất cả chúng ta đều có thể thực + +106 +00:04:49,410 --> 00:04:52,410 +hành viết mã trong một môi trường ổn định không thay + +107 +00:04:52,410 --> 00:04:55,710 +đổi và giải pháp mã của tôi tiếp tục hoạt động. + +108 +00:04:55,710 --> 00:04:59,070 +Đó là lý do tại sao tôi đã tạo một bản sao trang web của Zillow để + +109 +00:04:59,070 --> 00:05:01,590 +bạn có thể thực hành và kiểm tra kiến thức của mình + +110 +00:05:01,590 --> 00:05:03,693 +về Beautiful Soup và Selenium. + +111 +00:05:04,590 --> 00:05:08,370 +Mở trang web nhân bản Zillow trong trình duyệt Chrome của bạn. + +112 +00:05:08,370 --> 00:05:10,590 +Và như bạn có thể thấy, tôi đã tạo một + +113 +00:05:10,590 --> 00:05:12,060 +ảnh chụp nhanh của trang + +114 +00:05:12,060 --> 00:05:15,030 +Zillow nơi tôi đã thu hẹp tiêu chí tìm kiếm. + +115 +00:05:15,030 --> 00:05:17,850 +Tôi đã chọn San Francisco làm + +116 +00:05:17,850 --> 00:05:21,240 +địa điểm và tôi chọn cho thuê thay vì + +117 +00:05:21,240 --> 00:05:24,810 +bán và tôi chỉ định giá lên tới 3.000 USD + +118 +00:05:24,810 --> 00:05:27,990 +cho một căn hộ một phòng ngủ. + +119 +00:05:27,990 --> 00:05:31,170 +Vì vậy, URL bạn nên sử dụng với Selenium cho dự án này nên + +120 +00:05:31,170 --> 00:05:36,170 +là https://appbrewery. github. io/Zillow-Clone. + +121 +00:05:42,630 --> 00:05:44,910 +Bây giờ, ngoài việc sử dụng URL + +122 +00:05:44,910 --> 00:05:47,490 +đó, bạn cũng sẽ sử dụng Beautiful + +123 +00:05:47,490 --> 00:05:50,820 +Soup để quét qua tất cả dữ liệu này. + +124 +00:05:50,820 --> 00:05:54,930 +Và điều chúng tôi muốn là giá cả, địa chỉ + +125 +00:05:54,930 --> 00:05:58,830 +và cả URL mà trang này sẽ liên kết đến. + +126 +00:05:58,830 --> 00:06:01,080 +Vì vậy, ví dụ, khi tôi nhấp vào đây, + +127 +00:06:01,080 --> 00:06:04,680 +nó sẽ liên kết đến danh sách thực tế của địa điểm. + +128 +00:06:04,680 --> 00:06:06,510 +Và sau khi bạn đã loại bỏ tất + +129 +00:06:06,510 --> 00:06:10,260 +cả dữ liệu đó bằng Beautiful Soup, bạn sẽ sử dụng Selenium + +130 +00:06:10,260 --> 00:06:13,740 +để tự động điền vào biểu mẫu Google. + +131 +00:06:13,740 --> 00:06:15,870 +Vì vậy, chúng tôi sẽ thêm địa chỉ của tài + +132 +00:06:15,870 --> 00:06:18,210 +sản, giá mỗi tháng và tài sản được liên kết và + +133 +00:06:18,210 --> 00:06:21,120 +tất nhiên, chúng tôi sẽ điền vào một trong các biểu mẫu + +134 +00:06:21,120 --> 00:06:24,000 +này cho mỗi danh sách mà chúng tôi có trên Zillow. + +135 +00:06:24,000 --> 00:06:26,700 +Và sau khi tất cả biểu mẫu đó đã được + +136 +00:06:26,700 --> 00:06:31,470 +biên soạn, bạn sẽ có tùy chọn biến nó thành bảng tính. + +137 +00:06:31,470 --> 00:06:34,770 +Bất cứ khi nào bạn tạo biểu mẫu trong Google Biểu + +138 +00:06:34,770 --> 00:06:37,290 +mẫu, bạn có thể thấy rằng khi chuyển + +139 +00:06:37,290 --> 00:06:39,420 +đến tab phản hồi, bạn có thể nhấp + +140 +00:06:39,420 --> 00:06:42,690 +vào nút này để tạo trang tính Google từ các phản + +141 +00:06:42,690 --> 00:06:44,100 +hồi đã được gửi và đây + +142 +00:06:44,100 --> 00:06:45,570 +là kết quả cuối cùng của + +143 +00:06:45,570 --> 00:06:49,290 +bạn, một bảng tính có địa chỉ của bất động sản, giá mỗi + +144 +00:06:49,290 --> 00:06:52,380 +tháng và liên kết đến bất động sản. + +145 +00:06:52,380 --> 00:06:54,810 +Vì vậy, theo cách này, khi bạn đã thực hiện + +146 +00:06:54,810 --> 00:06:56,760 +nghiên cứu này, bạn có thể gửi nó + +147 +00:06:56,760 --> 00:06:59,100 +cho khách hàng của mình để họ có thể lọc + +148 +00:06:59,100 --> 00:07:02,880 +ra từng danh sách phù hợp với tiêu chí của họ và quyết định xem họ + +149 +00:07:02,880 --> 00:07:04,740 +muốn xem danh sách nào. + +150 +00:07:04,740 --> 00:07:07,530 +Vì vậy, điều này tất nhiên làm cho công việc của họ dễ + +151 +00:07:07,530 --> 00:07:10,230 +dàng hơn một chút và đây là nhiệm vụ nghiên cứu mà + +152 +00:07:10,230 --> 00:07:12,360 +chúng ta sẽ hoàn thành ngày hôm nay. + +153 +00:07:12,360 --> 00:07:14,760 +Vì vậy, phần đầu tiên của quá trình thu + +154 +00:07:14,760 --> 00:07:17,190 +thập dữ liệu cho các danh sách liên quan + +155 +00:07:17,190 --> 00:07:20,160 +sẽ được thực hiện bằng Beautiful Soup và sau đó + +156 +00:07:20,160 --> 00:07:23,790 +là phần thứ hai chúng ta điền vào biểu mẫu này sẽ được thực + +157 +00:07:23,790 --> 00:07:25,620 +hiện bằng Selenium. + +158 +00:07:25,620 --> 00:07:28,020 +Vì vậy, đó là dự án. + +159 +00:07:28,020 --> 00:07:30,930 +Và khi bạn đã sẵn sàng, hãy chuyển sang bài + +160 +00:07:30,930 --> 00:07:33,990 +học tiếp theo và xem các yêu cầu của dự án và + +161 +00:07:33,990 --> 00:07:37,203 +chúng ta có thể bắt đầu với dự án Capstone. + diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Google-Forms.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Google-Forms.url new file mode 100644 index 0000000000000000000000000000000000000000..0a093923e9eb6d7288279f83a89454fe1effa6e4 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Google-Forms.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.google.com/forms \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Zillow-Clone-Site.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Zillow-Clone-Site.url new file mode 100644 index 0000000000000000000000000000000000000000..296c40481740b16905f520eac395930564bb39d7 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Zillow-Clone-Site.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://appbrewery.github.io/Zillow-Clone/ \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Zillow-Property-search.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Zillow-Property-search.url new file mode 100644 index 0000000000000000000000000000000000000000..7ee71bdbf414d7679981916463e63f5da8092b41 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/001 Zillow-Property-search.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.zillow.com/homes/for_rent/1-_beds/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22usersSearchTerm%22%3Anull%2C%22mapBounds%22%3A%7B%22west%22%3A-122.69219435644531%2C%22east%22%3A-122.17446364355469%2C%22south%22%3A37.703343724016136%2C%22north%22%3A37.847169233586946%7D%2C%22isMapVisible%22%3Atrue%2C%22filterState%22%3A%7B%22fr%22%3A%7B%22value%22%3Atrue%7D%2C%22fsba%22%3A%7B%22value%22%3Afalse%7D%2C%22fsbo%22%3A%7B%22value%22%3Afalse%7D%2C%22nc%22%3A%7B%22value%22%3Afalse%7D%2C%22cmsn%22%3A%7B%22value%22%3Afalse%7D%2C%22auc%22%3A%7B%22value%22%3Afalse%7D%2C%22fore%22%3A%7B%22value%22%3Afalse%7D%2C%22pmf%22%3A%7B%22value%22%3Afalse%7D%2C%22pf%22%3A%7B%22value%22%3Afalse%7D%2C%22mp%22%3A%7B%22max%22%3A3000%7D%2C%22price%22%3A%7B%22max%22%3A872627%7D%2C%22beds%22%3A%7B%22min%22%3A1%7D%7D%2C%22isListVisible%22%3Atrue%2C%22mapZoom%22%3A11%7D \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/002 Web Scraping and Data Entry Capstone Project Requirements.html b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/002 Web Scraping and Data Entry Capstone Project Requirements.html new file mode 100644 index 0000000000000000000000000000000000000000..bc6d24f6c7ca973c98e8fb44b88809cad4fe6eef --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/002 Web Scraping and Data Entry Capstone Project Requirements.html @@ -0,0 +1 @@ +

As we get closer to the latter part of the course, and as you build up your skills every day, the challenges are going to become more life-like and more challenging. As a developer, you will spend most of your time figuring out how to do things using Google and StackOverflow. It's rare that I come across a new project and already know exactly what code I need to write.

In this capstone project, you will need to apply everything you've learnt about website and web scraping with Beautiful Soup and Selenium to complete the project and fulfil the project requirements. You might also need to do your own research and revision to complete the task.

Set up your own Google Form

First, you need to create a new form in Google Forms.

1. Go to https://docs.google.com/forms/ and create your own form:

2. Add 3 questions to the form, make all questions "short-answer":

3. Click send and copy the link address of the form. You will need to use this in your program.


Go to our Zillow-Clone Website

4. Go to https://appbrewery.github.io/Zillow-Clone/ and see how the website is structured. This is where you'll be scraping the data from:

BeautifulSoup Requirements



Clean up the strings, by removing any "+" symbols and other information so that you are only left with a dollar price. The price should look like "$1,234" instead of "$1,234+ /mo"


Clean up the address data as well. Remove any newlines, pipe symbols |, and unnecessary whitespace.


Selenium Requirements


Objective

You should end up with a spreadsheet that looks something like this.

\ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/002 Zillow-Clone-Site.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/002 Zillow-Clone-Site.url new file mode 100644 index 0000000000000000000000000000000000000000..296c40481740b16905f520eac395930564bb39d7 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/002 Zillow-Clone-Site.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://appbrewery.github.io/Zillow-Clone/ \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/003 Course-Fixes-Report-an-Issue.url b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/003 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..e0d7d87474efa0d80a38676e76977d55e968e177 --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/003 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.google.com/forms/d/e/1FAIpQLSdwbmx2whgRNiciYXiSs2lJT6-dOYgvqGnXdVqfLv1fjln7kw/viewform \ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/003 Hints & Solution.html b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/003 Hints & Solution.html new file mode 100644 index 0000000000000000000000000000000000000000..1e871119d9f2cbed1f57068e753b8b736a54d5aa --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/003 Hints & Solution.html @@ -0,0 +1 @@ +

Hint 1

Remember to provide your user agent and accepted languages via a header. We've discussed this in the Amazon Price Scraping project in day 47.


Hint 2:

The address data can be quite messy:

There's many ways you can clean this up. One way is to use Python's .replace() and .strip() methods to remove the newlines, whitespace and pipe symbols.


Hint 3

The price for listings with multiple properties have different text from listings with a single property only. A property with a single listing will have a price of $1,234/mo or $1,234+/mo, but a listing with multiple properties will have the number of bedrooms in the price $1,234+ 1bd. Try to clean up this data as well.


Partial Solution

If you got stuck on the data cleaning and BeautifulSoup, you can look at the solution to the first part of the capstone project here: https://gist.github.com/TheMuellenator/7e45f9b977e90419146c4a2ee1713087


Complete Solution

Here's the complete solution that includes both BeautifulSoup and Selenium:

https://gist.github.com/TheMuellenator/1318b1084a74e9b559f9820438b4a931

\ No newline at end of file diff --git a/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/external-links.txt b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..ab39115cbb35eeb2dfc6f50248ad4ef23cafdcdc --- /dev/null +++ b/part3/53 - Day 53 - Intermediate+ Web Scraping Capstone - Data Entry Job Automation/external-links.txt @@ -0,0 +1,24 @@ + +001 Data-Entry-Jobs-on-Indeed +https://www.indeed.com/jobs?q=data%20entry&l=remote + +001 Automating-Your-Job-Reddit +https://www.reddit.com/r/Python/comments/8uxifv/has_anyone_automated_their_job_completely/ + +001 Automated-Job-Story +https://workplace.stackexchange.com/questions/93696/is-it-unethical-for-me-to-not-tell-my-employer-i-ve-automated-my-job + +001 Zillow-Property-search +https://www.zillow.com/homes/for_rent/1-_beds/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22usersSearchTerm%22%3Anull%2C%22mapBounds%22%3A%7B%22west%22%3A-122.69219435644531%2C%22east%22%3A-122.17446364355469%2C%22south%22%3A37.703343724016136%2C%22north%22%3A37.847169233586946%7D%2C%22isMapVisible%22%3Atrue%2C%22filterState%22%3A%7B%22fr%22%3A%7B%22value%22%3Atrue%7D%2C%22fsba%22%3A%7B%22value%22%3Afalse%7D%2C%22fsbo%22%3A%7B%22value%22%3Afalse%7D%2C%22nc%22%3A%7B%22value%22%3Afalse%7D%2C%22cmsn%22%3A%7B%22value%22%3Afalse%7D%2C%22auc%22%3A%7B%22value%22%3Afalse%7D%2C%22fore%22%3A%7B%22value%22%3Afalse%7D%2C%22pmf%22%3A%7B%22value%22%3Afalse%7D%2C%22pf%22%3A%7B%22value%22%3Afalse%7D%2C%22mp%22%3A%7B%22max%22%3A3000%7D%2C%22price%22%3A%7B%22max%22%3A872627%7D%2C%22beds%22%3A%7B%22min%22%3A1%7D%7D%2C%22isListVisible%22%3Atrue%2C%22mapZoom%22%3A11%7D + +001 Google-Forms +https://docs.google.com/forms + +001 Zillow-Clone-Site +https://appbrewery.github.io/Zillow-Clone/ + +002 Zillow-Clone-Site +https://appbrewery.github.io/Zillow-Clone/ + +003 Course-Fixes-Report-an-Issue +https://docs.google.com/forms/d/e/1FAIpQLSdwbmx2whgRNiciYXiSs2lJT6-dOYgvqGnXdVqfLv1fjln7kw/viewform diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/001 Understanding Backend Web Development with Python.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/001 Understanding Backend Web Development with Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cdb6a79ed9d33273e309c47b0dd236048dc4d504 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/001 Understanding Backend Web Development with Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2194f7618a71007870b435c5f0b027ed271c7d6aa14c9a4e5520fb9e43f30ff +size 40897041 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/001 Understanding Backend Web Development with Python_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/001 Understanding Backend Web Development with Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..efa26cff9d013707d4d44119bf936007f1a58ab3 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/001 Understanding Backend Web Development with Python_vi.srt @@ -0,0 +1,524 @@ +1 +00:00:00,510 --> 00:00:04,590 +Xin chào các bạn, chào mừng bạn đến với ngày thứ 54 trong 100 ngày của Code. + +2 +00:00:05,010 --> 00:00:10,010 +Và hôm nay chúng ta sẽ chuyển sang một chủ đề mới và đó sẽ là phát + +3 +00:00:10,200 --> 00:00:11,033 +triển web. + +4 +00:00:11,220 --> 00:00:13,920 +Và chúng tôi cũng sẽ nghiên cứu vấn đề này trong vài ngày tới. + +5 +00:00:14,520 --> 00:00:16,320 +Bây giờ có khá nhiều thứ để trang trải cho ngày hôm nay. + +6 +00:00:16,350 --> 00:00:20,670 +Chúng ta sẽ nói về dòng lệnh, trình trang trí Python, cũng như + +7 +00:00:20,970 --> 00:00:23,730 +phát triển web bằng Flask, một trong + +8 +00:00:23,850 --> 00:00:28,170 +những khuôn khổ phổ biến nhất để tạo trang web bằng Python. + +9 +00:00:29,460 --> 00:00:32,490 +Bây giờ, trước khi chúng ta bắt đầu, bạn có thể nghĩ rằng, tôi + +10 +00:00:32,549 --> 00:00:34,020 +đã biết cách tạo trang web. + +11 +00:00:34,110 --> 00:00:38,250 +Tôi đã học về HTML và CSS vào các ngày từ 41 đến 44. + +12 +00:00:38,250 --> 00:00:40,590 +Vì vậy, tôi thực sự biết làm thế nào để làm trang web. + +13 +00:00:40,860 --> 00:00:44,520 +Vì vậy, chính xác nó là gì mà bạn đang dạy tôi bây giờ? Nếu bạn nghĩ về một + +14 +00:00:44,550 --> 00:00:45,720 +trang web, + +15 +00:00:45,930 --> 00:00:49,950 +một trang web đơn giản chỉ chứa HTML và CSS. + +16 +00:00:50,310 --> 00:00:53,310 +Bây giờ đó cũng là những gì chúng tôi gọi là giao diện người dùng. + +17 +00:00:53,610 --> 00:00:58,380 +Đây là nàng tiên cá xinh đẹp mà người dùng được nhìn thấy. Bây giờ để trang web thực sự có một + +18 +00:00:58,380 --> 00:01:02,760 +số chức năng, ví dụ: nếu bạn đang xây dựng một ứng dụng web thay vì chỉ + +19 +00:01:02,790 --> 00:01:05,489 +một trang web hiển thị đơn giản, thì nó cũng + +20 +00:01:05,910 --> 00:01:08,070 +phải có một chương trình phụ trợ. + +21 +00:01:08,550 --> 00:01:12,300 +Và phần phụ trợ là phần mà chúng ta sẽ học cách xây dựng + +22 +00:01:12,300 --> 00:01:13,133 +ngay bây giờ. + +23 +00:01:13,620 --> 00:01:17,760 +Vì vậy, nếu giao diện người dùng chỉ là phần hiển thị thông tin cho người dùng, thì + +24 +00:01:18,060 --> 00:01:21,210 +phần phụ trợ là phần thực hiện rất nhiều logic nghiệp vụ, nhiều phép + +25 +00:01:21,240 --> 00:01:22,560 +tính và rất nhiều thứ + +26 +00:01:22,890 --> 00:01:26,670 +mà chúng tôi đã làm với Python . Bây giờ, khi mọi người nói về phát + +27 +00:01:26,670 --> 00:01:29,370 +triển web đầy đủ, đó là một thuật ngữ mà bạn + +28 +00:01:29,430 --> 00:01:31,230 +sẽ nghe nói đến nếu bạn + +29 +00:01:31,260 --> 00:01:35,700 +đang tìm kiếm các công việc phát triển web. Bây giờ đầy đủ ngăn xếp về cơ bản chỉ có + +30 +00:01:35,700 --> 00:01:37,830 +nghĩa là giao diện người dùng và phụ trợ. + +31 +00:01:37,890 --> 00:01:42,540 +Vì vậy, ai đó có thể xử lý cả công nghệ frontend và backend. Bây giờ, thường có khá + +32 +00:01:42,540 --> 00:01:46,890 +nhiều ngôn ngữ được sử dụng cho mặt trước và + +33 +00:01:46,890 --> 00:01:49,620 +mặt sau. Vì vậy, mặt trước + +34 +00:01:49,620 --> 00:01:53,460 +thường là HTML, CSS và JavaScript. HTML cung cấp cấu trúc trang + +35 +00:01:53,490 --> 00:01:58,410 +web, CSS cung cấp phong cách và JavaScript cho phép nó có một số loại tương tác. + +36 +00:01:59,070 --> 00:02:02,880 +Giờ đây, chương trình phụ trợ cũng có thể được tạo bởi một loạt các ngôn ngữ + +37 +00:02:03,240 --> 00:02:08,190 +khác nhau và ở đây có nhiều sự lựa chọn hơn. Ừm, bạn có thể chọn giữa JavaScript, Java, + +38 +00:02:08,220 --> 00:02:09,479 +Python, Ruby, có + +39 +00:02:09,660 --> 00:02:13,110 +rất nhiều ngôn ngữ khác nhau. Để làm cho nó phức tạp hơn + +40 +00:02:13,110 --> 00:02:15,930 +nữa, ngoài ngôn ngữ, còn có các khuôn khổ khác nhau mà + +41 +00:02:16,140 --> 00:02:19,560 +bạn có thể sử dụng cho giao diện người dùng và giao diện người dùng. + +42 +00:02:19,980 --> 00:02:21,930 +Vì vậy, một số khung công tác phổ biến mà + +43 +00:02:21,930 --> 00:02:26,930 +bạn có thể đã nghe nói đến là những thứ như Angular và Rreact từ giao diện người dùng và Node and Flask hoặc Django cho + +44 +00:02:27,240 --> 00:02:28,073 +phần phụ trợ. + +45 +00:02:29,430 --> 00:02:34,290 +Vì vậy, các khung công tác này về cơ bản là các công cụ thực sự đi kèm với rất nhiều mã được + +46 +00:02:34,350 --> 00:02:38,700 +tạo sẵn cho rất nhiều chức năng phổ biến mà bạn tìm thấy khi xây dựng giao diện người dùng + +47 +00:02:38,700 --> 00:02:39,900 +và giao diện người dùng. + +48 +00:02:40,290 --> 00:02:44,610 +Vì vậy, theo cách đó, chúng ta không phải lúc nào cũng phải phát minh lại bánh xe và chúng ta có thể chỉ cần + +49 +00:02:44,700 --> 00:02:49,200 +sử dụng bánh xe và chế tạo một chiếc xe đạp hoặc chế tạo một chiếc ô tô hoặc chế tạo một chiếc xe tay ga + +50 +00:02:49,200 --> 00:02:52,170 +và bất cứ điều gì chúng ta muốn. Bây giờ, khi chúng + +51 +00:02:52,170 --> 00:02:54,270 +tôi đang xem xét chương trình phụ trợ + +52 +00:02:54,330 --> 00:02:58,350 +Python, có vô số khung công tác khác nhau mà bạn có thể lựa chọn. + +53 +00:02:58,650 --> 00:03:02,410 +Ví dụ: Flask, Django, Bottle, Cherry pie, kim tự + +54 +00:03:02,770 --> 00:03:07,120 +tháp và nhiều thứ khác. Nhưng những thứ phổ biến nhất, nếu bạn nhìn vào + +55 +00:03:07,150 --> 00:03:07,720 +tìm kiếm + +56 +00:03:07,720 --> 00:03:12,720 +việc làm, là Flask và Django, nơi Flask phù hợp hơn với người mới bắt đầu và cả các dự án nhỏ và Django + +57 +00:03:14,800 --> 00:03:19,800 +phù hợp hơn nhiều với các dự án thương mại lớn hơn. Để xây dựng một trang web + +58 +00:03:20,830 --> 00:03:25,030 +có giao diện người dùng và phần phụ trợ, chúng ta phải + +59 +00:03:25,330 --> 00:03:28,330 +hiểu chính xác phần phụ trợ là gì. + +60 +00:03:29,380 --> 00:03:32,800 +Có ba thành phần mà bạn thực sự cần hiểu khi + +61 +00:03:32,800 --> 00:03:35,770 +nói đến phụ trợ. Và đó là máy + +62 +00:03:36,220 --> 00:03:38,440 +khách, máy chủ và cơ sở dữ liệu. + +63 +00:03:39,100 --> 00:03:43,390 +Ba thành phần này kết hợp với nhau sẽ xác định cách hoạt động của chương trình phụ trợ của bạn. + +64 +00:03:44,020 --> 00:03:45,280 +Bây giờ, trước hết + +65 +00:03:45,280 --> 00:03:49,630 +là khách hàng, bạn có thể tưởng tượng giống như một người dùng truy cập vào trình + +66 +00:03:49,930 --> 00:03:53,110 +duyệt, đây là phía khách hàng. Đây là phần đối diện với người dùng. + +67 +00:03:53,890 --> 00:03:55,570 +Và sau đó là máy chủ. + +68 +00:03:55,930 --> 00:04:00,040 +Vì vậy, bạn có thể nghĩ về máy chủ về cơ bản chỉ là một máy tính + +69 +00:04:00,310 --> 00:04:03,430 +mạnh mẽ được kết nối với internet và nó luôn sẵn sàng 24/7 + +70 +00:04:03,790 --> 00:04:07,780 +để nhận các yêu cầu qua internet. Cuối cùng, bạn đã có cơ sở + +71 +00:04:07,780 --> 00:04:08,950 +dữ liệu giống như + +72 +00:04:09,100 --> 00:04:12,670 +một bảng tính được bổ sung, nơi bạn đang lưu trữ tất cả + +73 +00:04:12,670 --> 00:04:15,130 +thông tin liên quan đến trang web của mình. + +74 +00:04:15,730 --> 00:04:19,300 +Vì vậy, giả sử khách hàng muốn truy cập google. com. Chà, khi họ + +75 +00:04:19,300 --> 00:04:22,480 +nhập nội dung đó vào thanh URL và nhấn enter, điều + +76 +00:04:22,750 --> 00:04:26,080 +đó sẽ được gửi đến máy chủ dưới dạng yêu cầu + +77 +00:04:26,620 --> 00:04:30,490 +và điều này sẽ được truyền qua internet tới máy tính khác này. + +78 +00:04:30,940 --> 00:04:35,940 +Và máy chủ này phải trả lời. Và nó phản hồi bằng cách gửi qua các + +79 +00:04:38,410 --> 00:04:42,220 +tệp HTML, CSS và JavaScript mà nó có cho trang web cụ thể đó. + +80 +00:04:42,640 --> 00:04:45,340 +Và một khi nó được gửi trở lại trình duyệt, thì nó có thể + +81 +00:04:45,430 --> 00:04:50,380 +được trình duyệt hiển thị dưới dạng trang web thực tế. Bây giờ, nếu bạn là một trang web + +82 +00:04:50,410 --> 00:04:54,430 +sử dụng nhiều dữ liệu hoặc các loại dữ liệu khác nhau có thể + +83 +00:04:54,430 --> 00:04:59,140 +được người dùng yêu cầu, thì thông thường bạn sẽ có một cơ sở dữ liệu. + +84 +00:04:59,470 --> 00:05:02,020 +Vì vậy, khi khách hàng yêu cầu, ví dụ, xem + +85 +00:05:02,020 --> 00:05:05,320 +tất cả các vé mà họ có trên Eventbrite, thì trang mà họ đang + +86 +00:05:05,320 --> 00:05:09,100 +xem, đó là giao diện người dùng. Đó là phía khách hàng. + +87 +00:05:09,550 --> 00:05:12,610 +Nhưng để hiển thị tất cả các vé mà họ + +88 +00:05:12,910 --> 00:05:17,890 +có, máy khách thực hiện yêu cầu tới máy chủ và máy chủ tìm nạp dữ liệu + +89 +00:05:17,890 --> 00:05:21,310 +từ cơ sở dữ liệu. Sau khi lấy lại dữ + +90 +00:05:21,550 --> 00:05:25,450 +liệu từ cơ sở dữ liệu, nó sẽ đưa dữ liệu vào các tệp + +91 +00:05:25,780 --> 00:05:30,780 +HTML, CSS và JavaScript và gửi toàn bộ gói trở lại trình duyệt để người dùng xem. + +92 +00:05:31,930 --> 00:05:36,160 +Nếu toàn bộ quá trình này có vẻ hơi phức tạp và phức tạp, đừng lo lắng. + +93 +00:05:36,400 --> 00:05:40,270 +Chúng tôi sẽ đi sâu vào việc tạo máy chủ, tạo cơ sở dữ liệu + +94 +00:05:40,570 --> 00:05:44,170 +của chúng tôi và chúng tôi sẽ tự tạo tất cả các phần + +95 +00:05:44,200 --> 00:05:47,620 +này từ đầu từng bước một. Vì vậy, ở phần cuối của phần + +96 +00:05:47,860 --> 00:05:50,080 +web-dev, bạn sẽ thấy rằng nếu bạn quay lại video này, + +97 +00:05:50,170 --> 00:05:52,120 +mọi thứ sẽ có ý nghĩa hơn rất nhiều. + +98 +00:05:53,140 --> 00:05:57,100 +Bây giờ để bạn có cái nhìn tổng quan về toàn bộ hệ thống trông như + +99 +00:05:57,110 --> 00:06:00,530 +thế nào, tôi muốn sử dụng sự tương tự của một nhà hàng. + +100 +00:06:01,250 --> 00:06:05,480 +Vì vậy, hãy tưởng tượng nếu bạn có một nhà hàng và bạn có mặt trước của ngôi nhà + +101 +00:06:05,480 --> 00:06:06,830 +là nơi đặt các bàn, 1: + +102 +00:06:06,880 --> 00:06:09,100 +khi khách hàng ngồi. Và sau đó là 0: + +103 +00:06:09,130 --> 00:06:10,240 +bạn đã có nhà bếp, + +104 +00:06:10,270 --> 00:06:13,690 +nơi các đầu bếp làm việc và nơi bạn tạo ra tất cả các món ăn. + +105 +00:06:14,050 --> 00:06:15,790 +Và cuối cùng, bạn cũng đã + +106 +00:06:15,790 --> 00:06:20,080 +có mỡ lợn, nơi bạn chứa tất cả các nguyên liệu trong tủ lạnh hoặc trên giá. + +107 +00:06:20,770 --> 00:06:23,590 +Bây giờ, phần phía trước ngôi nhà này là nơi người dùng + +108 +00:06:23,710 --> 00:06:28,300 +ngồi trong đó là trang web của khách hàng. Bây giờ ở giữa, chúng tôi đã có + +109 +00:06:28,300 --> 00:06:32,770 +nhà bếp, đó là máy chủ. Và cuối cùng chúng ta đã có mỡ lợn + +110 +00:06:32,800 --> 00:06:35,590 +về cơ bản là cơ sở dữ liệu của các thành phần. + +111 +00:06:36,130 --> 00:06:41,050 +Bây giờ phía khách hàng hoàn toàn tách biệt với phần còn lại. Vì vậy, với tư cách là người dùng, khi tôi truy cập vào + +112 +00:06:41,050 --> 00:06:42,310 +một trang web, tôi không tương + +113 +00:06:42,580 --> 00:06:46,900 +tác trực tiếp với máy chủ hoặc cơ sở dữ liệu. Thay vào đó, tôi đang tương tác với trình + +114 +00:06:46,900 --> 00:06:50,740 +duyệt của mình, ở phía máy khách. Bây giờ, khi bạn truy cập vào + +115 +00:06:50,770 --> 00:06:55,270 +một trang web và bạn yêu cầu xem một số thông tin, chẳng hạn như bạn đăng nhập + +116 +00:06:55,300 --> 00:06:58,600 +vào Spotify và bạn muốn xem danh sách phát của mình, điều thực + +117 +00:06:58,990 --> 00:07:01,020 +sự xảy ra là bạn biết đấy, bạn + +118 +00:07:01,020 --> 00:07:04,420 +không có chức năng sắp xếp. nấu món ăn trước mặt bạn về phía + +119 +00:07:04,420 --> 00:07:05,860 +khách hàng. Không, thay + +120 +00:07:05,920 --> 00:07:10,920 +vào đó, điều xảy ra là máy chủ tìm nạp các thành phần liên quan từ + +121 +00:07:12,160 --> 00:07:16,330 +cơ sở dữ liệu, vì vậy dữ liệu liên quan đến danh sách + +122 +00:07:16,720 --> 00:07:21,100 +phát Spotify của bạn, sau đó nó lấy dữ liệu đó và hiển thị + +123 +00:07:21,130 --> 00:07:23,020 +thành tệp HTML, CSS và JavaScript. + +124 +00:07:23,440 --> 00:07:26,410 +Và sau đó khi sản phẩm cuối đó được tạo, nó + +125 +00:07:26,680 --> 00:07:30,910 +sẽ chuyển nó đến trình duyệt ở phía máy khách, mà bạn với tư cách là + +126 +00:07:30,940 --> 00:07:33,040 +người dùng, bây giờ có thể xem. + +127 +00:07:33,700 --> 00:07:38,700 +Vì vậy, về cơ bản đây là tổng quan về cách giao diện người dùng và phần phụ trợ của chúng tôi tương tác để + +128 +00:07:39,790 --> 00:07:43,810 +tạo ra trải nghiệm trang web cho mọi người. Và trong các bài học sắp + +129 +00:07:43,810 --> 00:07:47,710 +tới, chúng ta sẽ xây dựng từng phần này và bạn sẽ thấy chi + +130 +00:07:47,710 --> 00:07:51,850 +tiết hơn cách chúng hoạt động cùng nhau. Vì vậy, hãy chuyển sang bài học tiếp theo + +131 +00:07:52,000 --> 00:07:54,940 +và chúng ta sẽ bắt đầu xây dựng trang web đầu tiên của mình. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Create your First Web Server with Flask.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Create your First Web Server with Flask.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c30642ce70b2cd582aa9c79c91926ca78f65824a --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Create your First Web Server with Flask.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a239f845e856e2b946525bc6a4bf7ae7aa18aae0104ee017d91342c12fd7943a +size 99507410 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Create your First Web Server with Flask_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Create your First Web Server with Flask_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..16df28d06870520b26ea68267d4da536d41a84f7 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Create your First Web Server with Flask_vi.srt @@ -0,0 +1,728 @@ +1 +00:00:00,600 --> 00:00:04,670 +Được rồi. Hãy bắt đầu phát triển các trang web bằng Flask. + +2 +00:00:05,330 --> 00:00:09,350 +Bây giờ Flask là một trong những framework phát triển web phổ biến nhất, nhưng nó có ý + +3 +00:00:09,860 --> 00:00:13,490 +nghĩa gì khi trở thành một framework? Chà, chúng ta đã từng + +4 +00:00:13,880 --> 00:00:18,710 +thấy những thư viện như Beautiful Soup. Các công cụ mà chúng ta có thể sử dụng và khai thác bất cứ + +5 +00:00:18,710 --> 00:00:22,760 +khi nào chúng ta cần một phần chức năng cụ thể. Bây giờ, một khung công tác + +6 +00:00:22,820 --> 00:00:26,990 +giống như một thư viện theo nghĩa đó là một gói mã mà + +7 +00:00:26,990 --> 00:00:30,770 +bạn không viết, nhưng nó cũng có một số điểm khác biệt. + +8 +00:00:31,100 --> 00:00:35,960 +Vì vậy, ở đây tôi có một hình ảnh từ sự khác biệt giữa. net và một trong những điểm khác + +9 +00:00:35,960 --> 00:00:40,960 +biệt lớn nhất là thư viện là thứ mà bạn kêu gọi để làm + +10 +00:00:43,580 --> 00:00:45,140 +một việc cụ thể. + +11 +00:00:45,620 --> 00:00:50,120 +Trong khi một khuôn khổ là thứ mà bạn phải tuân theo các quy tắc của chúng, thì + +12 +00:00:50,390 --> 00:00:52,610 +bạn phải sử dụng kiến trúc của chúng. + +13 +00:00:53,000 --> 00:00:56,990 +Và khi nói đến việc kích hoạt một số loại chức năng, + +14 +00:00:57,260 --> 00:01:00,530 +thì đó là khuôn khổ gọi mã của bạn. + +15 +00:01:01,190 --> 00:01:02,960 +Vậy điều đó có ý nghĩa gì? Chà, hãy nhớ + +16 +00:01:02,990 --> 00:01:07,990 +khi chúng ta sử dụng thư viện yêu cầu và chúng ta sẽ nói điều gì đó giống như yêu cầu. lấy và sau đó chúng tôi sẽ cho nó biết trang web nào cần truy cập và tìm nạp. + +17 +00:01:08,210 --> 00:01:12,980 +Chà, đây là chúng ta khai thác vào thư viện + +18 +00:01:13,400 --> 00:01:18,650 +đó và sau đó ra lệnh cho nó làm điều gì đó. + +19 +00:01:18,650 --> 00:01:22,100 +Bây giờ, khi chúng tôi đang làm việc với một khuôn khổ, nó không thực sự hoạt động như vậy. Chúng tôi không thực sự nói, hey framework, + +20 +00:01:22,130 --> 00:01:25,400 +hãy làm điều này cho chúng tôi. Thay vào đó, chúng tôi + +21 +00:01:25,430 --> 00:01:27,530 +đảm bảo + +22 +00:01:27,560 --> 00:01:32,560 +rằng mã của chúng tôi được xác định theo cách mà khung công tác muốn. Và sau đó khi đến thời điểm thích hợp, khuôn khổ sẽ thực sự gọi + +23 +00:01:32,690 --> 00:01:34,910 +các phương thức + +24 +00:01:35,090 --> 00:01:38,390 +của chúng ta thay vì chúng ta gọi khuôn khổ. + +25 +00:01:38,780 --> 00:01:41,090 +Tất cả những gì chúng ta phải làm là lên kế hoạch trước cho những tình huống nhất định. + +26 +00:01:41,600 --> 00:01:45,950 +Nếu đó là tình huống này, điều gì chúng ta muốn xảy ra? Nếu đó là tình huống, mã nào nó + +27 +00:01:46,280 --> 00:01:51,020 +nên được chạy? + +28 +00:01:51,200 --> 00:01:52,640 +Vì vậy, có thể tất cả + +29 +00:01:53,060 --> 00:01:57,530 +những gì bạn phải làm chỉ là viết một số hàm như hello world và khi người dùng truy cập vào + +30 +00:01:57,530 --> 00:02:00,110 +trang web, nó sẽ hiển thị dòng chữ Hello world này. + +31 +00:02:00,440 --> 00:02:03,440 +Hãy thử điều này trong thực tế. Bây giờ bạn đã biết rằng với tư cách là nhà + +32 +00:02:04,700 --> 00:02:07,700 +phát triển, đặc biệt + +33 +00:02:07,700 --> 00:02:10,070 +là bây giờ chúng ta đang ở giai + +34 +00:02:10,400 --> 00:02:14,420 +đoạn nâng cao để trở thành nhà phát triển Python, điều quan trọng nhất + +35 +00:02:14,790 --> 00:02:19,790 +khi chúng ta tiếp cận một công cụ mới hoặc một công nghệ mới là đọc tài liệu. + +36 +00:02:19,790 --> 00:02:21,140 +Vì vậy, Flask thực sự + +37 +00:02:21,770 --> 00:02:26,770 +có một phần tài liệu thực sự tốt để cho chúng tôi biết cách bắt đầu sử dụng Flask một cách nhanh chóng. Như bạn có thể thấy, họ đã mô tả một ứng dụng Flask + +38 +00:02:27,110 --> 00:02:32,090 +tối thiểu trông như thế nào. + +39 +00:02:32,090 --> 00:02:36,200 +Và đây là một máy chủ rất đơn giản được thiết lập với flask. + +40 +00:02:36,530 --> 00:02:40,730 +Vì vậy, hãy tiếp tục và sao chép mã này. Và tôi sẽ tạo một dự án mới mà tôi đã + +41 +00:02:41,300 --> 00:02:46,040 +quyết định gọi là hello_flask. Và sau đó trong thư mục dự án này, tôi sẽ tạo + +42 +00:02:46,100 --> 00:02:50,360 +một tệp mới mà tôi sẽ gọi là hello. py + +43 +00:02:50,420 --> 00:02:54,710 +Bây giờ, điều quan trọng là + +44 +00:02:55,640 --> 00:03:00,640 +tên tệp của bạn không xung đột với tên của khung hoặc thư viện trên thực tế. Vì vậy, ví dụ, nếu tôi tạo một tệp được gọi + +45 +00:03:01,180 --> 00:03:04,720 +là yêu cầu. py và tôi + +46 +00:03:04,720 --> 00:03:08,170 +đã nhập + +47 +00:03:08,620 --> 00:03:10,540 +thư viện yêu cầu. + +48 +00:03:10,750 --> 00:03:13,750 +Và sau đó tôi cố gắng làm một cái gì đó giống như yêu cầu. lấy. + +49 +00:03:14,350 --> 00:03:17,650 +Bây giờ khi tôi chạy điều + +50 +00:03:19,210 --> 00:03:20,650 +này, vì tên tệp của + +51 +00:03:20,680 --> 00:03:25,680 +tôi xung đột với tên của mô-đun, điều gì sẽ xảy ra là tôi sẽ gặp lỗi này. Và nó có thể hơi khó hiểu vì nó nói, tốt, yêu cầu không + +52 +00:03:26,530 --> 00:03:30,610 +có thuộc tính nhận được. Chúng tôi biết điều đó vì + +53 +00:03:30,610 --> 00:03:34,660 +nó có trong tài liệu. + +54 +00:03:34,660 --> 00:03:37,330 +Và lý do tại sao chúng tôi gặp + +55 +00:03:37,750 --> 00:03:42,750 +lỗi này là vì chúng tôi đã đặt tên tệp này giống với tên của mô-đun. + +56 +00:03:43,690 --> 00:03:45,730 +Vì vậy, đây là điều xảy ra với rất + +57 +00:03:46,120 --> 00:03:48,850 +nhiều người, vì vậy hãy đảm bảo rằng bạn không phạm phải lỗi + +58 +00:03:49,120 --> 00:03:54,120 +này và bạn có thể đặt tên cho nó bất kỳ thứ gì như main hoặc server hoặc hello trong trường hợp của chúng tôi. Lưu ý rằng bây giờ nếu tôi thay đổi tên, nó + +59 +00:03:54,460 --> 00:03:59,350 +thực sự đã tự động + +60 +00:03:59,350 --> 00:04:03,730 +thay đổi quá trình nhập không như chúng ta muốn. Chúng tôi muốn nhập là các yêu cầu và chúng tôi muốn đảm bảo rằng chúng tôi + +61 +00:04:04,000 --> 00:04:08,380 +cài đặt các yêu cầu gói của mình. + +62 +00:04:08,620 --> 00:04:12,760 +Và sau khi hoàn tất, bạn có thể thấy mô-đun của chúng tôi và tệp của chúng tôi có + +63 +00:04:14,140 --> 00:04:15,640 +các tên hoàn toàn khác nhau. + +64 +00:04:15,700 --> 00:04:19,720 +Vì vậy, bây giờ, nếu tôi chạy tệp này, nó hoạt động hoàn hảo + +65 +00:04:20,110 --> 00:04:22,060 +và nó kết thúc bằng mã + +66 +00:04:22,120 --> 00:04:25,450 +thoát số 0, có nghĩa là mọi thứ đã thành công. + +67 +00:04:25,510 --> 00:04:27,490 +Vì vậy, bây giờ tôi sẽ tiếp + +68 +00:04:28,240 --> 00:04:31,510 +tục xóa tệp này và quay lại phần chào của chúng tôi. py Bây giờ bên trong xin chào của chúng tôi. py Tôi sẽ dán vào + +69 +00:04:33,670 --> 00:04:38,410 +ứng + +70 +00:04:38,470 --> 00:04:43,470 +dụng Flask tối thiểu từ tài liệu Flask. Vì vậy, dán nó ngay tại đây. + +71 +00:04:44,020 --> 00:04:47,080 +Và như bạn có thể nhớ, có một số + +72 +00:04:47,740 --> 00:04:49,510 +cách để chúng tôi có thể cài đặt các mô-đun mới. Vì vậy, trong trường + +73 +00:04:49,570 --> 00:04:54,310 +hợp này, mô-đun là Flask và chúng + +74 +00:04:54,310 --> 00:04:59,310 +ta có thể nhấp vào bóng đèn màu đỏ để cài đặt gói này. Ngoài ra, chúng ta có thể vào PyCharm, tùy chọn, sau đó đi + +75 +00:05:00,160 --> 00:05:05,050 +tới dự án của chúng + +76 +00:05:05,380 --> 00:05:10,380 +ta và vào trình thông dịch để thêm gói Flask như thế này. + +77 +00:05:12,790 --> 00:05:13,380 +1: Đúng. + +78 +00:05:13,380 --> 00:05:14,213 +0: Bây giờ, + +79 +00:05:16,470 --> 00:05:19,260 +nếu bạn có phiên bản PyCharm chuyên nghiệp, sẽ có các công cụ + +80 +00:05:19,770 --> 00:05:24,360 +bổ sung để giúp cài đặt Flask vào một dự án và làm việc với các dự án Flask dễ dàng hơn. Nhưng vì chúng tôi đang sử dụng phiên bản cộng đồng miễn phí, tôi sẽ tiếp tục và + +81 +00:05:24,360 --> 00:05:28,620 +loại bỏ cửa sổ bật lên đó. + +82 +00:05:28,680 --> 00:05:30,960 +Vì vậy, tôi đã chỉ cho bạn hai cách cài đặt một gói. + +83 +00:05:31,620 --> 00:05:34,290 +Bây giờ tôi muốn chỉ cho bạn cách thứ ba mà bạn có + +84 +00:05:34,440 --> 00:05:36,090 +thể bắt gặp nếu đang xem cài đặt. + +85 +00:05:36,660 --> 00:05:40,650 +Vì vậy, hãy lưu ý ở đây, để cài đặt Flask, + +86 +00:05:41,850 --> 00:05:44,730 +họ đang sử dụng pip install Flask. + +87 +00:05:44,760 --> 00:05:47,550 +Vì vậy, pip là thứ cho phép chúng ta cài đặt các gói Python từ pypi. + +88 +00:05:48,930 --> 00:05:53,930 +Vì vậy, bất kỳ gói nào mà bạn trên pypi. org, bạn có thể cài đặt bằng pip. + +89 +00:05:55,620 --> 00:06:00,590 +Và những gì chúng ta phải làm là gõ tên mà bạn nhìn thấy ngay tại đây. + +90 +00:06:01,280 --> 00:06:05,930 +Ví dụ, nếu chúng ta muốn cài đặt Flask, thì đó là cài đặt pip và đó + +91 +00:06:07,010 --> 00:06:08,930 +là chữ F viết hoa cho Flask. + +92 +00:06:08,990 --> 00:06:13,400 +Vì vậy, chúng tôi có thể sao chép nó vào khay nhớ tạm của chúng tôi. + +93 +00:06:13,790 --> 00:06:15,980 +Và nếu chúng ta chuyển đến tab terminal ở dưới cùng, + +94 +00:06:16,460 --> 00:06:18,680 +chúng ta có thể dán hướng dẫn đó vào đây và nhấn enter. + +95 +00:06:18,950 --> 00:06:22,700 +Bây giờ nó đã được cài đặt thành công Flask. Và một khi tôi loại bỏ điều đó, bạn có thể + +96 +00:06:23,630 --> 00:06:28,520 +thấy lỗi của tôi biến mất. Vì vậy, cả ba phương pháp đều hoạt động. + +97 +00:06:28,520 --> 00:06:32,660 +Cá nhân tôi thích bóng đèn đỏ hơn, chỉ vì nó nhanh hơn nhiều. + +98 +00:06:32,720 --> 00:06:36,140 +Nó chỉ là hai cú nhấp chuột chứ không phải gõ nhiều mã. Bây giờ, khi chúng ta đã cài đặt xong Flask, + +99 +00:06:36,410 --> 00:06:41,360 +chúng ta có thể tiếp tục và + +100 +00:06:41,360 --> 00:06:42,860 +thêm một số + +101 +00:06:43,160 --> 00:06:47,870 +không gian để loại bỏ tất cả các cảnh báo từ Py Charm. Ừm, chúng ta có thể tiếp tục và chạy dự án của mình. + +102 +00:06:47,870 --> 00:06:52,460 +Bây giờ, ngay khi tôi chạy dự án, bạn có thể + +103 +00:06:54,020 --> 00:06:57,050 +thấy nó cho tôi biết quá trình đã kết thúc với mã thoát bằng + +104 +00:06:57,050 --> 00:07:00,080 +0, có nghĩa là mọi thứ đã thành công, nhưng máy chủ của tôi + +105 +00:07:00,110 --> 00:07:02,240 +ở đâu và trang web của tôi ở đâu. + +106 +00:07:02,630 --> 00:07:05,540 +Vì vậy, hãy quay lại Quickstart để xem những + +107 +00:07:06,770 --> 00:07:11,180 +gì chúng ta thực sự phải làm để thiết lập máy chủ của mình. Vì vậy, để chạy ứng dụng Flask của chúng ta, trước tiên chúng ta + +108 +00:07:11,180 --> 00:07:15,350 +cần xuất một biến môi trường. + +109 +00:07:15,380 --> 00:07:20,090 +Vì vậy, trong các bài học trước, chúng ta đã nói về các biến môi trường, nhưng về + +110 +00:07:20,450 --> 00:07:23,420 +cơ bản, điều này sẽ cho khung công tác Flask + +111 +00:07:23,720 --> 00:07:26,810 +biết tên của tệp chứa máy chủ của chúng ta là gì. + +112 +00:07:27,050 --> 00:07:30,710 +Vì vậy, trong trường hợp của chúng tôi, cũng như trong + +113 +00:07:31,010 --> 00:07:33,830 +Quickstart, tên của tệp đó là hello. py + +114 +00:07:34,010 --> 00:07:36,710 +Vì vậy, về cơ bản + +115 +00:07:37,220 --> 00:07:41,810 +chúng ta phải trỏ đến tệp đó để Flask có thể nhận ra nó và sử dụng nó làm máy chủ. Vì vậy, trên Mac, chúng ta sẽ nhập không gian xuất và + +116 +00:07:41,840 --> 00:07:46,700 +sau đó chúng ta sẽ + +117 +00:07:46,760 --> 00:07:50,030 +đặt tên của biến môi trường là FLASK_APP + +118 +00:07:50,270 --> 00:07:53,540 +và tất cả các chữ hoa của nó. + +119 +00:07:53,810 --> 00:07:58,670 +Và sau đó không có dấu cách, chúng tôi có một dấu bằng và sau đó + +120 +00:07:58,850 --> 00:08:02,000 +là tên tệp của chúng tôi, đó là xin chào. py + +121 +00:08:02,420 --> 00:08:05,990 +Vì vậy, bây giờ khi tôi + +122 +00:08:06,650 --> 00:08:08,420 +nhấn enter, sẽ thêm + +123 +00:08:08,540 --> 00:08:12,980 +biến môi trường đó dưới tên mà Flask đang mong đợi, đó là flask. ứng dụng. Bây giờ, như đã đề cập trong Quickstart, nếu bạn đang sử dụng Windows, + +124 +00:08:12,980 --> 00:08:16,730 +từ khóa không + +125 +00:08:16,790 --> 00:08:19,640 +được xuất mà thay vào đó là được đặt. + +126 +00:08:19,670 --> 00:08:23,480 +Vì vậy, một lần nữa, bên trong thiết bị đầu cuối của bạn ở đây, bạn sẽ nhập set. + +127 +00:08:24,710 --> 00:08:28,730 +Và sau đó bạn sẽ đặt tên của biến môi trường đó là FLASK_APP và sau đó + +128 +00:08:29,090 --> 00:08:32,510 +không có khoảng trắng nào bằng và đó là lời chào của chúng tôi. py Và khi bạn nhấn enter, nó sẽ đưa ra lời + +129 +00:08:32,720 --> 00:08:37,720 +nhắc một lần nữa cho bạn biết rằng mọi thứ đã diễn ra suôn sẻ. + +130 +00:08:39,590 --> 00:08:44,059 +Bây giờ, khi chúng ta đã thực + +131 +00:08:44,420 --> 00:08:48,320 +hiện xong, bước tiếp theo là sử dụng lệnh Flask có tên là run. + +132 +00:08:49,130 --> 00:08:50,990 +Và khi tôi nhấn enter, bạn sẽ thấy rằng nó đã được tạo ra máy chủ của tôi. + +133 +00:08:51,290 --> 00:08:55,380 +Vì vậy, nó đang phục vụ ứng dụng Flask mà tôi đã tạo trong hello. py và chúng tôi nhận được một cảnh báo cho chúng tôi + +134 +00:08:59,180 --> 00:09:03,590 +biết rằng đây là một máy chủ phát triển và cho chúng tôi biết + +135 +00:09:03,620 --> 00:09:08,620 +rằng nếu bạn thực sự muốn khởi + +136 +00:09:09,830 --> 00:09:14,810 +chạy nó dưới dạng một sản phẩm, đừng sử dụng máy chủ phát triển này. Có một số bước bạn phải thực hiện nếu bạn thực sự muốn làm cho + +137 +00:09:14,810 --> 00:09:18,110 +quá trình sản xuất này sẵn sàng và sẵn sàng + +138 +00:09:18,470 --> 00:09:22,430 +cho internet và khách hàng. Nhưng trong trường + +139 +00:09:22,430 --> 00:09:26,780 +hợp của chúng tôi, chúng tôi đang phát triển. Vì vậy, điều này là hoàn hảo. + +140 +00:09:26,780 --> 00:09:30,350 +Và nó cho chúng ta biết phải đi đâu và tìm trang web của chúng ta. + +141 +00:09:30,500 --> 00:09:33,500 +Vì vậy, nếu + +142 +00:09:33,950 --> 00:09:38,950 +bạn tưởng tượng rằng Google đang ở tại https: // www. Google. com. Đây là địa chỉ trang web của chúng tôi và nó đang được + +143 +00:09:39,650 --> 00:09:42,740 +phục vụ bởi máy tính của chúng tôi. + +144 +00:09:42,770 --> 00:09:45,200 +Vì + +145 +00:09:45,200 --> 00:09:50,200 +vậy, khi bạn đang cố gắng nắm bắt một trang web trên internet, thì bạn phải + +146 +00:09:53,000 --> 00:09:56,150 +trỏ tới địa chỉ IP của trang web cụ thể đó. + +147 +00:09:56,540 --> 00:10:00,320 +Nhưng vì chúng tôi đã tạo máy chủ cục bộ và nó được + +148 +00:10:00,470 --> 00:10:02,150 +phục vụ trên máy tính + +149 +00:10:02,630 --> 00:10:07,490 +của chúng tôi, nên về cơ bản đây là địa chỉ cục bộ của trang web đó. + +150 +00:10:07,490 --> 00:10:12,050 +Bây giờ, một điều thú vị về PyCharm là nếu tôi chỉ cần nhấp vào liên kết này, sau đó + +151 +00:10:12,230 --> 00:10:13,063 +nó sẽ khởi + +152 +00:10:13,820 --> 00:10:18,230 +chạy trang web của tôi trong trình duyệt của tôi và bạn có thể thấy ngay tại đây, chúng + +153 +00:10:18,440 --> 00:10:23,440 +tôi đã có hello world hiển thị giống như những gì chúng tôi ' đã có ở đây trong phương pháp này. + +154 +00:10:24,350 --> 00:10:27,320 +Vì vậy, điều đó chứng tỏ rằng chúng tôi + +155 +00:10:27,680 --> 00:10:32,060 +đã thành công trong việc tạo máy chủ web đầu tiên của mình bằng Flask. + +156 +00:10:33,410 --> 00:10:38,410 +Và nó có thể phục vụ trang web Flask đầu tiên của chúng tôi. Bây giờ, nếu bạn tiếp tục và mở các công cụ dành cho nhà phát triển Chrome và chuyển + +157 +00:10:39,140 --> 00:10:40,970 +đến phần tử, bạn có thể + +158 +00:10:41,210 --> 00:10:45,680 +thấy rằng những gì chúng tôi đã viết + +159 +00:10:45,710 --> 00:10:50,120 +ở đây chỉ là một chuỗi đã được Flask chuyển đổi thực sự thành HTML đầy đủ. + +160 +00:10:50,540 --> 00:10:54,920 +Nó có thẻ HTML, nó có thẻ head, có thẻ body và chúng + +161 +00:10:55,190 --> 00:10:59,330 +tôi không phải làm bất kỳ điều gì trong số này. + +162 +00:10:59,360 --> 00:11:01,790 +Chúng tôi vừa nói với Flask những + +163 +00:11:01,790 --> 00:11:04,820 +gì chúng tôi muốn được trả lại trên trang khi + +164 +00:11:04,850 --> 00:11:09,560 +người dùng truy cập trang chủ, chỉ có địa chỉ web cộng với dấu gạch chéo. + +165 +00:11:09,860 --> 00:11:12,650 +Bây giờ, điều cuối cùng cần nhớ là khi chúng ta + +166 +00:11:12,860 --> 00:11:16,190 +đã hoàn thành xong máy chủ của mình, bởi vì nó vẫn đang + +167 +00:11:16,700 --> 00:11:20,570 +tiếp diễn, nó vẫn đang chờ một khách hàng truy cập vào trang web này, chúng + +168 +00:11:20,600 --> 00:11:22,760 +ta phải làm cho nó ngừng chờ đợi. Vì vậy, chúng ta có + +169 +00:11:22,760 --> 00:11:27,350 +thể thoát bằng cách giữ phím điều khiển và sau đó nhấn C. Và bạn có thể thấy điều này đưa chúng tôi trở lại lời nhắc của chúng tôi, nơi chúng + +170 +00:11:27,800 --> 00:11:32,800 +tôi có tên và dự án của chúng tôi. Bây giờ, nếu bạn không dừng nó và bạn cố gắng + +171 +00:11:33,470 --> 00:11:38,390 +chạy hai ứng dụng Flask đến cùng một địa chỉ + +172 +00:11:38,450 --> 00:11:42,620 +thì ứng dụng thứ hai sẽ không chạy. + +173 +00:11:42,650 --> 00:11:47,650 +Vì vậy, chỉ cần lưu ý rằng khi bạn đã hoàn tất với máy chủ của mình, hãy nhấn Control + c để thoát. + +174 +00:11:47,780 --> 00:11:50,630 +Bây giờ trong bài học tiếp theo, tôi muốn nói + +175 +00:11:51,320 --> 00:11:55,960 +một chút về các lệnh mà bạn có thể sử dụng trong terminal vì đây được + +176 +00:11:57,130 --> 00:11:58,570 +gọi là dòng lệnh. + +177 +00:11:58,630 --> 00:12:02,620 +Và cũng giống như ở đây, chúng tôi sử dụng dòng lệnh để chạy ứng + +178 +00:12:02,620 --> 00:12:06,580 +dụng Flask của mình, để xuất các biến môi trường của chúng tôi, chúng + +179 +00:12:06,880 --> 00:12:11,880 +tôi cũng có thể làm những việc khác như tạo thư mục, tạo tệp, di chuyển tệp xung quanh. Nó thực sự là một cách rất, rất mạnh mẽ + +180 +00:12:13,510 --> 00:12:18,340 +để tương tác với máy tính của chúng ta. + +181 +00:12:18,340 --> 00:12:22,060 +Đó là những gì chúng ta sẽ làm trong bài học tiếp theo. Vì vậy, cho tất cả những + +182 +00:12:22,090 --> 00:12:25,330 +điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Flask-Package-on-PyPi.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Flask-Package-on-PyPi.url new file mode 100644 index 0000000000000000000000000000000000000000..550bfddb791159d5ae6d27df0cba076a53b6cda0 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Flask-Package-on-PyPi.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pypi.org/project/Flask/ \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Flask-Quickstart-Docs.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Flask-Quickstart-Docs.url new file mode 100644 index 0000000000000000000000000000000000000000..1c188394f973b6d8f5a80a38098d2889755dae72 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/002 Flask-Quickstart-Docs.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://flask.palletsprojects.com/en/3.0.x/quickstart/ \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Mac-Linux-Terminal-Cheat-Sheet.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Mac-Linux-Terminal-Cheat-Sheet.url new file mode 100644 index 0000000000000000000000000000000000000000..51c508f5a4c01224d96590db7500cd632d53b128 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Mac-Linux-Terminal-Cheat-Sheet.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/appbrewery/terminal-mac-cheatsheet \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Understand the Command Line on Windows and Mac.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Understand the Command Line on Windows and Mac.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f542bc79ecba12eb3e9acae81445978fa9d93dcc --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Understand the Command Line on Windows and Mac.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07aed8b57be32736e6feedd93b8251f0c48d77af0fe57da909325120ca9c2199 +size 206815065 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Understand the Command Line on Windows and Mac_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Understand the Command Line on Windows and Mac_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..025e2dee08b981457d9ba8ee946ef5a6a4ccc8b6 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Understand the Command Line on Windows and Mac_vi.srt @@ -0,0 +1,784 @@ +1 +00:00:00,120 --> 00:00:00,450 +Bây + +2 +00:00:00,450 --> 00:00:05,370 +giờ, trong bài học trước, chúng ta đã biết cách thiết lập và chạy với máy chủ Flask hoàn + +3 +00:00:05,400 --> 00:00:07,590 +toàn mới của mình. Trong bài học + +4 +00:00:07,650 --> 00:00:11,700 +này, tôi muốn nhắc lại một chút và nói ngắn gọn về một số lệnh + +5 +00:00:11,700 --> 00:00:14,070 +mà chúng ta đưa vào terminal ở đây, + +6 +00:00:14,970 --> 00:00:18,650 +bởi vì terminal thực sự là một công cụ thực sự mạnh mẽ. + +7 +00:00:19,490 --> 00:00:24,490 +Và đó là thứ còn được gọi là dòng lệnh và là cách để + +8 +00:00:24,710 --> 00:00:29,660 +gõ lệnh từng dòng một để điều khiển máy tính của chúng ta. + +9 +00:00:30,740 --> 00:00:33,350 +Dòng lệnh còn được gọi là shell. + +10 +00:00:34,040 --> 00:00:36,560 +Vậy chính xác thì shell là gì? + +11 +00:00:37,310 --> 00:00:40,910 +Nếu bạn nghĩ về hệ điều hành của mình như một hạt hồ trăn, thì nhân + +12 +00:00:41,210 --> 00:00:45,080 +của quả hồ trăn thực tế, thứ mà bạn sẽ ăn, tôi thực sự xin lỗi về + +13 +00:00:45,290 --> 00:00:47,270 +tất cả các loại thực phẩm tương tự. + +14 +00:00:47,390 --> 00:00:50,840 +Bạn có thể nói rõ ràng rằng tôi khá đói hầu hết thời gian khi quay + +15 +00:00:50,870 --> 00:00:53,510 +những video này, nhưng chúng ta hãy quay lại chủ đề. + +16 +00:00:53,570 --> 00:00:57,320 +Vì vậy, nếu hệ điều hành của bạn là một quả hồ trăn, thì + +17 +00:00:57,680 --> 00:01:01,190 +hạt thực sự là hạt nhân. Và trong tính toán, + +18 +00:01:01,190 --> 00:01:06,190 +hạt nhân đề cập đến chương trình thực tế giao tiếp với phần cứng. + +19 +00:01:06,740 --> 00:01:10,490 +Vì vậy, nó là cốt lõi của hệ điều hành của bạn. Bây giờ, vỏ quả hồ + +20 +00:01:10,490 --> 00:01:15,350 +trăn của bạn hoặc vỏ trong máy tính đề cập đến giao diện + +21 +00:01:15,500 --> 00:01:18,650 +người dùng cho bạn như một con người để + +22 +00:01:18,680 --> 00:01:23,680 +có thể tương tác với hạt nhân và lần lượt với phần cứng của + +23 +00:01:24,200 --> 00:01:27,710 +máy tính của bạn. Và có hai biến thể cho shell. + +24 +00:01:28,010 --> 00:01:32,000 +Có các khung giao diện người dùng đồ họa, vì vậy, ví dụ: khi bạn + +25 +00:01:32,000 --> 00:01:33,380 +mở công cụ tìm + +26 +00:01:33,410 --> 00:01:38,410 +kiếm, bạn đang sử dụng giao diện người dùng đồ họa để truy cập và tìm tệp của mình. + +27 +00:01:38,870 --> 00:01:41,750 +Nhưng cũng có một giao diện dòng lệnh là những gì + +28 +00:01:41,810 --> 00:01:44,540 +chúng ta sẽ nói đến và những gì chúng ta sẽ + +29 +00:01:44,540 --> 00:01:46,130 +tìm hiểu trong mô-đun này. + +30 +00:01:46,430 --> 00:01:50,390 +Vì vậy, đây là một cách thay thế để giao tiếp với hạt nhân. + +31 +00:01:50,810 --> 00:01:53,210 +Lúc đầu, nó có vẻ đáng sợ, nhưng tôi + +32 +00:01:53,360 --> 00:01:56,270 +muốn cho bạn thấy rằng nó thực sự rất đơn giản. + +33 +00:01:56,510 --> 00:01:59,480 +Và một khi bạn hiểu nó, bạn sẽ thấy rằng nó thực sự là một + +34 +00:01:59,480 --> 00:02:01,880 +công cụ thực sự rất hữu ích theo ý của bạn. + +35 +00:02:02,660 --> 00:02:06,020 +Rất nhiều điều bạn có thể làm với dòng lệnh có thể được thực hiện bằng + +36 +00:02:06,020 --> 00:02:08,620 +giao diện người dùng đồ họa. Vậy tại sao + +37 +00:02:08,870 --> 00:02:11,540 +lại sử dụng dòng lệnh? Vào cuối ngày, tất + +38 +00:02:11,540 --> 00:02:15,350 +cả những gì tổng hợp lại là về khả năng kiểm soát tốt hơn. + +39 +00:02:15,830 --> 00:02:19,280 +Và trong hành trình trở thành một nhà phát triển giỏi hơn, + +40 +00:02:19,430 --> 00:02:24,430 +bạn sẽ cần hiểu và sử dụng nhiều sức mạnh hơn đối với các công cụ của mình, + +41 +00:02:25,250 --> 00:02:29,120 +đó là phần cứng máy tính. Nhưng ngày qua ngày, bạn sẽ + +42 +00:02:29,150 --> 00:02:31,970 +thấy rằng nếu bạn là người dùng dòng lệnh thông thường + +43 +00:02:32,240 --> 00:02:37,240 +thì việc thực hiện nhiều việc thực sự phổ biến thực sự dễ dàng hơn và nhanh hơn. + +44 +00:02:38,480 --> 00:02:42,920 +Nếu bạn là người dùng Mac, bạn đã thực sự có một ứng dụng đầu cuối chuyên dụng. + +45 +00:02:43,220 --> 00:02:47,510 +Vì vậy, nếu bạn đi đến tiêu điểm và nhấn nút tìm kiếm và tìm kiếm thiết + +46 +00:02:47,810 --> 00:02:52,580 +bị đầu cuối và nhấn enter, bạn có thể thấy rằng đây là ứng dụng đầu cuối thực tế. + +47 +00:02:52,910 --> 00:02:56,390 +Bây giờ tôi đã tạo kiểu cho nó trông giống một hacker hơn một chút vì tôi thích + +48 +00:02:56,390 --> 00:02:59,920 +làm mọi người sợ hãi ở Starbucks, nhưng đó không phải là điều duy nhất bạn có thể thay đổi. + +49 +00:02:59,950 --> 00:03:01,930 +Bạn có thể thay đổi màu của thiết bị đầu cuối, + +50 +00:03:02,410 --> 00:03:06,850 +bạn cũng có thể thay đổi loại vỏ mà bạn đang sử dụng. Hiện tại, nếu bạn đang + +51 +00:03:06,850 --> 00:03:11,020 +chạy macOS Catalina trở lên, thì Big Sur hoặc bất kỳ hệ + +52 +00:03:11,050 --> 00:03:15,250 +điều hành nào trong tương lai, bạn sẽ sử dụng zsh, hiện + +53 +00:03:15,550 --> 00:03:17,830 +có trình bao mặc định của Mac. + +54 +00:03:18,960 --> 00:03:19,793 +1: Được rồi, + +55 +00:03:21,480 --> 00:03:25,770 +0: Tuy nhiên, nếu bạn đang sử dụng Windows, trình bao mặc định là dấu nhắc lệnh. + +56 +00:03:25,920 --> 00:03:30,450 +Vì vậy, nếu bạn nhập để tìm kiếm dấu nhắc lệnh, bạn có thể thấy đây là + +57 +00:03:30,450 --> 00:03:34,440 +ứng dụng bạn cần khởi chạy và đây là dấu nhắc lệnh của bạn. + +58 +00:03:35,490 --> 00:03:39,180 +Đối với hầu hết các phần, bạn có thể nhập các lệnh giống nhau trên Windows và trên Mac và + +59 +00:03:39,540 --> 00:03:41,040 +nó sẽ hoạt động trên cả hai. + +60 +00:03:41,700 --> 00:03:46,140 +Tôi muốn cho bạn thấy một số điều phổ biến mà chúng ta có thể làm trong thiết bị đầu cuối. Ở đây tôi đã có thiết + +61 +00:03:46,170 --> 00:03:51,170 +bị đầu cuối của mình và địa chỉ của thiết bị đầu cuối được xác định + +62 +00:03:52,290 --> 00:03:57,180 +bởi phần nằm ngay trước lời nhắc. Vì vậy, tại thời điểm hiện tại, đó là một ~ trên máy Mac của tôi. + +63 +00:03:57,900 --> 00:04:01,380 +Có một số điều tôi muốn cho bạn thấy rằng bạn có thể làm với thiết bị đầu cuối. + +64 +00:04:01,920 --> 00:04:06,920 +Điều đầu tiên thực sự hữu ích cần biết là tôi đang ở đâu trong đường dẫn tệp của mình? + +65 +00:04:07,710 --> 00:04:12,450 +Và để làm điều này, chúng ta phải viết thư mục làm việc pwd, print. + +66 +00:04:12,930 --> 00:04:17,100 +Và điều này cho tôi biết tôi đang ở đâu. Khi bạn mở công cụ tìm kiếm của mình + +67 +00:04:17,160 --> 00:04:21,660 +lên như bạn có thể thấy ở đây, hãy chuyển đến xem và sau đó đi tới thanh hiển thị đường dẫn. + +68 +00:04:22,170 --> 00:04:27,170 +Và điều này cho chúng tôi thấy đường dẫn từ ổ cứng / người dùng / angela của chúng + +69 +00:04:28,470 --> 00:04:33,470 +tôi, chính xác là vị trí giống như những gì tôi có trong thiết bị đầu cuối của mình. + +70 +00:04:34,260 --> 00:04:38,970 +Vì vậy, thư mục làm việc in thực sự hữu ích để bạn xác định vị trí của bạn. + +71 +00:04:40,140 --> 00:04:43,920 +Tương tự, trên Windows, bạn có thể thấy khi tôi thực hiện thư mục + +72 +00:04:44,220 --> 00:04:48,570 +làm việc in, nó cho tôi biết rằng tôi đang ở trong C: \ users \ username. + +73 +00:04:48,900 --> 00:04:53,700 +Vì vậy ổ C, người dùng, tên người dùng ... ngay tại đây. + +74 +00:04:56,670 --> 00:05:00,150 +Lệnh tiếp theo thực sự hữu ích là ls, + +75 +00:05:00,210 --> 00:05:02,340 +viết tắt của list. + +76 +00:05:03,210 --> 00:05:08,210 +Và điều này làm là nó sẽ liệt kê tất cả các tệp và thư mục tại thư mục làm việc + +77 +00:05:08,940 --> 00:05:10,020 +hiện tại của bạn. + +78 +00:05:10,290 --> 00:05:14,430 +Vì vậy, nó sẽ liệt kê mọi thứ ở vị trí hiện tại mà tôi + +79 +00:05:14,700 --> 00:05:17,550 +đang ở về cơ bản. Vì vậy, nếu tôi tiếp + +80 +00:05:17,610 --> 00:05:21,450 +tục và nhấn enter, bạn có thể thấy tất cả các thư mục giống + +81 +00:05:21,450 --> 00:05:26,450 +như nó hiển thị trong công cụ tìm kiếm. Pwd và ls thực sự hữu ích để tìm hiểu mọi thứ, để + +82 +00:05:28,080 --> 00:05:28,860 +hiển thị mọi thứ. + +83 +00:05:28,860 --> 00:05:33,510 +Nhưng chúng ta cũng có thể sử dụng thiết bị đầu cuối để di chuyển trong máy tính của mình. + +84 +00:05:34,080 --> 00:05:37,950 +Và chúng tôi làm điều đó bằng cách sử dụng lệnh CD, thư mục đã được thay đổi. + +85 +00:05:38,520 --> 00:05:43,170 +Vì vậy, nếu hiện tại, thư mục làm việc của tôi là users / Angela và tôi muốn truy cập vào + +86 +00:05:43,530 --> 00:05:45,900 +thư mục trên máy tính để bàn của mình, đây + +87 +00:05:46,290 --> 00:05:50,670 +rõ ràng là một trong những thư mục mà tôi có thể truy cập, thì tôi có thể chỉ cần + +88 +00:05:50,700 --> 00:05:55,050 +thay đổi thư mục thành máy tính để bàn. Bây giờ, một trong những điều bạn có + +89 +00:05:55,080 --> 00:05:59,150 +thể làm để ngăn mình bị chấn thương do căng thẳng lặp đi lặp lại + +90 +00:05:59,150 --> 00:06:04,070 +và gõ nhiều là bạn có thể nhập phần bắt đầu của thư mục, ví dụ: desktop- De + +91 +00:06:04,100 --> 00:06:06,200 +và sau đó nhấn tab, và nó + +92 +00:06:06,590 --> 00:06:11,090 +sẽ thu hẹp khả năng mà bạn có thể truy cập để có sự phát triển hoặc + +93 +00:06:11,090 --> 00:06:12,830 +có máy tính để bàn. + +94 +00:06:13,250 --> 00:06:16,400 +Vì vậy, nếu tôi thêm một S bổ sung và tôi nhấn + +95 +00:06:16,610 --> 00:06:20,720 +tab, bây giờ nó sẽ tự động chèn thư mục mà tôi đang tìm kiếm, đó + +96 +00:06:20,780 --> 00:06:23,570 +là máy tính để bàn. Vì vậy, bây giờ nếu + +97 +00:06:23,720 --> 00:06:28,550 +tôi nhấn enter, bạn có thể thấy rằng phần này trước lời nhắc nhấp nháy của tôi đã thay + +98 +00:06:28,550 --> 00:06:32,990 +đổi và nó được chuyển thành màn hình nền. Vì vậy, bây giờ, nếu tôi thực hiện + +99 +00:06:32,990 --> 00:06:36,410 +pwd, bạn có thể thấy tôi hiện đang ở trong người dùng / angela / + +100 +00:06:36,740 --> 00:06:39,740 +Desktop, về cơ bản, tương đương với việc nhấp đúp vào điều này. + +101 +00:06:39,880 --> 00:06:40,713 +1: Được rồi. + +102 +00:06:46,870 --> 00:06:51,610 +0: Trên màn hình của tôi, điều gì sẽ xảy ra nếu tôi muốn tạo một thư mục mới? Chúng ta có thể làm + +103 +00:06:51,610 --> 00:06:56,610 +điều đó bằng cách sử dụng lệnh make dir hoặc make directory. + +104 +00:06:57,250 --> 00:07:01,630 +Vì vậy, chúng tôi đang nói tạo thư mục và sau đó chúng tôi đặt tên cho nó. Vì vậy, giả sử tôi muốn + +105 +00:07:01,630 --> 00:07:04,510 +gọi đây là Kiểm tra thì tôi sẽ chỉ + +106 +00:07:04,510 --> 00:07:07,780 +nói mk dir Test. Và thông báo vị trí khi bạn đang ở. + +107 +00:07:07,780 --> 00:07:11,770 +Vì vậy, tôi sẽ tạo thư mục thử nghiệm này trên máy tính để bàn của mình. + +108 +00:07:12,250 --> 00:07:14,890 +Và ngay sau khi họ nhấn enter, bạn sẽ thấy nó. + +109 +00:07:15,040 --> 00:07:17,740 +Nó đã tạo ra thư mục đó từ đầu. + +110 +00:07:19,420 --> 00:07:24,420 +Vì vậy, bây giờ đây là một câu hỏi. Nếu bạn muốn điều hướng đến Kiểm tra để + +111 +00:07:24,490 --> 00:07:25,900 +khi bạn in thư mục + +112 +00:07:25,930 --> 00:07:30,930 +làm việc, nó sẽ xuất ra người dùng / tên người dùng / máy tính để bàn / kiểm tra. + +113 +00:07:31,600 --> 00:07:34,570 +Bạn sẽ làm gì? Lệnh của bạn sẽ là gì? Hãy tạm dừng + +114 +00:07:34,570 --> 00:07:38,800 +video và suy nghĩ về điều đó. Được rồi, tất nhiên, chúng ta phải thay + +115 +00:07:39,070 --> 00:07:42,970 +đổi coz thư mục tại thời điểm chúng ta đang ở trên màn hình, và nếu + +116 +00:07:43,270 --> 00:07:46,510 +chúng ta muốn vào bên trong thư mục thử nghiệm này, thì chúng + +117 +00:07:46,780 --> 00:07:49,960 +ta phải cd vào đó. Vì vậy, cd vào thử nghiệm, và + +118 +00:07:50,380 --> 00:07:54,700 +bây giờ chúng ta đang ở trong thư mục thử nghiệm. Và nếu tôi nhấn pwed, bạn có thể thấy đây + +119 +00:07:54,760 --> 00:07:57,070 +là nơi tôi đang ở. Bây giờ, khi + +120 +00:07:57,100 --> 00:08:00,190 +tôi đã mã hóa vào thư mục mới này, tôi sẽ + +121 +00:08:00,460 --> 00:08:05,320 +tạo một tệp mới trong thư mục này. Để tạo một tệp mới, lệnh này + +122 +00:08:05,350 --> 00:08:08,410 +hơi khác một chút so với tạo một thư mục mới. + +123 +00:08:08,800 --> 00:08:13,480 +Từ khóa là cảm ứng. Và sau từ khóa, có một khoảng trắng và sau + +124 +00:08:13,960 --> 00:08:16,390 +đó chúng tôi có thể cung cấp tên tệp của mình. + +125 +00:08:16,840 --> 00:08:19,840 +Vì vậy, giả sử rằng chúng tôi muốn tạo một tệp Python mới mà chúng + +126 +00:08:19,870 --> 00:08:22,960 +tôi sẽ gọi là main. py Bây giờ, những + +127 +00:08:22,960 --> 00:08:26,350 +gì nó sẽ làm là tạo mã tệp này trong tệp chính + +128 +00:08:26,740 --> 00:08:31,060 +là tệp Python và nó sẽ làm điều đó bên trong thư mục Thử nghiệm. + +129 +00:08:31,330 --> 00:08:34,150 +Vì vậy, hãy nhấn enter và bạn sẽ thấy nó. + +130 +00:08:34,210 --> 00:08:39,210 +Có tệp Python của chúng tôi được tạo mà không cần nhấp hoặc kéo hoàn toàn được + +131 +00:08:39,490 --> 00:08:44,440 +thực hiện bằng dòng lệnh của chúng tôi. Vì vậy, chúng ta đã thấy cách chúng ta có thể tạo thư mục, + +132 +00:08:44,470 --> 00:08:47,200 +cách chúng ta có thể tạo tệp. Và nhân tiện, nếu bạn muốn + +133 +00:08:47,200 --> 00:08:49,780 +tạo một loại tệp khác, bạn chỉ cần thay đổi phần + +134 +00:08:49,780 --> 00:08:51,760 +mở rộng. Vì vậy, nó có thể được. văn + +135 +00:08:51,760 --> 00:08:56,760 +bản, hoặc nó có thể là. docx hoặc bất kỳ định dạng tệp nào bạn muốn tạo. Bây giờ, nếu chúng ta muốn xóa + +136 +00:08:56,910 --> 00:08:59,970 +tệp của mình thì sao? Tất cả những gì chúng ta + +137 +00:09:00,060 --> 00:09:04,470 +phải làm là đảm bảo rằng chúng ta đang ở đúng thư mục để có thể truy + +138 +00:09:04,470 --> 00:09:06,570 +cập tệp đó. Vì vậy, khi chúng ta + +139 +00:09:06,600 --> 00:09:08,760 +nhấn ls, chúng ta sẽ có thể thấy tệp chúng ta muốn xóa. + +140 +00:09:09,150 --> 00:09:12,960 +Và sau đó tất cả những gì chúng ta phải làm là gõ rm, viết tắt của remove và sau đó chúng ta + +141 +00:09:13,410 --> 00:09:17,100 +có thể đặt main của chúng ta. py Vì vậy, nó đây, nó đã biến mất. + +142 +00:09:17,630 --> 00:09:18,463 +1: Được rồi. + +143 +00:09:22,190 --> 00:09:26,780 +0: Bây giờ, nếu tôi muốn xóa thư mục Test thì sao? Đầu tiên, tôi phải + +144 +00:09:26,840 --> 00:09:31,580 +điều hướng lên một bước. Thay vì ở bên trong thư mục Kiểm tra, tôi + +145 +00:09:31,880 --> 00:09:35,330 +không thể xóa thư mục Kiểm tra khi đang ở trong thư mục Kiểm tra. + +146 +00:09:35,690 --> 00:09:38,840 +Tôi phải đi lên một bước, đó là thư mục trên máy tính để bàn. + +147 +00:09:39,740 --> 00:09:42,920 +Tất nhiên bây giờ tôi có thể nói + +148 +00:09:42,920 --> 00:09:47,840 +cd vào đường dẫn đầy đủ là / Users / angela / Desktop. + +149 +00:09:48,140 --> 00:09:51,620 +Bây giờ điều này sẽ hoạt động, nhưng điều này thực sự dài dòng. + +150 +00:09:52,130 --> 00:09:54,470 +Một phím tắt thực sự đơn giản để + +151 +00:09:54,470 --> 00:09:59,330 +điều hướng chỉ cần một bước lên là viết cd và sau đó là hai dấu chấm. + +152 +00:09:59,540 --> 00:10:04,100 +Điều này sẽ đưa chúng ta đến thư mục mẹ, bây giờ là Màn hình nền. + +153 +00:10:06,740 --> 00:10:07,573 +1: Đúng. + +154 +00:10:11,330 --> 00:10:15,800 +0: Từ đây, tôi sẽ xóa thư mục này. Bây giờ để xóa một thư mục, chúng ta + +155 +00:10:15,800 --> 00:10:19,070 +không thể chỉ đặt rm. Chúng tôi cũng phải cắm một lá cờ. + +156 +00:10:19,190 --> 00:10:24,190 +Vì vậy, a - và sau đó rf. Vì vậy, điều này sẽ đệ quy, buộc phải xóa + +157 +00:10:27,710 --> 00:10:31,550 +thư mục này mà chúng ta sẽ thêm vào đây, đó là thư mục Thử nghiệm. + +158 +00:10:32,060 --> 00:10:37,060 +Bây giờ điều bạn phải thực sự cẩn thận về rm -rf là nó thực hiện + +159 +00:10:37,880 --> 00:10:41,660 +mọi thứ một cách đệ quy. Vì vậy, nếu có nhiều thư mục bên trong thư + +160 +00:10:41,990 --> 00:10:44,180 +mục Thử nghiệm này, thì nó sẽ xóa mọi thứ trong đó. + +161 +00:10:44,750 --> 00:10:49,750 +Và nếu, Chúa cấm, bạn thực sự có cái này và bạn đưa nó vào toàn bộ máy tính của mình, + +162 +00:10:50,840 --> 00:10:53,210 +thì đó sẽ là một thảm họa thực sự. + +163 +00:10:53,690 --> 00:10:57,890 +Bởi vì điều bạn phải biết về thiết bị đầu cuối là + +164 +00:10:57,890 --> 00:11:02,890 +nó rất mạnh mẽ. Và chú của Người Nhện đã nói gì? Với sức mạnh lớn đến trách + +165 +00:11:02,990 --> 00:11:03,980 +nhiệm lớn. + +166 +00:11:05,390 --> 00:11:09,080 +Có một số câu chuyện khá hài hước về những người đã vô tình + +167 +00:11:09,110 --> 00:11:12,890 +xóa mọi thứ trên máy tính của họ chỉ bằng cách gây rối với rm -rf. + +168 +00:11:13,340 --> 00:11:18,340 +Vì vậy, hãy thực sự cẩn thận rằng bạn đang ở đúng vị trí để xóa thư mục và kiểm tra kỹ + +169 +00:11:19,520 --> 00:11:22,190 +xem đó có phải là thư mục phù hợp hay không. + +170 +00:11:23,060 --> 00:11:24,980 +Bởi vì khi tôi nhấn enter, + +171 +00:11:25,040 --> 00:11:28,430 +bạn có thể thấy nó sẽ không yêu cầu tôi xác + +172 +00:11:29,030 --> 00:11:34,030 +nhận và nó cũng sẽ không đưa thư mục đó hoặc các tệp có chứa vào thùng. + +173 +00:11:34,940 --> 00:11:38,120 +Vì vậy, hãy thực sự cẩn thận khi bạn đang sử dụng thiết bị đầu cuối. + +174 +00:11:40,790 --> 00:11:41,623 +Đây là bạn có nó. + +175 +00:11:41,930 --> 00:11:46,930 +Có phần giới thiệu về dòng lệnh sử dụng zsh trên máy Mac và sử dụng + +176 +00:11:49,970 --> 00:11:53,380 +dấu nhắc lệnh trên Windows. Bây giờ, khi bạn mở + +177 +00:11:53,410 --> 00:11:57,460 +PyCharm và bạn đi đến thiết bị đầu cuối giả lập này, vì + +178 +00:11:57,460 --> 00:12:01,330 +vậy nó là một loại ứng dụng trong một ứng dụng, bạn + +179 +00:12:01,630 --> 00:12:04,540 +có thể thấy rằng nó trông khá giống nhau. + +180 +00:12:04,870 --> 00:12:09,370 +Về cơ bản, tất cả những gì PyCharm thực hiện chỉ là + +181 +00:12:09,370 --> 00:12:14,370 +gộp dấu nhắc lệnh vào PyCharm trên windows và thiết bị đầu cuối + +182 +00:12:16,150 --> 00:12:20,710 +zsh vào PyCharm trên Mac. Vì vậy, bạn có thể làm mọi thứ mà bạn có + +183 +00:12:21,310 --> 00:12:22,870 +thể làm trong thiết bị đầu + +184 +00:12:23,260 --> 00:12:28,260 +cuối bên trong PyCharm, điều này giúp bạn thực sự dễ dàng pip cài đặt mô-đun hoặc chạy máy chủ Flask của chúng tôi. + +185 +00:12:30,040 --> 00:12:30,430 +Bây + +186 +00:12:30,430 --> 00:12:34,630 +giờ, nếu bạn muốn biết về những thứ khác mà bạn có thể làm trong dấu + +187 +00:12:34,630 --> 00:12:38,710 +nhắc lệnh Windows hoặc thiết bị đầu cuối Mac, bạn có thể chỉ cần tìm + +188 +00:12:38,710 --> 00:12:41,200 +kiếm cheatsheet dấu nhắc lệnh hoặc cheatsheet đầu cuối. + +189 +00:12:42,700 --> 00:12:46,000 +Và những gì nó sẽ đưa bạn đến là rất nhiều + +190 +00:12:46,000 --> 00:12:50,980 +địa chỉ về cơ bản chứa nhiều thứ hơn mà bạn có thể làm với dòng + +191 +00:12:50,980 --> 00:12:53,470 +lệnh của mình. Nhưng những lệnh mà chúng + +192 +00:12:53,500 --> 00:12:57,430 +ta đã nói hôm nay là một số trong những lệnh phổ biến nhất và 99% thời gian, + +193 +00:12:57,460 --> 00:13:00,100 +đó sẽ là những lệnh mà bạn sẽ phải tuân theo. + +194 +00:13:00,610 --> 00:13:04,120 +Vì vậy, hãy viết chúng ra nếu bạn cần xem lại chúng thường xuyên. + +195 +00:13:04,390 --> 00:13:07,150 +Và nếu bạn chỉ sử dụng chúng một cách thường xuyên, bạn sẽ không + +196 +00:13:07,450 --> 00:13:09,280 +gặp khó khăn gì khi ghi nhớ chúng. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Windows-Command-Prompt-Cheat-Sheet.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Windows-Command-Prompt-Cheat-Sheet.url new file mode 100644 index 0000000000000000000000000000000000000000..0a1c12e887e8b2468e557780c2383d3f42426fac --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/003 Windows-Command-Prompt-Cheat-Sheet.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://www.cs.columbia.edu/~sedwards/classes/2015/1102-fall/Command%20Prompt%20Cheatsheet.pdf \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 Python-Built-In-Attributes-e.g.name-.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 Python-Built-In-Attributes-e.g.name-.url new file mode 100644 index 0000000000000000000000000000000000000000..335e0d19c98dbe0458e7e3a6d0ceddf833fb24cc --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 Python-Built-In-Attributes-e.g.name-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/stdtypes.html?highlight=__name__#special-attributes \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 What-is-main-.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 What-is-main-.url new file mode 100644 index 0000000000000000000000000000000000000000..5a625668b52da69c78dae87d2b687d3832eda220 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 What-is-main-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.python.org/3/library/__main__.html \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 __name__ and __main__ Special Attributes built into Python.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 __name__ and __main__ Special Attributes built into Python.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..caa3054d98fb91f73338b64fcde265c49743550e --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 __name__ and __main__ Special Attributes built into Python.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba4fcdf904715fb2eba9554b0499e53327b6d29eaa875977a2ba4a3222ce288f +size 27328594 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 __name__ and __main__ Special Attributes built into Python_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 __name__ and __main__ Special Attributes built into Python_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b1e8085840571fc9ec122f599854e807fc3c7bbf --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/004 __name__ and __main__ Special Attributes built into Python_vi.srt @@ -0,0 +1,216 @@ +1 +00:00:00,330 --> 00:00:03,630 +Bây giờ chúng ta đã hiểu thêm một chút về các + +2 +00:00:03,960 --> 00:00:08,960 +lệnh đầu cuối, hãy quay lại mã Flask của chúng ta và hiểu chi tiết hơn + +3 +00:00:09,300 --> 00:00:14,220 +một chút về mã đang làm gì. Ví dụ, tên này là gì? + +4 +00:00:14,460 --> 00:00:18,870 +Vì chúng tôi đang tạo ứng dụng này từ lớp + +5 +00:00:19,230 --> 00:00:23,310 +Flask này và để khởi tạo một ứng dụng + +6 +00:00:23,700 --> 00:00:27,600 +Flask mới, chỉ có một đầu vào bắt buộc + +7 +00:00:28,020 --> 00:00:30,210 +và đó là import_name. + +8 +00:00:31,380 --> 00:00:33,390 +Hãy tiếp tục và in nó ra. + +9 +00:00:33,720 --> 00:00:38,720 +Vì vậy, nếu chúng tôi in __name__ này và nhận xét phần còn + +10 +00:00:39,600 --> 00:00:42,480 +lại của mã của chúng tôi và + +11 +00:00:43,800 --> 00:00:48,000 +nhấn run, thì bạn có thể thấy rằng nó in ra + +12 +00:00:48,030 --> 00:00:48,863 +__main_ _. + +13 +00:00:49,320 --> 00:00:54,320 +Tên này là một trong những thuộc tính đặc biệt được tích hợp trong Python. + +14 +00:00:56,550 --> 00:00:57,990 +Tại bất kỳ thời + +15 +00:00:58,170 --> 00:01:03,170 +điểm nào, bạn có thể nhấn vào tên để tìm ra tên lớp, hàm, phương thức + +16 +00:01:06,030 --> 00:01:08,460 +hoặc bộ mô tả hiện tại là gì. + +17 +00:01:09,210 --> 00:01:12,360 +Và khi chúng ta nhận được main, những gì nó nói + +18 +00:01:12,500 --> 00:01:17,000 +với chúng ta về cơ bản là chúng ta đang thực thi mã trong một mô-đun cụ thể. + +19 +00:01:17,510 --> 00:01:22,510 +Vì vậy, điều đó có nghĩa là nó chạy dưới dạng một tập lệnh hoặc từ một lời + +20 +00:01:23,930 --> 00:01:27,330 +nhắc tương tác, nhưng nó không chạy từ một mô-đun đã nhập. + +21 +00:01:28,190 --> 00:01:31,790 +Nó cung cấp cho chúng ta mã này ở đây, nếu tên + +22 +00:01:32,090 --> 00:01:37,090 +bằng main, thì chỉ thực thi một cái gì đó nếu nó chạy dưới dạng tập lệnh. + +23 +00:01:38,240 --> 00:01:40,730 +Điều này cũng đưa chúng ta đến + +24 +00:01:40,730 --> 00:01:45,440 +một trong những cách phổ biến mà bạn sẽ thấy mọi người chạy ứng dụng Flask. + +25 +00:01:45,830 --> 00:01:50,830 +Bạn sẽ thấy liệu __name__ có gấp đôi với _ _main__ dưới dạng một chuỗi hay + +26 +00:01:52,460 --> 00:01:55,250 +không, vì vậy chính xác những gì đã được + +27 +00:01:55,250 --> 00:01:59,570 +in ngay bây giờ khi chúng tôi in ra tên này, tốt, nếu đúng + +28 +00:02:00,050 --> 00:02:01,400 +như vậy, điều + +29 +00:02:01,400 --> 00:02:05,810 +đó có nghĩa là chúng tôi đang chạy mã từ bên trong tệp hiện tại. + +30 +00:02:05,990 --> 00:02:09,199 +Chúng tôi đang chạy xin chào. py Vì vậy, trong trường + +31 +00:02:09,229 --> 00:02:13,100 +hợp đó, chúng tôi sẽ khai thác ứng dụng của mình và chúng tôi sẽ gọi phương thức chạy. + +32 +00:02:13,700 --> 00:02:15,260 +Bây giờ ứng dụng này. Về cơ + +33 +00:02:15,260 --> 00:02:20,060 +bản, run hoạt động giống hệt như khi chúng ta vào thiết bị đầu cuối + +34 +00:02:20,060 --> 00:02:25,040 +và chúng ta đã nói chạy bình. Nhưng lưu ý khi chúng ta nói + +35 +00:02:25,100 --> 00:02:28,580 +chạy bình, trước tiên, chúng ta phải cung cấp biến môi trường + +36 +00:02:29,060 --> 00:02:33,260 +FLASK_APP và thứ hai, chúng ta phải dừng mã bằng cách sử dụng control + + +37 +00:02:33,680 --> 00:02:36,680 +c thay vì sử dụng chạy và dừng bình thường. + +38 +00:02:37,010 --> 00:02:41,480 +Nhưng nếu chúng ta sử dụng ứng dụng. chạy, bây giờ chúng ta có thể sử dụng các điều khiển tiêu chuẩn của mình. + +39 +00:02:41,540 --> 00:02:45,050 +Vì vậy, tôi có thể chỉ cần nhấn run để chạy lời chào này. py và nó sẽ bắt + +40 +00:02:46,070 --> 00:02:51,070 +đầu cung cấp ứng dụng Flask của chúng tôi tại địa chỉ này giống như + +41 +00:02:51,980 --> 00:02:56,750 +trước đây, khi chúng tôi chạy flask. Và thay vì sử dụng control + c để + +42 +00:02:56,870 --> 00:03:01,870 +thoát, chúng ta có thể chỉ cần sử dụng stop để dừng ứng dụng Flask của mình, điều này + +43 +00:03:02,500 --> 00:03:04,240 +dễ dàng hơn rất nhiều. + +44 +00:03:05,230 --> 00:03:10,180 +Về cơ bản bằng cách cung cấp tên cho Flask, Flask sẽ kiểm + +45 +00:03:10,180 --> 00:03:15,180 +tra xem đây có phải là tệp hiện tại chứa mã ứng dụng hay không. + +46 +00:03:16,870 --> 00:03:21,760 +Và trên thực tế, chúng tôi không sử dụng một mô-đun đã nhập. Ví dụ: nếu tôi nhập mô-đun + +47 +00:03:21,760 --> 00:03:26,760 +ngẫu nhiên và tôi sẽ in ngẫu nhiên. tên, sau đó bạn có thể + +48 +00:03:32,080 --> 00:03:36,880 +thấy điều đầu tiên được in ra là tên của mô-đun đó. + +49 +00:03:37,240 --> 00:03:39,880 +Nhưng cái tên được in từ hello. py mà + +50 +00:03:39,900 --> 00:03:44,470 +tệp đang được chạy chỉ đơn giản là __main__. + +51 +00:03:44,740 --> 00:03:49,030 +Vì vậy, về cơ bản điều này biểu thị tệp hiện đang được chạy và + +52 +00:03:49,480 --> 00:03:52,600 +bạn nói, Chạy 'xin chào' Vậy thì bên trong tên xin + +53 +00:03:52,660 --> 00:03:54,760 +chào sẽ bằng với tên chính. + +54 +00:03:58,170 --> 00:03:58,260 +1: Đúng. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python Functions as First Class Objects Passing & Nesting Functions.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python Functions as First Class Objects Passing & Nesting Functions.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..92e1ba91b5921aa2c6f0e7db2655ee3a78b7bdde --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python Functions as First Class Objects Passing & Nesting Functions.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40583435a26e7ad1123d21056d62f7d9fd446e9298efaf9a7bbc8ed9d99a0cf0 +size 48439614 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python Functions as First Class Objects Passing & Nesting Functions_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python Functions as First Class Objects Passing & Nesting Functions_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e68383586ee780ba0be09f7af04d6071ce0a582f --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python Functions as First Class Objects Passing & Nesting Functions_vi.srt @@ -0,0 +1,568 @@ +1 +00:00:00,510 --> 00:00:05,510 +Phần tiếp theo của cú pháp có thể không quen thuộc là dấu @ này và một + +2 +00:00:07,050 --> 00:00:11,460 +cái gì đó đứng sau dấu @. Bây giờ chúng ta biết nó làm gì. + +3 +00:00:11,460 --> 00:00:14,790 +Về cơ bản, nó nói khi người dùng truy cập vào đường dẫn này + +4 +00:00:14,820 --> 00:00:19,170 +được gọi là đường dẫn về nhà, về cơ bản khi bạn truy cập vào một trang web, + +5 +00:00:19,200 --> 00:00:21,540 +ví dụ: www. Google. com và + +6 +00:00:21,870 --> 00:00:26,610 +bạn đi đến chỗ chém thuận đầu tiên tốt, đó sẽ là nhà. + +7 +00:00:27,180 --> 00:00:31,080 +Và nó biết rằng khi bạn đến đó, bạn muốn xem trang chủ. + +8 +00:00:31,530 --> 00:00:33,480 +Vì vậy, đó thực sự là những gì chúng tôi đang nói ở đây. + +9 +00:00:33,690 --> 00:00:38,670 +Khi người dùng điều hướng đến URL của chúng tôi chỉ bằng một dấu gạch chéo lên phía trước, họ muốn xem trang chủ + +10 +00:00:38,670 --> 00:00:41,580 +và vì vậy chúng tôi sẽ giới thiệu cho họ lời chào thế giới. + +11 +00:00:42,210 --> 00:00:46,320 +Nhưng cú pháp này chính xác là gì? Chà, đây là mã của + +12 +00:00:46,320 --> 00:00:49,230 +một trình trang trí Python và đây là + +13 +00:00:49,800 --> 00:00:54,210 +thứ mà bạn sẽ thấy trong các dự án Python nâng cao hơn. + +14 +00:00:54,540 --> 00:00:57,420 +Vậy chính xác thì decorator là gì? Hãy tưởng tượng rằng bạn + +15 +00:00:57,450 --> 00:01:01,320 +có một loạt các hàm trong lớp hoặc trong mô-đun của mình và + +16 +00:01:01,320 --> 00:01:02,153 +bạn muốn + +17 +00:01:02,460 --> 00:01:07,460 +thêm một số chức năng vào từng hàm này. Vậy thì bạn có thể sử + +18 +00:01:09,780 --> 00:01:12,990 +dụng một hàm decorator để làm điều đó. + +19 +00:01:14,070 --> 00:01:18,570 +Về cơ bản, bạn có thể nghĩ về một hàm decorator như một hàm sẽ cung cấp + +20 +00:01:18,570 --> 00:01:23,570 +chức năng bổ sung cho một hàm hiện có. Để thực sự hiểu điều này, + +21 +00:01:24,360 --> 00:01:25,920 +chúng ta cũng + +22 +00:01:25,980 --> 00:01:29,100 +phải hiểu một số khái niệm khác. + +23 +00:01:29,820 --> 00:01:32,430 +Vì vậy, tôi sẽ thực hiện một vài bản demo trong Repl này. nó và nếu bạn + +24 +00:01:32,850 --> 00:01:36,810 +truy cập URL này hoặc tìm thấy nó trong tài nguyên khóa học, bạn sẽ có + +25 +00:01:37,050 --> 00:01:40,140 +thể xem tất cả mã mà tôi đã viết trong tệp này. + +26 +00:01:41,160 --> 00:01:42,600 +Vì vậy, cách đây + +27 +00:01:42,630 --> 00:01:47,630 +rất lâu, chúng ta đã tìm hiểu về các hàm Python và chúng ta biết rằng một hàm cho + +28 +00:01:47,820 --> 00:01:50,910 +phép chúng ta có các gói chức năng cụ thể, cho phép + +29 +00:01:51,420 --> 00:01:56,250 +chúng ta thêm đầu vào, để tăng khả năng tái sử dụng của hàm và cũng cho phép + +30 +00:01:56,700 --> 00:02:01,380 +chúng ta nhận kết quả đầu ra từ hàm mà chúng ta có thể chuyển vào một hàm + +31 +00:02:01,380 --> 00:02:05,610 +khác hoặc làm điều gì đó với nó. Ví dụ, chúng ta + +32 +00:02:05,610 --> 00:02:09,570 +có bốn hàm rất đơn giản, cộng, trừ, nhân và + +33 +00:02:09,600 --> 00:02:13,890 +chia sử dụng cả ba thành phần của một hàm. + +34 +00:02:15,270 --> 00:02:19,350 +Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn có được một chút huyền ảo hơn? Chà, một trong những điều về + +35 +00:02:19,650 --> 00:02:24,650 +các hàm Python là chúng được gọi là các đối tượng hạng nhất, về cơ bản có + +36 +00:02:25,680 --> 00:02:26,513 +nghĩa là + +37 +00:02:26,550 --> 00:02:31,550 +bạn có thể truyền một hàm xung quanh dưới dạng đối số, giống như những gì bạn + +38 +00:02:32,640 --> 00:02:37,440 +có thể làm với một số nguyên, một chuỗi hoặc một số float, nó được đối + +39 +00:02:37,710 --> 00:02:38,670 +xử giống nhau. + +40 +00:02:39,240 --> 00:02:44,240 +Điều đó có nghĩa là chúng ta có thể sử dụng các hàm này và chúng ta có thể xây dựng + +41 +00:02:44,910 --> 00:02:49,290 +một hàm khác sử dụng các hàm này. Giả sử tôi tạo một + +42 +00:02:49,410 --> 00:02:51,870 +hàm tính toán sử dụng hàm calc + +43 +00:02:52,320 --> 00:02:54,900 +và sau đó là n1 và n2. + +44 +00:02:55,590 --> 00:02:57,630 +Bên trong hàm tính toán + +45 +00:02:57,960 --> 00:03:02,860 +này, tôi sẽ gọi hàm đã được truyền vào và cung cấp cho nó + +46 +00:03:02,950 --> 00:03:06,670 +các giá trị n1 và n2 cũng được truyền vào. + +47 +00:03:07,330 --> 00:03:10,120 +Vì vậy, bây giờ khi tôi gọi hàm tính toán, + +48 +00:03:10,150 --> 00:03:15,010 +tôi sẽ chuyển vào tên của một trong những hàm này và sau đó là một số số. + +49 +00:03:15,370 --> 00:03:20,140 +Những con số đó sẽ trở thành đầu vào cho hàm được chỉ định này và + +50 +00:03:20,500 --> 00:03:24,760 +sau đó chúng tôi sẽ trả về kết quả của phép tính đó. + +51 +00:03:25,420 --> 00:03:26,980 +Vì vậy, bây giờ + +52 +00:03:27,010 --> 00:03:32,010 +thấp hơn, tôi có thể gọi hàm tính toán của mình, truyền vào tên của một + +53 +00:03:32,620 --> 00:03:37,300 +hàm, ví dụ như hàm nhân của chúng ta, và sau đó truyền vào một + +54 +00:03:37,360 --> 00:03:42,220 +số số, chẳng hạn như hai và ba. Bây giờ hãy để đầu ra được trả về là + +55 +00:03:42,490 --> 00:03:43,690 +kết quả của chúng + +56 +00:03:43,840 --> 00:03:48,840 +ta và hãy tiếp tục và in kết quả này. Và bạn có thể thấy chúng tôi nhận được sáu. + +57 +00:03:50,260 --> 00:03:54,670 +Vì vậy, về cơ bản bây giờ nó đã nhân hai với ba. Bây giờ, nếu tôi thay đổi chức + +58 +00:03:54,700 --> 00:03:58,210 +năng này thành một trong các chức năng khác, hãy thêm và tôi + +59 +00:03:58,750 --> 00:04:03,520 +chạy lại chức năng này, bạn có thể thấy thay vì sáu, bây giờ tôi nhận được năm. + +60 +00:04:04,240 --> 00:04:09,240 +Khả năng chúng ta coi các hàm như các đối tượng hạng nhất về cơ bản có nghĩa là chúng ta + +61 +00:04:10,120 --> 00:04:14,080 +có thể chuyển chúng xung quanh như thể chúng chỉ là bất kỳ đối số nào + +62 +00:04:14,380 --> 00:04:17,769 +khác như một số hoặc một chuỗi hoặc một số dấu phẩy động. + +63 +00:04:18,160 --> 00:04:23,160 +Và sau đó, chúng ta có thể kích hoạt chúng bằng cách thêm các dấu ngoặc xung quanh chúng và sau + +64 +00:04:23,470 --> 00:04:27,790 +đó là bất kỳ đầu vào cần thiết nào. Bây giờ, khái niệm tiếp theo mà + +65 +00:04:27,820 --> 00:04:29,890 +bạn có thể đã gặp nhưng + +66 +00:04:29,980 --> 00:04:34,930 +chúng tôi chưa thực sự sử dụng nó nhiều là khái niệm về các hàm lồng nhau. + +67 +00:04:35,740 --> 00:04:39,520 +Các hàm cũng có thể được lồng vào bên trong các hàm khác. + +68 +00:04:40,030 --> 00:04:43,750 +Ví dụ: nếu tôi tạo một hàm có tên + +69 +00:04:45,190 --> 00:04:49,570 +là hàm ngoài và hàm này sẽ in ra và nói + +70 +00:04:49,600 --> 00:04:54,130 +rằng, tôi là bên ngoài. Bây giờ bên trong hàm ngoài này, tôi + +71 +00:04:54,460 --> 00:04:57,970 +có thể tạo một hàm khác. Vì vậy, hãy chú ý + +72 +00:04:58,270 --> 00:05:03,270 +phần thụt lề ở đây có nghĩa là hàm này hiện đã được tạo bên trong hàm + +73 +00:05:03,430 --> 00:05:06,400 +này và tôi sẽ gọi nó là hàm lồng nhau. + +74 +00:05:08,020 --> 00:05:13,020 +Vì vậy, chức năng này chỉ đơn giản là sẽ in tôi bên + +75 +00:05:15,250 --> 00:05:16,083 +trong. + +76 +00:05:16,780 --> 00:05:21,070 +Và bây giờ chúng ta gặp vấn đề khi cố gắng gọi hàm này. Bây giờ, vì hàm này đã + +77 +00:05:21,100 --> 00:05:24,850 +được khai báo bên trong hàm này, nên phạm vi của nó có + +78 +00:05:25,240 --> 00:05:30,240 +nghĩa là nó chỉ có thể truy cập được bên trong các giới hạn của hàm này. + +79 +00:05:31,630 --> 00:05:34,750 +Vì vậy, nếu chúng ta đi ra ngoài hàm, vì vậy + +80 +00:05:34,750 --> 00:05:39,400 +bằng cách thụt lề trở lại đầu và chúng ta cố gắng gọi hàm lồng nhau + +81 +00:05:39,730 --> 00:05:42,490 +này, thì nó thực sự sẽ không hoạt động. + +82 +00:05:42,910 --> 00:05:47,410 +Chúng tôi sẽ gặp lỗi tên. Nó không được xác định. Tuy nhiên, nếu + +83 +00:05:47,410 --> 00:05:52,410 +chúng ta gọi hàm này bên trong hàm ngoài này, thì bây + +84 +00:05:53,680 --> 00:05:57,070 +giờ nó sẽ không tạo ra lỗi nữa. + +85 +00:05:57,920 --> 00:06:02,920 +Vì vậy, hãy tiếp tục và kích hoạt hàm ngoài bằng cách gọi nó trong hàm chính của chúng ta. + +86 +00:06:04,670 --> 00:06:09,320 +py Và khi tôi chạy cái này, bạn có thể thấy nó nói rằng tôi bên + +87 +00:06:09,770 --> 00:06:11,270 +ngoài và sau đó nó nói tôi bên trong. + +88 +00:06:12,170 --> 00:06:17,170 +Vì vậy, điều này đầu tiên được thực thi và sau đó là điều này. Và điều này tôi bên trong đang được in + +89 +00:06:17,300 --> 00:06:21,650 +khi dòng này đang được đánh giá. Bây giờ, một trong những điều bạn + +90 +00:06:22,250 --> 00:06:27,250 +có thể làm là bạn thực sự có thể trả về một hàm từ một + +91 +00:06:28,280 --> 00:06:29,150 +hàm khác. + +92 +00:06:29,380 --> 00:06:30,213 +1: Đúng. + +93 +00:06:32,050 --> 00:06:35,920 +0: Các hàm thực sự có thể được trả về từ các hàm khác. + +94 +00:06:36,370 --> 00:06:41,370 +Vì vậy, nếu tôi tạo một bản sao của chức năng trước đây này ngay tại đây và nhận + +95 +00:06:42,430 --> 00:06:45,850 +xét về chức năng khác này và tất cả các bước trước đó, + +96 +00:06:46,330 --> 00:06:47,163 +1: ... + +97 +00:06:54,850 --> 00:06:57,430 +0: và chúng tôi chỉ có bit mã hoạt động này, + +98 +00:06:57,850 --> 00:07:01,720 +sau đó bạn có thể thấy rằng thay vì gọi hàm nested_ Chức năng này ở đây, tôi + +99 +00:07:02,170 --> 00:07:04,540 +cũng có thể trả về nó dưới dạng đầu ra. + +100 +00:07:05,050 --> 00:07:09,490 +Nhưng phần quan trọng ở đây là tôi sẽ loại bỏ dấu ngoặc đơn có + +101 +00:07:09,610 --> 00:07:13,720 +nghĩa là tôi không còn kích hoạt chức năng đó ngay tại đây. + +102 +00:07:14,560 --> 00:07:17,440 +Vì vậy, bây giờ khi tôi gọi + +103 +00:07:17,830 --> 00:07:22,830 +hàm ngoài này, đầu ra mà dòng này sẽ đánh giá sẽ + +104 +00:07:23,770 --> 00:07:28,390 +trở thành hàm lồng nhau. Vì vậy, bạn gần như có thể lưu trữ nó bên trong một biến. + +105 +00:07:28,480 --> 00:07:31,570 +Vì vậy, giả sử tôi tạo một biến có tên là hàm bên trong bằng + +106 +00:07:31,900 --> 00:07:34,840 +với kết quả đầu ra của hàm bên ngoài, về cơ bản là hàm + +107 +00:07:34,870 --> 00:07:39,100 +chức năng lồng nhau này đang được trả về. Vậy thì, tôi không chỉ + +108 +00:07:39,100 --> 00:07:41,890 +có thể kích hoạt hàm bên ngoài vốn + +109 +00:07:42,100 --> 00:07:44,950 +chỉ cho tôi tôi là bên ngoài, bây giờ + +110 +00:07:45,490 --> 00:07:50,490 +tôi còn có thể kích hoạt chức năng bên trong riêng biệt bằng cách gọi nó + +111 +00:07:51,100 --> 00:07:54,610 +và sau đó thêm trình kích hoạt là dấu ngoặc đơn. + +112 +00:07:55,900 --> 00:07:59,470 +Vì vậy, bây giờ nó nói tôi bên ngoài sau khi nó đánh giá dòng này, tôi bên + +113 +00:07:59,830 --> 00:08:03,070 +trong sau khi nó đánh giá dòng này. Bây giờ, nếu điều này + +114 +00:08:03,100 --> 00:08:04,900 +gây nhầm lẫn cho bạn, tôi khuyên + +115 +00:08:04,960 --> 00:08:09,400 +bạn nên truy cập vào tài nguyên khóa học nơi tôi có một liên kết đến Gia + +116 +00:08:09,490 --> 00:08:14,350 +sư Python này, nơi tôi đã nhập tất cả mã mà chúng tôi đã thấy ngay bây giờ và + +117 +00:08:14,830 --> 00:08:17,800 +chúng tôi có thể thực thi dòng mã này theo dòng. + +118 +00:08:18,340 --> 00:08:22,390 +Vì vậy, bạn có thể thấy rằng điều đầu tiên xảy ra là nó nhìn vào hàm ngoài này + +119 +00:08:22,390 --> 00:08:26,740 +và nó tạo ra một tham chiếu đến hàm đó. Bây giờ, tiếp theo, nó nằm trên + +120 +00:08:26,740 --> 00:08:31,740 +dòng này, nơi hàm ngoài của chúng ta thực sự đang được thực thi vì nó + +121 +00:08:32,650 --> 00:08:34,780 +có dấu ngoặc đơn ở cuối. + +122 +00:08:35,169 --> 00:08:39,370 +Vì vậy, bây giờ nó thực sự sẽ đi vào bên trong hàm bên ngoài này và + +123 +00:08:39,370 --> 00:08:44,370 +đi qua nó từng dòng một, nơi nó in tôi ở bên ngoài và sau đó thiết lập một tham chiếu + +124 +00:08:45,610 --> 00:08:48,400 +đến hàm thứ hai này, đó là hàm lồng nhau. + +125 +00:08:49,270 --> 00:08:52,840 +Chức năng lồng nhau bây giờ có thể được gọi bằng tên + +126 +00:08:52,840 --> 00:08:57,180 +của nó là chức năng lồng nhau. Nhưng ở phần cuối của hàm ngoài, + +127 +00:08:57,300 --> 00:09:01,830 +hàm đó sẽ là giá trị trả về. Vì vậy, nó sẽ được xuất ra. + +128 +00:09:02,640 --> 00:09:03,390 +Cuối cùng, chúng + +129 +00:09:03,390 --> 00:09:08,390 +ta đi đến phần cuối của dòng thứ 9 này và chúng ta thiết lập một tham chiếu từ biến có + +130 +00:09:09,570 --> 00:09:14,400 +tên gọi là inner_ function đến hàm lồng nhau này. Và cuối cùng, khi chúng ta + +131 +00:09:14,400 --> 00:09:18,120 +đến dòng 10, chúng ta sẽ kích hoạt chức năng đó. + +132 +00:09:18,210 --> 00:09:22,560 +Vì vậy, đây là hàm inner_ function của chúng ta trỏ đến hàm lồng nhau này và vì + +133 +00:09:22,860 --> 00:09:24,930 +vậy khi chúng ta kích hoạt hàm + +134 +00:09:25,230 --> 00:09:28,440 +bên trong này, nó cũng giống như việc kích hoạt hàm lồng nhau. + +135 +00:09:28,800 --> 00:09:32,520 +Và đó là lúc chúng ta kết thúc việc đi vào chức năng này và + +136 +00:09:32,820 --> 00:09:35,190 +in ra những gì nó nói bên trong. + +137 +00:09:35,820 --> 00:09:40,320 +Hãy chơi một vòng với điều đó để nắm bắt đầy đủ tất cả những điều bạn có thể + +138 +00:09:40,320 --> 00:09:41,760 +làm với một chức năng. + +139 +00:09:42,930 --> 00:09:47,490 +Và một khi bạn hài lòng với tất cả những điều này và bạn đã xem xét nó và + +140 +00:09:47,490 --> 00:09:48,630 +bạn hiểu mọi thứ + +141 +00:09:48,960 --> 00:09:52,800 +đang diễn ra, thì bạn đã có cơ sở để chuyển sang bài học tiếp + +142 +00:09:52,800 --> 00:09:55,620 +theo, nơi chúng ta sẽ nói về trình trang trí Python. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python-Decorators-Repl.it-Code.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python-Decorators-Repl.it-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..44517f256a26a5296746f022b133aaaf000146de --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Python-Decorators-Repl.it-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/python-decorators#main.py \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Visualising-Nested-Function-Return-on-PythonTutor.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Visualising-Nested-Function-Return-on-PythonTutor.url new file mode 100644 index 0000000000000000000000000000000000000000..ceb2813da500aa899ede77b299a0f21c67e3a776 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/005 Visualising-Nested-Function-Return-on-PythonTutor.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://www.pythontutor.com/visualize.html#mode=display \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Completed-Code-for-day-54-end.zip b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Completed-Code-for-day-54-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..a01194700d300b142eae610d5eab32b57ff0195e --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Completed-Code-for-day-54-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:156ad184830308e06b5527ce07e5710d3d6d5ce151508c2372afbdea3c114c27 +size 270 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Interactive-Coding-Exercise-Day-54.1-Decorators.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Interactive-Coding-Exercise-Day-54.1-Decorators.url new file mode 100644 index 0000000000000000000000000000000000000000..f9e6203af2e1afc3bb1da92f83edfec8fc1ee1ce --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Interactive-Coding-Exercise-Day-54.1-Decorators.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/day-54-1-exercise#main.py \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Understanding Python Decorator Functions and the @ Syntax.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Understanding Python Decorator Functions and the @ Syntax.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fe8be1159226bbdffbed7fcdfddba069bd2d0fdc --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Understanding Python Decorator Functions and the @ Syntax.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c27d1c7d7cc6589cb085133ab84c72cdc25c258d48295f22bdf22f18bdbaac7 +size 33592069 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Understanding Python Decorator Functions and the @ Syntax_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Understanding Python Decorator Functions and the @ Syntax_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..71709c991449aaa187cc3555dc49cd7fbf9d4a09 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/006 Understanding Python Decorator Functions and the @ Syntax_vi.srt @@ -0,0 +1,520 @@ +1 +00:00:00,180 --> 00:00:01,410 +Trong bài học trước, + +2 +00:00:01,470 --> 00:00:06,120 +chúng ta đã có phần sơ lược về các hàm để chúng ta có thể hiểu bước tiếp + +3 +00:00:06,150 --> 00:00:07,920 +theo là trình trang trí Python. + +4 +00:00:08,430 --> 00:00:11,700 +Vì vậy, chúng ta đã thấy rằng các hàm có thể có chức + +5 +00:00:11,700 --> 00:00:16,700 +năng, đầu vào và đầu ra, các hàm là các đối tượng hạng nhất và có thể được chuyển xung quanh + +6 +00:00:17,280 --> 00:00:19,650 +dưới dạng đối số, các hàm có thể được lồng + +7 +00:00:19,920 --> 00:00:24,900 +trong các hàm khác và cuối cùng, các hàm có thể được trả về dưới dạng đầu ra từ một chức + +8 +00:00:25,200 --> 00:00:29,700 +năng mà không cần phải kích hoạt nó. Với bốn điều này trong tâm trí, + +9 +00:00:29,790 --> 00:00:33,180 +cuối cùng chúng tôi đã sẵn sàng giải quyết trình trang trí Python. + +10 +00:00:34,200 --> 00:00:34,950 +Trước hết, + +11 +00:00:34,950 --> 00:00:39,950 +tôi thực sự sẽ tạo một trình trang trí Python cho bạn để chúng ta có thể nói + +12 +00:00:40,140 --> 00:00:41,460 +về cách nó hoạt động. + +13 +00:00:42,060 --> 00:00:45,300 +Đây là một hàm decorator trong Python trông như thế nào. + +14 +00:00:45,780 --> 00:00:49,590 +Chúng tôi bắt đầu bằng cách chỉ tạo một chức năng bình thường. + +15 +00:00:50,910 --> 00:00:53,580 +Giả sử tôi gọi nó là chức năng trang trí của tôi. + +16 +00:00:56,190 --> 00:01:00,000 +Hàm này sẽ lấy một hàm khác làm đầu vào. + +17 +00:01:00,960 --> 00:01:05,760 +Bây giờ, bên trong decorator_ Chức năng, tôi sẽ lồng một wrapper_ Chức năng. + +18 +00:01:07,530 --> 00:01:12,530 +Và chức năng wrapper này sau đó sẽ kích hoạt chức năng thực tế + +19 +00:01:13,770 --> 00:01:16,440 +đã được chuyển vào chức năng decorator. + +20 +00:01:17,760 --> 00:01:22,020 +Và khi kết thúc việc gọi tất cả các dòng trong decorator_ Chức năng của tôi, tôi + +21 +00:01:22,290 --> 00:01:26,490 +sẽ trả về wrapper_ Chức năng của mình. Nhưng hãy nhớ không có + +22 +00:01:26,520 --> 00:01:30,090 +dấu ngoặc đơn. Bây giờ, về cơ bản những + +23 +00:01:30,120 --> 00:01:33,750 +gì chúng tôi đã làm là chúng tôi đã tạo ra một decorator_ + +24 +00:01:33,840 --> 00:01:38,840 +Chức năng có thể thực hiện một số công việc và nó có thể kiểm soát việc gọi + +25 +00:01:39,270 --> 00:01:40,860 +hàm đã được truyền vào. + +26 +00:01:41,550 --> 00:01:46,550 +Hãy nhớ rằng decorator_ Chức năng chỉ là một chức năng bao bọc một chức năng + +27 +00:01:46,890 --> 00:01:51,390 +khác và cung cấp cho chức năng đó một số chức năng bổ sung. + +28 +00:01:51,810 --> 00:01:56,550 +Điều đó khá khó nghe, nhưng chúng ta hãy xem một ví dụ. + +29 +00:01:57,390 --> 00:02:00,630 +Giả sử rằng tôi muốn tạo một hàm đơn giản + +30 +00:02:00,720 --> 00:02:02,880 +mà tôi sẽ gọi là say_hello. + +31 +00:02:03,510 --> 00:02:06,360 +Bây giờ hàm này sẽ là dạng hàm đơn giản nhất. + +32 +00:02:06,390 --> 00:02:09,000 +Nó không có đầu vào và không có đầu ra và tất + +33 +00:02:09,270 --> 00:02:13,620 +cả những gì nó làm chỉ là in hello. Bây giờ, điều gì sẽ xảy ra + +34 +00:02:13,620 --> 00:02:17,280 +nếu tôi không muốn chạy chức năng này ngay lập tức khi tôi nhấn + +35 +00:02:17,310 --> 00:02:21,630 +run, điều gì sẽ xảy ra nếu tôi muốn thêm độ trễ vào chức năng này? + +36 +00:02:22,170 --> 00:02:25,980 +Chà, một cách để làm điều đó sẽ là nhập mô-đun thời gian và sau đó trước + +37 +00:02:26,460 --> 00:02:28,680 +khi chúng tôi in lời chào, chúng tôi có + +38 +00:02:29,010 --> 00:02:32,520 +thể tiếp tục và chạy thời gian. ngủ và chúng ta + +39 +00:02:32,850 --> 00:02:36,660 +có thể ngủ trong một số giây xác định trước. + +40 +00:02:37,290 --> 00:02:40,950 +Vì vậy, bây giờ khi tôi gọi phương thức này, say_hello và + +41 +00:02:41,370 --> 00:02:45,420 +khi tôi chạy nó, bạn sẽ thấy ngay lập tức không có gì xảy ra. + +42 +00:02:45,720 --> 00:02:49,440 +Và sau một khoảng thời gian trễ hai giây, bạn có thể thấy chữ chào in + +43 +00:02:49,470 --> 00:02:52,290 +thực sự được kích hoạt. Bây giờ, điều + +44 +00:02:52,290 --> 00:02:55,320 +gì sẽ xảy ra nếu tôi muốn tạo một + +45 +00:02:55,380 --> 00:02:58,080 +loạt các hàm như say_bye và say_greeting. + +46 +00:02:59,830 --> 00:03:04,510 +Và tôi muốn thêm độ trễ vào mỗi cái này. Vâng, sau đó tôi sẽ + +47 +00:03:04,510 --> 00:03:09,130 +phải sao chép và dán mã này vào cả ba nơi. + +48 +00:03:09,790 --> 00:03:12,010 +Bây giờ, đây là một ví + +49 +00:03:12,280 --> 00:03:17,280 +dụ rất đơn giản, nhưng chúng tôi thường muốn thêm một số phần chức năng bổ sung + +50 +00:03:17,380 --> 00:03:22,270 +vào một số chức năng của chúng tôi. Vì vậy, đây là nơi mà người trang trí có ích. + +51 +00:03:23,140 --> 00:03:27,850 +Những gì chúng ta có thể làm là trước khi kích hoạt hàm được truyền vào + +52 +00:03:27,850 --> 00:03:31,420 +decorator_ Chức năng, chúng ta có thể thêm thời gian trễ. + +53 +00:03:31,960 --> 00:03:36,960 +Vì vậy, bây giờ bất cứ khi nào chúng ta trang trí một hàm bằng decorator_ Chức năng cụ + +54 +00:03:38,590 --> 00:03:43,030 +thể này, thì nó sẽ bị trì hoãn trong hai giây trước khi nó chạy hàm. + +55 +00:03:43,600 --> 00:03:48,010 +Vì vậy, hãy đặt tên mô tả cho hàm decorator này một chút. + +56 +00:03:48,220 --> 00:03:51,940 +Hãy gọi nó là một delay_decorator. Vâng, bây giờ những + +57 +00:03:51,970 --> 00:03:56,970 +gì chúng ta có thể làm là chúng ta có thể chỉ cần sử + +58 +00:03:58,660 --> 00:04:03,660 +dụng dấu @ và chúng ta có thể gọi delay_decorator trước các phương thức + +59 +00:04:05,320 --> 00:04:09,730 +mà chúng ta muốn trì hoãn. Vì vậy, chúng tôi có thể thêm nó cho cả ba người trong số + +60 +00:04:09,760 --> 00:04:12,040 +họ hoặc chúng tôi chỉ có thể thêm nó vào một số người trong số họ. + +61 +00:04:12,400 --> 00:04:17,050 +Nhưng bây giờ khi tôi thực sự chạy chức năng của mình, chẳng hạn như + +62 +00:04:17,050 --> 00:04:20,649 +say_hello, bạn có thể thấy rằng chức năng này vì nó + +63 +00:04:20,649 --> 00:04:22,630 +có trình trang trí trễ, + +64 +00:04:22,900 --> 00:04:26,260 +nó sẽ đợi hai giây trước khi nó in lời chào. + +65 +00:04:26,650 --> 00:04:28,930 +Nhưng nếu tôi gọi say_greeting là chương + +66 +00:04:29,050 --> 00:04:31,900 +trình không có trình trang trí phía trên, thì bạn có + +67 +00:04:32,260 --> 00:04:34,660 +thể thấy nó được kích hoạt ngay lập tức. + +68 +00:04:35,350 --> 00:04:40,350 +Vì vậy, đây là một cách thực sự hay để thêm một cái gì đó mà bạn có thể làm + +69 +00:04:40,600 --> 00:04:41,560 +trước khi chạy hàm, + +70 +00:04:42,360 --> 00:04:43,193 +1: Phải không? + +71 +00:04:45,630 --> 00:04:50,630 +0: hoặc thêm một số chức năng mà bạn có thể làm sau chức năng. Hoặc cách khác, bạn có thể + +72 +00:04:51,510 --> 00:04:56,340 +sửa đổi chức năng để có thể bạn muốn chạy nó hai lần. + +73 +00:04:56,910 --> 00:04:59,070 +Vì vậy, bây giờ khi tôi nói + +74 +00:05:01,950 --> 00:05:04,530 +lời chào, nó sẽ không chỉ trễ hai giây + +75 +00:05:04,800 --> 00:05:06,750 +mà còn chạy nó hai lần. + +76 +00:05:09,270 --> 00:05:14,220 +Cú pháp này là những gì chúng ta đã thấy khi tạo + +77 +00:05:14,250 --> 00:05:19,250 +ứng dụng Flask của mình. Nó có ký hiệu @ và về cơ bản nó trang trí hàm + +78 +00:05:20,850 --> 00:05:22,050 +bên dưới bằng một hàm decorator. + +79 +00:05:22,080 --> 00:05:27,080 +Vì vậy, đưa chức năng này thông qua một máy có thể sửa đổi chức năng hoặc thêm + +80 +00:05:28,200 --> 00:05:32,400 +một số chức năng trước hoặc sau. Quay trở lại với định nghĩa của + +81 +00:05:32,820 --> 00:05:37,820 +chúng tôi, một hàm decorator chỉ đơn giản là một hàm bao bọc một hàm khác và cung + +82 +00:05:40,500 --> 00:05:44,640 +cấp cho nó một số chức năng bổ sung hoặc sửa đổi chức năng. + +83 +00:05:46,500 --> 00:05:51,390 +Bây giờ, quay lại cú pháp này, dấu @ này, nó + +84 +00:05:51,390 --> 00:05:54,150 +được gọi là đường cú pháp. + +85 +00:05:54,930 --> 00:05:59,930 +Đó là một số cú pháp mà bạn có thể viết để giúp viết một dòng mã thay thế + +86 +00:06:01,430 --> 00:06:02,263 +dễ dàng hơn. + +87 +00:06:02,810 --> 00:06:07,760 +Vì vậy, giả sử chúng tôi muốn thêm trình trang trí vào say_greeting này. Chà, nếu thay vì sử dụng đường cú + +88 +00:06:07,910 --> 00:06:11,450 +pháp này với dấu @ và sau đó là tên của hàm, + +89 +00:06:11,450 --> 00:06:12,920 +chúng ta cũng có + +90 +00:06:13,280 --> 00:06:18,280 +thể chỉ cần gọi tên của trình trang trí và sau đó chúng ta có thể + +91 +00:06:20,570 --> 00:06:23,510 +chuyển vào tên hàm của mình, say_greeting, và sau đó + +92 +00:06:24,620 --> 00:06:29,620 +chúng ta sẽ kết thúc với chức năng được trang trí làm đầu ra từ phương + +93 +00:06:31,310 --> 00:06:32,143 +pháp này. + +94 +00:06:32,660 --> 00:06:37,660 +Và bây giờ chúng ta có thể gọi hàm được trang trí bằng dấu ngoặc đơn. + +95 +00:06:38,570 --> 00:06:43,310 +Vì vậy, bây giờ chúng tôi đã kích hoạt hàm say_greeting này và chúng tôi đã + +96 +00:06:43,400 --> 00:06:45,860 +chuyển nó qua trình trang trí trì hoãn. + +97 +00:06:46,520 --> 00:06:51,520 +Nhưng sẽ dễ dàng hơn nhiều để xem nhanh những gì đang xảy ra bằng cách sử dụng ký hiệu + +98 +00:06:51,980 --> 00:06:56,270 +@ này vì bạn có thể thấy bây giờ bạn có thể kích hoạt phương thức này + +99 +00:06:56,630 --> 00:07:00,020 +bằng tên riêng của nó và bởi vì @delay_decorator ở trên cùng của nó, + +100 +00:07:00,260 --> 00:07:02,540 +sau đó nó sẽ đi qua đó lọc. + +101 +00:07:03,950 --> 00:07:07,250 +Tôi khuyên bạn nên dành vài phút xem mã này mà bạn + +102 +00:07:07,520 --> 00:07:11,180 +có thể truy cập tại URL này trong tài nguyên khóa học, sau + +103 +00:07:11,660 --> 00:07:16,370 +đó cố gắng tạo lại chức năng này từ đầu dựa trên hiểu biết của bạn về + +104 +00:07:16,370 --> 00:07:20,360 +những gì chúng ta vừa nói. Và sau đó khi bạn đã hoàn + +105 +00:07:20,420 --> 00:07:23,510 +tất, khi chúng tôi quay lại ứng dụng Flask của mình, giờ đây + +106 +00:07:23,870 --> 00:07:27,890 +bạn có thể thấy rằng hầu hết các mã đều có thể hiểu một cách dễ dàng. + +107 +00:07:28,340 --> 00:07:31,580 +Chúng tôi biết __name__ này đề cập đến điều + +108 +00:07:31,910 --> 00:07:34,160 +gì, chúng tôi biết rằng đây + +109 +00:07:34,400 --> 00:07:38,270 +là một trình trang trí sẽ đảm bảo rằng chúng tôi + +110 +00:07:38,570 --> 00:07:41,840 +chỉ kích hoạt chức năng này nếu người dùng cố + +111 +00:07:42,020 --> 00:07:45,010 +gắng truy cập URL là trang chủ /. + +112 +00:07:46,160 --> 00:07:50,540 +Nếu chúng ta muốn tạo một hàm khác, hãy gọi nó là say_bye. + +113 +00:07:53,480 --> 00:07:56,840 +Hàm này cũng có thể lấy một trình trang trí và trình + +114 +00:07:57,350 --> 00:08:01,970 +trang trí này sẽ kiểm tra xem có tốt không, nếu ai đó truy cập URL / + +115 +00:08:01,970 --> 00:08:03,260 +tạm biệt, thì chúng + +116 +00:08:03,260 --> 00:08:07,160 +tôi sẽ kích hoạt phương thức này. Về mặt hiệu quả, khung làm + +117 +00:08:07,610 --> 00:08:12,610 +việc của Flask là phương thức xác định phương thức nào trong số các phương thức + +118 +00:08:14,180 --> 00:08:19,180 +này sẽ được gọi và các phương thức này chỉ được gọi khi người trang trí + +119 +00:08:19,820 --> 00:08:24,080 +nói rằng việc đó là thích hợp. Bây giờ, nếu tôi tiếp tục và + +120 +00:08:26,390 --> 00:08:29,390 +chạy mã này một lần nữa, và chúng tôi truy cập URL + +121 +00:08:29,720 --> 00:08:33,650 +là máy chủ của chúng tôi, vì vậy chúng tôi biết đây là tuyến đường + +122 +00:08:33,980 --> 00:08:36,559 +chính hoặc trang chủ, nhưng nếu chúng tôi truy cập + +123 +00:08:36,919 --> 00:08:41,919 +/ tạm biệt thì chúng tôi chuyển đến tuyến đường tạm biệt và phương thức này được hiển thị. + +124 +00:08:43,730 --> 00:08:47,330 +Bây giờ để đảm bảo rằng bạn có cơ hội tự mình viết các + +125 +00:08:47,330 --> 00:08:50,090 +hàm decorator, nếu bạn chuyển sang bài học tiếp theo, + +126 +00:08:50,120 --> 00:08:53,720 +tôi có một bài tập viết mã cho bạn để thách thức bạn + +127 +00:08:53,750 --> 00:08:55,760 +tạo các hàm decorator của riêng mình. + +128 +00:08:56,270 --> 00:08:59,540 +Và nó sẽ là một chức năng trang trí thực sự hữu ích + +129 +00:08:59,540 --> 00:09:03,290 +vì nó sẽ đo lượng thời gian cần một chức năng cụ thể để chạy. + +130 +00:09:03,920 --> 00:09:06,830 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 Exercise-35.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 Exercise-35.url new file mode 100644 index 0000000000000000000000000000000000000000..000b461a24e9420e5885ca411b6129b3f369c094 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 Exercise-35.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/0bdee66a-f2df-4f48-aa07-353ee53a88c5 \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 How-to-join-Auditorium.url b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 [Interactive Coding Exercise] Create your own Python Decorator.mp4 b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 [Interactive Coding Exercise] Create your own Python Decorator.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1ca72c1b3e7c5af0a99b2b05df9fdfa2e2d696a1 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 [Interactive Coding Exercise] Create your own Python Decorator.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba213f87dc97b58414a2d3b0d653caf5a065e50b2f80ceb4b834ffc2f839338 +size 12603470 diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 [Interactive Coding Exercise] Create your own Python Decorator_vi.srt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 [Interactive Coding Exercise] Create your own Python Decorator_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..7ed64d8763f9d17e28c5ce2bfebf5020836c11c2 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/007 [Interactive Coding Exercise] Create your own Python Decorator_vi.srt @@ -0,0 +1,312 @@ +1 +00:00:00,600 --> 00:00:01,589 +Người hướng dẫn: + +2 +00:00:01,589 --> 00:00:05,100 +Trong bài tập này, các bạn sẽ tạo một hàm trang trí + +3 +00:00:05,100 --> 00:00:07,890 +của riêng mình và hàm trang trí của bạn sẽ + +4 +00:00:07,890 --> 00:00:09,390 +làm một việc mà nhiều + +5 +00:00:09,390 --> 00:00:11,370 +bạn tò mò, đó là mất bao lâu để + +6 +00:00:11,370 --> 00:00:13,260 +một hàm cụ thể chạy? + +7 +00:00:13,260 --> 00:00:15,720 +Chức năng của tôi có hiệu quả không? + +8 +00:00:15,720 --> 00:00:18,270 +Có nhanh nhất có thể không? + +9 +00:00:18,270 --> 00:00:20,640 +Chà, bạn thực sự sẽ nhận được câu trả lời bằng + +10 +00:00:20,640 --> 00:00:24,060 +số cho câu hỏi đó bằng cách hoàn thành thử thách hiện tại này. + +11 +00:00:24,060 --> 00:00:26,130 +Vậy thời gian được tính như thế nào? + +12 +00:00:26,130 --> 00:00:29,190 +Chà, trong Python, có một mô-đun tên là thời gian và bạn + +13 +00:00:29,190 --> 00:00:31,650 +có thể chạy thời gian. time để có được + +14 +00:00:31,650 --> 00:00:33,900 +thời gian hiện tại kể + +15 +00:00:33,900 --> 00:00:38,900 +từ ngày 1 tháng 1 năm 1970 lúc nửa đêm. + +16 +00:00:39,300 --> 00:00:43,170 +Hãy thử chạy mã bắt đầu và xem nội dung được in ở thời + +17 +00:00:43,170 --> 00:00:45,930 +điểm hiện tại mỗi lần bạn chạy mã đó. + +18 +00:00:45,930 --> 00:00:46,920 +Hy vọng rằng bạn + +19 +00:00:46,920 --> 00:00:49,320 +sẽ nhận thấy rằng con số đó tăng lên + +20 +00:00:49,320 --> 00:00:53,400 +mỗi lần và nó đại diện cho số giây kể từ năm 1970. + +21 +00:00:53,400 --> 00:00:57,150 +Vì vậy, theo thời gian, con số đó sẽ tăng lên. + +22 +00:00:57,150 --> 00:00:58,920 +Hãy suy nghĩ về cách bạn có + +23 +00:00:58,920 --> 00:01:01,470 +thể sử dụng hàm đó để tạo một hàm trang + +24 +00:01:01,470 --> 00:01:03,900 +trí và viết hàm trang trí của bạn bên + +25 +00:01:03,900 --> 00:01:07,830 +trong speed_calc_designator, sau đó áp dụng hàm đó cho + +26 +00:01:07,830 --> 00:01:11,040 +cả hàm fast_function và hàm Slow_function + +27 +00:01:11,040 --> 00:01:14,580 +để xem mỗi hàm đó mất bao lâu để thực thi. + +28 +00:01:14,580 --> 00:01:17,610 +Đó là mục tiêu của thử thách này và hãy + +29 +00:01:17,610 --> 00:01:19,920 +nhớ xem bên trong hộp mô tả để + +30 +00:01:19,920 --> 00:01:24,360 +biết nó sẽ hoạt động như thế nào, đồng thời xem gợi ý nếu + +31 +00:01:24,360 --> 00:01:26,010 +bạn gặp khó khăn. + +32 +00:01:26,010 --> 00:01:26,843 +Hãy đi ngay bây giờ. + +33 +00:01:35,084 --> 00:01:36,240 +Điều đầu tiên chúng + +34 +00:01:36,240 --> 00:01:39,483 +ta cần làm là xác định speed_calc_designator + +35 +00:01:41,220 --> 00:01:43,530 +và chúng ta sẽ thêm đầu vào vào + +36 +00:01:43,530 --> 00:01:46,560 +hàm này, đây cũng là một hàm. + +37 +00:01:46,560 --> 00:01:49,440 +Về cơ bản, đây là chức năng mà chúng ta sẽ trang trí + +38 +00:01:49,440 --> 00:01:52,950 +và bây giờ chúng ta có thể truy cập chức năng đó bên trong phần + +39 +00:01:52,950 --> 00:01:55,740 +thân của speed_calc_designator. + +40 +00:01:55,740 --> 00:01:58,680 +Tiếp theo, chúng ta sẽ xác định hàm bao bọc của mình. + +41 +00:01:58,680 --> 00:02:01,740 +Và hàm bao bọc này sẽ là hàm tính + +42 +00:02:01,740 --> 00:02:03,783 +toán thời gian. + +43 +00:02:05,220 --> 00:02:06,300 +Bên trong hàm bao bọc, + +44 +00:02:06,300 --> 00:02:09,090 +điều đầu tiên chúng ta xác định là thời gian bắt đầu + +45 +00:02:09,090 --> 00:02:10,800 +sử dụng. thời gian. + +46 +00:02:10,800 --> 00:02:12,720 +Và điều này sẽ cho chúng ta + +47 +00:02:12,720 --> 00:02:15,510 +số giây kể từ ngày 1 tháng 1 năm 1970. + +48 +00:02:15,510 --> 00:02:18,540 +Và sau đó chúng ta chạy hàm đang được truyền vào, + +49 +00:02:18,540 --> 00:02:21,210 +đây sẽ là hàm mà chúng ta trang trí. + +50 +00:02:21,210 --> 00:02:25,230 +Và đây có thể là Slow_function hoặc fast_function hoặc + +51 +00:02:25,230 --> 00:02:27,870 +bất kỳ hàm nào khác cho vấn đề đó. + +52 +00:02:27,870 --> 00:02:30,480 +Và sau khi chức năng đó được hoàn thành, chúng + +53 +00:02:30,480 --> 00:02:32,460 +tôi tính toán end_time. + +54 +00:02:32,460 --> 00:02:36,363 +Chà, bây giờ là mấy giờ kể từ ngày 1 tháng 1 năm 1970? + +55 +00:02:37,800 --> 00:02:40,230 +Cuối cùng, chúng ta có thể viết hàm in và + +56 +00:02:40,230 --> 00:02:44,280 +sử dụng chuỗi f để thay thế hàm. __name, là tên của hàm + +57 +00:02:44,280 --> 00:02:47,430 +được truyền vào, là hàm mà chúng + +58 +00:02:47,430 --> 00:02:49,620 +ta đang trang trí. + +59 +00:02:49,620 --> 00:02:53,520 +Và sau đó chúng ta in tốc độ chạy của hàm đó. + +60 +00:02:53,520 --> 00:02:55,320 +Và tất nhiên, điều đó được + +61 +00:02:55,320 --> 00:02:58,199 +tính bằng end_time trừ đi start_time. + +62 +00:02:58,199 --> 00:03:01,560 +Và chúng tôi kết thúc với số giây đã trôi + +63 +00:03:01,560 --> 00:03:05,493 +qua để hàm được chuyển vào để chạy xong. + +64 +00:03:06,360 --> 00:03:09,690 +Và cuối cùng, chúng ta trả về hàm bao bọc và điều đó + +65 +00:03:09,690 --> 00:03:13,590 +hoàn thành định nghĩa về trình trang trí của chúng ta. + +66 +00:03:13,590 --> 00:03:17,040 +Bây giờ tất cả những gì còn lại phải làm là trang trí các + +67 +00:03:17,040 --> 00:03:19,050 +hàm mà chúng ta muốn áp dụng. + +68 +00:03:19,050 --> 00:03:23,010 +Vì vậy, ở dòng 13 và 18, tôi đang thêm speed_calc_designator + +69 +00:03:23,010 --> 00:03:25,620 +vào fast_function và Slow_function. + +70 +00:03:25,620 --> 00:03:27,720 +Và cuối cùng, ở dòng 23 và 24, + +71 +00:03:27,720 --> 00:03:29,670 +tôi thực sự đang chạy các hàm + +72 +00:03:29,670 --> 00:03:32,973 +đó, chúng sẽ mang theo các hàm trang trí. + +73 +00:03:34,020 --> 00:03:35,670 +Vì thế bây giờ nếu chạy code bạn + +74 +00:03:35,670 --> 00:03:38,130 +sẽ thấy fast_function chạy trong bao lâu, + +75 +00:03:38,130 --> 00:03:40,380 +Slow_function chạy trong bao lâu. + +76 +00:03:40,380 --> 00:03:41,700 +Và bạn có thể thấy mỗi lần, + +77 +00:03:41,700 --> 00:03:44,220 +chúng tôi đang áp dụng speed_calc_designator + +78 +00:03:44,220 --> 00:03:46,503 +cho từng cái và in ra thời gian chạy. + diff --git a/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/external-links.txt b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..62c852c7efac6417e9e9faaa8d1c348fa758c127 --- /dev/null +++ b/part3/54 - Day 54 - Intermediate+ Introduction to Web Development with Flask/external-links.txt @@ -0,0 +1,33 @@ + +002 Flask-Package-on-PyPi +https://pypi.org/project/Flask/ + +002 Flask-Quickstart-Docs +https://flask.palletsprojects.com/en/3.0.x/quickstart/ + +003 Windows-Command-Prompt-Cheat-Sheet +http://www.cs.columbia.edu/~sedwards/classes/2015/1102-fall/Command%20Prompt%20Cheatsheet.pdf + +003 Mac-Linux-Terminal-Cheat-Sheet +https://github.com/appbrewery/terminal-mac-cheatsheet + +004 Python-Built-In-Attributes-e.g.name- +https://docs.python.org/3/library/stdtypes.html?highlight=__name__#special-attributes + +004 What-is-main- +https://docs.python.org/3/library/__main__.html + +005 Python-Decorators-Repl.it-Code +https://repl.it/@appbrewery/python-decorators#main.py + +005 Visualising-Nested-Function-Return-on-PythonTutor +http://www.pythontutor.com/visualize.html#mode=display + +006 Interactive-Coding-Exercise-Day-54.1-Decorators +https://repl.it/@appbrewery/day-54-1-exercise#main.py + +007 Exercise-35 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/0bdee66a-f2df-4f48-aa07-353ee53a88c5 + +007 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/001 Day 55 Goals what you will make by the end of the day.mp4 b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/001 Day 55 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f063ada68d37553e4b9bbb0bd93a237305913b6f --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/001 Day 55 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95c57a6276dacfb10e1f9c281754f14d98a77bc187f3b20bee705ee0a4fef9ff +size 11467517 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/001 Day 55 Goals what you will make by the end of the day_vi.srt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/001 Day 55 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..21762d65397f42ce2314702bf08622ca42eb0ee9 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/001 Day 55 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,96 @@ +1 +00:00:00,240 --> 00:00:02,100 +Chào các bạn hôm nay. + +2 +00:00:02,130 --> 00:00:05,700 +55 của một trăm ngày mã hôm nay. + +3 +00:00:05,760 --> 00:00:10,020 +Chúng tôi còn một ngày nữa dành cho bạn vì chúng tôi sẽ đi sâu hơn + +4 +00:00:10,020 --> 00:00:13,820 +vào phát triển web với flask. Và trong quá trình này, chúng + +5 +00:00:13,850 --> 00:00:16,460 +tôi cũng sẽ học một số khái niệm mới, + +6 +00:00:17,000 --> 00:00:22,000 +bao gồm cả cách hiển thị HTML trên trang web của bạn mà bạn phân phát bằng flask. + +7 +00:00:24,020 --> 00:00:25,130 +Và thêm + +8 +00:00:25,130 --> 00:00:30,130 +vào đó, làm thế nào để nắm giữ và chuyển URL mà người dùng đã nhập + +9 +00:00:31,010 --> 00:00:33,980 +vào cuối cùng, phải không? Nó cũng sẽ xem xét các trình trang + +10 +00:00:34,010 --> 00:00:39,010 +trí nâng cao, vì vậy trình trang trí nơi chúng ta có thể chuyển các đầu vào dưới dạng các đối số vị trí và từ khóa. + +11 +00:00:39,770 --> 00:00:42,080 +Và chúng tôi sẽ thực hiện một số bài tập xung quanh vấn đề đó. + +12 +00:00:42,680 --> 00:00:47,540 +Nhưng những gì mà tất cả những kiến thức này sẽ đạt đến đỉnh điểm là khách, số + +13 +00:00:47,540 --> 00:00:51,650 +lượng web, phải không? Được rồi. Khi chúng ta đi đến, một + +14 +00:00:51,650 --> 00:00:53,990 +con đường về nhà, vì vậy chỉ cần một dấu gạch chéo + +15 +00:00:54,260 --> 00:00:57,080 +sau đó, nó sẽ yêu cầu chúng ta đoán một số từ 0 đến 9. + +16 +00:00:57,560 --> 00:01:02,420 +Và sau đó nếu chúng ta nhập tám khách vào đường dẫn, giả sử, chúng ta + +17 +00:01:02,420 --> 00:01:07,010 +quyết định đoán số ba, nó cho chúng ta biết hãy thử lại lần nữa. + +18 +00:01:07,460 --> 00:01:11,510 +Vì vậy, đây là HTML với tạo kiểu với chữ H, cũng như một + +19 +00:01:11,690 --> 00:01:14,690 +món quà được hiển thị. Bây giờ, điều gì sẽ xảy ra nếu + +20 +00:01:14,720 --> 00:01:19,370 +chúng ta cố gắng quá cao hoặc, bạn biết đấy, một món quà? Và cuối cùng, nếu chúng ta hạ + +21 +00:01:19,370 --> 00:01:22,070 +cánh đúng con số, thì chúng ta sẽ nhận + +22 +00:01:22,520 --> 00:01:26,450 +được một cảnh báo rằng chúng ta đã tìm thấy con số chính xác. + +23 +00:01:27,170 --> 00:01:28,580 +Vì vậy, đó là mục tiêu. + +24 +00:01:28,730 --> 00:01:32,150 +Khi bạn đã nghe về nó, hãy chuyển sang bài học tiếp theo và hãy bắt đầu. + diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Flask-Docs-Routing.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Flask-Docs-Routing.url new file mode 100644 index 0000000000000000000000000000000000000000..1f4ec821d989d1246ddadc22eec80092490ec3c1 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Flask-Docs-Routing.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://flask.palletsprojects.com/en/1.1.x/quickstart/#routing \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Flask-Docs-Variable-Rules.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Flask-Docs-Variable-Rules.url new file mode 100644 index 0000000000000000000000000000000000000000..240d4b79ebc1c66f92adb18d6be7bb8e87d58574 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Flask-Docs-Variable-Rules.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Working Flask URL Paths and the Flask Debugger.mp4 b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Working Flask URL Paths and the Flask Debugger.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b3a8b3002f358cdcc2234939b537fe4cfe162eab --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Working Flask URL Paths and the Flask Debugger.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fb4ad3a19605802d761ff7a1cb817ac98b77a27184a412cc23095f693b6f621 +size 141718603 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Working Flask URL Paths and the Flask Debugger_vi.srt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Working Flask URL Paths and the Flask Debugger_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..61be4918dddc8bf654e57b12f8d229461ebc1d3d --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/002 Working Flask URL Paths and the Flask Debugger_vi.srt @@ -0,0 +1,788 @@ +1 +00:00:00,810 --> 00:00:04,110 +Bây giờ, một trong những điều đầu tiên tôi muốn giải quyết là đưa nó ra ngoài. + +2 +00:00:04,160 --> 00:00:07,430 +Hãy giữ cho người dùng đã nhập URL, hay đúng hơn + +3 +00:00:07,700 --> 00:00:11,330 +được gọi là phân tích cú pháp URL trong trường hợp này, nếu + +4 +00:00:11,360 --> 00:00:16,360 +người dùng đã nhập ww. thần bí. com và sau đó họ có dấu + +5 +00:00:18,050 --> 00:00:19,400 +gạch chéo về phía trước + +6 +00:00:19,400 --> 00:00:24,400 +với một đường dẫn, ví dụ: dấu gạch chéo về phía trước Angela hoặc dấu gạch chéo chuyển tiếp thư về phía + +7 +00:00:25,010 --> 00:00:29,900 +trước dấu gạch chéo về phía trước hình ảnh gạch chéo, sau đó chúng tôi muốn có thể nắm được thông tin + +8 +00:00:30,380 --> 00:00:34,190 +trong đường dẫn đó, vì chúng tôi có thể để làm điều gì đó khác biệt với + +9 +00:00:34,190 --> 00:00:38,840 +nó và hiển thị một cái gì đó cụ thể. Dựa trên URL đó trước đây, chúng tôi đã + +10 +00:00:38,840 --> 00:00:43,840 +thấy rằng chúng tôi có thể thay đổi lộ trình của trang web của mình bằng cách cung + +11 +00:00:45,020 --> 00:00:48,290 +cấp thông tin khác nhau. Vì vậy, nếu người dùng truy cập + +12 +00:00:48,290 --> 00:00:51,440 +tuyến đường chính, chỉ là URL và sau đó là dấu gạch chéo, thì chúng + +13 +00:00:51,680 --> 00:00:55,670 +tôi sẽ hiển thị cho họ điều gì đó. Nhưng nếu họ đi đến một tuyến đường khác, ví + +14 +00:00:55,670 --> 00:00:59,480 +dụ: dấu gạch chéo lên phía trước xin chào, thì chúng tôi có thể chỉ cho họ một cái gì đó khác. + +15 +00:01:00,710 --> 00:01:04,220 +Đây là nơi chúng tôi đã dừng lại trong các bài học trước của chúng tôi. + +16 +00:01:04,849 --> 00:01:09,850 +Nếu tôi muốn tạo một hàm BI chỉ trả về đơn giản thì tôi + +17 +00:01:13,400 --> 00:01:16,880 +có thể thiết lập trình trang trí tuyến đường. + +18 +00:01:16,880 --> 00:01:21,880 +Vì vậy, đây là hàm decorator cần tìm khi người dùng đi đến một + +19 +00:01:23,240 --> 00:01:26,120 +đường dẫn cụ thể, chẳng hạn như mua + +20 +00:01:27,140 --> 00:01:29,960 +gì, hãy nhớ rằng đây là một + +21 +00:01:29,960 --> 00:01:32,810 +hàm decorator, nằm bên trong App Object, được + +22 +00:01:32,900 --> 00:01:37,190 +khai báo trong lớp flask. Bây giờ, nếu tất cả những điều đó nghe + +23 +00:01:37,190 --> 00:01:39,680 +có vẻ như không có ý nghĩa gì, thì hãy nhớ + +24 +00:01:39,710 --> 00:01:44,270 +xem lại các bài học mà chúng ta đã làm trong những ngày trước về các lớp học và + +25 +00:01:44,270 --> 00:01:45,020 +phương pháp. + +26 +00:01:45,020 --> 00:01:48,950 +Tôi sẽ giả định rằng tất cả những điều này là khá đơn giản đối với bạn bây giờ. + +27 +00:01:49,910 --> 00:01:51,620 +Bây giờ khi chúng tôi chạy + +28 +00:01:51,860 --> 00:01:56,860 +trang web này, bây giờ chúng tôi có thể truy cập URL và chúng tôi có thể truy cập + +29 +00:01:57,350 --> 00:02:01,430 +trang chủ, có nội dung chào thế giới. Và chúng ta có thể đi đến lộ trình mua, chỉ + +30 +00:02:01,490 --> 00:02:06,380 +nói rằng, mua với một dấu chấm than. Được chứ. Nếu chúng ta muốn + +31 +00:02:06,380 --> 00:02:09,860 +thì sao, tôi muốn có một biến trong lộ trình đó. + +32 +00:02:10,130 --> 00:02:15,020 +Điều gì sẽ xảy ra nếu chúng ta muốn nắm bắt những gì người dùng nhập vào anh + +33 +00:02:15,170 --> 00:02:20,170 +ta, chẳng hạn, hãy nói rằng thay vì chỉ bắt và chuyển tiếp dấu gạch chéo nếu chúng ta + +34 +00:02:21,170 --> 00:02:22,610 +muốn chào đón người + +35 +00:02:22,880 --> 00:02:27,880 +dùng của mình, hãy giả sử tôi tạo một hàm chào lấy tên của họ và nó trả + +36 +00:02:28,730 --> 00:02:32,540 +về một cái gì đó giống như hello, nhưng sau đó nó thêm tên. + +37 +00:02:33,800 --> 00:02:36,740 +Hãy biến nó thành một chuỗi F để làm cho nó hoạt động. + +38 +00:02:37,430 --> 00:02:40,640 +Câu hỏi đặt ra là chúng ta sẽ tạo ra tuyến đường như thế nào? + +39 +00:02:41,390 --> 00:02:46,160 +Nó sẽ là tên gạch chéo chuyển tiếp hay nó sẽ là một cái gì đó khác? + +40 +00:02:46,670 --> 00:02:51,410 +Đây là những gì được mô tả trong phần này của quy tắc biến số. + +41 +00:02:51,950 --> 00:02:55,580 +Chúng tôi có thể thêm các phần biến vào một URL. + +42 +00:02:55,640 --> 00:03:00,640 +Vì vậy, về cơ bản nó tương đương với việc tạo một biến URL đó bằng cách đánh dấu + +43 +00:03:01,990 --> 00:03:03,400 +nó bằng cú pháp này. + +44 +00:03:03,760 --> 00:03:07,210 +Vì vậy, đặt một số dấu ngoặc nhọn xung quanh + +45 +00:03:08,020 --> 00:03:11,740 +tên biến, sau đó tất cả các hàm sẽ nhận tên biến. + +46 +00:03:11,890 --> 00:03:14,680 +Sau khi trình trang trí hoàn thành với nó, và sau + +47 +00:03:15,250 --> 00:03:18,520 +đó chúng ta có thể sử dụng nó bên trong chức năng của mình. + +48 +00:03:19,240 --> 00:03:20,470 +Vì vậy, ví dụ, + +49 +00:03:20,800 --> 00:03:25,030 +giả sử rằng chúng ta có một tuyến đường là dấu gạch chéo về phía trước tên + +50 +00:03:25,390 --> 00:03:29,170 +người dùng, sau đó gạch chéo về phía trước tên thực của người dùng, mà + +51 +00:03:29,920 --> 00:03:32,620 +chúng ta sẽ đặt bên trong một số dấu ngoặc nhọn. + +52 +00:03:32,980 --> 00:03:37,180 +Điều này có nghĩa là một bình bây giờ sẽ quay, bất kể nó là gì sau đó. + +53 +00:03:37,180 --> 00:03:41,500 +Sử dụng dấu gạch chéo phía trước tên vào một biến để chúng tôi khai thác. + +54 +00:03:41,980 --> 00:03:44,440 +Và biến đó có tên là tên. + +55 +00:03:44,980 --> 00:03:48,310 +Vì vậy, bây giờ khi hàm chào của chúng ta đi qua trình + +56 +00:03:48,550 --> 00:03:53,440 +trang trí đó, nó sẽ nhận giá trị đó và chúng ta có thể sử dụng nó trong hàm chào này. + +57 +00:03:54,130 --> 00:03:56,890 +Bây giờ, nếu tôi tiếp tục và chạy lại mã + +58 +00:03:59,350 --> 00:04:04,350 +của mình và quay lại URL đó và tôi đi tới dấu gạch chéo về phía trước + +59 +00:04:06,730 --> 00:04:09,550 +tên người dùng, sau đó tôi sẽ nhập tên người + +60 +00:04:10,060 --> 00:04:15,060 +dùng, ví dụ: Angela, thì Angela sẽ được sử dụng và nó sẽ được hiển thị động + +61 +00:04:15,430 --> 00:04:19,089 +vào trang web của tôi. Vì vậy, nó không quan trọng nó là gì tôi đặt ở đây. + +62 +00:04:19,120 --> 00:04:24,120 +Nó sẽ luôn phản hồi tương ứng và coi điều này như thể nó là giá trị + +63 +00:04:25,060 --> 00:04:25,960 +của một biến. + +64 +00:04:28,060 --> 00:04:32,650 +Bây giờ hãy chú ý cách mỗi lần chúng tôi cập nhật mã của mình. Vì vậy, ví dụ: nếu tôi không muốn tên + +65 +00:04:32,650 --> 00:04:37,420 +người dùng này nằm dưới tuyến đường gạch chéo về phía trước, hãy đặt tên người dùng là + +66 +00:04:37,450 --> 00:04:38,170 +dấu gạch + +67 +00:04:38,170 --> 00:04:43,170 +chéo, thay vào đó nếu tôi chỉ muốn đặt nó ở tên dấu gạch chéo phía trước, thì điều + +68 +00:04:43,810 --> 00:04:48,340 +này sẽ không hoạt động như bình thường. Nó sẽ cung cấp cho chúng ta bốn Oh bốn, + +69 +00:04:48,340 --> 00:04:49,450 +không được tìm thấy. + +70 +00:04:50,020 --> 00:04:55,020 +Và lý do cho điều này là vì chúng tôi phải dừng và làm mới tất cả máy chủ + +71 +00:04:56,320 --> 00:04:58,570 +để những thay đổi này được phản ánh. + +72 +00:04:59,110 --> 00:05:02,590 +Vì vậy, tôi phải dừng và sau đó chạy lại máy chủ của mình. + +73 +00:05:02,680 --> 00:05:07,680 +Và bây giờ nếu tôi truy cập vào đây và tôi bắt đầu nhập một cái gì đó giống như John, + +74 +00:05:08,860 --> 00:05:11,920 +thì bản cập nhật cho tuyến đường này hiện đang hoạt động. + +75 +00:05:12,550 --> 00:05:16,960 +Nếu chúng tôi đang thử nghiệm và phát triển trang web của mình, điều này thực sự khó khăn. + +76 +00:05:16,960 --> 00:05:21,820 +Phải dừng và chạy lại máy chủ mỗi khi chúng tôi thực hiện thay đổi trong tệp máy + +77 +00:05:21,820 --> 00:05:22,900 +chủ của mình. + +78 +00:05:23,470 --> 00:05:27,340 +Vì vậy, một trong những điều mà bạn có thể nhận thấy ở đây là có + +79 +00:05:27,340 --> 00:05:31,900 +một thứ gọi là chế độ gỡ lỗi và chúng ta có thể đặt chế độ này thành bật hoặc tắt. + +80 +00:05:32,380 --> 00:05:37,380 +Bây giờ, có một số lợi thế khi bật chế độ gỡ lỗi và + +81 +00:05:38,020 --> 00:05:42,520 +nó được mô tả trong Quickstart. Nó cho phép chúng tôi kích hoạt + +82 +00:05:42,610 --> 00:05:46,000 +trình gỡ lỗi, giúp chúng tôi thu hẹp mọi vấn đề. + +83 +00:05:46,450 --> 00:05:51,450 +Nó kích hoạt trình tải lại tự động để bất cứ khi nào chúng tôi chỉnh sửa tệp và nhấn lưu, nó + +84 +00:05:52,090 --> 00:05:55,810 +sẽ tải lại máy chủ của chúng tôi. Và cuối cùng, nó + +85 +00:05:55,810 --> 00:05:59,630 +cũng bật chế độ gỡ lỗi trên ứng dụng bình. + +86 +00:06:00,230 --> 00:06:05,060 +Hãy thử để thay đổi ứng dụng của chúng tôi để chạy ở chế độ gỡ lỗi. + +87 +00:06:05,270 --> 00:06:07,610 +Tất cả những gì chúng ta phải làm + +88 +00:06:07,660 --> 00:06:10,600 +là thay đổi quyền, thuộc tính gỡ lỗi thành true, phải không? + +89 +00:06:11,530 --> 00:06:15,610 +Và bây giờ nếu tôi tiếp tục và chạy lại ứng dụng này, thì bạn có thể + +90 +00:06:16,150 --> 00:06:19,000 +thấy chế độ gỡ lỗi của tôi hiện đang được bật. + +91 +00:06:19,540 --> 00:06:24,520 +Và tôi có trình gỡ lỗi này đang hoạt động và cũng là một trình gỡ lỗi, một ghim, mà chúng + +92 +00:06:24,580 --> 00:06:28,480 +tôi sẽ quay lại chỉ sau một phút. Nếu tôi vào trang web của tôi, + +93 +00:06:29,440 --> 00:06:34,270 +bạn có thể thấy rằng tôi có thể đến đó hai, một lộ trình như thế này, và + +94 +00:06:34,330 --> 00:06:35,470 +nó vẫn hoạt động. + +95 +00:06:35,890 --> 00:06:40,330 +Nhưng nếu tôi thay đổi một cái gì đó trong mã của mình, chẳng + +96 +00:06:40,630 --> 00:06:43,990 +hạn, chỉ cần thêm một từ mới vào trả về. + +97 +00:06:44,440 --> 00:06:49,440 +Nếu tôi tiếp tục và nhấn lệnh S trên Mac hoặc điều khiển chúng tôi trên windows để lưu + +98 +00:06:49,960 --> 00:06:51,850 +tệp này, thì nó sẽ đúng. + +99 +00:06:51,910 --> 00:06:56,440 +Tải lại máy chủ vì công nghệ đã thực hiện thay đổi trong tệp đó và + +100 +00:06:56,680 --> 00:07:01,600 +nó sẽ tự động tải lại máy chủ của chúng tôi để chúng tôi không phải dừng + +101 +00:07:01,600 --> 00:07:04,360 +và bắt đầu lại. Vì vậy, bây giờ, + +102 +00:07:04,360 --> 00:07:08,050 +nếu chúng tôi quay lại đây và làm mới trang này, thì bạn + +103 +00:07:08,230 --> 00:07:11,650 +có thể thấy cập nhật trong mã hiện đã được phản ánh. + +104 +00:07:12,220 --> 00:07:16,780 +Điều này là khá gọn gàng. Nhưng ngoài ra, chúng tôi cũng có thể làm những việc khác. + +105 +00:07:16,930 --> 00:07:21,580 +Ví dụ: nếu chúng tôi thực sự cần gỡ lỗi một vấn đề, chẳng hạn, + +106 +00:07:21,580 --> 00:07:25,360 +hãy nói rằng ở đây trong đường dẫn biến của tôi, + +107 +00:07:25,420 --> 00:07:28,930 +thay vì nói tên, tôi trích dẫn tên người dùng. + +108 +00:07:29,320 --> 00:07:30,940 +Nhưng sau đó trong hàm tham lam + +109 +00:07:30,970 --> 00:07:33,850 +của tôi, tôi vẫn đang cố gắng khai thác tên mã biến này. + +110 +00:07:34,450 --> 00:07:36,220 +Vì vậy, bây giờ nếu tôi nhấn lưu, + +111 +00:07:36,220 --> 00:07:40,870 +nó sẽ tải lại máy chủ của tôi và bạn có thể thấy rằng thực sự không có gì sai + +112 +00:07:40,870 --> 00:07:44,320 +với những gì tôi đã làm. Tất cả điều này đều hợp lệ về mặt cú pháp. + +113 +00:07:44,890 --> 00:07:48,250 +Nhưng nếu tôi truy cập trang web của mình tại đây và nhấn enter, tôi thực + +114 +00:07:48,670 --> 00:07:51,460 +sự nhận được chế độ xem gỡ lỗi nhiệm vụ chuyến bay. + +115 +00:07:52,000 --> 00:07:56,140 +Vì vậy, nó thực sự nói với tôi theo cách được định dạng độc đáo này? + +116 +00:07:56,200 --> 00:08:00,160 +Vấn đề là gì? Vì vậy, vấn đề chính, phải không, là tôi đã gặp lỗi loại II. + +117 +00:08:00,730 --> 00:08:01,570 +Vâng, nó xảy ra. + +118 +00:08:01,570 --> 00:08:06,570 +Nếu chúng ta cuộn qua phần dưới cùng là hàm màu xanh lá cây có một đối số từ khóa + +119 +00:08:06,580 --> 00:08:08,980 +không mong muốn được gọi là tên người dùng. + +120 +00:08:10,210 --> 00:08:14,440 +Vì vậy, trình gỡ lỗi đó có thể giúp chúng tôi tìm ra rằng, Ồ, thực + +121 +00:08:14,770 --> 00:08:16,360 +ra, tôi đã đặt tên sai. + +122 +00:08:17,110 --> 00:08:21,340 +Bây giờ đây là một vấn đề với đường dẫn ở đây. Nhưng cách khác, tôi cũng có thể + +123 +00:08:21,370 --> 00:08:25,420 +mắc lỗi trong mã của mình. Ví dụ, giả sử rằng + +124 +00:08:25,420 --> 00:08:29,020 +chúng tôi muốn lấy tên đang được truyền cho anh ta. + +125 +00:08:29,020 --> 00:08:33,220 +Chúng tôi quyết định rằng chúng tôi sẽ thêm 12, hai, vì lý do này hay lý do khác. Bây giờ, nếu tôi nhấn lưu để + +126 +00:08:33,220 --> 00:08:38,020 +máy chủ của tôi tải lại và tôi cố gắng làm mới trang web này, bạn có thể + +127 +00:08:38,440 --> 00:08:43,059 +thấy lại, tôi đã gặp lỗi loại II. Và lần này, nó cho tôi biết + +128 +00:08:43,059 --> 00:08:46,330 +rằng tôi chỉ có thể nối chuỗi, không phải một + +129 +00:08:46,360 --> 00:08:50,500 +số nguyên với một chuỗi. Và nếu chúng ta xem qua các tệp này, bạn + +130 +00:08:50,530 --> 00:08:55,000 +có thể thấy một trong những dòng này, dòng đầu tiên của tệp mà chúng tôi đã viết, xin chào, dấu chấm. + +131 +00:08:55,860 --> 00:08:59,370 +Và nó cho chúng ta biết rằng trực tuyến 18 trong chức năng chào + +132 +00:08:59,760 --> 00:09:03,210 +hỏi, đây là dòng. Đó là vấp ngã. Bây giờ, một + +133 +00:09:03,210 --> 00:09:07,290 +trong những điều tôi có thể làm vào lúc này là tôi thực sự có + +134 +00:09:07,290 --> 00:09:11,070 +thể mở bình, một trình gỡ lỗi. Và tôi làm điều đó bằng cách nhấp vào nút này ngay tại đây. + +135 +00:09:11,880 --> 00:09:15,570 +Và những gì điều này sẽ yêu cầu là cho mã ghim mà tôi đã cho bạn xem trước + +136 +00:09:15,780 --> 00:09:17,760 +đó, nằm trong bảng điều khiển của chúng tôi. + +137 +00:09:18,420 --> 00:09:21,510 +Điều này có nghĩa là nếu ai đó đang truy cập trang web của bạn, + +138 +00:09:21,660 --> 00:09:24,780 +trực tuyến trên internet và bạn tình cờ đặt nó ở chế độ gỡ lỗi, thì + +139 +00:09:25,050 --> 00:09:27,270 +họ không thể cứ làm lung tung mã của bạn. + +140 +00:09:27,930 --> 00:09:32,930 +Hãy di chuyển xuống dưới cùng và sao chép mã gỡ lỗi của chúng tôi và sau đó dán nó + +141 +00:09:33,690 --> 00:09:38,190 +vào đây làm mã ghim, sau đó xác nhận để có quyền truy cập vào trình gỡ lỗi. + +142 +00:09:38,850 --> 00:09:39,240 +Bây + +143 +00:09:39,240 --> 00:09:44,240 +giờ, những gì nó làm về cơ bản là mở một bảng điều khiển trực tiếp trên dòng này. + +144 +00:09:45,660 --> 00:09:48,870 +Vì vậy, bây giờ những gì tôi có thể làm là tôi có thể in + +145 +00:09:48,870 --> 00:09:52,590 +ra ví dụ, các biến mà nó có thể truy cập trên dòng đó, chẳng hạn như tên, + +146 +00:09:52,950 --> 00:09:57,360 +và nó cho tôi biết tên đó là Angela. Tôi có thể bắt đầu chẩn đoán, tốt, + +147 +00:09:57,600 --> 00:10:00,960 +tại sao điều này lại sai? Vì vậy, nếu tôi muốn bạn thêm tên vào + +148 +00:10:01,380 --> 00:10:03,030 +12, tôi có thể thu hẹp nó lại. + +149 +00:10:03,120 --> 00:10:07,800 +Và nó cho tôi thấy rằng bạn chỉ có thể thêm một chuỗi vào một chuỗi hoặc một số nguyên + +150 +00:10:07,800 --> 00:10:09,900 +vào một số nguyên. Bạn không thể trộn lẫn các loại. + +151 +00:10:10,350 --> 00:10:15,350 +Vì vậy, điều đó có thể khiến tôi nhận ra rằng thực ra tôi cũng cần phải thay đổi + +152 +00:10:15,750 --> 00:10:19,260 +điều này thành một thế mạnh. Bây giờ, nếu tôi tiếp tục + +153 +00:10:19,260 --> 00:10:21,060 +và làm mới, bạn có thể thấy + +154 +00:10:21,150 --> 00:10:25,290 +không có vấn đề gì ở đó và tôi đã tìm cách khắc phục sự cố + +155 +00:10:25,290 --> 00:10:27,450 +với sự trợ giúp của trình gỡ lỗi bình. + +156 +00:10:29,160 --> 00:10:31,800 +Bây giờ chỉ là một số điều khác trên URL này. + +157 +00:10:32,400 --> 00:10:36,960 +Một trong những điều chúng tôi có thể làm là chúng tôi có thể thêm một số văn + +158 +00:10:36,990 --> 00:10:41,880 +bản vào đường dẫn trước đó. Vì vậy, bạn nhớ rằng tôi đã nói tên gạch chéo tên người dùng. Vì vậy, nó hoạt động. + +159 +00:10:42,180 --> 00:10:44,400 +Chúng tôi cũng có thể thêm đường dẫn sau đó. + +160 +00:10:44,640 --> 00:10:48,120 +Vì vậy, nó có thể là một hoặc hai, bất kể nó có thể là gì. + +161 +00:10:48,480 --> 00:10:53,480 +Và bây giờ chúng tôi có thể truy cập tuyến đường này bằng cách truy cập URL của chúng tôi và sau đó đi + +162 +00:10:54,030 --> 00:10:56,010 +đến phần đầu tiên, đó là tên người dùng. + +163 +00:10:56,580 --> 00:10:59,370 +Và sau đó nó là biến mà chúng tôi có thể đưa vào. + +164 +00:10:59,640 --> 00:11:03,180 +Và cuối cùng chúng ta có thể thêm nhiều hơn nữa vào đường dẫn sau đó. + +165 +00:11:03,450 --> 00:11:06,720 +Vì vậy, chúng tôi trong trường hợp của chúng tôi, con đường là một. Vì vậy, bây giờ + +166 +00:11:06,750 --> 00:11:08,730 +nếu tôi nhấn enter, bạn có thể + +167 +00:11:08,970 --> 00:11:13,970 +thấy nó vẫn chuyển đến cùng một trang, nhưng chỉ có nồi ở giữa này được lấy làm + +168 +00:11:14,520 --> 00:11:17,820 +giá trị cho biến tên này. Bây giờ, nếu chúng ta + +169 +00:11:17,820 --> 00:11:20,580 +quay lại flask Quickstart, bạn có thể thấy rằng điều cuối + +170 +00:11:20,910 --> 00:11:25,200 +cùng bạn đã đề cập là có một thứ gọi là trình chuyển đổi trên trình + +171 +00:11:25,230 --> 00:11:27,720 +chuyển đổi, về cơ bản chuyển đổi URL thành + +172 +00:11:27,750 --> 00:11:32,750 +bất kỳ kiểu dữ liệu nào mà bạn chỉ định theo mặc định, nó chuyển đổi giá trị biến + +173 +00:11:33,930 --> 00:11:37,380 +đó thành một chuỗi, có nghĩa là nó sẽ chấp nhận bất kỳ + +174 +00:11:37,860 --> 00:11:42,660 +văn bản nào mà không có dấu gạch chéo. Bây giờ, nếu bạn muốn giữ lại dấu gạch + +175 +00:11:42,690 --> 00:11:46,440 +chéo, bởi vì nếu bạn đang sử dụng một đường dẫn, thì điều đó + +176 +00:11:46,470 --> 00:11:49,500 +có thể khá quan trọng. Vì vậy, ví dụ, + +177 +00:11:49,500 --> 00:11:54,130 +bạn muốn lấy toàn bộ phần này làm dấu gạch chéo biến của bạn Juan. + +178 +00:11:54,580 --> 00:11:59,170 +Vậy thì trong trường hợp đó, thay vì sử dụng điều này, bạn sẽ phải chỉ định, tốt, kiểu + +179 +00:11:59,170 --> 00:12:03,460 +dữ liệu sẽ là một đường dẫn và sau đó tôi sẽ lưu nó làm tên. + +180 +00:12:03,970 --> 00:12:07,300 +Vì vậy, bây giờ nếu tôi nhấn lưu và tôi sử dụng cùng một + +181 +00:12:07,330 --> 00:12:12,330 +URL này, bạn có thể thấy phần còn lại của đường dẫn đó hiện đang được hiển thị trong biến của tôi + +182 +00:12:12,910 --> 00:12:16,420 +và nó đang được kéo vào bất cứ điều gì mà tôi có thể cần. + +183 +00:12:18,280 --> 00:12:22,840 +Ngoài ra, bạn cũng có thể có nhiều hơn một biến, tất nhiên. + +184 +00:12:23,200 --> 00:12:27,250 +Vì vậy, có thể phần đầu tiên này, tôi sẽ giữ nó như một + +185 +00:12:27,280 --> 00:12:30,910 +cái tên, đó là một chuỗi. Và sau đó là phần thứ hai, tôi muốn một con số. + +186 +00:12:30,910 --> 00:12:35,530 +Vì vậy, có thể tôi sẽ giữ nó dưới dạng số nguyên kiểu dữ liệu và tôi sẽ đặt tên cho + +187 +00:12:35,560 --> 00:12:36,580 +biến, một số mã. + +188 +00:12:37,120 --> 00:12:42,120 +Vì vậy, bây giờ tôi có thể nhấn vào tên và sau đó tôi cũng có thể nhấn vào + +189 +00:12:45,220 --> 00:12:47,920 +một số như, vì vậy bây giờ quay lại + +190 +00:12:47,950 --> 00:12:51,160 +đây, nếu tôi thay đổi URL này một chút và nhấn enter, bạn + +191 +00:12:51,460 --> 00:12:54,280 +có thể thấy nó được lấy và đặt nó ở đây. + +192 +00:12:54,520 --> 00:12:56,590 +Nó đã lấy cái này và đặt nó ở đây. + +193 +00:12:57,670 --> 00:13:02,670 +Vì vậy, đó là một chút sơ lược về cách chúng ta có thể trích xuất các phần mà + +194 +00:13:02,920 --> 00:13:07,920 +chúng ta muốn từ một URL bằng cách sử dụng các đường dẫn biến này trong bài học tiếp + +195 +00:13:08,320 --> 00:13:13,030 +theo, chúng ta sẽ xem cách chúng ta có thể kiểm soát HTML được hiển thị thay + +196 +00:13:13,030 --> 00:13:15,820 +vì chỉ để bình hiển thị mặc định là gì. + +197 +00:13:16,510 --> 00:13:19,510 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 Rendering HTML Elements with Flask.mp4 b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 Rendering HTML Elements with Flask.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..608ca99b9edbb93ceede6127e930e020c21e7c8f --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 Rendering HTML Elements with Flask.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4483ace9881c7cf8e51b965283a66d71bc27c3ebc910ea7759e3266ef06ec72 +size 85007699 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 Rendering HTML Elements with Flask_vi.srt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 Rendering HTML Elements with Flask_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..4c8d39e24a19d749cc7bb1a3c1d5782854819cfc --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 Rendering HTML Elements with Flask_vi.srt @@ -0,0 +1,408 @@ +1 +00:00:00,150 --> 00:00:01,470 +Bây giờ trong bài học trước, + +2 +00:00:01,530 --> 00:00:05,910 +chúng ta đã nói một chút về cách làm cho các tuyến đường khác nhau hoạt động bằng cách sử dụng + +3 +00:00:05,910 --> 00:00:07,470 +trình trang trí tuyến đường chấm ứng + +4 +00:00:08,039 --> 00:00:13,040 +dụng, cũng như cách chúng ta có thể tạo các đường dẫn thay đổi bằng cách sử dụng cú pháp dấu ngoặc nhọn này + +5 +00:00:13,530 --> 00:00:18,530 +và cách chúng ta có thể chuyển đổi đường dẫn thành một kiểu dữ liệu được chỉ định trước bằng cách sử dụng cấu + +6 +00:00:19,830 --> 00:00:21,840 +trúc cụ thể này. Bây giờ, chúng tôi + +7 +00:00:21,840 --> 00:00:26,840 +cũng đã xem xét cách chạy Ứng dụng ở chế độ gỡ lỗi để chúng tôi có thể tự động tải lại máy chủ của + +8 +00:00:26,970 --> 00:00:31,530 +mình và cũng có quyền truy cập vào trình gỡ lỗi bình. Bây giờ, trong bài học này, tôi muốn nói + +9 +00:00:31,560 --> 00:00:32,340 +một chút + +10 +00:00:32,340 --> 00:00:36,630 +về cách chúng ta có thể hiển thị HTML thực tế, bởi vì tại thời điểm này, + +11 +00:00:36,840 --> 00:00:38,040 +những gì xảy ra + +12 +00:00:38,070 --> 00:00:43,070 +là chúng ta chỉ trả về một chuỗi và chúng ta nhận được flask để làm bất cứ điều + +13 +00:00:43,530 --> 00:00:46,710 +gì nó muốn với nó. . Và điều đó có nghĩa là gì. + +14 +00:00:46,710 --> 00:00:48,900 +Nếu chúng ta đi vào trình kiểm tra của Chrome, + +15 +00:00:48,930 --> 00:00:53,930 +bằng cách vào xem và sau đó là nhà phát triển và sau đó phát triển một công cụ là chúng ta có thể thấy nó. + +16 +00:00:55,130 --> 00:00:57,290 +1: Nó chỉ nhét toàn bộ chuỗi 0: + +17 +00:00:57,380 --> 00:01:02,380 +F đó vào một thẻ body mà không có bất kỳ thẻ HTML thực nào cung cấp cấu trúc cho nó. + +18 +00:01:04,190 --> 00:01:08,240 +Vì vậy, đó thường không phải là những gì bạn muốn khi tạo một trang web. + +19 +00:01:08,840 --> 00:01:13,010 +Vì vậy, hãy xem liệu chúng ta có thể bắt đầu tạo một số HTML hay không. Thay vì. + +20 +00:01:13,760 --> 00:01:18,760 +Bây giờ cách đơn giản nhất để làm điều này là flask thực sự chấp nhận HTML trong trả lại. + +21 +00:01:20,510 --> 00:01:23,450 +Vì vậy, chúng ta chỉ có thể nói một cách đơn + +22 +00:01:23,450 --> 00:01:28,450 +giản, nếu chúng ta muốn tạo một H bằng cách thêm thẻ mở và đóng H một ở đây và nếu + +23 +00:01:29,510 --> 00:01:34,430 +tôi nhấn lưu để làm mới máy chủ của mình và sau đó đi đến tuyến đường chính của tôi, thì + +24 +00:01:34,730 --> 00:01:38,900 +bạn có thể thấy đây là bây giờ bên trong và H một bên trong cơ thể. + +25 +00:01:40,010 --> 00:01:43,670 +Bây giờ, tất nhiên bạn có thể thay đổi mục tiêu này thành bất kỳ mục tiêu nào bạn muốn + +26 +00:01:43,880 --> 00:01:46,520 +và nó vẫn sẽ hoạt động. Bây giờ, khi chúng ta có + +27 +00:01:46,520 --> 00:01:48,920 +thể bắt đầu hiển thị HTML, chúng ta cũng có + +28 +00:01:48,950 --> 00:01:52,610 +thể bắt đầu sử dụng các thuộc tính HTML, nhân tiện, nếu bất kỳ điều + +29 +00:01:52,670 --> 00:01:57,670 +nào trong số này mà tôi đang nói về HTML hoặc CSS hoặc các thuộc tính hoặc thẻ nghe có vẻ + +30 +00:01:58,220 --> 00:02:02,600 +lạ, có thể là do bạn đã bỏ qua các phiên trên từng CSS số dư, mà chúng tôi + +31 +00:02:02,840 --> 00:02:04,130 +đã xem qua một vài, + +32 +00:02:04,130 --> 00:02:06,360 +1: Hai ngày trước. Vì vậy, có một tìm kiếm nhanh chóng cho điều đó. + +33 +00:02:06,470 --> 00:02:10,639 +0: Nếu tất cả những điều này đều khó hiểu và có thể đây là thời điểm tốt để thực + +34 +00:02:10,639 --> 00:02:14,600 +hiện sửa đổi về điều đó. Dù sao đi nữa. Bây giờ quay lại thẻ + +35 +00:02:15,050 --> 00:02:19,280 +H một của tôi, giả sử tôi muốn cung cấp cho nó một số CSS, chỉ là CSS nội tuyến. + +36 +00:02:19,760 --> 00:02:24,110 +Vì vậy, tôi sẽ thiết lập kiểu và cung cấp cho nó một số mã CSS. Ví dụ: tôi có thể đặt + +37 +00:02:24,170 --> 00:02:28,610 +văn bản, thuộc tính CSS dòng ở giữa và bây giờ nếu tôi nhấn lưu + +38 +00:02:29,120 --> 00:02:32,780 +và tôi làm mới trên trang chủ của mình, văn bản của + +39 +00:02:33,200 --> 00:02:35,870 +tôi hiện được căn giữa và bạn có thể + +40 +00:02:36,950 --> 00:02:39,590 +xem nếu tôi chọn H này, bạn có thể + +41 +00:02:39,860 --> 00:02:43,130 +thấy phong cách đó đang được áp dụng ngay tại đây. + +42 +00:02:44,840 --> 00:02:49,840 +Bất kỳ điều gì chúng tôi có thể làm với kiểu nội tuyến mà bạn đã thấy trong các mô-đun CSS + +43 +00:02:49,970 --> 00:02:54,970 +hoặc thay đổi mã thành bất kỳ loại thẻ HTML nào mà chúng tôi có thể thực hiện khi trả lại. + +44 +00:02:55,910 --> 00:03:00,400 +Bây giờ, điều gì sẽ xảy ra nếu bạn muốn hiển thị nhiều hơn một phần tử HTML? Chà, điều đó + +45 +00:03:00,460 --> 00:03:05,020 +cũng có thể xảy ra. Tất cả những gì bạn phải làm là chỉ cần tiếp tục nhập. + +46 +00:03:05,020 --> 00:03:09,220 +Vì vậy, giả sử chúng tôi muốn tạo một thẻ đoạn văn. Chà, chúng ta có thể đơn giản + +47 +00:03:09,250 --> 00:03:11,230 +tạo ra nó như thế này. + +48 +00:03:11,410 --> 00:03:16,210 +Vì vậy, nếu tôi nhấn lưu và làm mới, bạn có thể thấy, đây là chữ + +49 +00:03:16,270 --> 00:03:17,890 +H của tôi và đây + +50 +00:03:18,700 --> 00:03:22,210 +là một đoạn văn và đây là cấu trúc cập nhật của + +51 +00:03:23,860 --> 00:03:28,860 +tệp HTML của tôi bây giờ vì pie charm không thực sự thích bạn đi quá xa + +52 +00:03:29,230 --> 00:03:32,350 +và tạo dòng mã rất dài vì nó khó đọc. + +53 +00:03:32,650 --> 00:03:36,880 +Một trong những thủ thuật đơn giản mà nó có là nếu bạn muốn chia một chuỗi bất kỳ lúc nào, + +54 +00:03:36,880 --> 00:03:39,040 +tất cả những gì bạn phải làm là nhấn enter và + +55 +00:03:39,400 --> 00:03:41,470 +nó sẽ thêm dấu gạch chéo ngược này cho + +56 +00:03:41,770 --> 00:03:45,820 +bạn, về cơ bản nó tương đương với cùng một đoạn mã mà chúng tôi. đã từng có trước đây. + +57 +00:03:46,090 --> 00:03:47,830 +Nhưng bây giờ nó dễ đọc hơn nhiều. + +58 +00:03:48,280 --> 00:03:52,630 +Vì vậy, bạn có thể thêm bao nhiêu dòng HTML tùy thích theo cách này. + +59 +00:03:54,280 --> 00:03:57,490 +Ví dụ, nếu chúng ta muốn thêm một dòng khác, thì + +60 +00:03:57,910 --> 00:04:02,910 +chúng ta sẽ vào bên trong dấu ngoặc kép của đoạn văn. Đánh dấu nhấn enter + +61 +00:04:04,210 --> 00:04:07,870 +để chèn một dòng khác. Và ở đây chúng ta có thể thêm yếu tố hình ảnh của mình. + +62 +00:04:09,160 --> 00:04:13,000 +Phần tử hình ảnh của chúng tôi là một thẻ tự đóng. Chúng tôi không cần thẻ đóng, + +63 +00:04:13,240 --> 00:04:15,010 +nhưng nó cần một nguồn. + +64 +00:04:15,640 --> 00:04:19,120 +Và nguồn này có thể là một hình ảnh mà chúng tôi tìm thấy trên mạng. + +65 +00:04:19,540 --> 00:04:24,100 +Vì vậy, chúng ta hãy xem nếu chúng ta có thể tìm thấy một bức tranh của một con mèo con. + +66 +00:04:24,940 --> 00:04:26,140 +Cái này trông khá ổn. + +67 +00:04:26,170 --> 00:04:29,740 +Hãy tiếp tục và sao chép địa chỉ hình ảnh ở đây bằng cách nhấp chuột phải. + +68 +00:04:30,100 --> 00:04:34,750 +Và sau đó, hãy lấy nó ở đây làm nguồn hình ảnh. Bây giờ, nếu tôi tiếp tục và + +69 +00:04:34,780 --> 00:04:39,190 +nhấn, lưu và quay lại trang web của tôi và tải lại nó, bạn có + +70 +00:04:39,490 --> 00:04:42,220 +thể thấy đó là con mèo nhỏ của tôi. + +71 +00:04:42,970 --> 00:04:47,410 +Bây giờ bạn có thể thêm các thuộc tính khác, làm thẻ hình ảnh. Ví dụ: bạn có thể thay đổi + +72 +00:04:47,470 --> 00:04:52,470 +chiều rộng thành chỉ 200 pixel để nó phù hợp với trang web này tốt hơn một chút + +73 +00:04:52,810 --> 00:04:56,860 +hoặc bạn có thể thao tác với nó theo bất kỳ cách nào bạn muốn. + +74 +00:04:57,610 --> 00:05:02,230 +Bây giờ, điều tuyệt vời về thẻ hình ảnh là chúng tôi cũng có thể thêm quà tặng và nó sẽ được + +75 +00:05:02,320 --> 00:05:04,120 +hiển thị trong trình duyệt của chúng tôi. + +76 +00:05:04,630 --> 00:05:09,490 +Vì vậy, Giphy là một nguồn quà tặng tuyệt vời từ khắp nơi trên internet. + +77 +00:05:09,850 --> 00:05:12,880 +Vì vậy, chúng ta hãy tìm một con mèo con hoạt hình trên anh ta. + +78 +00:05:16,120 --> 00:05:20,770 +Cái này rất dễ thương. Nếu chúng ta đi đến liên kết sao chép và sau + +79 +00:05:21,220 --> 00:05:23,530 +đó sao chép liên kết quà tặng và chúng tôi thay + +80 +00:05:23,560 --> 00:05:28,330 +thế URL này, hiện tại bên trong nguồn bằng URL mới này, thì chúng tôi sẽ kết thúc với món quà của chúng + +81 +00:05:28,750 --> 00:05:33,010 +tôi là được hiển thị dưới dạng hình ảnh. Bây giờ, một điều cần lưu ý + +82 +00:05:33,010 --> 00:05:37,900 +là khi chúng ta đang thay đổi các thuộc tính nguồn này hoặc các thuộc tính kiểu, + +83 +00:05:37,900 --> 00:05:38,733 +thuế chúng + +84 +00:05:38,860 --> 00:05:43,270 +ta đi vào đó sẽ đi vào dưới dạng một chuỗi với dấu ngoặc kép. + +85 +00:05:43,720 --> 00:05:47,200 +Vì vậy, điều này sẽ xung đột với bất kỳ dấu ngoặc kép bên ngoài nào. + +86 +00:05:47,560 --> 00:05:52,560 +Vì vậy, hãy chắc chắn rằng nếu bạn có trả về là một chuỗi được trích dẫn đơn, thì + +87 +00:05:53,590 --> 00:05:56,260 +ở giữa, nếu bạn cần có dấu ngoặc kép, + +88 +00:05:56,500 --> 00:06:00,440 +về cơ bản nó sẽ là dấu ngoặc kép phải đối lập với nhau. + +89 +00:06:01,490 --> 00:06:03,500 +Nếu bạn có dấu ngoặc đơn ở bên ngoài, + +90 +00:06:03,530 --> 00:06:05,750 +thì bạn sẽ sử dụng dấu ngoặc kép ở bên trong. + +91 +00:06:05,990 --> 00:06:07,550 +Nếu bạn đang sử dụng ngược lại, + +92 +00:06:07,580 --> 00:06:10,610 +thì dấu ngoặc kép ở bên ngoài mà nó phải là dấu ngoặc kép + +93 +00:06:10,610 --> 00:06:14,300 +duy nhất trên thông tin chi tiết mà chúng ta hãy nhấn, lưu và xem điều này có + +94 +00:06:14,510 --> 00:06:17,270 +hiệu quả không, hãy quay lại trang chủ của chúng tôi, nhấn làm + +95 +00:06:17,510 --> 00:06:22,510 +mới và bạn có thể thấy có một chú mèo con dễ thương cổ tích đang được hiển thị dưới dạng HTML từ một + +96 +00:06:25,250 --> 00:06:26,083 +máy chủ bình. + +97 +00:06:27,440 --> 00:06:32,180 +Vì vậy, bây giờ chúng tôi đã nâng cấp một trang web hơn một chút. Bây giờ chúng tôi có thể kết xuất HTML. + +98 +00:06:32,210 --> 00:06:36,890 +Chúng tôi có thể đặt một kiểu nội tuyến và chúng tôi có thể thêm các phần tử + +99 +00:06:36,920 --> 00:06:41,600 +HTML vào nội dung trái tim của chúng tôi. Bây giờ trong bài học tiếp theo, tôi có một chút thử thách cho bạn. + +100 +00:06:42,110 --> 00:06:46,670 +Và ý tưởng là để bạn thực hành những gì bạn đã học ngày hôm qua về người trang trí. + +101 +00:06:47,120 --> 00:06:51,560 +Đó là một chủ đề hơi nâng cao, nhưng khi bạn đã quen với nó, + +102 +00:06:51,560 --> 00:06:56,090 +nó thực sự rất, rất tiện dụng. Vì vậy, đối với tất cả những điều đó và nhiều nội dung khác trong bài học tiếp theo, + diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 giphy.com.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 giphy.com.url new file mode 100644 index 0000000000000000000000000000000000000000..ac3701f3759691ca2d72165895bab4a5639040e0 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/003 giphy.com.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://giphy.com/ \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 Challenge Use Python Decorators to Style HTML Tags.mp4 b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 Challenge Use Python Decorators to Style HTML Tags.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..91a5356019674f17955e64592cbfdf40b09e2aaa --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 Challenge Use Python Decorators to Style HTML Tags.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eff4e5b9eceb3a3fc26f09a9174181e21e2f05203e29c3ba967705d9ae682a68 +size 22309117 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 Challenge Use Python Decorators to Style HTML Tags_vi.srt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 Challenge Use Python Decorators to Style HTML Tags_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..2df17fc5ebc7d095ae2679c09954b7e1c7164503 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 Challenge Use Python Decorators to Style HTML Tags_vi.srt @@ -0,0 +1,176 @@ +1 +00:00:00,570 --> 00:00:03,570 +Tất cả các quyền. Vì vậy, trong các bài học ngày hôm + +2 +00:00:03,570 --> 00:00:07,980 +qua mà chúng ta đã nói về trình trang trí Python, và chúng tôi đã thực hiện một số bài tập về vấn đề đó. + +3 +00:00:08,520 --> 00:00:09,000 +Bây giờ, + +4 +00:00:09,000 --> 00:00:11,850 +để kiểm tra kiến thức của bạn và đảm bảo rằng bạn không + +5 +00:00:11,850 --> 00:00:16,710 +quên cách sử dụng nó, tôi có một thách thức cho bạn là áp dụng kiến thức của bạn về trang trí. + +6 +00:00:17,370 --> 00:00:21,240 +Đây là thử thách trong lộ trình này mà tôi đã gặp + +7 +00:00:21,270 --> 00:00:23,550 +ở đây, chỉ là tạm biệt. + +8 +00:00:24,330 --> 00:00:28,860 +Một trong những điều mà chúng ta đã học được trong bài học trước là chúng ta có + +9 +00:00:28,890 --> 00:00:33,450 +thể biến nó thành một phần tử HTML bằng cách chỉ cần quấn nó xung quanh các thẻ HTML. + +10 +00:00:33,870 --> 00:00:34,950 +Vì vậy, ví + +11 +00:00:35,010 --> 00:00:39,090 +dụ: nếu tôi muốn chuyển BI này thành chữ in đậm, bằng cách + +12 +00:00:39,150 --> 00:00:42,210 +đó tôi có thể thêm thẻ B xung quanh nó. + +13 +00:00:42,630 --> 00:00:47,630 +Vì vậy, bây giờ nếu tôi nhấn lưu và tôi đi theo con đường mua đồ trong rừng của mình, thì bạn có + +14 +00:00:48,150 --> 00:00:52,500 +thể thấy dòng chữ này hiện đã được in đậm. Giống như, vì vậy bây giờ tôi + +15 +00:00:54,030 --> 00:00:57,600 +có thể tiếp tục quấn văn bản xung quanh nhiều thẻ hơn. + +16 +00:00:58,140 --> 00:01:02,520 +Nếu tôi muốn rẽ theo chiều cao, thì tôi có thể quấn nó xung quanh một số thẻ nhấn mạnh. + +17 +00:01:02,550 --> 00:01:07,260 +Vì vậy, thẻ EMT, và điều này sẽ làm cho nó trông như thế này. + +18 +00:01:07,680 --> 00:01:08,550 +Và cuối cùng, + +19 +00:01:08,550 --> 00:01:13,550 +tôi cũng có thể gạch chân nó bằng cách bọc nó bên trong thẻ bạn như thế này. + +20 +00:01:15,060 --> 00:01:18,480 +Vì vậy, bây giờ nó được nhấn mạnh và gạch + +21 +00:01:18,540 --> 00:01:23,250 +chân đậm, trông như thế này. Bây giờ, điều tôi muốn làm là tôi + +22 +00:01:23,250 --> 00:01:28,250 +không thực sự muốn thêm tất cả những điều này bằng cách sử dụng chuỗi ký tự vì nó + +23 +00:01:29,370 --> 00:01:33,870 +dễ bị lỗi và có thể mắc lỗi chính tả, và chỉ cần chỉnh sửa hơi khó khăn. + +24 +00:01:34,440 --> 00:01:39,440 +Vì vậy, những gì tôi muốn làm thay vào đó là dưới trình trang trí tuyến đường chấm ứng dụng + +25 +00:01:40,740 --> 00:01:45,740 +đầu tiên, điều quan trọng là xác định tuyến đường để hiển thị những gì trong phương pháp này. + +26 +00:01:46,590 --> 00:01:49,950 +Tôi muốn có thể thêm một số trang trí khác. Ví dụ: giả sử + +27 +00:01:49,950 --> 00:01:54,950 +tôi đã thêm một bộ trang trí mà tôi đã tạo ở đâu đó + +28 +00:01:55,050 --> 00:01:59,760 +trên đó có tên là make bolt. Và nếu tôi nhấn lưu, bạn có thể thấy nó được thực hiện tương tự. + +29 +00:01:59,760 --> 00:02:02,610 +Nó được thêm thẻ B xung quanh văn bản đó. + +30 +00:02:03,090 --> 00:02:06,270 +Tôi cũng có thể thêm một số cái khác mà + +31 +00:02:06,540 --> 00:02:09,870 +tôi đã thực hiện trước đó, như nhấn mạnh và gạch chân. + +32 +00:02:10,380 --> 00:02:14,610 +Vì vậy, bây giờ tôi có thể thêm một loạt các trình trang trí theo chức năng của mình. + +33 +00:02:15,060 --> 00:02:18,810 +Và một khi nó được hiển thị, bạn có thể thấy nó có phần in + +34 +00:02:18,870 --> 00:02:21,810 +đậm, nó có điểm nhấn và có phần gạch chân. + +35 +00:02:22,710 --> 00:02:26,580 +Và điều đó dễ dàng hơn nhiều vì tôi đã có đề xuất tự động từ PI jam. + +36 +00:02:26,910 --> 00:02:30,150 +Và tôi cũng có người trang trí của tôi làm việc trong nền. + +37 +00:02:30,690 --> 00:02:32,220 +Vì vậy, nhiệm vụ của + +38 +00:02:32,310 --> 00:02:36,000 +bạn là đây, nhiệm vụ của bạn là tạo ra ba bộ trang trí + +39 +00:02:36,390 --> 00:02:39,330 +này, mỗi bộ sẽ đạt được hiệu ứng đã đặt tên. + +40 +00:02:39,600 --> 00:02:44,340 +Vì vậy, làm cho văn bản được in đậm, làm cho nhấn mạnh hoặc làm cho một gạch chân. + +41 +00:02:44,850 --> 00:02:47,490 +Vì vậy, đây là một chút sửa đổi và một chút thử thách. + +42 +00:02:47,670 --> 00:02:50,640 +Tôi sẽ cho phép bạn tạm dừng video và hoàn thành thử thách này. + +43 +00:02:51,090 --> 00:02:55,710 +Và trong bài học tiếp theo, tôi sẽ tiết lộ mã giải pháp. Hãy dành 10 phút đó, hãy thử + +44 +00:02:55,770 --> 00:02:58,830 +xem bạn có thể hoàn thành thử thách này không. + diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 SOLUTION.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 SOLUTION.url new file mode 100644 index 0000000000000000000000000000000000000000..0cfcbd7d7151173deca9ce2192d6be0e81864b1d --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/004 SOLUTION.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://gist.github.com/angelabauer/202d58a295c516931a7056c995110596 \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced Decorators with args and kwargs.mp4 b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced Decorators with args and kwargs.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f9fef9244fcde9708225aef1ffe0c5ad5a52a45e --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced Decorators with args and kwargs.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8cb843e8aeb934974201a9a4b895839aa8ac2afb4dc2da37a4e44fd0c10af2e +size 54687569 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced Decorators with args and kwargs_vi.srt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced Decorators with args and kwargs_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ac32b655caca417ee9b4a9a7fb63ac5eaf4660ce --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced Decorators with args and kwargs_vi.srt @@ -0,0 +1,400 @@ +1 +00:00:00,450 --> 00:00:04,500 +Trước đây, chúng ta đã xem xét các hàm trang trí Python đơn giản. + +2 +00:00:05,070 --> 00:00:08,970 +Và lý do tại sao nó đơn giản là vì tất cả những gì chúng ta + +3 +00:00:08,970 --> 00:00:13,350 +đang làm khi gọi hàm trong trình trang trí là chúng ta chỉ đang gọi nó thẳng lên. + +4 +00:00:14,040 --> 00:00:18,480 +Nhưng điều này không tính đến những trường hợp, ví dụ, chúng tôi muốn + +5 +00:00:18,480 --> 00:00:23,480 +thêm một điều kiện trước khi chúng tôi gọi hàm hoặc thậm chí là nâng cao hơn. + +6 +00:00:23,910 --> 00:00:27,510 +Điều gì sẽ xảy ra nếu chúng ta cần gọi hàm với một số loại đầu vào? + +7 +00:00:27,690 --> 00:00:31,860 +Làm thế nào chúng ta có thể nắm bắt được điều đó? Nếu nó ở bên trong một nhà trang trí? + +8 +00:00:32,369 --> 00:00:36,510 +Vì vậy, giả sử rằng chúng ta có một lớp được gọi là người dùng. + +9 +00:00:37,140 --> 00:00:39,090 +Bây giờ, nếu bạn chưa quen với các lớp học, + +10 +00:00:39,150 --> 00:00:43,260 +tôi thực sự khuyên bạn nên quay lại các bài học mà chúng ta đã đề cập đến các lớp học + +11 +00:00:43,260 --> 00:00:45,180 +và Đối tượng một cách rất chi tiết. + +12 +00:00:45,220 --> 00:00:48,960 +Chúng tôi đã làm trong vài ngày chỉ để đảm bảo rằng bạn được cập nhật + +13 +00:00:49,020 --> 00:00:52,830 +thông tin đó trước khi tiếp tục. Nhưng đây là một lớp khá đơn giản. + +14 +00:00:53,130 --> 00:00:56,910 +Tất cả những gì nó làm là nó có hai thuộc tính, một tên, thuộc tính và + +15 +00:00:57,120 --> 00:00:58,890 +nó được đăng nhập vào thuộc tính. + +16 +00:00:59,430 --> 00:01:03,240 +Vì vậy, về cơ bản những gì chúng tôi đang cố gắng mô phỏng là một + +17 +00:01:03,240 --> 00:01:08,240 +điều kiện giả sử chúng tôi có một trang web blog và chúng tôi có các đối tượng người dùng này + +18 +00:01:09,540 --> 00:01:12,660 +và người dùng có tên người dùng và cũng có một số loại + +19 +00:01:12,660 --> 00:01:16,950 +thuộc tính theo dõi xem liệu người dùng có đi vào trang web và chưa đăng nhập, hoặc + +20 +00:01:17,070 --> 00:01:19,110 +nếu tất cả họ đã đăng nhập. + +21 +00:01:20,520 --> 00:01:23,280 +Vì vậy, một số phương pháp nhất định trên trang web, bạn chỉ có thể + +22 +00:01:23,370 --> 00:01:27,840 +đạt được bởi những người dùng đã đăng nhập vào nó. Ví dụ: nếu họ muốn + +23 +00:01:27,840 --> 00:01:30,540 +bạn tạo một bài đăng blog mới, + +24 +00:01:30,540 --> 00:01:33,270 +chúng tôi sẽ kiểm tra người dùng đó. + +25 +00:01:33,660 --> 00:01:38,660 +Và chúng tôi phải đảm bảo rằng họ thực sự đã đăng nhập và xác thực để + +26 +00:01:39,180 --> 00:01:41,310 +tạo một bài đăng blog mới. + +27 +00:01:41,790 --> 00:01:46,790 +Nếu tôi tiếp tục và tạo một người dùng mới từ lớp người dùng, thì tôi có + +28 +00:01:47,580 --> 00:01:50,940 +thể đặt tên cho nó, mà tôi sẽ đặt là Angela. + +29 +00:01:51,540 --> 00:01:56,540 +Và sau đó tôi có thể tạo bài đăng trên blog và chuyển đến người dùng của mình. + +30 +00:01:58,080 --> 00:02:01,710 +Bây giờ, khi tôi nhấn run, bạn sẽ thấy, đây là blog mới của + +31 +00:02:01,740 --> 00:02:04,230 +Angela, bài đăng đang được in ngay tại đây. + +32 +00:02:05,460 --> 00:02:10,050 +Bây giờ điều gì sẽ xảy ra nếu tôi muốn tạo một hàm trang trí có thể được + +33 +00:02:10,050 --> 00:02:14,970 +sử dụng để trang trí bất kỳ chức năng nào trên trang web của chúng tôi yêu cầu xác thực. + +34 +00:02:15,150 --> 00:02:20,150 +Vì vậy, nó yêu cầu rằng người dùng này đã đăng nhập thuộc tính được đặt thành true. + +35 +00:02:22,260 --> 00:02:26,400 +Vì vậy, giả sử rằng tôi đã quyết định tạo chức năng trang trí + +36 +00:02:26,430 --> 00:02:30,600 +của mình ngay tại đây, mà tôi sẽ gọi là trình trang trí được xác thực. + +37 +00:02:32,220 --> 00:02:36,690 +Và điều này tất nhiên sẽ cần lấy một hàm làm đầu vào. + +38 +00:02:37,020 --> 00:02:39,960 +Và bên trong, chúng ta có chức năng wrapper. + +39 +00:02:41,190 --> 00:02:46,110 +Bây giờ bên trong hàm wrapper của chúng ta là nơi chúng ta gọi hàm này. + +40 +00:02:46,110 --> 00:02:48,090 +Đó là quá khứ và ngay tại đây. + +41 +00:02:48,810 --> 00:02:51,660 +Và cuối cùng để hoàn thành trình trang trí của chúng tôi. + +42 +00:02:51,690 --> 00:02:56,690 +Chúng ta phải trả về wrapper dưới dạng một hàm không có dấu ngoặc đơn. + +43 +00:02:57,990 --> 00:03:01,540 +Bây giờ, để kiểm tra xem có được xác thực hay không, + +44 +00:03:01,600 --> 00:03:04,450 +những gì chúng tôi thực sự muốn làm là chúng + +45 +00:03:04,480 --> 00:03:09,480 +tôi muốn nói, tốt, nếu người dùng. được đăng nhập bằng true will trong trường hợp + +46 +00:03:12,040 --> 00:03:16,570 +đó, chúng ta sẽ kích hoạt hàm. Nhưng nếu nó thực sự không đúng, thì chúng ta sẽ + +47 +00:03:16,570 --> 00:03:19,390 +không kích hoạt chức năng này. Bây giờ, vấn đề + +48 +00:03:19,420 --> 00:03:23,080 +duy nhất ở đây là người dùng này không được xác định. + +49 +00:03:23,800 --> 00:03:26,650 +Chúng ta chỉ có thể truyền vào trong hàm, nhưng + +50 +00:03:27,040 --> 00:03:32,040 +nếu chúng ta cần truyền vào một số đối số được liên kết với hàm đó thì sao? + +51 +00:03:33,730 --> 00:03:38,170 +Lưu ý ở đây rằng tất cả chức năng tạo bài đăng trên blog, đó là những gì chúng ta muốn thêm vào. + +52 +00:03:38,170 --> 00:03:42,910 +Người trang trí chấp nhận đầu vào ở dạng của người dùng. Sự vật. + +53 +00:03:43,480 --> 00:03:48,280 +Nếu tôi trang trí chức năng này bằng trình trang trí được xác thực và tôi + +54 +00:03:48,850 --> 00:03:50,830 +đã cố gắng chạy nó, thì + +55 +00:03:51,190 --> 00:03:55,840 +nó sẽ không thực sự hoạt động vì người dùng đó không được xác định. + +56 +00:03:56,440 --> 00:04:01,440 +Và nó cho chúng ta biết rằng hàm wrapper không nhận đối số vị trí, nhưng một + +57 +00:04:03,460 --> 00:04:05,590 +đối số đã được cung cấp. + +58 +00:04:06,220 --> 00:04:09,580 +Và người được đưa ra là người dùng này ngay tại đây, thời + +59 +00:04:10,990 --> 00:04:15,990 +đại này có thể đã là một gợi ý tốt để chúng tôi tìm ra cách khắc phục điều này. + +60 +00:04:17,709 --> 00:04:22,710 +Một trong những điều mà chúng ta đã nói trong các bài học trước là khái niệm + +61 +00:04:22,990 --> 00:04:26,470 +OGs và guốc, các đối số vị trí không giới hạn. + +62 +00:04:26,890 --> 00:04:29,830 +Thông thường, tất cả đều thêm nó vào dưới dạng + +63 +00:04:29,890 --> 00:04:34,890 +asterix, OG và các đối số từ khóa không giới hạn thường được thêm vào dưới dạng hai + +64 +00:04:37,360 --> 00:04:41,380 +Astrix và sau đó là Crocs. Vì vậy, bây giờ chúng ta có thể + +65 +00:04:41,740 --> 00:04:45,130 +có tất cả các chức năng, được trang trí với trang trí này để hoạt động. + +66 +00:04:45,790 --> 00:04:47,590 +Và khi chúng tôi gọi hàm, chúng tôi + +67 +00:04:47,740 --> 00:04:52,740 +có thể cung cấp một số đầu vào và những đầu vào đó có thể được khai thác thông qua các + +68 +00:04:55,390 --> 00:04:57,820 +OG và Crocs này. Bây giờ, trong trường hợp + +69 +00:04:57,850 --> 00:05:02,170 +này, đây là một đối số vị trí và nó là một đối số Vị trí ứng dụng bằng không. + +70 +00:05:02,800 --> 00:05:06,790 +Vì vậy, thay vì sử dụng người dùng này, đó là những gì chúng ta sẽ + +71 +00:05:06,790 --> 00:05:09,910 +làm, nếu chúng ta ở bên trong hàm này, thay vào đó, + +72 +00:05:09,940 --> 00:05:12,400 +chúng ta sẽ sử dụng các OG của trình + +73 +00:05:13,330 --> 00:05:17,260 +bao bọc, và sau đó chúng ta sẽ sử dụng vị trí được đặt thành 0. + +74 +00:05:18,040 --> 00:05:23,040 +Vì vậy, bây giờ chúng ta sẽ xem xét hàm sẽ được thông qua trong đó sẽ + +75 +00:05:24,430 --> 00:05:26,170 +có một số đầu vào. + +76 +00:05:26,740 --> 00:05:31,740 +Và nó sẽ lấy đầu vào vị trí đầu tiên đó và sau đó xem liệu nó được đăng nhập thuộc + +77 +00:05:32,380 --> 00:05:33,970 +tính có bằng true hay không. + +78 +00:05:35,320 --> 00:05:39,760 +Bây giờ trình bao bọc của tôi đang lấy các đối số vị trí và đối số + +79 +00:05:40,120 --> 00:05:45,120 +từ khóa, và tôi có thể khai thác đối số vị trí đầu tiên bằng cách sử dụng Oxy zero. + +80 +00:05:45,700 --> 00:05:48,490 +Bên trong hàm rapt, bây giờ tôi cũng có + +81 +00:05:48,820 --> 00:05:53,820 +thể sử dụng đối số đầu tiên này để cung cấp cho nó làm đầu vào cho + +82 +00:05:54,610 --> 00:05:55,443 +hàm đó. + +83 +00:05:55,630 --> 00:06:00,440 +Hãy nhớ rằng chức năng này chỉ đơn giản là chức năng tạo bài đăng blog này + +84 +00:06:00,440 --> 00:06:04,370 +mà không cần trình trang trí. Bây giờ, nếu tôi tiếp tục và + +85 +00:06:05,240 --> 00:06:10,240 +nhấn run, bạn sẽ thấy rằng không có gì xảy ra trừ khi tôi thay đổi người dùng này đã + +86 +00:06:11,420 --> 00:06:15,740 +đăng nhập thuộc tính bằng. ĐÚNG VẬY. Và bây giờ đó là sự + +87 +00:06:15,890 --> 00:06:18,080 +thật, sau đó nó sẽ được kiểm tra ngay tại đây. + +88 +00:06:18,410 --> 00:06:23,410 +Và sau đó nó sẽ gọi hàm vì người dùng đó hiện đã đăng nhập vào + +89 +00:06:24,740 --> 00:06:28,280 +ý tưởng có thể truyền vào các đối số vị trí, + +90 +00:06:28,340 --> 00:06:30,170 +cũng như các đối số + +91 +00:06:30,500 --> 00:06:34,310 +từ khóa, bằng cách chỉ cần thêm tỷ lệ cược và + +92 +00:06:34,640 --> 00:06:39,640 +quark vào hàm wrapper, rồi sử dụng nó bên trong wrapper hoặc sử dụng nó + +93 +00:06:40,670 --> 00:06:45,110 +để gọi chính hàm là một bước cao hơn về cách hiểu các hàm + +94 +00:06:45,110 --> 00:06:46,340 +của Python, decorator. + +95 +00:06:47,120 --> 00:06:50,420 +Tôi khuyên bạn nên dành vài phút để xem mã + +96 +00:06:50,690 --> 00:06:54,350 +này, mà bạn có thể truy cập tại URL này, nằm trong tài + +97 +00:06:54,830 --> 00:06:59,510 +nguyên khóa học và sau đó cố gắng tạo lại chức năng này từ đầu dựa trên + +98 +00:06:59,510 --> 00:07:03,680 +sự hiểu biết của bạn về những gì chúng ta vừa nói trong bài học + +99 +00:07:03,740 --> 00:07:08,360 +tiếp theo, Tôi có một bài tập viết mã cho bạn để bạn có thể thử + +100 +00:07:08,360 --> 00:07:12,200 +dạng trình trang trí Python nâng cao mới này và thử tự tạo. + diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced-Python-Decorators-Repl.it-Code.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced-Python-Decorators-Repl.it-Code.url new file mode 100644 index 0000000000000000000000000000000000000000..4b0608c9883d93e13307cd2876207b8e999d4945 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Advanced-Python-Decorators-Repl.it-Code.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://repl.it/@appbrewery/python-advanced-decorators#main.py \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Solution-Completed-Code-for-day-55-end.zip b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Solution-Completed-Code-for-day-55-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..a2a81362365b43710bbdf8192024399cb96fe92e --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/005 Solution-Completed-Code-for-day-55-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18d669a4efbf2384537f0f1281d1c3ed43cb9ff95367b823305967a46f92ff82 +size 707 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 Exercise-36.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 Exercise-36.url new file mode 100644 index 0000000000000000000000000000000000000000..80ad4fe098dfd10d3078ad41e504bdeeb0aa3248 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 Exercise-36.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/7a66ccbe-1fc9-428d-bc99-6955e964ea88 \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 How-to-join-Auditorium.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 How-to-join-Auditorium.url new file mode 100644 index 0000000000000000000000000000000000000000..f00fb755eec464b33d8cd0bc0235ac09cc1987b2 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 How-to-join-Auditorium.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 [Interactive Coding Exercise] Advanced Decorators.mp4 b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 [Interactive Coding Exercise] Advanced Decorators.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..83c3c2e1bad18774c50d6dd56d3a1bd8e60a5fd9 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 [Interactive Coding Exercise] Advanced Decorators.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c49cd418c2b2371235a940ee5f54929b474117af606965f1d8c7b8b8f861b2a +size 10999480 diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 [Interactive Coding Exercise] Advanced Decorators_vi.srt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 [Interactive Coding Exercise] Advanced Decorators_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..27ccca3d50973af9d2a27f3d5ce470ff9c9187cb --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/006 [Interactive Coding Exercise] Advanced Decorators_vi.srt @@ -0,0 +1,264 @@ +1 +00:00:01,080 --> 00:00:02,160 +Người hướng dẫn: + +2 +00:00:02,160 --> 00:00:05,790 +Đôi khi trong mã của bạn, bạn có thể cần phải ghi nhật ký. + +3 +00:00:05,790 --> 00:00:07,110 +Trong bài tập mã + +4 +00:00:07,110 --> 00:00:09,110 +này, chúng ta sẽ viết một + +5 +00:00:10,050 --> 00:00:12,120 +log_trang trí và nó sẽ in + +6 +00:00:12,120 --> 00:00:13,860 +tên của hàm được gọi, + +7 +00:00:13,860 --> 00:00:15,570 +các đối số đã được đưa + +8 +00:00:15,570 --> 00:00:19,200 +ra và cả kết quả trả về của hàm đó. + +9 +00:00:19,200 --> 00:00:20,790 +Hãy xem trong khung mô tả và bạn + +10 +00:00:20,790 --> 00:00:23,820 +sẽ thấy ví dụ về những gì chúng tôi muốn kết quả đầu ra trông + +11 +00:00:23,820 --> 00:00:25,080 +như thế nào. + +12 +00:00:25,080 --> 00:00:27,030 +Không thay đổi nội dung của + +13 +00:00:27,030 --> 00:00:30,300 +hàm mà chúng ta đã gọi là a_function trên + +14 +00:00:30,300 --> 00:00:33,390 +dòng tám và chín, hãy tạo một trình trang + +15 +00:00:33,390 --> 00:00:37,860 +trí để trang trí hàm đó và có thể ghi lại những gì bạn thấy + +16 +00:00:37,860 --> 00:00:39,840 +trong kết quả mẫu. + +17 +00:00:39,840 --> 00:00:40,920 +Như trước đây, bạn hãy + +18 +00:00:40,920 --> 00:00:44,200 +nhớ, bạn có thể sử dụng hàm. __name__ để lấy + +19 +00:00:45,270 --> 00:00:46,680 +tên của hàm và + +20 +00:00:46,680 --> 00:00:51,680 +bạn có thể sử dụng các đối số để lấy các đối số. + +21 +00:00:52,410 --> 00:00:57,410 +Vì vậy, hãy tạo công cụ trang trí này, trang trí các chức năng cần thiết + +22 +00:00:57,750 --> 00:01:02,313 +và xem liệu bạn có đạt được kết quả mong muốn hay không. + +23 +00:01:09,840 --> 00:01:13,110 +Điều đầu tiên trước tiên là xác định trình trang + +24 +00:01:13,110 --> 00:01:15,360 +trí của chúng ta và tôi đã gọi nó + +25 +00:01:15,360 --> 00:01:19,170 +là log_trang trí để nhận đầu vào, mà tôi sẽ gọi là fn, + +26 +00:01:19,170 --> 00:01:20,760 +viết tắt của hàm. + +27 +00:01:20,760 --> 00:01:22,460 +Bạn có thể gọi nó là bất cứ điều gì bạn thích. + +28 +00:01:23,850 --> 00:01:26,760 +Vì vậy, tiếp theo, hãy xác định hàm bao bọc của chúng ta. + +29 +00:01:26,760 --> 00:01:30,600 +Nó sẽ lấy các đối số xuất hiện và + +30 +00:01:30,600 --> 00:01:32,730 +sẽ in ra cái mà bạn + +31 +00:01:32,730 --> 00:01:36,270 +đã gọi hàm. tên, sau đó chúng + +32 +00:01:36,270 --> 00:01:39,240 +ta sẽ chèn các đối số đã được + +33 +00:01:39,240 --> 00:01:41,040 +truyền vào. + +34 +00:01:41,040 --> 00:01:45,210 +Bằng cách đó, chúng tôi có thể đăng nhập vào người dùng chức năng nào họ đã + +35 +00:01:45,210 --> 00:01:47,250 +gọi và đối số nào được truyền vào, điều + +36 +00:01:47,250 --> 00:01:49,650 +này đôi khi bạn có thể tưởng tượng để gỡ lỗi + +37 +00:01:49,650 --> 00:01:52,380 +rằng điều này có thể khá hữu ích khi biết. + +38 +00:01:52,380 --> 00:01:54,840 +Tiếp theo, chúng ta nắm được kết quả + +39 +00:01:54,840 --> 00:01:57,810 +của việc chạy hàm đã được trang trí. + +40 +00:01:57,810 --> 00:02:00,436 +Vì vậy, chúng ta có hàm của mình được + +41 +00:02:00,436 --> 00:02:05,436 +truyền vào và chúng ta truyền vào các đối số ở mức 0, một và hai. + +42 +00:02:06,450 --> 00:02:09,060 +Vì vậy, trong trường hợp này, chúng ta chỉ + +43 +00:02:09,060 --> 00:02:13,200 +có các đối số và hãy nhớ rằng khi sử dụng args, chúng ta có thể nhận + +44 +00:02:13,200 --> 00:02:17,220 +được danh sách tất cả các dữ liệu đầu vào được truyền vào hàm. + +45 +00:02:17,220 --> 00:02:19,500 +Vì vậy, trong trường hợp này, chúng ta hãy xem khung nhập liệu. + +46 +00:02:19,500 --> 00:02:21,570 +Chúng ta có thể thấy có ba đầu vào. + +47 +00:02:21,570 --> 00:02:24,000 +Chúng ta lấy các đối số ở vị trí 0, một và + +48 +00:02:24,000 --> 00:02:26,578 +hai, cả ba, chuyển nó qua hàm, bất kỳ hàm + +49 +00:02:26,578 --> 00:02:29,640 +nào chúng ta sẽ trang trí trong tương lai. + +50 +00:02:29,640 --> 00:02:32,790 +Và sau đó chúng ta sẽ thu được kết quả đầu ra mà chúng + +51 +00:02:32,790 --> 00:02:34,920 +ta gán cho biến results. + +52 +00:02:34,920 --> 00:02:37,560 +Sau đó, chúng tôi in nó ra và nói rằng nó trả + +53 +00:02:37,560 --> 00:02:40,440 +về rồi chúng tôi chèn kết quả bằng chuỗi f. + +54 +00:02:40,440 --> 00:02:42,723 +Và cuối cùng, chúng ta trả về hàm bao bọc. + +55 +00:02:43,980 --> 00:02:46,620 +Phần cuối cùng thực sự là trang trí hàm của chúng ta bằng + +56 +00:02:46,620 --> 00:02:49,020 +cách sử dụng log_designator mà chúng ta đã tạo. + +57 +00:02:49,020 --> 00:02:53,640 +Vì vậy, ở dòng 10, chúng ta thêm trình trang trí đó vào a_function + +58 +00:02:53,640 --> 00:02:56,310 +để bây giờ mỗi khi a_function chạy, + +59 +00:02:56,310 --> 00:02:59,140 +nó sẽ chạy log_trang trí và sẽ in ra + +60 +00:03:00,060 --> 00:03:04,500 +hàm nào được gọi, đối số nào được truyền vào và kết quả + +61 +00:03:04,500 --> 00:03:07,593 +nào được trả về. + +62 +00:03:08,490 --> 00:03:10,380 +Và nếu bạn chạy mã như hiện + +63 +00:03:10,380 --> 00:03:13,110 +tại, bạn sẽ thấy kết quả mong đợi. + +64 +00:03:13,110 --> 00:03:16,068 +Nếu bạn có bất kỳ điều gì cần thay đổi hoặc sửa chữa trong + +65 +00:03:16,068 --> 00:03:19,350 +mã hoặc chỉ để kiểm tra, hãy quay lại trang trình bày trước đó và + +66 +00:03:19,350 --> 00:03:21,573 +bạn có thể cập nhật mã của mình nếu cần. + diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/007 Course-Fixes-Report-an-Issue.url b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/007 Final Project - Higher or Lower URLs.html b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/007 Final Project - Higher or Lower URLs.html new file mode 100644 index 0000000000000000000000000000000000000000..a8ea5588312bfd04b66174c9dd54699ebe50756d --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/007 Final Project - Higher or Lower URLs.html @@ -0,0 +1 @@ +

Now it's time to complete the final project of the day, the higher lower game that we created in Day 14, but now with a real website.

1. Create a new project in PyCharm called higher-lower, add a server.py file.

2. Create a new Flask application where the home route displays an <h1> that says "Guess a number between 0 and 9" and display a gif of your choice from giphy.com.

Alternatively use the one I found on Giphy: https://media.giphy.com/media/3o7aCSPqXE5C6T8tBC/giphy.gif

3. Generate a random number between 0 and 9 or any range of numbers of your choice.

4. Create a route that can detect the number entered by the user e.g "URL/3" or "URL/9" and checks that number against the generated random number. If the number is too low, tell the user it's too low, same with too high or if they found the correct number. try to make the <h1> text a different colour for each page.  e.g. If the random number was 5:

3 is too low:

7 is too high:

and 5 is just right:

Here are the GIF URLs I used, but it's way more fun finding your own on giphy.com

High: https://media.giphy.com/media/3o6ZtaO9BZHcOjmErm/giphy.gif

Low: https://media.giphy.com/media/jD4DwBtqPXRXa/giphy.gif

Correct: https://media.giphy.com/media/4T7e4DmcrP9du/giphy.gif


SOLUTION

\ No newline at end of file diff --git a/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/external-links.txt b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..ae318029cb078a03e6e9fa314976bb7c50352b02 --- /dev/null +++ b/part3/55 - Day 55 - Intermediate+ HTML & URL Parsing in Flask and the Higher Lower Game/external-links.txt @@ -0,0 +1,24 @@ + +002 Flask-Docs-Routing +https://flask.palletsprojects.com/en/1.1.x/quickstart/#routing + +002 Flask-Docs-Variable-Rules +https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules + +003 giphy.com +https://giphy.com/ + +004 SOLUTION +https://gist.github.com/angelabauer/202d58a295c516931a7056c995110596 + +005 Advanced-Python-Decorators-Repl.it-Code +https://repl.it/@appbrewery/python-advanced-decorators#main.py + +006 Exercise-36 +https://app.auditorium.ai/lesson/eelyNMYJKXeNJAbjssSEQz0m88XvnhX6/7a66ccbe-1fc9-428d-bc99-6955e964ea88 + +006 How-to-join-Auditorium +https://www.udemy.com/course/100-days-of-code/learn/lecture/40109984 + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/001 Day 56 Goals what you will make by the end of the day.mp4 b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/001 Day 56 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..aff3f1ea10bd69939602bc42c1b41704838e9e00 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/001 Day 56 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59340c66193282a15bcc3f9760893fd2b968f8137f4ef937e0f8784d98433302 +size 7476003 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/001 Day 56 Goals what you will make by the end of the day_vi.srt b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/001 Day 56 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..e7ac50f91176e0c3a38c31a050c4dbb2818186cf --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/001 Day 56 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,88 @@ +1 +00:00:00,090 --> 00:00:00,840 +Xin chào các + +2 +00:00:00,840 --> 00:00:05,840 +bạn và chào mừng đến với ngày thứ 56 của 100 Ngày viết mã. Đó là Angela ở đây và hôm + +3 +00:00:05,970 --> 00:00:10,970 +nay chúng tôi đang tìm hiểu sâu hơn về phát triển web với Flask. + +4 +00:00:12,390 --> 00:00:14,070 +Chúng tôi sẽ đề cập đến + +5 +00:00:14,160 --> 00:00:17,610 +nhiều thứ, bao gồm cách đưa các tệp tĩnh vào trang web của + +6 +00:00:17,940 --> 00:00:20,910 +bạn như hình ảnh cục bộ hoặc video cục bộ, cũng + +7 +00:00:21,360 --> 00:00:26,250 +như cách hiển thị các tệp HTML và CSS. Trước đây, khi chúng tôi nghiên cứu về + +8 +00:00:26,310 --> 00:00:28,350 +thiết kế web và chúng tôi đã + +9 +00:00:28,650 --> 00:00:32,189 +tìm hiểu về cách tạo trang web bằng HTML và CSS, chúng + +10 +00:00:32,490 --> 00:00:37,350 +tôi có thể tạo nó dưới dạng một tệp riêng biệt với cấu trúc và kiểu dáng + +11 +00:00:37,350 --> 00:00:38,220 +phù hợp. + +12 +00:00:38,580 --> 00:00:43,410 +Và chúng tôi muốn áp dụng điều đó ngay bây giờ cho các ứng dụng Flask của chúng tôi. + +13 +00:00:43,980 --> 00:00:46,710 +Và chúng tôi muốn có thể hiển thị + +14 +00:00:46,800 --> 00:00:49,620 +cho người dùng một trang web HTML với kiểu CSS. + +15 +00:00:50,490 --> 00:00:52,470 +Bây giờ vào cuối ngày + +16 +00:00:52,500 --> 00:00:57,500 +hôm nay, chúng tôi sẽ xây dựng một ứng dụng name card cá nhân đẹp. + +17 +00:00:58,470 --> 00:01:03,090 +Đã là thế kỷ 21 và chúng ta không còn phải đưa thẻ tên cho mọi người nữa. + +18 +00:01:03,420 --> 00:01:05,190 +Thay vào đó, bạn có thể tạo một + +19 +00:01:05,400 --> 00:01:09,660 +trang web, đặt tên của bạn trên đó và có tất cả các liên kết đến các trang liên quan mà bạn + +20 +00:01:09,660 --> 00:01:12,120 +cần và để giới thiệu thiết kế đẹp mắt của bạn cũng như + +21 +00:01:12,210 --> 00:01:16,620 +cung cấp cho mọi người thông tin liên hệ của bạn. Đó là mục tiêu cho ngày hôm nay. + +22 +00:01:16,740 --> 00:01:19,200 +Hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Flask-Docs-Rendering-Templates.url b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Flask-Docs-Rendering-Templates.url new file mode 100644 index 0000000000000000000000000000000000000000..9d459137ef8a332401eea64120d9ed7056cfcb90 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Flask-Docs-Rendering-Templates.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates \ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 My-CV-Website-Hosted-on-GitHub.url b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 My-CV-Website-Hosted-on-GitHub.url new file mode 100644 index 0000000000000000000000000000000000000000..e611dad367af39e8d31ebcc6c6e377bd8e287490 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 My-CV-Website-Hosted-on-GitHub.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://angelabauer.github.io/cv/ \ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Rendering HTML Files with Flask.mp4 b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Rendering HTML Files with Flask.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..90d2b51c801f9ad1aae65181dbfb8a2265ba75d5 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Rendering HTML Files with Flask.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d5c061fe6019db3a628e4e498e23af4ad3b64081076b013f035e477c2a501bd +size 50951392 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Rendering HTML Files with Flask_vi.srt b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Rendering HTML Files with Flask_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5c89e6534e3295ebc3e8733b41528880dc09b39e --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/002 Rendering HTML Files with Flask_vi.srt @@ -0,0 +1,472 @@ +1 +00:00:00,230 --> 00:00:04,850 +Bây giờ, điều đầu tiên tôi muốn chỉ cho bạn là cách hiển thị các tệp HTML. + +2 +00:00:05,270 --> 00:00:07,820 +Hãy tiếp tục và tạo một dự án PyCharm mới. + +3 +00:00:07,820 --> 00:00:12,610 +Tôi gọi trang cá nhân của tôi là trang cá nhân, nhưng bạn có thể gọi trang của bạn là gì tùy thích. + +4 +00:00:12,620 --> 00:00:19,730 +Và trong dự án, chúng tôi sẽ tạo một tệp mới, tệp này sẽ là máy chủ Python của chúng tôi, vì vậy tôi sẽ gọi nó + +5 +00:00:19,730 --> 00:00:21,620 +là máy chủ. py. + +6 +00:00:22,700 --> 00:00:29,090 +Và sau đó bên trong máy chủ của chúng tôi. py, chúng ta sẽ trải qua tất cả các giai đoạn xây dựng một máy chủ + +7 +00:00:29,090 --> 00:00:29,930 +bình đơn giản. + +8 +00:00:30,140 --> 00:00:32,810 +Đây có thể là thời điểm tốt để sửa lại cách thực hiện điều đó. + +9 +00:00:32,810 --> 00:00:39,950 +Vì vậy, hãy tiếp tục, tạm dừng video và xem liệu bạn có thể thiết lập một ứng dụng bình đơn giản để phục vụ hay không. + +10 +00:00:39,950 --> 00:00:41,840 +Xin chào thế giới đến với trang chủ. + +11 +00:00:44,350 --> 00:00:44,740 +Được rồi. + +12 +00:00:44,740 --> 00:00:46,240 +Vì vậy, hãy bắt đầu lại từ đầu. + +13 +00:00:46,240 --> 00:00:51,370 +Chúng ta sẽ nhập lớp bình từ ứng dụng bình. + +14 +00:00:51,370 --> 00:00:56,590 +Và như thường lệ, tôi sẽ sử dụng bóng đèn đỏ của mình để cài đặt gói bình. + +15 +00:00:56,830 --> 00:01:03,550 +Bây giờ, khi tôi đã hoàn thành việc đó, tôi sẽ tạo ứng dụng bình của mình bằng cách nói ứng dụng bằng bình. + +16 +00:01:03,550 --> 00:01:11,920 +Và sau đó bên trong phần khởi tạo cho ứng dụng bình của tôi, tôi sẽ đặt tên cho thư mục hiện tại + +17 +00:01:11,920 --> 00:01:12,850 +của mình. + +18 +00:01:13,630 --> 00:01:20,560 +Tiếp theo, chúng ta sẽ sử dụng trình trang trí tuyến đường để nhắm mục tiêu tuyến đường về nhà. + +19 +00:01:20,560 --> 00:01:26,080 +Và khi người dùng truy cập tuyến đường về nhà, chúng tôi sẽ hiển thị trang chủ. + +20 +00:01:26,290 --> 00:01:32,080 +Vì vậy, bên trong định nghĩa này, chúng ta chỉ cần trả về Hello world. + +21 +00:01:32,260 --> 00:01:40,960 +Và cuối cùng, chúng tôi đã sẵn sàng để tiếp tục và kiểm tra xem tên có bằng Main hay không. + +22 +00:01:42,050 --> 00:01:45,770 +Sau đó, trong trường hợp đó, chúng tôi sẽ chạy ứng dụng của mình. + +23 +00:01:46,250 --> 00:01:46,970 +Đó là nó. + +24 +00:01:46,970 --> 00:01:48,530 +Thats tất cả để có nó. + +25 +00:01:48,830 --> 00:01:54,500 +Hãy tiếp tục và chạy ứng dụng này, đây là máy chủ chấm pi của chúng tôi. + +26 +00:01:54,740 --> 00:02:01,040 +Và nếu chúng tôi truy cập URL này, chúng tôi có thể thấy Hello world khi chúng tôi truy cập trang chủ của mình. + +27 +00:02:01,790 --> 00:02:11,360 +Bước tiếp theo là tìm hiểu làm thế nào chúng ta có thể hiển thị một trang web HTML được tạo bên trong một tệp HTML + +28 +00:02:11,360 --> 00:02:17,060 +thay vì chỉ trả về các chuỗi hoặc các bit nhỏ của phần tử HTML. + +29 +00:02:17,480 --> 00:02:23,570 +Hãy vào tệp của chúng ta và tiếp tục tạo một tệp mới. + +30 +00:02:23,840 --> 00:02:29,180 +Bây giờ, lý do tại sao chúng tôi tạo nó như thế này là vì nó sẽ thêm vào tất cả + +31 +00:02:29,180 --> 00:02:32,510 +mã soạn sẵn cần thiết cho một trang web HTML. + +32 +00:02:32,600 --> 00:02:40,250 +Vì vậy, hãy tiếp tục và gọi trang web của chúng tôi là index. html và bạn có thể thấy ngay khi tôi tạo nó, nó được thêm vào loại + +33 +00:02:40,250 --> 00:02:43,560 +tài liệu, nó được thêm vào HTML, phần đầu và phần thân. + +34 +00:02:43,590 --> 00:02:50,190 +Bây giờ, nếu điều này không quen thuộc với bạn, hãy nhớ xem các bài học mà chúng tôi đã trình bày chi tiết về + +35 +00:02:50,220 --> 00:02:51,120 +HTML và CSS. + +36 +00:02:51,150 --> 00:02:54,480 +Nhưng bây giờ tôi sẽ cho rằng tất cả những điều này khá đơn giản. + +37 +00:02:54,930 --> 00:02:59,960 +Bây giờ, điều đầu tiên chúng ta sẽ thay đổi trong trang web mới của mình là tiêu đề. + +38 +00:02:59,970 --> 00:03:03,630 +Vì vậy, tôi sẽ tiếp tục và đặt cho nó một tiêu đề. + +39 +00:03:03,720 --> 00:03:08,040 +Bạn có thể đặt bất cứ thứ gì bạn muốn, nhưng tôi sẽ chỉ đặt tên của chính mình ở đây. + +40 +00:03:08,340 --> 00:03:17,010 +Bây giờ, bên trong phần nội dung, tôi sẽ tạo một H1 và bạn có thể thấy rằng các tệp HTML trên PyCharm có thẻ hoàn + +41 +00:03:17,010 --> 00:03:20,880 +thành mà chúng ta thấy ở đây trong H1 của tôi. + +42 +00:03:20,880 --> 00:03:22,170 +Tôi chỉ định viết thôi. + +43 +00:03:22,200 --> 00:03:23,400 +Tôi là Angela. + +44 +00:03:23,910 --> 00:03:25,380 +Khá đơn giản. + +45 +00:03:25,410 --> 00:03:28,930 +Bây giờ đây là một tệp HTML hoàn chỉnh. + +46 +00:03:28,950 --> 00:03:34,380 +Bây giờ nếu tôi muốn hiển thị cái này thay vì chỉ chào thế giới, tôi sẽ làm như thế nào? + +47 +00:03:34,860 --> 00:03:36,540 +Vâng, làm thế nào để chúng ta tìm ra? + +48 +00:03:36,750 --> 00:03:43,080 +Như mọi khi, đó là tài liệu trong tài liệu về Khởi động nhanh cho bình. + +49 +00:03:43,110 --> 00:03:50,550 +Có một phần về hiển thị mẫu và điều này cho phép chúng tôi hiển thị tệp HTML dưới dạng mẫu. + +50 +00:03:51,030 --> 00:03:52,930 +Tuy nhiên, có một vài yêu cầu. + +51 +00:03:52,950 --> 00:03:58,980 +Điều đầu tiên là hãy nhớ rằng bình là một khung chứ không phải thư viện. + +52 +00:03:58,980 --> 00:04:05,450 +Vì vậy, nó sẽ đặt ra những hạn chế và yêu cầu nhất định đối với mã của bạn để nó thực sự hoạt động. + +53 +00:04:05,460 --> 00:04:11,910 +Và trong trường hợp này, các tệp HTML của chúng tôi, được gọi là mẫu của chúng tôi, phải nằm trong một thư mục + +54 +00:04:11,940 --> 00:04:12,790 +có tên là mẫu. + +55 +00:04:12,810 --> 00:04:16,480 +Đó là nơi mà Flask sẽ tìm kiếm khi chúng tôi cố gắng hiển thị nó. + +56 +00:04:16,500 --> 00:04:18,269 +Vì vậy, trước tiên chúng ta hãy làm điều đó. + +57 +00:04:18,269 --> 00:04:26,820 +Hãy tạo một thư mục mới mà chúng ta sẽ gọi tất cả các mẫu là chữ thường và hãy di chuyển tệp index. html vào thư mục mới + +58 +00:04:26,820 --> 00:04:28,770 +đó. + +59 +00:04:29,400 --> 00:04:30,990 +Vậy là xong. + +60 +00:04:31,530 --> 00:04:37,980 +Điều tiếp theo chúng ta phải làm là nhập phương thức này được gọi là mẫu kết xuất từ mô-đun + +61 +00:04:37,980 --> 00:04:38,690 +bình. + +62 +00:04:38,700 --> 00:04:41,070 +Vì vậy, hãy quay lại máy chủ dot pi của chúng tôi. + +63 +00:04:41,100 --> 00:04:49,230 +Và ngoài việc nhập lớp bình, chúng ta hãy tiếp tục và nhập cả phương thức kết xuất + +64 +00:04:49,230 --> 00:04:49,860 +mẫu. + +65 +00:04:50,340 --> 00:04:57,960 +Điều tiếp theo chúng ta phải làm là thay vì trả về một chuỗi hoặc một chuỗi chứa HTML, chúng ta phải + +66 +00:04:57,960 --> 00:05:06,120 +gọi phương thức này là mẫu kết xuất và chuyển vào tên tệp mà chúng ta có, sau đó nó sẽ được hiển thị vào trang + +67 +00:05:06,120 --> 00:05:08,340 +web của chúng ta . + +68 +00:05:08,460 --> 00:05:10,320 +Vì vậy, hãy tiếp tục và làm điều này. + +69 +00:05:10,320 --> 00:05:17,070 +Hãy xóa Hello world đó đi và thay vào đó, hãy trả về kết quả đầu ra từ phương thức mẫu kết xuất này. + +70 +00:05:17,160 --> 00:05:24,870 +Và bên trong đây, chúng ta sẽ đặt tên của tệp HTML nằm trong thư mục mẫu của chúng ta. + +71 +00:05:24,990 --> 00:05:29,760 +Đó sẽ là HTML chấm chỉ mục bởi vì đó là những gì chúng tôi gọi nó. + +72 +00:05:30,210 --> 00:05:32,800 +Bây giờ hãy tiếp tục và chạy mã của chúng tôi. + +73 +00:05:32,820 --> 00:05:39,540 +Ngoài ra, hãy bật chế độ gỡ lỗi để chế độ này sẽ làm mới và chạy lại máy chủ của chúng ta mỗi khi chúng ta thực + +74 +00:05:39,540 --> 00:05:40,740 +hiện thay đổi. + +75 +00:05:40,860 --> 00:05:45,220 +Vì vậy, hãy chạy lại và bây giờ hãy truy cập trang web của chúng tôi. + +76 +00:05:45,240 --> 00:05:53,940 +Làm mới trang chính và bạn có thể thấy nó hiện có H1 ở đây và trong phần đầu hiện có tiêu đề, đó + +77 +00:05:53,940 --> 00:05:57,360 +là Angela, cũng là tiêu đề của tab. + +78 +00:05:58,140 --> 00:06:04,440 +Hãy tưởng tượng nếu bạn phải nhập tất cả HTML này vào kết quả trả về này dưới dạng một chuỗi. + +79 +00:06:04,440 --> 00:06:05,790 +Nó khá đau. + +80 +00:06:05,790 --> 00:06:10,020 +Nó không có bất kỳ sự trợ giúp nào mà bạn nhận được từ trình soạn thảo của mình. + +81 +00:06:10,830 --> 00:06:12,660 +Bây giờ, đây là một thách thức cho bạn. + +82 +00:06:13,080 --> 00:06:20,100 +Quay trở lại những ngày 41 và 42, chúng tôi đã học về HTML và tạo một số trang web đơn giản. + +83 +00:06:20,130 --> 00:06:27,540 +Bây giờ, điều tôi muốn bạn làm là sử dụng một trong các trang web của riêng bạn hoặc tải xuống trang web + +84 +00:06:27,540 --> 00:06:34,890 +rất cơ bản của tôi từ tài nguyên bài học này, sau đó truy cập liên kết trên trang GitHub của bạn hoặc tìm + +85 +00:06:35,100 --> 00:06:38,820 +tệp HTML gốc và tôi muốn bạn tiếp tục và nắm lấy nó. + +86 +00:06:38,820 --> 00:06:41,430 +Vì vậy, nếu nó có trên GitHub thì bạn có thể tiếp tục và. + +87 +00:06:41,920 --> 00:06:46,780 +Lưu dưới dạng và lưu trang web này vào các bản tải xuống của bạn. + +88 +00:06:47,560 --> 00:06:52,840 +Bây giờ, nếu nó được lưu dưới dạng tệp HTML ở đâu đó trên hệ thống của bạn, điều đó cũng tốt. + +89 +00:06:53,440 --> 00:06:58,870 +Nhưng về cơ bản, những gì chúng tôi muốn làm là chúng tôi muốn lấy tệp này, đây là tệp HTML. + +90 +00:07:00,290 --> 00:07:03,500 +Và chúng tôi muốn chuyển nó vào các mẫu của chúng tôi. + +91 +00:07:03,740 --> 00:07:09,020 +Bây giờ, một trong những điều mà bạn sẽ nhận thấy là nếu bạn đã tải xuống tệp này từ Internet, + +92 +00:07:09,020 --> 00:07:15,050 +thì bạn có thể phải đổi tên tệp vì thứ nhất, nó rất dài và chúng tôi không muốn phải nhập tệp đó vào mã của + +93 +00:07:15,050 --> 00:07:15,730 +mình. + +94 +00:07:15,740 --> 00:07:18,020 +Vì vậy, tôi sẽ rút ngắn tên thành Angela. + +95 +00:07:18,020 --> 00:07:23,770 +Và cuối cùng, bạn có thể thấy phần mở rộng của tệp, ít nhất là khi nó tắt GitHub là dấu chấm HTML. + +96 +00:07:23,960 --> 00:07:30,260 +Và lý do cho điều này là do một số máy chủ không chấp nhận phần mở rộng tệp bốn chữ cái, nhưng + +97 +00:07:30,260 --> 00:07:33,250 +nó hoàn toàn giống với HTML dấu chấm. + +98 +00:07:33,260 --> 00:07:38,360 +Vì vậy, chúng tôi sẽ thay đổi nó thành HTML dấu chấm và sau đó chúng tôi sẽ cấu trúc lại nó. + +99 +00:07:38,450 --> 00:07:46,280 +Vì vậy, bây giờ chúng tôi đã nắm giữ trang HTML này, chúng tôi sẽ thử và hiển thị nó thay vì chỉ mục. html. + +100 +00:07:46,430 --> 00:07:50,510 +Tạm dừng video và xem liệu bạn có thể hoàn thành thử thách này không. + +101 +00:07:53,030 --> 00:07:53,450 +Được rồi. + +102 +00:07:53,450 --> 00:07:55,120 +Điều đó khá đơn giản. + +103 +00:07:55,130 --> 00:08:02,200 +Tất cả những gì chúng ta phải làm chỉ là thay thế tệp index. html sang tệp mới, đó là Angela dot HTML. + +104 +00:08:02,210 --> 00:08:09,500 +Và nếu tệp đó nằm trong một thư mục, chẳng hạn, nếu chúng tôi có một thư mục con bên trong một mẫu mà chúng tôi gọi + +105 +00:08:09,620 --> 00:08:16,010 +là, tôi không biết, CV và chúng tôi có cái này bên trong đây, thì chúng tôi sẽ phải chỉ định tệp đó trong + +106 +00:08:16,010 --> 00:08:17,360 +tệp con đường. + +107 +00:08:17,360 --> 00:08:24,590 +Nếu chúng tôi chỉ có nó ở cấp cao nhất của thư mục mẫu, thì nó đơn giản như những gì chúng tôi đã làm với + +108 +00:08:24,590 --> 00:08:25,910 +chỉ mục. html. + +109 +00:08:26,210 --> 00:08:33,320 +Vì vậy, bây giờ trong khi máy chủ của chúng tôi đang chạy ở chế độ gỡ lỗi, chúng tôi có thể tiếp tục và nhấn lưu trên trang web này + +110 +00:08:33,320 --> 00:08:35,870 +và nó sẽ khởi động lại máy chủ của chúng tôi. + +111 +00:08:36,049 --> 00:08:45,020 +Và bây giờ nếu chúng tôi quay lại trang chủ chính của mình và tải lại trang web, bạn có thể thấy nó hiện đang hiển thị + +112 +00:08:45,020 --> 00:08:49,220 +trang cá nhân của chúng tôi với chỉ một ngoại lệ. + +113 +00:08:49,250 --> 00:08:52,410 +Điều gì đã xảy ra với ảnh đại diện này? + +114 +00:08:52,410 --> 00:08:54,360 +Nó trông khá hỏng. + +115 +00:08:54,540 --> 00:08:55,170 +Hiện nay. + +116 +00:08:55,170 --> 00:09:01,050 +Để có thể hiển thị hình ảnh tĩnh, chúng ta sẽ phải học cách hiển thị các tệp tĩnh + +117 +00:09:01,050 --> 00:09:03,210 +như hình ảnh như thế này. + +118 +00:09:03,240 --> 00:09:05,700 +Đó là những gì chúng ta sẽ làm trong bài học tiếp theo. + diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/003 Serving Static Files using Flask.mp4 b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/003 Serving Static Files using Flask.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e1cde55858c5bae7d565d26274e74e4bc54c4623 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/003 Serving Static Files using Flask.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:335a042c72823af581d6a8ebf2fab64259692c57292d3867d85b3feaa83594c2 +size 77324918 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/003 Serving Static Files using Flask_vi.srt b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/003 Serving Static Files using Flask_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cf545d035299db5801d1376ae1b4389904dbae9b --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/003 Serving Static Files using Flask_vi.srt @@ -0,0 +1,504 @@ +1 +00:00:00,390 --> 00:00:05,390 +Như chúng ta đã thấy trước đây khi hiển thị trang HTML của CV, + +2 +00:00:06,360 --> 00:00:11,360 +một trong những thành phần là thẻ hình ảnh và nó có một tệp + +3 +00:00:11,910 --> 00:00:16,079 +hình ảnh cần hiển thị. Nhưng nó trông khá hỏng khi chúng tôi hiển thị HTML. + +4 +00:00:17,040 --> 00:00:19,830 +Vì vậy, nếu chúng ta tiếp tục và mở công cụ dành + +5 +00:00:20,310 --> 00:00:24,180 +cho nhà phát triển Chrome ở chế độ xem, công cụ dành cho nhà phát triển và + +6 +00:00:24,630 --> 00:00:26,190 +nhà phát triển, thì nếu chúng ta + +7 +00:00:26,280 --> 00:00:30,690 +vào bảng điều khiển, bạn sẽ thấy rằng chúng ta thực sự gặp một loạt lỗi 404 và chúng + +8 +00:00:30,690 --> 00:00:35,130 +liên quan đến các kiểu. tệp css cũng như angela. tệp png. + +9 +00:00:35,610 --> 00:00:37,710 +Đó là những gì điều này đang đề cập đến. + +10 +00:00:39,570 --> 00:00:40,920 +Và bạn thực sự + +11 +00:00:40,920 --> 00:00:45,920 +có thể thấy chúng tôi cũng gặp các lỗi 404 tương tự khi chúng tôi xem nhật ký + +12 +00:00:46,200 --> 00:00:50,520 +gỡ lỗi đăng nhập ở đây. Vì vậy, về cơ bản chúng tôi đang thiếu một số thứ. Trước hết, hãy xem liệu chúng ta + +13 +00:00:50,550 --> 00:00:51,990 +có thể khôi phục được nó không. + +14 +00:00:52,530 --> 00:00:56,460 +Chúng ta có thể tiếp tục và lưu hình ảnh này từ trang web mà + +15 +00:00:56,790 --> 00:00:59,550 +tôi sẽ gọi là angela. png. + +16 +00:00:59,940 --> 00:01:03,960 +Và sau đó chúng ta có thể kéo hình ảnh này vào trang cá nhân của mình. + +17 +00:01:06,870 --> 00:01:09,930 +Và nó ở ngay đó. Bây giờ, trong trường hợp của + +18 +00:01:09,960 --> 00:01:12,600 +tôi, hình ảnh của tôi thực sự là một hình tròn mà + +19 +00:01:12,960 --> 00:01:15,210 +tôi đã chỉnh sửa trong Photoshop, nhưng bạn có + +20 +00:01:15,270 --> 00:01:18,180 +thể chỉ có một hình vuông và nó không quan trọng chút nào. + +21 +00:01:19,050 --> 00:01:22,380 +Bây giờ chúng tôi đã có hình ảnh bên trong dự án của mình, làm + +22 +00:01:22,650 --> 00:01:27,650 +cách nào để chúng tôi đảm bảo rằng hình ảnh đó thực sự được hiển thị trong trang web HTML của chúng tôi? + +23 +00:01:30,330 --> 00:01:35,330 +Bởi vì đây là thẻ hình ảnh và nó đang tìm kiếm bên trong các tệp + +24 +00:01:36,570 --> 00:01:41,460 +trang cá nhân của Angela cho angela. png, không phải là những gì chúng ta có ở đây. + +25 +00:01:42,030 --> 00:01:46,470 +Trên thực tế, nếu chúng ta đã chuyển tệp PNG này vào cùng một thư mục để chúng ở + +26 +00:01:46,470 --> 00:01:51,120 +trên cùng một hệ thống phân cấp, về cơ bản bên trong cùng một thư mục, thì chúng ta có + +27 +00:01:51,630 --> 00:01:56,280 +thể chỉ cần thay đổi tệp này thành angela. png. + +28 +00:01:56,700 --> 00:02:01,700 +Nếu tôi tiếp tục và khởi động lại và chạy lại máy chủ của mình sau khi tôi đã thêm tất cả các + +29 +00:02:02,010 --> 00:02:06,150 +tệp này và tôi truy cập trang web cá nhân của mình và nhấn tải lại, bạn sẽ + +30 +00:02:06,480 --> 00:02:10,979 +thấy rằng vẫn không có ảnh. Vậy tại sao lại như vậy? Vâng, trở lại + +31 +00:02:11,039 --> 00:02:13,050 +tài liệu Flask, chúng ta đi. + +32 +00:02:13,710 --> 00:02:17,940 +Lý do là vì, giống như các mẫu của chúng tôi phải nằm trong một thư + +33 +00:02:17,970 --> 00:02:21,840 +mục được gọi là mẫu, Flask sẽ tìm kiếm tất cả các tệp tĩnh + +34 +00:02:21,840 --> 00:02:26,840 +của bạn như hình ảnh hoặc tệp CSS của bạn bên trong một thư mục được gọi là tĩnh. + +35 +00:02:27,780 --> 00:02:31,410 +Vì vậy, bạn phải đặt nó bên trong một thư mục được gọi là tĩnh. + +36 +00:02:32,280 --> 00:02:36,450 +Họ tạo ra khuôn khổ, họ đưa ra các quy tắc. Vì vậy, bên trong dự án my-personal-site + +37 +00:02:36,480 --> 00:02:41,480 +của chúng ta, hãy tạo một thư mục mới có tên là tĩnh và hãy di chuyển hình + +38 +00:02:42,030 --> 00:02:44,610 +ảnh của chúng ta vào thư mục tĩnh đó. + +39 +00:02:46,170 --> 00:02:51,120 +Bây giờ bên trong angela của chúng tôi. html, khi chúng ta muốn trỏ đến hình ảnh + +40 +00:02:51,630 --> 00:02:56,630 +đó, thì đường dẫn sẽ là tĩnh / tên của tệp bên trong thư mục đó, trong trường + +41 +00:02:57,870 --> 00:03:02,170 +hợp của tôi là angela. png. Bây giờ, nếu tôi + +42 +00:03:02,170 --> 00:03:05,440 +tiếp tục và chạy lại ứng dụng của mình, sau + +43 +00:03:05,800 --> 00:03:09,100 +đó quay lại trang chủ và làm mới, bạn sẽ + +44 +00:03:09,370 --> 00:03:12,160 +thấy hình ảnh đó đang được hiển thị. + +45 +00:03:13,600 --> 00:03:18,010 +Nó có thể nhìn vào bên trong thư mục tĩnh và tìm thấy hình ảnh đó. + +46 +00:03:19,900 --> 00:03:23,470 +Bất cứ khi nào bạn tạo một ứng dụng Flask, 9 trong số + +47 +00:03:23,500 --> 00:03:27,100 +10 lần bạn sẽ cần tạo nó với thư mục mẫu và thư mục tĩnh. + +48 +00:03:27,490 --> 00:03:31,570 +Và bạn đặt tất cả các tệp tĩnh như tệp CSS hoặc hình ảnh hoặc video + +49 +00:03:31,570 --> 00:03:33,700 +của bạn bên trong thư mục đó và + +50 +00:03:33,970 --> 00:03:37,030 +đường dẫn tệp của bạn có liên quan đến thư mục đó. + +51 +00:03:37,750 --> 00:03:40,000 +Và sau đó khi bạn tạo các mẫu HTML của + +52 +00:03:40,030 --> 00:03:42,400 +mình, bạn sẽ đặt nó vào bên trong thư mục mẫu. + +53 +00:03:43,420 --> 00:03:45,640 +Bây giờ quay trở lại dự án của tôi, + +54 +00:03:46,000 --> 00:03:49,960 +tôi sẽ xóa tất cả các tệp bổ sung mà chúng tôi vừa tạo trong bản demo. + +55 +00:03:50,550 --> 00:03:51,383 +1: Đúng. + +56 +00:03:55,770 --> 00:03:59,880 +0: Và bây giờ tôi chỉ nên kết thúc với chỉ mục của mình. html là trang web đơn giản + +57 +00:04:00,120 --> 00:04:03,270 +của chúng tôi. Bây giờ, lý do + +58 +00:04:03,300 --> 00:04:07,170 +tại sao tôi muốn đơn giản hóa nó là để bạn thực + +59 +00:04:07,170 --> 00:04:08,850 +sự hiểu mọi thứ từ đầu. + +60 +00:04:09,450 --> 00:04:14,450 +Và thử thách mà tôi dành cho bạn là hãy tiếp tục và tạo một biểu định kiểu CSS, + +61 +00:04:16,529 --> 00:04:18,510 +sau đó sử dụng biểu định kiểu + +62 +00:04:18,839 --> 00:04:23,840 +để thay đổi nền của nội dung chỉ mục này. trang web html sang màu tím. + +63 +00:04:26,190 --> 00:04:29,850 +Đó là mục tiêu. Bạn sẽ phải thay đổi máy chủ. py, bạn sẽ + +64 +00:04:30,330 --> 00:04:33,150 +phải thay đổi chỉ mục. html và bạn + +65 +00:04:33,540 --> 00:04:35,850 +sẽ phải tạo một tệp CSS. + +66 +00:04:36,480 --> 00:04:39,570 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +67 +00:04:40,020 --> 00:04:40,853 +1: Đúng. + +68 +00:04:43,680 --> 00:04:47,820 +0: Được rồi. Điều đầu tiên chúng ta sẽ làm là tạo một tệp CSS. + +69 +00:04:48,330 --> 00:04:50,880 +Đó sẽ là một tệp tĩnh. + +70 +00:04:51,390 --> 00:04:53,670 +Chúng tôi sẽ tạo nó bên trong thư mục tĩnh. + +71 +00:04:54,360 --> 00:04:57,750 +Vì vậy, tôi sẽ gọi nó là phong cách. css và bây giờ tôi + +72 +00:04:59,580 --> 00:05:04,580 +sẽ tiếp tục nhắm mục tiêu phần nội dung trang web của mình vào thẻ nội + +73 +00:05:07,680 --> 00:05:12,120 +dung, sau đó tôi sẽ thay đổi màu nền thành màu tím như + +74 +00:05:13,770 --> 00:05:14,490 +thế này. + +75 +00:05:14,490 --> 00:05:19,490 +Vì vậy, mã CSS rất đơn giản ở đây. Bây giờ khi nó chạy sẽ nhắm mục tiêu thẻ body này về + +76 +00:05:22,140 --> 00:05:24,720 +cơ bản là phần nội dung của trang web của chúng tôi và + +77 +00:05:24,810 --> 00:05:28,560 +hy vọng nó sẽ chuyển sang màu tím nền. Bây giờ, để CSS đó + +78 +00:05:28,620 --> 00:05:30,630 +hoạt động, chúng ta sẽ phải thêm + +79 +00:05:30,690 --> 00:05:35,340 +nó vào phần đầu của tệp HTML giống như chúng ta đã làm hàng nghìn + +80 +00:05:35,340 --> 00:05:39,660 +lần trước đây khi chúng ta học các bài học về CSS và HTML. + +81 +00:05:40,620 --> 00:05:43,710 +Để thêm điều đó vào, chúng tôi sẽ tạo một phần tử liên + +82 +00:05:44,160 --> 00:05:47,670 +kết sẽ có mối quan hệ. Bây giờ, mối + +83 +00:05:47,700 --> 00:05:50,820 +quan hệ sẽ trở thành một bảng kiểu. + +84 +00:05:50,970 --> 00:05:55,530 +Vì vậy, về cơ bản nó nói với tệp HTML rằng liên kết này trỏ đến một biểu định kiểu. + +85 +00:05:55,980 --> 00:06:00,980 +Và sau đó href của style sheet sẽ nằm bên trong static + +86 +00:06:01,370 --> 00:06:03,170 +/ styles. css. + +87 +00:06:04,190 --> 00:06:09,170 +Bây giờ, hãy tiếp tục và lưu cả hai tệp này và quay lại máy chủ của chúng tôi và đảm bảo rằng + +88 +00:06:09,170 --> 00:06:14,120 +chúng tôi đang hiển thị mẫu HTML đó là chỉ mục. html. + +89 +00:06:14,930 --> 00:06:19,930 +Và bây giờ nếu chúng ta tiếp tục, dừng và khởi động lại dự án này để nó tính + +90 +00:06:21,080 --> 00:06:25,190 +đến tất cả các tệp mới, sau đó chúng ta truy cập trang chủ của + +91 +00:06:25,430 --> 00:06:29,630 +mình, hy vọng nó sẽ hiển thị cho bạn một trang có nền màu tím như + +92 +00:06:29,990 --> 00:06:32,420 +bạn thấy ở đây. Bây giờ, một trong những + +93 +00:06:32,420 --> 00:06:37,280 +điều bạn phải cẩn thận về Chrome là nó thích lưu vào bộ nhớ cache các tệp tĩnh + +94 +00:06:37,580 --> 00:06:40,190 +của bạn. Vì vậy, điều này có nghĩa là gì? Vâng, chúng ta + +95 +00:06:40,640 --> 00:06:44,420 +hãy quay trở lại các phong cách. css và tôi sẽ thay đổi màu + +96 +00:06:44,420 --> 00:06:47,870 +nền đó thành màu đỏ. Bây giờ tôi sẽ nhấn lưu tệp này. + +97 +00:06:48,140 --> 00:06:51,290 +Tôi thậm chí sẽ dừng và chạy lại tệp của mình, nhưng + +98 +00:06:51,620 --> 00:06:55,130 +bạn có thể thấy nếu tôi làm mới trang này, nó vẫn có màu tím. + +99 +00:06:55,760 --> 00:07:00,760 +Và nếu tôi đi vào các công cụ dành cho nhà phát triển Chrome và chúng tôi xem xét + +100 +00:07:02,510 --> 00:07:07,310 +các yếu tố của chúng tôi, bạn có thể thấy rằng phần nội dung vẫn có CSS nói + +101 +00:07:07,310 --> 00:07:11,660 +rằng màu nền phải là màu tím. Nếu chúng ta đi đến các nguồn bên trong thư mục tĩnh, sẽ có + +102 +00:07:11,720 --> 00:07:14,290 +các kiểu của chúng ta. css. Và bạn có thể + +103 +00:07:14,300 --> 00:07:18,500 +thấy đây là phiên bản cũ hơn của style sheet của chúng tôi. Vì vậy những gì đang xảy ra? + +104 +00:07:18,590 --> 00:07:22,970 +Có phải vì chúng tôi không lưu thay đổi này không? Không, chúng tôi chắc chắn đã cứu nó. + +105 +00:07:23,570 --> 00:07:28,400 +Điều thực sự đang xảy ra là để tiết kiệm việc sử dụng internet của bạn, + +106 +00:07:28,700 --> 00:07:33,700 +Chrome thích lưu vào bộ nhớ cache các biểu định kiểu và các tệp tĩnh khác, vì + +107 +00:07:34,310 --> 00:07:35,960 +vậy hình ảnh hoặc JavaScript. + +108 +00:07:36,530 --> 00:07:39,770 +và lý do tại sao nó làm được như vậy là vì khi bạn truy + +109 +00:07:40,130 --> 00:07:41,990 +cập một trang web, nếu bạn đang truy + +110 +00:07:42,290 --> 00:07:45,200 +cập vào cùng một ngày, các tệp tĩnh này khó có thể thay đổi. + +111 +00:07:45,530 --> 00:07:50,530 +Một trang web không có khả năng cập nhật CSS hoặc hình ảnh của họ trong một ngày. + +112 +00:07:51,470 --> 00:07:54,380 +Vì vậy, khi trình duyệt tải xuống, nó + +113 +00:07:54,620 --> 00:07:56,990 +sẽ giữ các tệp tĩnh đó. + +114 +00:07:57,350 --> 00:08:01,910 +Điều này chỉ có nghĩa là bạn không phải tiếp tục tải xuống các tệp lớn này mỗi + +115 +00:08:01,910 --> 00:08:04,340 +khi bạn truy cập vào cùng một trang web. + +116 +00:08:05,090 --> 00:08:10,090 +Điều đó thật tốt nếu chúng ta thực sự đang truy cập vào một trang web trực tiếp thực sự. + +117 +00:08:11,120 --> 00:08:14,330 +Nhưng khi chúng tôi đang thử nghiệm, nó hơi khó hiểu. + +118 +00:08:14,900 --> 00:08:19,610 +Vì vậy, một trong những điều bạn phải làm là bạn phải tải lại Chrome. + +119 +00:08:20,330 --> 00:08:25,330 +Và bạn có thể làm điều đó bằng cách giữ phím shift và nhấp vào nút làm + +120 +00:08:25,850 --> 00:08:29,450 +mới này, thao tác này sẽ thực hiện tải lại cứng. + +121 +00:08:29,660 --> 00:08:34,220 +Và nó sẽ loại bỏ tất cả các tệp đã lưu trong bộ nhớ cache và lấy bất kỳ tệp mới nào vào. + +122 +00:08:34,970 --> 00:08:39,970 +Vì vậy, bây giờ nền chuyển sang màu đỏ. Và chúng tôi có thể xác nhận điều đó bằng ... hãy thay đổi điều này + +123 +00:08:40,309 --> 00:08:44,930 +thành màu xanh lam nhấn lưu trên tệp đó, giữ phím shift, tải lại và chúng + +124 +00:08:45,050 --> 00:08:47,450 +tôi nhận được cập nhật nền màu xanh lam. + +125 +00:08:48,590 --> 00:08:52,640 +Vì vậy, đó chỉ là điều cần cẩn thận khi bạn thấy rằng các tệp CSS hoặc + +126 +00:08:52,640 --> 00:08:56,300 +các tệp tĩnh khác của bạn không bị thay đổi hoặc không được hiển thị. + diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 HTML5-UP-Website-Templates.url b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 HTML5-UP-Website-Templates.url new file mode 100644 index 0000000000000000000000000000000000000000..8ad5ac6261ccf3c79b87d998d2da5b1783b68ef1 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 HTML5-UP-Website-Templates.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://html5up.net/ \ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 How to Use Website Templates to Speed Up Web Development.mp4 b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 How to Use Website Templates to Speed Up Web Development.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b5d2e118acfb0f3fe12ab09fea40a43bf9d7cc43 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 How to Use Website Templates to Speed Up Web Development.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:081fd2bf0387fb4f4dd549b227b88d36bf7804cb94238a37f171d2cef1f04cfb +size 227423172 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 How to Use Website Templates to Speed Up Web Development_vi.srt b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 How to Use Website Templates to Speed Up Web Development_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..b7791ee9a86878e42754402222eca5afbad62174 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 How to Use Website Templates to Speed Up Web Development_vi.srt @@ -0,0 +1,764 @@ +1 +00:00:00,420 --> 00:00:00,990 +Được rồi, các + +2 +00:00:00,990 --> 00:00:04,890 +bạn, đã đến lúc cho một thử thách khác để xem lại những gì chúng ta đã học trong bài học trước. + +3 +00:00:05,520 --> 00:00:10,520 +Quay lại thời điểm chúng tôi học CSS vào những ngày 43 và 44, dự án cuối cùng mà chúng + +4 +00:00:12,060 --> 00:00:15,990 +tôi tạo ra là một trang web cá nhân trông giống như thế này. + +5 +00:00:15,990 --> 00:00:19,890 +Nó được thiết kế đẹp mắt với kiểu CSS, hình ảnh, + +6 +00:00:20,220 --> 00:00:24,480 +gif và hơn thế nữa. Bây giờ, những gì tôi muốn bạn + +7 +00:00:24,480 --> 00:00:29,480 +làm là lấy phiên bản của trang web cá nhân này và chạy nó với + +8 +00:00:29,940 --> 00:00:33,930 +máy chủ Python của bạn. Và trong quá trình này, bạn sẽ xem + +9 +00:00:33,960 --> 00:00:37,170 +lại những gì bạn đã học được về cách hiển thị tệp HTML + +10 +00:00:37,560 --> 00:00:39,510 +cũng như cung cấp tệp tĩnh. + +11 +00:00:40,470 --> 00:00:43,860 +Hy vọng rằng bạn đã có tất cả các tệp của mình nằm ở đâu đó trong máy tính của mình. + +12 +00:00:44,340 --> 00:00:45,240 +Nếu không, bạn + +13 +00:00:45,330 --> 00:00:50,010 +có thể tiếp tục và truy cập tài nguyên khóa học mà tôi đã bao gồm một + +14 +00:00:50,010 --> 00:00:53,940 +liên kết để tải xuống tất cả các tệp này dưới dạng tệp zip. + +15 +00:00:54,810 --> 00:00:57,630 +Khi bạn đã giải nén tệp zip đó, + +16 +00:00:57,660 --> 00:01:01,020 +bạn sẽ thấy một thư mục giống như thế này. + +17 +00:01:01,050 --> 00:01:05,880 +Chúng tôi có biểu tượng yêu thích của chúng tôi, thư mục CSS của chúng tôi với các phong cách của chúng tôi. css, thư mục hình ảnh của chúng + +18 +00:01:06,270 --> 00:01:09,000 +tôi với tất cả bốn hình ảnh và + +19 +00:01:09,420 --> 00:01:14,420 +bạn muốn di chuyển các tệp này đến các vị trí tương ứng bên trong trang + +20 +00:01:14,520 --> 00:01:15,353 +cá nhân. + +21 +00:01:15,360 --> 00:01:20,360 +Hãy tiếp tục và xóa chỉ mục. html và các kiểu. css và xem liệu bạn + +22 +00:01:20,850 --> 00:01:25,850 +có thể sử dụng các tệp mà bạn có ở đây để hiển thị nó bằng máy + +23 +00:01:27,360 --> 00:01:30,960 +chủ Python của bạn hay không. Tạm dừng video và tiếp tục. + +24 +00:01:31,130 --> 00:01:31,963 +1: Được rồi. + +25 +00:01:35,510 --> 00:01:35,780 +0: Được rồi. + +26 +00:01:35,780 --> 00:01:40,760 +Vì vậy, điều đầu tiên chúng ta cần làm là di chuyển các tệp ở đây đến vị + +27 +00:01:40,790 --> 00:01:45,470 +trí tương ứng của chúng. Chỉ số. html sẽ đi vào bên trong + +28 +00:01:46,040 --> 00:01:49,730 +thư mục mẫu, nhưng hầu hết mọi thứ khác sẽ đi vào bên trong thư mục tĩnh. + +29 +00:01:49,970 --> 00:01:54,230 +Vì vậy, bao gồm CSS, biểu tượng yêu thích, cũng như thư mục hình ảnh. + +30 +00:01:57,650 --> 00:01:59,810 +Bây giờ chúng tôi đã chuyển mọi thứ vào đây, thực ra chúng tôi + +31 +00:02:00,500 --> 00:02:04,100 +không cần phải làm gì bên trong máy chủ của mình. py bởi vì nó vẫn đang cố gắng + +32 +00:02:04,130 --> 00:02:08,449 +hiển thị một trang web được gọi là chỉ mục. html, trong trường hợp của chúng tôi, nó vẫn + +33 +00:02:08,780 --> 00:02:13,370 +được gọi là chỉ mục. html. Bây giờ, thứ mà chúng ta + +34 +00:02:13,430 --> 00:02:17,840 +phải thay đổi là bên trong chỉ mục của chúng ta. html nó hướng thẳng đến + +35 +00:02:18,140 --> 00:02:22,460 +css / styles. css và cả biểu tượng + +36 +00:02:22,820 --> 00:02:26,600 +yêu thích, nó trỏ thẳng đến tệp biểu tượng yêu thích. + +37 +00:02:26,960 --> 00:02:31,280 +Những gì chúng ta cần làm là lưu ý rằng nó hiện đang sống bên trong một thư mục + +38 +00:02:31,340 --> 00:02:32,390 +được gọi là tĩnh. + +39 +00:02:33,590 --> 00:02:38,060 +Vì vậy, chúng tôi sẽ phải thêm đường dẫn tệp đầy đủ vào bất kỳ nơi nào mà chúng + +40 +00:02:38,120 --> 00:02:40,850 +tôi có tệp tĩnh cục bộ đang được sử dụng. + +41 +00:02:41,150 --> 00:02:43,340 +Vì vậy, điều đó bao gồm CSS, bao + +42 +00:02:43,400 --> 00:02:48,400 +gồm biểu tượng yêu thích, cũng như bất kỳ hình ảnh nào mà chúng tôi đang sử dụng ở đây. + +43 +00:02:49,190 --> 00:02:51,860 +Và nếu bạn muốn thuận tiện, bạn thực + +44 +00:02:51,890 --> 00:02:54,680 +sự có thể chỉ cần sao chép phần này + +45 +00:02:54,710 --> 00:02:58,340 +là nguồn của hình ảnh và sau đó bạn có thể giữ + +46 +00:02:58,400 --> 00:03:03,400 +Command + R trên Mac hoặc Control + R trên Windows để tìm và thay thế. + +47 +00:03:05,650 --> 00:03:10,650 +Và chúng tôi sẽ thay thế điều này bằng static / images /. Vì vậy, về cơ bản chúng tôi đang + +48 +00:03:13,090 --> 00:03:18,090 +thêm tĩnh vào hình ảnh này /. Và nếu chúng ta tiếp tục và thay thế nó ở + +49 +00:03:19,750 --> 00:03:24,370 +cả năm vị trí, thì bây giờ chúng ta sẽ hoàn thành với tất cả các tái cấu trúc của chúng ta. + +50 +00:03:25,930 --> 00:03:30,930 +Bây giờ chúng ta hãy tiếp tục và khởi động lại tệp của chúng tôi để nó nhìn vào + +51 +00:03:32,740 --> 00:03:36,370 +tất cả những hình ảnh mới này và hãy truy cập trang web của + +52 +00:03:36,400 --> 00:03:38,500 +chúng tôi đang được cung cấp bởi + +53 +00:03:38,890 --> 00:03:42,160 +Python và hy vọng bạn có kết quả giống như tôi làm, + +54 +00:03:42,610 --> 00:03:44,950 +đó là cùng một trang web cá nhân, + +55 +00:03:45,340 --> 00:03:48,760 +nhưng hiện đã được phục vụ với máy chủ Python của chúng tôi. + +56 +00:03:50,440 --> 00:03:54,040 +Bây giờ quá trình này đã khá dễ dàng, + +57 +00:03:54,040 --> 00:03:58,330 +tôi sẽ nói. Chúng tôi chỉ cần di chuyển trong chỉ mục cần thiết. html, hình ảnh CSS + +58 +00:03:58,330 --> 00:04:01,120 +và biểu tượng yêu thích, vì vậy tất + +59 +00:04:01,180 --> 00:04:04,180 +cả các tệp tạo nên một trang web cụ thể. + +60 +00:04:04,630 --> 00:04:08,890 +Và chúng tôi chỉ cần thêm nó vào dự án Flask của mình. + +61 +00:04:09,730 --> 00:04:10,300 +Bây + +62 +00:04:10,300 --> 00:04:15,300 +giờ, những gì bạn cũng có thể làm là bạn có thể tải các mẫu tệp + +63 +00:04:16,600 --> 00:04:20,050 +HTML và CSS từ internet. Ví dụ, một trang web như + +64 +00:04:20,050 --> 00:04:21,700 +html 5up. net, nơi + +65 +00:04:22,089 --> 00:04:26,800 +họ có các mẫu miễn phí đẹp mắt mà bạn có thể khai thác. + +66 +00:04:27,640 --> 00:04:30,370 +Bây giờ hãy xem xét nếu bạn đang tạo trang web cá + +67 +00:04:30,490 --> 00:04:34,780 +nhân của riêng mình, sau đó bạn có thể chọn từ tất cả các mẫu HTML tuyệt đẹp này + +68 +00:04:35,080 --> 00:04:40,000 +mà bạn có thể cập nhật và cá nhân hóa. Ví dụ: nếu chúng tôi lấy cái này đầu + +69 +00:04:40,030 --> 00:04:44,200 +tiên, chúng tôi có thể tiếp tục và xem nó như một bản demo trực tiếp. + +70 +00:04:44,530 --> 00:04:49,120 +Vì vậy, chúng ta có thể thấy trang web này như nó vốn có, và chúng ta có thể thấy nó trông tuyệt vời như thế nào. + +71 +00:04:49,420 --> 00:04:54,130 +Nó có các nút, nó có JavaScript, nó có kiểu dáng CSS đẹp mắt và đây có thể là một + +72 +00:04:54,460 --> 00:04:58,870 +trang web thực sự tốt để theo dõi danh mục đầu tư của chúng tôi, giống như trang web + +73 +00:04:58,900 --> 00:05:02,560 +mà chúng tôi đang xây dựng; để có hình ảnh của các trang web, một + +74 +00:05:02,650 --> 00:05:05,500 +liên kết đến trang web, một số mô tả ngắn gọn. + +75 +00:05:05,770 --> 00:05:09,670 +Và sau đó, chúng tôi có thể đưa điều này lên mạng và bất cứ khi nào chúng tôi muốn được thuê làm + +76 +00:05:09,670 --> 00:05:12,250 +nhà phát triển web, chúng tôi có thể hướng mọi người đến với nó. + +77 +00:05:13,000 --> 00:05:16,900 +Vì vậy, làm thế nào để chúng tôi làm cho điều này hoạt động với Python? Điều đầu tiên chúng ta + +78 +00:05:16,900 --> 00:05:19,870 +phải làm là chỉ cần nhấn tải xuống, và + +79 +00:05:20,410 --> 00:05:24,460 +nó sẽ tải xuống tất cả các tệp tạo nên trang web này. + +80 +00:05:25,180 --> 00:05:28,240 +Bây giờ hãy nhớ rằng vì chúng tôi nhận được + +81 +00:05:28,480 --> 00:05:32,800 +nó miễn phí, chúng tôi cần quy người thiết kế đã tạo ra trang web này. + +82 +00:05:33,310 --> 00:05:37,000 +Nếu bạn không muốn gán nó và bạn muốn sử dụng nó cho mục đích + +83 +00:05:37,390 --> 00:05:42,390 +thương mại, thì bạn có thể trả chỉ 19 đô la và truy cập tất cả các mẫu của + +84 +00:05:43,210 --> 00:05:47,950 +họ cũng như hỗ trợ từ người tạo. Bây giờ, hãy so sánh điều đó với một dịch vụ + +85 +00:05:48,400 --> 00:05:52,690 +như Squarespace, nơi về cơ bản bạn đang nhận được các mẫu dịch vụ giống nhau cho trang web của mình. + +86 +00:05:53,080 --> 00:05:54,160 +Nhưng trong trường hợp + +87 +00:05:54,340 --> 00:05:58,100 +này, bạn sẽ phải trả bất cứ nơi nào từ $ 10 đến $ + +88 +00:05:58,190 --> 00:06:02,480 +30 mỗi tháng, đắt hơn rất nhiều, nhưng thật tuyệt nếu bạn không biết phát triển web. + +89 +00:06:02,870 --> 00:06:05,000 +Nhưng chúng ta sẽ không ở trong trại đó nữa. + +90 +00:06:06,110 --> 00:06:09,410 +Hãy tiếp tục và giải nén tệp mà chúng ta vừa tải xuống, được + +91 +00:06:09,860 --> 00:06:11,600 +gọi là sự thay đổi mô hình. + +92 +00:06:11,990 --> 00:06:16,990 +Và chúng tôi sẽ thử chuyển những tệp này sang trang web của chúng tôi ở đây. + +93 +00:06:18,140 --> 00:06:18,890 +Vì vậy, + +94 +00:06:18,890 --> 00:06:22,760 +một lần nữa, tôi sẽ tiếp tục và xóa tất cả các tệp trước đó + +95 +00:06:22,760 --> 00:06:24,830 +nằm trong các thư mục tĩnh và mẫu + +96 +00:06:24,880 --> 00:06:25,713 +của tôi, 2: ... + +97 +00:06:28,480 --> 00:06:33,130 +0: và tôi sẽ thử chuyển các phần có liên quan của trang web mới này sang. + +98 +00:06:33,880 --> 00:06:36,760 +Vì vậy, ở đây, họ đã có một chỉ mục. html, một văn bản + +99 +00:06:36,850 --> 00:06:39,280 +đọc cho tôi và một văn bản cấp phép. + +100 +00:06:39,730 --> 00:06:43,930 +Vì vậy, tất cả những gì chúng ta cần là di chuyển chỉ mục của mình. html vào các mẫu + +101 +00:06:45,670 --> 00:06:49,600 +và hình ảnh và nội dung vào thư mục tĩnh. + +102 +00:06:50,200 --> 00:06:51,033 +2: Đúng. + +103 +00:06:52,360 --> 00:06:55,330 +0: Bây giờ, một trong những điều cần lưu ý là + +104 +00:06:55,330 --> 00:06:57,100 +khi bạn đang xem bản + +105 +00:06:57,430 --> 00:07:01,660 +demo, có tất cả những bức ảnh tuyệt đẹp này, nhưng tất nhiên nhà thiết kế + +106 +00:07:01,660 --> 00:07:06,430 +không có quyền phân phối những bức ảnh này. Vì vậy, bạn sẽ nhận thấy rằng tất cả các hình ảnh bên trong + +107 +00:07:06,700 --> 00:07:08,620 +thư mục hình ảnh đều là những loại gradient này. + +108 +00:07:08,770 --> 00:07:11,920 +Vì vậy, đừng lo lắng nếu khi bạn chạy trang web của mình, bạn + +109 +00:07:11,950 --> 00:07:15,610 +chỉ thấy một loạt các gradient mờ. Không vấn đề gì. + +110 +00:07:16,930 --> 00:07:21,580 +Bây giờ những gì chúng tôi muốn làm là chúng tôi muốn xem liệu chúng tôi có thể nhận được chỉ mục này hay không. html sẽ hoạt động khi nó được phục vụ + +111 +00:07:21,580 --> 00:07:25,270 +bởi máy chủ của chúng tôi. Bây giờ, điều đầu tiên chúng + +112 +00:07:25,300 --> 00:07:29,410 +ta có thể làm là chỉ cần khởi động lại dự án của mình, chạy + +113 +00:07:29,440 --> 00:07:31,900 +lại nó và xem nó trông như thế nào. + +114 +00:07:32,350 --> 00:07:37,350 +Vì vậy, hãy làm mới trang tĩnh này và bạn có thể thấy nó có tất cả HTML, nhưng không + +115 +00:07:38,020 --> 00:07:40,210 +có kiểu dáng và không có hình ảnh. + +116 +00:07:40,660 --> 00:07:45,660 +Vì vậy, đó có thể là do chúng tôi không chỉ định thư mục tĩnh trong đường dẫn. + +117 +00:07:47,290 --> 00:07:49,360 +Vì vậy, ở đây chúng tôi có các tài + +118 +00:07:51,070 --> 00:07:55,570 +sản của mình và ở đây chúng tôi có một hình ảnh, nhưng chúng đều nằm trong thư mục tĩnh. + +119 +00:07:56,260 --> 00:08:00,700 +Vì vậy, chúng ta có thể thực hiện thủ thuật nhanh chóng đó với tìm và thay thế. + +120 +00:08:01,210 --> 00:08:04,210 +Vì vậy, đối với bất kỳ thứ gì bên trong thư + +121 +00:08:04,240 --> 00:08:09,100 +mục images, chúng tôi sẽ thay thế nó bằng static / images và đối với bất kỳ thứ + +122 +00:08:09,100 --> 00:08:10,750 +gì bên trong thư mục + +123 +00:08:11,050 --> 00:08:14,230 +nội dung, chúng tôi sẽ thay thế nó bằng static / asset. + +124 +00:08:14,950 --> 00:08:15,783 +2: Đúng không? + +125 +00:08:17,140 --> 00:08:21,370 +0: Và bây giờ nếu chúng ta tiếp tục và nhấn lưu và làm mới trang này, bạn + +126 +00:08:21,700 --> 00:08:25,750 +có thể thấy nó hiện đang hiển thị hình ảnh dưới dạng các loại gradient này + +127 +00:08:26,170 --> 00:08:30,910 +và nó cũng hiển thị kiểu dáng và CSS. Bây giờ, bạn sẽ chỉnh sửa nó + +128 +00:08:30,940 --> 00:08:34,059 +như thế nào? Tất nhiên, cách dễ nhất + +129 +00:08:34,090 --> 00:08:36,820 +là thực sự chỉ chỉnh sửa HTML thô này. + +130 +00:08:37,299 --> 00:08:42,250 +Vì vậy, bạn có thể sử dụng bất kỳ HTML nào trong số này và bạn đã hiểu + +131 +00:08:42,280 --> 00:08:46,480 +hầu hết các chức năng của nó. Bạn có bảng, bạn có tiêu đề, bạn có h1, tất + +132 +00:08:46,750 --> 00:08:48,190 +cả các loại thẻ ở đây. + +133 +00:08:49,930 --> 00:08:53,650 +Và bạn có thể chỉnh sửa nó giống như vậy. Ví dụ: nếu chúng + +134 +00:08:53,650 --> 00:08:55,890 +ta cuộn lên trên cùng, + +135 +00:08:56,130 --> 00:09:00,900 +chúng ta có thể thay đổi tiêu đề thành tên, ví dụ: + +136 +00:09:00,900 --> 00:09:05,580 +danh mục đầu tư của Angela. Và chúng ta có thể thay đổi chữ + +137 +00:09:05,610 --> 00:09:10,050 +h1 cho biết sự thay đổi mô hình thành tên riêng của chúng ta chẳng hạn. + +138 +00:09:10,560 --> 00:09:13,410 +Và bây giờ khi tôi nhấn lưu và tôi làm mới ở đây, bạn có + +139 +00:09:13,710 --> 00:09:15,840 +thể thấy tất cả những điều đó đang được phản ánh. + +140 +00:09:16,560 --> 00:09:20,670 +Giờ đây, có một cách chỉnh sửa HTML thậm chí còn tốt hơn trong Chrome. + +141 +00:09:21,330 --> 00:09:23,520 +Tất cả là nhờ các công cụ dành cho nhà phát triển Chrome. + +142 +00:09:24,000 --> 00:09:27,120 +Nếu chúng tôi mở công cụ dành cho nhà phát triển Chrome và + +143 +00:09:27,180 --> 00:09:32,180 +truy cập bảng điều khiển, chúng tôi thực sự có thể nhập một chút JavaScript để làm cho mọi thứ trên trang + +144 +00:09:32,400 --> 00:09:37,050 +web của chúng tôi có thể chỉnh sửa được. Vì vậy, để viết điều này, chúng tôi + +145 +00:09:37,080 --> 00:09:41,490 +nhấn vào tài liệu là toàn bộ tài liệu HTML này, sau đó chúng tôi nhấn vào phần + +146 +00:09:41,790 --> 00:09:45,690 +nội dung có mọi thứ bên trong thẻ body, đó là nội dung của trang web. + +147 +00:09:46,230 --> 00:09:51,230 +Và sau đó, chúng ta có thể gọi một thuộc tính có tên là contentEditable và chúng ta + +148 +00:09:52,830 --> 00:09:57,300 +có thể đặt điều đó thành true. Bây giờ lưu ý ở đây rằng trong + +149 +00:09:57,630 --> 00:10:02,630 +JavaScript, booelan thực sự được viết bằng chữ t thấp hơn, không phải chữ T viết hoa như trong Python. + +150 +00:10:04,320 --> 00:10:06,480 +Nhưng phần còn lại của nó là mã khá chuẩn + +151 +00:10:06,510 --> 00:10:11,340 +và tất cả chúng ta đều có thể hiểu được điều đó. Bây giờ khi tôi nhấn enter và điều đó + +152 +00:10:11,700 --> 00:10:14,640 +diễn ra, tôi có thể đóng ngăn này lại và xem nó. + +153 +00:10:15,210 --> 00:10:17,820 +Bây giờ tôi có thể chỉnh sửa bất cứ thứ gì trên trang web này. + +154 +00:10:18,380 --> 00:10:19,213 +3: Mát mẻ. + +155 +00:10:21,590 --> 00:10:26,590 +0: Tất cả các đoạn văn này hoặc bất kỳ đoạn văn bản nào hiện có thể chỉnh sửa hoàn toàn. + +156 +00:10:27,890 --> 00:10:30,530 +Bây giờ, nếu bạn muốn xóa một số phần tử này, cách dễ + +157 +00:10:30,560 --> 00:10:33,440 +nhất để làm điều đó là gì? Chà, bạn có thể chỉ + +158 +00:10:33,440 --> 00:10:36,860 +cần mở các công cụ dành cho nhà phát triển Chrome và sau + +159 +00:10:37,340 --> 00:10:41,960 +đó chúng ta có thể sử dụng nút nhỏ này ở đây để chọn bất kỳ phần tử nào. + +160 +00:10:42,380 --> 00:10:46,160 +Vì vậy, có thể chúng ta muốn loại bỏ đoạn này ở đây, chọn nó, nó định + +161 +00:10:46,520 --> 00:10:51,520 +vị nó trong HTML và tôi có thể nhấn backspace. Vì vậy, tôi có thể chọn bất kỳ phần nào + +162 +00:10:53,270 --> 00:10:56,450 +của các phần tử HTML mà tôi không thích, ví dụ: nếu tôi + +163 +00:10:56,450 --> 00:11:00,020 +muốn loại bỏ toàn bộ phần này tốt, tôi sẽ chọn nó và sau đó + +164 +00:11:00,020 --> 00:11:00,853 +xóa nó. + +165 +00:11:01,130 --> 00:11:05,180 +Có lẽ tôi có thể xóa thêm một số phần và làm cho việc này đơn giản hơn rất nhiều. + +166 +00:11:05,420 --> 00:11:08,780 +Bây giờ bạn có thể thấy trang web này chỉ có hai phần, tên của tôi + +167 +00:11:08,810 --> 00:11:10,550 +và chi tiết liên hệ của tôi. + +168 +00:11:12,560 --> 00:11:14,210 +Tuy nhiên, một trong những điều đáng + +169 +00:11:14,300 --> 00:11:18,440 +tiếc là tất cả những thay đổi mà bạn đang thực hiện ở đây, mặc dù bạn có thể + +170 +00:11:18,440 --> 00:11:21,290 +thấy nó và điều đó thật tuyệt, ngay sau khi bạn nhấn refresh, + +171 +00:11:21,740 --> 00:11:23,840 +tất cả những thay đổi đó sẽ biến mất. + +172 +00:11:24,350 --> 00:11:26,810 +Và lý do là vì khi bạn nhấn refresh, + +173 +00:11:27,110 --> 00:11:31,790 +điều đang xảy ra là trình duyệt của bạn sẽ chuyển đến máy chủ của bạn tại + +174 +00:11:31,790 --> 00:11:34,940 +địa chỉ này và yêu cầu tất cả các tệp HTML + +175 +00:11:35,480 --> 00:11:37,760 +và CSS, tất nhiên là từ đây. + +176 +00:11:38,330 --> 00:11:41,810 +Vì vậy, điều này không thay đổi bởi những gì chúng tôi đã + +177 +00:11:41,900 --> 00:11:44,540 +làm vừa rồi, nó hoàn toàn không thay đổi. + +178 +00:11:45,020 --> 00:11:48,380 +Vì vậy, nếu bạn muốn tất cả những thay đổi này mà bạn + +179 +00:11:48,470 --> 00:11:53,470 +đã thực hiện trong HTML, thì những gì bạn phải làm là thực sự lưu trang web này như cũ. + +180 +00:11:54,670 --> 00:11:58,480 +Và sau đó, bạn có thể di chuyển HTML này vào các mẫu của mình và + +181 +00:11:58,930 --> 00:12:03,930 +bạn có thể thấy rằng điều này hiện đã ngắn hơn rất nhiều với tất cả các thay đổi mà chúng tôi + +182 +00:12:04,900 --> 00:12:06,280 +đã thực hiện trước đây. + +183 +00:12:06,880 --> 00:12:10,720 +Và bạn có thể thay thế điều này bằng những gì bên trong chỉ mục của bạn. html. + +184 +00:12:11,530 --> 00:12:16,530 +Đây có lẽ là một trong những cách dễ nhất để sửa đổi một mẫu dựng sẵn. + +185 +00:12:18,910 --> 00:12:23,320 +Và bạn có thể thấy rằng có rất nhiều mẫu để bạn thử. + +186 +00:12:23,890 --> 00:12:28,270 +Trên thực tế, trong bài học tiếp theo, khi chúng tôi tạo dự án + +187 +00:12:28,690 --> 00:12:33,310 +cuối cùng của mình, bạn sẽ chỉnh sửa hoàn toàn mẫu nhận dạng này từ đầu. + +188 +00:12:33,820 --> 00:12:36,940 +Và bạn sẽ tạo ra một thẻ tên kỹ thuật số. + +189 +00:12:37,660 --> 00:12:39,070 +Vì vậy, có một trò chơi xung quanh. + +190 +00:12:39,580 --> 00:12:42,940 +Và khi bạn đã hoàn thành, hãy chuyển sang bài học tiếp theo và hoàn thành dự án + +191 +00:12:42,940 --> 00:12:43,510 +cuối cùng. + diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 personal-site-html-and-css-files.zip b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 personal-site-html-and-css-files.zip new file mode 100644 index 0000000000000000000000000000000000000000..579a9024723b1691e56acf50e57d7462ab7baca9 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/004 personal-site-html-and-css-files.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:177fc7baccbe47be71e1a4c0861dbc4549e8ac7e0aca663ce3c8a9ba40d53f42 +size 128468 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 Check-out-html5up.nets-live-demo-sites.url b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 Check-out-html5up.nets-live-demo-sites.url new file mode 100644 index 0000000000000000000000000000000000000000..8ad5ac6261ccf3c79b87d998d2da5b1783b68ef1 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 Check-out-html5up.nets-live-demo-sites.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://html5up.net/ \ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 Final Project - Name Card Website Template.html b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 Final Project - Name Card Website Template.html new file mode 100644 index 0000000000000000000000000000000000000000..6d2c1ea3f898d747d55c7842a070c222cd963f31 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 Final Project - Name Card Website Template.html @@ -0,0 +1 @@ +

We're going to be using one of the templates on HTML 5 Up to create a web-based name card. Like the old-school paper ones, but better.

1. Download html5up's "Identity" template from this lesson's resources (PS: you can also browse the live demo sites on https://html5up.net/ and use a different template like "Astral" or "Ethereal"...)

2. Create a new PyCharm project called name-card and create a new Flask Application from scratch.

3. Create the necessary folders and move the relevant files from the download in step1.

4. Get the website to work when you access the root route ("/")

5. Personalise the website, change the background image, change the text, change the links, make it your own.

This is what you're aiming for:

\ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 html5up-identity.zip b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 html5up-identity.zip new file mode 100644 index 0000000000000000000000000000000000000000..d16c17f62017385911f12dc3ad6f61ca17983300 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/005 html5up-identity.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61b8fd0681d0001a2d6d8b41a09dc5d288a78e00f0689db4c5fe4eb4fa0ecdbe +size 659813 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Course-Fixes-Report-an-Issue.url b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Solution and Walkthrough for the Name Card Final Project.mp4 b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Solution and Walkthrough for the Name Card Final Project.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..948bba0d0b3d62f3300fcd7ef9c67e12c72f78be --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Solution and Walkthrough for the Name Card Final Project.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e2c1ed0dd3cb3cbe9ef93b5a9bf844a7ab821c492a056c38df03564400b4482 +size 139421987 diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Solution and Walkthrough for the Name Card Final Project_vi.srt b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Solution and Walkthrough for the Name Card Final Project_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cd2555b527973f8264a3d4548484ae67f0c53977 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 Solution and Walkthrough for the Name Card Final Project_vi.srt @@ -0,0 +1,444 @@ +1 +00:00:00,450 --> 00:00:02,969 +Được rồi, chúng ta hãy tiếp tục và xem xét giải pháp. + +2 +00:00:03,270 --> 00:00:05,939 +Điều đầu tiên tôi sẽ làm là truy + +3 +00:00:05,939 --> 00:00:08,310 +cập trang web và tải xuống mẫu. + +4 +00:00:09,270 --> 00:00:11,040 +Khi tôi đã tải xuống mẫu, + +5 +00:00:11,070 --> 00:00:16,070 +tôi sẽ giải nén tệp và có quyền truy cập vào tất cả các tệp bên trong. + +6 +00:00:17,490 --> 00:00:20,370 +Bây giờ tôi đã thiết lập máy chủ Flask của mình, + +7 +00:00:20,400 --> 00:00:23,760 +điều này khá đơn giản. Tôi đã tạo ứng dụng của mình, + +8 +00:00:24,090 --> 00:00:29,090 +tôi đã thiết lập các tuyến đường về nhà và tôi đã đặt ứng dụng của mình chạy ở chế độ gỡ lỗi. + +9 +00:00:30,270 --> 00:00:34,230 +Bây giờ tôi phải tạo các thư mục cần thiết. + +10 +00:00:34,260 --> 00:00:37,020 +Vì vậy, tôi sẽ cần một thư mục có tên + +11 +00:00:37,560 --> 00:00:41,100 +là các mẫu và tôi cũng sẽ cần một thư mục được gọi là tĩnh. + +12 +00:00:42,750 --> 00:00:44,880 +Với hai thư mục đó, bây giờ tôi có thể bắt + +13 +00:00:44,880 --> 00:00:49,880 +đầu di chuyển qua các phần liên quan của các tệp này; mục lục. html chuyển sang dạng + +14 +00:00:51,390 --> 00:00:55,080 +mẫu, nội dung và hình ảnh chuyển + +15 +00:00:55,170 --> 00:00:57,150 +sang dạng tĩnh. + +16 +00:00:59,510 --> 00:01:00,740 +1: Đúng 0: Bây giờ, + +17 +00:01:00,740 --> 00:01:05,740 +một trong những điều đầu tiên chúng tôi sẽ thử và làm là xem liệu điều này có hiệu quả hay không. + +18 +00:01:06,290 --> 00:01:11,090 +Vì vậy, chúng tôi sẽ khởi động máy chủ của mình và cố gắng hiển thị chỉ mục đó. html. + +19 +00:01:12,080 --> 00:01:15,530 +Và nếu bạn có một dự án khác đang chạy ở chế độ nền + +20 +00:01:15,530 --> 00:01:18,230 +đang sử dụng địa chỉ máy chủ của chúng tôi, + +21 +00:01:18,470 --> 00:01:21,740 +thì bạn sẽ gặp lỗi cho biết địa chỉ đã được sử dụng. + +22 +00:01:21,980 --> 00:01:26,210 +Vì vậy, chỉ cần đảm bảo rằng bạn ngừng chạy bất kỳ tệp nào khác và sau đó chạy lại tệp này. + +23 +00:01:28,250 --> 00:01:32,540 +Vì vậy, đây là trang web của chúng tôi chỉ với HTML. Nó rất, rất đơn giản, và + +24 +00:01:32,540 --> 00:01:36,290 +nó không có bất kỳ kiểu dáng hay hình ảnh nào. + +25 +00:01:36,710 --> 00:01:41,240 +Vì vậy, chúng tôi sẽ phải khắc phục điều đó bằng cách đi vào chỉ mục. html và tìm ra những + +26 +00:01:41,240 --> 00:01:44,300 +phần nào của nó cần được thay đổi. + +27 +00:01:44,900 --> 00:01:48,860 +Bây giờ lưu ý rằng trong phần tải xuống, chúng ta có hai thư mục; + +28 +00:01:48,950 --> 00:01:52,370 +nội dung và hình ảnh bây giờ đều ở bên trong tĩnh. + +29 +00:01:52,700 --> 00:01:57,700 +Vì vậy, chúng tôi sẽ phải tìm và thay thế bất kỳ thứ gì là tài + +30 +00:02:00,170 --> 00:02:03,350 +sản và thay đổi nó thành tĩnh / tài sản, + +31 +00:02:03,770 --> 00:02:04,603 +1: ... + +32 +00:02:06,560 --> 00:02:09,169 +0: và cũng làm tương tự với hình ảnh, 1: phải + +33 +00:02:14,510 --> 00:02:14,870 +không? + +34 +00:02:14,870 --> 00:02:17,300 +0: Thực ra không có nhiều mã ở đây. + +35 +00:02:17,330 --> 00:02:21,080 +Bạn có thể cuộn khá nhiều từ trên xuống dưới và bạn có thể + +36 +00:02:21,080 --> 00:02:23,090 +thấy không có nhiều thứ ở đây. + +37 +00:02:23,750 --> 00:02:26,660 +Vì vậy, bây giờ chúng tôi đã sửa các đường dẫn đó, hãy + +38 +00:02:26,720 --> 00:02:30,920 +xem liệu chúng tôi có thể nhấn lưu và quay lại để làm mới trang web của mình hay không. + +39 +00:02:31,880 --> 00:02:34,310 +Bây giờ, nếu bạn đang hiểu những gì tôi đang + +40 +00:02:34,310 --> 00:02:39,310 +thấy ở đây, đó là tệp CSS đang được hiển thị từ dự án trước đó mà chúng tôi đã + +41 +00:02:40,640 --> 00:02:45,640 +nắm giữ trang portfolio, hãy nhớ đó là vì tệp CSS là tệp tĩnh và nó đang được lưu vào + +42 +00:02:46,730 --> 00:02:50,660 +bộ nhớ cache của Chrome trình duyệt. Vì vậy, như tôi đã + +43 +00:02:50,660 --> 00:02:55,660 +đề cập trước đây, bạn phải giữ phím shift và nhấn refresh để có + +44 +00:02:56,090 --> 00:03:00,040 +các tệp tĩnh mới xuất hiện. Vì vậy, bây giờ chúng ta đã có tất cả những + +45 +00:03:00,160 --> 00:03:05,160 +điều này, đã đến lúc thực sự chỉnh sửa văn bản và các liên kết. Đi sâu vào đây, chúng ta có thể + +46 +00:03:05,890 --> 00:03:10,360 +thấy rằng đây là h1 mà chúng ta có thể thay đổi khá dễ dàng, + +47 +00:03:10,410 --> 00:03:11,243 +1: ... + +48 +00:03:13,440 --> 00:03:18,210 +0: và tất nhiên bạn có thể thêm hrefs của mình vào các liên kết + +49 +00:03:18,210 --> 00:03:19,650 +này cho Twitter, Instagram, + +50 +00:03:20,190 --> 00:03:25,190 +Facebook, sao chép URL Twitter của bạn và thay đổi Href ở đây thành đó nếu + +51 +00:03:26,670 --> 00:03:27,503 +bạn muốn. + +52 +00:03:28,350 --> 00:03:32,010 +Và bạn cũng có thể thay đổi chân trang. Bây giờ, hãy nhớ rằng vì + +53 +00:03:32,040 --> 00:03:36,360 +chúng tôi không mua những mẫu này và chúng tôi đang sử dụng nó cho mục + +54 +00:03:36,360 --> 00:03:40,560 +đích cá nhân, chúng tôi thực sự nên ghi rõ nguồn chúng tôi lấy từ đó. + +55 +00:03:40,590 --> 00:03:45,570 +Vì vậy, tôi sẽ chỉ để nó như vậy. Bây giờ, nếu tôi nhấn lưu, bạn có + +56 +00:03:45,600 --> 00:03:49,710 +thể thấy tôi đã cập nhật khá nhiều văn bản cho những gì tôi muốn. + +57 +00:03:50,670 --> 00:03:53,760 +Và bạn có thể thấy rằng hình ảnh đại diện này + +58 +00:03:54,210 --> 00:03:57,660 +đã biến mất và lý do là vì khi tôi thực hiện + +59 +00:03:57,960 --> 00:03:59,520 +việc tìm kiếm và thay + +60 +00:03:59,550 --> 00:04:02,970 +thế, tôi đã không đủ cẩn thận và tôi đã không thêm + +61 +00:04:03,240 --> 00:04:06,960 +vào dấu gạch chéo cuối cùng mà trên thực tế phải ở ngay đây. + +62 +00:04:07,980 --> 00:04:12,390 +Vì vậy, bây giờ sẽ hiển thị hình ảnh đại diện. + +63 +00:04:12,600 --> 00:04:14,070 +Nhưng tất nhiên hiện + +64 +00:04:14,070 --> 00:04:18,390 +tại, nó chỉ là hình ảnh gradient trống bên trong thư mục hình ảnh. + +65 +00:04:19,019 --> 00:04:23,610 +Vì vậy, những gì chúng ta có thể làm là chúng ta có thể đơn giản thay thế nó bằng hình ảnh của chính chúng ta. + +66 +00:04:25,290 --> 00:04:29,490 +Vì vậy, ở đây trong thư mục tải xuống của tôi, tôi có một hình ảnh có tên là angela. png. + +67 +00:04:29,970 --> 00:04:34,970 +Vì vậy, tôi sẽ di chuyển hình ảnh của chính mình vào thư mục hình ảnh và cấu trúc lại nó. + +68 +00:04:36,120 --> 00:04:38,610 +Và sau đó trở lại chỉ mục của chúng tôi. html, tôi sẽ + +69 +00:04:38,670 --> 00:04:43,410 +hướng tới hình ảnh đó bằng cách thay đổi đường dẫn tệp này. + +70 +00:04:43,860 --> 00:04:47,070 +Vì vậy, bây giờ tôi có thể tiếp tục và xóa ảnh đại diện này. + +71 +00:04:47,640 --> 00:04:51,120 +Và nếu tôi nhấn lưu và quay lại trang web của mình, + +72 +00:04:51,420 --> 00:04:55,320 +bạn có thể thấy ảnh của tôi bây giờ hiển thị bên trong hình ảnh. + +73 +00:04:56,670 --> 00:05:01,110 +Điều tiếp theo tôi muốn thêm là một hình nền dưới gradient này ở đây. + +74 +00:05:01,590 --> 00:05:06,590 +Vì vậy, một trong những nơi tốt nhất để tìm những hình ảnh tuyệt vời cho mục đích thương mại là một trang + +75 +00:05:07,530 --> 00:05:08,760 +web có tên là Unsplash. + +76 +00:05:09,150 --> 00:05:13,860 +Vì vậy, nếu chúng tôi tìm kiếm một số loại hình ảnh mà chúng tôi có thể + +77 +00:05:14,250 --> 00:05:17,280 +đặt làm nền, có thể là bãi biển hoặc biển, + +78 +00:05:18,360 --> 00:05:22,290 +bạn có thể thấy có hàng nghìn hình ảnh mà bạn có thể chọn. + +79 +00:05:22,560 --> 00:05:26,700 +Và tất cả chúng đều trông cực kỳ đẹp, và chúng đều lớn, tất cả đều HD. + +80 +00:05:27,630 --> 00:05:30,870 +Tôi đã quyết định chụp bức tranh bờ biển này. + +81 +00:05:31,020 --> 00:05:33,390 +Và nếu tôi tiếp tục và nhấp vào + +82 +00:05:33,720 --> 00:05:38,460 +tải xuống miễn phí, nó sẽ tải hình ảnh JPEG lớn xuống máy tính của tôi. + +83 +00:05:39,090 --> 00:05:43,920 +Vì vậy, bây giờ tôi sẽ tiếp tục và đổi tên hình ảnh đó thành + +84 +00:05:44,010 --> 00:05:46,950 +cùng tên với hình nền ban đầu chỉ + +85 +00:05:46,980 --> 00:05:49,290 +là một bg. jpeg. + +86 +00:05:50,130 --> 00:05:50,963 +1: Đúng. + +87 +00:05:52,740 --> 00:05:53,573 +0: Như vậy. + +88 +00:05:53,730 --> 00:05:58,730 +Và bây giờ tôi có thể xóa tệp này và thay thế nó bằng nền của riêng tôi. + +89 +00:05:59,870 --> 00:06:04,870 +Vì vậy, hãy nhớ rằng hình nền ở đây nó thực sự đang được hiển thị từ + +90 +00:06:04,880 --> 00:06:06,080 +các tệp CSS. + +91 +00:06:06,380 --> 00:06:10,640 +Và nếu bạn nhìn vào bên trong chính. css bạn có thể thấy ở đây, nơi nó + +92 +00:06:10,640 --> 00:06:11,690 +đặt hình ảnh + +93 +00:06:12,020 --> 00:06:17,020 +nền, nó thực sự tạo ra một gradient và nó phủ lên trên thứ gì đó bên trong thư mục + +94 +00:06:18,080 --> 00:06:21,260 +hình ảnh được gọi là bg. jpeg. + +95 +00:06:21,530 --> 00:06:23,930 +Vì vậy, thay vì thay đổi tất cả ở đây, tất + +96 +00:06:24,230 --> 00:06:29,230 +cả những gì chúng tôi chỉ làm là đặt tên hình ảnh của chúng tôi giống như những gì họ đã có trước đây. + +97 +00:06:29,870 --> 00:06:33,290 +Bây giờ, nếu chúng tôi tiếp tục và chạy lại trang web + +98 +00:06:33,980 --> 00:06:37,730 +của mình, hãy quay lại trang web của chúng tôi và tải lại cứng, + +99 +00:06:37,730 --> 00:06:41,300 +hãy nhớ bằng cách giữ phím shift và nhấp vào nút tải lại, bạn + +100 +00:06:41,660 --> 00:06:45,770 +có thể thấy rằng hình ảnh bây giờ đã được đưa vào phía sau gradient này. + +101 +00:06:46,820 --> 00:06:51,820 +Bây giờ bước cuối cùng là thay đổi tiêu đề đó để nó nói tên của chúng ta + +102 +00:06:53,750 --> 00:06:57,200 +thay vì văn bản giữ chỗ. Vì vậy, hãy tiếp tục và thay đổi tiêu + +103 +00:07:01,450 --> 00:07:02,110 +đề 1: ... + +104 +00:07:02,110 --> 00:07:04,960 +0: tên của chúng tôi và chúng tôi có nó. + +105 +00:07:05,410 --> 00:07:07,960 +Chúng tôi hiện đang cung cấp trang web tuyệt + +106 +00:07:08,140 --> 00:07:12,880 +đẹp này mà chúng tôi lấy hoàn toàn từ một mẫu mà người khác đã phát triển. + +107 +00:07:13,300 --> 00:07:17,770 +Và tất cả những gì chúng tôi cần làm là có đủ hiểu biết về HTML, + +108 +00:07:17,770 --> 00:07:22,770 +CSS và cách máy chủ Python hoạt động để tùy chỉnh nó cho các mục đích của riêng chúng tôi. + +109 +00:07:24,340 --> 00:07:25,990 +Tôi hy vọng bạn thích xây dựng + +110 +00:07:26,080 --> 00:07:29,950 +cái này với tôi và tôi hy vọng bạn sẽ xem qua một số mẫu khác và + +111 +00:07:29,950 --> 00:07:33,910 +bắt đầu lộn xộn với một số mẫu để tạo các trang web tùy chỉnh của riêng bạn. + diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 unsplash.com-beautiful-images.url b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 unsplash.com-beautiful-images.url new file mode 100644 index 0000000000000000000000000000000000000000..d6e71846366dd45a6ed16664e7274f73037d4493 --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/006 unsplash.com-beautiful-images.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://unsplash.com/ \ No newline at end of file diff --git a/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/external-links.txt b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..4d9c5bbdb1854d0bf714fa8a6ec12cfe73ffc58d --- /dev/null +++ b/part3/56 - Day 56 - Intermediate+ Rendering HTMLStatic files and Using Website Templates/external-links.txt @@ -0,0 +1,18 @@ + +002 Flask-Docs-Rendering-Templates +https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates + +002 My-CV-Website-Hosted-on-GitHub +https://angelabauer.github.io/cv/ + +004 HTML5-UP-Website-Templates +https://html5up.net/ + +005 Check-out-html5up.nets-live-demo-sites +https://html5up.net/ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +006 unsplash.com-beautiful-images +https://unsplash.com/ diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/001 Day 57 Goals what you will make by the end of the day.mp4 b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/001 Day 57 Goals what you will make by the end of the day.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3e39cdbded5d2c60c5360c2eb84403ed314adba5 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/001 Day 57 Goals what you will make by the end of the day.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0d1785128ab78eee25cd9ce27bd85a180dfc4dcb2e966ce52c320d5fbf1dc73 +size 5378429 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/001 Day 57 Goals what you will make by the end of the day_vi.srt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/001 Day 57 Goals what you will make by the end of the day_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..290ae43e1063b726c4673c39f816850df6f4fae3 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/001 Day 57 Goals what you will make by the end of the day_vi.srt @@ -0,0 +1,116 @@ +1 +00:00:00,090 --> 00:00:04,860 +Xin chào các bạn, chào mừng đến với ngày thứ 57 của 100 Ngày viết mã. Hôm nay chúng ta sẽ đi + +2 +00:00:04,860 --> 00:00:09,480 +sâu hơn vào việc xây dựng các ứng dụng Flask nâng cao hơn. + +3 +00:00:10,050 --> 00:00:12,720 +Và để làm được điều đó, chúng ta sẽ + +4 +00:00:12,720 --> 00:00:15,630 +học về cách xây dựng và tạo mẫu URL với Jinja. + +5 +00:00:16,470 --> 00:00:19,470 +Vì vậy, rất thường xuyên khi bạn đang tạo một trang + +6 +00:00:19,800 --> 00:00:24,800 +web, bạn sẽ gặp phải những trường hợp mà bạn thực sự không muốn tạo trang hoàn toàn + +7 +00:00:24,810 --> 00:00:26,520 +từ đầu. Ví dụ: + +8 +00:00:26,520 --> 00:00:31,520 +nếu bạn có một blog và bạn muốn có nhiều bài đăng khác nhau trong blog, + +9 +00:00:32,430 --> 00:00:36,660 +bạn không muốn tạo một tệp HTML riêng cho mỗi bài đăng trên blog. + +10 +00:00:37,140 --> 00:00:37,920 +Vì vậy, + +11 +00:00:37,920 --> 00:00:42,920 +trong trường hợp đó, sẽ thực sự hữu ích nếu có một ngôn ngữ tạo mẫu nơi bạn có thể + +12 +00:00:43,650 --> 00:00:46,290 +thay thế các bit của blog đó bằng nội dung động. + +13 +00:00:47,250 --> 00:00:48,960 +Và đó là nơi Jinja bước vào. + +14 +00:00:49,230 --> 00:00:52,080 +Đây là một ngôn ngữ tạo khuôn mẫu + +15 +00:00:52,530 --> 00:00:55,890 +được xây dựng cho Python và nó sẽ cho phép chúng + +16 +00:00:56,070 --> 00:01:00,720 +tôi tạo bố cục chung cho blog của mình, kiểu dáng và cấu trúc, sau đó + +17 +00:01:00,720 --> 00:01:05,720 +thay thế nội dung, ví dụ: tiêu đề hoặc phụ đề hoặc nội dung bằng động nội + +18 +00:01:05,910 --> 00:01:09,420 +dung được tạo mỗi khi chúng tôi tải một trang cụ thể. + +19 +00:01:10,320 --> 00:01:12,210 +Và đến cuối ngày hôm nay, + +20 +00:01:12,240 --> 00:01:16,980 +bạn sẽ xây dựng được một blog rất đơn giản với một số bài đăng trên blog. + +21 +00:01:17,220 --> 00:01:19,560 +Vì vậy, ở đây chúng ta có thể thấy tiêu đề và phụ đề. + +22 +00:01:19,920 --> 00:01:23,460 +Và sau đó khi chúng ta nhấp vào đọc để xem chi tiết bài đăng trên blog, + +23 +00:01:23,730 --> 00:01:25,650 +chúng ta sẽ chuyển đến một trang khác. + +24 +00:01:25,980 --> 00:01:29,970 +Và tùy thuộc vào bài đăng trên blog nào chúng tôi đã nhấp vào, bạn có + +25 +00:01:30,240 --> 00:01:33,690 +thể thấy rằng về cơ bản chúng tôi đang hiển thị cùng một + +26 +00:01:33,720 --> 00:01:36,300 +bố cục, cùng một kiểu và cùng một cấu trúc, + +27 +00:01:36,540 --> 00:01:39,570 +nhưng mỗi lần đối với mỗi trang này, chúng tôi sẽ nhận + +28 +00:01:39,930 --> 00:01:44,160 +được một số khác nhau Nội dung. Vì vậy, đó là mục tiêu. + +29 +00:01:44,550 --> 00:01:48,270 +Và khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và chúng ta sẽ bắt đầu. + diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Jinja-Documentation.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Jinja-Documentation.url new file mode 100644 index 0000000000000000000000000000000000000000..af1cee3d1ea50e081a92742e3ba2284871373b91 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Jinja-Documentation.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://jinja.palletsprojects.com/en/2.11.x/templates/ \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Rendering-Templates-in-Flask.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Rendering-Templates-in-Flask.url new file mode 100644 index 0000000000000000000000000000000000000000..9d459137ef8a332401eea64120d9ed7056cfcb90 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Rendering-Templates-in-Flask.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Update-Your-Footer.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Update-Your-Footer.url new file mode 100644 index 0000000000000000000000000000000000000000..e262ff356e6c678e545bcb5ed51f936ee1d3aa68 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Update-Your-Footer.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://updateyourfooter.com/ \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Using Jinja to Produce Dynamic HTML Pages.mp4 b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Using Jinja to Produce Dynamic HTML Pages.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d8dfedda7a8f04a570af3f9538f135dd21ce8faa --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Using Jinja to Produce Dynamic HTML Pages.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:773d1c37ffbdd360f53ff9e72a64eafeb95c6a4e5c6b6e280384bbed4cde8784 +size 117148852 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Using Jinja to Produce Dynamic HTML Pages_vi.srt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Using Jinja to Produce Dynamic HTML Pages_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c7ad2e41abc4ab21b16eeaa866ebfc55b135847f --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 Using Jinja to Produce Dynamic HTML Pages_vi.srt @@ -0,0 +1,652 @@ +1 +00:00:00,270 --> 00:00:04,710 +Bây giờ để bắt đầu, tất cả những gì chúng ta cần là một ứng dụng Flask đơn giản. + +2 +00:00:05,100 --> 00:00:08,340 +Bạn có thể viết điều này từ đầu để thực hành + +3 +00:00:08,610 --> 00:00:13,610 +hoặc bạn có thể truy cập tài nguyên của khóa học và bạn có thể tải xuống + +4 +00:00:13,800 --> 00:00:17,640 +tệp này dưới dạng tệp zip. Khi bạn đã giải nén nó và mở nó trong PyCharm, + +5 +00:00:17,850 --> 00:00:20,520 +bạn sẽ thấy một máy chủ. tệp py chứa tất + +6 +00:00:20,790 --> 00:00:25,790 +cả mã cơ bản cần thiết để hiển thị hello world trên màn + +7 +00:00:26,610 --> 00:00:27,443 +hình. + +8 +00:00:27,930 --> 00:00:32,930 +Vì vậy, nếu chúng tôi tiếp tục và chỉ chạy tệp này và truy cập URL cục bộ của trang web của + +9 +00:00:34,410 --> 00:00:39,090 +chúng tôi, bạn sẽ có thể thấy hello world. Bây giờ, điều tiếp theo tôi muốn bạn + +10 +00:00:39,120 --> 00:00:42,720 +làm là tạo một tệp HTML mà bạn sẽ gọi là chỉ + +11 +00:00:42,900 --> 00:00:46,530 +mục và bên trong tệp HTML này, chúng tôi sẽ đặt cho + +12 +00:00:46,740 --> 00:00:51,740 +nó một tiêu đề chỉ trang web của tôi và phần quan trọng hơn sẽ là xảy + +13 +00:00:52,560 --> 00:00:55,830 +ra trong cơ thể. Để thực hành, hãy + +14 +00:00:55,860 --> 00:00:59,490 +tiếp tục và xem liệu bạn có thể tạo h1 nói hello + +15 +00:00:59,820 --> 00:01:04,819 +world thay vì chỉ trả lại hello world dưới dạng văn bản và thay vào đó, hiển + +16 +00:01:06,540 --> 00:01:11,160 +thị HTML chỉ mục này trên màn hình. Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +17 +00:01:14,040 --> 00:01:14,370 +Được rồi. + +18 +00:01:14,370 --> 00:01:18,630 +Vì vậy, điều đầu tiên chúng ta phải làm là tạo một h1 nói xin chào thế giới. + +19 +00:01:19,440 --> 00:01:22,290 +Và khi chúng tôi đã tạo chỉ mục của mình. html, chúng tôi muốn + +20 +00:01:22,530 --> 00:01:27,510 +hiển thị nó dưới dạng một mẫu thay vì chỉ trả về văn bản này. + +21 +00:01:27,990 --> 00:01:32,340 +Vì vậy, để làm điều đó, chúng tôi sẽ cần chức năng kết xuất mẫu này ở trên cùng. + +22 +00:01:32,850 --> 00:01:34,800 +Vì vậy, nếu chúng ta định kết xuất mẫu, và + +23 +00:01:35,070 --> 00:01:39,180 +mẫu mà chúng ta muốn kết xuất được gọi là chỉ mục. html. + +24 +00:01:39,570 --> 00:01:44,040 +Nhưng một điều bạn phải nhớ là tệp này phải nằm trong một thư mục + +25 +00:01:44,070 --> 00:01:49,070 +được gọi là các mẫu vì Flask có các yêu cầu cụ thể đối với những thứ + +26 +00:01:49,680 --> 00:01:51,180 +như tệp tĩnh và mẫu. + +27 +00:01:53,340 --> 00:01:58,020 +Vì vậy, bây giờ chúng ta nên sẵn sàng chạy lại ứng dụng của mình để nó tính đến các tệp + +28 +00:01:58,020 --> 00:02:03,020 +mới và sau đó truy cập trang web của chúng tôi và bạn sẽ thấy thế giới hello này đang được hiển thị + +29 +00:02:03,180 --> 00:02:07,230 +từ chỉ mục của chúng tôi. html. Bây giờ, một trong những + +30 +00:02:07,260 --> 00:02:11,039 +điều bạn có thể tự hỏi là tại sao đây lại là một mẫu? + +31 +00:02:11,100 --> 00:02:12,870 +Tại sao chúng tôi hiển thị một + +32 +00:02:13,200 --> 00:02:17,370 +mẫu trong khi thực tế những gì chúng tôi đang làm chỉ là gửi qua một tệp HTML? + +33 +00:02:17,910 --> 00:02:21,930 +Chà, các tệp HTML thực sự có thể hoạt động như một khuôn mẫu miễn là + +34 +00:02:22,320 --> 00:02:25,800 +chúng ta biết cách làm việc với một ngôn ngữ tạo mẫu. + +35 +00:02:26,820 --> 00:02:30,330 +Ngôn ngữ tạo khuôn mẫu mà chúng ta sẽ sử dụng được gọi là + +36 +00:02:30,780 --> 00:02:33,210 +Jinja và ngôn ngữ này dành riêng cho Python. + +37 +00:02:33,750 --> 00:02:38,750 +Nó cho phép chúng tôi sử dụng một số cú pháp như dấu ngoặc nhọn, + +38 +00:02:40,110 --> 00:02:45,000 +dấu phần trăm hoặc dấu ngoặc nhọn kép để chỉ định bên trong tệp + +39 +00:02:45,330 --> 00:02:50,010 +HTML những phần nào thực sự nên được đánh giá là mã Python. + +40 +00:02:50,640 --> 00:02:51,690 +Hãy để tôi chỉ cho bạn một số thứ. + +41 +00:02:52,380 --> 00:02:56,190 +Chúng ta đã thấy rằng chỉ bằng cách đặt văn bản này vào giữa h1, chúng ta + +42 +00:02:56,520 --> 00:03:00,310 +sẽ nhận được văn bản này được hiển thị dưới dạng văn bản trong h1. + +43 +00:03:01,090 --> 00:03:05,410 +Và nếu tôi tiếp tục và tôi viết một cái gì đó như 5 * 6, bạn sẽ mong đợi trang web + +44 +00:03:05,710 --> 00:03:08,980 +của chúng tôi trông như thế nào? Chà, nếu tôi tiếp tục và nhấn + +45 +00:03:08,980 --> 00:03:12,610 +lưu, và vì chúng tôi đang ở chế độ gỡ lỗi, nên máy chủ của chúng + +46 +00:03:12,670 --> 00:03:16,960 +tôi sẽ cho phép chúng tôi làm mới trang và bạn thấy đấy, đó chỉ là văn bản thuần + +47 +00:03:16,960 --> 00:03:21,490 +túy của những gì tôi đã viết ngay tại đây. Tuy nhiên, bây giờ, nếu tôi + +48 +00:03:21,580 --> 00:03:26,580 +tiếp tục và thêm hai dấu ngoặc nhọn xung quanh biểu thức này, thì biểu + +49 +00:03:27,700 --> 00:03:31,690 +thức này bây giờ đột nhiên được đánh giá là mã Python. + +50 +00:03:32,140 --> 00:03:36,790 +Vì vậy, hãy nhấn lưu lại và nhấn làm mới và bạn có thể thấy bây + +51 +00:03:36,790 --> 00:03:40,030 +giờ thay vì 5 * 6, tôi nhận được 30. + +52 +00:03:40,510 --> 00:03:43,600 +Vì vậy, đây thực sự được coi là mã + +53 +00:03:43,900 --> 00:03:47,680 +Python và kết quả được tính toán đang được đưa vào h1 này. + +54 +00:03:48,550 --> 00:03:51,310 +Đây là lý do tại sao ngôn ngữ này được gọi + +55 +00:03:51,640 --> 00:03:53,800 +là ngôn ngữ tạo khuôn mẫu, bởi vì + +56 +00:03:53,800 --> 00:03:58,720 +nó có nghĩa là chúng ta có thể có một HTML hoạt động như một mẫu trong đó tiêu đề + +57 +00:03:58,720 --> 00:03:59,080 +không + +58 +00:03:59,080 --> 00:04:04,080 +thay đổi, phần đầu không thay đổi, kiểu dáng không thay đổi và chỉ các phần mà chúng tôi chỉ định + +59 +00:04:04,510 --> 00:04:09,510 +bên trong các dấu ngoặc nhọn này thực sự được đánh giá dưới dạng mã Python và được chèn vào mẫu. + +60 +00:04:12,250 --> 00:04:15,520 +Tôi sẽ thêm lại hello world bên trong h1 và cả + +61 +00:04:15,940 --> 00:04:20,940 +biểu thức Python của chúng tôi bên trong đánh dấu Jinja này để bạn có thể xem cả + +62 +00:04:22,420 --> 00:04:23,410 +hai phiên bản. + +63 +00:04:24,040 --> 00:04:29,040 +Điều tiếp theo tôi muốn làm là nếu tôi muốn tạo một số ngẫu nhiên thì sao? + +64 +00:04:29,890 --> 00:04:32,950 +Giả sử tôi đã tạo một h3 và bên trong đây + +65 +00:04:32,950 --> 00:04:37,630 +tôi muốn tạo một số ngẫu nhiên. Làm thế nào tôi sẽ làm điều đó? + +66 +00:04:38,950 --> 00:04:43,120 +Chà, khi chúng tôi đang làm việc với một thứ gì đó yêu cầu nhập, chẳng hạn như + +67 +00:04:43,120 --> 00:04:46,420 +để lấy một số ngẫu nhiên, chúng tôi sẽ cần nhập mô-đun ngẫu + +68 +00:04:46,690 --> 00:04:51,220 +nhiên, sau đó tốt nhất là viết mã của chúng tôi bên trong máy chủ Python của chúng tôi. + +69 +00:04:52,120 --> 00:04:53,500 +Hãy để tôi cho bạn thấy nó hoạt động như thế nào. + +70 +00:04:53,590 --> 00:04:58,240 +Hãy tiếp tục và nhập ngẫu nhiên để chúng ta có thể tạo một số ngẫu nhiên. + +71 +00:04:58,660 --> 00:05:03,520 +Và tôi sẽ làm điều đó bên trong chức năng gia đình này. Bây giờ, trong trường hợp này, + +72 +00:05:03,550 --> 00:05:07,030 +tôi sẽ tạo một số ngẫu nhiên từ 1 đến 10. + +73 +00:05:07,570 --> 00:05:11,380 +Nhưng điều quan trọng nhất là tôi muốn có thể gửi số ngẫu + +74 +00:05:11,650 --> 00:05:16,650 +nhiên này đến chỉ mục của mình. html và kết hợp nó vào mẫu + +75 +00:05:17,680 --> 00:05:22,270 +này khi tôi kết xuất nó. Vì vậy, những gì tôi có thể + +76 +00:05:22,330 --> 00:05:25,390 +làm sau tham số đầu tiên là tên của tệp mẫu, + +77 +00:05:25,930 --> 00:05:29,470 +tôi có thể thêm bao nhiêu đối số từ khóa tùy ý. + +78 +00:05:30,550 --> 00:05:32,620 +Nếu chúng ta xem qua mẫu kết + +79 +00:05:32,860 --> 00:05:35,380 +xuất này, bạn có thể thấy rằng sau tên + +80 +00:05:35,470 --> 00:05:38,890 +của mẫu, tham số tiếp theo có ngữ cảnh dấu sao kép. + +81 +00:05:39,160 --> 00:05:44,160 +Điều này về cơ bản giống như khi bạn thấy các đối số từ khóa dấu sao kép + +82 +00:05:44,680 --> 00:05:45,513 +hoặc kwargs. + +83 +00:05:45,940 --> 00:05:50,080 +Về cơ bản, nó nói rằng bạn có thể thêm bao nhiêu đối số từ + +84 +00:05:50,440 --> 00:05:54,970 +khóa tùy thích và mỗi đối số từ khóa này cần phải có tên cho biến và + +85 +00:05:54,970 --> 00:05:56,110 +giá trị cho biến. + +86 +00:05:56,560 --> 00:06:01,560 +Và lý do tại sao chúng cần có tên và giá trị là vì chúng ta có + +87 +00:06:02,300 --> 00:06:07,300 +thể tham chiếu đến biến đó bằng tên của nó bên trong tệp HTML được tạo mẫu. + +88 +00:06:08,630 --> 00:06:12,650 +Vì vậy, ví dụ: nếu tôi tiếp tục và gửi qua một biến + +89 +00:06:12,650 --> 00:06:17,650 +mà tôi sẽ gọi là num và sau đó đặt nó bằng số ngẫu nhiên mà + +90 +00:06:19,490 --> 00:06:23,720 +chúng tôi đã tạo ở đây. Bây giờ, khi mẫu này được hiển + +91 +00:06:23,990 --> 00:06:28,040 +thị, nó sẽ chuyển qua biến này với tên này và với giá trị này. + +92 +00:06:28,550 --> 00:06:32,750 +Vì vậy, bây giờ trong chỉ mục của chúng tôi. html, tôi có thể nhấn vào tên + +93 +00:06:32,780 --> 00:06:33,650 +biến đó + +94 +00:06:33,980 --> 00:06:38,980 +là num và tôi có thể chèn nó bằng cách sử dụng các dấu ngoặc nhọn kép này + +95 +00:06:39,260 --> 00:06:42,530 +vào vị trí mà tôi muốn. Vì vậy, đó là sẽ đi vào bên trong h3 đó. + +96 +00:06:43,010 --> 00:06:47,030 +Và bây giờ nếu tôi nhấn lưu và tiếp tục và làm mới trang web của mình, bạn + +97 +00:06:47,270 --> 00:06:51,290 +có thể thấy tôi đã có số ngẫu nhiên này và sau đó một số hiển thị. + +98 +00:06:51,680 --> 00:06:53,330 +Và mỗi khi tôi nhấn làm + +99 +00:06:53,570 --> 00:06:58,570 +mới, bạn có thể thấy số đó thay đổi thành một số ngẫu nhiên khác từ 1 đến 10. + +100 +00:06:59,600 --> 00:07:04,430 +Vì vậy, chúng tôi đã thấy cách chúng tôi có thể hiển thị tệp HTML chỉ bằng cách sử + +101 +00:07:04,430 --> 00:07:07,640 +dụng mẫu kết xuất, nhưng chúng tôi cũng thấy rằng bên trong + +102 +00:07:07,910 --> 00:07:12,860 +mẫu, chúng tôi có thể sử dụng các dấu ngoặc nhọn kép này để tạo các dòng biểu thức + +103 +00:07:12,860 --> 00:07:13,693 +Python đơn + +104 +00:07:13,880 --> 00:07:18,620 +có thể được đánh giá và sau đó được chèn vào vị trí mà chúng ta mong muốn. + +105 +00:07:19,160 --> 00:07:23,270 +Bây giờ, chúng tôi cũng đã thấy rằng chúng tôi có thể chuyển + +106 +00:07:23,270 --> 00:07:27,920 +bất kỳ biến nào chúng tôi muốn làm đối số từ khóa sau tên của mẫu. + +107 +00:07:28,610 --> 00:07:32,930 +Vì vậy, bây giờ tôi có một thử thách cho bạn. Trên nhiều trang web, chẳng hạn như + +108 +00:07:32,930 --> 00:07:36,500 +nếu bạn truy cập trang web Jinja mà bạn sẽ tìm thấy trong + +109 +00:07:36,650 --> 00:07:41,270 +tài nguyên khóa học và cuộn xuống dưới cùng, thường có một dòng văn bản bản quyền. + +110 +00:07:41,570 --> 00:07:44,270 +Vì vậy, nó sẽ cho biết bản quyền và năm hiện tại và + +111 +00:07:44,660 --> 00:07:47,030 +sau đó là tên của người sáng tạo hoặc công ty. + +112 +00:07:47,840 --> 00:07:52,840 +Bây giờ năm đó được cho là năm hiện tại để nói rằng bản quyền của trang + +113 +00:07:54,440 --> 00:07:57,470 +web này có giá trị trong năm hiện tại. + +114 +00:07:58,010 --> 00:08:01,100 +Nhưng rất thường xuyên, kể cả Jinja, họ không thực sự cập + +115 +00:08:01,430 --> 00:08:06,170 +nhật footer của mình vì nó có thể chỉ là một số văn bản được mã hóa cứng, + +116 +00:08:06,170 --> 00:08:10,670 +như bạn có thể thấy ngay tại đây. Bây giờ, đây là một cái + +117 +00:08:10,700 --> 00:08:15,260 +gì đó làm phiền rất nhiều nhà phát triển web và nhà thiết kế web. + +118 +00:08:15,920 --> 00:08:20,870 +Và họ bị xúc phạm bởi ý tưởng rằng mọi người sẽ chỉ có một số văn bản thuần túy + +119 +00:08:21,200 --> 00:08:23,960 +làm bản quyền của họ. Chúng tôi là lập trình viên, phải không? + +120 +00:08:23,990 --> 00:08:28,990 +Chúng ta có thể cập nhật động chân trang của mình bằng cách sử dụng mã. + +121 +00:08:29,780 --> 00:08:34,780 +Và đây là một trang web có khá nhiều loại chiến dịch chống lại các + +122 +00:08:35,510 --> 00:08:40,340 +trang web có chân trang lỗi thời. Và nếu bạn nhìn vào footer của họ, bạn có + +123 +00:08:40,429 --> 00:08:43,460 +thể thấy rằng đây không chỉ là một đoạn văn bản thuần túy. + +124 +00:08:43,789 --> 00:08:48,790 +Đây thực sự là một tập lệnh sử dụng JavaScript để tính ra + +125 +00:08:50,030 --> 00:08:55,010 +giá trị của năm hiện tại. Và vì vậy nó sẽ luôn được cập nhật cho dù đó là năm nào. + +126 +00:08:55,560 --> 00:08:59,250 +Vì vậy, chúng tôi cũng muốn có một năm chân trang năng động, nhưng + +127 +00:08:59,790 --> 00:09:03,960 +chúng tôi sẽ không làm điều đó với JavaScript và chắc chắn là không với PHP. + +128 +00:09:04,350 --> 00:09:06,150 +Chúng tôi sẽ làm điều đó với Python. + +129 +00:09:07,290 --> 00:09:11,580 +Vì vậy, đây là thách thức cho bạn. Sử dụng những gì bạn đã học trong bài + +130 +00:09:11,880 --> 00:09:16,880 +học này, hãy xem liệu bạn có thể tạo phần tử footer để chúng tôi có thể đặt nó bên trong thẻ + +131 +00:09:17,340 --> 00:09:19,920 +footer như thế này không. Và bên trong + +132 +00:09:20,040 --> 00:09:24,570 +thẻ footer này, tôi muốn bạn tạo một phần tử đoạn văn có thể nói + +133 +00:09:24,990 --> 00:09:29,250 +bất kỳ đoạn văn bản nào miễn là nó có chứa năm bản quyền, + +134 +00:09:29,310 --> 00:09:32,310 +phải là năm hiện tại được lập trình bằng Python. + +135 +00:09:32,970 --> 00:09:36,390 +Tạm dừng video và suy nghĩ về cách bạn có thể giải quyết thử thách đó. + +136 +00:09:41,520 --> 00:09:41,910 +Được rồi. + +137 +00:09:41,910 --> 00:09:45,960 +Vì vậy, điều đầu tiên chúng tôi sẽ làm là tạo đoạn văn của chúng tôi và + +138 +00:09:45,960 --> 00:09:50,370 +chúng tôi sẽ nói một cái gì đó như bản quyền và sau đó là năm và sau + +139 +00:09:50,700 --> 00:09:52,680 +đó chúng tôi sẽ nói, ừm, một + +140 +00:09:52,740 --> 00:09:57,740 +cái gì đó giống như được xây dựng bởi ... Đây là một footer khá phổ biến. + +141 +00:09:59,190 --> 00:10:02,370 +Bây giờ những gì chúng tôi muốn làm là chúng tôi muốn thay + +142 +00:10:02,370 --> 00:10:06,480 +thế các YYYY này bằng năm thực tế. Vì vậy, như bạn có thể + +143 +00:10:06,510 --> 00:10:11,510 +tưởng tượng, tôi sẽ sử dụng dấu ngoặc nhọn kép này để chèn năm vào đây. + +144 +00:10:12,180 --> 00:10:16,230 +Nhưng trước tiên tôi phải tạo ra điều đó. Vì vậy, quay trở lại máy chủ của chúng tôi. py, tôi sẽ + +145 +00:10:16,590 --> 00:10:19,050 +nhập mô-đun datetime mà bạn đã + +146 +00:10:19,050 --> 00:10:24,050 +sử dụng nhiều lần trước đây để tạo ngày và giờ hiện tại. + +147 +00:10:24,600 --> 00:10:27,300 +Và chúng tôi sẽ sử dụng nó đặc biệt vào lần này, + +148 +00:10:27,330 --> 00:10:28,890 +để tạo ra năm hiện tại. + +149 +00:10:30,840 --> 00:10:34,920 +Và nó sẽ được thực hiện bằng cách sử dụng mô-đun datetime, lớp datetime, sau + +150 +00:10:35,250 --> 00:10:39,330 +đó chúng ta sẽ gọi phương thức now để lấy ngày giờ hiện tại và + +151 +00:10:39,330 --> 00:10:42,120 +sau đó chúng ta sẽ khai thác thuộc tính year. + +152 +00:10:42,900 --> 00:10:47,730 +Vì vậy, bây giờ ngoài việc chuyển số ngẫu nhiên đó dưới dạng num, tôi cũng + +153 +00:10:48,060 --> 00:10:53,060 +sẽ chuyển qua một biến mới với tên của năm và giá trị của năm hiện tại + +154 +00:10:53,520 --> 00:10:56,310 +mà chúng ta vừa tìm ra từ đây. + +155 +00:10:56,940 --> 00:10:59,460 +Vì vậy, bây giờ khi mẫu này được hiển + +156 +00:10:59,490 --> 00:11:02,400 +thị, nó cũng sẽ nhận được một biến có tên là + +157 +00:11:02,730 --> 00:11:06,720 +năm mà chúng ta có thể chèn ngay tại đây vào bản quyền như vậy. + +158 +00:11:07,410 --> 00:11:11,310 +Vì vậy, bây giờ nếu tôi tiếp tục và nhấn lưu, quay lại trang web + +159 +00:11:11,610 --> 00:11:16,470 +của chúng tôi, nhấn làm mới, bạn có thể thấy chân trang của chúng tôi hiển thị bản quyền + +160 +00:11:16,530 --> 00:11:20,820 +2020, là năm hiện tại tôi đang sống và nó có phần còn lại của văn bản. + +161 +00:11:21,240 --> 00:11:23,580 +Vì vậy, bây giờ cho dù đó là năm nào, + +162 +00:11:23,640 --> 00:11:28,640 +chúng tôi sẽ không bao giờ cần phải cập nhật chân trang của mình nữa vì nó được cập nhật tự + +163 +00:11:28,890 --> 00:11:30,480 +động bằng cách sử dụng mã. + diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 day-57-start.zip b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 day-57-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..2703b8327665419780d677c53a68966667562e81 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/002 day-57-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c152ebfbfe0b0e0cd1dd0a9220042fe1e7e29cd70e86526f43937622a94a1fcf +size 263 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Agify-API.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Agify-API.url new file mode 100644 index 0000000000000000000000000000000000000000..2de2dcdeccf5bac35bb4f614599d00f2849d155d --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Agify-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://agify.io/ \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Challenge Combining Jinja Templating with APIs.mp4 b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Challenge Combining Jinja Templating with APIs.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9f7144d43988670ede34d2e5a909854b1ff9dd20 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Challenge Combining Jinja Templating with APIs.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41a04e6aae3d35497e7b636bb67fc1ce4263b3e9a64852d9fde0f0db3cf6c3e7 +size 95236516 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Challenge Combining Jinja Templating with APIs_vi.srt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Challenge Combining Jinja Templating with APIs_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f3134923190e4db3b668c2be4b417067ac3b410f --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Challenge Combining Jinja Templating with APIs_vi.srt @@ -0,0 +1,704 @@ +1 +00:00:00,360 --> 00:00:03,690 +Bây giờ bạn đã thấy rằng chúng tôi có thể viết mã trong máy + +2 +00:00:04,080 --> 00:00:07,950 +chủ của mình, tính ra một số loại giá trị hoặc lấy một số phần dữ liệu + +3 +00:00:08,340 --> 00:00:12,000 +và sau đó chúng tôi có thể gửi nó đến mẫu của chúng tôi để + +4 +00:00:12,660 --> 00:00:16,650 +được hiển thị, tôi có một thách thức cho bạn để kiểm tra một số điều bạn đã + +5 +00:00:16,650 --> 00:00:20,340 +học được từ những ngày trước cũng như những gì chúng tôi đã làm với Flask + +6 +00:00:20,400 --> 00:00:21,570 +trong vài ngày qua. + +7 +00:00:22,440 --> 00:00:25,800 +Tôi đã tìm thấy một API khá thú vị được gọi là + +8 +00:00:26,280 --> 00:00:30,600 +agify và cũng có giới tính hóa. Đây là một API thực sự đơn giản. + +9 +00:00:30,630 --> 00:00:34,620 +Nó không yêu cầu bạn đăng ký và không yêu cầu bất kỳ xác thực nào. + +10 +00:00:35,370 --> 00:00:40,370 +Những gì bạn có thể làm với nó là bạn có thể truy cập vào URL của API và + +11 +00:00:41,610 --> 00:00:44,640 +sau đó bạn có thể chuyển một giá trị cho tên. + +12 +00:00:45,090 --> 00:00:47,880 +Và nó sẽ dự đoán tuổi của một cái tên. + +13 +00:00:48,810 --> 00:00:51,690 +Bạn có thể tiếp tục và nhấn thử tôi để xem những gì bạn nhận được. + +14 +00:00:52,230 --> 00:00:55,200 +Bạn có thể thấy nó là một JSON rất đơn giản mà bạn lấy lại được. + +15 +00:00:55,410 --> 00:01:00,410 +Và điều này mô tả tên mà bạn đã nhập, tuổi ước tính của người + +16 +00:01:01,560 --> 00:01:02,393 +có tên + +17 +00:01:02,730 --> 00:01:07,440 +đó, cũng như số lần họ đã lấy mẫu tên này khi tính toán dữ + +18 +00:01:07,470 --> 00:01:08,303 +liệu này. + +19 +00:01:09,270 --> 00:01:14,040 +Bây giờ một cái khác được xác định giới tính nơi bạn có thể nhập tên và nó sẽ cung cấp cho + +20 +00:01:14,040 --> 00:01:15,480 +bạn giới tính được dự đoán. + +21 +00:01:16,170 --> 00:01:21,000 +Vì vậy, tôi phải nói từ thử nghiệm rằng tôi nghĩ genderize chính xác hơn nhiều + +22 +00:01:21,030 --> 00:01:21,863 +so với + +23 +00:01:22,080 --> 00:01:26,640 +agify, nhưng có lẽ tôi hơi buồn vì nó nói rằng những người có + +24 +00:01:26,640 --> 00:01:30,920 +tên tôi trung bình là 63 tuổi. Nhưng này, bạn biết đấy, tôi đang làm + +25 +00:01:30,950 --> 00:01:35,420 +khá tốt đối với một người đàn ông 63 tuổi. Vì vậy, tôi không thể phàn nàn. + +26 +00:01:36,350 --> 00:01:41,620 +Bây giờ, những gì tôi muốn bạn làm là biến ứng dụng này thành một ứng dụng Flask động. + +27 +00:01:43,580 --> 00:01:48,580 +Chúng tôi sẽ thiết lập một lộ trình mới trong ứng dụng của mình và nó + +28 +00:01:50,630 --> 00:01:54,410 +nằm trong lộ trình / đoán. Bây giờ sau / đoán chúng ta sẽ + +29 +00:01:54,500 --> 00:01:57,080 +đặt một cái tên. Vì vậy, ví + +30 +00:01:57,080 --> 00:02:01,820 +dụ, / đoán / Angela và những gì nó sẽ cung cấp cho chúng ta + +31 +00:02:02,030 --> 00:02:05,600 +là Hey, và sau đó là tên được nhập vào URL. + +32 +00:02:06,170 --> 00:02:08,360 +Và sau đó nó sẽ nói rằng, tôi nghĩ bạn là và sau đó + +33 +00:02:08,570 --> 00:02:11,840 +là giới tính được dự đoán từ giới tính. io. + +34 +00:02:12,530 --> 00:02:16,640 +Và sau đó nó sẽ cho tôi biết nó dự đoán tên đó là bao nhiêu tuổi. + +35 +00:02:17,180 --> 00:02:22,180 +Bây giờ điều này phù hợp với bất kỳ tên nào nên tôi có thể đổi nó thành James hoặc Katie. + +36 +00:02:26,660 --> 00:02:29,030 +Và nó không thực sự quan trọng tôi nhập gì ở đây. + +37 +00:02:29,180 --> 00:02:33,320 +Phần dữ liệu này đến từ hai API này. + +38 +00:02:34,010 --> 00:02:37,370 +Bây giờ, bạn có thể phải nghĩ lại một chút khi chúng + +39 +00:02:37,370 --> 00:02:41,870 +ta tìm hiểu về cách bạn sử dụng mô-đun yêu cầu để nắm giữ dữ liệu + +40 +00:02:41,870 --> 00:02:46,640 +mà chúng ta muốn từ một API. Và sau đó bạn sẽ kết hợp nó vào một + +41 +00:02:46,850 --> 00:02:47,960 +trang web mà bạn + +42 +00:02:48,290 --> 00:02:52,970 +có thể thiết kế theo cách bạn muốn, nhưng lưu ý rằng dòng đầu tiên cần phải có tên đã + +43 +00:02:52,970 --> 00:02:57,970 +được nhập vào URL và tên lý tưởng nên được viết hoa thành chữ hoa tiêu đề như thế này , + +44 +00:02:59,230 --> 00:03:02,830 +và sau đó nó phải có giới tính dự đoán và độ tuổi dự đoán. + +45 +00:03:03,370 --> 00:03:07,930 +Vì vậy, đây là thách thức của bạn và bạn có thể mất một chút thời gian để tìm ra tất cả + +46 +00:03:07,930 --> 00:03:10,360 +các thành phần, nhưng tôi nghĩ bạn có thể làm được. + +47 +00:03:10,750 --> 00:03:15,750 +Tạm dừng video và dành ít nhất 15 hoặc 20 phút để thực hiện thử thách này và xem bạn có thể + +48 +00:03:16,090 --> 00:03:17,470 +hoàn thành nó hay không. + +49 +00:03:17,860 --> 00:03:21,610 +Hãy nhớ rằng bạn luôn có tài liệu trợ giúp. + +50 +00:03:21,610 --> 00:03:26,200 +Vì vậy, có tài liệu Flask, có tài liệu Jinja, cũng có + +51 +00:03:26,200 --> 00:03:31,060 +tài liệu từ agify và genderize. io. + +52 +00:03:31,540 --> 00:03:35,380 +Và nếu có bất cứ điều gì khác, bạn luôn có thể tìm kiếm + +53 +00:03:35,380 --> 00:03:39,940 +trong khóa học về phần mà chúng tôi đã xử lý API và nắm giữ dữ liệu từ + +54 +00:03:40,420 --> 00:03:44,710 +API, cũng như sử dụng Google và Stack Overflow để giúp bạn đạt được điều này. + +55 +00:03:45,520 --> 00:03:47,500 +Đừng bỏ cuộc. Nếu bạn gặp khó + +56 +00:03:47,710 --> 00:03:51,730 +khăn, hãy cố gắng làm việc như một nhà phát triển trong thế giới thực và tìm + +57 +00:03:51,730 --> 00:03:55,570 +ra giải pháp cho vấn đề của bạn. Được rồi. + +58 +00:03:55,600 --> 00:04:00,100 +Vì vậy, điều đầu tiên chúng ta phải làm là thiết lập tuyến đường + +59 +00:04:00,160 --> 00:04:03,760 +/ đoán / tên này. Quay lại bên trong máy chủ của chúng tôi sau khi + +60 +00:04:04,000 --> 00:04:06,100 +chúng tôi đã xác định tuyến đường về nhà của mình, hãy tiếp + +61 +00:04:06,340 --> 00:04:08,410 +tục và tạo ứng dụng. tuyến đường và + +62 +00:04:08,800 --> 00:04:13,800 +ở đây chúng ta sẽ nhắm mục tiêu / đoán và sau đó là / tên. + +63 +00:04:14,440 --> 00:04:19,440 +Bây giờ vì chúng ta cần chuyển URL để nắm được tên mà người dùng đã + +64 +00:04:19,750 --> 00:04:23,710 +nhập, nếu chúng ta xem tài liệu Flask, bạn có thể nhớ + +65 +00:04:24,010 --> 00:04:29,010 +rằng ngày hôm qua chúng ta đã đề cập đến ý tưởng về các quy tắc + +66 +00:04:29,230 --> 00:04:31,150 +biến và chuyển một URL. + +67 +00:04:31,930 --> 00:04:36,910 +Cách chúng tôi thực hiện là thêm một số dấu ngoặc nhọn xung quanh phần URL sẽ + +68 +00:04:37,180 --> 00:04:41,860 +được sử dụng dưới dạng một biến. Và đây là ví dụ của họ. + +69 +00:04:42,520 --> 00:04:43,480 +Vì vậy, trong + +70 +00:04:43,510 --> 00:04:48,510 +trường hợp của chúng tôi, chúng tôi sẽ đặt tên này một phần của URL bên trong một số + +71 +00:04:49,480 --> 00:04:54,250 +dấu ngoặc nhọn để biến nó thành một biến. Và sau đó chúng ta có thể tạo hàm của + +72 +00:04:54,790 --> 00:04:58,870 +mình mà tôi sẽ gọi là đoán. Ừm, nó không thực sự quan trọng bạn gọi nó là gì. + +73 +00:04:59,350 --> 00:05:04,180 +Và sau đó bên trong phương pháp đoán này, tôi sẽ đặt tên này. + +74 +00:05:04,870 --> 00:05:09,870 +Vì vậy, về cơ bản khi hàm đoán của tôi đi qua phương thức decorator này, nó + +75 +00:05:10,840 --> 00:05:15,160 +sẽ cung cấp cho nó một giá trị cho biến tên này, sau đó + +76 +00:05:15,790 --> 00:05:20,350 +tôi sẽ bắt kịp tên đó và tôi sẽ gửi nó khi tôi kết xuất + +77 +00:05:20,350 --> 00:05:21,580 +mẫu của mình. + +78 +00:05:23,380 --> 00:05:26,650 +Vì vậy, hãy tiếp tục và tạo một mẫu mới để kết xuất. + +79 +00:05:27,010 --> 00:05:31,360 +Vì vậy, nó sẽ là một tệp HTML mà tôi chỉ gọi là đoán. html. + +80 +00:05:33,010 --> 00:05:36,670 +Và tôi sẽ để tiêu đề như phỏng đoán. Bây giờ bên trong + +81 +00:05:36,700 --> 00:05:39,310 +cơ thể, tôi muốn có thể gõ tên. + +82 +00:05:39,370 --> 00:05:42,760 +Vì vậy, nó là Hey, và sau đó là tên. + +83 +00:05:44,500 --> 00:05:47,560 +Và sau đó là, tôi nghĩ bạn là và sau + +84 +00:05:49,570 --> 00:05:53,650 +đó là giới tính, và cuối cùng là, và có thể và tuổi của bạn. + +85 +00:05:54,580 --> 00:05:58,190 +Vì vậy, một cái gì đó như thế này. Bây giờ chúng ta chỉ cần thay + +86 +00:05:58,490 --> 00:06:00,110 +thế tên, giới tính và tuổi. + +87 +00:06:00,500 --> 00:06:05,500 +Vì vậy, tôi sẽ giữ những cái tên đó và tôi sẽ chỉ gói chúng lại như thế này. + +88 +00:06:10,130 --> 00:06:12,830 +Bây giờ nhớ tên của các biến này, tôi + +89 +00:06:12,860 --> 00:06:17,860 +sẽ quay lại máy chủ của mình và tôi sẽ thử đưa ra dự đoán của mình. + +90 +00:06:18,680 --> 00:06:21,440 +html. Vì vậy, nó là render_template, + +91 +00:06:21,560 --> 00:06:25,040 +tên của mẫu được gọi là đoán. html, và sau đó + +92 +00:06:25,370 --> 00:06:28,700 +tôi sẽ thêm một loạt các đối số từ khóa. + +93 +00:06:29,210 --> 00:06:30,800 +Vì vậy, cái đầu tiên + +94 +00:06:30,830 --> 00:06:34,340 +là tên, vì vậy đây là tên của đối số từ khóa. + +95 +00:06:34,700 --> 00:06:38,720 +Và sau đó giá trị cũng sẽ được đặt tên vì nó sẽ đến + +96 +00:06:38,720 --> 00:06:41,150 +từ URL này. Nếu bạn thấy điều đó khó hiểu, + +97 +00:06:41,180 --> 00:06:43,790 +bạn luôn có thể thay đổi điều này. Ví dụ: bạn có + +98 +00:06:43,820 --> 00:06:46,670 +thể thay đổi tên này thành tên_người và chúng ta có + +99 +00:06:48,680 --> 00:06:50,990 +thể sử dụng tên đó ngay tại đây. + +100 +00:06:51,770 --> 00:06:55,700 +Bây giờ bạn có thể thấy rằng tên này đến từ + +101 +00:06:55,700 --> 00:07:00,680 +URL được chuyển qua đầu vào và tên_người này là tên mà chúng tôi + +102 +00:07:00,740 --> 00:07:05,270 +sử dụng khi đưa vào mẫu. Hãy tiếp tục và kiểm tra điều này. + +103 +00:07:05,840 --> 00:07:10,840 +Hãy bình luận về hai dòng mã này bằng cách nhấn vào dấu gạch chéo về phía trước + +104 +00:07:11,030 --> 00:07:15,140 +hoặc điều khiển dấu gạch chéo lên phía trước, sau đó nhấn lưu và chạy + +105 +00:07:15,200 --> 00:07:20,180 +mã và hãy thử truy cập URL này. Vì vậy, bạn có thể thấy nó nói Hey, và + +106 +00:07:20,180 --> 00:07:23,900 +sau đó nó nói bất cứ điều gì mà chúng tôi đã nhập sau khi đoán. + +107 +00:07:24,200 --> 00:07:26,390 +Vì vậy, nếu bạn gõ cả đống goop ngổ ngáo, thì đó cũng là + +108 +00:07:26,600 --> 00:07:29,960 +những gì chúng ta sẽ thấy ngay tại đây. Bây giờ, một trong những + +109 +00:07:29,990 --> 00:07:34,190 +điều về tên là sẽ rất hay nếu có nó trong trường hợp tiêu đề. + +110 +00:07:34,610 --> 00:07:39,610 +Vì vậy, chúng ta có thể thay đổi mọi thứ thành chữ hoa tiêu đề bằng cách sử dụng phương thức tiêu đề Python, nơi + +111 +00:07:41,090 --> 00:07:43,760 +chúng ta chỉ cần nói txt. Tiêu đề. + +112 +00:07:44,840 --> 00:07:48,200 +Chúng tôi có thể làm điều đó trong suy đoán của chúng tôi. html vì chúng tôi biết + +113 +00:07:48,230 --> 00:07:52,790 +rằng chúng tôi có thể đánh giá các biểu thức Python ở giữa các + +114 +00:07:52,790 --> 00:07:56,450 +dấu ngoặc kép. Chúng ta có thể nói tên_người. tiêu đề và + +115 +00:07:56,840 --> 00:07:58,550 +sau đó là dấu ngoặc đơn. + +116 +00:07:59,120 --> 00:08:04,120 +Vì vậy, bây giờ, nếu chúng ta lưu điều đó, quay lại đây và chúng ta quay lại Katie + +117 +00:08:05,660 --> 00:08:08,210 +của chúng ta và nhấn enter, bạn có thể + +118 +00:08:08,210 --> 00:08:13,130 +thấy nó bây giờ được viết hoa rằng K và ký tự đầu tiên luôn luôn được viết hoa. + +119 +00:08:14,720 --> 00:08:16,220 +Chúng tôi đã giải quyết phần đầu tiên. + +120 +00:08:16,520 --> 00:08:20,450 +Bây giờ chúng ta cần tìm ra giới tính và độ tuổi. Và để làm được điều đó, chúng + +121 +00:08:20,560 --> 00:08:24,650 +ta sẽ cần sự trợ giúp của hai API này; giới tính hóa và tăng tuổi thọ. + +122 +00:08:25,250 --> 00:08:28,640 +Vì vậy, API có lẽ là API đơn giản nhất mà bạn đã làm việc. + +123 +00:08:28,970 --> 00:08:31,880 +Trước đây, bạn đã làm việc với nhiều API phức tạp hơn. + +124 +00:08:32,150 --> 00:08:33,679 +Vì vậy, không nên quá khó. + +125 +00:08:34,130 --> 00:08:38,000 +Bây giờ những gì chúng tôi muốn làm là chúng tôi muốn thay thế phần + +126 +00:08:38,030 --> 00:08:42,380 +nói Peter này bằng bất cứ thứ gì mà người dùng đã nhập vào URL ngay tại đây. + +127 +00:08:43,070 --> 00:08:47,630 +Chúng tôi sẽ cần lấy toàn bộ chuỗi này và chúng tôi sẽ dán + +128 +00:08:47,960 --> 00:08:50,240 +nó vào và đây sẽ là URL. + +129 +00:08:52,730 --> 00:08:56,400 +Bây giờ chúng ta sẽ thay thế phần này bằng một chuỗi f. + +130 +00:08:56,970 --> 00:09:01,470 +Vì vậy, chúng ta có một F ở phía trước của chuỗi, và sau đó bên trong + +131 +00:09:01,740 --> 00:09:05,430 +dấu ngoặc nhọn, chúng ta có thể đặt tên được chuyển từ URL. + +132 +00:09:06,150 --> 00:09:07,890 +Vì vậy, đó là URL giới tính. + +133 +00:09:08,460 --> 00:09:11,550 +Và để lấy dữ liệu từ URL đó, chúng ta + +134 +00:09:11,730 --> 00:09:13,950 +sẽ cần thư viện yêu cầu. + +135 +00:09:14,070 --> 00:09:16,800 +Vì vậy, hãy tiếp tục và nhập các yêu cầu + +136 +00:09:18,690 --> 00:09:21,660 +và cài đặt nó nếu nó có màu đỏ và nguệch ngoạc. + +137 +00:09:25,730 --> 00:09:26,090 +1: Đúng. + +138 +00:09:26,090 --> 00:09:30,500 +0: Bây giờ, sau khi nó được cài đặt, bây giờ chúng ta có thể sử dụng các yêu cầu. lấy và chúng tôi + +139 +00:09:30,800 --> 00:09:35,330 +có thể nắm giữ dữ liệu tại giới_trình này. + +140 +00:09:35,930 --> 00:09:39,830 +Và đây sẽ là câu trả lời giới_trình của chúng tôi. + +141 +00:09:40,160 --> 00:09:40,993 +1: Đúng. + +142 +00:09:43,400 --> 00:09:45,050 +0: Bây giờ, từ world_response này, + +143 +00:09:45,080 --> 00:09:50,080 +chúng tôi có thể nắm giữ dữ liệu giới tính và chúng tôi muốn nó ở định dạng JSON. + +144 +00:09:50,270 --> 00:09:53,870 +Vì vậy, chúng ta có thể nói world_response. json. + +145 +00:09:54,380 --> 00:09:57,650 +Tôi sẽ không giải thích điều này quá nhiều vì chúng ta đã đi vào + +146 +00:09:57,650 --> 00:10:00,260 +chi tiết trước về cách làm việc với JSON, cách + +147 +00:10:00,260 --> 00:10:03,140 +làm việc với API và cách làm việc với thư viện yêu cầu. + +148 +00:10:03,440 --> 00:10:04,940 +Tôi hy vọng rằng giai đoạn này + +149 +00:10:04,940 --> 00:10:08,300 +chỉ là một chút sửa đổi và bạn chỉ cần tra cứu một số phương pháp, nhưng + +150 +00:10:08,600 --> 00:10:11,240 +bạn đã thấy điều này trước đây và nó sẽ khá quen thuộc. + +151 +00:10:12,560 --> 00:10:15,140 +Vì vậy, bây giờ cuối cùng, từ dữ + +152 +00:10:15,170 --> 00:10:20,090 +liệu giới tính, chúng tôi muốn trích xuất một phần thú vị của từ điển đó, + +153 +00:10:20,330 --> 00:10:23,390 +thực ra chỉ là phần trong giới tính quan trọng. + +154 +00:10:23,930 --> 00:10:27,980 +Vì vậy, hãy tiếp tục và thêm dấu ngoặc vuông của chúng tôi và sau đó đặt giới tính vào đây. + +155 +00:10:28,310 --> 00:10:31,910 +Và điều này sẽ bình đẳng với giới tính của chúng ta. + +156 +00:10:32,630 --> 00:10:34,880 +Và đó là những gì chúng ta sẽ vượt qua. + +157 +00:10:36,320 --> 00:10:38,960 +Vì vậy, chúng ta sẽ nói giới tính = giới tính. + +158 +00:10:39,740 --> 00:10:43,850 +Và điều đó có nghĩa là một khi chúng ta bắt đầu phỏng đoán. html, nó sẽ có thể đặt + +159 +00:10:44,150 --> 00:10:48,770 +giá trị vào trình giữ chỗ này. Bây giờ, tất cả những gì + +160 +00:10:48,770 --> 00:10:50,960 +còn lại là tính tuổi. + +161 +00:10:52,010 --> 00:10:54,560 +Vì vậy, hãy lấy URL agify của chúng tôi. + +162 +00:10:57,110 --> 00:10:57,943 +1: Đúng. + +163 +00:10:58,010 --> 00:11:01,250 +0: Và điều này sẽ khá đơn giản vì nó sẽ khá giống với + +164 +00:11:01,250 --> 00:11:03,530 +những gì chúng tôi đã làm cho giới tính. + +165 +00:11:08,420 --> 00:11:09,110 +1: Vâng. + +166 +00:11:09,110 --> 00:11:12,800 +0: Và nếu bạn xem lại JSON mà bạn nhận được từ việc gọi API này, thì + +167 +00:11:13,190 --> 00:11:18,110 +phần dữ liệu quan trọng nằm trong thời đại khóa đó. Bây giờ, tất cả những gì chúng ta + +168 +00:11:18,110 --> 00:11:22,430 +cần làm là chuyển qua một biến mới có tên là age và giá + +169 +00:11:22,760 --> 00:11:25,130 +trị sẽ đến từ ngay tại đây. + +170 +00:11:27,980 --> 00:11:28,370 +1: Tuyệt vời. + +171 +00:11:28,370 --> 00:11:33,370 +0: Vì vậy, bây giờ nếu chúng ta nhấn lưu và quay lại trang web của mình và nhấn enter, nó sẽ + +172 +00:11:34,700 --> 00:11:38,930 +nói, Này, Katie, tôi nghĩ bạn là nữ. Và có thể là 32 tuổi. + +173 +00:11:39,500 --> 00:11:44,360 +Tại sao Katie lại trẻ hơn tôi? Dù sao đi nữa. Tôi hy vọng bạn quản lý để làm cho điều đó hoạt động. + +174 +00:11:44,570 --> 00:11:45,230 +Nếu không, + +175 +00:11:45,230 --> 00:11:49,550 +hãy xem mã cuối cùng trong tài nguyên khóa học và xem bạn đã sai + +176 +00:11:49,550 --> 00:11:53,360 +ở đâu và có thể sửa lại phần trong khóa học về API. + diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Genderize-API.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Genderize-API.url new file mode 100644 index 0000000000000000000000000000000000000000..f5aae9cfecf40ccb384f8879dd229adbd9a2d878 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/003 Genderize-API.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://genderize.io/ \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Create-your-own-bin-with-npoint.io.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Create-your-own-bin-with-npoint.io.url new file mode 100644 index 0000000000000000000000000000000000000000..6792727a02591d5f146284210a4a8fafefe9eb68 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Create-your-own-bin-with-npoint.io.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.npoint.io/ \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Flask-Docs-Routing.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Flask-Docs-Routing.url new file mode 100644 index 0000000000000000000000000000000000000000..1f4ec821d989d1246ddadc22eec80092490ec3c1 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Flask-Docs-Routing.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://flask.palletsprojects.com/en/1.1.x/quickstart/#routing \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Multiline Statements with Jinja.mp4 b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Multiline Statements with Jinja.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d5ea16c4d380a12c855bffbc20782b805b6f68a9 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Multiline Statements with Jinja.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa29e89076c0b3bce5636f6dda71b291917836a9349fbd7047b367d489528c6c +size 85628156 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Multiline Statements with Jinja_vi.srt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Multiline Statements with Jinja_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3c5d7badfc5d3cef2be84123e60b0c5d0b41c170 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 Multiline Statements with Jinja_vi.srt @@ -0,0 +1,436 @@ +1 +00:00:00,210 --> 00:00:01,350 +Trong các bài + +2 +00:00:01,380 --> 00:00:06,380 +học trước, chúng ta đã biết cách sử dụng đánh dấu Jinja để chèn các + +3 +00:00:06,780 --> 00:00:10,860 +bit mã Python vào mẫu HTML. Bây giờ, trong bài + +4 +00:00:10,890 --> 00:00:14,670 +học này, tôi muốn làm sáng tỏ một số + +5 +00:00:15,030 --> 00:00:19,410 +đánh dấu khác như {% và một số từ khóa này. + +6 +00:00:20,160 --> 00:00:20,520 +Bây + +7 +00:00:20,520 --> 00:00:25,170 +giờ, những gì chúng tôi có thể làm với đánh dấu này là chỉ định các + +8 +00:00:25,200 --> 00:00:27,240 +biểu thức dòng đơn trong Python. + +9 +00:00:27,780 --> 00:00:32,430 +Nhưng nếu chúng ta muốn tạo các câu lệnh nhiều dòng như câu lệnh if + +10 +00:00:32,430 --> 00:00:36,780 +hoặc vòng lặp for thì sao? Chà, chúng ta sẽ phải sử dụng một số đánh dấu hơi khác một chút. + +11 +00:00:37,500 --> 00:00:42,090 +Tôi sẽ tiếp tục và tạo một tệp HTML mới mà tôi sẽ gọi là blog. + +12 +00:00:43,050 --> 00:00:46,440 +Và điều này sẽ có tiêu đề của blog và trong phần nội dung, điều tôi muốn làm là hiển + +13 +00:00:46,470 --> 00:00:51,470 +thị tất cả các tiêu đề của tất cả các blog mà tôi có. Bây giờ để nắm giữ một số dữ liệu cho + +14 +00:00:53,370 --> 00:00:56,040 +các blog của chúng tôi, chúng tôi sẽ sử dụng một + +15 +00:00:56,340 --> 00:01:00,750 +dịch vụ được gọi là điểm cuối. Và đây là một dịch vụ thực sự + +16 +00:01:00,810 --> 00:01:03,600 +gọn gàng, chỉ hoạt động như một thùng lưu trữ JSON. + +17 +00:01:04,110 --> 00:01:08,400 +Vì vậy, về cơ bản bạn có thể tạo API của riêng mình với dữ liệu JSON của riêng bạn và bạn + +18 +00:01:08,820 --> 00:01:11,940 +thậm chí không cần phải đăng nhập. Nó đơn giản như nhấp + +19 +00:01:12,180 --> 00:01:16,980 +vào, tạo JSON bin, và sau đó tại đây bạn có thể tạo một số, um, khóa, + +20 +00:01:17,040 --> 00:01:19,980 +một số giá trị hoặc danh sách các giá trị. + +21 +00:01:20,490 --> 00:01:22,170 +Và khi bạn đã hoàn thành + +22 +00:01:22,200 --> 00:01:25,980 +việc đó, bạn có thể tiếp tục và truy cập thùng này tại API cụ thể này + +23 +00:01:26,370 --> 00:01:29,070 +và bạn có thể thấy nó gửi lại cho bạn JSON đó. + +24 +00:01:29,160 --> 00:01:34,160 +Vì vậy, bạn có thể cập nhật bất kỳ thứ gì tại đây và bạn có thể lấy dữ liệu đó về + +25 +00:01:35,610 --> 00:01:37,140 +cho mình thông qua API này. + +26 +00:01:37,950 --> 00:01:42,950 +Điều đó có nghĩa là tôi có thể tạo một số bài đăng trên blog mà mỗi bài đăng trên blog đều + +27 +00:01:44,400 --> 00:01:46,500 +có ID, tiêu đề, phụ đề và nội dung. + +28 +00:01:46,920 --> 00:01:50,100 +Và tôi chỉ có ba bài đăng trên blog trong danh sách của mình. + +29 +00:01:50,460 --> 00:01:55,460 +Nhưng bây giờ bạn có thể sử dụng nó như thể nó là một API đơn giản bằng cách đi tới địa chỉ này, bạn sẽ tìm thấy địa + +30 +00:01:56,220 --> 00:01:58,890 +chỉ này trong tài nguyên khóa học. Bây giờ, những gì chúng + +31 +00:01:58,890 --> 00:02:03,510 +tôi sẽ làm là chúng tôi sẽ kéo các bài đăng blog này xuống như thể nó là một + +32 +00:02:03,510 --> 00:02:04,343 +API, và chúng + +33 +00:02:04,590 --> 00:02:08,669 +tôi sẽ thử và hiển thị tất cả các tiêu đề và tất cả phụ đề. + +34 +00:02:09,720 --> 00:02:11,490 +Bên trong máy chủ của chúng tôi. py, nếu chúng + +35 +00:02:11,970 --> 00:02:16,200 +ta tiếp tục và thiết lập một ứng dụng mới. và tuyến này sẽ + +36 +00:02:16,590 --> 00:02:20,760 +là / blog, sau đó ở đây chúng ta sẽ + +37 +00:02:20,760 --> 00:02:23,460 +tạo một hàm blog để tìm + +38 +00:02:23,850 --> 00:02:27,480 +nạp tất cả các blog từ URL này. + +39 +00:02:27,960 --> 00:02:30,690 +Vì vậy, tôi sẽ sao chép URL của API của mình và bạn + +40 +00:02:30,750 --> 00:02:33,030 +có thể làm điều đó trong tài nguyên khóa học. + +41 +00:02:33,450 --> 00:02:37,650 +Và sau đó chúng tôi sẽ đặt nó làm URL blog. + +42 +00:02:38,310 --> 00:02:40,050 +Bây giờ tôi sẽ sử dụng các yêu cầu. + +43 +00:02:40,050 --> 00:02:43,440 +nắm bắt dữ liệu tại URL đó và sau đó tôi có thể khai + +44 +00:02:44,430 --> 00:02:48,720 +thác dữ liệu bằng cách nói phản hồi. json và điều này sẽ cung + +45 +00:02:48,810 --> 00:02:51,750 +cấp cho tôi tất cả các bài đăng trên blog. + +46 +00:02:52,020 --> 00:02:54,180 +Vì vậy, chúng tôi sẽ gọi đó là tất cả các bài đăng. + +47 +00:02:55,830 --> 00:03:00,490 +Và bây giờ tôi sẽ kết xuất blog của mình. html và tôi sẽ chuyển tất cả các bài + +48 +00:03:02,860 --> 00:03:07,860 +viết theo một từ khóa gọi là bài viết ... như thế này. + +49 +00:03:10,900 --> 00:03:13,420 +Vì vậy, tôi đã tìm nạp tất cả các + +50 +00:03:13,600 --> 00:03:17,500 +bài đăng đó, tôi đã chuyển nó vào một biến có tên là all_post và + +51 +00:03:17,770 --> 00:03:22,570 +tôi đang gửi giá trị đó đến blog. html dưới tên bài viết. + +52 +00:03:22,960 --> 00:03:27,850 +Vì vậy, bây giờ đi đến blog của tôi. html, tôi sẽ có thể nắm bắt được bài đăng đó. + +53 +00:03:28,120 --> 00:03:31,030 +Và nếu chúng ta chỉ viết Python ngay lập + +54 +00:03:31,030 --> 00:03:36,030 +tức, thì chúng ta có thể nói điều gì đó như cho các bài đăng trên blog trong + +55 +00:03:37,090 --> 00:03:42,090 +các bài đăng, hãy tiếp tục và tạo một h1 nơi chúng ta có tiêu đề bài + +56 +00:03:45,100 --> 00:03:50,100 +đăng blog và hãy tạo một h2 nơi chúng ta có bài đăng trên blog phụ đề. + +57 +00:03:54,010 --> 00:03:58,780 +Và trong một thế giới lý tưởng, nó sẽ lặp lại tất cả các bài đăng mà nó nhận được và + +58 +00:03:58,780 --> 00:04:00,490 +đối với mỗi bài đăng trên blog, + +59 +00:04:00,490 --> 00:04:05,410 +hiển thị h1 cho tiêu đề và h2 cho phụ đề. Trên thực tế, khi sử dụng Jinja, chúng ta có + +60 +00:04:05,440 --> 00:04:08,680 +thể thực hiện khá chính xác điều này, nhưng chúng ta phải thay + +61 +00:04:09,010 --> 00:04:11,950 +đổi mọi thứ một chút. Đầu tiên, khi + +62 +00:04:11,950 --> 00:04:14,110 +chúng ta có một câu lệnh nhiều + +63 +00:04:14,170 --> 00:04:19,170 +dòng, chúng ta sẽ phải thêm một dấu ngoặc nhọn và sau đó là một dấu + +64 +00:04:19,720 --> 00:04:22,810 +phần trăm cho mỗi dòng. Vì vậy, không chỉ + +65 +00:04:23,140 --> 00:04:28,090 +từ đầu đến cuối, mà đối với mỗi dòng mã Python kéo dài nhiều dòng, chúng + +66 +00:04:28,150 --> 00:04:31,390 +ta phải đặt nó bên trong loại đánh dấu này. + +67 +00:04:31,600 --> 00:04:36,600 +Vì vậy, hãy chú ý đến hướng của các dấu ngoặc nhọn và cũng chú ý đến sự hiện diện của các + +68 +00:04:37,240 --> 00:04:40,180 +dấu hiệu tỷ lệ phần trăm. Bây giờ bên trong phần + +69 +00:04:40,180 --> 00:04:42,610 +mà chúng tôi chèn nó vào các phần tử HTML, chúng + +70 +00:04:42,700 --> 00:04:47,700 +tôi có thể làm giống như chúng tôi đã làm trước đây, chuyển qua bài đăng trên blog và hiển thị nó + +71 +00:04:49,060 --> 00:04:51,400 +dưới dạng một biểu thức dòng đơn như thế này. + +72 +00:04:51,910 --> 00:04:54,670 +Nhưng bởi vì chúng tôi đang làm việc bên trong một tệp HTML, + +73 +00:04:54,670 --> 00:04:58,490 +chúng tôi cũng phải chỉ định khi nào vòng lặp for của chúng tôi thực sự kết thúc. + +74 +00:04:58,930 --> 00:05:03,930 +Và phần cuối đó cũng sẽ được đặt bên trong một trong những dấu ngoặc nhọn tỷ lệ phần + +75 +00:05:04,240 --> 00:05:05,073 +trăm này. + +76 +00:05:05,440 --> 00:05:09,550 +Và có một từ khóa đặc biệt đến từ + +77 +00:05:09,580 --> 00:05:14,580 +Jinja được gọi là endfor để chỉ định ở cuối vòng lặp for. + +78 +00:05:16,120 --> 00:05:19,630 +Chúng tôi sẽ chỉ cần thêm nó vào như thế này. Bây giờ, nếu chúng tôi tiếp tục và + +79 +00:05:19,660 --> 00:05:21,310 +nhấn lưu, và bây giờ nếu chúng + +80 +00:05:21,640 --> 00:05:26,500 +tôi chạy mã của mình và cố gắng hiển thị trang web blog của mình, bạn sẽ thấy rằng nó được + +81 +00:05:27,070 --> 00:05:31,870 +đưa vào tất cả các bài viết trong blog giả mạo của chúng tôi, cuộc sống của cây xương rồng, 15 + +82 +00:05:32,290 --> 00:05:33,520 +điều hàng đầu để + +83 +00:05:33,670 --> 00:05:37,810 +làm khi bạn cảm thấy buồn chán, và giới thiệu về chế độ nhịn ăn không liên tục. + +84 +00:05:37,840 --> 00:05:41,740 +Đó là một blog thực sự ngẫu nhiên mà chúng tôi đang bắt đầu và nó + +85 +00:05:41,740 --> 00:05:45,340 +được tạo h1 cho mỗi tiêu đề và h2 cho mỗi phụ đề. + +86 +00:05:46,000 --> 00:05:51,000 +Và nó được thực hiện mà chúng tôi không cần phải chuyển từng tiêu đề, phụ đề. + +87 +00:05:51,970 --> 00:05:54,400 +Chúng tôi thực sự có thể làm tất cả những điều + +88 +00:05:54,400 --> 00:05:57,190 +đó chỉ với một vòng lặp for bên trong mẫu của chúng tôi. + +89 +00:05:57,770 --> 00:06:01,040 +Bây giờ bạn có thể làm điều tương tự bằng cách sử dụng câu lệnh if. + +90 +00:06:01,580 --> 00:06:03,620 +Tất cả những gì + +91 +00:06:03,620 --> 00:06:08,360 +bạn phải làm là thêm vào mỗi dòng trong câu lệnh bằng + +92 +00:06:08,750 --> 00:06:12,500 +{%, và sau đó ở cuối khối mã của câu + +93 +00:06:12,800 --> 00:06:16,040 +lệnh, bạn cũng phải thêm từ khóa endif. + +94 +00:06:17,240 --> 00:06:22,240 +Xem liệu bạn có thể sửa đổi điều này không để chúng tôi chỉ in tiêu + +95 +00:06:23,120 --> 00:06:26,030 +đề cho bài đăng blog có ID là 2. + +96 +00:06:28,960 --> 00:06:30,070 +1: Được rồi, trong trường hợp + +97 +00:06:30,490 --> 00:06:33,490 +này, 0: tất cả những gì chúng ta phải làm là thêm câu lệnh if ở đây. + +98 +00:06:34,180 --> 00:06:39,180 +Chúng tôi sẽ nói nếu bài đăng blog mà chúng tôi hiện đang lặp lại + +99 +00:06:41,890 --> 00:06:45,820 +có ID bằng 2, tốt, trong trường hợp đó, chúng tôi thực + +100 +00:06:45,880 --> 00:06:49,630 +sự muốn hiển thị tiêu đề và phụ đề, nhưng nếu + +101 +00:06:50,020 --> 00:06:54,370 +không, chúng tôi sẽ không . Tất cả những gì chúng ta phải làm là thêm vào phần đánh dấu. + +102 +00:06:54,640 --> 00:06:56,860 +Vì vậy, bắt đầu từ câu lệnh + +103 +00:06:56,860 --> 00:07:01,390 +if đầu tiên, chúng tôi thêm {% vào đầu và cuối, và vào + +104 +00:07:01,390 --> 00:07:02,830 +cuối câu lệnh + +105 +00:07:02,860 --> 00:07:07,420 +if, chúng tôi thêm {% và endif từ khóa đó để nói rằng đây + +106 +00:07:07,660 --> 00:07:10,330 +là phần cuối của câu lệnh if . + +107 +00:07:10,960 --> 00:07:14,530 +Vì vậy, bây giờ nếu chúng ta nhấn lưu và quay lại blog của mình, + +108 +00:07:14,860 --> 00:07:18,340 +bạn có thể thấy rằng nó sẽ chỉ hiển thị bài viết thứ hai, + +109 +00:07:18,640 --> 00:07:20,230 +bài viết có ID là 2. + diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 blog-data.txt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 blog-data.txt new file mode 100644 index 0000000000000000000000000000000000000000..981dfb09a2b158bd0d607bb2d3f0a179733b462b --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 blog-data.txt @@ -0,0 +1,20 @@ +[ + { + "id": 1, + "title": "The Life of Cactus", + "subtitle": "Who knew that cacti lived such interesting lives.", + "body": "Nori grape silver beet broccoli kombu beet greens fava bean potato quandong celery. Bunya nuts black-eyed pea prairie turnip leek lentil turnip greens parsnip. Sea lettuce lettuce water chestnut eggplant winter purslane fennel azuki bean earthnut pea sierra leone bologi leek soko chicory celtuce parsley jícama salsify." + }, + { + "id": 2, + "title": "Top 15 Things to do When You are Bored", + "subtitle": "Are you bored? Don't know what to do? Try these top 15 activities.", + "body": "Chase ball of string eat plants, meow, and throw up because I ate plants going to catch the red dot today going to catch the red dot today. I could pee on this if I had the energy. Chew iPad power cord steal the warm chair right after you get up for purr for no reason leave hair everywhere, decide to want nothing to do with my owner today." + }, + { + "id": 3, + "title": "Introduction to Intermittent Fasting", + "subtitle": "Learn about the newest health craze.", + "body": "Cupcake ipsum dolor. Sit amet marshmallow topping cheesecake muffin. Halvah croissant candy canes bonbon candy. Apple pie jelly beans topping carrot cake danish tart cake cheesecake. Muffin danish chocolate soufflé pastry icing bonbon oat cake. Powder cake jujubes oat cake. Lemon drops tootsie roll marshmallow halvah carrot cake." + } +] \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 npoint-example-blog-data.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 npoint-example-blog-data.url new file mode 100644 index 0000000000000000000000000000000000000000..ffefb1fb4202a527b98f762d05db2efe9ab433a2 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/004 npoint-example-blog-data.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.npoint.io/docs/c790b4d5cab58020d391 \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 URL Building with Flask.mp4 b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 URL Building with Flask.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..29e852bdd446cbf0d283e82fccd67613af458cd6 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 URL Building with Flask.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8165aeb86a94a9f4770be2bdb85b669baf274673be80f725691f345c623dc13b +size 45073494 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 URL Building with Flask_vi.srt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 URL Building with Flask_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..9a565bdbcb1f93585c105e1e3e696f22530ef3db --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 URL Building with Flask_vi.srt @@ -0,0 +1,264 @@ +1 +00:00:00,780 --> 00:00:04,290 +Vì vậy, bây giờ chúng ta đã thấy một số điều mà chúng ta có thể làm + +2 +00:00:04,290 --> 00:00:08,010 +với tạo khuôn mẫu và Jinja, tôi muốn nói với bạn về một thứ gọi là xây dựng URL. + +3 +00:00:08,910 --> 00:00:13,910 +Và đây là một cách cho phép chúng tôi hướng người dùng đến một trang cụ thể trong trang + +4 +00:00:15,830 --> 00:00:20,540 +web và ứng dụng web của chúng tôi. Bây giờ, điều đó có nghĩa là ví dụ, + +5 +00:00:20,720 --> 00:00:22,730 +trên trang chủ chính của chúng tôi, + +6 +00:00:23,000 --> 00:00:26,210 +chúng tôi thực sự có thể có một liên kết đến trang blog. + +7 +00:00:27,200 --> 00:00:32,200 +Cách chúng tôi làm điều đó nằm trong chỉ mục của chúng tôi. html ở đây, chúng ta có thể tạo một thẻ liên kết, + +8 +00:00:34,220 --> 00:00:38,270 +ví dụ, trong phần nội dung ở đây. Và chúng ta có thể + +9 +00:00:38,300 --> 00:00:39,950 +nói Đi đến blog. + +10 +00:00:40,550 --> 00:00:43,580 +Và sau đó đối với Href của thẻ liên + +11 +00:00:43,850 --> 00:00:48,850 +kết này, đây là nơi chúng ta sẽ sử dụng mẫu Jinja để tạo ra href. + +12 +00:00:50,630 --> 00:00:55,630 +Vì vậy, chúng ta sẽ thêm các dấu ngoặc nhọn vào và tự động tính ra href. Và trong mỗi mẫu Jinja, + +13 +00:00:57,140 --> 00:00:58,730 +chúng tôi có + +14 +00:00:58,790 --> 00:01:03,790 +quyền truy cập vào một phương thức được gọi là url_for. + +15 +00:01:04,459 --> 00:01:09,080 +Vì vậy, chúng ta có thể nói url_for, và vì đây là Python, chúng ta có thể + +16 +00:01:09,170 --> 00:01:12,470 +thêm một số tham số khi chúng ta gọi phương thức này. + +17 +00:01:13,130 --> 00:01:18,050 +Và những gì nó mong đợi là tên của một chức năng trong máy chủ Flask của bạn. + +18 +00:01:18,800 --> 00:01:20,030 +Vì vậy, bạn + +19 +00:01:20,030 --> 00:01:24,410 +có thể, chẳng hạn, truy cập vào nhà hoặc đoán hoặc viết blog. + +20 +00:01:24,890 --> 00:01:27,680 +Và trong trường hợp của chúng tôi, blog này là những gì chúng tôi muốn. + +21 +00:01:27,950 --> 00:01:29,780 +Vì vậy, để làm cho nó đúng hơn + +22 +00:01:29,780 --> 00:01:33,380 +một chút rõ ràng hơn bởi vì chúng tôi đã có tuyến đường được gọi là / + +23 +00:01:33,380 --> 00:01:35,810 +blog và chúng tôi có chức năng được gọi là blog. + +24 +00:01:35,990 --> 00:01:38,450 +Tôi sẽ thay đổi điều này thành get_blog. + +25 +00:01:39,140 --> 00:01:43,880 +Vì vậy, khi bạn hiển thị trang blog này, chúng ta có thể + +26 +00:01:43,910 --> 00:01:48,680 +gọi phương thức này là get_blog bằng cách nói URL cho, rồi chuyển một chuỗi. + +27 +00:01:49,130 --> 00:01:53,120 +Vì vậy, bởi vì chúng ta có một số dấu ngoặc kép ở bên ngoài, chúng ta sẽ + +28 +00:01:53,480 --> 00:01:58,480 +sử dụng một số dấu ngoặc kép ở bên trong. Và ở giữa một dấu ngoặc + +29 +00:01:58,520 --> 00:02:02,120 +kép là tên của phương thức đó, get_blog, như + +30 +00:02:03,980 --> 00:02:06,140 +thế này. Bây giờ, + +31 +00:02:06,140 --> 00:02:10,250 +những gì nó sẽ làm là nó sẽ tạo ra một siêu + +32 +00:02:10,550 --> 00:02:13,130 +liên kết dựa trên những gì nó cần + +33 +00:02:13,130 --> 00:02:18,130 +để đi đến tuyến đường cụ thể này và gọi phương thức cụ thể này. + +34 +00:02:18,860 --> 00:02:23,860 +Vì vậy, bây giờ nếu tôi tiếp tục và cập nhật điều này và truy cập trang chủ của tôi ở đây, bạn sẽ + +35 +00:02:24,380 --> 00:02:28,970 +thấy có một liên kết mới cho biết truy cập blog. Và khi tôi nhấp vào nó, nó sẽ + +36 +00:02:29,150 --> 00:02:32,330 +đưa tôi đến trang blog. Bây giờ, một điều khác + +37 +00:02:32,390 --> 00:02:37,390 +mà bạn có thể muốn làm là khi bạn điều hướng đến một URL bên trong ứng dụng + +38 +00:02:38,030 --> 00:02:41,390 +web của mình, bạn có thể muốn thêm một số tham số. + +39 +00:02:41,840 --> 00:02:46,840 +Bạn có thể thêm các tham số khi đang sử dụng url_for giống như + +40 +00:02:47,450 --> 00:02:51,800 +cách bạn đã làm khi render_template. Vì vậy, bạn có thể tạo tên của + +41 +00:02:52,070 --> 00:02:53,060 +tham số và + +42 +00:02:53,390 --> 00:02:57,350 +giá trị và nó là đối số từ khóa đứng sau tham số đầu tiên. + +43 +00:02:58,160 --> 00:03:02,230 +Vì vậy, ở đây chúng ta có thể nói, ví dụ, url_for get_blog, và + +44 +00:03:02,680 --> 00:03:06,070 +sau đó chúng ta có thể nói một số bằng ba. + +45 +00:03:07,060 --> 00:03:10,120 +Vì vậy, bây giờ khi người dùng nhấp vào thẻ liên kết này, họ sẽ tìm kiếm một + +46 +00:03:10,450 --> 00:03:14,860 +phương thức có tên là get_blog trên máy chủ của chúng tôi. py ở ngay đây, và sau đó + +47 +00:03:14,860 --> 00:03:15,940 +nó sẽ + +48 +00:03:16,480 --> 00:03:21,480 +chuyển qua bất kỳ đối số từ khóa nào tiếp theo dưới dạng tham số. + +49 +00:03:22,180 --> 00:03:26,440 +Vì vậy, chúng tôi có thể nắm bắt các thông số đó bên trong tuyến ứng dụng. + +50 +00:03:26,590 --> 00:03:30,460 +Vì vậy, chúng tôi có thể nói / và sau đó chúng tôi có thể sử dụng dấu + +51 +00:03:30,490 --> 00:03:34,990 +ngoặc nhọn mà chúng tôi đã luôn làm để cung cấp cho các phần của URL làm mã nhận dạng và + +52 +00:03:35,410 --> 00:03:38,650 +chúng tôi có thể gọi số này hoặc số, bất cứ điều gì bạn muốn. + +53 +00:03:39,430 --> 00:03:43,660 +Và chúng tôi cũng sẽ cần thêm điều đó vào đầu vào của phương thức này và chỉ + +54 +00:03:43,960 --> 00:03:46,810 +để chứng minh rằng nó hoạt động, tôi sẽ in nó ra. + +55 +00:03:47,890 --> 00:03:50,440 +Vì vậy, bây giờ chúng ta hãy tiếp tục và chạy lại mã của chúng ta. + +56 +00:03:51,280 --> 00:03:55,990 +Và nếu chúng tôi quay lại trang chủ của mình và tôi nhấp vào truy cập blog và nó + +57 +00:03:55,990 --> 00:04:00,990 +sẽ đi đến trang web blog và nó chèn ba cái đó vào phần đó của URL và nếu tôi xem + +58 +00:04:01,750 --> 00:04:05,650 +trong bảng điều khiển, bạn có thể thấy nó được in ra. số đó đã + +59 +00:04:06,070 --> 00:04:10,780 +vượt qua tất cả các cách từ chỉ mục. html đến máy chủ. + +60 +00:04:11,320 --> 00:04:13,720 +Và cuối cùng, bên trong phương pháp này, nó đã được + +61 +00:04:13,720 --> 00:04:18,010 +bắt và nó có thể được in ra. Và nó cũng có thể được + +62 +00:04:18,040 --> 00:04:20,589 +nhân giống thêm vào một mẫu khác nếu cần. + +63 +00:04:22,570 --> 00:04:25,840 +Vì vậy, bây giờ chúng ta đã hoàn thành tất cả lý + +64 +00:04:25,870 --> 00:04:30,340 +thuyết, trong bài học tiếp theo, đã đến lúc giải quyết dự án cuối cùng và chúng ta + +65 +00:04:30,350 --> 00:04:34,300 +sẽ xây dựng trang web blog của mình với kiểu dáng và cả tạo khuôn mẫu. + +66 +00:04:35,080 --> 00:04:37,900 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, hãy chuyển sang bài học tiếp theo. + diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 day-57-end.zip b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 day-57-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..56fa47d1b53648112705bb0930b08ce0f9044b2d --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/005 day-57-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b38b8b979246d855a40e0b87f340ea91bf1a121e200bf2c0210d66b4fda5c971 +size 1626 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 Blog Capstone Project Part 1 - Templating.html b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 Blog Capstone Project Part 1 - Templating.html new file mode 100644 index 0000000000000000000000000000000000000000..77eed793ad868d71b870cb7072fde2601932fca9 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 Blog Capstone Project Part 1 - Templating.html @@ -0,0 +1 @@ +

1. Head over to the course resources and download the starting files for this project.

2.  Run the main.py file and you should see the following styling and website rendered:

3. Using the API for our blog posts we created on n:Point, render all the blogs' title and subtitles on the home page. e.g

4. Make a "Read" anchor tag at the end of each blog post preview link to a page with the entire blog - title, subtitle and body. The individual blog posts should live at the path: URL/post/blog_id

e.g.


SOLUTION

\ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 Course-Fixes-Report-an-Issue.url b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 day-57-solution-blog-templating-end.zip b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 day-57-solution-blog-templating-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..79f75c9ee14230b39bf25f7f11d88c9f2e07b565 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 day-57-solution-blog-templating-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5aa9723ba48cc4aac6c11bd59229c890b8a66785bff183b8ed601587a053264 +size 2166 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 day-57-starting-files-blog-templating.zip b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 day-57-starting-files-blog-templating.zip new file mode 100644 index 0000000000000000000000000000000000000000..12201083e59d195f253e62f49ebd4409859e099b --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/006 day-57-starting-files-blog-templating.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:365e6e489bec65c68efc1505363c58425fcdd2b39b951dc338df2378a353a43c +size 1851 diff --git a/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/external-links.txt b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..bf3c80ea737b1e88e73d929010d645f1225f2c87 --- /dev/null +++ b/part3/57 - Day 57 - Intermediate+ Templating with Jinja in Flask Applications/external-links.txt @@ -0,0 +1,27 @@ + +002 Rendering-Templates-in-Flask +https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates + +002 Jinja-Documentation +https://jinja.palletsprojects.com/en/2.11.x/templates/ + +002 Update-Your-Footer +http://updateyourfooter.com/ + +003 Genderize-API +https://genderize.io/ + +003 Agify-API +https://agify.io/ + +004 Flask-Docs-Routing +https://flask.palletsprojects.com/en/1.1.x/quickstart/#routing + +004 npoint-example-blog-data +https://www.npoint.io/docs/c790b4d5cab58020d391 + +004 Create-your-own-bin-with-npoint.io +https://www.npoint.io/ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/001 Day 58 Goals What You'll Learn By the End of Today.html b/part3/58 - Day 58 - Web Foundation Bootstrap/001 Day 58 Goals What You'll Learn By the End of Today.html new file mode 100644 index 0000000000000000000000000000000000000000..20bb7752a67dda5305a94a17dc443099c2622eeb --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/001 Day 58 Goals What You'll Learn By the End of Today.html @@ -0,0 +1 @@ +

Hey,

Today, I want to introduce you to one of the most popular front-end toolkits - Bootstrap. It'll allow us to layout and format our websites with ease and cut down on the amount of CSS code we have to write. Although not strictly Python programming, it's essential knowledge for any budding web developer. So I've taken the entire Bootstrap section from my web development course and included it here for you to get a better understanding of this technology.

If you have already completed my web development course, or if you are already quite familiar with Bootstrap, feel free to watch the videos on double speed or simply just recreate the final project from scratch without watching the videos. After all, repetition is the mother of all skill!

Your instructor,

Angela

\ No newline at end of file diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/002 11.0-Bootstrap-Intro.zip b/part3/58 - Day 58 - Web Foundation Bootstrap/002 11.0-Bootstrap-Intro.zip new file mode 100644 index 0000000000000000000000000000000000000000..cf16f4a1d41f7ede5be63b382f63171ae34fec12 --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/002 11.0-Bootstrap-Intro.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdd49bbece373f447544b490ae451dd758e228dff13438bb438775d21e51f4e7 +size 1438528 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/002 Flexbox-Check-free-preview-in-Web-Dev-course.url b/part3/58 - Day 58 - Web Foundation Bootstrap/002 Flexbox-Check-free-preview-in-Web-Dev-course.url new file mode 100644 index 0000000000000000000000000000000000000000..8d1f97a085c349e17fb93e0186df17b8d31f84cd --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/002 Flexbox-Check-free-preview-in-Web-Dev-course.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/the-complete-web-development-bootcamp/#overview \ No newline at end of file diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/002 What is Bootstrap.mp4 b/part3/58 - Day 58 - Web Foundation Bootstrap/002 What is Bootstrap.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3dfebabd3eadad69590b3198daf96a9f0f285fd2 --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/002 What is Bootstrap.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cea9956e89b57fcaa07120bc2145f13abe20e8f6f4622bdfb33744389aa182f +size 200547649 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/002 What is Bootstrap_vi.srt b/part3/58 - Day 58 - Web Foundation Bootstrap/002 What is Bootstrap_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..560f7fc7c87456a97ae8ce815c8ac53db046e5ac --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/002 What is Bootstrap_vi.srt @@ -0,0 +1,756 @@ +1 +00:00:00,260 --> 00:00:00,920 +Này các cậu. + +2 +00:00:00,920 --> 00:00:04,780 +Trong phần này, chúng ta sẽ tìm hiểu về bootstrap framework. + +3 +00:00:04,790 --> 00:00:13,670 +Và đây là một trong nhiều hệ thống bố cục CSS bên ngoài, nhưng đây có lẽ là một trong những hệ thống phổ biến nhất và là hệ thống mà bạn + +4 +00:00:13,670 --> 00:00:17,030 +có nhiều khả năng bắt gặp nhất trong tự nhiên. + +5 +00:00:17,630 --> 00:00:26,030 +Bootstrap, như mình đã nói, là một CSS framework được tạo ra vào năm 2010 bởi hai nhà phát triển Twitter là Mark Otto và Jacob + +6 +00:00:26,030 --> 00:00:26,780 +Thornton. + +7 +00:00:26,990 --> 00:00:34,100 +Giờ đây, sức mạnh của Bootstrap và lý do tại sao nó trở nên phổ biến là nó chứa các tệp CSS được tạo sẵn, bạn có + +8 +00:00:34,100 --> 00:00:40,820 +thể chỉ cần đưa tệp này vào dự án của mình để sử dụng các thành phần và kiểu dáng dựng sẵn của chúng. + +9 +00:00:40,820 --> 00:00:46,790 +Ví dụ: nếu bạn muốn có một số thẻ trong trang web của mình, bạn có thể tạo giao diện như thế này bằng cách + +10 +00:00:46,790 --> 00:00:49,400 +chỉ cần thêm một vài lớp vào HTML của mình. + +11 +00:00:49,520 --> 00:00:56,150 +Trên hết, một trong những lý do lớn nhất khiến bootstrap thành công là do hệ thống bố cục 12 cột của + +12 +00:00:56,150 --> 00:00:58,520 +họ được xây dựng trên Flexbox. + +13 +00:00:58,520 --> 00:01:05,820 +Điều đó làm cho việc tạo các trang web đáp ứng và các trang web chỉ đơn giản là hoạt động và trông đẹp mắt trên thiết bị + +14 +00:01:05,820 --> 00:01:11,130 +di động cũng như máy tính để bàn, được gọi là phương pháp ưu tiên thiết bị di động. + +15 +00:01:11,130 --> 00:01:13,320 +Vì vậy, làm thế nào chính xác nó hoạt động? + +16 +00:01:13,320 --> 00:01:18,120 +Chà, giả sử bạn có một nút vừa nói về nhà. + +17 +00:01:18,240 --> 00:01:23,580 +Bạn có thể thấy rằng nút tiêu chuẩn được hiển thị từ HTML trông không đẹp lắm. + +18 +00:01:23,820 --> 00:01:32,040 +Nhưng nếu chúng tôi chỉ bao gồm năm lớp đến từ CSS bootstrap, thì chúng tôi sẽ đưa CSS dựng sẵn vào dự án của + +19 +00:01:32,040 --> 00:01:39,570 +mình và chúng tôi thêm kiểu dáng và các thành phần bằng cách thêm các lớp này vào HTML của mình. + +20 +00:01:39,600 --> 00:01:47,340 +Sau đó, đột nhiên những gì bạn nhận được là một thứ trông đẹp đẽ và được tạo kiểu sẵn như thế này. + +21 +00:01:47,820 --> 00:01:53,880 +Và bởi vì chúng ta không phải lo lắng về việc viết tất cả mã CSS, tất cả những gì chúng ta cần biết là chúng + +22 +00:01:53,880 --> 00:01:56,670 +ta cần thêm những lớp nào vào HTML của mình. + +23 +00:01:56,700 --> 00:02:02,730 +Sau đó, nó làm cho mọi thứ trở nên dễ dàng và nhanh chóng hơn rất nhiều khi chúng tôi muốn xây dựng các thành phần vào trang + +24 +00:02:02,730 --> 00:02:03,450 +web của mình. + +25 +00:02:03,600 --> 00:02:08,940 +Bây giờ, như tôi đã đề cập, bootstrap là một loại CSS framework. + +26 +00:02:09,030 --> 00:02:10,840 +Chính xác thì đây là gì? + +27 +00:02:10,860 --> 00:02:17,150 +Chà, chúng là các tệp CSS được tạo sẵn mà bạn có thể đưa vào dự án của mình. + +28 +00:02:17,160 --> 00:02:23,910 +Nếu chúng ta đã xem qua GitHub của bootstrap và vì bootstrap là mã nguồn mở hoàn toàn, nên tất cả + +29 +00:02:23,910 --> 00:02:30,750 +mã đều hiển thị và bạn có thể thấy nó có kiểu dáng được xác định cho tất cả các thành phần khác nhau. + +30 +00:02:30,750 --> 00:02:38,640 +Ví dụ: đây là bên trong thành phần thẻ và nó có các lớp xác định phần thân thẻ trông + +31 +00:02:38,640 --> 00:02:44,880 +như thế nào, loại bố cục nên có, loại màu nào, cũng như tiêu đề thẻ + +32 +00:02:44,880 --> 00:02:48,000 +trông như thế nào, phụ đề. + +33 +00:02:48,000 --> 00:02:54,780 +Và nó có tất cả CSS được xác định trước này, chúng ta có thể dễ dàng chèn thẳng vào HTML của mình. + +34 +00:02:55,230 --> 00:03:02,010 +Giờ đây, hai khung CSS bên ngoài phổ biến nhất là bootstrap và nền tảng, nhưng còn + +35 +00:03:02,010 --> 00:03:06,210 +có nhiều khung khác như MUI và Tailwind, v.v. + +36 +00:03:06,210 --> 00:03:11,220 +Và lý do tại sao chúng lại tuyệt vời như vậy là vì chúng cho phép chúng tôi thêm vào các thành phần dựng sẵn và + +37 +00:03:11,220 --> 00:03:13,950 +phát triển trang web một cách nhanh chóng và hiệu quả. + +38 +00:03:14,070 --> 00:03:21,480 +Nếu chúng ta xem xét tỷ lệ phần trăm sử dụng trên Internet, bạn có thể thấy rằng khung bên + +39 +00:03:21,480 --> 00:03:26,340 +ngoài CSS lớn nhất vẫn là bootstrap với gần 80% thị phần. + +40 +00:03:26,640 --> 00:03:32,850 +Nhưng chỉ vì chúng ta học về bootstrap, điều đó không có nghĩa là mọi thứ chúng ta học về CSS đều vô + +41 +00:03:32,880 --> 00:03:33,600 +giá trị. + +42 +00:03:33,600 --> 00:03:40,440 +Trên thực tế, nếu bạn nhìn vào phần trên cùng ở đây, khi chúng tôi xem xét tỷ lệ phần trăm sử dụng tuyệt đối của tất + +43 +00:03:40,440 --> 00:03:46,200 +cả các khung khác nhau trên Internet, bạn có thể thấy tỷ lệ phần trăm lớn nhất vẫn là các trang + +44 +00:03:46,200 --> 00:03:49,440 +web không sử dụng bất kỳ khung CSS bên ngoài nào. + +45 +00:03:49,560 --> 00:03:53,160 +Điều đó có nghĩa là gì khi không có khung CSS nào được sử dụng? + +46 +00:03:53,160 --> 00:03:59,250 +Chà, điều đó có nghĩa là bạn có thể đang sử dụng CSS gốc như Flexbox, Grid và Float và tất cả những điều tuyệt vời mà chúng + +47 +00:03:59,250 --> 00:04:00,610 +ta đã học trước đây. + +48 +00:04:00,630 --> 00:04:06,420 +Vì vậy, bootstrap không thay thế bất kỳ kiến thức nào trong số đó và trên thực tế, chúng ta nên ở trong một tình + +49 +00:04:06,420 --> 00:04:13,290 +huống mà chúng ta không thực sự cần phụ thuộc vào bất kỳ loại khung bên ngoài nào, nhưng chúng thực sự hữu ích khi chúng ta muốn phát + +50 +00:04:13,290 --> 00:04:19,890 +triển trang web một cách nhanh chóng và dễ dàng và chúng tôi không muốn dành nhiều thời gian để thiết kế trang web của mình vì nó + +51 +00:04:19,890 --> 00:04:25,470 +đi kèm với tất cả các kiểu tạo sẵn và tất cả các quy tắc tạo kiểu mà chúng tôi có thể dễ dàng tuân theo bằng cách + +52 +00:04:25,470 --> 00:04:27,510 +sử dụng các thành phần của chúng. + +53 +00:04:27,630 --> 00:04:31,260 +Vậy ưu điểm của các khung CSS bên ngoài là gì? + +54 +00:04:31,260 --> 00:04:37,710 +Chà, chúng rất dễ sử dụng và chúng nhanh chóng và bạn nhận được rất nhiều thành phần dựng sẵn như gói giá này, + +55 +00:04:37,710 --> 00:04:40,770 +chúng tôi đã mất nhiều thời gian để tự xây dựng. + +56 +00:04:40,770 --> 00:04:44,370 +Và bạn cũng có được phong cách thực sự nhất quán trên trang web của mình. + +57 +00:04:44,370 --> 00:04:51,090 +Nó gần giống như bạn đã thuê một nhà phát triển chuyên nghiệp, người luôn giữ mọi thứ phù hợp với thương hiệu và cuối cùng bạn + +58 +00:04:51,090 --> 00:04:57,060 +có khả năng tương thích trình duyệt thực sự tốt vì họ đã thử nghiệm tất cả các trình duyệt khác nhau Safari, Chrome, + +59 +00:04:57,060 --> 00:04:59,370 +Brave và bất kỳ trình duyệt nào. + +60 +00:04:59,390 --> 00:05:00,770 +Người dùng của bạn có thể đang sử dụng. + +61 +00:05:00,770 --> 00:05:04,270 +Vì vậy, bạn không thực sự phải thực hiện tất cả các thử nghiệm phức tạp này. + +62 +00:05:04,280 --> 00:05:07,070 +Bạn chỉ có thể tin tưởng rằng nó hoạt động tốt. + +63 +00:05:07,310 --> 00:05:10,510 +Bây giờ, một số nhược điểm của khung là gì? + +64 +00:05:10,520 --> 00:05:13,850 +Chà, một trong những nhược điểm lớn nhất là thứ gọi là sự phình to của lớp học. + +65 +00:05:14,240 --> 00:05:20,390 +Hãy nhớ rằng trước đây chúng tôi đã đề cập rằng việc tách cấu trúc khỏi phong cách mà chúng tôi đã nói rằng + +66 +00:05:20,390 --> 00:05:23,570 +HTML dành cho cấu trúc là một ý tưởng thực sự hay. + +67 +00:05:23,660 --> 00:05:33,170 +Vì vậy, thêm vào các yếu tố mô tả mục đích là gì và CSS dành cho phong cách bằng cách sử dụng các khung CSS bên ngoài bởi vì chúng tôi đang thêm + +68 +00:05:33,170 --> 00:05:39,380 +mọi thứ vào các lớp, sau đó rất nhanh bạn kết thúc với cái được gọi là phình to lớp, nơi bạn + +69 +00:05:39,380 --> 00:05:47,570 +có rất nhiều kiểu dáng đi vào tệp HTML thực tế và nó trông kém sạch sẽ hơn rất nhiều so với việc chúng ta chỉ sử dụng thứ + +70 +00:05:47,570 --> 00:05:53,450 +gì đó như Grid hoặc Flexbox nơi chúng ta có tất cả các lớp được xác định trước và chúng + +71 +00:05:53,450 --> 00:05:58,400 +ta dễ dàng sử dụng các lớp mà chúng ta thêm vào tệp HTML của mình. + +72 +00:05:58,490 --> 00:06:01,910 +Nhược điểm khác là tùy biến. + +73 +00:06:01,920 --> 00:06:09,060 +Nếu bạn muốn xây dựng một trang web mà bạn muốn có toàn quyền kiểm soát mọi pixel, bố cục và mọi + +74 +00:06:09,060 --> 00:06:16,680 +thứ chính xác theo cách bạn đã thiết kế, thì các khung CSS bên ngoài có lẽ không phải là cách phù hợp vì + +75 +00:06:16,680 --> 00:06:21,630 +để tùy chỉnh từng thành phần , nó có thể thực sự tốn thời gian. + +76 +00:06:21,630 --> 00:06:26,340 +Vậy khi nào bạn nên sử dụng các khung CSS như Bootstrap và khi nào thì không? + +77 +00:06:26,370 --> 00:06:35,520 +Chà, khi bạn đang xây dựng một trang web đáp ứng đầu tiên trên thiết bị di động mà bạn muốn đưa trực tuyến thật nhanh và truy cập các thành + +78 +00:06:35,520 --> 00:06:41,730 +phần đẹp mắt được thiết kế bởi các nhà thiết kế chuyên nghiệp, giữ cho mọi thứ trên trang web + +79 +00:06:41,730 --> 00:06:47,640 +của bạn trông bóng bẩy và đồng nhất, thì bạn có thể muốn cân nhắc sử dụng bootstrap. + +80 +00:06:47,670 --> 00:06:53,520 +Nhưng nếu bạn đang xây dựng một trang web rất đơn giản, nơi bạn chỉ cần HTML và CSS và bạn có thể + +81 +00:06:53,520 --> 00:07:00,630 +nhanh chóng tải nó lên hoặc nếu bạn đang xây dựng một trang web thiết kế tùy chỉnh thực sự phức tạp và bạn muốn kiểm + +82 +00:07:00,630 --> 00:07:07,500 +soát hoàn toàn thiết kế, thì có lẽ không nên một ý tưởng hay là sử dụng khung CSS bên ngoài như Bootstrap. + +83 +00:07:07,590 --> 00:07:13,290 +Vì vậy, chúng tôi đã nói rất nhiều về những ưu và nhược điểm, khi nào nên sử dụng, khi nào không nên sử dụng, nhưng bạn thực sự sử dụng nó + +84 +00:07:13,290 --> 00:07:13,890 +như thế nào? + +85 +00:07:13,920 --> 00:07:18,460 +Chà, một trong những cách dễ nhất là đưa nó qua một liên kết. + +86 +00:07:18,480 --> 00:07:23,220 +Chúng tôi đã thấy cách chúng tôi có thể sử dụng thẻ liên kết để thêm biểu định kiểu của mình. + +87 +00:07:23,220 --> 00:07:31,560 +Và theo cách tương tự, chúng ta có thể sử dụng các thẻ liên kết này để lấy biểu định kiểu từ một nguồn bên + +88 +00:07:31,560 --> 00:07:32,370 +ngoài. + +89 +00:07:32,370 --> 00:07:38,760 +Vì vậy, trong trường hợp này là thông qua CN, viết tắt của Mạng phân phối nội dung. + +90 +00:07:39,600 --> 00:07:47,610 +Và đây là những trung tâm nhỏ trên toàn thế giới và nó biết người dùng của bạn đang ở đâu. + +91 +00:07:47,610 --> 00:07:54,000 +Vì vậy, khi họ tải trang web của bạn lên và cố gắng truy cập tệp CSS cụ thể này chứa tất cả + +92 +00:07:54,000 --> 00:08:00,690 +mã bootstrap, thì nó có thể tìm thấy vị trí gần nhất với khoảng cách ngắn nhất đến máy chủ + +93 +00:08:00,690 --> 00:08:02,070 +có nội dung đó. + +94 +00:08:02,070 --> 00:08:07,320 +Và điều đó chỉ có nghĩa là mặc dù điều này phải được tải xuống từ đâu đó, nhưng nó có thể được + +95 +00:08:07,320 --> 00:08:10,740 +gửi tới người dùng của bạn và hiển thị rất, rất nhanh. + +96 +00:08:10,740 --> 00:08:17,550 +Và theo quan điểm của chúng tôi với tư cách là nhà phát triển, tất cả những gì chúng tôi cần làm chỉ đơn giản là đưa + +97 +00:08:17,550 --> 00:08:19,740 +liên kết này vào phần đầu của HTML. + +98 +00:08:19,740 --> 00:08:26,520 +Và nếu chúng tôi muốn bất kỳ chức năng nào như menu thả xuống hoặc các nút có thể nhấp, thì chúng + +99 +00:08:26,520 --> 00:08:31,920 +tôi muốn bao gồm tập lệnh bootstrap ngay trước khi kết thúc phần nội dung. + +100 +00:08:32,429 --> 00:08:34,740 +Vì vậy, một nơi nào đó ngay tại đây. + +101 +00:08:34,770 --> 00:08:42,900 +Bây giờ, hãy tiếp tục và thử một bài tập và xem liệu chúng ta có thể nâng cấp trang web của mình một cách nhanh chóng bằng cách sử + +102 +00:08:42,900 --> 00:08:51,060 +dụng bootstrap download 11 hay không. 0 Bootstrap intro và nếu bạn mở nó bên trong vs code, hãy mở tệp index. html, bạn có thể thấy có bốn + +103 +00:08:51,060 --> 00:08:54,090 +việc cần làm để hoàn thành. + +104 +00:08:54,210 --> 00:09:01,740 +Và khi bạn đã hoàn thành tất cả bốn bước này, bạn sẽ nhận được một thẻ hiển thị hình ảnh hoa hướng + +105 +00:09:01,740 --> 00:09:02,340 +dương. + +106 +00:09:02,340 --> 00:09:06,300 +Và đây là một trong những thành phần bootstrap dựng sẵn. + +107 +00:09:06,750 --> 00:09:08,970 +Bây giờ làm thế nào bạn sẽ làm điều này? + +108 +00:09:08,970 --> 00:09:15,390 +Chà, trước tiên, bạn sẽ truy cập Getbootstrap. com, là trang web khởi động chính, + +109 +00:09:15,390 --> 00:09:21,030 +sau đó tôi muốn bạn bao gồm các tệp khởi động bằng CDN. + +110 +00:09:21,060 --> 00:09:26,010 +Hiện tại, bạn chỉ cần tệp CSS thông qua thành phần liên kết này. + +111 +00:09:26,010 --> 00:09:32,160 +Và sau đó tôi muốn bạn xem tài liệu nếu bạn muốn tra cứu bất cứ điều gì liên quan + +112 +00:09:32,160 --> 00:09:38,970 +đến thành phần thẻ, tất cả đều nằm ở đây trong các thành phần bên dưới phần thẻ. + +113 +00:09:39,570 --> 00:09:41,940 +Bây giờ bạn đã biết mục tiêu sẽ như thế nào. + +114 +00:09:41,970 --> 00:09:47,250 +Bạn đã có tất cả các nguồn lực để bắt đầu và bạn sẽ có thể thực hiện từng + +115 +00:09:47,250 --> 00:09:48,690 +việc cần làm một. + +116 +00:09:48,990 --> 00:09:52,260 +Tạm dừng video và xem bạn có thể hoàn thành thử thách này không. + +117 +00:09:57,790 --> 00:09:58,150 +Được rồi. + +118 +00:09:58,180 --> 00:10:05,230 +Hy vọng rằng bạn đã thử và bạn đã thấy rằng thẻ bootstrap có một số mã ví dụ, bạn + +119 +00:10:05,230 --> 00:10:08,900 +có thể thả ngay mã này vào tệp của mình. + +120 +00:10:08,920 --> 00:10:12,210 +Nếu bạn chưa thử, hãy tạm dừng video ngay bây giờ. + +121 +00:10:12,220 --> 00:10:17,050 +Đừng tiếp tục vì mọi thứ sẽ ngày càng khó khăn hơn khi chúng ta tiếp tục khóa học. + +122 +00:10:17,050 --> 00:10:23,050 +Và nếu bạn chỉ xem video, cuối cùng, đến một lúc nào đó, mọi thứ sẽ không có ý nghĩa vì + +123 +00:10:23,050 --> 00:10:24,610 +bạn chưa thực hành. + +124 +00:10:24,790 --> 00:10:30,610 +Hãy khiến mọi thứ trở nên dễ dàng cho con người tương lai của bạn bằng cách nỗ lực và thực hành ngay từ bây giờ. + +125 +00:10:31,090 --> 00:10:32,500 +Được rồi, nói đủ rồi. + +126 +00:10:32,530 --> 00:10:37,900 +Điều đầu tiên, chúng ta hãy cùng nhau tìm hiểu giải pháp và hy vọng bạn có thể kiểm tra nó dựa trên công việc của mình. + +127 +00:10:37,990 --> 00:10:43,240 +Bây giờ, điều đầu tiên chúng ta sẽ làm là thêm liên kết bootstrap đến từ trang chủ. + +128 +00:10:43,240 --> 00:10:48,970 +Và chúng tôi chỉ muốn liên kết đầu tiên này sẽ bao gồm biểu định kiểu. + +129 +00:10:48,970 --> 00:10:53,260 +Và bạn có thể thấy đây là một liên kết có mối quan hệ của biểu định kiểu. + +130 +00:10:53,260 --> 00:10:58,100 +Vì vậy, thay vì sử dụng biểu định kiểu của riêng chúng tôi, chúng tôi hiện đang sử dụng CSS bootstrap. + +131 +00:10:58,400 --> 00:11:04,640 +Và nếu bạn đang tự hỏi phút đó là viết tắt của từ gì, thì về cơ bản, đó là một tệp trong đó tất + +132 +00:11:04,640 --> 00:11:08,630 +cả các khoảng trắng được lấy đi để nó càng ngắn càng tốt. + +133 +00:11:08,630 --> 00:11:14,000 +Vì vậy, nó tải lên nhanh hơn vì không có khoảng trắng và mọi thứ đều lộn xộn, con người không + +134 +00:11:14,000 --> 00:11:15,080 +thể đọc được. + +135 +00:11:15,080 --> 00:11:19,020 +Nhưng nó hoạt động tốt cho máy tính để làm. + +136 +00:11:19,040 --> 00:11:22,670 +Thứ hai là thêm thẻ dựng sẵn bootstrap. + +137 +00:11:22,670 --> 00:11:29,690 +Vì vậy, nếu chúng tôi truy cập tài liệu của mình và tìm thành phần thẻ của mình, bạn có thể thấy ví dụ đầu tiên là thẻ chúng + +138 +00:11:29,690 --> 00:11:31,120 +tôi muốn xây dựng. + +139 +00:11:31,130 --> 00:11:37,790 +Nếu chúng ta nhìn vào mục tiêu, chúng ta sẽ có tiêu đề thẻ, một số ví dụ, văn bản, nút và hình ảnh và + +140 +00:11:37,790 --> 00:11:40,700 +điều này hoàn toàn giống với ví dụ này. + +141 +00:11:40,700 --> 00:11:46,950 +Vì vậy, hãy sao chép HTML và dán nó vào đây bên dưới để thực hiện bước thứ hai. + +142 +00:11:46,970 --> 00:11:51,350 +Bây giờ hãy kiểm tra công việc của chúng tôi, hãy hiển thị nó trong bản xem trước và xem nó trông như thế nào. + +143 +00:11:51,380 --> 00:11:52,430 +Nó trông khá tốt. + +144 +00:11:52,460 --> 00:11:56,570 +Khác với thực tế là hình ảnh bị hỏng gần như hoàn toàn. + +145 +00:11:56,570 --> 00:12:02,840 +Vì vậy, bước ba là thay đổi nguồn hình ảnh để hiển thị hình ảnh JPEG bông hoa. + +146 +00:12:02,990 --> 00:12:10,510 +Hình ảnh ở đây và ngay bây giờ nguồn hoàn toàn trống rỗng vì nó là một ví dụ. + +147 +00:12:10,520 --> 00:12:15,230 +Hãy tiếp tục và thay đổi nó thành hình ảnh của chúng ta, đó là jpeg bông hoa. + +148 +00:12:15,260 --> 00:12:21,590 +Bạn thấy nó hiển thị ngay lập tức và như mọi khi với hình ảnh, hãy thêm văn bản thay thế để những người có trình + +149 +00:12:21,590 --> 00:12:23,780 +đọc màn hình biết nội dung của nó. + +150 +00:12:24,260 --> 00:12:24,740 +Được rồi. + +151 +00:12:24,770 --> 00:12:32,690 +Bây giờ, bước cuối cùng là bước sửa đổi một chút vì tôi muốn bạn sử dụng Flexbox để căn giữa + +152 +00:12:32,690 --> 00:12:35,870 +thẻ theo chiều dọc và chiều ngang. + +153 +00:12:35,870 --> 00:12:42,230 +Nếu chúng tôi xem URL này trên trình duyệt của mình, bạn có thể thấy nó bị kẹt ở phía trên + +154 +00:12:42,230 --> 00:12:44,990 +cùng bên trái, đây là bố cục mặc định. + +155 +00:12:44,990 --> 00:12:50,590 +Nhưng nếu chúng ta muốn nó ở ngay giữa, thì chúng ta sẽ cần sử dụng một số phép thuật Flexbox và + +156 +00:12:50,600 --> 00:12:56,240 +chúng ta sẽ làm điều đó bên trong một phần tử kiểu bên trong ngay dưới đây để thực hiện số bốn. + +157 +00:12:56,450 --> 00:12:58,420 +Chúng ta cần nhắm đến điều gì? + +158 +00:12:58,430 --> 00:13:01,310 +Chà, chúng ta cần nhắm mục tiêu toàn bộ thẻ. + +159 +00:13:01,310 --> 00:13:04,790 +Và cấp cao nhất là thùng chứa linh hoạt này. + +160 +00:13:05,000 --> 00:13:13,310 +Lý do tại sao nó thuộc lớp flex container là vì nó xuất phát từ CSS bootstrap và nó có một số + +161 +00:13:13,310 --> 00:13:17,270 +kiểu dáng trong đó xác định vùng chứa đó. + +162 +00:13:17,270 --> 00:13:19,910 +Nhưng chúng ta luôn có thể ghi đè lên nó. + +163 +00:13:19,910 --> 00:13:25,580 +Và điều này thực sự rất quan trọng khi chúng ta muốn ghi đè lên một kiểu bootstrap cụ thể, + +164 +00:13:25,580 --> 00:13:28,160 +chúng ta phải đảm bảo rằng nó cụ thể hơn. + +165 +00:13:28,160 --> 00:13:36,740 +Vì vậy, nó nằm bên trong một thành phần kiểu bên trong hoặc nó nằm bên trong một thuộc tính kiểu nội tuyến hoặc nếu chúng ta đang + +166 +00:13:36,740 --> 00:13:44,420 +sử dụng CSS bên ngoài tiêu chuẩn của mình và chúng ta sử dụng một liên kết liên kết đến, tôi không biết, chẳng hạn + +167 +00:13:45,050 --> 00:13:51,620 +như dấu gạch chéo lên, kiểu dấu gạch chéo lên. css và chúng tôi có tệp CSS kiểu ở đâu đó trong dự án của + +168 +00:13:51,620 --> 00:13:58,130 +chúng tôi, thì bạn phải đảm bảo rằng tệp CSS tùy chỉnh của bạn xuất hiện bên dưới liên kết bootstrap. + +169 +00:13:58,130 --> 00:14:06,350 +Bằng cách đó, điều này được xem xét đầu tiên và sau đó trình duyệt sẽ xem biểu định kiểu tùy chỉnh của bạn và bạn có thể + +170 +00:14:06,350 --> 00:14:09,410 +ghi đè lên bất kỳ lớp nào đến từ bootstrap. + +171 +00:14:10,070 --> 00:14:14,720 +Vì vậy, đây là một điểm quan trọng cần nhớ cho tương lai khi bạn đang tạo biểu định kiểu tùy chỉnh của + +172 +00:14:14,720 --> 00:14:15,320 +riêng mình. + +173 +00:14:15,650 --> 00:14:21,680 +Được rồi, vì vậy bây giờ để ghi đè kiểu ở đây, bây giờ chúng ta có thể đang xây dựng dựa trên các kiểu bootstrap hiện có + +174 +00:14:21,680 --> 00:14:26,270 +hoặc chúng ta có thể chỉ định thứ gì đó mà họ thậm chí không quan tâm và nó hoàn toàn không được + +175 +00:14:26,270 --> 00:14:28,340 +định nghĩa trong CSS bootstrap. + +176 +00:14:28,640 --> 00:14:35,450 +Trong trường hợp của chúng tôi, chúng tôi muốn thay đổi bộ chứa flex này để hiển thị flex vì chúng tôi biết rằng + +177 +00:14:35,450 --> 00:14:39,980 +đây là một trong những cách đơn giản nhất để căn giữa mọi thứ trong CSS. + +178 +00:14:40,340 --> 00:14:45,770 +Và điều đầu tiên chúng ta cần thay đổi là nội dung của lời biện minh được đặt ở giữa. + +179 +00:14:45,770 --> 00:14:49,790 +Và cái thứ hai là căn chỉnh các mục được đặt ở giữa. + +180 +00:14:49,820 --> 00:14:56,860 +Và cuối cùng, chúng ta cần đảm bảo rằng toàn bộ vùng chứa chiếm toàn bộ chiều cao chứ không chỉ theo một tỷ lệ nào đó. + +181 +00:14:57,000 --> 00:14:57,830 +Một phần của chiều cao. + +182 +00:14:57,840 --> 00:14:59,960 +Thế là đủ cho nội dung. + +183 +00:14:59,970 --> 00:15:04,740 +Vì vậy, hãy đặt chiều cao thành 100 chiều cao khung nhìn. + +184 +00:15:04,740 --> 00:15:11,460 +Và bây giờ bạn có thể thấy thẻ của chúng tôi được căn giữa một cách hoàn hảo bằng Flexbox. + +185 +00:15:11,490 --> 00:15:18,330 +Đó là một thành phần mà chúng tôi đã mượn và tùy chỉnh từ bootstrap, và bạn có thể thấy nó dễ dàng như thế nào. + +186 +00:15:18,360 --> 00:15:23,460 +Và nhanh chóng tạo bố cục này bằng cách tận dụng sức mạnh của bootstrap. + +187 +00:15:23,640 --> 00:15:28,660 +Trong bài học tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về bootstrap và xem cách bootstrap. + +188 +00:15:28,680 --> 00:15:32,040 +Hệ thống bố cục 12 cột thực sự hoạt động trong thực tế. + +189 +00:15:32,040 --> 00:15:35,150 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/003 Bootstrap Layout.mp4 b/part3/58 - Day 58 - Web Foundation Bootstrap/003 Bootstrap Layout.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a59d1dbf3d37b259e752a7514f7be1526c124e7c --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/003 Bootstrap Layout.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf13ba4165fbd9f05087ec8ef9f24df750c6fae0e587cb8c9c7b96f00ee0ed09 +size 104606547 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/003 Bootstrap Layout_vi.srt b/part3/58 - Day 58 - Web Foundation Bootstrap/003 Bootstrap Layout_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ef2074ddf2e02d1d4cdaac7aab29f3ba169423a6 --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/003 Bootstrap Layout_vi.srt @@ -0,0 +1,1028 @@ +1 +00:00:00,260 --> 00:00:00,620 +Được rồi. + +2 +00:00:00,620 --> 00:00:07,130 +Vì vậy, bây giờ chúng ta đã có một chút hiểu biết về những gì Bootstrap có thể làm, hãy đi sâu vào một + +3 +00:00:07,130 --> 00:00:12,590 +trong những tính năng mạnh mẽ nhất của Bootstrap, đó là hệ thống bố cục 12 cột. + +4 +00:00:13,070 --> 00:00:17,450 +Hệ thống 12 cột được làm bằng ba thành phần. + +5 +00:00:17,570 --> 00:00:26,540 +Đầu tiên, chúng ta cần một div có một lớp chứa và đây sẽ là điểm bắt đầu. + +6 +00:00:26,630 --> 00:00:36,320 +Tiếp theo, bên trong thùng chứa đó, chúng ta cần một div khác sẽ thuộc hàng lớp và bên trong hàng là nơi chúng + +7 +00:00:36,350 --> 00:00:42,570 +ta sẽ có các mục của mình và chúng sẽ được bố trí bằng hệ thống cột. + +8 +00:00:42,590 --> 00:00:46,160 +Vì vậy, điều này trông như thế nào trong mã? + +9 +00:00:46,190 --> 00:00:48,410 +Vâng, nó khá đơn giản. + +10 +00:00:48,410 --> 00:00:58,700 +Chúng tôi có một vùng chứa chứa một hàng và sau đó trong hàng chúng tôi có thể có bao nhiêu mục tùy thích. + +11 +00:00:58,700 --> 00:01:02,250 +Và chúng được trình bày bằng cách sử dụng lớp cột. + +12 +00:01:02,520 --> 00:01:04,019 +Khá đơn giản cho đến nay. + +13 +00:01:04,019 --> 00:01:08,130 +Và có lẽ bạn đang nghĩ, không có gì đột phá ở đây cả. + +14 +00:01:08,340 --> 00:01:15,090 +Bây giờ, điều thú vị bắt đầu xảy ra khi bạn có nhiều cột được bố trí bên trong các hàng này, + +15 +00:01:15,240 --> 00:01:24,240 +bởi vì Bootstrap tự động sẽ cố gắng cung cấp cho mọi cột bên trong hàng khoảng cách bằng nhau và tạo khoảng cách cho + +16 +00:01:24,240 --> 00:01:28,110 +chúng trên toàn bộ chiều rộng của vùng chứa. + +17 +00:01:28,850 --> 00:01:38,210 +Vì vậy, nếu bạn có một vùng chứa bao gồm một hàng có một, hai, ba, bốn, năm, sáu div trong đó, mỗi vùng + +18 +00:01:38,240 --> 00:01:45,850 +có lớp được đặt là gọi tắt cho cột, thì nó sẽ chia toàn bộ chiều rộng cho sáu. + +19 +00:01:45,860 --> 00:01:50,450 +Và nếu bạn có ba người trong số họ thì nó sẽ cho mỗi người một phần ba không gian. + +20 +00:01:50,810 --> 00:01:54,410 +Bây giờ bộ chứa bootstrap đã phản hồi. + +21 +00:01:54,410 --> 00:02:01,730 +Vì vậy, bằng cách xác định một div với lớp vùng chứa, bạn thực sự đang yêu cầu nó có kích thước khác trên các màn + +22 +00:02:01,760 --> 00:02:04,070 +hình có kích thước khác nhau. + +23 +00:02:04,100 --> 00:02:13,010 +Nếu chúng tôi có màn hình XL hoặc XL, chẳng hạn như máy tính để bàn hoặc TV hoặc thứ gì đó, thì vùng chứa đó sẽ có + +24 +00:02:13,010 --> 00:02:20,390 +kích thước này và bạn có thể thấy rằng có một số điểm ngắt đáp ứng với các kích thước màn hình + +25 +00:02:20,390 --> 00:02:22,280 +thiết bị khác nhau. + +26 +00:02:22,310 --> 00:02:32,160 +Trên thiết bị di động, có thể vùng chứa sẽ là 540 pixel trên iPad, có thể là 720 hoặc 960 pixel. + +27 +00:02:32,160 --> 00:02:36,300 +Và trên máy tính để bàn, có lẽ nó sẽ là khoảng 1000 pixel. + +28 +00:02:36,510 --> 00:02:44,610 +Bạn có thể sử dụng dấu gạch ngang cộng với các chữ cái khác nhau này để chỉ định bạn muốn vùng chứa của mình ở điểm nào. + +29 +00:02:44,610 --> 00:02:45,810 +100%. + +30 +00:02:45,990 --> 00:02:55,050 +Vùng chứa giống như vùng chứa bình thường, nhưng vùng chứa MD hoặc phương tiện có nghĩa là trên màn hình nhỏ, + +31 +00:02:55,050 --> 00:02:59,190 +vùng chứa đã đạt 100% chiều rộng của màn hình. + +32 +00:02:59,190 --> 00:03:05,010 +Và một lần nữa, hãy nhớ rằng, tất cả các kích thước ở đây đề cập đến chiều rộng của khung nhìn. + +33 +00:03:05,010 --> 00:03:07,650 +Vì vậy, chỉ có kích thước này. + +34 +00:03:07,860 --> 00:03:15,930 +Và sau đó khi chúng tôi đi xuống dòng, chúng tôi bắt đầu chỉ định chiều rộng 100% trên các màn hình ngày càng lớn hơn cho đến khi + +35 +00:03:15,930 --> 00:03:23,340 +chúng tôi đạt đến chất lỏng vùng chứa này, về cơ bản nói rằng trên tất cả các kích thước màn hình, chúng tôi muốn nó đạt + +36 +00:03:23,340 --> 00:03:28,320 +từ mép này sang mép kia, đó là 100% chiều rộng trong hầu hết các trường hợp. + +37 +00:03:28,320 --> 00:03:34,800 +Bạn sẽ thấy hai cái này được sử dụng khá thường xuyên vì vùng chứa cung cấp một loại lề đẹp xung quanh + +38 +00:03:34,800 --> 00:03:36,630 +bên trái và bên phải. + +39 +00:03:36,630 --> 00:03:40,260 +Và chất lỏng vùng chứa là khi bạn muốn hành vi từ cạnh này sang cạnh khác. + +40 +00:03:41,300 --> 00:03:45,920 +Hệ thống bố cục trở nên thú vị hơn khi chúng ta bắt đầu sử dụng các cột có kích thước. + +41 +00:03:45,920 --> 00:03:52,550 +Thay vì chỉ viết Col là lớp, chúng ta thực sự có thể đặt lớp là ví dụ, Col gạch ngang hai hoặc + +42 +00:03:52,550 --> 00:03:54,140 +dấu gạch ngang bốn. + +43 +00:03:54,170 --> 00:04:05,000 +Và điều này có nghĩa là nếu chúng ta coi mỗi hàng có 12 cột và chúng ta chia tất cả chúng thành 12 cột + +44 +00:04:05,000 --> 00:04:09,620 +có kích thước bằng nhau như thế này. + +45 +00:04:09,620 --> 00:04:11,960 +Vì vậy, nếu bạn đếm thì đây thực sự là tổng cộng 12. + +46 +00:04:11,990 --> 00:04:18,279 +Sau đó, khi chúng tôi tạo một div, chúng tôi có thể chỉ định rõ chúng tôi muốn chiếm bao nhiêu cột trong số những cột này? + +47 +00:04:18,290 --> 00:04:26,180 +Trong trường hợp này, div này muốn hai trong số các cột đó và sau đó cột này muốn bốn cột trong số đó và cột cuối + +48 +00:04:26,180 --> 00:04:27,950 +cùng muốn sáu cột. + +49 +00:04:28,100 --> 00:04:35,930 +Dựa trên các lớp mà bạn chọn, Bootstrap sẽ biết lượng không gian cần phân bổ cho mỗi div trên cơ sở + +50 +00:04:35,930 --> 00:04:37,460 +tỷ lệ phần trăm. + +51 +00:04:37,460 --> 00:04:45,810 +Vì vậy, bạn có thể xem COL sáu là 50% và col hai là một phần sáu của toàn bộ chiều rộng, + +52 +00:04:45,810 --> 00:04:46,440 +v.v. + +53 +00:04:46,440 --> 00:04:53,730 +Vì vậy, bạn có thể sử dụng tất cả các số từ cột 1 cho đến cột 12 và bạn có thể chia tỷ lệ màn hình + +54 +00:04:53,730 --> 00:04:56,700 +của mình và nội dung bên trong. + +55 +00:04:56,700 --> 00:05:04,290 +Vì vậy, có thể bạn sẽ có một phần điều hướng ở bên trái mà bạn chỉ muốn chiếm hai trong số 12 + +56 +00:05:04,290 --> 00:05:11,520 +chiều rộng và sau đó nội dung chính ở đây có thể chiếm 10 trên 12 chiều rộng, v.v. + +57 +00:05:11,520 --> 00:05:18,540 +Và đây là một cách thực sự, rất dễ dàng và trực quan để định cỡ nội dung của bạn bằng bootstrap, và đây là + +58 +00:05:18,540 --> 00:05:20,220 +mã sẽ trông như thế nào. + +59 +00:05:20,220 --> 00:05:25,530 +Vì vậy, chúng tôi có ba div và chúng tôi cho cái này hai trên 12, bốn trên 12, sáu trên 12. + +60 +00:05:25,530 --> 00:05:28,590 +Và đây là bố cục mà chúng tôi kết thúc. + +61 +00:05:28,590 --> 00:05:31,050 +Và chúng tôi không phải viết bất kỳ CSS nào. + +62 +00:05:31,080 --> 00:05:34,680 +Tất cả những gì chúng tôi phải làm là thêm vào các lớp bố cục dựng sẵn. + +63 +00:05:34,770 --> 00:05:42,090 +Một lần nữa, điều thực sự quan trọng cần biết là Bootstrap có các điểm dừng được xác định trước và các kích thước này được + +64 +00:05:42,090 --> 00:05:45,480 +xác định dựa trên các kích thước màn hình phổ biến. + +65 +00:05:45,480 --> 00:05:51,630 +Và mặc dù những con số này liên tục thay đổi, nhìn chung tôi sẽ nói rằng nhỏ dành cho + +66 +00:05:51,630 --> 00:05:56,310 +thiết bị di động, trung bình dành cho máy tính bảng và iPad. + +67 +00:05:56,710 --> 00:06:05,880 +Loại lớn dành cho máy tính xách tay, loại cực lớn dành cho máy tính để bàn và loại cực lớn dành cho bất kỳ thứ gì điên rồ + +68 +00:06:05,880 --> 00:06:07,470 +như TV hay thứ gì đó. + +69 +00:06:07,470 --> 00:06:11,880 +Một phụ nhỏ dành cho các thiết bị có thể dài hơn chiều rộng. + +70 +00:06:11,880 --> 00:06:16,590 +Vì vậy, có thể là điện thoại có thể gập lại và thậm chí là màn hình điện thoại thực sự hẹp. + +71 +00:06:16,890 --> 00:06:24,030 +Bây giờ, một điều tôi muốn thu hút sự chú ý của bạn là hướng của các dấu hiệu ở đây. + +72 +00:06:24,180 --> 00:06:31,620 +Tất cả các điểm ngắt này thường sẽ được sử dụng, chẳng hạn như dấu gạch ngang than, dấu gạch ngang SM hai. + +73 +00:06:31,800 --> 00:06:40,410 +Phần này đề cập đến các màn hình lớn hơn kích thước này. + +74 +00:06:40,410 --> 00:06:51,150 +Vì vậy, điều đó có nghĩa là điểm dừng nhỏ nằm giữa đây và đây và bao gồm phạm vi từ 576 đến 768 và mỗi điểm trong số + +75 +00:06:51,150 --> 00:06:53,370 +chúng luôn tăng lên. + +76 +00:06:53,370 --> 00:06:58,260 +Vì vậy, đây là điểm quan trọng cần ghi nhớ khi bạn đang xử lý các điểm ngắt bootstrap. + +77 +00:06:58,530 --> 00:07:03,660 +Bây giờ, một trong những điều tuyệt vời về các điểm dừng bootstrap là chúng tôi không thực sự + +78 +00:07:03,660 --> 00:07:10,440 +cần truy vấn phương tiện nhiều vì điều này bao gồm khá nhiều kích thước thiết bị khác nhau và chúng tôi không phải viết thủ công + +79 +00:07:10,440 --> 00:07:15,120 +tất cả các kích thước pixel và thêm phương tiện truy vấn vào CSS của chúng tôi. + +80 +00:07:15,150 --> 00:07:21,840 +Chúng tôi có thể nhắm mục tiêu các kích thước khác nhau và làm cho trang web của chúng tôi phản hồi nhanh bằng cách sử dụng các điểm dừng được tạo sẵn. + +81 +00:07:22,410 --> 00:07:26,250 +Đây là một ví dụ về các điểm dừng bootstrap ở đây. + +82 +00:07:26,250 --> 00:07:35,850 +Chúng tôi đang nói rằng trên màn hình nhỏ trở lên, chúng tôi muốn tỷ lệ kích thước là hai, bốn và sáu. + +83 +00:07:35,850 --> 00:07:40,860 +Điều này có nghĩa là trên máy tính để bàn, máy tính xách tay, TV, tất cả sẽ có kích thước này. + +84 +00:07:40,860 --> 00:07:42,570 +Và ngay cả trên điện thoại di động là tốt. + +85 +00:07:42,600 --> 00:07:49,740 +Nhưng dưới kích thước của điện thoại di động, nó không được định nghĩa là có các tỷ lệ này. + +86 +00:07:49,740 --> 00:07:54,660 +Vì vậy, nó sẽ mặc định cung cấp cho mỗi div này 100%. + +87 +00:07:55,260 --> 00:07:58,050 +Và tương tự nếu bạn không thêm số vào đây. + +88 +00:07:58,050 --> 00:08:02,490 +Vì vậy, chúng ta có thể lấy ví dụ, đây là 12 cột, 12 chia cho 3. + +89 +00:08:02,490 --> 00:08:05,040 +Vì vậy, đây thực sự được gọi là số bốn. + +90 +00:08:05,040 --> 00:08:10,350 +Nhưng nếu chúng tôi không xác định một số, bạn nhớ rằng chúng sẽ tự động phân phối. + +91 +00:08:12,210 --> 00:08:17,910 +Nhưng nó sẽ như thế nào nếu chúng ta giảm kích thước màn hình xuống nhỏ hơn kích thước di động? + +92 +00:08:17,940 --> 00:08:26,040 +Chà, tất cả các div này sẽ có chiều rộng 100% khi chiều rộng tổng thể nhỏ hơn 576. + +93 +00:08:26,250 --> 00:08:32,730 +Sau đó, tất cả các mục này mặc định như thể chúng vừa được xác định một cột. + +94 +00:08:32,730 --> 00:08:41,669 +Vì vậy, gọi là lớp và lớp gọi theo mặc định sẽ chiếm 100% chiều rộng trong màn hình có kích thước + +95 +00:08:41,669 --> 00:08:42,600 +nhỏ. + +96 +00:08:43,150 --> 00:08:48,330 +Bây giờ trong một div duy nhất, bạn thực sự cũng có thể có nhiều điểm dừng. + +97 +00:08:48,340 --> 00:08:58,750 +Vì vậy, trong trường hợp này, những gì nó nói là trên các thiết bị lớn trở lên, thì nó sẽ chiếm 4 trên + +98 +00:08:58,750 --> 00:09:00,760 +12 chiều rộng. + +99 +00:09:01,030 --> 00:09:04,600 +Trên kích thước trung bình trở lên. + +100 +00:09:04,600 --> 00:09:06,550 +Vâng, bởi vì ở trên đã được xác định. + +101 +00:09:06,550 --> 00:09:13,840 +Vì vậy, trường hợp này chỉ dành cho các thiết bị trung bình, khi đó nó sẽ chiếm 8 trên 12 chiều rộng + +102 +00:09:13,870 --> 00:09:17,710 +và trên các thiết bị nhỏ, nó sẽ chiếm 12 trên 12. + +103 +00:09:17,710 --> 00:09:18,940 +Vì vậy, đầy đủ chiều rộng. + +104 +00:09:19,450 --> 00:09:22,870 +Ở đây chúng tôi đang mô phỏng một màn hình lớn. + +105 +00:09:22,870 --> 00:09:28,540 +Vì vậy, có thể trên máy tính xách tay hoặc máy tính để bàn, thì nó chiếm 4 trên 12. + +106 +00:09:28,570 --> 00:09:30,790 +Đó là loại tỷ lệ này. + +107 +00:09:30,790 --> 00:09:34,410 +Và sau đó chúng tôi chuyển sang kích thước tiếp theo xuống. + +108 +00:09:34,420 --> 00:09:39,850 +Vì vậy, trên iPad, nó sẽ chiếm 8 trên 12 màn hình. + +109 +00:09:39,850 --> 00:09:46,400 +Và ví dụ, vì vậy, chúng ta hãy đi sâu hơn nữa đến kích thước di động nơi chúng tôi muốn nó chiếm + +110 +00:09:46,400 --> 00:09:49,820 +100% hoặc toàn bộ chiều rộng của màn hình. + +111 +00:09:49,820 --> 00:09:55,160 +Bởi vì như bạn tưởng tượng, khi chúng ta có nhiều không gian màn hình hơn, việc xem mọi thứ sẽ dễ dàng hơn. + +112 +00:09:55,160 --> 00:10:00,500 +Và khi chúng tôi đang làm việc trên màn hình nhỏ hơn, chúng tôi muốn làm cho mọi thứ nhìn chung lớn hơn một chút + +113 +00:10:00,500 --> 00:10:03,260 +để người dùng dễ dàng xem nội dung của chúng tôi hơn. + +114 +00:10:03,830 --> 00:10:10,730 +Ngoài việc có nhiều điểm dừng trong mỗi div, bạn cũng có thể trộn và kết hợp các loại định nghĩa. + +115 +00:10:10,730 --> 00:10:16,040 +Vì vậy, ví dụ, ở đây chúng tôi có hai cột có kích thước, gọi hai và gọi bốn. + +116 +00:10:16,040 --> 00:10:21,530 +Vì vậy, nó sẽ luôn chiếm 2 trên 12, Phần 4 trên 12 ở đây. + +117 +00:10:21,530 --> 00:10:25,620 +Nhưng cái cuối cùng này, chú ý cách chúng ta để nó như lớp cột. + +118 +00:10:25,640 --> 00:10:31,490 +Bây giờ, điều này có nghĩa là nó sẽ tự động điều chỉnh kích thước để chiếm bất kỳ tỷ lệ + +119 +00:10:31,490 --> 00:10:32,450 +nào còn lại. + +120 +00:10:33,130 --> 00:10:40,270 +Bố cục Bootstrap hơi phức tạp một chút khi bạn lần đầu tiên làm việc với nó và điều thực sự quan trọng + +121 +00:10:40,270 --> 00:10:46,780 +là bạn phải đọc tài liệu cũng như thực hành nhiều trước khi mọi thứ bắt đầu có ý nghĩa hơn. + +122 +00:10:46,780 --> 00:10:54,730 +Vì vậy, để bạn thực hành, tôi đã tạo một trang web tại github. io chuyển tiếp bố cục bootstrap dash và nếu bạn truy cập + +123 +00:10:54,970 --> 00:11:00,220 +trang web này, bạn sẽ thấy rằng tôi có tổng cộng ba bài tập dành cho bạn. + +124 +00:11:00,490 --> 00:11:07,570 +Ý tưởng của các bài tập là ở trên cùng sẽ có một khu vực demo, đó là hiệu quả mà bạn đang cố gắng + +125 +00:11:07,570 --> 00:11:08,740 +đạt được. + +126 +00:11:08,770 --> 00:11:15,250 +Ví dụ: trong trường hợp này, chúng tôi muốn các Div này là 50% trên máy tính để bàn và 100% trên thiết bị di động. + +127 +00:11:15,250 --> 00:11:24,310 +Vì vậy, khi tôi giảm chiều rộng, bạn sẽ thấy rằng nó đạt đến điểm mà chúng ta đạt đến điểm dừng + +128 +00:11:24,310 --> 00:11:27,280 +đó khi nó đạt 100% chiều rộng. + +129 +00:11:27,520 --> 00:11:33,050 +Khi bạn kéo xuống dưới, mỗi bài tập khác nhau sẽ có tỷ lệ khác nhau. + +130 +00:11:33,050 --> 00:11:41,090 +Và điều bạn muốn làm là sửa đổi mã HTML bên trong đây, mã này chịu trách nhiệm tạo kiểu cho khu vực + +131 +00:11:41,090 --> 00:11:45,410 +mà bạn kiểm soát, đó là các div bên dưới các ví dụ. + +132 +00:11:45,410 --> 00:11:52,910 +Và tôi muốn bạn thêm các lớp để sử dụng hệ thống bố cục 12 cột để khu vực của bạn hoạt động giống + +133 +00:11:52,910 --> 00:11:55,700 +hệt như khu vực trên cùng. + +134 +00:11:55,700 --> 00:12:00,380 +Khi bạn giảm kích thước và nhấn vào các điểm dừng khác nhau. + +135 +00:12:00,860 --> 00:12:08,030 +Nếu bạn gặp khó khăn, hãy nhớ xem phần bố cục của tài liệu bootstrap và ở đây bạn sẽ thấy các + +136 +00:12:08,030 --> 00:12:10,700 +điểm dừng bootstrap khác nhau. + +137 +00:12:10,700 --> 00:12:19,490 +Ngoài ra, bạn có thể đọc thêm về cách thức hoạt động của các cột, cách thức hoạt động của vùng chứa và cách thức hoạt động của hệ thống + +138 +00:12:19,490 --> 00:12:20,270 +lưới. + +139 +00:12:20,510 --> 00:12:23,600 +Tạm dừng video ngay bây giờ và thực hiện thử thách này. + +140 +00:12:26,320 --> 00:12:30,910 +Vì vậy, hy vọng bạn đã thử và bạn đã quản lý để mọi thứ hoạt động chính xác. + +141 +00:12:30,940 --> 00:12:33,070 +Chúng ta hãy cùng nhau đi qua giải pháp. + +142 +00:12:33,250 --> 00:12:38,560 +Ví dụ đầu tiên cho biết tỷ lệ này phải là 50% trên máy tính để bàn và 100% trên thiết bị di động. + +143 +00:12:38,590 --> 00:12:47,860 +Chúng tôi biết rằng điểm ngắt của máy tính để bàn là XL, vì vậy chúng tôi có thể xác định cột gạch ngang XL gạch ngang sáu + +144 +00:12:47,860 --> 00:12:50,560 +và sáu trên 12 tất nhiên là 50%. + +145 +00:12:50,590 --> 00:12:59,350 +Bây giờ để đạt được tỷ lệ 100% trên thiết bị di động, chúng tôi có thể nói cột gạch ngang gạch ngang 12, tức là 100% và chúng tôi có thể + +146 +00:12:59,350 --> 00:13:01,150 +thêm số đó vào cả hai div. + +147 +00:13:01,180 --> 00:13:07,360 +Bây giờ, nếu tôi tiếp tục và thiết lập các thay đổi áp dụng, bạn có thể thấy ngay bây giờ + +148 +00:13:07,360 --> 00:13:14,860 +khi tôi giảm chiều rộng của cửa sổ rằng nó sẽ chạm đến điểm ngắt mà bên dưới nó sẽ không còn là 50% nữa và nó + +149 +00:13:14,860 --> 00:13:17,680 +sẽ bắt đầu chiếm toàn bộ chiều rộng . + +150 +00:13:18,580 --> 00:13:25,420 +Bây giờ, bạn có thể nhớ trước đây chúng tôi đã nói rằng các điểm ngắt bootstrap, kích thước mục tiêu, + +151 +00:13:25,420 --> 00:13:27,450 +kích thước cụ thể này trở lên. + +152 +00:13:27,470 --> 00:13:35,120 +Vì vậy, khi chúng tôi xác định Cột XL sáu, chúng tôi đang nói bất kỳ thứ gì nằm trên điểm + +153 +00:13:35,120 --> 00:13:39,110 +dừng XL, lớn hơn 1200 pixel, phải là 50%. + +154 +00:13:39,200 --> 00:13:44,270 +Bạn có thể đã nhận ra rằng bạn thực sự không cần xác định điều này vì mọi thứ khác sẽ + +155 +00:13:44,270 --> 00:13:45,860 +được mặc định là 100%. + +156 +00:13:45,860 --> 00:13:51,530 +Vì vậy, nếu tôi áp dụng các thay đổi một lần nữa, bạn có thể thấy rằng ví dụ màu tím của tôi vẫn hoạt động giống như ví dụ + +157 +00:13:51,530 --> 00:13:52,310 +màu xanh lục. + +158 +00:13:52,310 --> 00:13:58,220 +Và tôi chỉ thay đổi hành vi của kích thước XL trở lên và thay đổi bố cục của nó. + +159 +00:13:58,820 --> 00:14:02,020 +Được rồi, vậy chúng ta hãy chuyển sang bài tập số hai. + +160 +00:14:02,030 --> 00:14:07,310 +Và trong trường hợp này, tôi đã không cung cấp cho bạn chính xác những gì họ nên làm hoặc cách họ nên cư xử. + +161 +00:14:07,310 --> 00:14:14,240 +Và thay vào đó, tôi muốn bạn chỉ cần giảm chiều rộng của màn hình để xem nó thay đổi như thế nào qua các kích + +162 +00:14:14,240 --> 00:14:15,710 +thước khác nhau. + +163 +00:14:15,800 --> 00:14:17,100 +Cái đầu tiên thì dễ. + +164 +00:14:17,120 --> 00:14:23,240 +Gần như tất cả các kích thước lớn hơn, cho đến điểm dừng lớn chiếm toàn bộ cột 12 chiều rộng + +165 +00:14:23,240 --> 00:14:26,570 +và bạn có thể lấy thước ra nếu muốn đo màn hình. + +166 +00:14:26,570 --> 00:14:30,800 +Nhưng chúng ta có thể thấy rằng cột một bằng khoảng một nửa chiều rộng của hàng. + +167 +00:14:30,830 --> 00:14:37,010 +Cột hai và ba có kích thước gần như bằng nhau, vì vậy có thể nó sẽ là sáu, ba và ba. + +168 +00:14:37,340 --> 00:14:41,960 +Hãy sửa đổi điều này để chúng tôi nhắm mục tiêu điểm ngắt lớn trước tiên. + +169 +00:14:41,960 --> 00:14:47,510 +Vì vậy, chúng tôi sẽ nói Col Dash, LG Dash six cho cột đầu tiên. + +170 +00:14:47,540 --> 00:14:54,860 +Cột thứ hai sẽ được gọi là Dash, LG Dash ba và tương tự cho cột thứ ba. + +171 +00:14:54,860 --> 00:15:00,350 +Vì vậy, bây giờ nếu tôi nhấp vào áp dụng các thay đổi, bạn có thể thấy nó hiện chiếm tỷ lệ như cũ. + +172 +00:15:00,350 --> 00:15:08,360 +Nhưng khi chúng ta nhấn điểm dừng này nằm dưới điểm dừng lớn, các cột của chúng ta theo mặc định là 100%, trong khi + +173 +00:15:08,390 --> 00:15:11,390 +ví dụ thực sự làm điều gì đó khác biệt. + +174 +00:15:11,420 --> 00:15:16,460 +Cột trên cùng chiếm 100% và hai cột còn lại chiếm một nửa chiều rộng. + +175 +00:15:16,460 --> 00:15:21,260 +Và bạn có thể thấy hành vi đó tiếp tục cho đến kích thước rất nhỏ. + +176 +00:15:21,260 --> 00:15:24,710 +Vì vậy, điều đó có nghĩa là chúng ta đã xác định được một điểm ngắt SM. + +177 +00:15:24,740 --> 00:15:29,450 +Bây giờ, khi bạn đã làm việc với điều này trong một thời gian dài, bạn có thể phát hiện ra từng điểm ngắt + +178 +00:15:29,450 --> 00:15:30,290 +bằng mắt thường. + +179 +00:15:30,320 --> 00:15:36,020 +Nhưng ban đầu, bạn luôn có thể chuyển đổi xung quanh, thử những cái khác nhau, thử SM, thử XL và + +180 +00:15:36,020 --> 00:15:38,880 +xem cái nào thực sự hoạt động giống như ví dụ. + +181 +00:15:38,900 --> 00:15:44,030 +Không có gì sai khi thử và sai khi nó chạm vào kích thước màn hình nhỏ hơn. + +182 +00:15:44,120 --> 00:15:51,650 +Cột một của chúng ta sẽ chiếm toàn bộ chiều rộng của hàng và sau đó hai cột còn lại trên điểm dừng nhỏ hơn + +183 +00:15:51,650 --> 00:15:54,110 +sẽ chiếm một nửa chiều rộng. + +184 +00:15:54,110 --> 00:15:56,000 +Vì vậy, gọi SM sáu. + +185 +00:15:56,590 --> 00:15:59,440 +Và tương tự, cái thứ ba cũng làm như vậy. + +186 +00:15:59,440 --> 00:16:00,940 +Vì vậy, hãy áp dụng thay đổi. + +187 +00:16:00,940 --> 00:16:05,410 +Và bây giờ bạn có thể thấy tại điểm dừng này, chúng cũng hoạt động giống hệt nhau. + +188 +00:16:05,410 --> 00:16:12,430 +Vì vậy, bây giờ tất cả những gì chúng ta còn lại là điểm cuối cùng, đây chỉ là điểm ngắt nhỏ nhất cho các cột. + +189 +00:16:12,430 --> 00:16:19,560 +Và đây điều đang thực sự xảy ra là mỗi cột này đang chiếm 10 trong số 12 cột. + +190 +00:16:19,570 --> 00:16:23,590 +Bây giờ, tôi có thể nhận ra điều đó bằng mắt, nhưng tôi cũng đã tạo ra bài tập này, vì vậy tôi biết. + +191 +00:16:23,590 --> 00:16:26,770 +Nhưng nếu bạn thử một số con số khác, có thể bạn cũng sẽ đến đó. + +192 +00:16:26,770 --> 00:16:35,380 +Vì vậy, nếu chúng tôi xác định kích thước nhỏ nhất là cột, hãy thử bắt đầu với số tám để tôi có thể chỉ cho bạn quy + +193 +00:16:35,380 --> 00:16:37,210 +trình thử và sai này. + +194 +00:16:37,210 --> 00:16:40,690 +Và chúng tôi biết rằng tất cả các cột hoạt động giống nhau tại điểm dừng đó. + +195 +00:16:40,690 --> 00:16:45,640 +Nếu chúng tôi nhấp vào áp dụng các thay đổi và chúng tôi đến đây, chúng tôi có thể thấy, tám rõ ràng là quá nhỏ. + +196 +00:16:45,640 --> 00:16:50,590 +Vì vậy, hãy tăng kích thước và thay đổi thành 10 trên 12. + +197 +00:16:50,590 --> 00:16:58,880 +Và khi tôi nhấn áp dụng các thay đổi, bạn có thể thấy chúng tôi hiện có cả hai bộ cột hoạt động giống hệt nhau ở tất cả + +198 +00:16:58,880 --> 00:17:00,710 +các điểm dừng khác nhau. + +199 +00:17:00,710 --> 00:17:05,990 +Cái này khó hơn một chút, phải thừa nhận, và nó đòi hỏi bạn phải suy nghĩ nhiều hơn một chút và có thể + +200 +00:17:05,990 --> 00:17:07,520 +là thử và sai từ phía bạn. + +201 +00:17:07,520 --> 00:17:12,950 +Nhưng hy vọng rằng khi kết thúc cuốn sách này, bạn sẽ hiểu rõ hơn một chút về cách thức hoạt động của các điểm + +202 +00:17:12,950 --> 00:17:15,260 +dừng khác nhau này và điểm dừng của chúng. + +203 +00:17:15,260 --> 00:17:20,180 +Vì vậy, bây giờ cho bài tập cuối cùng và bài tập này, chúng ta có hai cột. + +204 +00:17:20,180 --> 00:17:29,150 +Ban đầu, chúng bắt đầu trong một dòng chiếm một tỷ lệ cụ thể và sau đó chúng tôi đạt đến một điểm ngắt nhất + +205 +00:17:29,150 --> 00:17:31,820 +định và nó sẽ thay đổi tỷ lệ. + +206 +00:17:32,120 --> 00:17:37,700 +Cột một rộng hơn một chút, chiếm nhiều không gian hơn so với cột hai. + +207 +00:17:37,700 --> 00:17:44,390 +Và sau đó nếu chúng ta giảm thêm một chút nữa, điều đó sẽ lại thay đổi ở điểm ngắt tiếp theo và sau đó một lần nữa và cuối + +208 +00:17:44,390 --> 00:17:46,430 +cùng chiếm toàn bộ chiều rộng. + +209 +00:17:46,640 --> 00:17:52,010 +Vì vậy, hãy bắt đầu với điểm dừng lớn nhất mà chúng tôi biết, đó là XL. + +210 +00:17:52,340 --> 00:17:56,210 +Hãy nói rằng dấu gạch ngang XL. + +211 +00:17:56,210 --> 00:18:02,240 +Và hãy xác định là một trong số 12 và sau đó đưa ra nửa còn lại. + +212 +00:18:02,360 --> 00:18:05,150 +Ừm, 12 trừ 1 là 11. + +213 +00:18:05,150 --> 00:18:09,770 +Và bây giờ hãy áp dụng thay đổi và bạn có thể thấy đó là tỷ lệ chính xác. + +214 +00:18:10,040 --> 00:18:12,740 +Một lần nữa, điều này có thể yêu cầu thử và sai từ phía bạn. + +215 +00:18:12,770 --> 00:18:14,090 +Đừng quá khắt khe với bản thân. + +216 +00:18:14,090 --> 00:18:17,150 +Nếu bạn không xoay sở để có được nó lần đầu tiên, tôi cũng sẽ không thể. + +217 +00:18:17,150 --> 00:18:19,760 +Nếu đó là bài tập của người khác như thế này. + +218 +00:18:19,850 --> 00:18:26,630 +Bây giờ, hãy nhấn điểm ngắt tiếp theo gần đây, và đây sẽ là điểm ngắt tiếp theo. + +219 +00:18:26,630 --> 00:18:28,070 +Đây là XL. + +220 +00:18:28,100 --> 00:18:34,580 +Chúng tôi vừa đạt 1200 và một mẹo để làm việc với khả năng phản hồi. + +221 +00:18:34,580 --> 00:18:39,580 +Khi bạn đang thắc mắc làm thế nào để tôi biết đó là điểm dừng 1200 pixel đã bị tấn công? + +222 +00:18:39,590 --> 00:18:46,880 +Nếu bạn truy cập công cụ dành cho nhà phát triển Chrome và nhấp vào nút này để chuyển đổi thanh công cụ của thiết + +223 +00:18:46,880 --> 00:18:54,080 +bị và thay đổi kích thước thành phản hồi, thì bạn có thể nhấp vào thanh kéo này và nhìn lên trên cùng tại đây. + +224 +00:18:54,080 --> 00:19:01,850 +Đây là chiều rộng quan trọng mà chúng ta cần xem xét khi tôi mở rộng nó lên 1200, bạn có thể thấy rằng kích + +225 +00:19:01,850 --> 00:19:04,340 +thước nhảy vọt chỉ xảy ra ở đó. + +226 +00:19:04,340 --> 00:19:12,140 +Vì vậy, chúng tôi biết rằng điểm dừng 1200 là điểm dừng XL và bạn cũng có thể giải quyết vấn đề này theo cách này. + +227 +00:19:12,140 --> 00:19:16,250 +Vì vậy, đây chỉ là mẹo cho tương lai khi bạn đang làm việc với bất kỳ loại phản hồi nào. + +228 +00:19:16,250 --> 00:19:21,650 +Điều này thực sự hữu ích khi biết, nhưng hầu hết thời gian tôi sẽ đánh giá khả năng phản hồi chỉ bằng mắt khi + +229 +00:19:21,650 --> 00:19:24,350 +bạn đang thiết kế bố cục để xem cái nào trông đẹp mắt. + +230 +00:19:25,010 --> 00:19:30,830 +Được rồi, vậy hãy nhấn điểm ngắt tiếp theo ở kích thước XL 1200 pixel. + +231 +00:19:30,830 --> 00:19:36,650 +Vì vậy, đây được gọi là Dash XL, và tôi cho rằng đây là tỷ lệ từ 2 đến 10. + +232 +00:19:36,650 --> 00:19:44,330 +Vì vậy, hãy gọi XL để gọi XL mười, hãy áp dụng các thay đổi của chúng tôi và điều đó khá tốt. + +233 +00:19:44,330 --> 00:19:52,070 +Vì vậy, bây giờ hãy tiếp tục giảm cho đến khi chúng ta đạt đến điểm dừng tiếp theo và đây sẽ là mức giảm tiếp theo, + +234 +00:19:52,070 --> 00:19:53,690 +mức này rất lớn. + +235 +00:19:53,720 --> 00:19:58,040 +LG Và tôi nghĩ đây có lẽ là 4 đến 8. + +236 +00:19:58,040 --> 00:20:06,620 +Vì vậy, hãy gọi Dash, LG Dash bốn và chiếc tiếp theo sẽ được gọi là LG Dash tám. + +237 +00:20:06,620 --> 00:20:11,900 +Và lưu ý rằng mỗi trong số này luôn có tổng bằng 12 vì bạn có thể thấy trong cách bố trí ví dụ, + +238 +00:20:11,900 --> 00:20:13,610 +chúng chỉ chiếm một hàng. + +239 +00:20:13,640 --> 00:20:18,500 +Nếu nó không cộng lại thành 12, thì nó sẽ chuyển sang hàng tiếp theo để chiếm dung lượng mà + +240 +00:20:18,500 --> 00:20:19,760 +chúng tôi đã chỉ định. + +241 +00:20:20,000 --> 00:20:23,030 +Bây giờ chúng ta có điểm dừng tiếp theo, đó là dấu gạch ngang lạnh. + +242 +00:20:23,030 --> 00:20:28,550 +MD Và cái này rất dễ nhận ra vì nó bằng một nửa, vậy nó sẽ là sáu. + +243 +00:20:28,550 --> 00:20:35,150 +Và cuối cùng, chúng tôi có phần còn lại theo mặc định sẽ chiếm 100%. + +244 +00:20:35,150 --> 00:20:38,420 +Vì vậy, bạn có thể xác định SM, nhưng đó cũng là hành vi mặc định. + +245 +00:20:38,420 --> 00:20:39,770 +Vì vậy, bạn cũng có thể bỏ nó đi. + +246 +00:20:40,130 --> 00:20:41,000 +Ở đó bạn có nó. + +247 +00:20:41,000 --> 00:20:42,620 +Đó là giải pháp cuối cùng. + +248 +00:20:42,620 --> 00:20:48,650 +Mã cho bài tập ba và bài tập hai và bài tập một. + +249 +00:20:48,650 --> 00:20:52,670 +Hy vọng rằng cuối cùng bạn cũng xoay sở để đạt được điều đó, ngay cả khi có một chút thử nghiệm và + +250 +00:20:52,670 --> 00:20:53,810 +sai sót và một số khó khăn. + +251 +00:20:53,810 --> 00:20:55,880 +Nhưng một khi bạn đã sử dụng bootstrap layout. + +252 +00:20:55,890 --> 00:20:56,580 +Một vài lần. + +253 +00:20:56,580 --> 00:20:58,170 +Bạn sẽ quen với ý tưởng này. + +254 +00:20:58,170 --> 00:21:01,680 +Và đó là một cách thực sự trực quan để bố trí màn hình của chúng ta. + +255 +00:21:01,680 --> 00:21:06,270 +Và thật dễ dàng để thao tác và tạo ra các thiết kế bố cục khác nhau. + +256 +00:21:06,660 --> 00:21:11,130 +Bây giờ, trong bài học tiếp theo, chúng ta sẽ nói về các thành phần bootstrap khác nhau. + +257 +00:21:11,130 --> 00:21:13,650 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/004 11.2-Bootstrap-Components.zip b/part3/58 - Day 58 - Web Foundation Bootstrap/004 11.2-Bootstrap-Components.zip new file mode 100644 index 0000000000000000000000000000000000000000..680349e005c095da5af29f439514a06b12c0a514 --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/004 11.2-Bootstrap-Components.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57d3df3075127733782da1b6d68bbf3d0efd72b1e2981d2213fd8e86957ad8f8 +size 1278621 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/004 Bootstrap Components.mp4 b/part3/58 - Day 58 - Web Foundation Bootstrap/004 Bootstrap Components.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d331d6bc9726fc8fe49daeac620a173ff463b355 --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/004 Bootstrap Components.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a262b23adac167c7fb4e12f9ceacfebbb4b10a8ebc318dd2e08b5b661a8b789f +size 585997018 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/004 Bootstrap Components_vi.srt b/part3/58 - Day 58 - Web Foundation Bootstrap/004 Bootstrap Components_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..38186fade67e26978f02fc5f17d2cec4e928f89f --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/004 Bootstrap Components_vi.srt @@ -0,0 +1,1536 @@ +1 +00:00:00,260 --> 00:00:00,890 +Này các cậu. + +2 +00:00:00,890 --> 00:00:06,230 +Trong bài học này, chúng ta sẽ tìm hiểu về một trong những tính năng mạnh mẽ nhất của Bootstrap và một trong + +3 +00:00:06,230 --> 00:00:11,090 +những lý do lớn nhất khiến chúng ta sử dụng bootstrap trong dự án của mình ngay từ đầu. + +4 +00:00:11,090 --> 00:00:19,460 +Và đó là khái niệm về các thành phần bootstrap, các thành phần được tạo kiểu sẵn như nút, thẻ và + +5 +00:00:19,460 --> 00:00:26,030 +băng chuyền và vô số thứ đẹp mắt mà chúng ta có quyền truy cập chỉ bằng cách thêm + +6 +00:00:26,030 --> 00:00:29,390 +lớp bootstrap vào HTML của mình. + +7 +00:00:29,510 --> 00:00:35,480 +Hãy bắt đầu với một trong những thành phần được sử dụng phổ biến nhất, đó là nút bootstrap. + +8 +00:00:35,480 --> 00:00:42,410 +Và đây là một nơi thực sự tốt để bắt đầu vì bạn cũng thấy kiểu dáng bootstrap mặc định và bảng phối màu + +9 +00:00:42,410 --> 00:00:47,920 +trong hầu hết các thành phần mà bạn sẽ có quyền truy cập thông qua bootstrap. + +10 +00:00:47,930 --> 00:00:51,440 +Nếu bạn muốn cho nó một màu cụ thể. + +11 +00:00:51,440 --> 00:00:59,360 +Thật dễ dàng để truy cập tất cả các màu mặc định này bằng cách chỉ cần sử dụng tên của chúng trong hầu hết các trường hợp trong + +12 +00:00:59,360 --> 00:01:06,690 +trang web thiết kế bootstrap, nút chính, truy cập, bạn biết đấy, mua hoặc liên hệ với chúng tôi hoặc tải xuống bất + +13 +00:01:06,690 --> 00:01:13,470 +cứ thứ gì sẽ có màu xanh lam này và bạn có thể truy cập tất cả các màu khác thông qua từng tên bootstrap của + +14 +00:01:13,470 --> 00:01:18,930 +chúng và chúng cung cấp cho bạn một chút gợi ý về mục đích sử dụng của chúng. + +15 +00:01:18,930 --> 00:01:22,560 +Vì vậy, thành công thường giống như một sự nguy hiểm của nút ổn. + +16 +00:01:22,560 --> 00:01:29,130 +Có thể nếu bạn nhấp vào nút này, điều gì đó thực sự tồi tệ sẽ xảy ra hoặc cảnh báo, + +17 +00:01:29,130 --> 00:01:37,950 +v.v., và bạn có quyền truy cập vào nút này và kiểu dáng của nút này chỉ bằng cách tạo một phần tử HTML của nút, + +18 +00:01:37,980 --> 00:01:45,210 +đặt lớp BTN cho nút bootstrap, sau đó thêm lớp cho bảng màu từ danh sách này mà bạn muốn + +19 +00:01:45,210 --> 00:01:46,200 +chọn. + +20 +00:01:46,200 --> 00:01:47,730 +Hãy thử điều này ra. + +21 +00:01:47,760 --> 00:01:54,990 +Hãy tiếp tục và tải xuống các tệp bắt đầu từ 11. 2 tệp zip thành phần bootstrap và sau khi bạn giải + +22 +00:01:54,990 --> 00:01:57,690 +nén nó, hãy mở nó bên trong vs mã. + +23 +00:01:57,720 --> 00:01:59,970 +Đi đến chỉ mục. html. + +24 +00:02:00,000 --> 00:02:06,090 +Bây giờ ở đây, bạn sẽ nhận thấy rằng tôi đã thêm vào liên kết bootstrap, chúng ta có một phần kiểu + +25 +00:02:06,090 --> 00:02:12,780 +mà chúng ta có thể thêm CSS tùy chỉnh vào và trong vùng nội dung, tôi muốn bạn sử dụng tài liệu bootstrap. + +26 +00:02:12,780 --> 00:02:18,780 +Vì vậy, nếu bạn truy cập trang web chính của bootstrap tại getbootstrap. com, truy cập tài liệu và sau đó cuộn xuống + +27 +00:02:18,780 --> 00:02:26,370 +các thành phần, tìm các nút và tôi muốn bạn đặt một nút màu xanh lá cây có nội dung, được rồi, ở đâu đó trên + +28 +00:02:26,370 --> 00:02:27,630 +trang web này. + +29 +00:02:27,630 --> 00:02:34,170 +Hãy nhớ rằng bạn có thể xem trước video trong thời gian thực để xem video có hoạt động hay không và tạm dừng video ngay bây giờ và hoàn thành + +30 +00:02:34,170 --> 00:02:35,100 +thử thách này. + +31 +00:02:36,600 --> 00:02:36,930 +Được rồi. + +32 +00:02:36,930 --> 00:02:38,760 +Vì vậy, điều này là khá đơn giản. + +33 +00:02:38,760 --> 00:02:42,480 +Chúng tôi có một nút mà chúng tôi đã nói là sẽ nói, được thôi. + +34 +00:02:42,780 --> 00:02:49,500 +Và để tạo kiểu cho nó bằng bootstrap, điều đầu tiên chúng tôi làm là thêm lớp BTN và bạn có thể thấy phông + +35 +00:02:49,500 --> 00:02:52,500 +chữ thay đổi tự động, màu nền thay đổi. + +36 +00:02:52,500 --> 00:02:55,830 +Và sau đó chúng tôi nói rằng chúng tôi muốn có một nút màu xanh lá cây. + +37 +00:02:55,830 --> 00:02:59,490 +Vậy nút xanh là BTN thành công. + +38 +00:02:59,490 --> 00:03:02,820 +Vì vậy, hãy tiếp tục và thêm thành công BTN. + +39 +00:03:02,820 --> 00:03:09,030 +Và sau khi chúng tôi hoàn tất, bạn có thể thấy chúng tôi có một nút màu xanh lá cây tuyệt đẹp với hoạt ảnh di chuột + +40 +00:03:09,030 --> 00:03:15,330 +với kiểu dáng đẹp, kích thước phù hợp, các góc bo tròn, tất cả đều tốt mà không cần thực hiện nhiều thao tác. + +41 +00:03:15,330 --> 00:03:20,940 +Việc tạo ra cái này cực kỳ, cực kỳ đơn giản và điều này sẽ cho bạn cảm nhận về những gì sắp xảy ra. + +42 +00:03:21,240 --> 00:03:26,820 +Thành phần tiếp theo tôi muốn nói đến là một thành phần thực sự hữu ích, đó là thẻ mà + +43 +00:03:26,820 --> 00:03:29,250 +bạn đã thấy trong bài tập trước. + +44 +00:03:29,250 --> 00:03:35,880 +Và như mọi khi, tất cả những gì chúng ta cần làm là truy cập trang của thành phần cụ thể đó và sau đó chúng ta chỉ cần sao + +45 +00:03:35,980 --> 00:03:42,490 +chép mã, dán mã vào trang web của mình và thay thế một số phần nhất định của mã, chẳng hạn như nguồn hình ảnh hoặc + +46 +00:03:42,490 --> 00:03:43,720 +văn bản thay thế. + +47 +00:03:43,840 --> 00:03:49,390 +Bây giờ, một thành phần mà bạn có thể sẽ sử dụng bất cứ khi nào bạn xây dựng trang web là thanh điều hướng + +48 +00:03:49,420 --> 00:03:54,940 +và thanh điều hướng bootstrap là một số thanh điều hướng được thiết kế tốt nhất mà tôi từng thấy. + +49 +00:03:54,940 --> 00:04:01,500 +Và nó cũng cực kỳ dễ dàng để bao gồm chỉ bằng cách sử dụng mã đoạn mã ví dụ của họ. + +50 +00:04:01,510 --> 00:04:09,610 +Nếu bạn đi tới thanh điều hướng, bạn có thể đọc về cách thức hoạt động của nó. Và ví dụ như một số ví dụ mà họ có, ví + +51 +00:04:09,610 --> 00:04:17,260 +dụ này có thanh tìm kiếm với một số danh sách thả xuống và ví dụ này mô tả cách bạn có thể có thương hiệu ở trên + +52 +00:04:17,260 --> 00:04:23,200 +cùng bên trái hoặc nếu bạn muốn có nhãn hiệu hình ảnh, hình ảnh và văn bản và bạn có + +53 +00:04:23,200 --> 00:04:29,860 +thể cuộn qua phần này để tìm loại thanh điều hướng bạn muốn tạo và sử dụng mã ví dụ. + +54 +00:04:29,950 --> 00:04:36,820 +Bây giờ, một khu vực khác dành cho các thanh điều hướng là nếu bạn xem qua các ví dụ và đi tới phần tiêu đề, + +55 +00:04:36,820 --> 00:04:45,040 +bạn có thể thấy một số thanh điều hướng được bố trí đẹp mắt hơn ở đây để cho bạn thấy một số loại thành phần khác nhau và cách chúng + +56 +00:04:45,070 --> 00:04:49,060 +hoạt động. có thể được sử dụng trong cuộc sống thực. + +57 +00:04:49,060 --> 00:04:53,920 +Chúng tôi sẽ xây dựng trang web của một công ty khởi nghiệp đang chuyển động. + +58 +00:04:53,950 --> 00:05:00,700 +Chúng được gọi là Move It, khá đơn giản và nó có một trang web với nhiều phần khác nhau và tôi sẽ chỉ + +59 +00:05:00,700 --> 00:05:06,940 +cho bạn thấy việc xây dựng toàn bộ trang web chính thức này dễ dàng như thế nào chỉ bằng các + +60 +00:05:06,940 --> 00:05:08,770 +thành phần bootstrap. + +61 +00:05:08,770 --> 00:05:15,280 +Vì vậy, điều đầu tiên chúng ta cần là thanh điều hướng đó, và bạn sẽ nhận thấy rằng tôi đã sử dụng thanh điều hướng gần như là thanh + +62 +00:05:15,280 --> 00:05:17,050 +điều hướng tiêu chuẩn này. + +63 +00:05:17,050 --> 00:05:20,710 +Vì vậy, nó có một trường mà bạn có thể tìm kiếm, chẳng hạn như mã bưu điện. + +64 +00:05:20,710 --> 00:05:27,070 +Nếu công ty của chúng tôi hoạt động trong khu vực của bạn, thì nó có một số menu thả xuống, nó có một số khu vực nhỏ khác + +65 +00:05:27,070 --> 00:05:28,570 +mà bạn có thể nhấp vào. + +66 +00:05:28,570 --> 00:05:37,540 +Vì vậy, hãy tiếp tục và sao chép mã cho điểm bắt đầu của thanh điều hướng của chúng ta và dán mã đó + +67 +00:05:37,540 --> 00:05:39,700 +vào phần thân của mã. + +68 +00:05:39,700 --> 00:05:43,540 +Vì vậy, bạn có thể thấy ngay sau khi tôi làm điều đó, tôi đã thấy thanh điều hướng của mình hiển thị. + +69 +00:05:43,540 --> 00:05:48,640 +Nhưng một điều bạn sẽ nhận thấy ngay khi bạn bắt đầu chơi với nó là khi thanh + +70 +00:05:48,640 --> 00:05:57,370 +điều hướng bootstrap có chiều rộng nhỏ hơn, nó sẽ tự động hiển thị menu bánh hamburger và menu đó sẽ có danh sách thả xuống với + +71 +00:05:57,370 --> 00:06:00,010 +tất cả các nút từ điều hướng quán ba. + +72 +00:06:00,010 --> 00:06:03,460 +Bây giờ tại sao nút của chúng tôi không hoạt động? + +73 +00:06:03,460 --> 00:06:09,910 +Bây giờ, hãy nhớ trước đây tôi đã nói khi chúng ta bắt đầu với Bootstrap, có hai liên kết để đưa vào qua CDN. + +74 +00:06:09,940 --> 00:06:14,410 +Cái đầu tiên là biểu định kiểu và cung cấp cho chúng ta tất cả các kiểu dáng. + +75 +00:06:14,410 --> 00:06:20,950 +Nhưng cái thứ hai là mã kịch bản cung cấp cho chúng tôi tất cả các chức năng vì điều này cho phép + +76 +00:06:20,950 --> 00:06:24,760 +chúng tôi truy cập vào mã JavaScript bootstrap. + +77 +00:06:24,760 --> 00:06:28,990 +Bây giờ chúng ta không cần phải hiểu bất cứ điều gì về JavaScript để sử dụng nó. + +78 +00:06:28,990 --> 00:06:37,030 +Tất cả những gì chúng ta cần làm là sao chép liên kết đó và đi đến bên phải ở cuối ngay trước thẻ đóng nội dung và dán + +79 +00:06:37,030 --> 00:06:39,190 +liên kết tập lệnh đó vào đó. + +80 +00:06:39,190 --> 00:06:45,160 +Và bạn có thể thấy ngay sau khi tôi hoàn thành việc đó, các nút của tôi giờ đã hoạt động, trình đơn thả xuống + +81 +00:06:45,160 --> 00:06:52,360 +của tôi hoạt động và tất cả các bit chức năng nhấp chuột này bắt đầu hoạt động và điều này lại xuất hiện ngay từ Bootstrap. + +82 +00:06:52,900 --> 00:06:56,710 +Chúng ta hãy xem trang web này ở định dạng lớn hơn. + +83 +00:06:56,710 --> 00:07:03,370 +Bằng cách mở Inside Chrome, bạn có thể thấy rằng phần lớn hai thanh điều hướng này trông khá giống nhau. + +84 +00:07:03,370 --> 00:07:07,630 +Tất cả những gì tôi đã làm là loại bỏ một số thành phần và thay đổi một số thứ khác. + +85 +00:07:07,630 --> 00:07:13,000 +Ví dụ: nút này bị tắt để người dùng không thể nhấp vào nút đó. + +86 +00:07:13,000 --> 00:07:15,880 +Và trong phiên bản của chúng tôi, chúng tôi thực sự đã loại bỏ nó. + +87 +00:07:15,910 --> 00:07:18,850 +Chúng ta có thể làm điều đó khá dễ dàng bằng cách tìm nút đó. + +88 +00:07:18,850 --> 00:07:24,970 +Và bạn có thể thấy lý do tại sao nó không được kích hoạt là vì nó đã vô hiệu hóa lớp này. + +89 +00:07:24,970 --> 00:07:30,490 +Vì vậy, nếu chúng tôi loại bỏ điều đó, thì bạn có thể thấy nút này hiện đang hoạt động trở lại, nhưng chúng tôi thực sự không + +90 +00:07:30,490 --> 00:07:31,510 +muốn nó chút nào. + +91 +00:07:31,510 --> 00:07:34,810 +Vì vậy, hãy xóa toàn bộ mục danh sách đó. + +92 +00:07:34,810 --> 00:07:35,800 +Và bây giờ. + +93 +00:07:35,960 --> 00:07:37,880 +Chúng tôi chỉ có ba liên kết. + +94 +00:07:38,300 --> 00:07:40,160 +Liên kết trang chủ và thả xuống. + +95 +00:07:40,160 --> 00:07:43,910 +Vì vậy, hãy đổi tên các liên kết đó thành about và services. + +96 +00:07:43,910 --> 00:07:50,420 +Và một lần nữa, bởi vì đây chỉ là một thẻ neo đơn giản, bạn biết chính xác cách làm việc với nó. + +97 +00:07:50,420 --> 00:07:52,400 +Vì vậy, cái đầu tiên là liên kết. + +98 +00:07:52,400 --> 00:08:01,370 +Vì vậy, chúng tôi sẽ thay đổi điều này thành khoảng và trình đơn thả xuống thay vì đọc trình đơn thả xuống sẽ cho biết được gọi là dịch vụ. + +99 +00:08:01,370 --> 00:08:07,310 +Và bạn có thể tưởng tượng trong tương lai, chúng tôi sẽ có các dịch vụ khác nhau trong danh sách thả xuống, chẳng hạn + +100 +00:08:07,310 --> 00:08:12,440 +như di chuyển bằng xe van, di chuyển bằng xe tải, tự mình vận chuyển mọi thứ hoặc thứ gì đó khác. + +101 +00:08:12,440 --> 00:08:16,130 +Nhưng đây chỉ là một ví dụ về cách thanh điều hướng của chúng tôi có thể trông như thế nào. + +102 +00:08:16,370 --> 00:08:23,660 +Bây giờ, phần đầu tiên của thanh điều hướng là thương hiệu của thanh điều hướng và chúng ta có thể thấy điều đó ngay tại đây. + +103 +00:08:23,660 --> 00:08:27,680 +Ví dụ, chúng tôi có một thẻ neo được gọi là nhãn hiệu NAV Bar. + +104 +00:08:27,680 --> 00:08:32,120 +Nếu tôi thay đổi nó để di chuyển nó, thì điều đó sẽ thay đổi văn bản thương hiệu của chúng tôi. + +105 +00:08:32,150 --> 00:08:39,059 +Ngoài ra, chúng tôi cũng có thể có một hình ảnh ở đây để bạn chỉ cần thêm một hình ảnh, cung cấp cho nó một nguồn, có thể chúng ta hãy sử + +106 +00:08:39,059 --> 00:08:42,690 +dụng một trong những hình ảnh chúng tôi đã có trong thư mục của mình. + +107 +00:08:42,690 --> 00:08:44,810 +Ví dụ, con chó chấm JPEG. + +108 +00:08:44,820 --> 00:08:51,600 +Bây giờ, vì hình ảnh này là siêu, siêu lớn và chúng tôi chưa thực sự thay đổi kích thước của nó nên nó sẽ không thực sự hoạt động + +109 +00:08:51,600 --> 00:08:55,230 +trong thanh điều hướng, nhưng bạn luôn có thể thay đổi điều này. + +110 +00:08:55,230 --> 00:08:57,630 +Vì vậy, hãy thay đổi chiều cao thành 20 pixel. + +111 +00:08:57,630 --> 00:09:01,140 +Sau đó, bạn có thể thấy hình ảnh thương hiệu thanh điều hướng của chúng tôi hiển thị ngay tại đó. + +112 +00:09:01,170 --> 00:09:03,960 +Bây giờ trong trường hợp của chúng tôi, chúng tôi sẽ không sử dụng một hình ảnh. + +113 +00:09:03,960 --> 00:09:08,490 +Thay vào đó, tôi sẽ xóa thẻ đó và tôi sẽ sử dụng SVG. + +114 +00:09:09,120 --> 00:09:14,010 +Đây là thời điểm tốt để hiển thị cho bạn Svss có sẵn thông qua Bootstrap. + +115 +00:09:14,010 --> 00:09:20,670 +Vì vậy, nếu bạn quay lại trang chủ và nhấp vào các biểu tượng, bạn có thể thấy rằng bạn có tất cả các biểu tượng miễn + +116 +00:09:20,670 --> 00:09:25,950 +phí này để sử dụng trong bất kỳ trang web nào của mình, trả phí, kiếm tiền, bất cứ thứ gì. + +117 +00:09:25,950 --> 00:09:31,830 +Và nó thực sự rất khó, đôi khi tìm thấy các biểu tượng được thiết kế tốt mà bạn có thể dễ dàng thêm vào dự án của mình + +118 +00:09:31,830 --> 00:09:35,430 +mà không phải trả tiền bản quyền và mua nó từ một nhà thiết kế. + +119 +00:09:35,430 --> 00:09:43,170 +Vì vậy, đây cũng thực sự, thực sự gọn gàng và bạn có thể tìm kiếm qua các biểu tượng khác nhau bằng cách sử dụng bộ lọc. + +120 +00:09:43,170 --> 00:09:49,650 +Vì vậy, cái mà tôi tìm thấy thực ra là chiếc hộp này với các đường nối trên đó, đối với tôi trông rất giống một chiếc hộp + +121 +00:09:49,650 --> 00:09:51,150 +của công ty chuyển nhà. + +122 +00:09:51,150 --> 00:09:57,780 +Và bạn có thể chỉ cần sao chép SVG thẳng vào HTML của mình. + +123 +00:09:57,780 --> 00:10:00,540 +Vì vậy, nếu tôi dán nó vào đây, bạn sẽ thấy nó hiển thị ngay tại đó. + +124 +00:10:00,570 --> 00:10:07,890 +Ngoài ra, bạn cũng có thể đưa nó vào dưới dạng hình ảnh và bạn đặt nguồn thành SVG mà bạn đã lưu trong + +125 +00:10:07,890 --> 00:10:10,800 +thư mục của mình, nằm ngay tại đây. + +126 +00:10:11,310 --> 00:10:17,370 +Tôi sẽ sử dụng hình ảnh trong thư mục bằng cách đặt nó làm nguồn và tôi sẽ đặt văn bản thay + +127 +00:10:17,370 --> 00:10:25,500 +thế để di chuyển biểu tượng thương hiệu của nó, sau đó tôi sẽ thay đổi chiều cao thành, giả sử là 30 để nó lớn hơn một + +128 +00:10:25,500 --> 00:10:26,280 +chút. + +129 +00:10:26,280 --> 00:10:30,870 +Và bây giờ chúng ta có một thanh điều hướng trông giống như ví dụ. + +130 +00:10:30,990 --> 00:10:36,900 +Bây giờ ở phía bên tay phải, có một biểu mẫu ở đây và tôi biết chúng ta chưa nói nhiều về các biểu mẫu vẫn chưa + +131 +00:10:36,900 --> 00:10:37,620 +xuất hiện. + +132 +00:10:37,620 --> 00:10:43,110 +Khi chúng ta tìm hiểu thêm về cách có chức năng biểu mẫu thực tế sau này, đặc biệt là ở phần cuối, + +133 +00:10:43,110 --> 00:10:46,170 +tất cả điều này sẽ trở nên thực sự, thực sự tiện dụng. + +134 +00:10:46,170 --> 00:10:53,580 +Nhưng hiện tại, chúng tôi sẽ thay đổi thanh tìm kiếm này từ tìm kiếm thành mã đăng và kiểm tra. + +135 +00:10:53,580 --> 00:10:55,500 +Vì vậy, đó là khá dễ dàng để tìm thấy. + +136 +00:10:55,500 --> 00:11:01,350 +Bạn có thể sử dụng lệnh F để tìm những từ đó hoặc bạn cũng có thể cuộn qua mã của mình để tìm. + +137 +00:11:01,470 --> 00:11:09,540 +Hãy thay đổi nút để nói kiểm tra và hãy thay đổi trình giữ chỗ cho thanh tìm kiếm đó thành mã + +138 +00:11:09,540 --> 00:11:10,590 +bưu điện. + +139 +00:11:12,420 --> 00:11:13,500 +Chúng ta đi thôi. + +140 +00:11:13,500 --> 00:11:16,320 +Và bây giờ chúng ta đã hoàn thành thanh điều hướng của mình. + +141 +00:11:16,320 --> 00:11:21,960 +Và nếu bạn có một thiết kế, tất cả đều từ đầu và tất cả CSS được bao gồm và bạn có thể thấy thực + +142 +00:11:21,990 --> 00:11:27,990 +tế có bao nhiêu CSS, nếu bạn nhấp vào một trong những mục này, bạn có thể thấy liên kết điều hướng + +143 +00:11:27,990 --> 00:11:35,220 +mà tôi vừa nhấp vào bật có tất cả phần đệm được xác định, có tất cả phần này được xác định, có kiểu dáng chuyển đổi. + +144 +00:11:35,220 --> 00:11:37,980 +Và đó chỉ là một phần của toàn bộ thanh điều hướng này. + +145 +00:11:37,980 --> 00:11:44,340 +Vì vậy, bạn có thể thấy chúng tôi tiết kiệm được bao nhiêu thời gian và chúng tôi có thể tận dụng một thiết kế + +146 +00:11:44,340 --> 00:11:48,270 +chuyên nghiệp và tạo ra thứ gì đó trông thực sự hiện đại và đẹp mắt. + +147 +00:11:48,420 --> 00:11:50,580 +Bây giờ chúng ta hãy chuyển sang phần tiếp theo. + +148 +00:11:50,580 --> 00:11:54,030 +Và toàn bộ phần này được tạo thành từ các thành phần khác nhau. + +149 +00:11:54,030 --> 00:11:59,160 +Vì vậy, có thể là một tiêu đề H1, một đoạn văn, hai nút và một hình ảnh. + +150 +00:11:59,160 --> 00:12:04,710 +Nhưng nếu chúng ta chỉ muốn lấy bố cục này, tôi thực sự đã lấy nó từ các ví dụ. + +151 +00:12:04,740 --> 00:12:11,130 +Khu vực ví dụ thực sự, thực sự tốt để lấy các bit và bob của các đoạn mã khác nhau, các + +152 +00:12:11,130 --> 00:12:17,400 +thành phần khác nhau mà chúng đã tạo kiểu và tạo cho bạn, rồi chỉ cần đưa nó vào trang + +153 +00:12:17,430 --> 00:12:19,770 +web của bạn ở nơi phù hợp. + +154 +00:12:19,770 --> 00:12:21,780 +Vì vậy, đây là một anh hùng. + +155 +00:12:21,780 --> 00:12:24,240 +Và như bạn có thể thấy, nó là cái này. + +156 +00:12:24,240 --> 00:12:31,560 +Nó gần giống hệt như văn bản tiêu đề, hai nút và một hình ảnh, và mọi thứ đều được tạo kiểu đẹp + +157 +00:12:31,560 --> 00:12:33,810 +mắt cho bạn để sử dụng nó. + +158 +00:12:33,810 --> 00:12:35,730 +Tất cả những gì chúng ta cần làm là nhấp chuột phải. + +159 +00:12:36,130 --> 00:12:37,360 +Kiểm tra. + +160 +00:12:37,870 --> 00:12:41,560 +Và bây giờ chúng tôi muốn mở rộng khu vực các yếu tố của chúng tôi. + +161 +00:12:41,570 --> 00:12:49,660 +Và những gì tôi có xu hướng làm chỉ là di chuột lên trên cho đến khi phần tô sáng thực sự làm nổi bật khu + +162 +00:12:49,660 --> 00:12:52,900 +vực mà tôi muốn, đó là div ngay tại đây. + +163 +00:12:53,050 --> 00:13:00,010 +Hãy tiếp tục và sao chép div này và đặt nó vào mã của chúng ta ngay bên dưới thanh điều hướng của chúng ta. + +164 +00:13:00,430 --> 00:13:07,040 +Bây giờ khi tôi đã hoàn thành việc đó, bạn có thể thấy chúng tôi có hình ảnh và nút văn bản ảnh chụp màn hình ở giữa. + +165 +00:13:07,060 --> 00:13:11,530 +Trước tiên, hãy sửa hình ảnh đó để chúng ta có thể xem mọi thứ trông như thế nào. + +166 +00:13:11,530 --> 00:13:15,040 +Và nguồn của họ là từ tài liệu bootstrap. + +167 +00:13:15,040 --> 00:13:22,900 +Nhưng thay vào đó, chúng tôi muốn sử dụng một trong những chiếc xe tải đang di chuyển để chúng tôi có thể cho người dùng thấy tất cả các dịch + +168 +00:13:22,900 --> 00:13:24,190 +vụ của chúng tôi là gì. + +169 +00:13:24,370 --> 00:13:28,330 +Và bây giờ tất cả những gì chúng ta phải làm chỉ là thay thế văn bản. + +170 +00:13:28,360 --> 00:13:36,260 +Nếu bạn nhìn vào bên trong thư mục tệp bắt đầu, sẽ có một tệp có tên là Văn bản trang web và tại đây bạn chỉ cần sao + +171 +00:13:36,260 --> 00:13:41,180 +chép tất cả văn bản trang web và thay thế các phần có liên quan. + +172 +00:13:41,720 --> 00:13:49,310 +H1 sẽ nói rằng hãy di chuyển với niềm vui và sau đó chúng tôi có một đoạn văn bản dài mà chúng tôi sẽ thay thế bằng đoạn + +173 +00:13:49,310 --> 00:13:50,660 +văn của chúng tôi. + +174 +00:13:50,660 --> 00:13:56,060 +Vì vậy, hãy sao chép mọi thứ trong phần tử đoạn văn đó và thay thế nó. + +175 +00:13:56,060 --> 00:14:00,770 +Và sau đó các nút của chúng tôi sẽ nói, nhận báo giá và liên hệ với chúng tôi. + +176 +00:14:04,350 --> 00:14:08,940 +Và bây giờ chúng ta có một phần anh hùng được thực hiện trong hai giây. + +177 +00:14:09,150 --> 00:14:13,740 +Được rồi, có thể nó lâu hơn một chút, nhưng bạn có thể thấy điều này mạnh mẽ như thế nào. + +178 +00:14:13,890 --> 00:14:15,450 +Vì vậy, bây giờ chúng ta hãy tiếp tục đi. + +179 +00:14:15,450 --> 00:14:20,880 +Trong phần tiếp theo của trang web mẫu của chúng tôi, chúng tôi có một số tính năng và đây là nơi bạn thường cho mọi + +180 +00:14:20,880 --> 00:14:24,270 +người biết điều gì đặc biệt về công ty khởi nghiệp cụ thể của bạn? + +181 +00:14:24,270 --> 00:14:26,580 +Chà, khởi nghiệp của chúng tôi thực sự chuyên nghiệp. + +182 +00:14:26,580 --> 00:14:30,240 +Chúng tôi có sẵn trên toàn quốc và chúng tôi có một liên lạc cá nhân. + +183 +00:14:30,240 --> 00:14:35,220 +Và bạn có thể đoán điều này đến từ trang Ví dụ về Bootstrap. + +184 +00:14:35,220 --> 00:14:41,460 +Họ có một phần gọi là Tính năng và tính năng đầu tiên này hoàn hảo cho nhu cầu của chúng tôi. + +185 +00:14:41,460 --> 00:14:47,070 +Và tôi nghĩ rằng rất nhiều kiểu thiết kế bootstrap đến từ Apple bởi vì khi bạn nhìn vào + +186 +00:14:47,100 --> 00:14:54,450 +trang web của Apple, rất nhiều nút, bóng đổ, loại phông chữ, tất cả chúng trông thực sự rất giống với các thành phần + +187 +00:14:54,450 --> 00:14:55,590 +bootstrap. + +188 +00:14:55,590 --> 00:15:02,940 +Và tôi nghĩ đây có lẽ là một trong những nguồn cảm hứng thiết kế của họ và chúng ta có thể có được điều đó đơn giản với một + +189 +00:15:02,940 --> 00:15:06,100 +số thao tác sao chép và dán và một chút tùy chỉnh. + +190 +00:15:06,310 --> 00:15:12,940 +Một lần nữa, hãy đi vào phần các tính năng mà chúng ta muốn và sau đó chúng ta sẽ tiếp tục di chuột lên + +191 +00:15:12,940 --> 00:15:20,320 +trên cho đến khi tìm thấy div chứa tất cả những thứ chúng ta muốn, nhấp chuột phải, sao chép, sao chép phần tử + +192 +00:15:20,320 --> 00:15:24,220 +và chúng ta sẽ thực hiện để đặt nó bên dưới phần trước. + +193 +00:15:24,430 --> 00:15:26,860 +Bây giờ chúng ta hãy nhìn vào công việc tốt của chúng tôi. + +194 +00:15:26,860 --> 00:15:30,580 +Chúng tôi có các cột có biểu tượng và chúng tôi có ba tính năng. + +195 +00:15:31,420 --> 00:15:34,420 +Hãy thay đổi văn bản của tất cả điều này. + +196 +00:15:34,420 --> 00:15:39,490 +Đầu tiên, tôi sẽ tua nhanh qua phần này để bạn không phải xem tôi sao chép và dán. + +197 +00:15:45,010 --> 00:15:46,240 +Và bạn có nó rồi đấy! + +198 +00:15:46,270 --> 00:15:53,500 +Bây giờ chúng tôi đã thay thế tất cả văn bản và chúng tôi sẽ có tất cả bản sao của mình, đó là văn bản cho trang + +199 +00:15:53,500 --> 00:15:57,190 +web của bạn được chèn vào các phần có liên quan. + +200 +00:15:57,310 --> 00:16:04,000 +Bây giờ, một điều mà bạn sẽ nhận thấy rất rõ ràng là phần này trông không giống phần này. + +201 +00:16:04,000 --> 00:16:07,030 +Và nó cũng không giống như phần mà chúng tôi đã sao chép mã từ đó. + +202 +00:16:07,030 --> 00:16:09,120 +Chuyện gì đang xảy ra ở đây vậy? + +203 +00:16:09,130 --> 00:16:15,900 +Chà, như tôi đã đề cập, hầu hết các thành phần và kiểu dáng bootstrap đều đến từ các lớp bootstrap. + +204 +00:16:15,910 --> 00:16:19,780 +Ví dụ, cái này trông như thế này bởi vì nó có một lớp liên kết biểu tượng. + +205 +00:16:19,780 --> 00:16:27,550 +Nhưng đôi khi, đôi khi chúng tôi có thể muốn tùy chỉnh kiểu dáng mà chúng tôi nhận được để chúng tôi có một số tính năng thiết + +206 +00:16:27,550 --> 00:16:31,660 +kế của riêng mình dựa trên những gì Bootstrap đã giải quyết. + +207 +00:16:31,660 --> 00:16:40,150 +Nếu chúng tôi nhấp chuột phải vào các hình vuông được tạo kiểu này từ trang web mẫu và nếu bạn cuộn lên để tìm div + +208 +00:16:40,150 --> 00:16:48,010 +nơi nó làm nổi bật toàn bộ hình vuông, bạn có thể thấy rằng div này thực sự có một số kiểu dáng tùy chỉnh. + +209 +00:16:48,020 --> 00:16:53,570 +Bây giờ, lý do tại sao chúng ta biết nó là tùy chỉnh là vì tất cả các lớp bootstrap mặc + +210 +00:16:53,570 --> 00:17:00,560 +định đều đến từ thứ gì đó như các tiện ích chấm CSS, chẳng hạn như độ dốc nền, chẳng hạn như lề, căn chỉnh, + +211 +00:17:00,560 --> 00:17:01,340 +v.v. + +212 +00:17:01,340 --> 00:17:08,420 +Nhưng các phần đến từ CSS tùy chỉnh cho trang này sẽ có một tệp giống như thế này. + +213 +00:17:08,420 --> 00:17:15,859 +Vì vậy, đối với trang tính năng này, họ đã tạo một số CSS tùy chỉnh và trong tệp CSS tùy chỉnh đó, + +214 +00:17:15,869 --> 00:17:23,270 +họ có một ít CSS chỉ để làm cho mọi thứ trông tùy chỉnh hơn một chút thay vì đến từ bootstrap. + +215 +00:17:23,510 --> 00:17:28,850 +Vì vậy, phần mà chúng tôi đang thiếu, như bạn có thể thấy, là một thứ được gọi là biểu tượng tính năng. + +216 +00:17:28,850 --> 00:17:37,670 +Vì vậy, nếu chúng tôi sao chép tất cả CSS này và đặt nó vào CSS của chúng tôi ở đây giữa các thẻ kiểu, sau đó chúng tôi xem trang web của mình, + +217 +00:17:37,670 --> 00:17:43,040 +chúng tôi có thể thấy các ô vuông đó được tạo kiểu theo cách chúng tôi muốn. + +218 +00:17:43,220 --> 00:17:51,530 +Bây giờ, điều chúng ta sẽ phải làm là xóa SVG trong các ví dụ và thay thế nó bằng các svgs của chính chúng ta + +219 +00:17:51,590 --> 00:17:53,680 +mà chúng ta đã tải xuống. + +220 +00:17:53,690 --> 00:17:57,560 +Vì vậy, hãy tiếp tục và tìm cái đầu tiên ở đây. + +221 +00:17:57,830 --> 00:18:04,820 +Hãy tiếp tục và xóa cái này và chỉ cần thêm một hình ảnh với nguồn được đặt làm hình đầu tiên, đó là chiếc + +222 +00:18:04,820 --> 00:18:09,850 +cặp, bởi vì chúng tôi đang nói rằng chúng tôi chuyên nghiệp như thế nào. + +223 +00:18:09,860 --> 00:18:20,630 +Vì vậy, hãy thay đổi văn bản thay thế và SVG thứ hai sẽ thay thế bằng hình ảnh phía trước xe buýt. + +224 +00:18:20,630 --> 00:18:25,340 +Và điều này là do chúng tôi đang nói rằng các dịch vụ của chúng tôi có sẵn trên toàn quốc. + +225 +00:18:25,580 --> 00:18:33,710 +Và đối với biểu tượng tính năng cuối cùng, chúng ta sẽ thay đổi nó thành hình vuông trò chuyện. + +226 +00:18:33,740 --> 00:18:41,840 +Khó có thể nói công ty của chúng ta có bao nhiêu dấu ấn cá nhân, và bây giờ chúng ta nên thiết lập tất cả các + +227 +00:18:41,840 --> 00:18:44,840 +biểu tượng, nhưng chúng hơi nhỏ. + +228 +00:18:44,990 --> 00:18:51,950 +Vì vậy, để làm cho nó có kích thước phù hợp, chúng ta sẽ làm điều tương tự mà chúng ta đã làm với biểu tượng trên đó. + +229 +00:18:51,950 --> 00:18:54,230 +Chúng tôi sẽ cung cấp cho nó một chiều cao khác nhau. + +230 +00:18:54,350 --> 00:19:05,150 +Vì vậy, hãy tiếp tục và thêm chiều cao 30 cho mỗi svgs này và bây giờ tất cả chúng đều có kích thước chính xác. + +231 +00:19:05,150 --> 00:19:10,400 +Và trong khi bạn đang thực hiện sao chép và dán, bạn có thể nhận thấy có một SVG khác ở đây, đó + +232 +00:19:10,400 --> 00:19:11,960 +là Chevron, phải không? + +233 +00:19:11,960 --> 00:19:15,170 +Đó là nút chuyển tiếp nhỏ này ở đây. + +234 +00:19:15,170 --> 00:19:21,830 +Chúng ta cũng có thể thay thế bằng hình ảnh của mình, đó là Chevron, phải không? + +235 +00:19:21,830 --> 00:19:29,900 +Và chúng tôi sẽ cung cấp cho nó một văn bản thay thế, đồng thời sao chép và dán văn bản này vào cả ba vị trí mà chúng tồn tại. + +236 +00:19:31,760 --> 00:19:40,970 +Bây giờ, lý do tại sao các svgs mà chúng tôi đã sao chép từ phần tính năng không hoạt động trên trang web của chúng tôi là vì các svgs + +237 +00:19:40,970 --> 00:19:44,450 +có thể được cài đặt theo nhiều cách khác nhau. + +238 +00:19:44,450 --> 00:19:52,640 +Chúng tôi có thể tải xuống giống như tôi đã làm và đặt chúng vào thư mục dự án và bạn có thể truy cập nó thông qua phần + +239 +00:19:52,640 --> 00:19:55,430 +tử SVG hoặc thông qua phần tử hình ảnh. + +240 +00:19:55,760 --> 00:20:01,460 +Ngoài ra, bạn có thể chỉ cần sao chép toàn bộ mã HTML để có giao diện rõ ràng. + +241 +00:20:01,460 --> 00:20:07,520 +Tôi chỉ cần tải từng Svgs vào thư mục tài nguyên của chúng tôi và thêm chúng dưới dạng hình ảnh. + +242 +00:20:07,520 --> 00:20:10,610 +Nó thực sự là tùy thuộc vào bạn như thế nào bạn muốn làm điều đó. + +243 +00:20:10,910 --> 00:20:16,880 +Bây giờ bạn đã biết một chút về cách chúng ta có thể sử dụng các đoạn mã khác nhau từ các thành + +244 +00:20:16,880 --> 00:20:21,830 +phần bootstrap hoặc từ các ví dụ bootstrap, tôi có một bài tập cho bạn. + +245 +00:20:21,950 --> 00:20:29,420 +Chúng tôi biết rằng phần tiếp theo sau các tính năng là băng chuyền của chúng tôi và nó chỉ đơn giản là một thành phần cho phép + +246 +00:20:29,420 --> 00:20:31,670 +bạn cuộn qua các trang khác nhau. + +247 +00:20:31,680 --> 00:20:37,980 +Bây giờ trang mà tôi đã chọn ở đây có một chỉ báo ở dưới cùng, vì vậy bạn có thể dễ dàng chuyển sang bất kỳ trang + +248 +00:20:37,980 --> 00:20:38,850 +nào bạn muốn. + +249 +00:20:38,880 --> 00:20:45,330 +Nó có các nút bên ở đây để bạn có thể sang trái và phải và tất cả những gì nó có chỉ là ba hình ảnh lớn, + +250 +00:20:45,330 --> 00:20:49,440 +nhưng hãy lưu ý rằng các hình ảnh không đi hết các cạnh. + +251 +00:20:49,440 --> 00:20:53,490 +Thay vào đó, chúng được căn chỉnh với phần còn lại của nội dung. + +252 +00:20:53,490 --> 00:20:55,620 +Vì vậy, hãy suy nghĩ về những gì bạn đã học trước đây. + +253 +00:20:55,650 --> 00:20:59,310 +Hãy đọc tài liệu băng chuyền. + +254 +00:20:59,310 --> 00:21:06,560 +Tìm ví dụ mà bạn cho là giống với kết quả nhất và xem liệu bạn có thể hoàn thành thử thách này không. + +255 +00:21:06,570 --> 00:21:07,740 +Tạm dừng video ngay bây giờ. + +256 +00:21:08,960 --> 00:21:09,440 +Được rồi. + +257 +00:21:09,440 --> 00:21:15,440 +Nếu bạn đã hoàn thành thành công thử thách này, thì giờ đây chúng ta có một phần khác ở đây, đó là băng chuyền bootstrap, + +258 +00:21:15,440 --> 00:21:21,140 +thực sự gọn gàng khi bạn muốn hiển thị một số hình ảnh thư viện hoặc có thể bạn có một số lời chứng thực mà bạn + +259 +00:21:21,140 --> 00:21:26,060 +muốn người dùng có thể lướt qua và có thể bạn muốn hiển thị tất cả các thành viên trong nhóm của + +260 +00:21:26,060 --> 00:21:26,990 +mình. + +261 +00:21:26,990 --> 00:21:33,530 +Và nếu bạn nhìn vào bên trong ví dụ về băng chuyền ở đây, bạn có thể thấy có một ví dụ với văn bản khác, nhưng + +262 +00:21:33,530 --> 00:21:37,070 +ví dụ mà tôi sử dụng thậm chí còn đơn giản hơn thế. + +263 +00:21:37,070 --> 00:21:39,770 +Nó nằm trong tài liệu bên trong các thành phần. + +264 +00:21:39,770 --> 00:21:45,470 +Vì vậy, quay trở lại các thành phần bây giờ, chúng ta có thể xem cách băng chuyền hoạt động nếu bạn + +265 +00:21:45,470 --> 00:21:46,070 +muốn đọc. + +266 +00:21:46,070 --> 00:21:53,540 +Nhưng tôi đã chọn một trong những ví dụ cơ bản có chỉ báo nơi bạn có thể chuyển sang các trang khác nhau và chúng tôi + +267 +00:21:53,540 --> 00:21:57,650 +chỉ đơn giản là có một hình ảnh lớn bao phủ toàn bộ băng chuyền. + +268 +00:21:57,650 --> 00:22:03,050 +Hãy sao chép mã này và dán nó vào trang web của chúng tôi. + +269 +00:22:03,410 --> 00:22:06,860 +Bây giờ khi bạn dán nó, bạn sẽ không thấy bất cứ điều gì xảy ra cả. + +270 +00:22:06,860 --> 00:22:12,930 +Và nguyên nhân là do không có hình ảnh, hình ảnh bị vỡ và đó là do hình ảnh không + +271 +00:22:12,930 --> 00:22:15,180 +có nguồn được đặt mặc định. + +272 +00:22:15,180 --> 00:22:18,420 +Vì vậy, hãy tiếp tục và đặt nguồn hình ảnh băng chuyền của chúng tôi. + +273 +00:22:18,420 --> 00:22:24,030 +Vì vậy, cái đầu tiên chúng ta sẽ đặt cho cặp đôi và. + +274 +00:22:25,950 --> 00:22:30,630 +Cái thứ hai chúng ta sẽ đặt là con chó. + +275 +00:22:32,820 --> 00:22:39,750 +Đây gần giống như một quá trình phát triển của một gia đình đi từ một cặp vợ chồng thành một con chó thành một gia đình. + +276 +00:22:39,750 --> 00:22:43,920 +Và cuối cùng, chúng tôi đã thiết lập tất cả các bức ảnh của mình. + +277 +00:22:43,920 --> 00:22:50,760 +Và bây giờ nếu chúng ta nhìn, bạn có thể thấy băng chuyền của chúng ta đang hiển thị và nó đang hoạt động, + +278 +00:22:50,760 --> 00:22:52,850 +nhưng nó có thể hơi quá lớn. + +279 +00:22:52,860 --> 00:22:56,670 +Đó là loại chiếm nhiều hơn chiều cao của trang web. + +280 +00:22:56,670 --> 00:22:59,880 +Và đó là bởi vì điều này được đặt để bao phủ toàn bộ chiều rộng. + +281 +00:23:00,030 --> 00:23:08,190 +Nếu bạn còn nhớ từ các bài học trước, một trong những thành phần tốt nhất để định kích thước mọi thứ đồng đều + +282 +00:23:08,190 --> 00:23:12,210 +là từ phần bố cục và đó là vùng chứa của chúng ta. + +283 +00:23:12,210 --> 00:23:17,460 +Chúng tôi biết rằng chúng tôi sẽ có giao diện thống nhất nếu chúng tôi đặt mọi thứ bên trong div vùng chứa. + +284 +00:23:17,490 --> 00:23:19,590 +Vì vậy, đó chính xác là những gì chúng ta sẽ làm. + +285 +00:23:19,590 --> 00:23:29,370 +Tôi sẽ tạo một div và tôi sẽ đặt nó vào loại vùng chứa và tôi sẽ di chuyển div đóng cuối + +286 +00:23:29,370 --> 00:23:33,250 +cùng ngay bên dưới băng chuyền. + +287 +00:23:33,520 --> 00:23:41,140 +Và bây giờ, khi chúng tôi quay lại, bạn có thể thấy băng chuyền của chúng tôi được đặt gọn gàng bên trong hộp chứa và bạn có + +288 +00:23:41,140 --> 00:23:49,120 +thể thấy rằng bất kể tôi thay đổi kích thước nào, chúng tôi luôn có giao diện nhất quán với khả năng phản hồi của hộp chứa đó. + +289 +00:23:49,630 --> 00:23:55,060 +Bây giờ chúng ta đã sẵn sàng cho phần cuối cùng của trang web, đây chỉ là phần cuối trang. + +290 +00:23:55,060 --> 00:23:58,930 +Và tôi đã không thực hiện nhiều công việc trên chân trang. + +291 +00:23:58,930 --> 00:24:06,370 +Tôi chỉ đơn giản là đi vào các đoạn trích, tìm phần chân trang, chọn một phần mà tôi + +292 +00:24:06,370 --> 00:24:14,620 +thích rồi nhấn kiểm tra để tìm điểm bắt đầu của phần chân trang và dán mã đó vào đúng vị trí. + +293 +00:24:14,890 --> 00:24:19,600 +Tôi sẽ không sửa đổi điều này quá nhiều vì bạn đã biết cách bạn có thể làm điều đó, + +294 +00:24:19,600 --> 00:24:27,580 +nhưng hãy xem việc tạo trang web tuyệt đẹp này chỉ trong vài phút bằng cách sử dụng các thành phần bootstrap dễ dàng như thế nào. + +295 +00:24:28,000 --> 00:24:33,910 +Các thành phần thực sự, thực sự tiện dụng, cũng như các đoạn trích và mã ví dụ vì chúng cho phép + +296 +00:24:33,910 --> 00:24:40,030 +bạn chọn một kiểu trong bảng màu mà bạn thích và chỉ cần thêm kiểu đó vào trang web của bạn. + +297 +00:24:40,030 --> 00:24:46,570 +Và điều này làm cho việc xây dựng các thiết kế được cân nhắc kỹ lưỡng rất, rất nhanh chóng trở nên cực kỳ dễ dàng. + +298 +00:24:46,870 --> 00:24:53,110 +Ngoài các lớp bố cục, Bootstrap đó cung cấp cho bạn các lớp thành phần, còn có các lớp tiện + +299 +00:24:53,110 --> 00:24:54,970 +ích và trình trợ giúp. + +300 +00:24:54,970 --> 00:24:59,470 +Và một khía cạnh thực sự quan trọng của điều này là khoảng cách. + +301 +00:24:59,590 --> 00:25:04,180 +Rất thường xuyên khi chúng tôi thiết kế trang web, chúng tôi muốn thêm lề, chúng tôi muốn thêm phần đệm. + +302 +00:25:04,180 --> 00:25:06,220 +Và đây là tất cả khoảng cách, phải không? + +303 +00:25:06,370 --> 00:25:15,160 +Như bạn có thể nhớ từ các bài học trước, phần đệm thiết lập phần giữa mục và div chứa. + +304 +00:25:15,160 --> 00:25:25,660 +Vì vậy, phần này và lề thiết lập khoảng cách giữa đường viền của mặt hàng của bạn và bất kỳ thành phần nào khác. + +305 +00:25:25,810 --> 00:25:30,610 +Vì vậy, bạn có thể đặt tất cả các giá trị đó bằng cách sử dụng ký hiệu bootstrap rất đơn giản. + +306 +00:25:30,610 --> 00:25:32,590 +Vì vậy, hãy chạy qua điều này một cách nhanh chóng. + +307 +00:25:32,590 --> 00:25:40,120 +Đó là định dạng mà bạn có thuộc tính, các cạnh bạn muốn, dấu gạch ngang và sau đó là kích thước. + +308 +00:25:40,120 --> 00:25:42,580 +Và điều này thực sự dễ dàng để tìm ra. + +309 +00:25:42,580 --> 00:25:50,110 +Vì vậy, ví dụ: nếu tôi chỉ muốn đặt lề ở đầu phần tử của mình, thì tôi có thể nói m T So. + +310 +00:25:50,140 --> 00:25:52,150 +M Đối với các lớp đặt lề. + +311 +00:25:52,180 --> 00:25:59,040 +T đặt lề trên hoặc đệm trên và sau đó sử dụng dấu gạch ngang, tôi có thể nói tôi muốn có bao nhiêu lề. + +312 +00:25:59,050 --> 00:26:05,560 +Vì vậy, số không là loại bỏ biên độ và sau đó chúng ta có thể thêm một chút nữa, một chút nữa, một chút + +313 +00:26:05,560 --> 00:26:06,070 +nữa. + +314 +00:26:06,070 --> 00:26:11,080 +Vì vậy, nếu tôi có năm lợi nhuận hàng đầu, thì đó thường là mức tối đa mà bạn cần. + +315 +00:26:11,230 --> 00:26:15,580 +Và sau đó là khái niệm về X và Y. + +316 +00:26:15,610 --> 00:26:22,540 +Vì vậy, nếu bạn muốn đặt lề cho cả phần trên và phần dưới, bạn sẽ sử dụng trục x. + +317 +00:26:22,540 --> 00:26:28,900 +Và nếu bạn muốn đặt lề hoặc phần đệm cho bên trái và bên phải, thì bạn có thể sử dụng trục y đó. + +318 +00:26:28,900 --> 00:26:32,740 +Vì vậy, có thể bạn sẽ có MY-3. + +319 +00:26:32,890 --> 00:26:40,090 +Nó trông giống như ba của tôi, nhưng nó thực sự nói đặt lề cho trục y thành kích thước ba. + +320 +00:26:40,090 --> 00:26:45,940 +Nó tương đối dễ dàng khi bạn hiểu nó, nhưng khi bạn chỉ nhìn thấy nó trong mã, nó có thể thực sự + +321 +00:26:45,940 --> 00:26:46,870 +rất khó hiểu. + +322 +00:26:46,870 --> 00:26:55,600 +Nhưng bây giờ bạn sẽ có thể thấy rằng ở cuối trang của chúng tôi, chúng tôi đã có MB-2 và điều đó tất nhiên + +323 +00:26:55,600 --> 00:26:59,620 +là viết tắt của việc thêm lề vào dưới cùng. + +324 +00:27:00,670 --> 00:27:03,790 +Và đó là một kích thước của hai. + +325 +00:27:04,090 --> 00:27:06,220 +Đó là cách chúng ta có thể giải mã tất cả những điều này. + +326 +00:27:07,210 --> 00:27:14,560 +Bây giờ, thủ thuật nhỏ gọn cuối cùng mà tôi muốn chỉ cho bạn trong bài học này là cách bạn có thể thêm chế độ tối vào + +327 +00:27:14,590 --> 00:27:21,970 +trang web của mình, lật ngược màu sắc xung quanh bằng cách chỉ cần thêm một thuộc tính vào thẻ HTML của bạn. + +328 +00:27:22,120 --> 00:27:28,150 +Nếu bạn vào phần tùy chỉnh, vào chế độ màu, bạn sẽ thấy Bootstrap hiện hỗ trợ + +329 +00:27:28,150 --> 00:27:31,210 +chế độ tối và nó có thể lật toàn bộ. + +330 +00:27:31,230 --> 00:27:38,610 +Chủ đề của dự án thành màu đối lập chỉ bằng cách đặt chủ đề khởi động dữ liệu thành màu tối. + +331 +00:27:38,910 --> 00:27:41,520 +Hãy thử điều đó trên trang web của chúng tôi. + +332 +00:27:41,820 --> 00:27:46,440 +Hãy chuyển sang phần HTML của chúng ta sau khi ngôn ngữ được thiết lập. + +333 +00:27:46,470 --> 00:27:53,880 +Hãy thay đổi chủ đề thành Tối và bạn có thể thấy toàn bộ trang web của chúng tôi hiện đã được định dạng lại thành + +334 +00:27:53,880 --> 00:27:56,100 +chủ đề tối, cực kỳ gọn gàng. + +335 +00:27:56,100 --> 00:28:01,560 +Nếu đây là thiết kế mà bạn muốn hoặc nếu sau này khi chúng ta tìm hiểu về JavaScript và chúng ta có + +336 +00:28:01,560 --> 00:28:08,670 +thể đặt các nút để thay đổi chủ đề của trang web của mình thành bất kỳ chủ đề nào người dùng thích để người dùng có thể thay đổi + +337 +00:28:08,670 --> 00:28:11,190 +chủ đề đó thành bất kỳ chủ đề nào họ thích. + +338 +00:28:11,670 --> 00:28:18,660 +Vì vậy, bây giờ bạn đang bắt đầu thấy bootstrap mạnh mẽ như thế nào khi sử dụng các ví dụ này, sử dụng các đoạn + +339 +00:28:18,660 --> 00:28:23,730 +trích, sử dụng các thành phần và kiểu dáng dựng sẵn cũng như hệ thống bố cục. + +340 +00:28:23,910 --> 00:28:29,280 +Nhưng nếu bạn đã cố gắng xây dựng các trang web trước đây, thì có lẽ bạn đã bắt gặp các chủ đề toàn trang hoàn toàn + +341 +00:28:29,280 --> 00:28:30,410 +được tạo sẵn cho bạn. + +342 +00:28:30,420 --> 00:28:33,120 +Ví dụ, với Squarespace. + +343 +00:28:33,150 --> 00:28:39,000 +Tuy nhiên, điều hấp dẫn là bạn sẽ phải trả khoảng £12 một tháng hoặc $10 một + +344 +00:28:39,000 --> 00:28:45,390 +tháng để có thể sử dụng các mẫu này của họ và đưa trang web của bạn lên Internet. + +345 +00:28:45,510 --> 00:28:51,390 +Điều tôi muốn cho bạn thấy là với Bootstrap, có rất nhiều chủ đề miễn phí và trả phí cho các chủ đề mà bạn có + +346 +00:28:51,390 --> 00:28:57,210 +thể sử dụng, đây là một khoản chi phí duy nhất để bạn xây dựng các trang web đẹp mắt và chỉ cần tùy chỉnh các + +347 +00:28:57,210 --> 00:28:57,790 +chủ đề. + +348 +00:28:57,810 --> 00:29:04,860 +Bây giờ bạn đã biết tất cả về bootstrap, một mẫu tiện dụng là từ các trường W3 và họ có một số bố + +349 +00:29:04,860 --> 00:29:07,890 +cục trang web phổ biến nhất như blog. + +350 +00:29:07,890 --> 00:29:13,620 +Bạn có thể có thanh bên chính, chân trang hoặc danh mục đầu tư có thể trông như thế nào hoặc trang web có thể trông như + +351 +00:29:13,620 --> 00:29:14,160 +thế nào. + +352 +00:29:14,190 --> 00:29:15,090 +Một trang web xã hội. + +353 +00:29:15,090 --> 00:29:15,570 +Vân vân. + +354 +00:29:15,570 --> 00:29:16,200 +Vân vân. + +355 +00:29:16,200 --> 00:29:23,400 +Và họ đã xây dựng những ví dụ đơn giản này để bạn có thể chỉ cần lấy mã và tùy chỉnh để bạn + +356 +00:29:23,400 --> 00:29:25,500 +sử dụng các ví dụ của họ. + +357 +00:29:25,500 --> 00:29:31,530 +Bạn có thể chỉ cần làm, như chúng tôi đã làm, tìm một mẫu mà bạn muốn sao chép, sau đó tùy chỉnh nó + +358 +00:29:31,530 --> 00:29:36,390 +và có thể thêm một số CSS tùy chỉnh khác để đạt được giao diện mà bạn muốn. + +359 +00:29:36,510 --> 00:29:43,170 +Nếu bạn nghĩ rằng những thứ này hơi cơ bản một chút bởi vì chúng là như vậy, thì ý tưởng là chúng chủ yếu dành cho + +360 +00:29:43,170 --> 00:29:47,940 +bố cục, hoàn thành cấu trúc lớn bằng cách sử dụng hệ thống bố cục bootstrap. + +361 +00:29:48,090 --> 00:29:54,330 +Có rất nhiều chủ đề bootstrap đẹp khác hoàn thiện hơn theo một cách nào đó, bắt đầu với chính các + +362 +00:29:54,330 --> 00:29:56,590 +chủ đề bootstrap chính thức. + +363 +00:29:56,610 --> 00:30:00,000 +Nếu chúng tôi quay lại trang web bootstrap chính, hãy nhấp vào chủ đề. + +364 +00:30:00,000 --> 00:30:06,360 +Bạn có thể thấy rằng họ có những trang web được thiết kế chuyên nghiệp này và nhiều trong số chúng trông hoàn + +365 +00:30:06,360 --> 00:30:07,500 +toàn lạ thường. + +366 +00:30:07,500 --> 00:30:13,890 +Vì vậy, tùy thuộc vào những gì bạn đang cố gắng xây dựng, bạn có thể sử dụng một trong các mẫu này. + +367 +00:30:13,890 --> 00:30:20,400 +Nhưng nhược điểm duy nhất của điều này là trên thực tế tất cả chúng đều được trả tiền vì có rất nhiều công việc đã được thực + +368 +00:30:20,400 --> 00:30:21,600 +hiện, phải không? + +369 +00:30:21,750 --> 00:30:23,760 +Nhưng đây chủ yếu là một chi phí. + +370 +00:30:23,760 --> 00:30:30,450 +Và nếu bạn không muốn trả tiền để có được một chủ đề, bạn luôn có thể tìm kiếm các mẫu bootstrap miễn phí trên + +371 +00:30:30,480 --> 00:30:36,540 +Google và bạn sẽ tìm thấy toàn bộ các trang web có các trang web bootstrap miễn phí và trả phí. + +372 +00:30:36,540 --> 00:30:40,590 +Và một lần nữa, bạn có thể làm điều tương tự như chúng ta đã làm cho đến giờ trong bài học này. + +373 +00:30:40,590 --> 00:30:46,200 +Chỉ cần nắm giữ các thành phần bạn muốn, tùy chỉnh nó và nhận được thiết kế mà bạn đang tìm + +374 +00:30:46,200 --> 00:30:46,710 +kiếm. + +375 +00:30:47,520 --> 00:30:53,850 +Vì vậy, hy vọng trong bài học này bạn đã thấy rằng bootstrap có thể cực kỳ dễ dàng để tạo các thành phần và tính + +376 +00:30:53,850 --> 00:31:00,210 +năng trong trang web của chúng ta một cách rất nhanh chóng và nó có thiết kế đẹp mắt và nhất quán để khởi động. + +377 +00:31:00,850 --> 00:31:06,360 +Và nếu bạn đã thực sự sử dụng bootstrap và thiết kế web, bạn thậm chí có thể tạo và bán các chủ đề của riêng mình. + +378 +00:31:06,370 --> 00:31:12,430 +Nếu bạn thực sự thích làm việc với bootstrap và thiết kế trang web cũng như tạo trang web bằng cách + +379 +00:31:12,430 --> 00:31:19,540 +sử dụng các thành phần bootstrap, bạn có thể tự tạo mẫu và đưa chúng lên thị trường và bán chúng như một nguồn thu + +380 +00:31:19,540 --> 00:31:21,040 +nhập tiềm năng. + +381 +00:31:21,040 --> 00:31:25,600 +Vì vậy, hãy chơi xung quanh với các thành phần khác, xem những chủ đề bootstrap nào hiện có. + +382 +00:31:25,600 --> 00:31:31,540 +Và trong bài học tiếp theo, chúng ta sẽ có dự án cuối cùng cho phần này, nơi bạn sẽ xây dựng một trang + +383 +00:31:31,570 --> 00:31:36,520 +web khởi nghiệp hoàn chỉnh hoặc tự mình sử dụng kiến thức về bootstrap. + +384 +00:31:36,520 --> 00:31:39,100 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/005 11.3-TinDog-Project.zip b/part3/58 - Day 58 - Web Foundation Bootstrap/005 11.3-TinDog-Project.zip new file mode 100644 index 0000000000000000000000000000000000000000..105280dc447842c033b019eae09bd4a8c379d70d --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/005 11.3-TinDog-Project.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0f34311463af776f61dcfe00cb6655b5ef3def4043b38d6fdb7945e82a9779e +size 1455907 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/005 Day 58 Project - A Startup Website for TinDog.mp4 b/part3/58 - Day 58 - Web Foundation Bootstrap/005 Day 58 Project - A Startup Website for TinDog.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ca1cdea52462db4559d78d83387595ac2b1a6d99 --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/005 Day 58 Project - A Startup Website for TinDog.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18827954bedbde9ce8922443153c4c72001d56acaca47d54b3c3c7f1512207a9 +size 659780267 diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/005 Day 58 Project - A Startup Website for TinDog_vi.srt b/part3/58 - Day 58 - Web Foundation Bootstrap/005 Day 58 Project - A Startup Website for TinDog_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1809f545bacbf8423ba5511122b5ca605505f09d --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/005 Day 58 Project - A Startup Website for TinDog_vi.srt @@ -0,0 +1,1592 @@ +1 +00:00:00,230 --> 00:00:00,560 +Được rồi. + +2 +00:00:00,560 --> 00:00:06,740 +Vì vậy, bây giờ bạn đã học tất cả về bootstrap, đã đến lúc áp dụng những gì chúng ta đã học và xây dựng một dự án. + +3 +00:00:06,770 --> 00:00:12,620 +Tôi muốn bạn tưởng tượng rằng một công ty khởi nghiệp đã tiếp cận bạn để xây dựng trang đích của họ. + +4 +00:00:12,620 --> 00:00:20,480 +Vì vậy, công ty được gọi là Tin Dog, và về cơ bản họ làm bùi nhùi cho chó, giúp những chú chó gặp gỡ những chú + +5 +00:00:20,480 --> 00:00:22,460 +chó mới và thú vị ở gần. + +6 +00:00:22,640 --> 00:00:26,720 +Rõ ràng đây là một công ty khởi nghiệp giả mạo mà tôi đã tạo ra. + +7 +00:00:26,750 --> 00:00:30,520 +Bây giờ, nếu bạn muốn tiếp tục và ăn cắp ý tưởng này, thì tôi hoàn toàn ủng hộ bạn. + +8 +00:00:30,530 --> 00:00:32,770 +Nhưng về cơ bản ý tưởng rất đơn giản. + +9 +00:00:32,780 --> 00:00:37,100 +Bạn có một chú chó, bạn muốn chú chó của mình có bạn, vậy hãy sử dụng chó thiếc. + +10 +00:00:37,130 --> 00:00:42,770 +Giờ đây, trang web của chúng tôi đã khá hoàn chỉnh và nếu bạn muốn xem thành phẩm trông như thế + +11 +00:00:42,770 --> 00:00:46,700 +nào, hãy truy cập App Github. io chuyển tiếp con chó tin chém. + +12 +00:00:46,820 --> 00:00:48,480 +Và đây là những gì bạn sẽ thấy. + +13 +00:00:48,500 --> 00:00:56,600 +Đó là một trang web khởi động thực sự đơn giản với nền chuyển màu sinh động với các nút để tải xuống + +14 +00:00:56,600 --> 00:01:03,230 +ứng dụng cũng như các tính năng lời chứng thực, giá cả và chân trang. + +15 +00:01:03,530 --> 00:01:09,710 +Chúng tôi sẽ tạo trang web tuyệt đẹp này và cách chúng tôi sẽ thực hiện là thông qua việc + +16 +00:01:09,710 --> 00:01:17,510 +sử dụng các đoạn mã khác nhau được cung cấp bởi bootstrap cũng như các thành phần khác nhau và sử dụng bố cục + +17 +00:01:17,510 --> 00:01:25,160 +bootstrap để làm cho trang web phản hồi nhanh và dễ nhìn. đẹp trên máy tính để bàn và thiết bị di động ngay + +18 +00:01:25,160 --> 00:01:26,150 +lập tức. + +19 +00:01:26,540 --> 00:01:34,070 +Để bắt đầu, trước tiên hãy tải xuống dự án Tin Dog, giải nén tệp và mở tệp bên trong so với mã. + +20 +00:01:34,490 --> 00:01:43,430 +Bây giờ ở đây tôi muốn bạn mở tệp index. html và bạn có thể thấy tôi đã cung cấp một số nhận xét và một số + +21 +00:01:43,700 --> 00:01:44,810 +phần tử HTML. + +22 +00:01:44,840 --> 00:01:53,300 +Các phần tử phần này chủ yếu được sử dụng để phân tách các phần khác nhau của trang web, do đó, nó chỉ là một nhóm + +23 +00:01:53,300 --> 00:01:55,790 +hoặc khu vực của trang web. + +24 +00:01:55,790 --> 00:01:59,660 +Và trong các trang web hiện đại, bạn sẽ thấy những phần này rất thường xuyên. + +25 +00:01:59,760 --> 00:02:06,750 +Vì vậy, đây là một phần, đây là một phần, đây là một phần và nó giữ cho mã đẹp và có tổ chức và + +26 +00:02:06,750 --> 00:02:11,790 +bạn sẽ viết mã của mình ở giữa các thành phần phần này để tạo từng + +27 +00:02:11,790 --> 00:02:13,000 +khu vực này. + +28 +00:02:13,020 --> 00:02:15,150 +Bây giờ, bạn đang nhắm đến điều gì? + +29 +00:02:15,150 --> 00:02:22,530 +Chà, bạn luôn có thể tham khảo trang web trực tiếp tại GitHub. com Chuyển tiếp chém Tin Dog để xem mọi thứ + +30 +00:02:22,530 --> 00:02:23,850 +sẽ như thế nào. + +31 +00:02:23,850 --> 00:02:31,170 +Nhưng tôi cũng đã cung cấp hình ảnh mục tiêu cho từng phần riêng lẻ được đánh dấu để chỉ cho bạn những khu vực nhất định + +32 +00:02:31,170 --> 00:02:33,030 +cần được chú ý nhiều hơn. + +33 +00:02:33,030 --> 00:02:36,900 +Ví dụ: tên của hình ảnh sẽ được hiển thị ở đây là gì? + +34 +00:02:36,900 --> 00:02:43,200 +Chà, đó là iPhone chấm PNG và bạn có thể tìm thấy nó trong thư mục hình ảnh, nhưng cũng có những thứ như + +35 +00:02:43,200 --> 00:02:48,900 +biểu tượng Apple nhỏ này thực sự là một SVG và bạn có thể tìm thấy chúng trong README. + +36 +00:02:48,930 --> 00:02:55,890 +Vì vậy, tôi đã bao gồm tất cả mã SVG ở đây và tôi muốn bạn sao chép và dán các svgs này vì một số trong số chúng + +37 +00:02:55,890 --> 00:03:01,440 +có chiều cao khác nhau, chúng có kích thước khác nhau và thay vì lấy mã từ trang web bootstrap, + +38 +00:03:01,440 --> 00:03:05,220 +đây là từ, tôi muốn bạn sử dụng phiên bản này. + +39 +00:03:05,220 --> 00:03:08,070 +Vì vậy, chỉ cần sao chép và dán nó vào mã của bạn. + +40 +00:03:08,190 --> 00:03:15,840 +Ngoài ra, nếu bạn cuộn xuống, sẽ có bản sao văn bản mà bạn cần trên trang web của mình và vì vậy bạn có thể sao chép trực + +41 +00:03:15,840 --> 00:03:22,680 +tiếp từ trang web đã hoàn thành cuối cùng hoặc bạn có thể sử dụng văn bản từ README và chỉ cần sao chép + +42 +00:03:22,710 --> 00:03:23,580 +từ đây. + +43 +00:03:23,820 --> 00:03:27,540 +Nếu bạn đang làm việc với tư cách là nhà phát triển web, thì đây là quy trình làm việc rất phổ biến. + +44 +00:03:27,570 --> 00:03:33,120 +Bạn sẽ muốn khách hàng của mình tạo bản sao văn bản vì họ biết rõ nhất về những gì họ muốn trên trang + +45 +00:03:33,120 --> 00:03:38,730 +web của họ và tất cả những gì bạn phải làm chỉ là đặt nó và tạo kiểu cho nó theo đúng cách. + +46 +00:03:39,000 --> 00:03:45,180 +Bây giờ, điều cuối cùng tôi muốn đề cập là nếu bạn nhìn vào bên trong style. css, đây sẽ là biểu định kiểu CSS + +47 +00:03:45,180 --> 00:03:47,820 +cho trang web của bạn. + +48 +00:03:47,820 --> 00:03:49,770 +Bạn có thể thấy rằng đã có trong đó. + +49 +00:03:49,770 --> 00:03:57,900 +Tôi có một lớp gọi là Nền chuyển màu và mã này đến từ một codepen của Manuel Pinto, nơi anh ấy đã tạo PSD nền + +50 +00:03:57,900 --> 00:04:05,550 +chuyển màu CSS thuần túy và chúng tôi chỉ đơn giản là sử dụng mã này nhưng xác định một số màu độc đáo + +51 +00:04:05,550 --> 00:04:07,530 +của riêng chúng tôi. + +52 +00:04:07,530 --> 00:04:14,730 +Và bạn có thể thấy ở đây, chúng ta đang có hiệu ứng chuyển màu chuyển động giữa ba màu này, một màu xanh lam, một + +53 +00:04:14,760 --> 00:04:16,829 +màu đỏ và một loại màu hồng đào. + +54 +00:04:17,160 --> 00:04:21,570 +Và đó là cách chúng ta sẽ có nền gradient này tương tự như những thứ khác mà bạn đã làm + +55 +00:04:21,570 --> 00:04:22,470 +với Bootstrap. + +56 +00:04:22,470 --> 00:04:28,590 +Để hiển thị dải màu này, tất cả những gì bạn phải làm là thêm lớp này vào thành phần HTML của + +57 +00:04:28,590 --> 00:04:33,300 +mình và sau đó nó sẽ tự động tạo hiệu ứng động với bảng màu đẹp mắt này. + +58 +00:04:33,600 --> 00:04:40,140 +Dự án này sẽ yêu cầu một chút khám phá, một chút tìm kiếm xung quanh ví dụ bootstrap, + +59 +00:04:40,140 --> 00:04:47,760 +xem cái nào có thể hoạt động và so sánh chúng, ví dụ, hero nào có thể là hero chúng ta có thể sử dụng + +60 +00:04:47,760 --> 00:04:54,840 +hoặc hero nào trong số chúng các tính năng có thể phù hợp với tính năng mà chúng tôi có ở đây + +61 +00:04:54,840 --> 00:04:59,270 +và tùy chỉnh nó cũng như kiểm tra CSS của nó và. + +62 +00:04:59,280 --> 00:05:03,990 +Đảm bảo rằng mọi thứ trông khá giống với kết quả cuối cùng. + +63 +00:05:04,350 --> 00:05:09,030 +Bây giờ đã đến lúc bạn tạm dừng video và hoàn thành tốt thử thách này. + +64 +00:05:09,060 --> 00:05:12,000 +Bạn có thể phải dành nửa giờ, một giờ cho nó. + +65 +00:05:12,000 --> 00:05:14,610 +Chỉ cần cho mình nhiều thời gian để phạm sai lầm. + +66 +00:05:14,610 --> 00:05:15,600 +Hãy thử mọi thứ. + +67 +00:05:15,600 --> 00:05:17,030 +Đừng quá khắc nghiệt với chính mình. + +68 +00:05:17,040 --> 00:05:19,830 +Đây là một dự án lớn, nhưng tôi tin vào bạn. + +69 +00:05:19,830 --> 00:05:21,000 +Tôi nghĩ bạn có thể làm được. + +70 +00:05:21,030 --> 00:05:23,280 +Tạm dừng video ngay bây giờ và xem cách bạn tiếp tục. + +71 +00:05:28,770 --> 00:05:29,130 +Được rồi. + +72 +00:05:29,130 --> 00:05:34,880 +Hy vọng rằng bạn đã hoàn thành thử thách này và bạn chỉ ở đây để xem cách tôi thực hiện. + +73 +00:05:34,890 --> 00:05:41,460 +Nếu bạn chưa thử, tôi thực sự khuyên bạn nên dừng lại, tạm dừng video và thực sự thử nó trước vì bạn + +74 +00:05:41,460 --> 00:05:47,190 +có thể nghe tôi nói cả ngày, nhưng bạn sẽ không học được cho đến khi bạn thực sự thực hiện + +75 +00:05:47,190 --> 00:05:49,560 +bước đầu tiên và tự viết mã. + +76 +00:05:49,560 --> 00:05:55,020 +Tôi biết nó có thể thực sự, thực sự hấp dẫn, nhưng tôi hứa với bạn đây là cách duy nhất để bạn có thể + +77 +00:05:55,020 --> 00:06:00,480 +tiến tới những điều khó khăn hơn trong tương lai bằng cách cố gắng vượt qua từng bước một. + +78 +00:06:00,480 --> 00:06:06,660 +Bởi vì một khi chúng ta bắt đầu tiếp tục, tôi sẽ cho rằng tất cả những thứ này đều nằm trong vành đai dụng cụ của bạn. + +79 +00:06:06,660 --> 00:06:09,600 +Vì vậy, hãy chắc chắn rằng bạn thực hành, thực hành, thực hành. + +80 +00:06:09,600 --> 00:06:11,790 +Và đây là một cơ hội hoàn hảo. + +81 +00:06:12,060 --> 00:06:12,420 +Được rồi. + +82 +00:06:12,420 --> 00:06:13,230 +Pep nói qua. + +83 +00:06:13,230 --> 00:06:16,200 +Hãy tiếp tục và xây dựng trang web này. + +84 +00:06:16,320 --> 00:06:19,590 +Bây giờ, điều đầu tiên tôi sẽ làm là xây dựng phần tiêu đề này. + +85 +00:06:19,590 --> 00:06:25,260 +Vì vậy, nếu chúng ta nhìn vào mục tiêu tiêu đề, chúng ta có thể thấy đó gần như là cái mà chúng ta gọi là phần anh hùng. + +86 +00:06:25,260 --> 00:06:32,500 +Nếu chúng ta nhìn vào bên trong các ví dụ bootstrap và chúng ta nhìn vào bên trong khu vực của anh hùng, bạn có thể thấy + +87 +00:06:32,500 --> 00:06:35,200 +nó trông cực kỳ giống với bố cục ở đây. + +88 +00:06:35,200 --> 00:06:40,780 +Nó có một số văn bản lớn, một số nút và hình ảnh ở bên phải, đó là những gì chúng tôi có. + +89 +00:06:40,780 --> 00:06:48,760 +Vì vậy, hãy tiếp tục và nhấp chuột phải, kiểm tra và cuộn lên cấp cao nhất chứa mọi thứ ngay + +90 +00:06:48,760 --> 00:06:53,320 +sau dải phân cách và hãy sao chép toàn bộ phần tử. + +91 +00:06:53,560 --> 00:07:01,720 +Tôi sẽ dán phần tử đó vào khu vực phần này và hãy nhấn lưu và xem nó trông như thế nào. + +92 +00:07:01,720 --> 00:07:08,350 +Vì vậy, tôi sẽ hiển thị bản xem trước chỉ để lấy URL này và tôi sẽ mở nó bên trong Chrome để có thể xem nó ở + +93 +00:07:08,350 --> 00:07:09,790 +chế độ toàn màn hình. + +94 +00:07:09,790 --> 00:07:13,030 +Bây giờ bạn có thể thấy điều này không giống bootstrap chút nào. + +95 +00:07:13,060 --> 00:07:15,490 +Văn bản không phải là phông chữ phù hợp. + +96 +00:07:15,670 --> 00:07:16,780 +Các nút không được tạo kiểu. + +97 +00:07:16,780 --> 00:07:18,580 +Đây chỉ là HTML thuần túy. + +98 +00:07:18,580 --> 00:07:22,450 +Điều này sẽ cung cấp cho bạn một gợi ý lớn về những gì sai. + +99 +00:07:22,450 --> 00:07:27,670 +Và đó là bởi vì chúng tôi chưa thêm một liên kết đến bootstrap CSS. + +100 +00:07:27,820 --> 00:07:29,920 +Vì vậy, hãy tiếp tục và làm điều đó ngay bây giờ. + +101 +00:07:29,920 --> 00:07:37,750 +Vì vậy, nếu chúng tôi quay lại tài liệu bootstrap chính và truy cập trang chủ, chúng tôi sẽ có thể + +102 +00:07:37,750 --> 00:07:42,310 +lấy liên kết và chúng tôi có thể dán nó vào dự án của mình. + +103 +00:07:42,310 --> 00:07:46,090 +Vì vậy, bây giờ hãy đánh, lưu và quay trở lại con chó thiếc của chúng ta. + +104 +00:07:46,090 --> 00:07:52,630 +Chúng ta sẽ thấy rằng chúng ta có những gì gần với ví dụ mà chúng ta đã thấy ở đây. + +105 +00:07:53,200 --> 00:07:55,720 +Có một vài điều mà chúng ta sẽ cần phải sửa chữa. + +106 +00:07:55,720 --> 00:08:00,430 +Đầu tiên, hãy tiếp tục và loại bỏ hình ảnh bị hỏng này và đưa vào hình ảnh mà chúng ta muốn. + +107 +00:08:00,730 --> 00:08:02,920 +Đây là hình ảnh. + +108 +00:08:02,920 --> 00:08:09,670 +Vì vậy, hãy tiếp tục và thay đổi nguồn thành hình ảnh của chúng ta, nằm trong thư mục hình ảnh. + +109 +00:08:09,670 --> 00:08:11,530 +Và nó được gọi là iPhone dot PNG. + +110 +00:08:12,040 --> 00:08:15,430 +Và hãy thay đổi alt thành bản demo ứng dụng. + +111 +00:08:15,430 --> 00:08:20,680 +Hãy nhấn, lưu và quay lại và chúng ta có thể thấy cái này cực kỳ đồ sộ. + +112 +00:08:20,680 --> 00:08:23,470 +Vì vậy, bây giờ chúng ta sẽ phải điều chỉnh kích thước. + +113 +00:08:23,470 --> 00:08:27,760 +Vì vậy, ở đây, nó được đặt thành chiều rộng, chiều cao 700, 500. + +114 +00:08:27,760 --> 00:08:29,620 +Tôi sẽ giữ tỷ lệ khung hình. + +115 +00:08:29,620 --> 00:08:35,740 +Vì vậy, tôi sẽ chỉ xóa chiều rộng và hy vọng nó sẽ điều chỉnh theo tỷ lệ và tôi sẽ thay đổi + +116 +00:08:35,740 --> 00:08:37,870 +chiều cao thành 200 pixel. + +117 +00:08:37,870 --> 00:08:40,750 +Và điều này có vẻ ít nhiều phù hợp với kích thước. + +118 +00:08:40,780 --> 00:08:43,480 +Bây giờ của bạn có thể lớn hơn một chút, nhỏ hơn một chút. + +119 +00:08:43,480 --> 00:08:46,810 +Nó không thực sự quan trọng miễn là nó trông đẹp mắt của bạn. + +120 +00:08:46,990 --> 00:08:53,080 +Bây giờ điều tiếp theo chúng ta sẽ làm là thay đổi toàn bộ văn bản này để nó đọc giống như bản + +121 +00:08:53,080 --> 00:08:54,220 +sao cuối cùng. + +122 +00:08:54,220 --> 00:09:01,210 +Và để làm điều đó, tôi sẽ tìm văn bản bên trong tệp readme của tôi, tiếp tục, sao chép và dán nó vào + +123 +00:09:01,210 --> 00:09:02,530 +đúng khu vực. + +124 +00:09:02,530 --> 00:09:09,160 +Vì vậy, chúng tôi đã có một H1 và đó là nơi chúng tôi sẽ thay thế bằng tiêu đề lớn gặp gỡ những chú chó mới + +125 +00:09:09,160 --> 00:09:10,360 +và thú vị gần đó. + +126 +00:09:10,360 --> 00:09:16,510 +Và sau đó tôi sẽ xóa phần tử đoạn văn này vì chúng tôi thực sự không có nó trong thiết kế cuối cùng của mình. + +127 +00:09:16,510 --> 00:09:20,170 +Và tôi sẽ thay đổi hai nút thành cả hai nút đều nói là tải xuống. + +128 +00:09:20,470 --> 00:09:28,780 +Ngoài phần tải xuống, rõ ràng còn có hai svgs và đây là các biểu tượng từ Bootstrap. + +129 +00:09:28,780 --> 00:09:34,840 +Nhưng hãy nhớ rằng tôi đã đề cập rằng bạn có thể giữ các svgs này trong tệp README, vì vậy + +130 +00:09:34,840 --> 00:09:39,880 +tôi sẽ bán buôn chỉ cần sao chép tệp SVG của Apple này và dán vào đây. + +131 +00:09:39,880 --> 00:09:48,610 +Thêm khoảng cách giữa SVG và tải xuống và bây giờ hy vọng chúng ta có một biểu tượng quả táo đẹp mắt trong nút + +132 +00:09:48,640 --> 00:09:53,650 +tải xuống và tôi sẽ làm tương tự với biểu tượng Google Play. + +133 +00:09:56,050 --> 00:09:57,520 +Nhấn lưu và thế là xong. + +134 +00:09:57,520 --> 00:09:58,310 +Nó đây rồi. + +135 +00:09:58,330 --> 00:10:00,730 +Chúng ta sẽ thay đổi cách phối màu ở đây một chút. + +136 +00:10:00,760 --> 00:10:06,550 +Chúng tôi có một đèn nút và chúng tôi có đèn đường viền nút để nó trông giống như thiết + +137 +00:10:06,550 --> 00:10:07,760 +kế cuối cùng. + +138 +00:10:07,780 --> 00:10:16,060 +Bây giờ, ngay bây giờ, nút này là nút chính, vì vậy chúng ta sẽ phải chuyển nó thành ánh sáng. + +139 +00:10:16,060 --> 00:10:19,660 +Còn cái này, nó có phải là cái nút phụ không. + +140 +00:10:19,690 --> 00:10:23,110 +Chúng ta sẽ thay đổi điều đó thành ánh sáng đường viền nút. + +141 +00:10:23,290 --> 00:10:26,260 +Hãy nhấn, lưu và xem những gì chúng ta có. + +142 +00:10:26,290 --> 00:10:32,650 +Bây giờ bạn sẽ nhận thấy rằng nút này gần như biến mất hoàn toàn nếu không có hiệu ứng tái đầu tư này. + +143 +00:10:32,650 --> 00:10:36,400 +Và lý do là bởi vì nó ít nhiều là một đường viền màu trắng. + +144 +00:10:36,520 --> 00:10:39,400 +Để cho thấy điều này, chúng ta cần một nền tảng. + +145 +00:10:39,400 --> 00:10:44,380 +Vì vậy, hãy tiếp tục và thiết lập nó với nền gradient này. + +146 +00:10:44,470 --> 00:10:51,040 +Hãy nhớ rằng tôi đã đề cập rằng nếu bạn nhìn vào bên trong tệp Style. css, đã có một lớp gọi là nền gradient, + +147 +00:10:51,040 --> 00:10:56,540 +chúng ta có thể thêm lớp này vào HTML của mình để nó hiển thị. + +148 +00:10:56,540 --> 00:11:00,350 +Bây giờ chúng ta thêm nó ở đâu trước khi chúng ta có thể thêm nó? + +149 +00:11:00,380 --> 00:11:07,400 +Chúng tôi cần nhập CSS của mình và như mọi khi, chúng tôi đặt CSS tùy chỉnh của mình sau bootstrap. + +150 +00:11:07,400 --> 00:11:13,940 +Vì vậy, trong trường hợp có bất kỳ xung đột nào về việc nhắm mục tiêu cùng một bộ chọn, thì cái cuối + +151 +00:11:13,940 --> 00:11:17,180 +cùng sẽ thắng, hy vọng đó là CSS của chúng ta. + +152 +00:11:17,420 --> 00:11:23,960 +Vì vậy, tôi sẽ liên kết với style CSS và sau đó tôi sẽ đặt nền gradient của lớp đó vào + +153 +00:11:23,960 --> 00:11:25,820 +phần tiêu đề của mình. + +154 +00:11:25,820 --> 00:11:27,560 +Vậy tôi để nó ở đâu bây giờ? + +155 +00:11:27,560 --> 00:11:33,350 +Nếu tôi đặt nó bên trong hộp chứa, bạn sẽ thấy rằng nó chỉ ở bên trong hộp chứa và hộp chứa có các + +156 +00:11:33,350 --> 00:11:35,270 +lề lớn ở bên trái và bên phải. + +157 +00:11:35,270 --> 00:11:37,850 +Vì vậy, đây không phải là giao diện mà chúng tôi muốn. + +158 +00:11:37,880 --> 00:11:42,710 +Thay vào đó, chúng ta sẽ đặt cái này bên trong phần này. + +159 +00:11:42,860 --> 00:11:47,660 +Chúng tôi không thể đặt nó vào ID vì nó không phải là ID, nó thực sự là một lớp. + +160 +00:11:47,660 --> 00:11:51,980 +Vì vậy, hãy chắc chắn rằng bạn đã đặt nó bên trong thuộc tính lớp. + +161 +00:11:52,040 --> 00:11:53,420 +Bây giờ chúng ta hãy xem. + +162 +00:11:53,420 --> 00:11:55,520 +Và điều này có vẻ khá tốt. + +163 +00:11:55,580 --> 00:12:01,820 +Bây giờ, sự khác biệt duy nhất giữa những gì chúng tôi có và những gì chúng tôi hướng tới là rất nhiều phần đệm. + +164 +00:12:02,030 --> 00:12:08,600 +Bây giờ, lý do tôi có thể nói phần đệm này chứ không phải phần lề là vì phần đệm mở rộng nền. + +165 +00:12:08,600 --> 00:12:12,560 +Vì vậy, nếu đây là một lề phụ, thì khu vực này sẽ có màu trắng. + +166 +00:12:12,560 --> 00:12:16,570 +Nhưng thay vào đó, nó thực sự giống với màu nền. + +167 +00:12:16,580 --> 00:12:19,070 +Vậy lợi nhuận này đến từ đâu? + +168 +00:12:19,070 --> 00:12:26,300 +Hãy tiếp tục và nhấn, kiểm tra và làm cho cái này nhỏ hơn một chút để chúng ta có thể thấy phần đệm này. + +169 +00:12:26,300 --> 00:12:33,080 +Và nếu chúng ta cuộn lên cho đến khi thấy phần đệm xuất hiện, bạn có thể thấy màu cam ở dưới đó khi tôi di chuột + +170 +00:12:33,080 --> 00:12:33,740 +qua nó. + +171 +00:12:33,770 --> 00:12:36,490 +Vâng, đó là những gì chúng ta cần phải thoát khỏi. + +172 +00:12:36,500 --> 00:12:39,800 +Vì vậy, bạn có thể thấy chúng tôi có đệm trên và đệm dưới. + +173 +00:12:39,800 --> 00:12:45,530 +Và nếu chúng ta loại bỏ phần trên và dưới, nó sẽ trông hơi quá. + +174 +00:12:45,530 --> 00:12:51,530 +Vì vậy, nếu chúng ta chỉ nhắm mục tiêu vào phần dưới cùng, thì ít nhiều chúng ta đã có bố cục phù hợp. + +175 +00:12:51,620 --> 00:12:56,720 +Vì vậy, hãy vào đây và tìm số P 5 cho thùng hàng ở ngay đây. + +176 +00:12:56,720 --> 00:13:01,880 +Và hãy nhớ rằng, P là viết tắt của đệm, Y là viết tắt của trục Y. + +177 +00:13:01,880 --> 00:13:05,210 +Vì vậy, điều đó có nghĩa là nó đang thêm phần đệm vào trên cùng và dưới cùng. + +178 +00:13:05,210 --> 00:13:12,770 +Vì vậy, nếu chúng ta muốn thay đổi điều này thành chỉ có nó ở trên cùng, thì chúng ta thay đổi điều này thành phần đệm trên cùng và sau + +179 +00:13:12,770 --> 00:13:16,760 +đó chúng ta có một div khác cũng có phần đệm ở trên cùng và dưới cùng. + +180 +00:13:16,760 --> 00:13:18,200 +Vì vậy, hãy thay đổi nó ở đó. + +181 +00:13:18,200 --> 00:13:23,690 +Và sau đó khi quay lại, chúng ta sẽ thấy rằng chúng ta có bố cục khá giống nhau. + +182 +00:13:23,780 --> 00:13:30,140 +Và bây giờ nếu chúng ta so sánh cách bố trí của chúng ta với kết quả cuối cùng, nó trông khá giống nhau. + +183 +00:13:30,500 --> 00:13:35,120 +Vì vậy, bây giờ chúng ta có thể chuyển sang phần tiếp theo, đó là phần tính năng. + +184 +00:13:35,780 --> 00:13:43,580 +Nếu chúng tôi mở mục tiêu về các tính năng của mình, bạn có thể thấy rằng chúng tôi có ba khu vực khác nhau với tất cả các tính + +185 +00:13:43,580 --> 00:13:48,200 +năng mà chúng tôi muốn giới thiệu và chúng tôi có kiểu bố cục thô này. + +186 +00:13:48,500 --> 00:13:55,160 +Nếu chúng ta quay lại các ví dụ bootstrap và nếu chúng ta xem xét các tính năng bên trong đoạn trích, bạn có thể + +187 +00:13:55,160 --> 00:13:59,090 +thấy bố cục này khá giống với những gì chúng ta đang hướng tới. + +188 +00:13:59,090 --> 00:14:05,710 +Vì vậy, hãy tiếp tục kiểm tra và tìm hàng mà chúng ta cần nắm giữ. + +189 +00:14:05,720 --> 00:14:11,330 +Hãy sao chép phần tử và đặt nó vào trong chỉ mục của chúng ta. html. + +190 +00:14:12,200 --> 00:14:16,640 +Bây giờ, khi chúng ta dán nó vào, hãy nhấn, lưu và xem nó. + +191 +00:14:16,670 --> 00:14:23,090 +Bạn có thể thấy điều này đang chiếm gần như toàn bộ chiều rộng, điều này không hoàn toàn như những gì chúng ta muốn. + +192 +00:14:23,120 --> 00:14:28,220 +Chúng tôi thực sự muốn tất cả gần như dọc theo cùng một đường thẳng đứng. + +193 +00:14:28,220 --> 00:14:29,740 +Vậy tại sao lại thế này? + +194 +00:14:29,750 --> 00:14:35,240 +Chà, đó là vì cấp cao nhất ở đây là hàng bootstrap. + +195 +00:14:35,270 --> 00:14:40,160 +Nếu chúng ta muốn nó được chứa, thì chúng ta cần thêm một thùng chứa. + +196 +00:14:40,160 --> 00:14:47,930 +Vì vậy, hãy thêm lớp vùng chứa đó và sau đó hãy di chuyển thẻ đóng này để bọc nó xung quanh tất cả lưu lần truy + +197 +00:14:47,960 --> 00:14:48,950 +cập này. + +198 +00:14:48,950 --> 00:14:53,000 +Và bây giờ bạn có thể thấy chúng ta đã có sự liên kết hoàn hảo đó. + +199 +00:14:53,570 --> 00:14:55,520 +Việc tiếp theo chúng ta cần làm là. + +200 +00:14:55,540 --> 00:15:00,820 +Đó là chúng ta cần loại bỏ tất cả các nút này và điều đó khá dễ dàng. + +201 +00:15:00,820 --> 00:15:02,730 +Chúng chỉ là những thẻ neo này. + +202 +00:15:02,740 --> 00:15:07,120 +Vì vậy, có một ở đó, có một ở đây và có một ở trên này. + +203 +00:15:08,170 --> 00:15:11,470 +Vì vậy, bây giờ chúng tôi có khá nhiều thiết kế mà chúng tôi đang tìm kiếm. + +204 +00:15:11,500 --> 00:15:14,080 +Tất cả những gì chúng ta cần làm là thay thế văn bản. + +205 +00:15:14,170 --> 00:15:19,600 +Điều này có lẽ hơi nhàm chán, vì vậy tôi sẽ sử dụng chỉnh sửa video để tăng tốc độ một chút cho + +206 +00:15:19,600 --> 00:15:20,050 +bạn. + +207 +00:15:21,560 --> 00:15:21,950 +Được rồi. + +208 +00:15:21,950 --> 00:15:28,780 +Vì vậy, bây giờ chúng tôi đã có tất cả bản sao tùy chỉnh của mình, điều cuối cùng chúng tôi cần sửa là những svgs này. + +209 +00:15:28,790 --> 00:15:35,350 +Vì vậy, hãy tiếp tục và thay thế các svgs trong ví dụ bằng những cái mà chúng ta muốn. + +210 +00:15:35,360 --> 00:15:40,580 +Vì vậy, cái đầu tiên sẽ là dấu kiểm SVG Hãy sao chép và dán nó vào. + +211 +00:15:40,970 --> 00:15:44,720 +Thứ hai là chiếc mũ tốt nghiệp. + +212 +00:15:47,260 --> 00:15:51,490 +Và cái cuối cùng là trái tim với một mũi tên xuyên qua nó. + +213 +00:15:52,420 --> 00:16:00,370 +Vì vậy, bây giờ chúng tôi đã thay thế tất cả các svgs của mình, bạn có thể thấy chúng hiển thị, nhưng nền trông không hoàn toàn + +214 +00:16:00,370 --> 00:16:01,270 +giống nhau. + +215 +00:16:01,270 --> 00:16:05,020 +Nó phải có các góc tròn này, nó phải lớn hơn một chút. + +216 +00:16:05,020 --> 00:16:08,980 +Và chúng ta sẽ xem xét ví dụ bootstrap nơi chúng ta đã sao chép mã của mình. + +217 +00:16:08,980 --> 00:16:10,570 +Họ trông thật hoàn hảo. + +218 +00:16:10,570 --> 00:16:14,920 +Nhưng tại sao khi nó ở trong trang web của chúng tôi, nó không hoàn toàn giống nhau? + +219 +00:16:15,040 --> 00:16:20,470 +Bây giờ đây có thể là thứ mà bạn mắc kẹt, nhưng để tìm ra điều này, cách dễ + +220 +00:16:20,470 --> 00:16:22,090 +nhất là kiểm tra nó. + +221 +00:16:22,090 --> 00:16:29,770 +Trong Chrome, bạn có thể thấy ngay bây giờ tôi đang đánh dấu SVG, nhưng nếu tôi chuyển lên trên một cấp độ và di + +222 +00:16:29,770 --> 00:16:34,270 +chuột trên div đó, thì đó là cấp độ có tất cả kiểu dáng lạ mắt đó. + +223 +00:16:34,360 --> 00:16:41,350 +Và nếu chúng ta nhìn vào bên trong các kiểu, bạn có thể thấy thực sự có một số CSS tùy chỉnh ở đây + +224 +00:16:41,350 --> 00:16:45,190 +vì nó không có trong các tiện ích đến từ bootstrap. + +225 +00:16:45,220 --> 00:16:49,970 +Đây thực sự là CSS tùy chỉnh chỉ dành cho phần tính năng này. + +226 +00:16:49,970 --> 00:16:57,320 +Vì vậy, những gì chúng ta cần làm là sao chép tất cả CSS và đặt nó vào tệp style. css. + +227 +00:16:57,740 --> 00:17:05,720 +Vì vậy, bây giờ hình vuông biểu tượng này, lớp dành cho div này, có thể được kích hoạt. + +228 +00:17:05,720 --> 00:17:12,650 +Và khi chúng tôi nhìn vào nó bây giờ, bạn có thể thấy rằng tất cả chúng đều có kiểu dáng phù hợp mà chúng tôi mong đợi. + +229 +00:17:12,770 --> 00:17:19,040 +Vì vậy, điều cuối cùng chúng ta cần sắp xếp chỉ là thêm một chút lề nữa trong phần tính năng này và sau đó chúng ta đã + +230 +00:17:19,040 --> 00:17:20,710 +hoàn thành khá nhiều việc. + +231 +00:17:20,720 --> 00:17:28,069 +Vì vậy, nếu chúng ta xem xét mục tiêu về tính năng, bạn có thể thấy tôi đã gợi ý cho bạn rằng nó thực sự nằm + +232 +00:17:28,069 --> 00:17:29,000 +trong top 5. + +233 +00:17:29,210 --> 00:17:36,200 +Nếu chúng ta muốn thêm một số lề cho toàn bộ vùng chứa này, thì chúng ta có thể chuyển đến lớp div nơi chúng ta có + +234 +00:17:36,200 --> 00:17:41,210 +vùng chứa và sau đó chúng ta thêm năm lề trên cùng, năm dấu gạch ngang trống. + +235 +00:17:41,210 --> 00:17:47,180 +Và bây giờ chúng ta nên có đủ khoảng trống giữa phần tiêu đề hàng đầu đó và phần tính năng của chúng ta. + +236 +00:17:47,180 --> 00:17:51,320 +Vì vậy, bây giờ chúng tôi đã sẵn sàng để chuyển sang phần chứng thực. + +237 +00:17:51,770 --> 00:17:55,210 +Một lần nữa, chúng ta hãy nhìn vào mục tiêu mà chúng ta đang tìm kiếm. + +238 +00:17:55,220 --> 00:18:00,800 +Vì vậy, phần đầu tiên là một H2 với một hình ảnh và một số văn bản đoạn văn. + +239 +00:18:01,160 --> 00:18:09,740 +Khu vực này đến từ phần Jumbotron này, và nếu chúng ta cuộn xuống, chúng ta có thể thấy toàn bộ chiều rộng của jumbotron + +240 +00:18:09,740 --> 00:18:10,790 +ngay tại đây. + +241 +00:18:10,790 --> 00:18:18,950 +Vì vậy, hãy tiếp tục và kiểm tra nó và hãy lấy toàn bộ phần ngay sau dải phân cách. + +242 +00:18:18,950 --> 00:18:25,670 +Vì vậy, hãy sao chép phần tử và dán nó vào phần lời chứng thực của chúng tôi. + +243 +00:18:26,180 --> 00:18:28,430 +Chúng ta hãy xem nó trông như thế nào. + +244 +00:18:28,460 --> 00:18:32,900 +Nó trông khá tốt, nhưng chúng ta cần sửa đổi nó cho mục đích của mình. + +245 +00:18:32,900 --> 00:18:35,690 +Vì vậy, hãy thay đổi văn bản bên trong. + +246 +00:18:35,690 --> 00:18:43,550 +Nếu chúng ta chuyển đến README của mình, chúng ta sẽ thấy trích dẫn của chúng ta ở đây từ Pebbles và chúng ta có thể thay thế + +247 +00:18:43,550 --> 00:18:45,050 +văn bản bên trong H1. + +248 +00:18:45,530 --> 00:18:51,710 +Hãy nhớ từ các lớp HTML của chúng tôi, chúng tôi chỉ nên có một H1 cho mỗi trang web. + +249 +00:18:51,710 --> 00:18:56,600 +Và hãy nhớ rằng ngay từ đầu trong phần tiêu đề, chúng ta đã có tiêu đề lớn. + +250 +00:18:56,600 --> 00:19:00,170 +Vì vậy, ở đây nó thực sự không phải là H1. + +251 +00:19:00,170 --> 00:19:05,060 +Hãy biến nó thành một tiêu đề phụ bằng cách thay đổi nó thành H2. + +252 +00:19:06,620 --> 00:19:14,150 +Bây giờ phần tử đoạn văn này, tôi có thể xóa nó đi, nhưng tôi thực sự sẽ giữ nó và sử dụng nó để hiển + +253 +00:19:14,150 --> 00:19:19,640 +thị tên xuất xứ của câu trích dẫn, đó là Pebbles from New York. + +254 +00:19:19,670 --> 00:19:28,910 +Và tất cả những gì tôi phải làm bây giờ là thêm một hình ảnh ở giữa, và hình ảnh đó sẽ là hình ảnh con chó của chúng ta và tôi + +255 +00:19:28,910 --> 00:19:31,460 +cũng sẽ thêm văn bản thay thế. + +256 +00:19:32,510 --> 00:19:34,790 +Chúng ta hãy xem nó trông như thế nào. + +257 +00:19:34,820 --> 00:19:35,700 +No trông tuyệt. + +258 +00:19:35,720 --> 00:19:41,960 +Ngoài thực tế là cái này phải được làm tròn và nó phải nhỏ hơn một chút, nếu chúng ta nhìn vào mục tiêu, + +259 +00:19:41,960 --> 00:19:46,460 +chúng ta có thể thấy nó phải cao 100 pixel và nó phải có hình tròn. + +260 +00:19:46,550 --> 00:19:49,730 +Vì vậy, làm thế nào để chúng tôi làm cho nó tùy chỉnh? + +261 +00:19:49,730 --> 00:19:52,980 +Chà, chúng ta sẽ cần tạo một số kiểu dáng, phải không? + +262 +00:19:53,000 --> 00:20:03,110 +Vì vậy, hãy tạo một lớp có tên profile Dash Image và đặt nó có chiều cao là 100 pixel. + +263 +00:20:03,110 --> 00:20:09,240 +Và để làm cho nó hình tròn, hãy nhớ rằng, chúng ta cần đặt bán kính đường viền thành 50%. + +264 +00:20:09,300 --> 00:20:19,470 +Bây giờ, nếu chúng tôi áp dụng lớp đó cho hình ảnh dấu gạch ngang hồ sơ hình ảnh của mình và chúng tôi xem trang web của mình và bạn có thể thấy + +265 +00:20:19,470 --> 00:20:24,570 +nó trông khá hoàn hảo và tương tự như những gì chúng tôi có ở đây. + +266 +00:20:24,780 --> 00:20:28,800 +Bây giờ, điều duy nhất chúng ta cần thêm là thêm một chút lợi nhuận. + +267 +00:20:29,580 --> 00:20:36,120 +Chúng ta nên có lề năm giữa hai phần này và lề hai giữa hai phần này. + +268 +00:20:36,120 --> 00:20:39,540 +Vì vậy, tôi sẽ chỉ thêm một số lề trên vào hình ảnh. + +269 +00:20:39,540 --> 00:20:49,610 +Vì vậy, một kích thước lề năm cho hình ảnh để tôi có thể đánh dấu khoảng trống trên lớp và sau đó thực hiện lề trên dấu gạch ngang năm. + +270 +00:20:49,620 --> 00:20:56,370 +Và sau đó đối với văn bản, tôi sẽ thực hiện một lớp gạch ngang trên lề hai. + +271 +00:20:56,670 --> 00:21:04,320 +Và bây giờ chúng ta sẽ có đủ khoảng trống ở giữa mọi thứ và nó trông khá giống với ví dụ. + +272 +00:21:04,710 --> 00:21:12,480 +Bây giờ chúng tôi cần thêm tất cả các cửa hàng đã giới thiệu công ty khởi nghiệp của chúng tôi và bạn + +273 +00:21:12,510 --> 00:21:21,510 +có thể thấy từ hình ảnh mục tiêu ở đây rằng chúng tôi có một lưới 12 cột ở đây từ Bootstrap và mỗi cột chiếm một phần tư + +274 +00:21:21,510 --> 00:21:22,710 +không gian. + +275 +00:21:22,740 --> 00:21:29,790 +Nhưng hãy lưu ý ở đây tôi đã nói rằng nó sẽ chiếm ba cột trên máy tính để bàn, nhưng có chiều rộng đầy đủ, 12 cột trên thiết + +276 +00:21:29,790 --> 00:21:30,630 +bị di động. + +277 +00:21:30,630 --> 00:21:36,540 +Vì vậy, nó phải phản hồi nhanh và chúng ta có thể tìm thấy tất cả những hình ảnh này trong thư mục hình ảnh. + +278 +00:21:36,660 --> 00:21:46,140 +Hãy tiếp tục và thêm nó bên dưới vùng chứa này để tạo hệ thống bố cục 12 cột bootstrap, thứ đầu tiên chúng + +279 +00:21:46,140 --> 00:21:49,430 +ta luôn cần là một vùng chứa. + +280 +00:21:49,440 --> 00:21:58,860 +Vì vậy, hãy tạo một div chứa lớp và bên trong đây là nơi chúng ta cần div có một lớp + +281 +00:21:58,860 --> 00:21:59,810 +hàng. + +282 +00:21:59,820 --> 00:22:02,810 +Vì vậy, bây giờ chúng tôi đã sẵn sàng để tạo các cột của mình. + +283 +00:22:02,820 --> 00:22:13,110 +Mỗi cột sẽ là ba cột ở định dạng máy tính để bàn, vì vậy cái đó được gọi là Dash Large hoặc LG và + +284 +00:22:13,110 --> 00:22:18,360 +nó sẽ là ba cột, nhưng trên thiết bị di động. + +285 +00:22:18,360 --> 00:22:22,500 +Vì vậy, hãy gọi Dash, SM Small sẽ hoạt động hết công suất. + +286 +00:22:22,500 --> 00:22:29,730 +Vì vậy, 12 và bên trong đây, chúng tôi có thể đặt hình ảnh của mình từ thư mục hình ảnh và chúng tôi + +287 +00:22:29,730 --> 00:22:34,860 +sẽ bắt đầu với TechCrunch và tôi sẽ thêm văn bản thay thế vào đó. + +288 +00:22:35,100 --> 00:22:42,750 +Bây giờ tôi sẽ sao chép và dán nó ba lần và bây giờ tôi sẽ thay thế từng hình ảnh này bằng những + +289 +00:22:42,750 --> 00:22:45,480 +hình ảnh mà chúng ta có ở đây. + +290 +00:22:45,480 --> 00:22:49,140 +Vì vậy, Mashable, Business Insider và TMW. + +291 +00:22:50,100 --> 00:22:50,580 +Được rồi. + +292 +00:22:50,580 --> 00:22:56,250 +Vì vậy, bây giờ chúng ta sẽ có tất cả các hình ảnh của mình, nhưng chúng hơi lớn. + +293 +00:22:57,000 --> 00:23:03,780 +Một điều chúng ta có thể làm là chúng ta có thể giới hạn chiều cao của chúng để tất cả chúng đều có chiều cao bằng nhau thay vì + +294 +00:23:03,780 --> 00:23:06,660 +có vạch xuất phát và vạch kết thúc không bằng nhau. + +295 +00:23:06,660 --> 00:23:15,780 +Vì vậy, tôi sẽ đặt chiều cao thành 30 và đó phải là chiều cao đủ để hiển thị, nhưng không quá cao + +296 +00:23:15,780 --> 00:23:21,090 +đến mức chiếm quá nhiều không gian và trông khá đẹp. + +297 +00:23:21,210 --> 00:23:27,660 +Vì vậy, bây giờ chúng tôi đã hoàn thành phần chứng thực của mình và chúng tôi đang ở phần áp chót, đó là + +298 +00:23:27,660 --> 00:23:28,920 +kế hoạch định giá. + +299 +00:23:28,920 --> 00:23:35,940 +Và như bạn sẽ nhớ, Bootstrap có phần kế hoạch định giá ngay tại đây. + +300 +00:23:36,600 --> 00:23:40,560 +Và ba thẻ này là những thẻ mà chúng tôi muốn nắm giữ. + +301 +00:23:40,590 --> 00:23:46,970 +Vì vậy, hãy kiểm tra điều đó và tìm khu vực mà chúng ta cần, có thể là hàng div này. + +302 +00:23:46,980 --> 00:23:50,880 +Vì vậy, hãy sao chép nó và đặt nó vào phần định giá. + +303 +00:23:50,880 --> 00:23:56,630 +Nhưng như bạn nhớ, một hàng div cần phải đi vào bên trong một thùng chứa. + +304 +00:23:56,640 --> 00:23:58,740 +Vì vậy, hãy tiếp tục và làm điều đó. + +305 +00:23:58,740 --> 00:24:04,050 +Và nếu chúng ta nhìn vào bảng giá của mình thì nó đã có sẵn và trông khá tốt. + +306 +00:24:04,260 --> 00:24:11,820 +Phần khác mà chúng ta cần là tiêu đề cho bảng giá, đây là khu vực ngay tại đây và + +307 +00:24:11,820 --> 00:24:15,210 +đây là div chứa tất cả nội dung đó. + +308 +00:24:15,210 --> 00:24:21,960 +Vì vậy, chúng ta hãy sao chép nó và đặt nó vào đầu vùng chứa của chúng ta ngay tại đây. + +309 +00:24:22,290 --> 00:24:26,430 +Vì vậy, bây giờ chúng tôi đã giảm khá nhiều bảng giá. + +310 +00:24:26,430 --> 00:24:33,000 +Chúng tôi chỉ cần cập nhật tất cả văn bản ở đây thành văn bản mà chúng tôi có trong bản sao của mình. + +311 +00:24:33,030 --> 00:24:35,370 +Vì vậy, tôi sẽ làm điều này một lần nữa một cách nhanh chóng. + +312 +00:24:35,370 --> 00:24:38,890 +Tôi sẽ tua nhanh và thay thế tất cả văn bản. + +313 +00:24:47,070 --> 00:24:53,460 +Được rồi, bây giờ tất cả văn bản đã được thay thế và bạn sẽ thấy tất cả văn bản đó bên trong phần + +314 +00:24:53,460 --> 00:24:54,240 +định giá. + +315 +00:24:54,240 --> 00:24:56,790 +Vì vậy, bây giờ chúng ta cần cập nhật thiết kế một chút. + +316 +00:24:56,790 --> 00:25:04,620 +Và sự khác biệt chính là cách phối màu ở đây đều sử dụng màu chính của bootstrap, đó là màu + +317 +00:25:04,620 --> 00:25:05,640 +xanh lam. + +318 +00:25:05,640 --> 00:25:12,030 +Nhưng chúng ta cần thay đổi tất cả thành loại màu tối, là loại màu đen này. + +319 +00:25:12,270 --> 00:25:18,300 +Và nếu bạn nhìn vào bên trong mục tiêu định giá, bạn có thể thấy những phần mà chúng tôi cần thay đổi. + +320 +00:25:18,960 --> 00:25:20,910 +Điều này cần phải trở thành đường viền tối. + +321 +00:25:20,940 --> 00:25:22,980 +Điều này cần phải là nút, tối, nút tối. + +322 +00:25:22,980 --> 00:25:24,570 +Và điều này cũng cần phải tối. + +323 +00:25:24,810 --> 00:25:32,790 +Một lối tắt ở đây là chỉ cần sử dụng điều khiển F trên windows hoặc lệnh F trên Mac để hiển thị thanh tìm kiếm của + +324 +00:25:32,790 --> 00:25:33,660 +chúng tôi. + +325 +00:25:33,660 --> 00:25:41,460 +Và nếu chúng ta tìm kiếm từ chính và thay thế nó bằng dark, thì chúng ta có thể thực sự xem qua từng ví + +326 +00:25:41,460 --> 00:25:45,700 +dụ này và xem liệu chúng ta có muốn thay thế nó không. + +327 +00:25:45,700 --> 00:25:50,770 +Những gì tôi khuyên bạn nên làm là thực sự làm điều này từng cái một. + +328 +00:25:50,770 --> 00:25:56,230 +Vì vậy, thay vì thay thế tất cả, bởi vì theo cách đó bạn có thể biết mình đang thay thế bộ phận nào. + +329 +00:25:56,230 --> 00:26:02,200 +Và nhiều lần tôi đã thay thế tất cả chỉ để phát hiện ra rằng tôi đã làm hỏng toàn bộ dự án theo một cách + +330 +00:26:02,200 --> 00:26:02,860 +nào đó. + +331 +00:26:02,860 --> 00:26:04,840 +Vì vậy, chỉ là một lời khuyên. + +332 +00:26:04,870 --> 00:26:06,340 +Đi qua nó từng cái một. + +333 +00:26:06,340 --> 00:26:10,150 +Đảm bảo rằng nó có ý nghĩa và đó là lĩnh vực phù hợp mà bạn đang thay đổi. + +334 +00:26:10,150 --> 00:26:15,550 +Nhưng hy vọng rằng khi chúng tôi quay lại trang web của mình, chúng tôi có thể thấy chúng tôi hiện đã cập nhật tất + +335 +00:26:15,550 --> 00:26:17,650 +cả các vị trí thích hợp cho bảng màu tối này. + +336 +00:26:18,220 --> 00:26:26,740 +Quay trở lại mục tiêu định giá của chúng tôi, chúng tôi có thể thấy rằng tiêu đề này cần phải là H2 và phụ đề này cần phải là một thành + +337 +00:26:26,740 --> 00:26:28,120 +phần đoạn văn. + +338 +00:26:28,120 --> 00:26:35,470 +Vì vậy, hãy đi vào phần của chúng tôi và đảm bảo rằng đó là trường hợp, bởi vì khi chúng tôi sao chép nó, nó thực + +339 +00:26:35,470 --> 00:26:37,240 +sự cho chúng tôi H1. + +340 +00:26:37,270 --> 00:26:42,790 +Bây giờ kiểu dáng sẽ không thay đổi vì nó thực sự xuất phát từ màn hình hiển thị cho lớp học. + +341 +00:26:42,790 --> 00:26:49,660 +Vì vậy, bạn sẽ không thấy kích thước thay đổi nhiều hoặc bảng màu vì nó thực sự không phụ + +342 +00:26:49,660 --> 00:26:51,760 +thuộc vào phần tử HTML. + +343 +00:26:51,760 --> 00:26:57,400 +Và điều này xảy ra rất thường xuyên với bootstrap, vì vậy chúng tôi có thể điều chỉnh điều đó khá dễ dàng. + +344 +00:26:57,490 --> 00:27:01,870 +Và bây giờ chúng ta đã sẵn sàng cho phần cuối cùng, đó là phần chân trang. + +345 +00:27:01,870 --> 00:27:08,920 +Vì vậy, hãy tự tìm cho mình các đoạn trích ở chân trang và tìm một đoạn giống với đoạn mà chúng ta muốn + +346 +00:27:08,920 --> 00:27:14,260 +hoặc một đoạn giống với đoạn trong ví dụ, chính là đoạn này ngay tại đây. + +347 +00:27:14,260 --> 00:27:21,220 +Và hãy tìm vùng chứa mà chúng ta có thể sao chép và đưa vào phần chân trang của mình. + +348 +00:27:21,940 --> 00:27:29,560 +Vì vậy, ngay từ đầu, chúng ta có thể thấy phần chân trang của mình hiển thị và tất cả những gì chúng ta cần làm là điều chỉnh nó cho phù hợp với thiết + +349 +00:27:29,560 --> 00:27:30,460 +kế của mình. + +350 +00:27:30,700 --> 00:27:35,950 +Đầu tiên, bạn sẽ nhận thấy có một khu vực mà bạn thực sự không thể nhìn thấy, nhưng khi bạn di chuột qua khu vực đó, có vẻ như khu + +351 +00:27:35,950 --> 00:27:37,120 +vực này có thể nhấp được. + +352 +00:27:37,120 --> 00:27:44,080 +Và nếu chúng tôi tham khảo mã của mình, bạn có thể thấy đây thực sự là một liên kết liên kết đến logo bootstrap. + +353 +00:27:44,080 --> 00:27:46,810 +Vì vậy, hãy tiếp tục và xóa nó. + +354 +00:27:46,810 --> 00:27:54,880 +Nhưng hãy thay đổi lớp đoạn này thành bản quyền và sau đó là tên công ty của chúng tôi, Tin Dog. + +355 +00:27:55,030 --> 00:28:01,030 +Và tôi sẽ để nguyên các liên kết này vì tôi không biết, có thể trong tương lai bạn sẽ muốn sử dụng + +356 +00:28:01,030 --> 00:28:05,440 +trang web này và đưa vào một số liên kết khác đến các phần khác nhau. + +357 +00:28:05,440 --> 00:28:11,230 +Nhưng hiện tại, nó có vẻ ít nhiều đúng với phong cách mà chúng tôi muốn có trên một trang web khởi + +358 +00:28:11,230 --> 00:28:11,950 +nghiệp. + +359 +00:28:11,950 --> 00:28:16,240 +Vì vậy, hãy để điều đó một mình, nhưng hãy loại bỏ đường biên giới này ở đây. + +360 +00:28:16,240 --> 00:28:18,220 +Và đường viền này đến từ chân trang. + +361 +00:28:18,220 --> 00:28:20,530 +Vì vậy, nên có một gợi ý ở đây. + +362 +00:28:20,530 --> 00:28:26,590 +Nếu chúng ta nhìn vào phần tử chân trang, bạn có thể thấy có lớp trên cùng của đường viền, một lần nữa xuất phát từ bootstrap, + +363 +00:28:26,590 --> 00:28:31,750 +nhưng đó là một cách thực sự đơn giản để thêm một số đường viền vào trên cùng bên trái hoặc bên phải. + +364 +00:28:31,750 --> 00:28:34,630 +Nhưng một khi chúng tôi xóa nó và điều đó hoàn toàn biến mất. + +365 +00:28:34,630 --> 00:28:40,990 +Vì vậy, điều cuối cùng chúng ta cần làm chỉ là thêm nền gradient đó vào khu vực chân trang và thế là chúng ta đã hoàn + +366 +00:28:40,990 --> 00:28:42,430 +thành khá nhiều việc. + +367 +00:28:42,430 --> 00:28:51,240 +Vì vậy, hãy lấy phần chân trang đó và thêm nền gradient của lớp và bây giờ hãy nhấn lưu. + +368 +00:28:51,240 --> 00:28:58,260 +Và chúng ta sẽ thấy rằng chúng ta có trang web gần như giống với kết quả cuối cùng. + +369 +00:28:58,410 --> 00:29:03,840 +Điều duy nhất mà chúng ta cần làm bây giờ là loại bỏ một chút không gian ở phía dưới. + +370 +00:29:03,960 --> 00:29:07,950 +Và thực tế là nó có màu trắng sẽ cho bạn gợi ý về nó là gì. + +371 +00:29:08,910 --> 00:29:17,430 +Nếu chúng tôi chọn phần chân trang của mình và chúng tôi đi vào phần đó, hãy nhìn vào bên trong vùng chứa, đến một lúc nào đó, phần di chuột + +372 +00:29:17,430 --> 00:29:21,180 +của chúng tôi sẽ cho chúng tôi biết phần lề đó đến từ đâu. + +373 +00:29:21,180 --> 00:29:26,220 +Và ngay tại đây, bạn có thể thấy hộp màu cam hiển thị lề đó ở dưới cùng. + +374 +00:29:26,220 --> 00:29:30,780 +Vì vậy, nếu chúng ta chọn nó, chúng ta sẽ thấy có một số lớp lề được áp dụng. + +375 +00:29:30,780 --> 00:29:36,600 +Vì vậy, có một phần trên cùng của lề, mà tôi nghĩ có lẽ chúng ta nên giữ lại vì nó tạo thêm khoảng cách tốt + +376 +00:29:36,600 --> 00:29:38,130 +giữa các phần khác nhau. + +377 +00:29:38,130 --> 00:29:44,100 +Nhưng đáy lề có lẽ chúng ta có thể loại bỏ để chúng ta không có khoảng trắng ở dưới đó. + +378 +00:29:44,100 --> 00:29:45,570 +Vì vậy, hãy tìm cái này. + +379 +00:29:45,990 --> 00:29:55,050 +Y-5 trong phần tử chân trang của chúng ta và nó ở ngay đây và hãy thay đổi nó thay vì y thành chỉ có nó + +380 +00:29:55,050 --> 00:29:56,340 +ở trên cùng. + +381 +00:29:56,340 --> 00:29:59,220 +Và bây giờ hãy nhấn, lưu và làm mới. + +382 +00:29:59,220 --> 00:30:04,470 +Và bạn có thể thấy chúng tôi đã hoàn thành thiết kế cho trang web của chúng tôi. + +383 +00:30:04,890 --> 00:30:06,720 +Trong vòng chưa đầy nửa giờ. + +384 +00:30:06,720 --> 00:30:14,760 +Chúng tôi đã quản lý để xây dựng một trang web cực kỳ phức tạp và đẹp mắt cho công ty khởi nghiệp chó thiếc của chúng tôi. + +385 +00:30:14,790 --> 00:30:21,090 +Tôi hy vọng khách hàng của chúng tôi sẽ hài lòng vì chúng tôi đã tạo ra trang web trông cực kỳ hiện đại, + +386 +00:30:21,090 --> 00:30:28,170 +tuyệt vời này cho họ và chúng tôi nên hài lòng vì chúng tôi chỉ mất rất ít thời gian để thực hiện bằng cách tận dụng + +387 +00:30:28,170 --> 00:30:34,980 +sức mạnh của các thành phần bootstrap và sử dụng các lớp trợ giúp khác nhau , tiện ích cũng như đoạn trích mà + +388 +00:30:34,980 --> 00:30:36,210 +chúng cung cấp. + +389 +00:30:36,420 --> 00:30:42,720 +Hy vọng rằng điều này cung cấp cho bạn cái nhìn sâu sắc về cách chúng ta có thể sử dụng bootstrap để tạo các trang web đẹp, phức tạp một cách + +390 +00:30:42,720 --> 00:30:43,560 +nhanh chóng. + +391 +00:30:43,560 --> 00:30:50,830 +Và bạn cũng thấy sự khác biệt giữa lưới CSS, Flexbox và Bootstrap đều tốt cho việc gì. + +392 +00:30:50,860 --> 00:30:58,330 +Tất cả chúng đều có những điểm mạnh và điểm yếu khác nhau và tôi nghĩ rằng bootstrap thực sự tốt cho việc loại bỏ một số + +393 +00:30:58,330 --> 00:31:03,220 +thành phần và tạo ra thứ gì đó trông cực kỳ hiện đại một cách rất nhanh chóng. + +394 +00:31:03,220 --> 00:31:08,980 +Trong khi đó Flexbox và Grid rất tuyệt khi bạn muốn bắt tay vào tạo một bố cục + +395 +00:31:08,980 --> 00:31:12,370 +rất, rất tùy chỉnh cho trang web của mình. + +396 +00:31:12,670 --> 00:31:15,130 +Rất tốt khi hoàn thành phần này. + +397 +00:31:15,130 --> 00:31:20,110 +Và trong phần tiếp theo, chúng ta có dự án Capstone cho CSS. + +398 +00:31:20,110 --> 00:31:22,660 +Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang phần tiếp theo. + diff --git a/part3/58 - Day 58 - Web Foundation Bootstrap/external-links.txt b/part3/58 - Day 58 - Web Foundation Bootstrap/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..47b680d313e1a1586e07db7e0a66c362b943364b --- /dev/null +++ b/part3/58 - Day 58 - Web Foundation Bootstrap/external-links.txt @@ -0,0 +1,3 @@ + +002 Flexbox-Check-free-preview-in-Web-Dev-course +https://www.udemy.com/course/the-complete-web-development-bootcamp/#overview diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/001 Day 59 Goals What you'll make by the end of today.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/001 Day 59 Goals What you'll make by the end of today.html new file mode 100644 index 0000000000000000000000000000000000000000..78fd9fbb36898d74a51b7e4118e23a8f8b48d6d8 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/001 Day 59 Goals What you'll make by the end of today.html @@ -0,0 +1 @@ +

Blog upgrade

Previously we've built a simple blog with simple CSS styling. It had no fancy animations and was not mobile responsive. Now that we've learnt all about Bootstrap and how much time it can save us, we're going to upgrade our blog with the power of Bootstrap.

The best part? We don't even have to write the Bootstrap code.


Bootstrap Templates

On the internet, there are hundreds of thousands of free Bootstrap templates. Beautifully designed websites using Bootstrap that are ready to go. All we need is to understand how Bootstrap works (Day 58) and then we can simply customise these beautiful websites for our own purposes.

e.g.

https://bootstrapmade.com/

https://getbootstrap.com/docs/5.0/examples/

https://www.creative-tim.com/bootstrap-themes/free


What you Will Build

By the end of today, you will build a blog website with these features:



\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/002 Step 1 - Download the starting project.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/002 Step 1 - Download the starting project.html new file mode 100644 index 0000000000000000000000000000000000000000..88cb70458b2acd7b5cb34a95d7414b982d04cc23 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/002 Step 1 - Download the starting project.html @@ -0,0 +1 @@ +

1. Head over to Start Bootstrap's website and download the Clean Blog Template:

https://startbootstrap.com/previews/clean-blog/

2. Unzip the downloaded file and rename the folder to "upgraded blog"

3. Open the project folder in PyCharm and:

A. Create the static and templates folders.

B. Move the files in the project to the correct folders (HTML files to templates and all folders to static).

C. Create a header.html and footer.html file and the all important main.py.

D. Check that your file structure now looks like this:

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/003 Step 2 - Get the home page to work.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/003 Step 2 - Get the home page to work.html new file mode 100644 index 0000000000000000000000000000000000000000..4171df1c8fa473279c31b5c79b2817ad51675b35 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/003 Step 2 - Get the home page to work.html @@ -0,0 +1 @@ +

Use what you have learnt about Flask, get the home page to render when you go to

http://localhost:5000

in your browser.

e.g.

Note: Don't worry about the styling just yet. We'll fix that in the next step.


SOLUTION

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/004 Step 3 - Fix the header and footer.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/004 Step 3 - Fix the header and footer.html new file mode 100644 index 0000000000000000000000000000000000000000..879f6ebe703f9693c235859cf9bd4d19ab4bb274 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/004 Step 3 - Fix the header and footer.html @@ -0,0 +1 @@ +

Notice that at the moment the styling is completely missing. This is because the static files (CSS/JS/images etc.) are served up by our server and they are no longer at the locations specified in the header.

1. Fix the header in index.html so that the styling and bootstrap all appear. When you reload the website, it should look like this:

Note: it's usually a good idea to build a dynamic url for the static resources instead of just pointing to the static folder. See the documentation here:

https://flask.palletsprojects.com/en/2.3.x/quickstart/#static-files


2. Fix the footer resources so that the Javascript works. You can verify this by checking that when you scroll the navigation bar becomes sticky at the top and changes background color e.g.:


3. Make the home-bg.jpg background image re-appear by fixing the <header> section. Afterwards your page should look like this:


SOLUTION

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/005 Step 4 - Using Jinja Include for Render Templates.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/005 Step 4 - Using Jinja Include for Render Templates.html new file mode 100644 index 0000000000000000000000000000000000000000..369abb7c4cf024479dff7d168b6b2958ef52b928 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/005 Step 4 - Using Jinja Include for Render Templates.html @@ -0,0 +1 @@ +

The reason why Jinja Templates are called templates is because it makes it easier to create HTML pages by templating. Instead of re-writing the same header/navigation bar/footer you can just create a header and footer template which can then be applied to all web pages in your website.

e.g.

{% include "header.html" %}

Changeable part of your webpage. e.g. the body of the page.

{% include "footer.html" %}


Then when the website is rendered, the header.html and footer.html gets inserted where the {% include %} specifies.

Using the documentation from Jinja: https://jinja.palletsprojects.com/en/3.0.x/templates/#include

1. Remove the <head> & navigation code from index.html and place it in the header.html file.

2. Remove the <footer> from index.html and place it in the footer.html file.

3. Using the above documentation, use include to make the website still function exactly the same as before.


SOLUTION

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/006 Step 5 - Make the About and Contact Pages Work.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/006 Step 5 - Make the About and Contact Pages Work.html new file mode 100644 index 0000000000000000000000000000000000000000..459bfed905964ee9f2479a58a525affeb6f45982 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/006 Step 5 - Make the About and Contact Pages Work.html @@ -0,0 +1 @@ +

Now that you've seen how you can replace the repeatable parts of your website (header/footer), we're going to make the rest of the pages work.

1. In the header.html, delete the navigation bar item that points to the "Sample Post":

2. Modify the href using Flask's url_for so that the navigation bar correctly points to the About and Contact pages.


3. Update main.py so that when you click on the About link in the navigation bar it goes to the About page and likewise with the Contact page.


4. Update the about.html and contact.html files to use the header and footer. e.g.


HINT: Make sure that the anchor tags in the header.html are correctly pointing to the relevant routes in your server.


5. See if you can make the static images work on the About and Contact pages.

e.g.

HINT: Look at the <header> style attribute. Remember that the images are static files located in the img folder.


SOLUTION

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/007 Step 6 - Fetch and render the blog posts from an API.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/007 Step 6 - Fetch and render the blog posts from an API.html new file mode 100644 index 0000000000000000000000000000000000000000..60352e7b25464160c528f96ee843c77dab20ed3a --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/007 Step 6 - Fetch and render the blog posts from an API.html @@ -0,0 +1 @@ +

Just like our last blog website, we're going to save you the hassle of writing all your blog posts. Instead, you're going to get the posts from our API on npoint.


1. Create your own JSON bin with npoint.io.

Use the attached example blog data to create your own endpoint using npoint.io.

Here's a sample document: https://www.npoint.io/docs/674f5423f73deab1e9a7

Your endpoint should be formatted something like this: https://api.npoint.io/674f5423f73deab1e9a7

2. In main.py get hold of the JSON data at the above API endpoint.

3. Use the data from the API to render the home page, replacing the title, subtitle, author and dates of each blog post with the data from the API. (Add fields as necessary to your document.)

HINT 1: Instead of using a custom class, you can simply use Jinja variables to use the dot notation instead of square brackets. See: https://jinja.palletsprojects.com/en/3.0.x/templates/#variables

HINT 2: You'll need to use a for loop in the Jinja template, which we've done before. See the documentation here:

https://jinja.palletsprojects.com/en/3.0.x/templates/#for


This is what you're aiming for:

NOTE: The background image behind the header is this image that I found from Unsplash, feel free to go to the website to find your own.

https://unsplash.com/


SOLUTION

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/007 blog-data.txt b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/007 blog-data.txt new file mode 100644 index 0000000000000000000000000000000000000000..981dfb09a2b158bd0d607bb2d3f0a179733b462b --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/007 blog-data.txt @@ -0,0 +1,20 @@ +[ + { + "id": 1, + "title": "The Life of Cactus", + "subtitle": "Who knew that cacti lived such interesting lives.", + "body": "Nori grape silver beet broccoli kombu beet greens fava bean potato quandong celery. Bunya nuts black-eyed pea prairie turnip leek lentil turnip greens parsnip. Sea lettuce lettuce water chestnut eggplant winter purslane fennel azuki bean earthnut pea sierra leone bologi leek soko chicory celtuce parsley jícama salsify." + }, + { + "id": 2, + "title": "Top 15 Things to do When You are Bored", + "subtitle": "Are you bored? Don't know what to do? Try these top 15 activities.", + "body": "Chase ball of string eat plants, meow, and throw up because I ate plants going to catch the red dot today going to catch the red dot today. I could pee on this if I had the energy. Chew iPad power cord steal the warm chair right after you get up for purr for no reason leave hair everywhere, decide to want nothing to do with my owner today." + }, + { + "id": 3, + "title": "Introduction to Intermittent Fasting", + "subtitle": "Learn about the newest health craze.", + "body": "Cupcake ipsum dolor. Sit amet marshmallow topping cheesecake muffin. Halvah croissant candy canes bonbon candy. Apple pie jelly beans topping carrot cake danish tart cake cheesecake. Muffin danish chocolate soufflé pastry icing bonbon oat cake. Powder cake jujubes oat cake. Lemon drops tootsie roll marshmallow halvah carrot cake." + } +] \ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 Course-Fixes-Report-an-Issue.url b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 Step 7 - Rendering Individual Posts.html b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 Step 7 - Rendering Individual Posts.html new file mode 100644 index 0000000000000000000000000000000000000000..5922f34c5e25d0626a1af1370b49e14bb998a8a2 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 Step 7 - Rendering Individual Posts.html @@ -0,0 +1 @@ +

The final step is to render each individual post in the post.html page. When a user clicks on a particular post title on the home page (index.html), we should take them to the post.html page where the title/subtitle/image/date/author/body of the post is shown.

You've done this in the previous blog website. See if you can remember how to do it. If you can't remember, look back at the code from Day 55 and see if you can adapt it to this project. After all, programming is just tinkering, it's not an exam, you don't have to memorise everything.

This is what you're aiming for, (this is when I clicked on the cactus post on the home page):


SOLUTION

\ No newline at end of file diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 day-59-upgraded-blog-end.zip b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 day-59-upgraded-blog-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..d6a1bad8046389ba70b76bdaf8ce6aa57c76d0cf --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/008 day-59-upgraded-blog-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbfc4fff44e0e2423b7350ae494d70957f146ec26e5ff0b201181eaa0b6c8631 +size 1711212 diff --git a/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/external-links.txt b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..39062d29c9524ecd0772bf65b1a8c539b26536d7 --- /dev/null +++ b/part3/59 - Day 59 - Advanced - Blog Capstone Project Part 2 - Adding Styling/external-links.txt @@ -0,0 +1,3 @@ + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/001 Day 60 goals - Make the Contact Form Work.html b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/001 Day 60 goals - Make the Contact Form Work.html new file mode 100644 index 0000000000000000000000000000000000000000..35e137860f098d65bd2552dded30ed8a34dd8389 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/001 Day 60 goals - Make the Contact Form Work.html @@ -0,0 +1 @@ +

Contact Form

Yesterday, we built an upgraded version of our blog website that uses Bootstrap for styling. The only part of the website that doesn't work is the contact form on the Contact Page. This is because we need to learn about submitting HTML forms and catching the submitted data in our Flask server.


HTML Forms in Flask

So the goal for today is to understand how HTML forms are submitted and how to use the data from the form to actually send an email to ourselves with the data submitted by the user.

e.g.

Result:


\ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/002 HTML Forms Revision - Creating a Form from Scratch.html b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/002 HTML Forms Revision - Creating a Form from Scratch.html new file mode 100644 index 0000000000000000000000000000000000000000..5ffaa333f8e63e748b8e9fb1ad750d0d0e553db5 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/002 HTML Forms Revision - Creating a Form from Scratch.html @@ -0,0 +1 @@ +

1. Create a new PyCharm Project called html-forms. It should contain a main.py, and an index.html in the templates folder.


2. Create a new Flask application and serve the index.html page. Add an <h1> to the index.html so that you can tell if it's working.


3. CHALLENGE: Create a HTML Form in index.html so that when rendered as a webpage, this is what you see:

SOLUTION:

https://gist.github.com/TheMuellenator/c6177ac108650fdc8246d29ff0fab284

\ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/003 Handle POST Requests with Flask Servers.html b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/003 Handle POST Requests with Flask Servers.html new file mode 100644 index 0000000000000000000000000000000000000000..16e6485d7e5138f2ba73c15be29d7de2a8b9f022 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/003 Handle POST Requests with Flask Servers.html @@ -0,0 +1 @@ +

Now that we've created our form, the next step is to get it to work. We need our Flask server to be able to receive the data entered by the user.

At the moment when you fill out the form and press "Ok", nothing happens.

In order for it to send the form data, we have to change our HTML form. It needs to have an action and method.


1. CHALLENGE: See if you can use the documentation below to figure out how to make our HTML form submit a "POST" request to the path "/login".

https://www.w3schools.com/tags/att_form_method.asp

https://www.w3schools.com/tags/att_form_action.asp


SOLUTION: https://gist.github.com/angelabauer/889ac7cfdfed5cfeb79559f41c9c6a07


2. Once the form is submitted, we also need to catch this POST request in our server. To do this we first need to give each input in our form a name attribute.


3. Now we can create a decorator in our main.py that will trigger a method when it receives a POST request:

See what happens when you return a string.

Notice that the methods parameter accepts a list, so you can have multiple methods targeted by one route. e.g.

@app.route("/contact", methods=["GET", "POST"]

More on this in the documentation here: https://flask.palletsprojects.com/en/2.3.x/quickstart/#http-methods


SOLUTION: https://gist.github.com/TheMuellenator/98b340b08ea8ed51b7f04ccf254a86e7


4. Flask has a method called request (don't confuse this with the requests module) which allows us to tap into the parameters of the request that was made to our server.

DIFFICULT CHALLENGE: See if you can use the Flask documentation below to figure out how to get hold of the name and password that was entered into the form and send it back to the client as a <h1>. e.g.:

Documentation:

https://flask.palletsprojects.com/en/2.3.x/quickstart/#the-request-object

HINT:

https://stackoverflow.com/questions/11556958/sending-data-from-html-form-to-a-python-script-in-flask

SOLUTION in the next lesson.

\ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/004 POST Requests in Flask Solution.html b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/004 POST Requests in Flask Solution.html new file mode 100644 index 0000000000000000000000000000000000000000..70492753569ea7d6397960156bf5b8d189adad84 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/004 POST Requests in Flask Solution.html @@ -0,0 +1 @@ +

The Flask Request Object

To complete the challenge, we had to tap into the request object. The Flask documentation was key in solving this challenge.


SOLUTION Code:

https://gist.github.com/angelabauer/045264ca6ad168b986f6687ee1368078


SOLUTION Walkthrough:


NOTE: The action attribute of the form can be set to "/login" e.g.

<form action="/login" method="post">

or it can be dynamically generated with url_for e.g.

<form action="{{ url_for('receive_data') }}" method="post">

Depending on where your server is hosted, the "/login" path may change. So it's usually a better idea to use url_for to dynamically generate the url for a particular function in your Flask server.

\ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/005 Getting the Contact Form to Work.html b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/005 Getting the Contact Form to Work.html new file mode 100644 index 0000000000000000000000000000000000000000..b3178f9a0b226dffa97c03ce4a45743e7e82ff55 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/005 Getting the Contact Form to Work.html @@ -0,0 +1 @@ +

Now that we've seen how to get hold of the data entered into a form from our Flask server, it's time to apply this knowledge to our previous blog website.

1. Download the starting code from this lesson's resources. This is the same as the ending code for Day 59 with a small difference: the contact.html  has been simplified to make it easier to link the html form to your main.py. 


2. Add a "/form-entry" route in main.py to receive data from the form:

3. CHALLENGE: Update the code in contact.html and main.py so that you print the information the user has entered into the form and return a <h1> that says "Successfully sent your message". e.g.

SOLUTION


4. CHALLENGE: Combine the /contact route with /form-entry so that they are both under the route "/contact" but depending on which method (GET/POST) that triggered the route, handle it appropriately.

HINT 1: You'll need to modify both the action in the contact.html and your main.py

HINT 2: You can use request.method to check which method triggered the route.

https://flask.palletsprojects.com/en/2.3.x/quickstart/#http-methods

This is the result you're aiming for:

SOLUTION


5. CHALLENGE: Instead of returning a <h1> that says "Successfully sent message", update the contact.html file so that the <h1> on the contact.html file becomes "Successfully sent message".

HINT: https://jinja.palletsprojects.com/en/3.0.x/templates/#if

This is what you're aiming for:

SOLUTION

\ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/005 day-60-starting-files-blog-with-contact-form.zip b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/005 day-60-starting-files-blog-with-contact-form.zip new file mode 100644 index 0000000000000000000000000000000000000000..a0dc9b550ffc213dddd0cdf0144af0ac0f7b91f1 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/005 day-60-starting-files-blog-with-contact-form.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0beecd3bf5f72aebdf75021dbd1181de16ffc51cae58d2fc8d36f4d0b718927c +size 1711267 diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 Course-Fixes-Report-an-Issue.url b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 Sending Email with smtplib.html b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 Sending Email with smtplib.html new file mode 100644 index 0000000000000000000000000000000000000000..2b816a3ffa05a4e2ac070ad69202d8c30327bc44 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 Sending Email with smtplib.html @@ -0,0 +1 @@ +

We've learnt how to send email using smtplib already (e.g. Day 32), let's use this knowledge to make the contact form complete and actually send us (website owner) an email when a user is trying to get in touch.

You might need to review some of the lessons on smtplib from Day 32.

This is what you're aiming for:

SOLUTION:

https://gist.github.com/angelabauer/6e9dec2b75b3d6b4b5f2feed011a0d13


\ No newline at end of file diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 day-60-blog-with-contact-form-end.zip b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 day-60-blog-with-contact-form-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..2d53daee4e6f8439a6491b31685be92120545e6a --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/006 day-60-blog-with-contact-form-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485ebd8b19856158b5e7e36b4c0017dae310b9fe634dad131055fc983d1278c9 +size 1711584 diff --git a/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/external-links.txt b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d06ef8c7be4821826fa11d8509a0c4576a8e1899 --- /dev/null +++ b/part3/60 - Day 60 - Advanced - Make POST Requests with Flask and HTML Forms/external-links.txt @@ -0,0 +1,3 @@ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/001 Day 61 Goals Building Advanced Forms.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/001 Day 61 Goals Building Advanced Forms.html new file mode 100644 index 0000000000000000000000000000000000000000..04a291dcf5d6d5d4f8eb9b5bffd89fb50cccd990 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/001 Day 61 Goals Building Advanced Forms.html @@ -0,0 +1 @@ +

Yesterday we saw how we could make HTML forms work with our Flask server and get hold of the data that a user enters into the form. Today, we're going to improve on that, we're going to build forms using a Flask extension called Flask-WTF. It has a number of benefits over the simple HTML Form. e.g.

Flask developers will usually choose Flask-WTF to create forms in their websites. However, in the wild, you might also see projects that are built with HTML Forms. So it's important to understand how both of them work.


Secrets

By the end of today, we will build a website that holds some secrets. Only with the right username and password can you access the page with our secrets.

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/002 Installing Flask-WTF.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/002 Installing Flask-WTF.html new file mode 100644 index 0000000000000000000000000000000000000000..dd501a050c9aaf9a9c3134dd0910211681ed0729 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/002 Installing Flask-WTF.html @@ -0,0 +1 @@ +

We've spoken so much about this fancy form library - WTForms, let's see it in action and create a form using it in our Flask application.


1. Download the starting .zip files from this lessons resources.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.


This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


Installing packages and the requirements.txt

The requirements.txt file is a file where you can specify all the dependencies (the installed packages that your project depends on) and their versions. This means that you can share your project without all the installed packages, making it a lot more lightweight. When someone downloads your project (like you have done here), the requirements.txt file tells their code editor which packages need to be installed. Read more on this here.


To install a particular package you can use the Terminal. To install Flask-WTF you would use the pip install command.

pip install Flask-WTF

*pip installs are always case sensitive!


You can install all the required packages listed in the requirements.txt file for the project at the same time: 

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt


Challenge

Create the login route which renders the login.html file.

Run the app to make sure it works. This is what you should see when you run it:

SOLUTION



\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/002 day-61-starting-files-flask-secrets.zip b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/002 day-61-starting-files-flask-secrets.zip new file mode 100644 index 0000000000000000000000000000000000000000..01aef0b93dc9fdfa00ebdd26abcf514f6919c3ad --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/002 day-61-starting-files-flask-secrets.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2056bd47447909593d0c33a25f2c1cc26f28ccbcd8d2c1e5b0c3bbfd41030b47 +size 1925 diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/003 Creating Forms with Flask-WTF.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/003 Creating Forms with Flask-WTF.html new file mode 100644 index 0000000000000000000000000000000000000000..7a48e08c4741f315028b8ba09e282e9eed99c346 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/003 Creating Forms with Flask-WTF.html @@ -0,0 +1 @@ +

CHALLENGE: Read Flask-WTF Quickstart - Creating Forms and use it to figure out how to create a simple login form.

SPECIFICATIONS:

HINT: If you want to add csrf protection, you will need to add the following code in your login.html:

{{ form.csrf_token }}

and you will need to create a secret key in your main.py, which will be used to generate the csrf_token. e.g.

app.secret_key = "some secret string"


This is what you're aiming for:

SOLUTION:

https://gist.github.com/angelabauer/162f56578b9193090963a0691c826790

NOTE: in order to complete this challenge, you will need a good grasp of Python Classes and Objects/Inheritance, we've already covered this on day 16. If you find the code in the documentation hard to understand, it might be a good time for a recap.

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/004 Code Improvements for Our WTForms.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/004 Code Improvements for Our WTForms.html new file mode 100644 index 0000000000000000000000000000000000000000..c02f8d5d3b40c84ec1e8ad03cc6422aa06a42bf5 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/004 Code Improvements for Our WTForms.html @@ -0,0 +1 @@ +

A Few Code Improvements

The solution code in the previous lesson is created by following the Flask-WTF Quickstart. This is what we think most students should be able to write after reading the Quickstart (and 60 days of Python under their belts). However, if you read the WTForms documentation in its entirety, you'll realise that we can improve the code we wrote.


1. We can change the password input to use a PasswordField from WTForms, this will obscure the text typed into the input.

There are plenty of other fields you can read about in the WTForms documentation:

https://wtforms.readthedocs.io/en/3.0.x/fields/#basic-fields


2. The arguments given when creating a StringField or PasswordField is for the label property of the form field. Even though the Quickstart doesn't add it, I prefer adding the keyword argument when it's not clear what the argument is for.

This is the label property in use in login.html when our form object is passed over.


3. You might have already done this, but in the Quickstart, they set the form action to "/", which is a static path. It's always a good idea to use dynamically built urls like this:


4. We can also better format the layout of the labels and inputs in our WTForms generated form by using normal HTML elements.

e.g.

This will result in the following layout:


5.  Finally, did you spot the SubmitField when you were looking at the documentation in Step 1 ? This can be used to replace the submit input/button.


This is the code we have after all 5 code improvements:

https://gist.github.com/angelabauer/e5b1a26a79888f67b490c1f53ed2496c

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/005 Adding Validation to Forms with Flask-WTF.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/005 Adding Validation to Forms with Flask-WTF.html new file mode 100644 index 0000000000000000000000000000000000000000..8b40e85fd98ac589325f13c6cfc29156fd74aa42 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/005 Adding Validation to Forms with Flask-WTF.html @@ -0,0 +1 @@ +

One of the biggest reasons why we would choose WTForms over HTML Forms is the built-in validation. Instead of us having to write our own validation code e.g. emails should contain a "@" and a "." to be valid or make sure that passwords are minimum of 8 characters, we can use all these validation rules straight out of the box from WTForms.


1. We can add validator objects when we create each field in our form. e.g.

Documentation

The validators parameter accepts a List of validator Objects. DataRequired makes the two fields required fields, so the user must type something, otherwise an error will be generated.

When a form is submitted, there may be a number of errors, so a List of errors can be generated and passed over to our form HTML as a property on the field which generated the error, e.g.

form.<field>.errors


2. We can tap into these errors and loop through them to show some text when an error appears.

Documentation


3. The final step is to tell our form to validate the user's entry when they hit submit. so we have to edit our route and make sure it is able to respond to POST requests and then to validate_on_submit().


If you tried to test your form at the moment, you will see that if you leave a field empty, it might give you a pop-up e.g. on Chrome:

This behaviour is not from our validator, in fact it's a built-in mechanism that varies from browser to browser. You'll see something different on Firefox or Safari. But If your user is running Internet Explorer, they won't see any validation.

4. In order to make sure that we are giving all users field validation, we have to switch off the browser validation, and we do that with an attribute on the form element called novalidate.

Now test your validation, it should give you a warning in red if you leave any field empty and click "Log In". e.g.


CHALLENGE: Using the documentation on WTForm validators, add Email validation to the email field so that you must type a valid email (with "@" and ".") otherwise you get an error. Also add Length validation to the password, so you must type at least 8 characters.

e.g. Email without "@" and 4 character password:

Hint: Pay close attention if the documentation mentions anything about installing an additional package to get email validation to work. If so, you may want to pip install that package through the Terminal.

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/006 Receiving Form Data with WTForms.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/006 Receiving Form Data with WTForms.html new file mode 100644 index 0000000000000000000000000000000000000000..d517ef267c3c00c1bdafd25a9ed2605456393acd --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/006 Receiving Form Data with WTForms.html @@ -0,0 +1 @@ +

We saw that when using a basic HTML form, we can use the request object from Flask to access the key-value pairs that were entered into the form when the POST request was made.

With WTForms, it's even easier to get hold of the form data. All you have to do is to tap into the

<form_object>.<form_field>.data

Documentation

e.g.

But one thing we should check before printing the field data is whether if the form has been submitted (POST request) or if it's GET request when the form is being rendered.

Previously we used

if request.method == "POST"

Now, we're simply going to check the return value of validate_on_submit() which will be True if validation was successful after the user submitted the form, or False if it failed.


CHALLENGE: Update the /login route in main.py so that if the form was submitted and validated and their credentials matched the following:

email: admin@email.com

password: 12345678

then show them the success.html page.

Otherwise show them the denied.html page

e.g.

SOLUTION:

https://gist.github.com/angelabauer/20ba20298ee26c957f36176291de9d69

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/007 Inheriting Templates Using Jinja2.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/007 Inheriting Templates Using Jinja2.html new file mode 100644 index 0000000000000000000000000000000000000000..030d275253f1e31b6de01e44a5074257656dfe90 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/007 Inheriting Templates Using Jinja2.html @@ -0,0 +1,34 @@ +

Previously, we saw that we can inject a header.html and footer.html using Jinja and the code might look something like this:

{% include "header.html" %}
+Web page content
+{% include "footer.html" %}


This is a really flexible way of using Jinja to Template a website. It means that if your header and footer stay the same then you can just insert them into all your webpages.


Template Inheritance

However, often you'll find that you actually want to use the same design template for your entire website, but you might need to change some code in your header or footer. In these cases, it's better to use Template Inheritance instead.

Template inheritance is similar to Class inheritance, you can take a parent template and extend its styling in your child web pages.


For example, if we create a base.html file that has the following code:

<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>{% block title %}{% endblock %}</title>
+</head>
+<body>
+    {% block content %}{% endblock %}
+</body>
+</html>

It has predefined areas (or blocks) where new content can be inserted by a child webpage inheriting from this template.

1. We could re-write the success.html page to inherit from this base.html template:

#1.
+{% extends "base.html" %}
+#2.
+{% block title %}Success{% endblock %}
+#3.
+{% block content %}
+   <div class="container">
+      <h1>Top Secret </h1>
+      <iframe src="https://giphy.com/embed/Ju7l5y9osyymQ" width="480" height="360" frameBorder="0" class="giphy-embed" allowFullScreen></iframe>
+      <p><a href="https://giphy.com/gifs/rick-astley-Ju7l5y9osyymQ">via GIPHY</a></p>
+   </div>
+{% endblock %}

#1. This line of code tells the templating engine (Jinja) to use "base.html" as the template for this page.

#2. This block inserts a custom title into the header of the template.

#3. This block provides the content of the website. The part that is going to vary between webpages.


2. CHALLENGE: Try doing the same thing for denied.html, making sure that it uses the base.html as the template and it has a custom title and content.

SOLUTION:

https://gist.github.com/angelabauer/aa7a7516bf02b1f0f1769dadaf4e6cf4


Super Blocks

When we inherit from Python classes, you often see super.init()

The super keyword refers to the parent that the child is inheriting from. e.g If Simba inherits from Mufasa, then Mufasa is the super.

When we are inheriting templates. Sometimes, there's some part of the template that we want to keep, but we also want to add to it. So we can use super blocks in this case.

3. Add the following code to your base.html:

<style>
+{% block styling %}
+body{
+    background: purple;
+}
+{% endblock %}
+</style>


I named this block "styling" but you can call it anything you want.

Just make sure that you close all blocks with {% endblock %}

Now if you reload your website, you should see that both the success page and the denied page will have a purple background. (We covered inline, internal and external styling in the CSS section of this course - Day 43).


So now you can see how easy it is to modify all web pages in your website if you use the same template. But what if on the denied page we also wanted to make the <h1> red? We would need to modify the internal styling in the <style> tag. But that code is in the base.html template. Luckily we have super blocks.


4. On the denied.html page, add a super block using {{ super() }}, this will inject all the code in the styling block to this child page. Then afterwards before the {% endblock %}, we can add some more styling to change the colour of the <h1>.

{% block styling %}
+   {{ super() }}
+   h1 {
+      color:red;
+   }
+{% endblock %}

5. Similar to what you've done with the other html files, using Jinja templating make the success.html file a child template of the base.html as well. 


SOLUTION: Gist with code from this lesson:

https://gist.github.com/angelabauer/9842d06ca3b5c1c6668bef0f7f0601cb

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/008 Using Bootstrap-Flask as an Inherited Template.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/008 Using Bootstrap-Flask as an Inherited Template.html new file mode 100644 index 0000000000000000000000000000000000000000..1f8f4eddb6f77df44d5469058b1bc74d7b2de8e8 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/008 Using Bootstrap-Flask as an Inherited Template.html @@ -0,0 +1 @@ +

There was a reason why we learnt about inherited templates! We need to improve the appearance of our website. At the moment it looks like it was born in the 90s.


Bootstrap-Flask

The way that we're going to quickly improve the appearance of our website is of course through that super useful tool we learnt about on Day 58 - Bootstrap. Previously we saw that we could simply include a link to the Bootstrap CSS code in the header of our website. But there's an even easier way. We can use the Bootstrap-Flask Python extension.

1. Install Bootstrap-Flask to your project using pip:

pip install bootstrap-flask


2. CHALLENGE: Delete the super block in your denied.html file and use the Bootstrap-Flask documentation to convert our denied.html, success.html, login.html and index.html to use Bootstrap as the template.

HINT 1: Follow the documentation to initialise bootstrap-flask in your main.py

HINT 2: Load the bootstrap css inside your base.html.


This is what your website should look like if you complete the challenge:


SOLUTION

\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 Bootstrap-Flask Supports WTForms.html b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 Bootstrap-Flask Supports WTForms.html new file mode 100644 index 0000000000000000000000000000000000000000..c92bc14e04fa28b43f8acb51b4a3ec8e8d398b90 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 Bootstrap-Flask Supports WTForms.html @@ -0,0 +1 @@ +

One of the main reasons why we're using Bootstrap-Flask in this project is because it has one of the most convenient methods for generating forms with WTForms.

Literally, in 1 line of code, you can create your form. It's as simple as:

{{ render_form(form) }}

What this line of code will do is generate all the labels, inputs, buttons, styling for your form just by taking the WTForm object that was passed to the template (form).

You can simply delete the entire <form> element.

Then, add a line to import the render_form() function from bootstrap-flask.

Finally, use the render_form() to generate your form.



Run your code and see the entire form laid out for you with zero effort. Also, check out the error messages from validation!


Now you might wonder, why did I put you through all that hassle to learn how to create a WTForm from scratch when I knew all along that you can just use the Bootstrap-Flask render_form()? Because everything is dandy as long as it works. This render_form macro is a black box. It's magic. Which is great, but what happens if your form breaks? What if it's not doing what you expect it to? How would you debug magic?


That's why it's so important to understand how things work under the hood. Once you understand it, you can take all the shortcuts.


You can download the completed project from this lesson's resources.


\ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 Course-Fixes-Report-an-Issue.url b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 day-61-flask-secrets-end.zip b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 day-61-flask-secrets-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..e35316003dfbe048942e2d6e09df9c41fee6270a --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/009 day-61-flask-secrets-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9fc6d20736fd45f3d9e0ec177a3653ade9d328fb44d7fa0b2d2e56d2c0ffd76 +size 2675 diff --git a/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/external-links.txt b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8d82232602470a1524bd2d87e669227ae554fea --- /dev/null +++ b/part3/61 - Day 61 - Advanced - Building Advanced Forms with Flask-WTForms/external-links.txt @@ -0,0 +1,3 @@ + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/001 Download the Starting Project.html b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/001 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..a506337c8c4bfa603e2a96afa6a6dffdda848e5a --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/001 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip files from this lessons resources.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.

This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File  -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt


5. Look around the project. You should see a .csv file with data on some of London's cafes.



\ No newline at end of file diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/001 day-62-starting-files-coffee-and-wifi.zip b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/001 day-62-starting-files-coffee-and-wifi.zip new file mode 100644 index 0000000000000000000000000000000000000000..4d9b511733e38765a8c21b2d3b651d48cb25d81d --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/001 day-62-starting-files-coffee-and-wifi.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb7a3c8cdc52a54098a75a3c5c9a8a305aec888864f8e987d12fa4f9620e9a1a +size 3564 diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/002 Look at the Desired Final Product.html b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/002 Look at the Desired Final Product.html new file mode 100644 index 0000000000000000000000000000000000000000..2f7364b42d2e7a5fcd09edd47816a90407e81770 --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/002 Look at the Desired Final Product.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 Check Off Each Requirement.html b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 Check Off Each Requirement.html new file mode 100644 index 0000000000000000000000000000000000000000..470d7bc49d05d9f48173ed558f5b79b01ce26304 --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 Check Off Each Requirement.html @@ -0,0 +1 @@ +

Now it's time to write some code. Look at the list of requirements below for this project. Just like a real client project, the front-end has already been built for you (If you have more time/want more practice with HTML/Bootstrap you can build the entire project from scratch, just create a new empty PyCharm project). But the main goal of today is to ensure that you are fully comfortable with Flask-WTF, Bootstrap-Flask, Bootstrap classes and do a bit of revision on csv manipulation.


Requirements

HINT: Think about adding the bootstrap blocks to the base.html and linking to the stylesheet.



HINT: All location links have the first 4 characters as "http".




HINT: https://flask-wtf.readthedocs.io/en/1.0.x/quickstart/

https://bootstrap-flask.readthedocs.io/en/stable/macros/#render-form


HINT: https://wtforms.readthedocs.io/en/2.3.x/validators/

How to switch off client-side (browser) validation with quick_forms: https://stackoverflow.com/a/61166621/10557313




As always remember that the learning happens when you're stuck and solve your problems. The learning doesn't happen in tutorials, it happens when you struggle and overcome your struggles. When you show your struggles who's boss!

So I recommend at least spending 1 hour on this project to write the code and debug. I know it can be frustrating when you feel like you've been stuck on step 1 for half an hour. You feel super unproductive and start questioning your abilities. Don't worry. This happens to the best of us. Just take a break, go for a walk, eat something and come back to the code. You'll be surprised how many breakthroughs you'll make this way.

Only check the solution when you've given the project enough time or if you want to check your solution against mine. (Remember there are multiple ways of doing the same thing, so the sample solution is not the only way to complete this project).


You can download the complete SOLUTION code in this lesson's resources.

\ No newline at end of file diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 Course-Fixes-Report-an-Issue.url b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 day-62-coffee-and-wifi-end.zip b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 day-62-coffee-and-wifi-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..5013d6803552b45ae76957898546245308af1376 --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/003 day-62-coffee-and-wifi-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72cae08bfe5b810c27865c9e20f30eceefb44da445d1602f4f29f00f03570f46 +size 3782 diff --git a/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/external-links.txt b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..6d4072e58452e895e3c13f2b10423ac7b7909701 --- /dev/null +++ b/part3/62 - Day 62 - Advanced - Flask, WTForms, Bootstrap and CSV - Coffee & Wifi Project/external-links.txt @@ -0,0 +1,3 @@ + +003 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/001 Day 63 Goals Creating a Virtual Bookshelf.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/001 Day 63 Goals Creating a Virtual Bookshelf.html new file mode 100644 index 0000000000000000000000000000000000000000..3e54e1f6c6ed3c70235b606a2fa2a090433726a9 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/001 Day 63 Goals Creating a Virtual Bookshelf.html @@ -0,0 +1 @@ +

Have you ever wanted to keep track of the books you have read and give each book a rating?

This is not a new concept and there are plenty of companies that have built something for exactly this purpose.

e.g. https://www.librarything.com/

But in order to do this, we will need to learn how to use a database. By the end of today, you will have learnt how to create an SQLite database and how to create, read, update and delete data in the database.

We'll also be hooking up our database with a Flask application to serve data whenever needed.

So buckle up and head over to the next lesson!

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/002 Download the Starting Project.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/002 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..3e4e0930334fcd4ce200905e343958049887fedc --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/002 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip file from this lesson's resources.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.

This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK.

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.

4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt



5. Look around the project. You should see some templating html files that we'll use with Jinja.

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/002 day-63-starting-files-library-project.zip b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/002 day-63-starting-files-library-project.zip new file mode 100644 index 0000000000000000000000000000000000000000..8d68072d2fb82f1bae851d477eb674ca77c22b9c --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/002 day-63-starting-files-library-project.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08145737784c9f8c034c97ebca8c6bc3c9a7cc14da51bd89ca0c85481b8fd678 +size 2113 diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/003 Make the Website Work.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/003 Make the Website Work.html new file mode 100644 index 0000000000000000000000000000000000000000..5004613064a4922d12fa7e07abd5b0844e4a09ad --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/003 Make the Website Work.html @@ -0,0 +1,7 @@ +

Code up the main.py index.html and add.html so that the following requirements are met:

CHALLENGE 1

When you head over to http://locahost:5000 (or whatever shows up as your URL when you run main.py), you should have a <h1> that says My Library and link <a> to Add New Book.

e.g.

SOLUTION 1


CHALLENGE 2

When you head over to the /add path, e.g. http://locahost:5000/add you should see a form like the one below:

SOLUTION 2


CHALLENGE 3

Make the form on the /add path work so that when you click "Add Book" the book details gets added as a dictionary to the list called all_books in main.py.

The data structure of all_books should be a List of Dictionary objects. e.g

all_books = [
+     {
+        "title": "Harry Potter",
+        "author": "J. K. Rowling",
+        "rating": 9,
+    }
+]

SOLUTION 3


CHALLENGE 4

Make the home page show each of the books in all_books as a list item <li> in an unordered list <ul> e.g.

SOLUTION 4


CHALLENGE 5

Make the home page show <p>Library is empty.</p> if there are no books. Also, make sure the "Add New Book" link works and takes the user to the /add page.

Hint: If there are no books then all_books = []

e.g.

SOLUTION 5

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/004 What Happens When You Refresh the Server.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/004 What Happens When You Refresh the Server.html new file mode 100644 index 0000000000000000000000000000000000000000..62b142b88ca974f0df1cb5ff143421a23e81ce77 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/004 What Happens When You Refresh the Server.html @@ -0,0 +1 @@ +

Add a few books to your website. You should see them listed on the home page.

Now, stop your server by hitting the stop button in PyCharm:

Then run your server again:

Go to your website and reload the home page. What do you see? What happened to your books?

This is because our books are currently stored in the List all_books, this variable gets re-initialised when we re-run main.py and all the data inside is lost.

If this happened to our user's data, they would not have much faith in our website.

In order to fix this, we need to learn about data persistence and how to work with databases in Flask applications.

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/005 SQLite Databases.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/005 SQLite Databases.html new file mode 100644 index 0000000000000000000000000000000000000000..4a01f2871f9c361659e7258684477399072970dd --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/005 SQLite Databases.html @@ -0,0 +1,4 @@ +

First, let's create a database. The most used database in the world is SQLite. It's so popular that it's included by default in all Python installations, so if you're creating a Python project, you've already got it installed. We're going to create an SQLite database to store our book data.


Let's briefly play with SQLite in a separate project before we turn our attention back to Library website.


1. Create a new project and inside the main.py file import the sqlite3 module.

import sqlite3

2. Now create a connection to a new database (if the database does not exist then it will be created).

db = sqlite3.connect("books-collection.db")

3. Run main.py and you should see a new file appear in PyCharm called books-collection.db

NOTE: Don't try to open the .db file in PyCharm, it won't work, I'll show you how to download the software to open these files a little later.

4. Next we need to create a cursor which will control our database.

cursor = db.cursor()

So a cursor is also known as the mouse or pointer. If we were working in Excel or Google Sheet, we would be using the cursor to add rows of data or edit/delete data, we also need a cursor to modify our SQLite database.

Creating Tables in our Database

Coming back to the Excel analogy, a single Excel file can contain many tables (sheets), each tab is a different table.

Similarly, our database can contain many tables.

5. Let's create one. Add this code below all the previous lines.

cursor.execute("CREATE TABLE books (id INTEGER PRIMARY KEY, title varchar(250) NOT NULL UNIQUE, author varchar(250) NOT NULL, rating FLOAT NOT NULL)")

Let's break this down.

cursor - We created this in step 4 and this is the mouse pointer in our database that is going to do all the work.

.execute() - This method will tell the cursor to execute an action. All actions in SQLite databases are expressed as SQL (Structured Query Language) commands. These are almost like English sentences with keywords written in ALL-CAPS. There are quite a few SQL commands. But don't worry, you don't have to memorise them.

CREATE TABLE -  This will create a new table in the database. The name of the table comes after this keyword.

Docs: https://www.w3schools.com/sql/sql_ref_create_table.asp

books -  This is the name that we've given the new table we're creating.

() -  The parts that come inside the parenthesis after CREATE TABLE books ( ) are going to be the fields in this table. Or you can imagine it as the Column headings in an Excel sheet.

id INTEGER PRIMARY KEY -  This is the first field, it's a field called "id" which is of data type INTEGER and it will be the PRIMARY KEY for this table. The primary key is the one piece of data that will uniquely identify this record in the table. e.g. The primary key of humans might be their passport number because no two people in the same country has the same passport number.

title varchar(250) NOT NULL UNIQUE -  This is the second field, it's called "title" and it accepts a variable-length string composed of characters. The 250 in brackets is the maximum length of the text. NOT NULL means it must have a value and cannot be left empty. UNIQUE means no two records in this table can have the same title.

author varchar(250) NOT NULL -  A field that accepts variable-length Strings up to 250 characters called author that cannot be left empty.

rating FLOAT NOT NULL -  A field that accepts FLOAT data type numbers, cannot be empty and the field is called rating.


6. Run the code from step 5 and there will be no noticeable changes. In order to view our database we need to download some specialised software.

Head over to the link below and download DB Browser for your operating system. (If you are on Windows go for the Standard Installer).

https://sqlitebrowser.org/dl/

7. Once you've downloaded and installed DB Browser, open it and click on "Open Database".

8. Navigate to your project location (it should in a folder called PyCharm Projects) and open the books-collection.db

Now you should see a table called books that contains 4 fields:

This is our database.

9. To add data to our table we can head back to main.py and write the following code:

cursor.execute("INSERT INTO books VALUES(1, 'Harry Potter', 'J. K. Rowling', '9.3')")
+db.commit()

This will create a new entry in our books table for the Harry Potter book and commit the changes to our database.

10. Now comment out the previous line of code where you are created the table called books. Otherwise, you'll get sqlite3.OperationalError: table books already exists.

11. Then close down the database in DB Browser by clicking Close Database. Otherwise, you'll get a warning about database locked when you work with the database in PyCharm.

12. Now run the code in main.py and re-open the database in DB Browser to see the updated books table. it should look like this:

SQL queries are very sensitive to typos. If instead of writing:

cursor.execute("INSERT INTO books VALUES(1, 'Harry Potter', 'J. K. Rowling', '9.3')")
+db.commit()

You wrote:

cursor.execute("INSERT INTO books VALUE(1, 'Harry Potter', 'J. K. Rowling', '9.3')")
+db.commit()

Then it won't work at all (can you even spot the difference in the code?)

Luckily, there are much better ways of working with SQLite in Python projects, we can use a tool called SQLAlchemy to write Python code instead of all these error-prone SQL commands. That's what we'll do in the next lesson!


Code Snippet from this lesson.

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/006 SQLAlchemy.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/006 SQLAlchemy.html new file mode 100644 index 0000000000000000000000000000000000000000..4e30035e2077d44abef891ba2969ceb8b6a66a33 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/006 SQLAlchemy.html @@ -0,0 +1,4 @@ +

As you've seen, writing SQL commands are complicated and error-prone. It would be much better if we could just write Python code and get the compiler to help us spot typos and errors in our code. That's why SQLAlchemy was created.

SQLAlchemy is defined as an ORM (Object Relational Mapping) library. This means that it's able to map the relationships in the database into Objects. Fields become Object properties. Tables can be defined as separate Classes and each row of data is a new Object. This will make more sense after we write some code and see how we can create a Database/Table/Row of data using SQLAlchemy.


Let's continue writing some more code in our separate project before we come back to the library of our favourite books.

1. Comment out all the existing code where we create an SQLite database directly using the sqlite3 module (or just close the separate project)

2. Install the required packages flask, SQLAlchemy, and flask_sqlalchemy from the requirements.txt. You can see the packages and their versions in the requirements.txt. PyCharm should have prompted you to install the packages in the requirements.txt file when you first opened the starting project:

That way you can be sure to grab the same version as in the tutorial.

If you don't see the packages, you can also always run the following command:

pip3 install -r requirements.txt


3. Import the Flask and SQLAlchemy classes from each.

from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
+from sqlalchemy import Integer, String, Float


4. CHALLENGE: Use the SQLAlchemy documentation to figure out how initialise the db object, define your model, and create the table.


Requirements:

id: 1

title: "Harry Potter"

author: "J. K. Rowling"

review: 9.3


HINT 1: The URL for your database should be "sqlite:///new-books-collection.db"

HINT 2: You can always check the database using DB Browser.


SOLUTION

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/007 CRUD Operations with SQLAlchemy.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/007 CRUD Operations with SQLAlchemy.html new file mode 100644 index 0000000000000000000000000000000000000000..985898180cce74432a102ddb98fd0d6f05b9aaaf --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/007 CRUD Operations with SQLAlchemy.html @@ -0,0 +1,39 @@ +

Hopefully, you figured out how to solve the challenge from the last lesson, as a review, here's a summary of some of the things we did:

Create a New Database

from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
+from sqlalchemy import Integer, String, Float
+
+app = Flask(__name__)
+
+class Base(DeclarativeBase):
+    pass
+
+app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///<name of database>.db"
+db = SQLAlchemy(model_class=Base)
+db.init_app(app)

As of flask-sqlalchemy version 3.1, you need to pass a subclass of DeclarativeBase to the constructor of the database.


Create a New Table

Next we define and create the model. What is the : used for? Explicitly declaring a variable type. Below we are explicitly saying that id is of type Mapped. SQLAlchemy uses the generic Mapped so that it can type check the data that will be stored in the database.

class Book(db.Model):
+    id: Mapped[int] = mapped_column(Integer, primary_key=True)
+    title: Mapped[str] = mapped_column(String(250), unique=True, nullable=False)
+    author: Mapped[str] = mapped_column(String(250), nullable=False)
+    rating: Mapped[float] = mapped_column(Float, nullable=False)
+
+with app.app_context():
+    db.create_all()


In addition to these things, the most crucial thing to figure out when working with any new database technology is how to CRUD data records.

Create

Read

Update

Delete


So, let's go through each of these using SQLite and SQLAlchemy:


Create A New Record

with app.app_context():
+    new_book = Book(id=1, title="Harry Potter", author="J. K. Rowling", rating=9.3)
+    db.session.add(new_book)
+    db.session.commit()

NOTE: When creating new records, the primary key fields is optional. you can also write:

new_book = Book(title="Harry Potter", author="J. K. Rowling", rating=9.3)

the id field will be auto-generated.


Read All Records

with app.app_context():
+    result = db.session.execute(db.select(Book).order_by(Book.title))
+    all_books = result.scalars()

To read all the records we first need to create a "query" to select things from the database. When we execute a query during a database session we get back the rows in the database (a Result object). We then use scalars() to get the individual elements rather than entire rows.



Read A Particular Record By Query

with app.app_context():
+    book = db.session.execute(db.select(Book).where(Book.title == "Harry Potter")).scalar()

To get a single element we can use scalar() instead of scalars().


Update A Particular Record By Query

with app.app_context():
+    book_to_update = db.session.execute(db.select(Book).where(Book.title == "Harry Potter")).scalar()
+    book_to_update.title = "Harry Potter and the Chamber of Secrets"
+    db.session.commit() 


Update A Record By PRIMARY KEY

book_id = 1
+with app.app_context():
+    book_to_update = db.session.execute(db.select(Book).where(Book.id == book_id)).scalar()
+    # or book_to_update = db.get_or_404(Book, book_id)  
+    book_to_update.title = "Harry Potter and the Goblet of Fire"
+    db.session.commit()  

Flask-SQLAlchemy also has some handy extra query methods like get_or_404() that we can use. Since Flask-SQLAlchemy version 3.0 the previous query methods like Book.query.get() have been deprecated


Delete A Particular Record By PRIMARY KEY

book_id = 1
+with app.app_context():
+    book_to_delete = db.session.execute(db.select(Book).where(Book.id == book_id)).scalar()
+    # or book_to_delete = db.get_or_404(Book, book_id)
+    db.session.delete(book_to_delete)
+    db.session.commit()

You can also delete by querying for a particular value e.g. by title or one of the other properties. Again, the get_or_404() method is quite handy.

\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 Build a SQLite Database into the Flask Website.html b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 Build a SQLite Database into the Flask Website.html new file mode 100644 index 0000000000000000000000000000000000000000..b63c149c60536f072a8abf887fa618f08b4ac545 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 Build a SQLite Database into the Flask Website.html @@ -0,0 +1 @@ +

Hopefully, you've played around with the code in the previous lesson and you're now able to perform CRUD operations as well as create tables and databases with SQLAlchemy.

Because now comes the final challenge.

You're going to build an SQLite database into the Flask Website we built at the beginning of today. So that any books added are stored in the database and you're also going to build in some extra features to take advantage of the full CRUD features of our database.


Website Requirements

SOLUTION


SOLUTION


HINT: You'll need to think about how to pass the book id as a parameter when you make the GET request to show the edit rating page. There are many ways you can do this. Here are some things that might help:

https://flask.palletsprojects.com/en/2.3.x/quickstart/#url-building

https://stackoverflow.com/questions/24892035/how-can-i-get-the-named-parameters-from-a-url-using-flask


SOLUTION


SOLUTION


You can also download the COMPLETED PROJECT from this lesson's resources.


\ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 Course-Fixes-Report-an-Issue.url b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 day-63-library-project-end.zip b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 day-63-library-project-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..2c69ac41dfa828cd38aab76d4277b949040dedc7 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/008 day-63-library-project-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e6d47163b24231422c899b3597ed1fe74c1f54b44dc5db53f59dc0eadc10408 +size 4374 diff --git a/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/external-links.txt b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..39062d29c9524ecd0772bf65b1a8c539b26536d7 --- /dev/null +++ b/part3/63 - Day 63 - Advanced - Databases and with SQLite and SQLAlchemy/external-links.txt @@ -0,0 +1,3 @@ + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/001 Day 64 Goals What We'll Build.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/001 Day 64 Goals What We'll Build.html new file mode 100644 index 0000000000000000000000000000000000000000..f07dfd0e1a5f8d8d73bcef4bdef10652b98e5d6a --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/001 Day 64 Goals What We'll Build.html @@ -0,0 +1 @@ +

Have you ever seen websites that compile lists of their top favourite movies of all time?

e.g.

British Film Institute: https://www2.bfi.org.uk/greatest-films-all-time

Empire: https://www.empireonline.com/movies/features/best-movies-2/

New York Times: https://www.imdb.com/list/ls058705802/

In fact, there are companies who have built their entire business around helping people build lists of their favourite things.

e.g.

https://www.listchallenges.com/

Today, we're going to build a website just like that using Flask/WTForms/SQLite/SQLAlchemy and more. It will allow us to create a beautiful website that lists our top 10 films of all time. As we watch more movies, we can always update our list and keep track of which movies to recommend people.

e.g.

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/002 Download the Starting Project.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/002 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..9bdedcf365ec49d36cf7cae46622672a430cf2d0 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/002 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip files from this lesson's resources.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.

This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt


5. Take a look around the project. You should see some templating html files that we can use with Jinja.

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/002 day-64-starting-files-top-movies.zip b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/002 day-64-starting-files-top-movies.zip new file mode 100644 index 0000000000000000000000000000000000000000..11e6962fa13f0dae20caee29a870b2517b918b32 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/002 day-64-starting-files-top-movies.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93f29edb94557730020713b80b660686a937526c4fd6b4ce3ecf07ad8680e619 +size 5689 diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/003 Requirement 1 - Be Able to View Movie List Items.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/003 Requirement 1 - Be Able to View Movie List Items.html new file mode 100644 index 0000000000000000000000000000000000000000..2a6459dbb041285146885afb8c13e84488545b31 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/003 Requirement 1 - Be Able to View Movie List Items.html @@ -0,0 +1,24 @@ +

This is what you're aiming for when you visit the home page:


In order to achieve this you will need to:

1. Create an SQLite database with SQLAlchemy. The database needs to contain a "Movie" Table. This table should contain the following fields:

id 
+title 
+year 
+description 
+rating 
+ranking
+review
+img_url

The title should be unique. That way you only get one entry per movie title in your ranking.

Remember, your database will be stored in the instance folder, so you'll have to create this folder.

2. Using code/DB Viewer, add a new entry to the database with the following values:

new_movie = Movie(
+    title="Phone Booth",
+    year=2002,
+    description="Publicist Stuart Shepard finds himself trapped in a phone booth, pinned down by an extortionist's sniper rifle. Unable to leave or receive outside help, Stuart's negotiation with the caller leads to a jaw-dropping climax.",
+    rating=7.3,
+    ranking=10,
+    review="My favourite character was the caller.",
+    img_url="https://image.tmdb.org/t/p/w500/tjrX2oWRCM3Tvarz38zlZM7Uc10.jpg"
+)

HINT: Be sure to remove the add entry code from step 2 after you have run the code once. Otherwise, you'll get this:

If you've set the movie title to be unique then our database will reject adding a movie with the same title more than once. Hence the "integrity" error.


SOLUTION. You won't see anything on the website just yet, but you can see your entry in the movies.db. 


3. Add second movie to your database. You can do this by re-running your python code using the snippet below.

second_movie = Movie(
+    title="Avatar The Way of Water",
+    year=2022,
+    description="Set more than a decade after the events of the first film, learn the story of the Sully family (Jake, Neytiri, and their kids), the trouble that follows them, the lengths they go to keep each other safe, the battles they fight to stay alive, and the tragedies they endure.",
+    rating=7.3,
+    ranking=9,
+    review="I liked the water.",
+    img_url="https://image.tmdb.org/t/p/w500/t6HIqrRAclMCA60NsSmeqe9RmNV.jpg"
+)


4. Make the code works so that each entry in the database is displayed correctly on the home page.

Notice how the different parts of the data are displayed:

Front:

Back:

Query the data using flask-sqlalchemy when you visit the home page.

HINT: Use .scalars() on the result from the database to get the elements in your database.

SOLUTION

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/004 Requirement 2 - Be Able to Edit a Movie's Rating and Review.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/004 Requirement 2 - Be Able to Edit a Movie's Rating and Review.html new file mode 100644 index 0000000000000000000000000000000000000000..4dfd8c34cc3b3d504fdd686520bfd58f40c259d6 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/004 Requirement 2 - Be Able to Edit a Movie's Rating and Review.html @@ -0,0 +1 @@ +

There is an edit button on the back of the movie card, you should be able to click on it and change your rating and review.

e.g.


1. Use what you have learnt about WTForms to create the RateMovieForm. Use this to create a Quick Form to be rendered in edit.html.

NOTE: You don't need to change the code in edit.html, it already has everything you need to render your Quick Form. This is so that students don't just create a simple HTML form.

If you've forgotten how to work with WTForms and Bootstrap-Flask, you can go back a few lessons and review the content there or just use the documentation:

https://bootstrap-flask.readthedocs.io/en/stable/macros/#render-form

https://wtforms.readthedocs.io/en/2.3.x/



2. Once the form is submitted and validated, add the updates to the corresponding movie entry in the database. Here's more documentation on SQLAchemy:

https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/queries/#queries-for-views


SOLUTION

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/005 Requirement 3 - Be Able to Delete Movies from the Database.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/005 Requirement 3 - Be Able to Delete Movies from the Database.html new file mode 100644 index 0000000000000000000000000000000000000000..757ef4c096594039b02f49c199bead01b8dd6079 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/005 Requirement 3 - Be Able to Delete Movies from the Database.html @@ -0,0 +1 @@ +

On the back of each movie card there is also a Delete button. Make this button work and allow the movie entry to be deleted from the database.

e.g.


SOLUTION

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/006 Requirement 4 - Be Able to Add New Movies Via the Add Page.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/006 Requirement 4 - Be Able to Add New Movies Via the Add Page.html new file mode 100644 index 0000000000000000000000000000000000000000..d28326f399ee7536b7efc03303549c5a5380c927 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/006 Requirement 4 - Be Able to Add New Movies Via the Add Page.html @@ -0,0 +1 @@ +

Previously, we added a new entry to our database using either a hard-coded piece of code or the DB Viewer. Now, we need to make the add page work for a user who can't do those things. We should be able to add any film and use an API to fetch the poster image, year of release and movie description.

1. Make the add page render when you click on the Add Movie button on the Home page. The Add page should render a WTF form that only contains 1 field - the title of the movie.

e.g.

SOLUTION


2. When the user types a movie title and clicks "Add Movie", your Flask server should receive the movie title. Next, you should use the requests library to make a request and search The Movie Database API for all the movies that match that title.

HINT 1: The "Try it out" tab on the API docs is particularly useful to see the structure of the request and the data you can expect to get back.

HINT 2: We covered how to make API requests a long time ago on Day 33, it might be worth reviewing the knowledge there if you get stuck.

e.g.


SOLUTION


3. Once the user selects a particular film from the select.html page, the id of the movie needs to be used to hit up another path in the Movie Database API, which will fetch all the data they have on that movie. e.g Poster image URLs.

https://developers.themoviedb.org/3/movies/get-movie-details

The data you get back from the API should be used to populate the database with the new entry. The properties you will populate are:

Once the entry is added, redirect to the home page and it should display the new movie as a card. Some data will be missing, that's ok.

e.g.


SOLUTION


4. Instead of redirecting to the home page after finding the correct film, redirect to the edit.html page. Because the parts of the movie entry that are missing are the rating and review. The form on the edit page will contain these two fields. Update the movie entry in the database with this new data.

e.g.


SOLUTION

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 Course-Fixes-Report-an-Issue.url b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 Requirement 5 - Be Able to Sort and Rank the Movies By Rating.html b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 Requirement 5 - Be Able to Sort and Rank the Movies By Rating.html new file mode 100644 index 0000000000000000000000000000000000000000..e1bfbba64ee8dc872adb646da10fd7cddb0c94ea --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 Requirement 5 - Be Able to Sort and Rank the Movies By Rating.html @@ -0,0 +1 @@ +

At the moment the front of the movie card says None in large letters. This is because we have not assigned a .ranking.


Instead, we want it to display the ranking of the movie according to our rating. For example if we gave The Matrix a rating of 9.2 and Spirited Away was rated 9.5 and those are the only 2 movies we've added then it should display:



If we add another movie and it had the highest rating among the movies, then it should be ranked according to it's rating.

e.g. If Matrix (9.3), Spirited Away (9.5), Parasite (9.9)


But if we edit the rating so that it becomes: Matrix (9.3), Spirited Away (9.5), Parasite (8.9)

Then this is what should happen:


You can assign a movie ranking when you navigate to the home route (/) .  You'll have to work with the objects (Result and ScalarResult) that you're getting back from your database query. See if you can find a way to turn your data into a python list.


HINT 1: Check out how order_by() is used in the example: https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/quickstart/#query-the-data

HINT 2: You don't need to change any code in index.html

HINT 3: You only need to change the code in the home() function.


SOLUTION


You can download the COMPLETED PROJECT from this lesson's resources.

\ No newline at end of file diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 day-64-top-movies-end.zip b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 day-64-top-movies-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..9567940b47da7521bcd3d9a52dcf0e8ac98ca52e --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/007 day-64-top-movies-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:502e254d7032b1729463bf2c748689eb7561fcdd9ec696482c4823a2e831f04a +size 8184 diff --git a/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/external-links.txt b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..70ced16a24185dee9471047f44702028968eea06 --- /dev/null +++ b/part3/64 - Day 64 - Advanced - My Top 10 Movies Website/external-links.txt @@ -0,0 +1,3 @@ + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Introduction to Web Design.mp4 b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Introduction to Web Design.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4f3f1ab3dbb0e4c02ea338df8d9b0a1d8f44c1f2 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Introduction to Web Design.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2b5cc6ce281b1fcebbef1265e105a9a01e0ca08731935721e9db0e6a47d2d57 +size 66821806 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Introduction to Web Design_vi.srt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Introduction to Web Design_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..875635edfaa802bb01191defb68bd818b3ea26ab --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Introduction to Web Design_vi.srt @@ -0,0 +1,192 @@ +1 +00:00:01,460 --> 00:00:06,780 +Này các cậu. Trong mô-đun này, tôi có một cái gì đó hơi khác một chút cho bạn. Hiện tại, chúng tôi + +2 +00:00:06,790 --> 00:00:13,220 +đang nghiên cứu cách xây dựng các trang web có chức năng tuyệt vời và cách sử + +3 +00:00:13,220 --> 00:00:17,590 +dụng CSS, HTML, để xây dựng cấu trúc của trang web. + +4 +00:00:17,630 --> 00:00:24,680 +Bây giờ hôm nay tôi muốn nói về một cái gì đó hơi khác một chút, đó là cách thiết kế trang web + +5 +00:00:24,680 --> 00:00:30,710 +sao cho trang web của bạn không chỉ có chức năng tuyệt vời mà còn trông đẹp mắt. + +6 +00:00:30,800 --> 00:00:37,910 +Điều quan trọng nhất để làm cho một trang web được người dùng yêu thích chính là thiết kế. + +7 +00:00:37,910 --> 00:00:39,010 +Sau tất cả, hãy nghĩ về nó. + +8 +00:00:39,020 --> 00:00:43,600 +Lần cuối cùng bạn nghe ai đó nói với bạn, "Này, tôi đã xem qua trang web tuyệt vời này. + +9 +00:00:43,610 --> 00:00:45,220 +Nó hoạt động thực sự rất tốt. + +10 +00:00:45,250 --> 00:00:47,180 +Vì vậy, mượt mà và không có lỗi. “Không ai + +11 +00:00:47,180 --> 00:00:49,000 +nói vậy đúng không? + +12 +00:00:49,040 --> 00:00:55,050 +Họ nói những điều như: "Nó trông rất đẹp. Nó chỉ hoạt động như tôi muốn. "Vì vậy, hôm nay chúng ta + +13 +00:00:55,910 --> 00:01:02,570 +sẽ nói về thiết kế và tôi muốn cho bạn thấy một số khía cạnh khác nhau của thiết kế + +14 +00:01:02,630 --> 00:01:04,450 +khi nói đến trang web. + +15 +00:01:04,480 --> 00:01:07,340 +Bây giờ thường xuyên hơn không, bạn đã nghe câu nói đó phải không? + +16 +00:01:07,370 --> 00:01:10,260 +“Đừng đánh giá một cuốn sách qua bìa của nó. "Đồng thời, bạn cũng + +17 +00:01:10,340 --> 00:01:16,250 +có thể đã nghe câu nói này:" Bạn chỉ có ba giây để tạo ấn tượng + +18 +00:01:16,250 --> 00:01:17,770 +tốt. "Bây giờ + +19 +00:01:17,840 --> 00:01:22,400 +khi nói đến thiết kế web, cái sau có lẽ chính xác hơn. + +20 +00:01:22,460 --> 00:01:30,290 +Nó giống như một cuộc phỏng vấn xin việc hoặc một buổi hẹn hò đầu tiên, trang web của bạn có một vài giây quan trọng trước khi người dùng đánh + +21 +00:01:30,290 --> 00:01:33,720 +giá công ty của bạn, thương hiệu của bạn, sản phẩm của bạn. + +22 +00:01:34,250 --> 00:01:36,820 +Vì vậy, hãy xem ví dụ này. + +23 +00:01:36,860 --> 00:01:43,930 +Đây là một trang web có tên là Penny juice và là một công ty bán hộp nước trái cây dành cho trẻ em. + +24 +00:01:43,940 --> 00:01:52,880 +Bây giờ hãy nhìn vào thiết kế của nó. Có những màu sắc xung đột, có những kiểu chữ khác nhau, có những màu sắc khác nhau cho + +25 +00:01:52,880 --> 00:01:57,980 +văn bản và chúng có những phông chữ khác nhau và tất cả, thành thật mà nói, có một chút lộn xộn. + +26 +00:01:58,670 --> 00:02:02,300 +Vì vậy, đây là một câu hỏi mà tôi thường hỏi học sinh vào thời điểm này. + +27 +00:02:02,300 --> 00:02:08,250 +Hãy xem trang web này và tự hỏi bản thân nếu bạn mua một sản phẩm từ công ty này, nếu bạn + +28 +00:02:08,449 --> 00:02:12,200 +mua một thùng nước trái cây, bạn sẽ trả bao nhiêu cho nó? + +29 +00:02:13,100 --> 00:02:15,920 +Bây giờ hãy xem trang web này. + +30 +00:02:15,920 --> 00:02:20,990 +Đây là cùng một trang web được thiết kế lại bởi một nhà thiết kế web chuyên nghiệp. + +31 +00:02:20,990 --> 00:02:28,100 +Hãy xem cách phối màu hiện đã nhất quán, phông chữ và kiểu chữ giờ trông đẹp hơn rất nhiều. + +32 +00:02:28,100 --> 00:02:34,860 +Và hãy tự hỏi mình một lần nữa, bạn sẽ trả bao nhiêu cho một thùng nước trái cây từ trang web này. + +33 +00:02:34,860 --> 00:02:39,740 +Bây giờ tôi đã hỏi câu hỏi này với một số người và đây là kết quả mà tôi nhận được. + +34 +00:02:39,740 --> 00:02:46,570 +Mọi người sẵn sàng trả ở bất kỳ đâu chỉ lên đến một đô la cho một thùng nước trái cây từ trang web + +35 +00:02:46,940 --> 00:02:51,150 +đầu tiên nhưng lại lên đến 3 đô la cho trang web thứ hai. + +36 +00:02:51,150 --> 00:02:57,480 +Bây giờ tôi điều hành một công ty khởi nghiệp và rất nhiều bạn bè và đồng nghiệp của tôi cũng làm việc trên doanh nghiệp của họ. + +37 +00:02:57,710 --> 00:03:02,630 +Và chúng tôi thường dành rất nhiều thời gian để động não, làm thế nào chúng tôi có thể làm cho sản phẩm của mình tốt hơn, làm + +38 +00:03:02,630 --> 00:03:04,930 +thế nào để chúng tôi làm cho thương hiệu của mình mạnh hơn. + +39 +00:03:05,000 --> 00:03:11,600 +Và có rất ít điều mà chúng tôi có thể nghĩ ra có thể thực sự tạo ra sự cải thiện gấp ba lần về giá + +40 +00:03:11,720 --> 00:03:15,120 +trị sản phẩm của bạn hoặc giá trị của công ty bạn. + +41 +00:03:15,140 --> 00:03:17,660 +Vì vậy, thiết kế thực sự thực sự mạnh mẽ. + +42 +00:03:17,660 --> 00:03:24,980 +Đó là một trong những cách rẻ nhất để làm cho công ty hoặc sản phẩm của bạn trông đắt tiền bởi vì nó đang được nâng tầm. + +43 +00:03:25,250 --> 00:03:30,820 +Và không mất nhiều thời gian để trở nên giỏi thiết kế như bạn sẽ thấy trong các bài học tới. + +44 +00:03:30,860 --> 00:03:36,140 +Vì vậy, chúng ta sẽ khám phá một số nguyên tắc thiết kế web trong mô-đun này. + +45 +00:03:36,140 --> 00:03:44,210 +Và tôi muốn đưa bạn đi qua mọi thứ từ lý thuyết màu sắc, kiểu chữ đến thiết kế giao diện người dùng và + +46 +00:03:44,210 --> 00:03:46,330 +thiết kế trải nghiệm người dùng. + +47 +00:03:46,490 --> 00:03:51,020 +Đây là bốn trụ cột của thiết kế web tốt. + +48 +00:03:51,020 --> 00:03:55,220 +Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và bắt đầu. + diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Penny-Juice-Rebranded.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Penny-Juice-Rebranded.url new file mode 100644 index 0000000000000000000000000000000000000000..636f027d80c25bf621c06af9a4c33c95dc27d84a --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Penny-Juice-Rebranded.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.behance.net/gallery/40393701/Penny-Juice-Rebrand \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Penny-Juices-Website.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Penny-Juices-Website.url new file mode 100644 index 0000000000000000000000000000000000000000..f1e61f4dd5c8fe9985d2d36398f23972881452f5 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/001 Penny-Juices-Website.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.pennyjuice.com/ \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Adobe-Color-Wheel.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Adobe-Color-Wheel.url new file mode 100644 index 0000000000000000000000000000000000000000..f317aabd0f46a2d9ae81bfe55c3ae0cd180d50ac --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Adobe-Color-Wheel.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://color.adobe.com/create/color-wheel \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Color-Hunt.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Color-Hunt.url new file mode 100644 index 0000000000000000000000000000000000000000..9a31438db9076678f99c4f16ad65c358c72de0ac --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Color-Hunt.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://colorhunt.co/ \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Understanding Color Theory.mp4 b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Understanding Color Theory.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..21c6f74c9f7453c7ff9d447e41304c210a1da8d6 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Understanding Color Theory.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c000d6c57a46c17c9bcd2672e46cd0adef980bb9cbf83770640366839beb206 +size 272059480 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Understanding Color Theory_vi.srt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Understanding Color Theory_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..92b7faa73d0d3df3a424ac3a3167e0e1bf67f6e4 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/002 Understanding Color Theory_vi.srt @@ -0,0 +1,436 @@ +1 +00:00:00,810 --> 00:00:08,520 +Bây giờ một trong những điều đầu tiên tôi muốn nói đến là Lý thuyết màu sắc. Và lý thuyết màu sắc là nghệ thuật và khoa học của việc tạo + +2 +00:00:08,610 --> 00:00:11,760 +ra bảng màu phù hợp cho trang web của bạn. + +3 +00:00:12,450 --> 00:00:15,040 +Vì vậy, hãy xem ví dụ này. + +4 +00:00:15,090 --> 00:00:21,690 +Bây giờ, giả sử bạn có một logo trong đó bạn có hoa màu nâu, quả cầu sơn màu hồng. + +5 +00:00:21,810 --> 00:00:24,960 +Tất cả trông rất kỳ lạ và rất mâu thuẫn. + +6 +00:00:25,020 --> 00:00:30,960 +Và hãy nhìn vào các logo thực tế. Giống như bạn đang nghĩ gì khi nhìn + +7 +00:00:30,960 --> 00:00:37,560 +thấy những bảng màu này trên các dòng chữ. Tôi đoán là màu sắc của những bông hoa trông hơi giống bụi bẩn nhưng nó + +8 +00:00:37,560 --> 00:00:40,460 +cũng giống một thứ gì đó khác. Và bóng sơn màu hồng, tôi + +9 +00:00:40,530 --> 00:00:45,120 +thực sự không chắc đối tượng mục tiêu đó là ai. Nhưng hãy nhìn vào điều này. + +10 +00:00:45,390 --> 00:00:50,630 +Nếu chúng ta lật bảng màu, đột nhiên tất cả trông giống như thế này. + +11 +00:00:50,730 --> 00:00:53,710 +Nó đột nhiên trông tốt hơn rất nhiều phải không? + +12 +00:00:53,730 --> 00:00:56,940 +Nó trông phù hợp với thông điệp thực tế. + +13 +00:00:57,000 --> 00:01:02,770 +Vì vậy, khi chọn màu, bạn phải biết tâm trạng của bảng màu. + +14 +00:01:02,940 --> 00:01:09,780 +Vì vậy, màu sắc chủ đạo sẽ có trong thiết kế của bạn thực sự kể một câu chuyện và nó truyền tải + +15 +00:01:09,840 --> 00:01:11,530 +thông điệp đến người dùng. + +16 +00:01:11,700 --> 00:01:20,490 +Ví dụ, màu đỏ truyền tải tình yêu, năng lượng, sự mãnh liệt. Đó là lý do tại sao bạn thấy rất nhiều quảng cáo xe hơi có một + +17 +00:01:20,520 --> 00:01:22,980 +chiếc ô tô màu đỏ trên nền đỏ. + +18 +00:01:23,340 --> 00:01:25,250 +Đó là bởi vì họ đang cố + +19 +00:01:25,260 --> 00:01:28,560 +nói với bạn, "Này hãy mua chiếc xe này và bạn sẽ cảm + +20 +00:01:28,620 --> 00:01:38,220 +thấy tràn đầy năng lượng và sự mạnh mẽ của chiếc xe này ngay cả khi bạn đã 89 tuổi. "Bây giờ màu vàng thiên về niềm vui, trí tuệ, sự chú ý. + +21 +00:01:39,060 --> 00:01:46,290 +Và điều quan trọng nhất về màu vàng là làm thế nào để thu hút sự chú ý bởi vì hầu + +22 +00:01:46,290 --> 00:01:50,550 +như không thể không nhìn vào thứ gì đó rất vàng. + +23 +00:01:50,580 --> 00:01:53,530 +Ví dụ quảng cáo này. Bây giờ một vài năm trước, + +24 +00:01:53,550 --> 00:01:59,220 +quảng cáo này đã gây ra một sự náo động vì nó có hình ảnh một người phụ nữ mặc bộ bikini màu vàng + +25 +00:01:59,220 --> 00:02:01,500 +và nó nói, "Bạn đã sẵn sàng cho cơ thể + +26 +00:02:01,500 --> 00:02:03,560 +đi biển chưa? "Và nhiều + +27 +00:02:03,570 --> 00:02:06,740 +người đã thực sự thất vọng về điều đó. + +28 +00:02:06,750 --> 00:02:08,090 +Họ sử dụng Internet, họ + +29 +00:02:08,100 --> 00:02:09,419 +say mê về nó. + +30 +00:02:09,570 --> 00:02:15,390 +Và tôi nhớ lúc đó tôi đã tự nghĩ: “Bạn biết đấy, quảng cáo này không khác quá nhiều so với rất nhiều quảng cáo khác đang cố nói cho phụ nữ + +31 +00:02:15,390 --> 00:02:17,880 +biết ngoại hình như thế nào. "Và nó không phải + +32 +00:02:18,500 --> 00:02:20,100 +là một thông điệp tuyệt vời. + +33 +00:02:20,160 --> 00:02:26,580 +Nhưng tại sao nó lại gây ra nhiều tức giận và thu hút nhiều sự chú ý đến vậy? + +34 +00:02:26,580 --> 00:02:30,270 +Và tôi nghĩ lý do là vì nó thực sự có màu vàng tươi. + +35 +00:02:30,900 --> 00:02:35,450 +Không thể bỏ qua quảng cáo này khi bạn bắt gặp nó. + +36 +00:02:35,610 --> 00:02:42,420 +Vì vậy, khi bạn đang tạo logo hoặc khi bạn đang tạo một số loại tiêu đề, thì màu + +37 +00:02:42,420 --> 00:02:48,090 +vàng là một lựa chọn tuyệt vời. Nhưng khi bạn đang tạo ra một thứ gì đó được thiết kế để được xem xét trong + +38 +00:02:48,540 --> 00:02:53,290 +một thời gian dài thì màu vàng có thể quá thu hút sự chú ý. Nó thực sự có thể làm hại mắt + +39 +00:02:53,400 --> 00:02:58,000 +người dùng của bạn nếu bạn cố gắng đọc toàn bộ bài báo có nền màu vàng. + +40 +00:02:58,350 --> 00:03:05,670 +Bây giờ màu sắc tiếp theo mà chúng ta sẽ nói đến là màu xanh lá cây, tất cả là về sự tươi mới, tăng trưởng và an toàn. + +41 +00:03:05,880 --> 00:03:13,110 +Và đó là lý do tại sao bạn thấy rất nhiều công ty tạp hóa như Hello Fresh hoặc Amazon tạp hóa sử dụng màu này + +42 +00:03:13,230 --> 00:03:19,120 +làm bảng màu chủ đạo của họ. Bởi vì nó đang cố gắng nói với bạn, "Này xem này! Thứ này có thể ăn được. + +43 +00:03:19,140 --> 00:03:21,620 +Đây là những gì chúng tôi đang bán. "Và vì vậy + +44 +00:03:21,690 --> 00:03:28,870 +nếu bạn có một công ty liên quan đến thực phẩm, đây thường là một lựa chọn an toàn để đi cùng. + +45 +00:03:28,890 --> 00:03:37,440 +Bây giờ Blue là về sự ổn định, tin tưởng, thanh thản. Và vì vậy bạn thấy rất nhiều công ty cần truyền đạt rằng "Này, + +46 +00:03:37,440 --> 00:03:39,980 +chúng tôi thực sự đáng tin cậy" sử + +47 +00:03:40,020 --> 00:03:41,930 +dụng màu này. Ví dụ: + +48 +00:03:41,940 --> 00:03:47,640 +xem xét tất cả các công ty tài chính, xem xét các công ty như PayPal hoặc + +49 +00:03:47,640 --> 00:03:52,680 +các công ty tiền điện tử như Coinbase. Tất cả đều chọn màu này vì họ muốn bạn biết rằng họ + +50 +00:03:52,680 --> 00:03:54,060 +sẽ không chạy theo tiền của bạn. + +51 +00:03:54,090 --> 00:04:01,170 +Trên thực tế, có một nghiên cứu tâm lý học thực sự thú vị, nơi họ so sánh những người được phỏng vấn mặc áo sơ + +52 +00:04:01,170 --> 00:04:02,550 +mi màu khác nhau. + +53 +00:04:02,580 --> 00:04:05,700 +Vì vậy, ví dụ, một nhóm trong số họ sẽ mặc một chiếc áo + +54 +00:04:05,700 --> 00:04:12,410 +sơ mi màu xanh lá cây, một nhóm khác sẽ mặc một chiếc áo sơ mi màu xanh lam và họ so sánh cách họ được người phỏng vấn nhìn nhận. + +55 +00:04:12,510 --> 00:04:19,050 +Và nó cho thấy rằng chỉ bằng cách thay đổi màu áo sơ mi của bạn thành màu xanh lam, bạn sẽ tăng đáng kể sự + +56 +00:04:19,050 --> 00:04:20,180 +tin tưởng vào + +57 +00:04:20,250 --> 00:04:21,970 +bạn mà người khác dành cho bạn. + +58 +00:04:21,990 --> 00:04:26,390 +Vì vậy, hãy suy nghĩ về điều đó vào lần tới khi bạn đi phỏng vấn. + +59 +00:04:26,460 --> 00:04:34,950 +Bây giờ màu cuối cùng là màu tím và nó có nghĩa là biểu thị cho hoàng gia, sự giàu có, nữ tính. Và kỳ lạ thay, tôi đã bắt gặp một số công ty + +60 +00:04:34,980 --> 00:04:41,160 +cho vay ngắn hạn sử dụng bảng màu này, đặc biệt là những công ty nhắm mục + +61 +00:04:41,160 --> 00:04:42,900 +tiêu đến phụ nữ. + +62 +00:04:42,990 --> 00:04:48,690 +Vì vậy, điều quan trọng cần nghĩ đến là bạn đang đưa ra quyết định tỉnh táo khi + +63 +00:04:48,690 --> 00:04:49,920 +chọn bảng màu. + +64 +00:04:50,010 --> 00:04:56,040 +Nó không chỉ là bất kỳ màu nào bạn thích hoặc màu sắc yêu thích của bạn. Nhưng thực ra là 'tôi đang muốn truyền tải + +65 +00:04:56,040 --> 00:05:03,930 +thông điệp gì đến người dùng' và sau đó chọn một màu thích hợp. Bây giờ, thông thường bạn sẽ không chỉ sử dụng một màu + +66 +00:05:03,930 --> 00:05:09,180 +duy nhất cho thiết kế của mình. Có thể bạn sẽ sử dụng hai hoặc ba. + +67 +00:05:09,300 --> 00:05:14,850 +Vì vậy, tại một số thời điểm bạn phải suy nghĩ về những màu sắc khác nhau để kết hợp. + +68 +00:05:14,850 --> 00:05:19,680 +Và đây có lẽ là phần khoa học nhất của lý thuyết màu sắc. + +69 +00:05:19,740 --> 00:05:28,740 +Hiện nay rất thường xuyên, các nhà thiết kế sẽ dựa trên những cách kết hợp màu sắc một cách khoa học. Ví dụ: lấy hai màu nằm ngay cạnh nhau + +70 +00:05:28,770 --> 00:05:31,560 +trên bánh xe màu. + +71 +00:05:32,130 --> 00:05:36,170 +Và bằng cách này, bạn tạo ra thứ được gọi là bảng màu tương tự. + +72 +00:05:36,390 --> 00:05:42,600 +Và những thiết kế này trông vô cùng hài hòa và chúng thực sự kết hợp tốt với nhau. + +73 +00:05:42,600 --> 00:05:48,450 +Vì vậy, bảng màu này có thể thực sự tốt cho những thứ như thanh điều hướng và nội dung trang + +74 +00:05:48,930 --> 00:05:52,300 +web của bạn hoặc những thứ như logo và nó là nền. + +75 +00:05:52,350 --> 00:05:59,160 +Bây giờ, những gì nó không tốt mặc dù đang nổi bật. Nếu bạn thực sự muốn thiết kế của mình nổi bật, tốt + +76 +00:05:59,160 --> 00:06:05,490 +hơn hết bạn nên lấy hai màu từ hai đầu đối diện của bánh xe màu để tạo ra thứ được gọi là + +77 +00:06:05,490 --> 00:06:08,280 +bảng màu bổ sung hoặc bảng màu xung đột. + +78 +00:06:08,280 --> 00:06:12,270 +Bây giờ bảng màu bổ sung này thực sự tạo ra sự nổi bật đó. + +79 +00:06:12,600 --> 00:06:16,490 +Và nó thực sự làm nổi bật từng màu sắc. + +80 +00:06:16,620 --> 00:06:23,130 +Vì vậy, lần tới khi bạn đi siêu thị, tôi muốn bạn nhìn vào hàng thịt và xem liệu họ có sử dụng + +81 +00:06:23,130 --> 00:06:27,910 +bảng màu bổ sung này để làm cho mọi thứ trở nên nổi bật hay không. + +82 +00:06:27,930 --> 00:06:34,620 +Vì vậy, một trong những điều bạn thường thấy là họ sẽ lấy những mẩu nhựa giả này của cây xanh như cỏ giả + +83 +00:06:34,620 --> 00:06:42,720 +hoặc bụi cây giả và họ sẽ đặt nó vào giữa miếng thịt. Và bởi vì màu xanh lá cây và màu đỏ là hai màu + +84 +00:06:42,720 --> 00:06:50,160 +bổ sung nên thịt đỏ sẽ nổi hơn rất nhiều và mang đến cho bạn ý tưởng về sự tươi mới ngay cả khi + +85 +00:06:50,310 --> 00:06:57,750 +nó đã qua một chút so với những ngày đẹp nhất. Nhưng những gì bạn không nên làm với các màu xung đột hoặc + +86 +00:06:57,750 --> 00:07:04,710 +các màu bổ sung là cố gắng tạo kiểu văn bản và nền văn bản với nó vì nó thực sự trông rất chói + +87 +00:07:04,920 --> 00:07:08,440 +tai và bạn có thể cảm thấy mắt mình hơi mờ khi + +88 +00:07:08,550 --> 00:07:13,940 +nhìn vào sự kết hợp cụ thể này. Vì vậy, đừng làm điều này khi nó liên quan đến văn bản. + +89 +00:07:14,100 --> 00:07:20,670 +Thay vào đó, hãy giữ nó ở những thứ như logo hoặc biểu tượng hoặc những thứ mà bạn thực sự + +90 +00:07:20,670 --> 00:07:21,990 +muốn nổi bật hơn. + +91 +00:07:22,020 --> 00:07:28,350 +Bây giờ, có rất nhiều cách khác mà bạn có thể kết hợp màu sắc như vẽ một + +92 +00:07:28,350 --> 00:07:34,170 +tam giác đều để tạo bảng màu bộ ba hoặc vẽ một hình vuông hoàn hảo. + +93 +00:07:34,180 --> 00:07:40,200 +Bây giờ nếu bạn muốn, bạn có thể truy cập một trang web có tên là Adobe color cho phép bạn làm + +94 +00:07:40,290 --> 00:07:47,430 +rối tung tất cả các kết hợp màu sắc khác nhau này. Vì vậy, hãy chọn một bảng màu bộ ba hoặc một bảng màu vuông + +95 +00:07:47,820 --> 00:07:52,990 +và sau đó kéo nó xung quanh bánh xe màu để bạn có được các kết hợp màu sắc khác nhau. + +96 +00:07:53,100 --> 00:07:59,100 +Và một khi bạn bắt gặp một bảng màu phù hợp với tâm trạng của dự án của mình, thì bạn có thể chọn + +97 +00:07:59,220 --> 00:08:02,790 +các mã hex và chỉ cần đưa chúng thẳng vào trang web của mình. + +98 +00:08:02,790 --> 00:08:07,950 +Bây giờ nếu tất cả những điều đó nghe có vẻ hơi quá sức, thì tôi sẽ giúp bạn. + +99 +00:08:07,980 --> 00:08:11,470 +Bạn cũng có thể sử dụng một trang web có tên là colorhunt. co. + +100 +00:08:11,490 --> 00:08:17,550 +Đây là trang web nơi các nhà thiết kế chuyên nghiệp đã tuyển chọn một số bảng màu yêu thích của họ + +101 +00:08:17,730 --> 00:08:21,130 +và bạn có thể nhập mã hex ngay từ trang web. + +102 +00:08:22,110 --> 00:08:28,530 +Vì vậy, hãy xem các phần nổi tiếng và phổ biến của trang web này và sử dụng nó để hướng dẫn kế hoạch thí + +103 +00:08:28,540 --> 00:08:30,810 +điểm cho dự án tiếp theo của bạn. + +104 +00:08:30,810 --> 00:08:37,350 +Giờ đây, khi bạn tạo một trang web có bảng màu nhất quán đẹp mắt như bảng màu cho sữa chua LIEBE, bạn có thể + +105 +00:08:37,350 --> 00:08:44,760 +thấy nó làm cho thiết kế nổi bật đến mức nào và nó trở nên thực sự đầy màu sắc và thực sự vui tươi và bạn có thể + +106 +00:08:44,760 --> 00:08:51,000 +truyền tải các thông điệp khác nhau bằng cách sử dụng lựa chọn của bạn màu sắc và cách phối màu của bạn. + +107 +00:08:51,010 --> 00:08:54,060 +Vì vậy, hãy suy nghĩ về lựa chọn màu sắc và bảng + +108 +00:08:54,060 --> 00:08:59,760 +màu của bạn vào lần tiếp theo khi bạn thiết kế trang web của mình để đảm bảo rằng nó nhất quán với nội dung + +109 +00:08:59,850 --> 00:09:04,140 +thương hiệu và nội dung sản phẩm của bạn và nó truyền tải thông điệp bạn muốn truyền tải. + diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/003 Understanding Typography and How to Choose Fonts.mp4 b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/003 Understanding Typography and How to Choose Fonts.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..59c4b9aba0705ac6d75028940f07dc7f188ba222 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/003 Understanding Typography and How to Choose Fonts.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df527d7c3f6d5b322970288ca2e0bf13ecb323bb0f8c03b4a858ca01b0337850 +size 230486217 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/003 Understanding Typography and How to Choose Fonts_vi.srt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/003 Understanding Typography and How to Choose Fonts_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..651f0e20c0c2f337afe54ce035673289795eebdf --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/003 Understanding Typography and How to Choose Fonts_vi.srt @@ -0,0 +1,488 @@ +1 +00:00:00,650 --> 00:00:01,000 +Được rồi. + +2 +00:00:01,020 --> 00:00:05,190 +Chủ đề tiếp theo mà tôi muốn nói đến là kiểu chữ. + +3 +00:00:05,190 --> 00:00:07,670 +Bây giờ, tôi biết rất nhiều sinh viên luôn nói + +4 +00:00:07,710 --> 00:00:10,460 +với tôi “Nhưng tại sao tôi cần phải học về kiểu chữ? + +5 +00:00:10,470 --> 00:00:14,020 +Tôi chỉ cần mở Word, nhấp vào menu thả xuống, tìm Times + +6 +00:00:14,070 --> 00:00:15,450 +New Roman, phông + +7 +00:00:15,450 --> 00:00:16,850 +chữ yêu thích của tôi. + +8 +00:00:17,070 --> 00:00:20,770 +Và sau đó chỉ cần đặt nó vào tất cả mọi thứ. Nó được thực hiện đúng không? “Chúng ta + +9 +00:00:21,480 --> 00:00:24,350 +hãy nghĩ về điều này. + +10 +00:00:24,400 --> 00:00:30,030 +Giả sử đó là Ngày lễ tình nhân và bạn quyết định rằng bạn muốn viết một lá thư cho người yêu dấu + +11 +00:00:30,420 --> 00:00:34,150 +của mình và bạn thay đổi phông chữ thành chữ thảo như thế này. + +12 +00:00:34,290 --> 00:00:35,490 +"Bạn se luôn luôn la của tôi. "Tôi không + +13 +00:00:35,490 --> 00:00:37,530 +biết liệu cô ấy hay anh ấy + +14 +00:00:37,610 --> 00:00:40,070 +sẽ như vậy nhưng bạn có một cơ hội tốt. + +15 +00:00:40,210 --> 00:00:43,350 +Bây giờ giả sử rằng bạn đã chọn sai phông chữ. + +16 +00:00:43,380 --> 00:00:45,730 +Đó là một chút vấn đề. + +17 +00:00:45,780 --> 00:00:51,040 +Tôi không những không nghĩ rằng Valentine của bạn sẽ diễn ra tốt đẹp như thế này, bạn + +18 +00:00:51,120 --> 00:00:55,230 +còn có thể có cảnh sát chống lưng, đó là một chút vấn đề. + +19 +00:00:55,650 --> 00:01:03,780 +Vì vậy, phông chữ thực sự quan trọng và điều quan trọng là phải xem xét không chỉ tâm trạng của họ mà còn cả cách kết hợp các + +20 +00:01:03,780 --> 00:01:04,910 +phông chữ khác nhau. + +21 +00:01:04,989 --> 00:01:12,180 +Và đó là một cách thực sự dễ dàng để làm cho các thiết kế của bạn trông rất chuyên nghiệp và thực sự bóng bẩy. Trong số tất cả các phông chữ trên + +22 +00:01:12,210 --> 00:01:14,520 +thế giới, có khá nhiều + +23 +00:01:14,530 --> 00:01:19,020 +loại phông chữ lớn mà bạn thực sự nên biết. + +24 +00:01:19,020 --> 00:01:26,700 +Một là gia đình Serif, nơi họ có những bàn chân nhỏ này ở cuối dầm trung tâm của họ. + +25 +00:01:26,700 --> 00:01:34,380 +Và lý do tại sao chúng có những bàn chân cũ này là bởi vì kiểu chữ Serif được lấy cảm hứng từ những tác phẩm chạm + +26 +00:01:34,380 --> 00:01:37,350 +khắc trên đá cẩm thạch của những ngày xa xưa. + +27 +00:01:37,350 --> 00:01:44,190 +Vì vậy, nếu tiếp theo bạn đi ra ngoài và bạn nhìn vào các tòa nhà xung quanh bạn, đặc biệt là nếu bạn + +28 +00:01:44,190 --> 00:01:51,810 +đang ở trong một khu vực lịch sử, hãy nhìn vào những nơi họ đã chạm khắc vào đá hoặc đá cẩm thạch và bạn sẽ nhận + +29 +00:01:51,810 --> 00:01:55,560 +thấy rằng họ cũng có những chân nhỏ ở cuối dầm trung tâm. + +30 +00:01:55,560 --> 00:01:57,100 +Vậy tại sao lại như vậy? + +31 +00:01:57,120 --> 00:02:03,540 +Tôi không biết có bao nhiêu người trong số các bạn đã chạm khắc đá cẩm thạch vào thời gian rảnh rỗi + +32 +00:02:03,540 --> 00:02:12,210 +của mình nhưng nếu bạn có biết rằng một khi bạn đục đã đi vào Đá và bạn cần thoát ra khỏi bản khắc thì thực sự không thể tạo ra + +33 +00:02:12,210 --> 00:02:15,540 +các góc 90 độ khi bạn ' lại khắc vào đá. + +34 +00:02:16,260 --> 00:02:21,310 +Vì vậy, đây là nơi mà kiểu chữ Serif lấy cảm hứng từ họ. + +35 +00:02:21,420 --> 00:02:27,780 +Và đây cũng là lý do tại sao khi bạn chọn kiểu chữ Serif, bạn đang làm + +36 +00:02:27,780 --> 00:02:34,320 +cho thiết kế của mình trông nghiêm túc hơn, có thẩm quyền hơn và cũng cũ hơn một chút. + +37 +00:02:34,320 --> 00:02:41,550 +Vì vậy, nó thực sự tốt nếu bạn đang thiết kế một cái gì đó như giấy tiêu đề cho một công ty pháp lý hoặc + +38 +00:02:41,550 --> 00:02:43,590 +một tạp chí thiết kế kiến trúc. + +39 +00:02:43,830 --> 00:02:48,520 +Nhưng khi chúng ta xem xét họ kiểu chữ Serif lớn, + +40 +00:02:48,600 --> 00:02:55,710 +chúng thực sự được chia nhỏ hơn nữa thành các họ nhỏ hơn như Old style, Transition, + +41 +00:02:55,710 --> 00:02:57,310 +Modern và Slab-Serif. + +42 +00:02:57,330 --> 00:03:05,820 +Bây giờ điều thực sự thú vị là bạn thực sự có thể biết một kiểu chữ cũ sẽ trông như thế nào bằng cách nhìn + +43 +00:03:05,910 --> 00:03:11,370 +vào sự khác biệt giữa phần dày nhất và phần mỏng nhất của mỗi chữ cái. + +44 +00:03:11,370 --> 00:03:15,050 +Vì vậy, hãy so sánh kiểu cổ + +45 +00:03:15,060 --> 00:03:16,720 +'o' với 'o' + +46 +00:03:16,780 --> 00:03:23,070 +chuyển tiếp và 'o' hiện đại. Và hãy xem cách mà sự khác biệt giữa phần dày nhất + +47 +00:03:23,070 --> 00:03:28,650 +của chữ cái và phần mỏng nhất ngày càng được phóng đại hơn khi bạn hướng tới một phông chữ hiện đại hơn. + +48 +00:03:28,830 --> 00:03:34,920 +Vì vậy, nếu bạn muốn một cái gì đó trông có vẻ uy quyền nhưng hiện đại thì + +49 +00:03:35,010 --> 00:03:43,980 +có thể bạn muốn sử dụng kiểu chữ Serif hiện đại như Didot. Nhưng nếu bạn muốn nó già đi một chút, già hơn một chút có + +50 +00:03:44,610 --> 00:03:49,890 +thể bạn có một nhà máy rượu, có thể bạn muốn thay thế bằng Old Style Serif. + +51 +00:03:49,890 --> 00:03:57,270 +Giờ đây, giống như các màu sắc khác nhau có tâm trạng và cảm xúc khác nhau, các phông chữ khác nhau cũng có tâm trạng khác nhau và chúng + +52 +00:03:57,630 --> 00:04:02,850 +cũng truyền tải một thông điệp khác nhau đến người dùng tùy thuộc vào việc bạn chọn phông chữ nào. + +53 +00:04:02,850 --> 00:04:09,800 +Vì vậy, gia đình Serif thường được coi là truyền thống, ổn định, đáng kính và có thẩm quyền. + +54 +00:04:09,810 --> 00:04:15,490 +Đây là những từ thường được các nhà thiết kế ném ra khi họ nghĩ về kiểu chữ Serif. + +55 +00:04:15,510 --> 00:04:20,370 +Vì vậy, chẳng hạn, lần tới khi bạn đến quầy tạp chí, hãy chọn tạp chí Vogue. + +56 +00:04:20,430 --> 00:04:26,480 +Hãy xem tiêu đề của chúng và xem đó là kiểu chữ Serif hiện đại như thế nào. + +57 +00:04:26,520 --> 00:04:33,000 +Nó có sự khác biệt quá lớn giữa các phần dày và mỏng của chữ cái và nó trông có vẻ + +58 +00:04:33,090 --> 00:04:36,950 +uy quyền và nó biết nó đang nói về cái gì. + +59 +00:04:37,170 --> 00:04:43,230 +Mặt khác, nếu chúng ta nghĩ về các San-Serifs, chúng thuộc một họ khác vì thay vì có các + +60 +00:04:43,230 --> 00:04:49,290 +Serifs hoặc bàn chân nhỏ ở cuối các chùm trung tâm, chúng có các góc vuông hoàn hảo. + +61 +00:04:49,290 --> 00:04:56,100 +Và chính góc vuông này đã làm cho gia đình San-Serif trông thân thiện hơn, dễ gần hơn, mới + +62 +00:04:56,490 --> 00:04:59,120 +lạ hơn và hiện đại hơn. + +63 +00:04:59,610 --> 00:05:06,120 +Vì vậy, ví dụ, bạn sẽ có xu hướng nhận được những từ như hợp lý, đơn giản, thẳng thắn. Và đây là lý do tại sao rất nhiều + +64 +00:05:06,120 --> 00:05:11,390 +công ty khởi nghiệp thích sử dụng kiểu chữ San-Serif trong các trang web của họ. + +65 +00:05:11,490 --> 00:05:18,330 +Ví dụ, kiểu chữ Nhân văn là một phân họ của San-Serifs. Đó là một thứ được biết + +66 +00:05:18,390 --> 00:05:25,740 +đến như một kiểu chữ dễ đọc. Và trên thực tế, ngay cả trong Serifs và San-Serifs, bạn sẽ + +67 +00:05:25,740 --> 00:05:32,340 +có xu hướng thấy các nhà thiết kế sẽ sử dụng San-Serifs nếu họ muốn viết nội dung văn bản cần + +68 +00:05:32,370 --> 00:05:34,920 +phải rõ ràng và dễ đọc hơn. + +69 +00:05:34,920 --> 00:05:42,300 +Giờ đây, trong gia đình con này, thậm chí còn có sự khác biệt về tính dễ đọc và dễ đọc. + +70 +00:05:42,420 --> 00:05:49,910 +Vì vậy, làm thế nào dễ dàng các từ để đọc và làm thế nào dễ chịu khi đọc các chữ cái. + +71 +00:05:49,920 --> 00:05:56,760 +Có một nghiên cứu thực sự thú vị do MIT thực hiện cách đây vài năm, nơi họ đưa hai nhóm + +72 +00:05:57,300 --> 00:06:05,190 +người dùng, một nhóm đưa họ vào một chiếc ô tô có bảng điều khiển bằng kiểu chữ Nhân văn và chiếc ô tô + +73 +00:06:05,190 --> 00:06:13,920 +kia có bảng điều khiển có chữ Grotesque San- Kiểu chữ Serif. Và những gì họ đã làm là theo dõi học sinh của những người + +74 +00:06:13,920 --> 00:06:21,120 +đang lái xe ô tô và họ kiểm tra xem mỗi người lái xe cần nhìn xuống bảng điều khiển trong bao lâu + +75 +00:06:21,120 --> 00:06:27,840 +trước khi họ có đủ thông tin từ đồng hồ tốc độ hoặc đồng hồ đo đường và trước khi họ có + +76 +00:06:27,930 --> 00:06:35,160 +thể quay lại và nhìn. ở đường một lần nữa. Và thực sự ngạc nhiên khi họ phát hiện ra + +77 +00:06:36,000 --> 00:06:42,330 +rằng chỉ bằng cách thay đổi phông chữ từ San-Serif Grotesque thành San-Serif Nhân văn, họ có thể tiết + +78 +00:06:42,330 --> 00:06:48,370 +kiệm cho người lái xe khoảng 30 đến 40% thời gian cần thiết để hiểu thông tin. + +79 +00:06:48,420 --> 00:06:54,690 +Vì vậy, hãy tưởng tượng chiếc xe đó đang chạy trên xa lộ với tốc độ 60 dặm, 100 dặm một giờ. + +80 +00:06:54,750 --> 00:07:00,750 +Sự khác biệt về lượng thời gian người dùng cần nhìn xuống bảng điều khiển có thể là sự khác biệt + +81 +00:07:00,750 --> 00:07:02,670 +giữa sự sống và cái chết. + +82 +00:07:02,700 --> 00:07:07,580 +Và với tư cách là những nhà thiết kế, chúng ta hiếm khi tạo ra được sự khác biệt đó trên thế giới đúng không? + +83 +00:07:07,650 --> 00:07:13,600 +Vì vậy, biết rằng kiểu chữ Nhân văn, tất cả các phông chữ thuộc danh mục đó như Gill Sans, + +84 +00:07:13,680 --> 00:07:21,620 +Tahoma, Verdana, đây là những phông chữ rất dễ đọc và dễ đọc mà bạn có thể sử dụng trong các loại nội dung, chẳng hạn như quảng + +85 +00:07:21,630 --> 00:07:23,220 +cáo chiêu hàng của bạn. + +86 +00:07:23,760 --> 00:07:27,740 +Bây giờ, mặc dù chúng tôi không cứu được mạng sống với các chiêu trò bán hàng của mình, + +87 +00:07:27,900 --> 00:07:32,610 +nhưng nếu bạn quản lý để khiến người dùng đọc qua nhiều bản sao bán hàng của bạn thì có lẽ họ sẽ + +88 +00:07:32,610 --> 00:07:36,120 +bị thuyết phục hơn và có nhiều khả năng mua sản phẩm của bạn hơn phải + +89 +00:07:36,120 --> 00:07:36,420 +không? + +90 +00:07:36,960 --> 00:07:42,990 +Vì vậy, khả năng đọc và tính dễ đọc khi bạn chọn phông chữ là cực kỳ quan trọng. Và những thứ bạn đang tìm kiếm trong các chữ + +91 +00:07:42,990 --> 00:07:49,260 +cái khi bạn đang tìm kiếm độ dễ đọc là các hình dạng mở và nhiều khoảng cách giữa mỗi chữ cái và + +92 +00:07:49,290 --> 00:07:54,690 +các biểu mẫu trông không rõ ràng để chúng trông khác nhau, ví dụ ở đây là chữ 'g' + +93 +00:07:54,690 --> 00:08:00,940 +và số 9 thực sự trông khác trên dòng thứ hai. Và cuối cùng, tỷ lệ khác nhau. + +94 +00:08:00,960 --> 00:08:06,540 +Vì vậy, có chữ "O" rất rộng và chữ "0" hẹp hơn một chút để bạn thực sự có thể phân biệt được + +95 +00:08:06,540 --> 00:08:08,340 +sự khác biệt giữa hai chữ này. + +96 +00:08:08,430 --> 00:08:15,990 +Bây giờ, trong khi chúng ta đã nói về việc sử dụng phông chữ, bạn thường thấy mọi người hơi quá đà khi + +97 +00:08:15,990 --> 00:08:22,920 +họ chọn 10 phông chữ trong cùng một thiết kế. Và điều đó làm cho thiết kế của bạn trông rất lộn xộn và rất thiếu chuyên nghiệp. + +98 +00:08:22,980 --> 00:08:26,910 +Tôi khuyên bạn nên thực sự chỉ sử dụng hai phông chữ trong một thiết kế. + +99 +00:08:26,910 --> 00:08:32,580 +Vì vậy, nếu bạn đang làm một áp phích, hãy giữ nó thành hai phông chữ. Nếu bạn đang tạo một phần trên trang web của + +100 +00:08:32,580 --> 00:08:36,559 +mình, hãy giữ lại hai phông chữ. Nó chỉ trông sạch sẽ hơn và chặt chẽ hơn rất nhiều. + +101 +00:08:37,110 --> 00:08:44,190 +Và khi bạn kết hợp hai phông chữ khác nhau này, bạn muốn thử để thể hiện tâm trạng tương tự. Vì vậy, hãy tìm các phông chữ có + +102 +00:08:44,190 --> 00:08:48,990 +cùng tâm trạng với nhau và cũng có thời đại tương tự. + +103 +00:08:48,990 --> 00:08:53,610 +Bạn không muốn một cái gì đó trông tối tân với một cái gì đó trông giống như những ngày + +104 +00:08:53,610 --> 00:08:56,780 +còn lại kết hợp với nhau. Nó trông hơi kỳ lạ. + +105 +00:08:56,890 --> 00:08:59,730 +Bây giờ những thứ bạn muốn tương phản là serifness. + +106 +00:08:59,730 --> 00:09:05,190 +Vì vậy, ví dụ bạn đang ở trên tiêu đề là Serif và nội dung là + +107 +00:09:05,190 --> 00:09:08,030 +San-Serif hoặc ngược lại. Nó chỉ tạo ra sự quan tâm nhiều hơn đến thiết kế của bạn. + +108 +00:09:08,640 --> 00:09:14,010 +Và tương tự, bạn cũng có thể tạo ra sự quan tâm bằng cách thay + +109 +00:09:14,010 --> 00:09:21,150 +đổi trọng lượng giữa tiêu đề và nội dung. Vì vậy, làm cho tiêu đề thực sự đậm hoặc thậm chí sử dụng kiểu chữ đen và làm cho văn + +110 +00:09:21,240 --> 00:09:27,660 +bản nội dung bằng cách sử dụng một cái gì đó như mỏng hoặc đều hoặc nhạt. Những trọng lượng khác nhau này có thể tạo ra sự tương phản trong thiết kế của bạn. + +111 +00:09:29,270 --> 00:09:34,850 +Bây giờ nếu bạn không nhớ bất cứ điều gì từ cuộc nói chuyện này về kiểu chữ, tôi chỉ muốn + +112 +00:09:34,850 --> 00:09:42,050 +bạn nhìn vào sáu phông chữ này và cố gắng xóa chúng khỏi bộ nhớ của bạn vì rất khó để làm cho những thiết kế này + +113 +00:09:42,050 --> 00:09:46,830 +trông đẹp, trừ khi tôi đoán nếu bạn ' đang điều hành một quầy bán nước chanh. + +114 +00:09:47,090 --> 00:09:52,940 +Nhưng nếu bạn muốn trông chuyên nghiệp, nếu bạn muốn thiết kế, hãy thử sử dụng một trong những phông chữ khác + +115 +00:09:52,940 --> 00:09:58,190 +mà chúng tôi đã đề cập và cố gắng bỏ qua những phông chữ khó đọc và có tâm + +116 +00:09:58,190 --> 00:10:00,830 +trạng khó hòa nhập. một thiết lập chuyên nghiệp. + +117 +00:10:00,830 --> 00:10:05,780 +Lần tới khi bạn thiết kế một trang web, hãy nghĩ về kiểu chữ bạn sẽ chọn. + +118 +00:10:05,780 --> 00:10:11,750 +Hãy suy nghĩ về những gì bạn đang cố gắng truyền đạt với những kiểu chữ đó và sau đó chọn một phông chữ + +119 +00:10:11,840 --> 00:10:14,660 +từ San-Serif hoặc Serif và có thể thử kết hợp chúng + +120 +00:10:14,660 --> 00:10:20,000 +để bạn có một tiêu đề là San-Serif và một phần thân là Serif và thử để tạo ra sự tương phản + +121 +00:10:20,000 --> 00:10:21,310 +trong thiết kế của bạn. + +122 +00:10:21,350 --> 00:10:28,310 +Vì vậy, hãy ghi nhớ điều này và hy vọng chúng sẽ làm cho thiết kế của bạn trở nên thú vị hơn và chuyên nghiệp hơn rất nhiều. + diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/004 Manage ATTENTION with effective User Interface (UI) Design.mp4 b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/004 Manage ATTENTION with effective User Interface (UI) Design.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..af1e9928a06ac5a48e65c01bfb201f1fc62eab96 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/004 Manage ATTENTION with effective User Interface (UI) Design.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07044833c6c54033fc41d35da22f1d9e4c6e62c3b8f4948f779f0f5e7fc1df6f +size 132514998 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/004 Manage ATTENTION with effective User Interface (UI) Design_vi.srt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/004 Manage ATTENTION with effective User Interface (UI) Design_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..dbeb17d176b31a248cba75904f8dfc3079f5e31c --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/004 Manage ATTENTION with effective User Interface (UI) Design_vi.srt @@ -0,0 +1,468 @@ +1 +00:00:01,020 --> 00:00:07,410 +Vì vậy, bây giờ chúng ta đã nói về một số nguyên tắc cơ bản của thiết kế như Lý thuyết màu sắc và + +2 +00:00:07,410 --> 00:00:11,790 +Kiểu chữ, điều tiếp theo tôi muốn nói đến là Thiết kế giao diện người dùng. + +3 +00:00:11,820 --> 00:00:14,340 +Bây giờ hãy nhìn vào bức tranh này. + +4 +00:00:14,400 --> 00:00:21,200 +Trong hầu hết các trường hợp, 99% trong số các bạn sẽ đọc “ĐÔI MẮT CỦA BẠN Ở ĐÂY” trước, “rồi ở đây” sau đó “Thật hấp dẫn + +5 +00:00:21,240 --> 00:00:22,360 +phải không? "Vì vậy, + +6 +00:00:23,010 --> 00:00:25,620 +đây chỉ là một cách mà bộ não của chúng ta hoạt động. + +7 +00:00:25,650 --> 00:00:30,560 +Chúng ta luôn bị thu hút bởi những thứ lớn hơn và táo bạo hơn. + +8 +00:00:30,630 --> 00:00:39,450 +Và là những nhà thiết kế, chúng ta có thể sử dụng kiến thức này để xác định hệ thống phân cấp. Vì vậy, giả sử rằng bạn đã viết lời + +9 +00:00:39,480 --> 00:00:42,770 +mời sinh nhật cho Jane. + +10 +00:00:42,780 --> 00:00:48,340 +Bạn có thể viết nó như thế này. Nhưng tất cả các thông tin đều có trọng số như nhau. + +11 +00:00:48,420 --> 00:00:54,060 +Vì vậy, với tư cách là một độc giả, tôi phải xem qua toàn bộ đoạn văn và tôi không thể chỉ đọc lướt qua nó để + +12 +00:00:54,060 --> 00:00:55,470 +nắm được những phần quan trọng. + +13 +00:00:55,500 --> 00:00:57,300 +Vì vậy, nó sẽ + +14 +00:00:57,330 --> 00:01:04,980 +khiến tôi mất nhiều thời gian hơn phải không? Mặt khác, nếu tôi áp dụng các quy tắc phân cấp thì + +15 +00:01:04,980 --> 00:01:12,420 +thông tin quan trọng nhất sẽ được chuyển tải trước và tôi đảm bảo rằng Jane thực sự biết bữa tiệc sinh nhật của ai, + +16 +00:01:12,690 --> 00:01:15,570 +nó ở đâu và khi nào họ nên đến. + +17 +00:01:15,570 --> 00:01:19,000 +Vì vậy, chúng ta có thể thiết lập hệ thống phân cấp theo một số cách. + +18 +00:01:19,110 --> 00:01:21,930 +Rõ ràng nhất là thông qua việc sử dụng màu sắc. + +19 +00:01:22,110 --> 00:01:29,400 +Vì vậy, những màu thực sự nổi bật và nổi bật và có độ tương phản với nền đó có xu hướng được sử dụng cho hệ + +20 +00:01:29,400 --> 00:01:30,640 +thống phân cấp cao. + +21 +00:01:30,660 --> 00:01:37,100 +Vì vậy, ví dụ trong trường hợp này nếu tất cả các màu đều giống nhau, thì có vẻ như tất cả chúng đều có tầm quan trọng như nhau. + +22 +00:01:37,500 --> 00:01:43,110 +Nhưng mặt khác, nếu chúng ta có thứ gì đó rất sáng và rất nổi bật so với thứ gì + +23 +00:01:43,110 --> 00:01:50,370 +đó cao cấp hơn một chút, bị tắt tiếng hơn một chút, thì chúng ta biết chính xác nơi mà mắt chúng ta sẽ đi đến đầu tiên. + +24 +00:01:50,460 --> 00:01:56,880 +Bây giờ nếu bạn nhìn vào ví dụ này, đây là trang web ASOS. Và bảng màu chủ yếu + +25 +00:01:56,940 --> 00:02:03,570 +của họ là màu xám và trắng. Nhưng họ đã thực sự khéo léo sử dụng tông màu nhấn của mình, màu xanh + +26 +00:02:03,570 --> 00:02:07,560 +lá cây và màu đỏ này, để thực sự cho người dùng biết họ nghĩ bạn thực sự nên nhìn gì. + +27 +00:02:08,030 --> 00:02:13,860 +Và có vẻ như ASOS thực sự quan tâm đến việc bạn biết rằng họ có cửa hàng và bạn cũng có thể thêm sản phẩm + +28 +00:02:13,860 --> 00:02:17,250 +của mình vào túi để họ thực sự có thể kiếm tiền từ bạn. + +29 +00:02:18,000 --> 00:02:23,850 +Vì vậy, trong trường hợp này, họ đang sử dụng tông màu xanh lá cây đó để thực sự thu hút ánh nhìn đến nút đó + +30 +00:02:23,850 --> 00:02:30,430 +và đảm bảo rằng người dùng thực sự hoàn thành giao dịch của họ. Bây giờ ngoài màu sắc, bạn cũng nên nghĩ về + +31 +00:02:30,430 --> 00:02:36,460 +kích thước vì như tôi đã nói, những món đồ lớn hơn thường thu hút ánh mắt của bạn vào nó. + +32 +00:02:36,590 --> 00:02:42,740 +Vì vậy, ví dụ: nếu bạn xem trang web Coinbase mà bạn có thể sử dụng để mua tiền điện tử, chúng tôi có thể thấy + +33 +00:02:42,770 --> 00:02:48,740 +điều đầu tiên họ muốn nói với bạn là bạn có thể sử dụng trang web này để mua và bán tiền điện tử. + +34 +00:02:48,740 --> 00:02:55,960 +Bây giờ, điều lớn nhất tiếp theo trên trang là đầu vào email khổng lồ này và một nút có nội dung "Bắt đầu". + +35 +00:02:56,030 --> 00:03:02,570 +Vì vậy, bởi vì rất nhiều công ty chạy quảng cáo và họ đang trả tiền để người dùng truy cập vào trang của + +36 +00:03:02,570 --> 00:03:05,630 +họ, điều quan trọng là họ phải nắm bắt được email. + +37 +00:03:05,630 --> 00:03:08,930 +Đây là loại thiết kế này đang đại diện + +38 +00:03:08,930 --> 00:03:09,760 +phải không? + +39 +00:03:09,830 --> 00:03:15,560 +Miễn là bạn truy cập trang này, có thể bạn sẽ muốn xem nơi này, nơi bạn + +40 +00:03:15,560 --> 00:03:22,380 +đã nhập địa chỉ email của mình và bắt đầu để công ty có thể nắm bắt thông tin của bạn. + +41 +00:03:22,400 --> 00:03:28,970 +Bây giờ ngoài việc thiết lập hệ thống phân cấp về giao diện người dùng, bạn nên suy nghĩ về bố cục của + +42 +00:03:29,090 --> 00:03:30,460 +trang web của bạn. + +43 +00:03:30,530 --> 00:03:36,710 +Tất nhiên, một mặt, bạn có thể có khối văn bản lớn này chỉ là trang web của bạn, nơi mọi + +44 +00:03:36,710 --> 00:03:40,040 +thứ đều được trình bày theo cùng một cách hoặc + +45 +00:03:40,100 --> 00:03:46,970 +bạn có thể tạo ra nhiều sự quan tâm hơn bằng cách tạo một khối văn bản và sau đó xen kẽ với + +46 +00:03:46,970 --> 00:03:52,160 +các hình ảnh và sau đó tạo một số kích thước khác nhau và hình dạng khác + +47 +00:03:52,160 --> 00:04:02,820 +nhau và phân cấp khác nhau để làm cho thiết kế của bạn trông thú vị hơn. Bây giờ các trang Wikipedia là một ví dụ về thiết kế tồi bởi vì chỉ cần nhìn vào nó trông nhạt nhẽo như + +48 +00:04:02,820 --> 00:04:03,300 +thế nào. + +49 +00:04:03,300 --> 00:04:08,760 +Nó thực sự đang cố gắng trở thành một cuốn bách khoa toàn thư nhưng nó không nhất thiết phải như thế này. Bây giờ một trong những + +50 +00:04:08,760 --> 00:04:15,600 +điều đáng chú ý nhất về Wikipedia chỉ là độ dài của mỗi khối văn bản. + +51 +00:04:15,630 --> 00:04:18,870 +Chỉ cần nhìn vào độ dài của mỗi dòng văn bản. + +52 +00:04:18,870 --> 00:04:24,830 +Người dùng rất khó để mắt theo dõi cùng một dòng. + +53 +00:04:25,110 --> 00:04:32,250 +Và trên thực tế, về thiết kế giao diện người dùng, có một độ dài dòng tối ưu. Quá dài và đọc + +54 +00:04:32,250 --> 00:04:38,870 +hơi tẻ nhạt. Nhưng quá ngắn, nó cảm thấy hơi quá chặt chẽ và hơi khó đọc. + +55 +00:04:39,090 --> 00:04:44,940 +Vì vậy, bạn muốn nhắm mục tiêu khoảng 40 đến 60 ký tự mỗi dòng để người + +56 +00:04:44,940 --> 00:04:51,910 +dùng cảm thấy thoải mái và họ có thể xem qua thông tin và vẫn quan tâm đến trang web của bạn. + +57 +00:04:51,950 --> 00:04:58,850 +Giờ đây, khi bạn có bố cục tốt như trang web của Grammarly, nó không chỉ thú vị mà nó còn chia nhỏ nội + +58 +00:04:58,850 --> 00:05:04,880 +dung thành những phần nhỏ hơn để bạn thực sự xem được nhiều trang web hơn và bạn sẽ xem được + +59 +00:05:04,880 --> 00:05:06,050 +nhiều thứ hơn. + +60 +00:05:07,100 --> 00:05:10,610 +Bây giờ một điều khác tôi muốn nói đến là sự liên kết. + +61 +00:05:10,610 --> 00:05:17,360 +Điều này liên quan đến cách bạn định vị từng phần tử trên màn hình so với nhau. + +62 +00:05:17,360 --> 00:05:24,200 +Vì vậy, hãy xem ví dụ bên trái. Tiêu đề trên cùng được căn giữa trong khi + +63 +00:05:24,200 --> 00:05:30,370 +văn bản nội dung được căn trái. Và nó làm cho nó trông hơi khó xử như thể họ không thực sự muốn ở bên nhau. + +64 +00:05:30,500 --> 00:05:38,000 +Tuy nhiên, bây giờ ở bên phải chỉ bằng cách di chuyển căn chỉnh để cả hai điểm bắt đầu đều giống nhau cho tiêu + +65 +00:05:38,000 --> 00:05:43,410 +đề và nội dung, nó đột nhiên trông nhất quán hơn và thiết kế hơn rất nhiều. + +66 +00:05:43,520 --> 00:05:50,960 +Giờ đây, một trong những cách dễ nhất để làm cho bất kỳ kiểu thiết kế nào bạn tạo ra trông chuyên nghiệp chỉ + +67 +00:05:51,050 --> 00:05:53,780 +là giảm số lượng các điểm căn chỉnh. + +68 +00:05:53,850 --> 00:05:59,840 +Vì vậy, giả sử rằng bạn đang tạo một bản trình chiếu cho bản trình bày tiếp theo của mình + +69 +00:05:59,870 --> 00:06:01,680 +hoặc bạn đang tạo một áp + +70 +00:06:01,700 --> 00:06:09,290 +phích cho bữa tiệc sinh nhật của mình, hãy xem tất cả những thứ có trên thiết kế và xác định một dòng đi qua phần + +71 +00:06:09,380 --> 00:06:10,870 +đầu của mỗi mục. + +72 +00:06:10,880 --> 00:06:17,240 +Bây giờ nếu bạn có thể giảm số lượng đường như chúng ta đã làm ở đây ở bên phải thì đột nhiên thiết kế trông + +73 +00:06:17,240 --> 00:06:21,490 +mạch lạc hơn rất nhiều giống như tất cả các phần có ý nghĩa với nhau. + +74 +00:06:21,680 --> 00:06:25,100 +Và nó chỉ trông chuyên nghiệp hơn rất nhiều. + +75 +00:06:25,100 --> 00:06:31,400 +Vì vậy, hãy sử dụng các đường lưới này trong thiết kế của bạn để giúp bạn hình dung điểm bắt đầu của từng phần tử ở đâu + +76 +00:06:31,400 --> 00:06:33,490 +và cố gắng sắp xếp chúng thẳng hàng. + +77 +00:06:33,740 --> 00:06:40,490 +Bởi vì ngay cả khi bạn không làm gì khác ngoài việc căn chỉnh, bạn có thể thấy trong trường hợp này, bên trái trông luộm thuộm hơn + +78 +00:06:40,490 --> 00:06:47,780 +rất nhiều và bên phải trông thiết kế hơn và chuyên nghiệp hơn rất nhiều. Và tất cả những gì đã thay đổi, không có thay đổi về màu + +79 +00:06:47,780 --> 00:06:54,950 +sắc, không có thay đổi về kiểu chữ, chỉ là sự căn chỉnh. Bây giờ một khái niệm thực sự quan + +80 +00:06:54,950 --> 00:07:03,630 +trọng trong tất cả các thiết kế là Khoảng trắng. Và khoảng trắng đề cập đến không gian trống xung quanh văn bản hoặc làm tròn + +81 +00:07:03,630 --> 00:07:05,210 +các phần tử của bạn. + +82 +00:07:05,210 --> 00:07:12,230 +Bây giờ, đôi khi khi tôi đang ở trên phố cao, tôi bắt gặp một trong những cửa hàng giày dép hoặc túi xách sang trọng này và + +83 +00:07:12,290 --> 00:07:13,580 +tôi nhìn qua cửa sổ. + +84 +00:07:22,860 --> 00:07:24,540 +Bây giờ đây là một thử nghiệm. + +85 +00:07:24,540 --> 00:07:30,780 +Hãy nhìn vào cửa hàng bán túi xách này và hãy xem cái này. + +86 +00:07:30,840 --> 00:07:36,790 +Bây giờ bạn sẵn sàng trả bao nhiêu cho một chiếc túi xách từ cửa hàng này so với chiếc túi xách này. + +87 +00:07:37,080 --> 00:07:41,330 +Bây giờ đây thực sự là một trường hợp sử dụng cho khoảng trắng. + +88 +00:07:41,340 --> 00:07:45,030 +Rất nhiều cửa hàng sang trọng, cửa hàng thiết kế sang + +89 +00:07:45,030 --> 00:07:53,850 +trọng, một trong những công cụ đơn giản nhất của họ là chỉ phủ khoảng trắng xung quanh sản phẩm của họ, làm trống mọi thứ và nó + +90 +00:07:53,850 --> 00:08:00,690 +khiến mọi thứ bỗng nhiên trông đắt hơn rất nhiều. Trong khi đó, khi bạn có tất cả mọi thứ được nhồi nhét chặt chẽ + +91 +00:08:00,690 --> 00:08:06,120 +với nhau và bạn có rất nhiều sản phẩm được trưng bày, nó khiến nó giống như một loại cửa hàng giảm giá nào đó. + +92 +00:08:07,050 --> 00:08:12,030 +Và nguyên tắc tương tự cũng được áp dụng khi nói đến thiết kế kỹ thuật số. + +93 +00:08:12,030 --> 00:08:15,290 +Giả sử bạn có một quảng cáo cho tai nghe khử tiếng ồn. + +94 +00:08:15,570 --> 00:08:21,490 +Nếu bạn có vô số thứ trên màn hình, sẽ có "Mới", "Chỉ 20 đô la", "Loại bỏ tiếng ồn 100%". + +95 +00:08:21,540 --> 00:08:28,590 +Nó làm cho sản phẩm trông thực sự rẻ tiền. Trong khi nếu bạn chèn một số khoảng trắng, đột + +96 +00:08:28,590 --> 00:08:35,370 +nhiên có vẻ như Apple đã làm đúng? Chỉ bằng cách thêm không gian xung quanh mỗi phần tử trên màn + +97 +00:08:35,370 --> 00:08:41,090 +hình, bạn có thể làm cho thiết kế của mình trở nên tối giản hơn rất nhiều và đồng thời nâng tầm nó. + +98 +00:08:41,100 --> 00:08:46,650 +Bây giờ, điều cuối cùng về thiết kế Giao diện người dùng mà tôi muốn nói đến và có lẽ quan trọng + +99 +00:08:46,650 --> 00:08:49,170 +nhất là thiết kế cho khán giả của bạn. + +100 +00:08:49,170 --> 00:08:53,110 +Tôi đã nói rất nhiều điều, bao gồm cả việc không sử dụng truyện tranh, điều đó thực sự + +101 +00:08:53,130 --> 00:08:54,830 +phụ thuộc vào khán giả của bạn. + +102 +00:08:54,840 --> 00:09:00,810 +Giả sử bạn đang thiết kế một tấm áp phích buổi hòa nhạc dành cho trẻ em, tấm bên phải trông giống như + +103 +00:09:00,810 --> 00:09:06,530 +thứ mà trẻ em có thể thực sự muốn tham gia. Cái bên trái trông hơi giống quảng cáo đám tang. + +104 +00:09:06,540 --> 00:09:15,030 +Nó rất nghiêm trọng. Nó rất đen và trắng và nó trông nghiêm trọng đến nỗi không đứa trẻ nào muốn đi + +105 +00:09:15,030 --> 00:09:16,290 +xem buổi hòa nhạc đó. + +106 +00:09:17,250 --> 00:09:19,360 +Vì vậy, hãy nghĩ về khán giả của bạn. + +107 +00:09:19,500 --> 00:09:25,380 +Hãy nghĩ xem điều gì sẽ thu hút họ và điều gì quan trọng cần truyền đạt cho họ. Rằng đó sẽ là một buổi + +108 +00:09:25,380 --> 00:09:32,530 +hòa nhạc vui nhộn hoặc đó sẽ là những người lớn nhàm chán sẽ đọc báo và + +109 +00:09:32,580 --> 00:09:39,480 +một số loại ban nhạc cổ điển trong nền. Khi bạn thiết kế trang web, hãy thiết kế nó cho khán giả của bạn + +110 +00:09:39,480 --> 00:09:44,940 +ngay cả khi nó lộn xộn hơn một chút, táo bạo hơn một chút về màu sắc, miễn là nó phù hợp với đối + +111 +00:09:44,940 --> 00:09:47,360 +tượng của bạn và điều đó hoàn toàn ổn. + +112 +00:09:47,430 --> 00:09:54,300 +Vì vậy, hãy linh hoạt trong thiết kế của bạn để bạn không chỉ tạo ra một phong cách mọi lúc. Bạn đang tạo một phong cách cho một đối + +113 +00:09:54,300 --> 00:10:00,870 +tượng cụ thể như thanh thiếu niên muốn mua quần áo và bạn đang tạo một phong cách khác + +114 +00:10:00,960 --> 00:10:06,990 +cho những người muốn mua và bán tiền điện tử hoặc có trang web y tế. + +115 +00:10:07,530 --> 00:10:14,100 +Vì vậy, sự linh hoạt trong kỹ năng thiết kế của bạn thực sự quan trọng khi nói đến thiết kế Giao diện người dùng. + +116 +00:10:14,100 --> 00:10:22,350 +Nhưng hãy ghi nhớ năm điều đó: phân cấp, bố cục, căn chỉnh, khoảng trắng và đối tượng của bạn và bạn sẽ dễ dàng + +117 +00:10:22,350 --> 00:10:27,420 +tạo ra những giao diện người dùng đẹp hơn cho các trang web của mình. + diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/005 User Experience (UX) Design.mp4 b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/005 User Experience (UX) Design.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2461c752d84c54cf533644433514731bca151cb2 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/005 User Experience (UX) Design.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b11e9babcc21fe73aa68391665f07804c730f4843bf1254331063879b186d00 +size 304363587 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/005 User Experience (UX) Design_vi.srt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/005 User Experience (UX) Design_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..74cf6384bef76151f134939d38f3f9a5faf35ea2 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/005 User Experience (UX) Design_vi.srt @@ -0,0 +1,716 @@ +1 +00:00:00,540 --> 00:00:08,039 +Bây giờ, chúng ta đã nói về ba trụ cột của thiết kế web: Lý thuyết màu sắc, Kiểu chữ, Thiết kế giao diện người + +2 +00:00:08,039 --> 00:00:13,600 +dùng và bây giờ tôi muốn nói về trụ cột cuối cùng, thiết kế Trải nghiệm người dùng. + +3 +00:00:13,740 --> 00:00:19,520 +Hiện nay rất nhiều người thường nhầm lẫn không biết chính xác trải nghiệm người dùng hay trải nghiệm người dùng là gì? + +4 +00:00:20,460 --> 00:00:27,720 +Và một trong những cách tốt nhất mà tôi đã nghe nó giải thích là thông qua câu chuyện về việc cải tạo một trường đại học. + +5 +00:00:28,410 --> 00:00:35,640 +Vì vậy, đây là hình ảnh của trường Đại học Reed ở Hoa Kỳ và chúng ta hãy sử dụng nó làm bối cảnh tưởng tượng của chúng ta. + +6 +00:00:35,640 --> 00:00:41,550 +Vì vậy, trường cao đẳng này quyết định rằng nó cần phải được cải tạo nghiêm túc. Xé bỏ các tòa nhà, xây dựng những + +7 +00:00:41,550 --> 00:00:45,500 +tòa nhà mới và cải tạo hoàn toàn khuôn viên trường. + +8 +00:00:45,570 --> 00:00:51,660 +Vì vậy, họ đã mời vị kiến trúc sư nổi tiếng rất được kính trọng này trong lĩnh vực của mình. + +9 +00:00:51,780 --> 00:00:57,540 +Anh ấy đã đến và anh ấy đã làm một công việc tuyệt vời với tất cả các tòa nhà và người quản lý thực sự thực sự hạnh phúc. + +10 +00:00:57,540 --> 00:00:59,240 +Anh ấy đã nói rằng "Cái này trông rất tuyệt. "Nhưng + +11 +00:00:59,700 --> 00:01:02,710 +anh ấy có một câu hỏi. + +12 +00:01:02,790 --> 00:01:10,470 +“Này Mr. Kiến trúc sư. Có vẻ như bạn vừa rời khỏi bãi cỏ trong toàn bộ khuôn viên. Đâu là con đường mà mọi + +13 +00:01:10,470 --> 00:01:15,090 +người sẽ đi để đi giữa các tòa nhà? "Tại thời điểm này, kiến trúc sư + +14 +00:01:15,090 --> 00:01:20,810 +nói" Đừng lo lắng. Tôi sẽ trở lại sau một năm và tất cả sẽ được tiết lộ. "Vì vậy, trong một năm, + +15 +00:01:20,880 --> 00:01:28,320 +những con đường mà mọi người cần đi bộ tự nhiên trở nên chạy nước kiệu và cỏ bị mòn để + +16 +00:01:28,320 --> 00:01:31,540 +lộ ra những con đường mà mọi người cần. + +17 +00:01:31,800 --> 00:01:37,790 +Và đó là lúc kiến trúc sư thực sự đặt tất cả gạch và lát những con đường này. + +18 +00:01:38,370 --> 00:01:43,230 +Vì vậy, đây là một loại sự khác biệt giữa trải nghiệm người dùng và thiết kế. Thiết kế chúng ta thường nghĩ là + +19 +00:01:43,230 --> 00:01:49,820 +phải có tính thẩm mỹ, những gì chúng ta nghĩ là trông đẹp và thực thi điều đó đối với người dùng. + +20 +00:01:50,040 --> 00:01:54,000 +Giờ đây, trải nghiệm người dùng có nghĩa là vô hình. + +21 +00:01:54,000 --> 00:01:59,790 +Nếu bạn có trải nghiệm tốt với một trang web, nó có nghĩa là không phô trương và nó chỉ cho phép bạn + +22 +00:01:59,790 --> 00:02:05,490 +thực hiện công việc của mình và cảm giác như thể mọi thứ đều dễ dàng và mọi thứ đều dễ dàng. + +23 +00:02:05,490 --> 00:02:07,690 +Vì vậy, đây là những gì chúng tôi đang hướng tới. + +24 +00:02:07,860 --> 00:02:12,120 +Và để làm được điều đó, chúng ta phải nghĩ lại năm điều. + +25 +00:02:12,120 --> 00:02:21,000 +Đầu tiên là sự đơn giản. Giữ mọi thứ đơn giản luôn tốt hơn là làm cho nó phức tạp hơn hoặc lộn xộn hơn. + +26 +00:02:21,000 --> 00:02:27,570 +Vì vậy, đây là một trang web có tên là Sina và nó là một trong những trang web Tin tức lớn nhất ở Trung Quốc. + +27 +00:02:27,570 --> 00:02:33,320 +Bây giờ mỗi khi nhìn vào nó, tôi rất đau đầu vì nó quá dày đặc. + +28 +00:02:33,480 --> 00:02:39,030 +Có rất nhiều liên kết và bộ não của tôi bị quá tải và tôi nói "Không, không thể làm được. "Vì vậy, hãy xem + +29 +00:02:39,540 --> 00:02:42,270 +thay thế này. + +30 +00:02:42,330 --> 00:02:45,630 +Đây là Monocle, cũng là một trang web Tin tức. + +31 +00:02:46,020 --> 00:02:51,510 +Nhưng hãy nhìn vào cách họ quản lý để cắt nhỏ nội dung, mang lại một số hứng thú cho đôi mắt. + +32 +00:02:51,510 --> 00:02:55,290 +Có một chút đối thoại, một số hình ảnh, một số video, một chút văn bản. + +33 +00:02:55,680 --> 00:02:57,330 +Nó không bao giờ áp đảo. + +34 +00:02:57,360 --> 00:03:03,960 +Và với cách phối màu và kiểu chữ nhất quán đó, thực sự thú vị khi thực sự + +35 +00:03:03,960 --> 00:03:09,300 +đọc hơn là trải nghiệm làm bạn đau mắt với thiết kế này. + +36 +00:03:09,300 --> 00:03:13,720 +Đây là một trải nghiệm người dùng đẹp hơn nhiều vì nó đơn giản. + +37 +00:03:13,770 --> 00:03:18,700 +Vì vậy, bất cứ khi nào bạn phải lựa chọn, tôi nên làm cho nó phức tạp hơn hay tôi nên làm + +38 +00:03:18,810 --> 00:03:21,720 +cho nó đơn giản hơn, hãy luôn cố gắng giảm bớt nó. + +39 +00:03:22,000 --> 00:03:24,710 +Điểm thứ hai là tính nhất quán. + +40 +00:03:24,790 --> 00:03:31,320 +Giữ cho thiết kế của bạn nhất quán nhưng cũng giữ cho chức năng của sản phẩm nhất quán. + +41 +00:03:31,390 --> 00:03:33,140 +Vì vậy, đây là một ví dụ. + +42 +00:03:33,190 --> 00:03:42,520 +Đây là trang web cho Xfinity. Xfinity là một công ty truyền thông thực sự lớn ở Mỹ và + +43 +00:03:42,520 --> 00:03:48,130 +họ chịu trách nhiệm về nhiều thứ khác nhau như cung cấp TV và cung cấp internet. + +44 +00:03:48,130 --> 00:03:52,090 +Đây là ba ảnh chụp màn hình từ các phần khác nhau của trang web của họ. + +45 +00:03:52,090 --> 00:03:53,440 +Một là trang chủ của + +46 +00:03:53,440 --> 00:03:58,320 +họ, trang thứ hai là các dịch vụ truyền hình của họ và trang cuối cùng là trang Tin tức của họ. + +47 +00:03:58,420 --> 00:04:04,420 +Và nếu bạn nhìn vào thanh điều hướng trên cùng, bạn không chỉ thấy rằng họ đã thay đổi thiết kế của + +48 +00:04:04,420 --> 00:04:08,360 +thanh điều hướng giữa các phần khác nhau của trang web của họ, họ còn + +49 +00:04:08,530 --> 00:04:11,160 +làm cho nó hoạt động hơi khác một chút. + +50 +00:04:11,170 --> 00:04:15,460 +Các nút không nằm ở cùng một vị trí, thanh tìm kiếm di chuyển xung quanh. + +51 +00:04:15,580 --> 00:04:21,880 +Và sự không nhất quán đó có nghĩa là người dùng sẽ bối rối khi họ đi từ phần này sang phần khác + +52 +00:04:21,940 --> 00:04:25,850 +của trang web, phải học lại cách sử dụng trang web của bạn. + +53 +00:04:26,050 --> 00:04:31,210 +Nếu bạn nghĩ về đối tượng mục tiêu của công ty Xfinity này, rất nhiều người trong số họ sẽ già + +54 +00:04:31,210 --> 00:04:32,680 +hơn một chút phải không? + +55 +00:04:32,800 --> 00:04:38,530 +Và việc có chức năng không nhất quán và thiết kế không nhất quán sẽ thực sự khiến những người dùng + +56 +00:04:38,530 --> 00:04:41,440 +đó có trải nghiệm không tốt với trang web này. + +57 +00:04:41,440 --> 00:04:46,270 +Bây giờ, điều tiếp theo cần nghĩ đến khi bạn thiết kế trang web của mình là tính đến + +58 +00:04:46,270 --> 00:04:47,770 +cách đọc của mọi người. + +59 +00:04:47,770 --> 00:04:54,020 +Bây giờ họ đã xem xét cách mắt người theo dõi một trang web và họ nhìn vào những phần nào khi họ duyệt web. + +60 +00:04:54,190 --> 00:05:00,580 +Và một trong những mô hình đọc phổ biến nhất được gọi là mô hình F trong đó mắt bắt đầu ở trên cùng + +61 +00:05:00,580 --> 00:05:05,370 +bên trái của góc và sau đó nó theo dõi bên phải và sau đó lại lật ngược + +62 +00:05:05,500 --> 00:05:07,360 +lại duyệt xuống rãnh bên trái. + +63 +00:05:07,570 --> 00:05:14,020 +Vì vậy, bạn thường có những thứ như dấu đầu dòng hoặc hình ảnh hoặc biểu tượng, nút, tất cả chúng đều ở bên trái. + +64 +00:05:14,170 --> 00:05:17,280 +Vì vậy, bạn có thể thiết kế cho điều này bằng cách sử dụng bố cục F. + +65 +00:05:17,380 --> 00:05:24,490 +Vì vậy, hãy đặt những phần quan trọng nhất trong nội dung của bạn ở rãnh bên trái, có logo ở trên cùng và + +66 +00:05:24,520 --> 00:05:26,800 +mọi thứ đều tuân theo mẫu này. + +67 +00:05:26,800 --> 00:05:30,340 +Ví dụ như trang web này cho Bigcommerce. + +68 +00:05:30,340 --> 00:05:35,560 +Xem cách mắt được điều chỉnh tự nhiên theo hướng từ trái sang phải. + +69 +00:05:35,920 --> 00:05:42,610 +Bây giờ một mô hình thực sự phổ biến khác để đọc là mô hình chữ Z trong đó mắt chúng ta đi từ trái sang phải + +70 +00:05:42,610 --> 00:05:45,370 +và sau đó ngoằn ngoèo xuống tất cả các trang web. + +71 +00:05:45,370 --> 00:05:47,670 +Bây giờ điều này tất nhiên phụ thuộc vào loại trang web. + +72 +00:05:47,680 --> 00:05:52,540 +Vì vậy, bạn có thứ gì đó thưa thớt hơn với nhiều nội dung video hơn hoặc nếu ai + +73 +00:05:52,540 --> 00:05:54,440 +đó đang cố duyệt trang web + +74 +00:05:54,520 --> 00:06:01,050 +nhanh hơn một chút, bạn sẽ thấy họ sử dụng bố cục này. Và bố cục này được sử dụng khá nổi tiếng trong trang web Facebook + +75 +00:06:01,180 --> 00:06:05,520 +bằng cách sử dụng mẫu chữ Z đó để phù hợp với kiểu đọc tự nhiên của mọi người. + +76 +00:06:05,680 --> 00:06:10,810 +Vì vậy, hãy suy nghĩ về điều này. Hãy suy nghĩ về cách mọi người xem trang một + +77 +00:06:10,810 --> 00:06:16,680 +cách tự nhiên và đặt nội dung của bạn theo kiểu đó để giúp những người đang sử dụng trang web của bạn dễ dàng hơn. + +78 +00:06:16,700 --> 00:06:21,760 +Bây giờ trong thời đại ngày nay, điều thực sự quan trọng là phải nghĩ về Tất cả Thiết kế nền tảng. + +79 +00:06:21,940 --> 00:06:27,330 +Không còn đủ để chỉ thiết kế một trang web có nghĩa là đi vào một máy tính để bàn. + +80 +00:06:27,490 --> 00:06:30,700 +Thay vào đó, bạn cũng phải nghĩ về điện thoại di động. + +81 +00:06:30,790 --> 00:06:37,990 +Vì vậy, có một trang web có quy mô phù hợp với thiết bị di động, cái mà chúng tôi gọi là di động đáp ứng, thực sự quan trọng. + +82 +00:06:37,990 --> 00:06:45,070 +Bạn không muốn một trang web lớn được thiết kế để chiếm một loại màn hình ngang được nhồi nhét vào một + +83 +00:06:45,070 --> 00:06:45,860 +chiếc điện + +84 +00:06:45,940 --> 00:06:48,700 +thoại thực sự giống hình chân dung hơn. + +85 +00:06:48,820 --> 00:06:50,110 +Điều này trông thực sự tồi tệ. + +86 +00:06:50,110 --> 00:06:55,500 +Rất khó để đọc các liên kết riêng lẻ và thường xuyên hơn không, ngón tay của tôi thực sự quá lớn để chạm vào + +87 +00:06:55,510 --> 00:06:56,680 +độ dài mà tôi muốn. + +88 +00:06:57,190 --> 00:06:59,700 +Vì vậy, đây là một trải nghiệm người dùng thực sự tồi tệ. + +89 +00:07:00,670 --> 00:07:03,220 +Bây giờ điều này cũng có thể xảy ra theo cách ngược lại. + +90 +00:07:03,670 --> 00:07:10,030 +Vì vậy, một thiết kế trông đẹp hơn nhiều trên thiết bị di động nhưng sau đó khi hiển thị trên máy tính để bàn với loại màn hình + +91 +00:07:10,030 --> 00:07:14,550 +rộng, nó không sử dụng đủ diện tích màn hình. Ví dụ, đây là + +92 +00:07:14,560 --> 00:07:18,270 +thiết kế lại trang web mới nhất của Facebook. + +93 +00:07:18,430 --> 00:07:23,980 +Và bạn có tất cả không gian trống này không được sử dụng chút nào và mọi thứ đều bị nhét + +94 +00:07:23,980 --> 00:07:24,750 +vào giữa. + +95 +00:07:24,760 --> 00:07:31,260 +Điều này không hiệu quả lắm. Vì vậy, hãy suy nghĩ về cách bạn đang sử dụng không gian có sẵn và đảm + +96 +00:07:31,260 --> 00:07:39,210 +bảo rằng trang web của bạn tự sắp xếp lại khi nó được hiển thị trên màn hình dọc nhỏ hơn so với. màn hình máy tính để + +97 +00:07:39,240 --> 00:07:46,980 +bàn lớn hơn. Và cố gắng tránh một trong những kẻ trộm thú cưng của tôi về mặt thiết kế là có + +98 +00:07:46,980 --> 00:07:53,010 +quá nhiều biểu ngữ trên trang web của bạn hiển thị trên phiên bản di động khiến nội dung của bạn trở nên nhỏ đến mức không thể tin được. + +99 +00:07:53,160 --> 00:07:57,480 +Và ngay cả khi bạn đang cuộn, nó giống như bạn đang cuộn nó trên Apple Watch hay thứ gì đó. + +100 +00:07:57,480 --> 00:08:03,360 +Trong khi tất cả nội dung bổ sung này được đưa vào bởi các cảnh báo, biểu ngữ và cookie và nó không phải + +101 +00:08:03,360 --> 00:08:05,590 +là một trải nghiệm người dùng rất tốt. + +102 +00:08:05,730 --> 00:08:07,830 +Nhưng mặt khác, bạn cũng đừng phát điên lên. + +103 +00:08:07,830 --> 00:08:15,870 +Đừng làm cho toàn bộ trang web của bạn chỉ là một phần như một bức tranh hoặc một đoạn văn bản, mở rộng nó một cách ồ ạt + +104 +00:08:15,870 --> 00:08:21,960 +như thế này cũng rất khó xử vì sau đó tôi phải tiếp tục cuộn cho đến mãi mãi trước khi tôi + +105 +00:08:21,960 --> 00:08:25,080 +thực sự có thể đọc và xem tất cả Nội dung. + +106 +00:08:25,110 --> 00:08:26,630 +Vì vậy, tấn công một phương tiện hạnh phúc. + +107 +00:08:26,700 --> 00:08:29,430 +Và quan trọng nhất là kiểm tra, kiểm tra, kiểm tra. + +108 +00:08:29,430 --> 00:08:30,820 +Đưa nó cho những người dùng khác. + +109 +00:08:30,960 --> 00:08:35,960 +Bạn có thể thuê những người kiểm tra chuyên nghiệp để thử trang web của bạn và cung cấp cho bạn phản hồi. + +110 +00:08:35,970 --> 00:08:40,799 +Bây giờ nếu bạn không có khả năng đó, chỉ cần sử dụng gia đình và bạn bè của bạn. Và nướng một số cookie cho họ, yêu cầu + +111 +00:08:40,799 --> 00:08:46,800 +họ thử trang web của bạn và bắt đầu nhận được một số phản hồi về cách bạn có thể cải thiện thiết kế. + +112 +00:08:46,800 --> 00:08:51,840 +Bây giờ cuối cùng chúng ta đã nói rất nhiều về trải nghiệm người dùng và cách khiến mọi người có khoảng thời gian vui vẻ. + +113 +00:08:51,870 --> 00:08:57,900 +Giờ đây, một số nhà thiết kế sử dụng kiến thức họ có về tâm lý + +114 +00:08:57,900 --> 00:09:04,670 +con người và thiết kế Giao diện người dùng và Trải nghiệm người dùng để làm những điều xấu. + +115 +00:09:05,130 --> 00:09:13,410 +Và trong thế giới thiết kế, chúng tôi gọi đó là những mẫu tối. Vì vậy, các mẫu khiến người dùng thực hiện một hành động hoặc hành + +116 +00:09:13,410 --> 00:09:17,790 +vi có lợi cho công ty hoặc nhà thiết kế nhưng nó không nhất + +117 +00:09:18,120 --> 00:09:20,960 +thiết phải là những gì người dùng muốn. + +118 +00:09:21,030 --> 00:09:25,450 +Và điều này tôi có thể nói là một dạng khác của trải nghiệm người dùng tồi. + +119 +00:09:25,470 --> 00:09:27,510 +Vì vậy, hãy để tôi cung cấp cho bạn một số ví dụ. + +120 +00:09:27,540 --> 00:09:32,790 +Đây là một ví dụ thực tế trong cuộc sống. Giả sử bạn bước vào Waitrose, một siêu thị lớn + +121 +00:09:32,790 --> 00:09:35,880 +ở Anh và bạn đã mua cho mình một chiếc bánh sandwich. + +122 +00:09:35,880 --> 00:09:40,560 +Bây giờ khi bạn nhìn vào nó tại thời điểm bạn mua nó, có vẻ như chiếc bánh sandwich này sẽ có + +123 +00:09:40,560 --> 00:09:42,510 +chiều dài đầy đủ từ cạnh này sang cạnh + +124 +00:09:42,510 --> 00:09:43,410 +khác phải không? + +125 +00:09:43,470 --> 00:09:49,320 +Nhưng sau đó khi bạn mở bao bì ra, bạn sẽ thất vọng khi thấy rằng thực sự tất cả những gì + +126 +00:09:49,320 --> 00:09:55,540 +ở giữa chỉ là không khí và chiếc bánh sandwich của bạn hóa ra nhỏ hơn rất nhiều so với bạn nghĩ ban đầu. + +127 +00:09:55,610 --> 00:09:57,910 +Đó là cảm giác tồi tệ nhất trên thế giới. + +128 +00:09:58,000 --> 00:10:02,840 +Đây là cảm giác mà tôi không thể chịu đựng được khi thức ăn của tôi đột nhiên bị giảm kích thước. + +129 +00:10:02,940 --> 00:10:07,770 +Giống như thể có ai đó đi cùng và lấy thức ăn ra khỏi đĩa của bạn. Trong thế giới kỹ thuật + +130 +00:10:07,770 --> 00:10:13,770 +số, mọi người cũng làm điều tương tự. Thủ đoạn tương tự nhằm khiến bạn thực hiện một hành động mà bạn không nhất + +131 +00:10:13,770 --> 00:10:20,430 +thiết phải muốn và cuối cùng bạn sẽ cảm thấy thực sự thất vọng và thực sự khó chịu. Với Amazon, mỗi lần tôi phải nhấp lại vào nút + +132 +00:10:20,430 --> 00:10:21,110 +giao + +133 +00:10:21,120 --> 00:10:26,550 +hàng miễn phí mà tôi đã kiếm được khi mua rất nhiều sản phẩm từ họ. + +134 +00:10:27,060 --> 00:10:32,310 +Nhưng họ vẫn cố gắng lừa bạn bằng cách sử dụng những điều mà chúng ta + +135 +00:10:32,310 --> 00:10:39,060 +đã học về hệ thống phân cấp chẳng hạn. Ở đây, nút kiếm nhiều tiền hơn "Chuyển phát nhanh" được tô màu cam. + +136 +00:10:39,060 --> 00:10:40,860 +Nó bật ra nhiều hơn nữa. + +137 +00:10:40,920 --> 00:10:44,000 +Nhiều khả năng bạn sẽ muốn nhấp vào nó. + +138 +00:10:44,700 --> 00:10:50,880 +Nhưng rất có thể, bạn có thể hài lòng với việc giao hàng bình thường và bây giờ bạn bị lừa trả nhiều + +139 +00:10:50,880 --> 00:10:53,040 +tiền hơn cho lần giao hàng này. + +140 +00:10:53,040 --> 00:10:54,260 +Bây giờ đây là một + +141 +00:10:54,270 --> 00:10:56,230 +ví dụ khác thực sự đúng về cái ác. + +142 +00:10:56,400 --> 00:10:59,410 +Đây là một quảng cáo Snapchat cho một số loại giày. + +143 +00:10:59,760 --> 00:11:08,340 +Nhưng những gì nhà thiết kế đã khéo léo thực hiện trên quảng cáo là họ đã đặt một đường cong một pixel trên quảng cáo này khiến nó + +144 +00:11:08,460 --> 00:11:15,090 +trông giống như một sợi tóc trên màn hình của bạn. Nhưng khi bạn đi vào màn hình đó và bạn cố + +145 +00:11:15,090 --> 00:11:19,140 +gắng loại bỏ phần tóc đó, thì bạn cũng đã chạm vào một đại lộ. + +146 +00:11:19,170 --> 00:11:26,550 +Vì vậy, quảng cáo đưa bạn đến trang web và các nhà quảng cáo kiếm tiền từ mỗi nhấp chuột. + +147 +00:11:26,550 --> 00:11:32,020 +Và đây thực sự là một mẫu chó vì nó chỉ lừa bạn làm điều bạn không muốn. + +148 +00:11:32,250 --> 00:11:37,770 +Trong khi thiết kế tốt là giúp mọi người làm những gì họ muốn và mang lại cho họ trải nghiệm + +149 +00:11:37,800 --> 00:11:39,400 +tốt khi họ làm việc đó. + +150 +00:11:39,420 --> 00:11:47,250 +Giờ đây, ông hoàng của các mẫu chó là RyanAir và đó là một hãng hàng không giá rẻ ở Châu Âu thực sự nổi tiếng với + +151 +00:11:47,580 --> 00:11:50,720 +việc tính phí bạn cho mọi thứ nhỏ nhặt nhất. + +152 +00:11:50,730 --> 00:11:55,880 +Tôi sẽ không ngạc nhiên nếu ngày mai họ đột nhiên tính phí bạn vì sử dụng toilet trên máy bay. + +153 +00:11:56,580 --> 00:12:03,150 +Nhưng đây là giao diện của trang web khi bạn cố gắng mua vé máy bay. Để mua vé máy bay, bạn phải trải qua + +154 +00:12:03,150 --> 00:12:08,370 +tất cả các tiện ích bổ sung này, bao gồm cả việc nói "Không, tôi + +155 +00:12:08,370 --> 00:12:13,920 +không muốn mua bảo hiểm du lịch. "Nhưng hãy nhìn cách họ đã ẩn nó bên trong danh sách thả xuống lớn này và nó + +156 +00:12:13,920 --> 00:12:15,170 +thậm chí không nằm ở đầu danh sách. + +157 +00:12:15,180 --> 00:12:18,920 +Nó thực sự được sắp xếp theo thứ tự bảng chữ cái bên dưới Đan Mạch vì một số lý do. + +158 +00:12:19,530 --> 00:12:23,650 +Và điều này chỉ khiến bạn khó tìm thấy lựa chọn đó hơn rất + +159 +00:12:23,820 --> 00:12:27,910 +nhiều và khiến bạn thực sự vô tình mua bảo hiểm du lịch. + +160 +00:12:28,330 --> 00:12:34,930 +Bây giờ, ví dụ cuối cùng và có lẽ là một trong những mẫu chó mà tôi không thích nhất là những hộp kiểm này. Bạn biết ngay bên dưới bạn đã điền vào một biểu + +161 +00:12:34,930 --> 00:12:36,660 +mẫu, bạn nhận được những hộp + +162 +00:12:36,670 --> 00:12:42,130 +kiểm này và đôi khi từ ngữ khó hiểu đến mức tôi thực sự không biết mình đang đăng ký + +163 +00:12:42,130 --> 00:12:43,120 +để làm gì. + +164 +00:12:43,330 --> 00:12:49,720 +Như thế này: Nếu bạn không muốn chúng tôi tiếp tục ngừng gửi cho bạn các ưu đãi và giao dịch đặc + +165 +00:12:49,750 --> 00:12:53,150 +biệt hàng tuần, vui lòng cho biết bạn có khuynh hướng đồng + +166 +00:12:53,170 --> 00:12:57,440 +ý bằng cách không chọn hộp. Tôi không biết nhấp vào hộp đó có tác dụng gì. + +167 +00:12:57,460 --> 00:12:59,160 +Tôi thực sự chỉ ... Tôi không biết. + +168 +00:12:59,170 --> 00:13:00,490 +Tôi có thể nhấp vào nó, tôi có thể không. + +169 +00:13:00,490 --> 00:13:06,490 +Tôi không biết nó làm gì. Nhưng nó khó hiểu một cách khủng khiếp và nó không phải là một trải nghiệm người dùng tốt chút nào. + +170 +00:13:06,490 --> 00:13:10,440 +Tôi cá với bạn rằng sau khi đăng ký, tôi sẽ không bao giờ quay lại trang web + +171 +00:13:10,510 --> 00:13:11,390 +này nữa phải không? + +172 +00:13:11,410 --> 00:13:13,210 +Bạn cùng tôi không? Bây giờ chúng + +173 +00:13:13,240 --> 00:13:15,850 +ta đã thấy các trang web tốt trông như thế nào. + +174 +00:13:15,850 --> 00:13:18,130 +Chúng tôi đã thấy các trang web xấu trông như thế nào. + +175 +00:13:18,140 --> 00:13:20,650 +Chúng tôi thậm chí đã thấy những trang web xấu xa trông như thế nào. + +176 +00:13:21,100 --> 00:13:27,520 +Nhưng đã đến lúc kiểm tra kiến thức của chúng tôi bằng cách thiết kế trang web của riêng chúng tôi từ đầu + +177 +00:13:27,520 --> 00:13:31,460 +và áp dụng bốn trụ cột của thiết kế web cho dự án này. + +178 +00:13:31,510 --> 00:13:36,190 +Vì vậy, hãy suy nghĩ về những gì bạn đã học được cho đến nay và chuyển sang bài học tiếp theo, nơi + +179 +00:13:36,190 --> 00:13:38,860 +chúng ta sẽ thiết kế một trang web khách sạn từ đầu. + diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Build-a-design-using-canva.com.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Build-a-design-using-canva.com.url new file mode 100644 index 0000000000000000000000000000000000000000..3e48e3784c1f8dacd0bc09840db3a6c8fd676c58 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Build-a-design-using-canva.com.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.canva.com/ \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Course-Fixes-Report-an-Issue.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Design-Challenges-on-Daily-UI.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Design-Challenges-on-Daily-UI.url new file mode 100644 index 0000000000000000000000000000000000000000..3ef133632b05980088b93cf60ee7777b1321c437 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Design-Challenges-on-Daily-UI.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.dailyui.co/ \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Page-inspirations-on-Collect-UI.url b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Page-inspirations-on-Collect-UI.url new file mode 100644 index 0000000000000000000000000000000000000000..811196033ae34016cd5f21312294b2dbe1c56a2b --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Page-inspirations-on-Collect-UI.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://collectui.com/ \ No newline at end of file diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Web Design in Practice - Let's apply what we've learnt!.mp4 b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Web Design in Practice - Let's apply what we've learnt!.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c423ec329a180da7786b0d865ccfecd521a1f785 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Web Design in Practice - Let's apply what we've learnt!.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09e41478073a31e03ed86453210d0b1f58d5b0a5ed5c5b49d75f90099859f54d +size 551207504 diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Web Design in Practice - Let's apply what we've learnt!_vi.srt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Web Design in Practice - Let's apply what we've learnt!_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..57d661c8db0a231005736f3ac8c357ea581c1380 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/006 Web Design in Practice - Let's apply what we've learnt!_vi.srt @@ -0,0 +1,944 @@ +1 +00:00:00,540 --> 00:00:07,410 +Bây giờ chúng ta đã học về một số nguyên tắc của thiết kế web như Lý thuyết màu sắc, Kiểu chữ, Thiết kế + +2 +00:00:07,410 --> 00:00:14,730 +giao diện người dùng và thiết kế Trải nghiệm người dùng, bốn trụ cột, đã đến lúc áp dụng những gì chúng ta đã học và + +3 +00:00:14,790 --> 00:00:17,040 +xây dựng một thiết kế cùng nhau. + +4 +00:00:17,040 --> 00:00:23,220 +Giờ đây, có một trang web tên là Daily UI, cung cấp cho bạn nhiệm vụ thiết kế hàng ngày trong 100 ngày. + +5 +00:00:23,790 --> 00:00:29,610 +Đăng ký miễn phí và đó là thứ thực sự cải thiện kỹ năng thiết kế chỉ bằng cách thực hành + +6 +00:00:29,610 --> 00:00:31,060 +lặp đi lặp lại đó. + +7 +00:00:31,110 --> 00:00:37,070 +Bây giờ, nếu bạn xem một trang web có tên là Collect UI, bạn có thể thấy họ đã cùng nhau thu thập + +8 +00:00:37,170 --> 00:00:43,290 +tất cả các nhà thiết kế cố gắng thiết kế từng thách thức hàng ngày này và bạn có thể xem ví dụ + +9 +00:00:43,290 --> 00:00:44,800 +về từng thách thức này. + +10 +00:00:44,910 --> 00:00:52,810 +Ví dụ: bất cứ điều gì từ tạo màn hình đăng ký trang web chuyến bay đến trang web đặt phòng khách sạn. + +11 +00:00:52,830 --> 00:00:59,630 +Vì vậy, chúng tôi sẽ lấy một số ý tưởng này làm nguồn cảm hứng và tạo ra thiết kế trang web của riêng chúng tôi áp dụng bốn + +12 +00:00:59,700 --> 00:01:05,190 +trụ cột mà chúng tôi đã học được trong mô-đun này. Điều đầu tiên tôi muốn bạn làm là truy cập vào một + +13 +00:01:05,190 --> 00:01:07,980 +trang web có tên là canva. com. + +14 +00:01:07,980 --> 00:01:14,430 +Bây giờ đây là một chương trình chỉnh sửa đồ họa trực tuyến và bạn không phải tải xuống bất cứ thứ gì và hoàn toàn miễn + +15 +00:01:14,430 --> 00:01:15,660 +phí khi đăng ký. + +16 +00:01:15,870 --> 00:01:20,580 +Vì vậy, hãy đăng ký một tài khoản mới và sau đó tiếp tục và tạo một thiết kế mới. + +17 +00:01:20,610 --> 00:01:27,720 +Vì vậy, chúng tôi sẽ chọn kích thước tùy chỉnh và tôi sẽ chọn cao 1400 pixel x 800 pixel. + +18 +00:01:27,720 --> 00:01:33,750 +Khi chúng ta đã vào bên trong thiết kế của mình, chúng ta sẽ coi đây là màn hình đầu tiên mà người dùng nhìn thấy trong trang + +19 +00:01:33,750 --> 00:01:34,740 +web của chúng ta. + +20 +00:01:34,740 --> 00:01:39,270 +Và sau đó khi họ cuộn xuống, họ sẽ thấy trang tiếp theo và sau đó họ cuộn xuống và xem phần cuối cùng của + +21 +00:01:39,270 --> 00:01:40,350 +trang web của chúng tôi. + +22 +00:01:41,010 --> 00:01:44,060 +Vì vậy, hãy thiết kế màn hình tiêu đề đầu tiên. + +23 +00:01:44,340 --> 00:01:50,780 +Bây giờ tôi sẽ chọn mẫu miễn phí này đã cung cấp cho tôi phông nền nhưng thực ra tôi chỉ sử + +24 +00:01:50,780 --> 00:01:55,380 +dụng nó cho một số kết cấu. Tôi khá thích cách mà mô hình này trông. + +25 +00:01:55,410 --> 00:02:00,030 +Vì vậy, tôi sẽ áp dụng mẫu và sau đó tôi sẽ thay đổi nền. + +26 +00:02:00,030 --> 00:02:04,080 +Bây giờ tôi nghĩ rằng nền trông hơi nhạt nhẽo chỉ với một màu duy nhất. + +27 +00:02:04,500 --> 00:02:12,600 +Vì vậy, tôi sẽ chọn một bức ảnh để thay thế và tôi sẽ tìm kiếm một bãi biển, như bãi biển này. + +28 +00:02:12,600 --> 00:02:18,960 +Vì vậy, bây giờ tôi đã có hình ảnh của mình, tôi sẽ kéo nó ra để nó có kích thước lớn như nó cần. + +29 +00:02:19,410 --> 00:02:25,200 +Vì vậy, đi đến tất cả các cách đến từng cạnh. Và sau đó tôi sẽ định vị lại vị trí của nó để nó + +30 +00:02:25,200 --> 00:02:28,200 +lấp đầy toàn bộ màn hình. Như thế này. + +31 +00:02:28,200 --> 00:02:31,500 +Vì vậy, bây giờ tôi có một hình nền, một số loại kết cấu trên + +32 +00:02:31,880 --> 00:02:35,810 +đó và tôi có thể đi đến các phần tử để tiếp tục thêm vào thiết kế này. + +33 +00:02:35,820 --> 00:02:38,920 +Chúng ta hãy xem xét một số gradient ở đây. + +34 +00:02:39,180 --> 00:02:42,930 +Và tôi sẽ chọn thứ gì đó phù hợp với chủ đề này. + +35 +00:02:43,020 --> 00:02:46,590 +Tất nhiên, bây giờ bạn thiết kế như thế nào là hoàn toàn phụ thuộc vào bạn. + +36 +00:02:46,650 --> 00:02:52,710 +Và tôi chỉ cung cấp một ví dụ về cách tôi trải qua quá trình thiết kế này. + +37 +00:02:52,710 --> 00:02:54,510 +Vì vậy, bây giờ tôi có một vòng kết nối ở đây. + +38 +00:02:54,540 --> 00:03:02,670 +Tôi sẽ thêm một số hình dạng khác có thể là một hình vuông nào đó. Chúng ta có thể nhấp vào xem tất cả để xem tất cả + +39 +00:03:02,670 --> 00:03:03,870 +những cái khác. + +40 +00:03:04,320 --> 00:03:12,270 +Và sau đó tôi sẽ đặt một hình vuông mà tôi sẽ làm cho nó đi thẳng đến cuối mỗi + +41 +00:03:12,360 --> 00:03:13,340 +trang web. + +42 +00:03:13,350 --> 00:03:19,310 +Vì vậy, đây và sau đó chúng ta sẽ làm cho nó thẳng hàng với tâm của vòng tròn gần giống như thế này. + +43 +00:03:19,350 --> 00:03:23,460 +Và hãy thay đổi màu đó thành màu trắng. + +44 +00:03:23,460 --> 00:03:29,080 +Bây giờ chúng ta có đường viền màu trắng đẹp mắt này, một số hình dạng và hoa văn trừu tượng và một hình ảnh. + +45 +00:03:29,100 --> 00:03:34,530 +Bây giờ tôi sẽ thêm một văn bản tiêu đề. Tiêu đề này sẽ là tên của khách sạn của chúng tôi. + +46 +00:03:34,530 --> 00:03:41,140 +Sau cùng, chúng tôi đang thiết kế một trang web cho Khách sạn vô danh này mà tôi sẽ gọi là "Khách sạn". + +47 +00:03:41,580 --> 00:03:49,410 +Một cách thực sự dễ dàng để làm cho một thứ gì đó trông có thẩm quyền và giống như nó tồn tại mãi mãi là + +48 +00:03:49,410 --> 00:03:52,170 +thay đổi kiểu chữ thành kiểu chữ Serif. + +49 +00:03:52,620 --> 00:03:58,470 +Vì vậy, tôi sẽ đánh dấu phông chữ này và tôi sẽ nhấp vào menu thả xuống và tìm một kiểu chữ + +50 +00:03:58,560 --> 00:03:59,790 +serif như thẻ này. + +51 +00:04:00,480 --> 00:04:06,870 +Và hãy để ý xem khách sạn của chúng tôi trông như thế nào ngay lập tức trông giống như nó đã tồn tại lâu hơn. + +52 +00:04:06,960 --> 00:04:09,530 +Bây giờ tôi sẽ thay đổi màu của nó cũng thành màu trắng. + +53 +00:04:09,690 --> 00:04:16,709 +Vì vậy, hãy chú ý cách chúng ta bắt đầu thiết lập một bảng màu gồm xanh lá cây và xanh ngọc lam và xanh lam và trắng. + +54 +00:04:17,339 --> 00:04:26,870 +Và chúng tôi sẽ tăng kích thước phông chữ lên có thể là một cái gì đó thực sự lớn như 120 hoặc 144. Và tôi sẽ thay đổi điều này để tất cả + +55 +00:04:26,900 --> 00:04:30,070 +đều viết hoa như vậy. + +56 +00:04:30,850 --> 00:04:33,050 +Vì vậy, đó thực sự là + +57 +00:04:33,050 --> 00:04:41,360 +một chút quá lớn, vì vậy chúng ta hãy giảm nó xuống một bậc. Và tôi có thể tăng khoảng cách giữa các chữ cái để + +58 +00:04:41,360 --> 00:04:46,450 +làm cho nó trông lạ mắt hơn, đắt tiền hơn và có thẩm quyền hơn. + +59 +00:04:47,150 --> 00:04:51,710 +Đây là tên khách sạn của chúng tôi, A Hotel, được đặt chính giữa trong ô này. + +60 +00:04:51,710 --> 00:04:57,400 +Và bây giờ tôi đã sẵn sàng để thêm một tiêu đề phụ và tiêu đề phụ của tôi sẽ là một loại + +61 +00:04:57,400 --> 00:04:58,560 +khẩu hiệu phải không? + +62 +00:04:58,790 --> 00:05:05,020 +Và tôi sẽ đi với một thứ thực sự đáng ghét như "Đánh mất bản thân để tìm lại chính mình". + +63 +00:05:05,020 --> 00:05:07,070 +Tôi cảm thấy như tôi đã sẵn sàng để mở một khách sạn vào ngày mai. + +64 +00:05:07,850 --> 00:05:17,170 +Bây giờ, hãy đối chiếu kiểu chữ serif này cho tiêu đề với kiểu chữ San-Serif ở phần nội dung hoặc phụ đề. + +65 +00:05:17,330 --> 00:05:20,010 +Và đây là những gì chúng ta đã học trong phần typography. + +66 +00:05:20,030 --> 00:05:22,260 +Nó tạo ra sự tương phản trong thiết kế. + +67 +00:05:22,340 --> 00:05:28,820 +Vì vậy, tôi sẽ chọn kiểu chữ thờ ơ Glacial này và một lần nữa tôi sẽ chọn màu trắng và sau + +68 +00:05:28,820 --> 00:05:34,590 +đó căn trái cả hai dòng này để tôi có thể căn chúng vào cùng một vị trí. + +69 +00:05:34,820 --> 00:05:40,700 +Và đó là cách khi bạn kéo các phần tử xung quanh trên canvas, nó sẽ tự động cung cấp cho bạn các lưới + +70 +00:05:41,060 --> 00:05:46,670 +căn chỉnh này để bạn có thể dễ dàng định vị nó để chúng thực sự được căn chỉnh với nhau. + +71 +00:05:46,670 --> 00:05:48,710 +Và hãy chú ý đến sự khác biệt lớn + +72 +00:05:48,710 --> 00:05:54,190 +như thế nào khi nó không căn chỉnh và sau đó là căn chỉnh. Nó đột nhiên trông đúng hơn + +73 +00:05:54,210 --> 00:05:58,170 +rất nhiều phải không? Bây giờ tôi ít nhiều đã hoàn thành trang tiêu đề của mình. + +74 +00:05:58,190 --> 00:06:04,830 +Tôi sẽ chuyển sang trang tiếp theo sẽ là một trang bán các tính năng của khách sạn. + +75 +00:06:04,850 --> 00:06:11,330 +Hãy bắt đầu bằng cách thêm một số hình ảnh. Và tôi đã có một số mà tôi đã tìm thấy trước đây. + +76 +00:06:11,330 --> 00:06:18,290 +Tôi có một bức tranh về một phòng ngủ và tôi sẽ làm nó nhỏ hơn một chút như vậy và sau đó + +77 +00:06:18,290 --> 00:06:21,950 +tôi có một bức tranh về một bữa ăn sáng nào đó. + +78 +00:06:22,130 --> 00:06:24,290 +Vậy là bạn đã có đồ ăn tại khách sạn này. + +79 +00:06:24,290 --> 00:06:25,460 +Bạn sẽ không chết đói. + +80 +00:06:25,460 --> 00:06:27,770 +Điều đó khá quan trọng để mọi người biết. + +81 +00:06:29,460 --> 00:06:33,510 +Và tôi sẽ định kích thước của nó để nó thực sự có cùng kích thước với cái kia. + +82 +00:06:33,510 --> 00:06:34,930 +Vì vậy, tôi sẽ chỉ đặt nó lên hàng đầu. + +83 +00:06:35,680 --> 00:06:38,000 +Bây giờ cái cuối cùng sẽ là một cái hồ bơi. + +84 +00:06:38,050 --> 00:06:39,610 +Vì vậy, bạn cũng có một hồ bơi. + +85 +00:06:39,640 --> 00:06:41,830 +Bạn không cảm thấy nhàm chán nếu nó trở nên quá nóng. + +86 +00:06:41,830 --> 00:06:43,650 +Bạn luôn có thể xuống hồ bơi. + +87 +00:06:43,660 --> 00:06:45,780 +Nhân tiện, đây là một khách sạn tuyệt vời, + +88 +00:06:45,790 --> 00:06:47,690 +tôi thực sự muốn ở lại đây. + +89 +00:06:47,690 --> 00:06:52,600 +Bây giờ mục tiêu của trang tính năng của chúng tôi là có ba hình ảnh có thể có + +90 +00:06:52,600 --> 00:06:53,470 +cùng kích thước. + +91 +00:06:53,500 --> 00:06:59,920 +Vì vậy, tôi thực sự sẽ cần cắt bức ảnh cuối cùng này để có thể loại bỏ một chút cạnh + +92 +00:06:59,950 --> 00:07:05,520 +bên phải này nhưng có kích thước nó vừa bằng với các bức ảnh khác của tôi. + +93 +00:07:05,800 --> 00:07:10,780 +Và bây giờ tôi cần thay đổi kích thước của từng bức ảnh này để nó thực sự có thể vừa với trang này. + +94 +00:07:11,500 --> 00:07:14,850 +Vì vậy, tôi sẽ ném chúng lên trên cái kia và thay đổi kích + +95 +00:07:14,860 --> 00:07:16,670 +thước để chúng có cùng kích thước. + +96 +00:07:16,990 --> 00:07:21,210 +Và bây giờ tôi có thể đặt chúng xung quanh trang web này. + +97 +00:07:21,340 --> 00:07:25,730 +Vì vậy, khi bạn di chuyển về phía cạnh của mỗi trang, bạn có thể thấy lưới này hiển thị. + +98 +00:07:25,810 --> 00:07:29,500 +Vì vậy, tôi sẽ xếp hàng bên trái với bên trái của lưới bên phải + +99 +00:07:29,500 --> 00:07:32,410 +với bên phải của lưới và giữa bên phải ở giữa. + +100 +00:07:32,410 --> 00:07:39,160 +Vì vậy, bây giờ ba cái này cách đều nhau và bây giờ tôi có thể thêm một số tính năng thiết kế + +101 +00:07:39,160 --> 00:07:42,430 +cho nó vì nó trông hơi nhạt nhẽo giống như ảnh. + +102 +00:07:42,460 --> 00:07:48,180 +Bây giờ, một trong những điều dễ dàng nhất để làm cho ảnh đẹp là chỉ chỉnh sửa nó với một khung hình. + +103 +00:07:48,180 --> 00:07:51,440 +Bây giờ vì tất cả khách sạn đều rất hiện đại, nó + +104 +00:07:51,520 --> 00:07:53,210 +hiện đại, nó đã được + +105 +00:07:53,230 --> 00:07:57,820 +giới thiệu trên Vogue, tôi muốn đảm bảo rằng khung hình cũng trông hiện đại không kém. + +106 +00:07:57,820 --> 00:08:04,780 +Vì vậy, tôi sẽ tìm một hình tròn và tôi sẽ đặt hình tròn này xung quanh hình vuông này sẽ + +107 +00:08:04,780 --> 00:08:11,590 +làm cho nó trông khá đẹp và hiện đại. Và sau đó tôi sẽ cung cấp cho nó một màu nền như vậy. + +108 +00:08:11,590 --> 00:08:14,520 +Và bây giờ chúng tôi đã đóng khung bức tranh của mình. + +109 +00:08:14,740 --> 00:08:22,150 +Vì vậy, bây giờ, tất cả những gì tôi phải làm là sao chép nó và đặt nó vào tất cả các hình ảnh khác như vậy. + +110 +00:08:22,150 --> 00:08:24,490 +Và bây giờ tôi có ba tính năng. + +111 +00:08:24,550 --> 00:08:26,830 +Bạn có giường, bạn có thức ăn, bạn có bể bơi. + +112 +00:08:26,830 --> 00:08:31,650 +Nhiều hơn những gì bạn muốn? Phần tiếp theo có lẽ sẽ là một loại giải thích nào đó + +113 +00:08:31,660 --> 00:08:32,210 +phải không? + +114 +00:08:32,230 --> 00:08:39,789 +Vì vậy, hãy thêm tiêu đề phụ của các phần này và tiêu đề phụ sẽ giống như bạn có + +115 +00:08:39,789 --> 00:08:45,160 +được thức ăn đẹp, bạn có phòng đẹp và bạn có hồ bơi đẹp. + +116 +00:08:45,580 --> 00:08:50,070 +Vì vậy, ba điều mà chúng tôi đã có. Và tôi sẽ căn trái + +117 +00:08:50,080 --> 00:08:59,500 +từng bức ảnh này một lần nữa để tôi có thể căn chỉnh nó với mép trái của mỗi bức ảnh như thế này. + +118 +00:08:59,590 --> 00:09:07,240 +Vì vậy, cả ba phần văn bản này đều ở cùng một mức độ ngang và chúng cũng được căn chỉnh theo chiều + +119 +00:09:07,300 --> 00:09:10,360 +dọc với phần đầu của mỗi hình ảnh. + +120 +00:09:10,360 --> 00:09:16,240 +Bây giờ mỗi cái này sẽ cần được thiết kế sao cho chúng có cùng kiểu chữ với những gì chúng ta đã có + +121 +00:09:16,240 --> 00:09:18,370 +trong trang tiêu đề để nó nhất quán + +122 +00:09:18,370 --> 00:09:18,950 +đúng không? + +123 +00:09:18,970 --> 00:09:21,670 +Chúng tôi đang phản ánh điều tương tự mà chúng tôi đã thấy trước đây. + +124 +00:09:22,300 --> 00:09:29,890 +Vì vậy, tôi sẽ thay đổi điều đó một lần nữa thành sự thờ ơ Glacial và làm tương tự cho cả ba bit văn bản. + +125 +00:09:30,250 --> 00:09:36,370 +Và bây giờ chúng ta có thể đủ khả năng để tăng khoảng cách trong văn bản một chút để làm + +126 +00:09:36,370 --> 00:09:41,270 +cho nó trông rộng rãi hơn một chút. Vì vậy, tôi nghĩ rằng tôi đã + +127 +00:09:41,270 --> 00:09:46,940 +có 18 trên cái kia nên tôi cũng sẽ đặt 18 ở đây và 18 ở đây. + +128 +00:09:48,990 --> 00:09:49,350 +Chúng ta bắt đầu. + +129 +00:09:49,550 --> 00:09:56,200 +Vì vậy, chúng tôi đã có tất cả ba bit văn bản và bây giờ tất cả những gì chúng tôi cần chỉ là một chút nội dung văn bản. Đối với văn bản + +130 +00:09:56,210 --> 00:10:04,460 +bod, tôi sẽ sử dụng Lorem Ipsum. Vì vậy, tôi sẽ sử dụng một trong những trình tạo này và chỉ cần tạo một số văn + +131 +00:10:04,470 --> 00:10:12,200 +bản và tôi sẽ sao chép một chút nó và đưa nó vào thiết kế của mình. Thay thế văn bản đó bằng văn bản này và đó + +132 +00:10:12,200 --> 00:10:14,420 +là một chút quá nhiều. + +133 +00:10:14,420 --> 00:10:22,280 +Vì vậy, hãy làm cho nó nhỏ hơn một chút. Và chúng ta sẽ có một số văn bản sẽ đi ngay bên + +134 +00:10:22,280 --> 00:10:23,540 +dưới phần này. + +135 +00:10:23,780 --> 00:10:25,850 +Vì vậy, nó vẫn còn một chút quá nhiều. + +136 +00:10:25,850 --> 00:10:28,730 +Hãy bỏ câu cuối cùng đi. Điều đó trông khá tốt. + +137 +00:10:28,730 --> 00:10:31,340 +Bây giờ một lần nữa chúng tôi muốn giữ cho thiết kế của mình nhất quán. + +138 +00:10:31,340 --> 00:10:37,190 +Vì vậy, chúng tôi sẽ đảm bảo rằng nó lại được căn trái bằng cách sử dụng cùng một phông chữ như trước. + +139 +00:10:37,400 --> 00:10:44,360 +Và bây giờ chúng ta đã có một chút nội dung văn bản mà tôi sẽ tạo kiểu mới hơn bằng cách thay đổi màu sắc của từng + +140 +00:10:44,360 --> 00:10:45,310 +văn bản này. + +141 +00:10:45,380 --> 00:10:53,700 +Vì vậy, tôi muốn có thể giống như một màu xám đen như một trong những điều này và tương tự cho văn bản nội dung. + +142 +00:10:53,990 --> 00:10:56,750 +Bằng cách đó, nó không nổi bật cho lắm. + +143 +00:10:56,900 --> 00:10:58,350 +Và tôi sẽ + +144 +00:10:58,370 --> 00:11:03,620 +sao chép nó để đặt nó trên tất cả các tính năng khác. + +145 +00:11:03,620 --> 00:11:05,410 +Chú ý sự liên kết ở đây. + +146 +00:11:05,450 --> 00:11:08,390 +Tôi đã có tất cả các hình ảnh được căn chỉnh với + +147 +00:11:08,570 --> 00:11:11,570 +nhau, tất cả các vòng tròn này được căn giữa với mỗi hình + +148 +00:11:11,870 --> 00:11:17,610 +ảnh, tôi đã có tất cả văn bản được xếp dọc theo bên trái và điều này chỉ làm cho thiết kế trông chặt + +149 +00:11:17,780 --> 00:11:19,910 +chẽ hơn và nhất quán hơn rất nhiều. + +150 +00:11:20,090 --> 00:11:25,330 +Và hãy lưu ý cách bố trí mà tôi đã cố gắng giữ cho nó thú vị bằng cách có một số hình ảnh chia nhỏ văn + +151 +00:11:25,330 --> 00:11:31,130 +bản và đảm bảo rằng mỗi nội dung văn bản không bị lấn át. Nó không quá dài như một câu + +152 +00:11:31,130 --> 00:11:32,570 +lớn dài. + +153 +00:11:32,850 --> 00:11:36,440 +Nhưng thay vào đó, nó đủ ngắn để có thể dễ dàng đọc một cách nhanh chóng. + +154 +00:11:36,620 --> 00:11:40,790 +Bây giờ, điều khác mà bạn sẽ nhận thấy là có một mức độ phân cấp đang được thiết lập ở + +155 +00:11:40,800 --> 00:11:41,450 +đây phải không? + +156 +00:11:41,490 --> 00:11:46,630 +Rõ ràng điều mà tôi thực sự muốn mọi người biết là khách sạn của tôi có tên là A Hotel. + +157 +00:11:46,820 --> 00:11:51,800 +Nhưng ngoài ra, tôi cũng thấy món ăn đẹp quan trọng hơn phần nội dung + +158 +00:11:51,800 --> 00:11:53,640 +giải thích đoạn văn đó. + +159 +00:11:53,870 --> 00:11:59,750 +Và mỗi hình ảnh này cũng quan trọng hơn bởi vì, hãy đối mặt với nó, hầu hết mọi người nhìn vào hình ảnh và không đọc + +160 +00:11:59,750 --> 00:12:01,100 +bất cứ điều gì phải không? + +161 +00:12:01,340 --> 00:12:02,930 +Vậy là xong phần thứ hai của + +162 +00:12:02,930 --> 00:12:03,530 +trang web. + +163 +00:12:03,680 --> 00:12:08,270 +Và bây giờ chúng ta đang vào phần cuối cùng sẽ là trang liên hệ. + +164 +00:12:08,270 --> 00:12:15,080 +Vì vậy, trang liên hệ này, tôi sẽ lại tìm kiếm một bức ảnh về thứ gì đó khá + +165 +00:12:15,080 --> 00:12:17,530 +thời trang, đương đại, nhiệt đới. + +166 +00:12:17,810 --> 00:12:21,020 +Có lẽ chúng ta chỉ có thể tìm thấy hình ảnh của một quả dứa. + +167 +00:12:21,890 --> 00:12:24,130 +Và cái này trông khá ổn. + +168 +00:12:24,140 --> 00:12:30,320 +Hãy tiếp tục và định vị bức ảnh này sao cho nó có cùng kích thước với thiết kế. + +169 +00:12:30,560 --> 00:12:35,330 +Và bây giờ tôi có thể di chuyển nó lên trên để chỉ có phần dưới hiển thị những quả dứa của tôi. + +170 +00:12:35,330 --> 00:12:36,080 +Vậy là xong. + +171 +00:12:36,080 --> 00:12:43,100 +Chúng tôi đã có 1, 2 và 3 và phần cuối cùng chỉ là trang liên hệ với tôi. Trang liên hệ với tôi cũng sẽ cần một số + +172 +00:12:43,100 --> 00:12:45,280 +văn bản có tiêu đề. + +173 +00:12:45,350 --> 00:12:47,360 +Hãy cứ gọi đó là Ở lại. + +174 +00:12:47,360 --> 00:12:52,940 +Vì vậy, khi họ muốn ở lại, họ có thể xem phần này. Và chúng tôi sẽ sao chép lại phong cách này mà + +175 +00:12:52,940 --> 00:12:57,510 +chúng tôi đã có từ trước đó để chúng tôi thực sự có thể tái tạo nó ở đây và + +176 +00:12:57,740 --> 00:13:00,830 +chúng tôi giữ cho thiết kế của mình nhất quán một lần nữa. + +177 +00:13:00,830 --> 00:13:06,800 +Nó có cùng một chủ đề, cùng một bảng màu, cùng một kiểu chữ. + +178 +00:13:06,800 --> 00:13:13,280 +Tuy nhiên, điều này là một chút quá lớn. Vì vậy, hãy làm cho nó nhỏ hơn một chút để nó vừa với trang này. + +179 +00:13:13,400 --> 00:13:19,100 +Và một lần nữa, tôi sẽ nhất quán với các hình dạng hình học của chúng tôi, + +180 +00:13:19,100 --> 00:13:23,830 +thứ mang lại cảm giác hiện đại. Tôi có một loại hình chữ nhật, hình tròn, nhiều hình tròn hơn. + +181 +00:13:23,900 --> 00:13:31,880 +Vì vậy, chúng ta hãy chọn một hình dạng khác từ đây. Có thể là một hình lục giác nào đó. Điều đó trông khá tốt. + +182 +00:13:31,880 --> 00:13:33,260 +Hãy thêm hình + +183 +00:13:33,260 --> 00:13:43,490 +lục giác, làm cho nó nhỏ hơn một chút, chúng ta có thể di chuyển quả dứa xuống một chút và thay đổi cái này để + +184 +00:13:44,540 --> 00:13:47,930 +nó có màu trắng và nhỏ hơn một chút. + +185 +00:13:48,170 --> 00:13:50,000 +Tôi nghĩ rằng một cái gì đó như vậy sẽ làm khá tốt. + +186 +00:13:50,540 --> 00:13:57,380 +Vì vậy, bây giờ điều cuối cùng tôi muốn thêm là một số loại địa chỉ gửi thư, địa chỉ email, số điện thoại, sẽ + +187 +00:13:57,380 --> 00:14:02,200 +được đưa vào đây và nó sẽ được căn chỉnh độc đáo với từ stay này. + +188 +00:14:03,590 --> 00:14:10,190 +Vì vậy, hãy tiếp tục và lấy từ này và căn chỉnh nó sao cho dòng này bật lên + +189 +00:14:10,190 --> 00:14:16,810 +khi tôi cố gắng căn chỉnh nó như vậy và hãy đảm bảo rằng nó thực sự vẫn vừa vặn. + +190 +00:14:17,090 --> 00:14:23,450 +Vì vậy, có lẽ chúng ta phải di chuyển văn bản này lên một chút, giảm khoảng cách một chút. + +191 +00:14:23,450 --> 00:14:29,210 +Tôi nghĩ rằng rất nhiều lần bạn phải thử với thiết kế của mình để nó bắt đầu đẹp + +192 +00:14:29,210 --> 00:14:30,040 +với bạn. + +193 +00:14:30,200 --> 00:14:35,240 +Bạn có thể phải thay đổi mọi thứ một chút và linh hoạt với những quy tắc mà chúng tôi đã đề cập. + +194 +00:14:36,050 --> 00:14:43,610 +Vì vậy, bây giờ tất cả những gì chúng ta cần đảm bảo là từ được căn phải và văn bản của chúng ta cũng được căn phải + +195 +00:14:44,000 --> 00:14:50,240 +để chúng ta có thể thực sự xếp chúng lại với nhau để chúng thực sự trông giống như chúng đang ở + +196 +00:14:50,360 --> 00:14:51,830 +trên cùng một căn dọc. + +197 +00:14:51,860 --> 00:14:59,720 +Bây giờ, nếu chúng ta có thể xoay quanh kích thước của hình lục giác và đảm bảo rằng mọi thứ vẫn nằm trong hình lục giác và chúng ta đã hoàn thành khá nhiều + +198 +00:14:59,720 --> 00:15:05,960 +thiết kế của mình bây giờ. Điều đó đã mất những gì? Có lẽ 20 phút. Và chúng tôi đã quản + +199 +00:15:05,960 --> 00:15:11,330 +lý để áp dụng rất nhiều điều mà chúng tôi đã học được từ thiết kế Giao diện người + +200 +00:15:11,330 --> 00:15:19,700 +dùng hoặc thiết kế Trải nghiệm người dùng, Lý thuyết màu sắc và kiểu chữ để tạo ra trang web 3 trang trông rất hiện đại cho Khách sạn A. + +201 +00:15:19,700 --> 00:15:26,000 +Vì vậy, tại thời điểm này, có một tính năng thực sự thú vị trong Canva cho phép bạn xuất bản trang web. + +202 +00:15:26,150 --> 00:15:33,830 +Vì vậy, nếu bạn nhấp vào nút xuất bản này và bạn cuộn xuống hết cỡ và nhấp vào trang web thì bạn thực + +203 +00:15:33,860 --> 00:15:40,820 +sự có thể chọn kiểu Web làm tiêu chuẩn và sau đó mở nó như một trang web thực tế. + +204 +00:15:40,820 --> 00:15:46,100 +Lưu ý cách nó đặt ba trang của tôi lại với nhau thành một trang web thực sự và + +205 +00:15:46,490 --> 00:15:51,390 +tôi có thể cuộn xuống và cũng điều hướng đến nó thông qua thanh điều hướng. + +206 +00:15:51,410 --> 00:15:53,920 +Tất nhiên bây giờ chúng tôi không có tối ưu hóa thiết bị di động, + +207 +00:15:53,930 --> 00:16:01,130 +chúng tôi không có bất kỳ mã nào có bất kỳ chức năng nào, chúng tôi không thể thêm javascript vào nó. Nhưng ít nhất chúng ta có thể nhanh chóng đưa ra một + +208 +00:16:01,130 --> 00:16:06,440 +thiết kế, hình dung nó và chia sẻ nó với những người khác để xem họ nghĩ gì. + +209 +00:16:06,590 --> 00:16:11,050 +Và đây có lẽ là một trong những cách tốt nhất để xây dựng cơ bắp thiết kế của bạn. + +210 +00:16:11,060 --> 00:16:17,510 +Chỉ cần luyện tập lặp đi lặp lại cho đến khi bạn đạt đến điểm mà mọi người đều nhất trí rằng thiết kế của bạn + +211 +00:16:17,510 --> 00:16:22,520 +trông tuyệt vời và mọi người bắt đầu yêu cầu bạn thực sự xây dựng trang web cho họ. + +212 +00:16:22,520 --> 00:16:24,940 +Vì vậy, hãy nghiên cứu thật nhiều các trang web mà + +213 +00:16:24,940 --> 00:16:30,320 +bạn xem qua, những trang web mà bạn nghĩ là trông thực sự tốt. Và hãy nghĩ xem điều gì khiến chúng trở nên tốt và + +214 +00:16:30,320 --> 00:16:37,700 +sau đó cố gắng nắm bắt một số khía cạnh đó cùng với tất cả những gì bạn đã học được trong những bài học này để tạo ra những thiết kế mà + +215 +00:16:37,790 --> 00:16:38,840 +con người yêu thích. + +216 +00:16:38,840 --> 00:16:47,370 +Vì vậy, tôi hy vọng bạn sẽ dành một chút thời gian để tạm dừng video và bắt đầu tạo trang web khách sạn của riêng mình. + +217 +00:16:47,780 --> 00:16:54,020 +Vì vậy, hãy sử dụng chính những công cụ mà bạn đã thấy tôi sử dụng trên Canva và cố gắng thiết kế một kiểu khách sạn hơi khác một chút. + +218 +00:16:54,020 --> 00:17:00,500 +Điều gì sẽ xảy ra nếu nó phải là một khách sạn truyền thống hơn vào khoảng thời gian của Henry thứ 8 hay gì đó? Nó giống như một số khách sạn thực sự cũ kỹ + +219 +00:17:00,650 --> 00:17:07,200 +và họ muốn cho thấy họ suy đồi như thế nào, họ quyến rũ như thế nào và cố gắng thiết kế + +220 +00:17:07,200 --> 00:17:09,089 +một loại trang web khác. + +221 +00:17:09,710 --> 00:17:16,369 +Vì vậy, hãy tạm dừng video, thử xem và sau đó cố gắng áp dụng mọi thứ bạn đã học được trong mô-đun này + +222 +00:17:16,369 --> 00:17:17,579 +vào thiết kế đó. + +223 +00:17:17,869 --> 00:17:24,140 +Và khi bạn đã tạo thiết kế của mình, hãy chia sẻ liên kết này mà bạn có thể nhìn thấy ở đầu Canva để tất cả chúng + +224 +00:17:24,140 --> 00:17:28,950 +tôi có thể xem thiết kế của bạn và chúng tôi có thể nhận xét về vẻ đẹp của nó. + +225 +00:17:29,000 --> 00:17:34,670 +Vì vậy, hãy cố gắng làm điều đó và đảm bảo rằng bạn cho chúng tôi biết nó trông như thế nào trong các + +226 +00:17:34,670 --> 00:17:39,990 +nhận xét bên dưới và vui vẻ khi làm điều đó. Bây giờ tôi hy vọng bạn thực sự thích mô-đun này trên thiết kế web. + +227 +00:17:40,040 --> 00:17:42,550 +Nó hơi khác một chút so với những gì bạn đã quen từ trước đến nay. + +228 +00:17:42,590 --> 00:17:48,530 +Không có mã hóa trong mô-đun này nhưng thay vào đó, chúng tôi đã cố gắng giúp bạn suy nghĩ về tất cả các nguyên tắc thiết kế thực sự giúp + +229 +00:17:48,590 --> 00:17:54,380 +tạo ra các trang web đẹp, trang web mà mọi người sẽ yêu thích. Và hy vọng bạn sẽ nắm bắt được những trụ + +230 +00:17:54,380 --> 00:17:59,150 +cột và kiến thức này trong lần tiếp theo khi bạn xây dựng sản phẩm hoặc + +231 +00:17:59,150 --> 00:18:06,110 +xây dựng trang web của mình và bạn sẽ áp dụng nó cùng với mã của mình để bạn có các tính năng đẹp + +232 +00:18:06,110 --> 00:18:07,450 +và giao diện đẹp. + +233 +00:18:07,460 --> 00:18:12,440 +Bây giờ khi bạn đã tạo ra các thiết kế của riêng mình và bạn đã chia sẻ nó với chúng tôi thì đã đến lúc quay + +234 +00:18:12,440 --> 00:18:13,310 +lại mã hóa và + +235 +00:18:13,430 --> 00:18:18,570 +chúng tôi sẽ tiếp tục giải quyết việc phát triển web nhiều hơn. Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp + +236 +00:18:18,680 --> 00:18:19,280 +bạn ở đó. + diff --git a/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/external-links.txt b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..498d1b0ff7d0562d538ab9cc8a8ea1de3b7af116 --- /dev/null +++ b/part3/65 - Day 65 - Web Design School - How to Create a Website that People will Love/external-links.txt @@ -0,0 +1,24 @@ + +001 Penny-Juices-Website +https://www.pennyjuice.com/ + +001 Penny-Juice-Rebranded +https://www.behance.net/gallery/40393701/Penny-Juice-Rebrand + +002 Adobe-Color-Wheel +https://color.adobe.com/create/color-wheel + +002 Color-Hunt +https://colorhunt.co/ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 + +006 Design-Challenges-on-Daily-UI +https://www.dailyui.co/ + +006 Build-a-design-using-canva.com +https://www.canva.com/ + +006 Page-inspirations-on-Collect-UI +https://collectui.com/ diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/001 Day 66 Goals Build Your Own REST API Service.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/001 Day 66 Goals Build Your Own REST API Service.html new file mode 100644 index 0000000000000000000000000000000000000000..83b0cbf1c5482e731f97b0f9823955d37d19ade6 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/001 Day 66 Goals Build Your Own REST API Service.html @@ -0,0 +1 @@ +

On day 33, we learnt about APIs and since then, we've used a number of public APIs. e.g ISS location, Trivia Questions and Twilio. In a lot of cases, the API allows us to tap into a particular website's data or service.

Many companies have collected valuable data e.g. Bitcoin prices, Restaurant reviews and provide an API for developers to access this data for a price. Depending on how valuable the data/service is behind the API, these APIs can charge anywhere from $9 to $99 per month for access. Some even charge per API call.

What if you have access to some information that other people might want to use? E.g. You collected data on all the cafes in a particular city and figured out which ones were suitable for remote-work? Then you could create an API and charge people to access your data.

But how do you create an API?

That's what we'll tackle in today's lessons. Building a full REST API from scratch using Flask.


\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/002 What is REST.mp4 b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/002 What is REST.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3e51751c159cc797e2cd1b56ab3989a20b54da4e --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/002 What is REST.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7e4d85e8162aa1053e390572f65b7fe5dd2b6a920110272d021497771270507 +size 77758183 diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/002 What is REST_vi.srt b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/002 What is REST_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1e99f9a063841921018530dcab788f058b21d845 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/002 What is REST_vi.srt @@ -0,0 +1,676 @@ +1 +00:00:00,630 --> 00:00:01,280 +Được rồi, các bạn. + +2 +00:00:01,320 --> 00:00:08,490 +Vì vậy, trong mô-đun này, chúng ta sẽ tìm hiểu tất cả về cách xây dựng API RESTful của riêng bạn. + +3 +00:00:09,180 --> 00:00:15,990 +Bây giờ, trong các mô-đun trước, chúng tôi đã thấy và sử dụng các API mà người khác đã tạo và chúng tôi cũng đã + +4 +00:00:15,990 --> 00:00:21,170 +bắt đầu xây dựng máy chủ của mình để cho phép nhận yêu cầu và đăng yêu cầu. + +5 +00:00:21,570 --> 00:00:27,240 +Nhưng trong mô-đun này, chúng tôi sẽ làm điều đó từ đầu đến cuối và chúng tôi sẽ xây dựng API + +6 +00:00:27,240 --> 00:00:29,160 +RESTful hoàn chỉnh của riêng mình. + +7 +00:00:29,640 --> 00:00:35,430 +Bây giờ, câu hỏi đầu tiên bạn có thể đặt ra là REST chính xác nghĩa là gì và nó có nghĩa là gì + +8 +00:00:35,430 --> 00:00:37,100 +để làm cho một API RESTful, phải + +9 +00:00:37,140 --> 00:00:37,470 +không? + +10 +00:00:37,920 --> 00:00:44,850 +Chà, REST không nằm dài trên ghế và xem Netflix, mà nó thực sự là viết tắt + +11 +00:00:44,850 --> 00:00:48,630 +của REpresentational State Transfer, một điều khá hay. + +12 +00:00:48,630 --> 00:00:54,480 +Nhưng để hiểu nó, chúng ta phải quay lại một chút và chúng ta phải quay trở lại kiến trúc + +13 +00:00:54,480 --> 00:00:59,630 +cổ điển mà chúng ta đã xem xét, đó là kiến trúc máy khách và máy chủ. + +14 +00:00:59,820 --> 00:01:03,840 +Và đây là kiến trúc mà toàn bộ Internet được xây dựng dựa trên khá nhiều. + +15 +00:01:04,379 --> 00:01:09,210 +Vì vậy, chúng ta hãy chỉ xem xét nó một cách nhanh chóng. Vì vậy, máy khách thực hiện một yêu cầu đến máy chủ. + +16 +00:01:09,450 --> 00:01:11,130 +Vậy chính xác thì khách hàng là gì? + +17 +00:01:11,160 --> 00:01:16,710 +Chà, nếu chúng ta ở trong một nhà hàng, thì khách hàng sẽ là người trả tiền cho bữa ăn, phải + +18 +00:01:16,710 --> 00:01:17,030 +không? + +19 +00:01:17,310 --> 00:01:20,830 +Và người phục vụ sẽ là nhân viên phục vụ tại nhà hàng. + +20 +00:01:21,390 --> 00:01:27,420 +Vì vậy, khi khách hàng của chúng tôi đưa ra yêu cầu, chẳng hạn như tôi muốn một chiếc bánh pizza, sau đó người phục vụ phải kiểm tra xem + +21 +00:01:27,420 --> 00:01:30,510 +đây có phải là điều mà nhà hàng có thể đáp ứng hay không. + +22 +00:01:30,780 --> 00:01:35,330 +Và nếu vậy, anh ấy sẽ mỉm cười ân cần với bạn và thực hiện yêu cầu đó. + +23 +00:01:35,670 --> 00:01:41,310 +Nhưng nếu khách hàng yêu cầu thứ gì đó mà họ không có, chẳng hạn như xúc xích + +24 +00:01:41,310 --> 00:01:48,420 +và nó không có trong menu, thì máy chủ sẽ cung cấp cho bạn mã lỗi, tất nhiên, mã cổ điển là 404, đó + +25 +00:01:48,420 --> 00:01:50,640 +là tài nguyên không không tồn tại. + +26 +00:01:50,670 --> 00:01:58,280 +Chúng tôi không dự trữ xúc xích. Bây giờ khi máy khách thực hiện yêu cầu đó với máy chủ theo kiểu + +27 +00:01:58,290 --> 00:02:04,050 +cổ điển trên Internet, điều này được thực hiện thông qua một yêu cầu HTTP, yêu cầu giao thức truyền siêu văn bản. + +28 +00:02:04,680 --> 00:02:10,860 +Và sự tương tự cho điều này là nó giống như ngôn ngữ mà bạn đang sử dụng để đưa ra yêu cầu, giả sử bạn đang + +29 +00:02:10,860 --> 00:02:13,110 +nói rằng tôi muốn một chiếc bánh pizza, phải + +30 +00:02:13,110 --> 00:02:13,410 +không? + +31 +00:02:13,590 --> 00:02:17,880 +Và nếu bạn ở Pháp, bạn sẽ phải nói điều đó bằng tiếng Pháp, mặc dù tôi không + +32 +00:02:17,880 --> 00:02:22,890 +chắc bạn đang làm gì khi ăn pizza ở Pháp. Nhưng máy chủ sẽ có thể hiểu yêu cầu của bạn và trả lại + +33 +00:02:22,890 --> 00:02:24,120 +cho bạn kết quả chính xác. + +34 +00:02:24,630 --> 00:02:31,800 +Bây giờ, điều bạn phải nhớ là HTTP, giao thức truyền siêu văn bản này, không phải là ngôn ngữ duy nhất + +35 +00:02:31,800 --> 00:02:34,570 +mà máy chủ có thể nói, phải không? + +36 +00:02:34,830 --> 00:02:40,830 +Một thứ khác mà bạn có thể đã nghe nói đến, chẳng hạn như yêu cầu FTP, là yêu cầu giao + +37 +00:02:40,830 --> 00:02:41,860 +thức truyền tệp. + +38 +00:02:42,360 --> 00:02:47,340 +Vì vậy, nếu bạn sử dụng ngôn ngữ sai, bạn có thể không nhận lại được kết quả mà bạn đang tìm kiếm. + +39 +00:02:47,730 --> 00:02:54,810 +Vì vậy, ví dụ: nếu một máy chủ nói tiếng Pháp ở Pháp và bạn cố gắng nói chuyện với anh ta bằng tiếng Ý, điều đó có thể + +40 +00:02:54,810 --> 00:02:56,050 +sẽ không hoạt động. + +41 +00:02:56,280 --> 00:03:01,410 +Vì vậy, chúng tôi phải đảm bảo rằng chúng tôi có ngôn ngữ phù hợp để thực hiện yêu cầu của mình. + +42 +00:03:01,800 --> 00:03:07,350 +Bây giờ, tại thời điểm này, một số sinh viên có thể nói, à, còn thứ khác mà HTTPs yêu + +43 +00:03:07,410 --> 00:03:08,550 +cầu thì sao? + +44 +00:03:08,820 --> 00:03:09,310 +Đó là + +45 +00:03:09,310 --> 00:03:10,380 +viết tắt của từ gì, và + +46 +00:03:10,410 --> 00:03:11,820 +nó có phải là một ngôn ngữ khác không? + +47 +00:03:12,210 --> 00:03:16,760 +Vâng, HTTP là viết tắt của yêu cầu bảo mật HTTP. + +48 +00:03:17,010 --> 00:03:23,700 +Vì vậy, hãy nhớ rằng tất cả các yêu cầu và phản hồi của bạn đều được thực hiện trên Internet và có + +49 +00:03:23,700 --> 00:03:25,670 +thể được nhiều người tiếp cận. + +50 +00:03:25,980 --> 00:03:32,160 +Vì vậy, nếu bạn muốn đảm bảo nó an toàn để bạn không muốn truy cập vào một trang web nhập thông tin chi tiết thẻ của bạn + +51 +00:03:32,160 --> 00:03:38,640 +và nó chỉ được thông qua, bạn biết đấy, một yêu cầu HTTP tiêu chuẩn không có thật vì ai đó có thể chiếm đoạt nó trong quá trình + +52 +00:03:38,640 --> 00:03:40,970 +thực hiện và điều đó không thực sự chắc chắn. + +53 +00:03:41,130 --> 00:03:45,020 +Vì vậy, chúng tôi cũng có thể sử dụng mật mã và mã hóa + +54 +00:03:45,240 --> 00:03:49,980 +yêu cầu của mình để nếu ai đó chặn yêu cầu, họ sẽ không thể biết nó nói gì. + +55 +00:03:50,550 --> 00:03:54,510 +Bây giờ, điều này tương đương với việc giống như một ngôn ngữ mã bí mật. + +56 +00:03:54,870 --> 00:04:01,290 +Ví dụ: nếu cả bạn và người phục vụ đều nói tiếng Klingon, thì bạn có thể giao tiếp an toàn và không quan trọng + +57 +00:04:01,590 --> 00:04:06,510 +nếu bạn bị nghe lén trong nhà hàng vì không ai khác có thể hiểu bạn đang nói gì + +58 +00:04:06,690 --> 00:04:09,660 +ngoài chính bạn và người phục vụ của bạn . + +59 +00:04:09,900 --> 00:04:15,690 +Bây giờ, giả sử rằng máy khách đã thực hiện thành công yêu cầu tới máy chủ và đây là thứ + +60 +00:04:15,690 --> 00:04:18,089 +mà máy chủ có thể phục vụ, vì + +61 +00:04:18,300 --> 00:04:22,110 +vậy nó coi đó là một yêu cầu hợp lệ thay vì 404, + +62 +00:04:22,470 --> 00:04:28,020 +sau đó trong trường hợp này máy chủ sẽ phản hồi với kết quả về những gì bạn yêu cầu. + +63 +00:04:28,590 --> 00:04:35,160 +Vì vậy, trong nhà hàng, đó có thể là bánh pizza của bạn. Nhưng trên Internet, đó có thể là HTML của + +64 +00:04:35,370 --> 00:04:39,300 +trang web hoặc các tài nguyên như hình ảnh hoặc dữ liệu. + +65 +00:04:39,570 --> 00:04:44,610 +Bây giờ, để cung cấp cho chúng tôi kết quả đó, máy chủ có thể thực hiện một trong hai việc. + +66 +00:04:44,610 --> 00:04:49,980 +Nó có thể thực hiện một số tính toán, chạy một số mã để tìm ra kết quả mà bạn + +67 +00:04:50,130 --> 00:04:57,780 +cần, ví dụ: nếu máy chủ của chúng tôi là một ứng dụng web máy tính đơn giản hoặc máy chủ có thể cần giao tiếp với cơ sở + +68 +00:04:57,780 --> 00:04:59,970 +dữ liệu của chúng tôi để lấy + +69 +00:05:00,030 --> 00:05:06,360 +các phần dữ liệu có liên quan. khách hàng đã yêu cầu. Vì vậy, tùy thuộc vào loại yêu cầu mà + +70 +00:05:06,360 --> 00:05:13,320 +máy khách đưa ra, loại tài nguyên họ muốn, máy chủ có thể thực hiện một hoặc cả hai điều này. + +71 +00:05:13,680 --> 00:05:21,330 +Vì vậy, chúng tôi đã thấy rằng máy khách phải nói chuyện với máy chủ bằng cách sử dụng yêu cầu HTTP, một ngôn ngữ cụ thể mà máy chủ + +72 +00:05:21,330 --> 00:05:22,590 +có thể hiểu được. + +73 +00:05:23,130 --> 00:05:28,230 +Nhưng ngoài ra, chỉ có một số thứ nhất định mà máy chủ có thể làm, phải không? + +74 +00:05:28,440 --> 00:05:34,320 +Giả sử tại một nhà hàng, bạn sẽ có một thực đơn gồm các món mà nhà hàng cụ thể này sẽ phục vụ. + +75 +00:05:34,440 --> 00:05:36,830 +Và nó hoàn toàn giống nhau trên Internet. + +76 +00:05:37,380 --> 00:05:45,030 +Máy chủ sẽ có một loạt các API là các dịch vụ mà nó có thể hiển thị để khách hàng có thể + +77 +00:05:45,030 --> 00:05:45,900 +khai thác. + +78 +00:05:46,290 --> 00:05:48,300 +Và vì vậy, khi chúng tôi xây dựng + +79 +00:05:48,300 --> 00:05:54,540 +một API, chúng tôi giống như xây dựng menu những thứ mà máy chủ của chúng tôi có thể phản hồi khi khách hàng đưa ra + +80 +00:05:54,540 --> 00:05:55,140 +yêu cầu. + +81 +00:05:55,470 --> 00:06:02,330 +Vì vậy, bây giờ chúng ta đã hiểu cả ba thành phần, nghĩa là gì để làm cho API của chúng ta RESTful? + +82 +00:06:02,970 --> 00:06:07,130 +REST thực chất chỉ là một phong cách kiến trúc. + +83 +00:06:07,620 --> 00:06:13,830 +Vì vậy, cũng giống như bạn có các tòa nhà khác nhau có phong cách kiến trúc khác nhau, chẳng hạn như + +84 +00:06:13,830 --> 00:06:20,580 +phong cách kiến trúc Baroque với những mái vòm đẹp hoặc các tòa nhà khác có thể được xây dựng theo phong cách kiến + +85 +00:06:20,580 --> 00:06:24,930 +trúc Gothic với các cột trụ bay và những chùm sáng hùng vĩ này. + +86 +00:06:25,200 --> 00:06:32,100 +Và yêu thích của tôi, Tân cổ điển, có những hình dạng và cột vô cùng hình học này thực sự khiến bạn + +87 +00:06:32,100 --> 00:06:34,690 +liên tưởng đến kiến trúc Hy Lạp cổ. + +88 +00:06:35,610 --> 00:06:40,550 +Vì vậy, đây là những phong cách kiến trúc để thiết kế các tòa nhà. + +89 +00:06:40,890 --> 00:06:48,600 +REST là một phong cách kiến trúc để thiết kế các API và nó chắc chắn không phải là phong cách kiến trúc duy + +90 +00:06:48,600 --> 00:06:48,960 +nhất. + +91 +00:06:49,380 --> 00:06:55,800 +Vì vậy, một thứ thực sự rất nổi tiếng khác trước khi REST trở thành phong cách thống trị là SOAP. + +92 +00:06:56,160 --> 00:07:02,280 +Ngoài ra còn có GraphQL hoặc FALCOR và rất nhiều kiểu kiến trúc khác. + +93 +00:07:02,550 --> 00:07:06,240 +Nhưng tiêu chuẩn vàng cho các API Web là REST. + +94 +00:07:06,420 --> 00:07:08,370 +Vì vậy, đó là những gì chúng ta sẽ xem xét. + +95 +00:07:08,610 --> 00:07:15,400 +Và REST thực sự đã xuất hiện khá gần đây như một phần của Ph. D. + +96 +00:07:15,480 --> 00:07:20,580 +Đây là Roy Fielding và anh ấy đã làm bằng tiến sĩ tại Đại học California. + +97 +00:07:20,820 --> 00:07:26,430 +Và với tư cách là một phần của bằng tiến sĩ, ông đã nghiên cứu và đưa ra phong cách kiến trúc mà ngày nay chúng ta + +98 +00:07:26,430 --> 00:07:27,240 +gọi là REST. + +99 +00:07:27,570 --> 00:07:33,720 +Và nó đề xuất một bộ quy tắc mà các nhà phát triển web có thể tuân theo khi họ xây dựng các API của mình. + +100 +00:07:34,140 --> 00:07:41,430 +Và anh ấy đã đưa ra ý tưởng này rằng tất cả các trang web trên toàn bộ web sẽ sử dụng cùng một cấu trúc để xây dựng các + +101 +00:07:41,430 --> 00:07:42,260 +API của họ. + +102 +00:07:42,720 --> 00:07:48,240 +Ý tôi là, hãy tưởng tượng nếu bạn có cả một con phố và tất cả các tòa nhà của chúng đều có bố cục giống nhau. + +103 +00:07:48,540 --> 00:07:53,220 +Ví dụ, nhà vệ sinh dành cho nam và nữ luôn ở trên cùng một tầng, ở cùng một + +104 +00:07:53,310 --> 00:07:57,750 +vị trí, thì bạn sẽ không bao giờ rơi vào tình huống cố tìm nhà vệ sinh. + +105 +00:07:58,080 --> 00:08:04,200 +Vì vậy, những cuộc đấu tranh cá nhân của tôi sang một bên, về cơ bản là trong Ph. D. ông đề xuất rằng Internet cũng có thể làm được + +106 +00:08:04,200 --> 00:08:04,740 +như vậy. + +107 +00:08:05,010 --> 00:08:11,610 +Nếu mọi Web API được xây dựng bằng cách sử dụng các nguyên tắc hướng dẫn chung giống nhau, thì mọi người sẽ dễ dàng làm việc + +108 +00:08:11,610 --> 00:08:16,890 +cùng nhau và có thể sử dụng các API khác nhau một cách nhanh chóng, dễ dàng và hiệu quả. + +109 +00:08:17,070 --> 00:08:19,310 +Như vậy là khá gọn gàng cho một dự án tiến sĩ, phải không? + +110 +00:08:19,530 --> 00:08:21,180 +Chắc chắn có một số dự án + +111 +00:08:21,190 --> 00:08:26,370 +tiến sĩ tệ hơn nhiều như anh chàng đã phải xem xét các thông số về lực đẩy của phân chim cánh cụt. + +112 +00:08:26,850 --> 00:08:29,040 +Nhưng có lẽ nếu bạn thực sự thích chim cánh cụt, điều đó không sao cả. + +113 +00:08:30,870 --> 00:08:34,500 +Vậy chính xác thì chúng ta làm cách nào để làm cho API của mình RESTful? + +114 +00:08:34,950 --> 00:08:40,890 +Chà, có rất nhiều quy tắc mà một API phải tuân theo để trở nên RESTful. + +115 +00:08:41,460 --> 00:08:47,160 +Và cũng giống như bạn có các quy tắc mà bạn có thể tuân theo tại nơi làm việc hoặc trường học của mình, + +116 +00:08:47,160 --> 00:08:51,390 +bạn có thể mặc đồng phục, không mặc quần đùi, không mặc áo ba lỗ, không hút + +117 +00:08:52,860 --> 00:08:57,180 +thuốc trong tòa nhà, bạn cũng có một loạt các quy tắc để tạo ra một API RESTful . + +118 +00:08:57,570 --> 00:09:03,510 +Nhưng hai điều quan trọng nhất là sử dụng các động từ yêu cầu + +119 +00:09:03,630 --> 00:09:14,340 +HTTP, do đó, sử dụng ngôn ngữ yêu cầu HTTP đó và cũng sử dụng một mẫu cụ thể của các tuyến và URL điểm cuối. + +120 +00:09:15,120 --> 00:09:22,070 +Và hai điều này có lẽ là những phần quan trọng nhất để làm cho API của bạn hoạt động tốt. + +121 +00:09:22,080 --> 00:09:24,190 +Và chúng ta sẽ xem xét từng chi tiết. + +122 +00:09:24,540 --> 00:09:28,450 +Vì vậy, trước tiên, chính xác thì các động từ HTTP là gì? + +123 +00:09:28,470 --> 00:09:30,160 +Chà, bạn đã thấy một số trong số chúng. + +124 +00:09:30,630 --> 00:09:40,020 +Đầu tiên là GET, sau đó là POST, PUT và PATCH. PATCH xuất hiện tương đối gần đây vào năm 2010 và nó + +125 +00:09:40,020 --> 00:09:44,610 +đã được thêm vào ngôn ngữ yêu cầu HTTP gần đây. + +126 +00:09:44,640 --> 00:09:48,270 +Nhưng đó là một sự thay đổi rõ ràng về cách chúng tôi cập nhật dữ liệu và chúng tôi + +127 +00:09:48,270 --> 00:09:50,160 +cũng sẽ xem xét vấn đề đó một chút. + +128 +00:09:50,580 --> 00:09:52,020 +Và cuối cùng, bạn đã XÓA. + +129 +00:09:52,200 --> 00:09:59,010 +Vì vậy, đây là năm động từ HTTP mà bạn nên sử dụng để làm cho API của bạn RESTful. + +130 +00:09:59,310 --> 00:09:59,820 +Và + +131 +00:10:00,070 --> 00:10:07,650 +bạn có thể nhận ra rằng chúng có rất nhiều điểm tương đồng với một cái gì đó mà chúng ta đã đề cập trước đó trong mô-đun + +132 +00:10:07,650 --> 00:10:11,250 +cơ sở dữ liệu, đó là khi chúng ta xem xét CRUD, phải không? + +133 +00:10:11,250 --> 00:10:13,620 +Tạo, đọc, cập nhật và xóa. + +134 +00:10:14,370 --> 00:10:23,880 +Vì vậy, chúng tôi sẽ xem xét các động từ yêu cầu REST HTTP của chúng tôi cùng với các hàm CRUD trong cơ sở dữ liệu của chúng tôi và chúng tôi sẽ + +135 +00:10:23,880 --> 00:10:27,870 +xem mỗi động từ này hoạt động như thế nào trong thực tế. + +136 +00:10:28,290 --> 00:10:35,640 +Vì vậy, bây giờ chúng ta đã xem xét các động từ yêu cầu HTTP và chúng ta có thể thấy cách chúng được sử dụng, + +137 +00:10:35,640 --> 00:10:42,330 +điều tiếp theo cần nói đến là mẫu cụ thể của các tuyến và điểm cuối mà bạn phải sử dụng để làm cho + +138 +00:10:42,330 --> 00:10:43,720 +API của bạn RESTful. + +139 +00:10:44,070 --> 00:10:49,830 +Vì vậy, cũng giống như khi bạn đi săn, có nhiều tuyến đường khác nhau mà bạn sẽ sử dụng để đến + +140 +00:10:49,830 --> 00:10:53,390 +khu vực voi hoặc lạc đà hoặc hà mã, trong máy chủ + +141 +00:10:53,670 --> 00:11:00,150 +của chúng tôi, chúng tôi có thể chỉ định các tuyến đường hoặc URL cụ thể để truy cập các tài nguyên nhất định. + +142 +00:11:00,510 --> 00:11:07,470 +Vì vậy, bạn có thể có, bạn biết, www. Google. com / voi, sau đó điều đó sẽ + +143 +00:11:07,470 --> 00:11:12,020 +mang lại tất cả voi và / lạc đà sẽ dành cho lạc đà và hà mã. + +144 +00:11:12,240 --> 00:11:18,390 +Vì vậy, đây là các tuyến và chúng tôi đã sử dụng các tuyến trước đây trong mã máy chủ của mình. + +145 +00:11:18,630 --> 00:11:25,260 +Nhưng để API của chúng tôi trở nên RESTful, chúng tôi phải có một mẫu điểm cuối và tuyến đường cụ thể. + +146 +00:11:25,440 --> 00:11:30,410 +Vì vậy, ví dụ, nếu API của chúng tôi là API Wikipedia, phải không? + +147 +00:11:30,600 --> 00:11:34,440 +Và trong cơ sở dữ liệu của chúng tôi, chúng tôi có rất nhiều bài báo. + +148 +00:11:34,740 --> 00:11:40,780 +Bây giờ lộ trình cho / article áp dụng cho tất cả các bài báo. + +149 +00:11:40,950 --> 00:11:48,570 +Bây giờ, nếu chúng ta đã tạo một tuyến cho các bài báo, thì khi một khách hàng thực hiện một yêu cầu nhận / bài viết, nó sẽ + +150 +00:11:48,780 --> 00:11:51,030 +tìm nạp tất cả các bài báo đó. + +151 +00:11:51,570 --> 00:11:58,290 +Và khi họ thực hiện một yêu cầu đăng bài tới tuyến đường / bài viết, thì nó sẽ tạo một bài + +152 +00:11:58,290 --> 00:11:59,490 +viết mới và + +153 +00:12:01,030 --> 00:12:08,680 +thêm nó vào cơ sở dữ liệu bài viết của chúng tôi. Và khi chúng tôi thực hiện một yêu cầu xóa đối với / article, thì nó sẽ + +154 +00:12:08,680 --> 00:12:12,100 +xóa tất cả các bài báo trong cơ sở dữ liệu của chúng tôi. + +155 +00:12:12,340 --> 00:12:17,440 +Nhưng định tuyến RESTful cũng có các quy tắc cho các tài nguyên riêng lẻ. + +156 +00:12:17,650 --> 00:12:21,730 +Vì vậy, trong tất cả các bài viết, chúng tôi sẽ có các bài viết cụ thể, phải + +157 +00:12:21,730 --> 00:12:21,980 +không? + +158 +00:12:22,180 --> 00:12:24,490 +Giả sử chúng tôi có một bài + +159 +00:12:24,730 --> 00:12:32,530 +báo về Jack Bauer, sau đó nếu khách hàng đang nhắm mục tiêu / article / Jack-Bauer, thì nếu họ đưa ra yêu cầu nhận, điều đó + +160 +00:12:32,620 --> 00:12:37,750 +sẽ lấy bài báo cụ thể về Jack Bauer từ cơ sở dữ liệu của chúng tôi. + +161 +00:12:38,080 --> 00:12:44,590 +Và bạn cũng có thể sử dụng put và patch để cập nhật bài viết cụ thể đó trên Jack Bauer và bạn + +162 +00:12:44,800 --> 00:12:47,420 +cũng có thể xóa bài viết cụ thể đó. + +163 +00:12:47,590 --> 00:12:53,440 +Bây giờ, một chút sau, khi chúng ta tạo tất cả các tuyến này bằng cách sử dụng các động từ HTTP, sẽ rõ ràng + +164 +00:12:53,440 --> 00:12:56,190 +hơn rất nhiều về cách thức hoạt động của từng tuyến. + +165 +00:12:56,380 --> 00:13:02,230 +Nhưng hiện tại, tôi chỉ muốn bạn có cái nhìn tổng quan về định tuyến RESTful thực sự trông như thế nào trước khi chúng + +166 +00:13:02,230 --> 00:13:03,040 +ta bắt đầu. + +167 +00:13:03,370 --> 00:13:11,980 +Vì vậy, bây giờ chúng ta đã thấy cách hoạt động của các động từ yêu cầu HTTP và mô hình các tuyến làm cho API của bạn + +168 +00:13:12,370 --> 00:13:18,030 +RESTful, bước tiếp theo là bắt đầu và thực sự xây dựng API của riêng chúng tôi. + +169 +00:13:18,550 --> 00:13:22,030 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/003 Download the Starting Project.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/003 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..ce217d2015b69dfe0363c9ee786f9c411eb9913f --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/003 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip files from this lesson's resources.


2. Unzip and open the project in PyCharm. PyCharm should prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.

This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt


5. Take a look around the project. You can find the cafes.db database inside the folder called "instance".  The starting files consists of an SQLite database called cafes.db, I created this in the same way we created databases before. I added a bunch of records consisting of cafes around London. These are some of my favourite places to work from. Take a look a the database using DB Viewer and familiarise yourself with the fields in the database.

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/003 day-66-starting-files-cafe-api.zip b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/003 day-66-starting-files-cafe-api.zip new file mode 100644 index 0000000000000000000000000000000000000000..1cfc23aaadae8461ea17b79a6a78bddcc3155957 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/003 day-66-starting-files-cafe-api.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e593ee67aefe75fafa1d8c9d3b0501849ef741e419ea2e10a0df097c9f688ab0 +size 7327 diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/004 HTTP GET - a Random Cafe.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/004 HTTP GET - a Random Cafe.html new file mode 100644 index 0000000000000000000000000000000000000000..79c4fd7b4e5e54bf0254f83bed223e3611a714ed --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/004 HTTP GET - a Random Cafe.html @@ -0,0 +1 @@ +

Given our database consists of a bunch of cafes to remote-work from, one of the likely use cases of our API is a developer who wants to serve up a random cafe for their user to go to. So let's create a /random route that serves up a random cafe.

1. Create a /random route in main.py that allows GET requests to be made to it.

SOLUTION


2. When someone makes a GET request to the /random route, our Flask server should fetch a random cafe from our database.

NOTE: Don't worry about returning anything at the moment.

SOLUTION


Normally, we've been returning HTML templates using render_template(), but this time, because our server is now acting as an API, we want to return a JSON containing the necessary data. Just like real public APIs.

e.g. ISS API: http://api.open-notify.org/iss-now.json


In order to do this, we have to turn our random_cafe SQLAlchemy Object into a JSON. This process is called serialization.

Flask has a serialisation helper method built-in called jsonify() . But we have to provide the structure of the JSON to return.


3. See if you can use the documentation on jsonify() to figure out how to get the /random route to work. If successful, this is what you should see when you run main.py and go to localhost:5000/random

SOLUTION

The method described in the docs has maximum flexibility. It allows you to have perfect control over the JSON response. e.g. You could also structure the response by omitting some properties like id. You could also group the Boolean properties into a subsection called amenities.

e.g. CODE


But in most cases, you might just want to return all the data you have on a particular record and it would drive you crazy if you had to write out all that code for every route.

So another method of serialising our database row Object to JSON is by first converting it to a dictionary and then using jsonify() to convert the dictionary (which is very similar in structure to JSON) to a JSON.

CODE

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/005 HTTP GET - All the Cafes.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/005 HTTP GET - All the Cafes.html new file mode 100644 index 0000000000000000000000000000000000000000..d84467f5c04e7250417acc8051e5f231be422cab --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/005 HTTP GET - All the Cafes.html @@ -0,0 +1 @@ +

If someone was creating a website that lists all the cafes, then they would need to fetch all the cafes in our database.

e.g. https://laptopfriendly.co/london

CHALLENGE:

1. Create another GET route that's called /all

2. When a GET request is made to this /all route, your server should return all the cafes in your database as a JSON.

e.g.

https://gist.github.com/angelabauer/889a0e57359ede23e7b09a7902a45a6e


Hint: Combine the .execute() and .select() methods to make the query using flask-sqlalchemy.  Don't forget to convert your result into a Python list with .scalars().


SOLUTION

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/006 HTTP GET - Find a Cafe.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/006 HTTP GET - Find a Cafe.html new file mode 100644 index 0000000000000000000000000000000000000000..e877fdd4e356267a450f6710119fa548298b07f1 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/006 HTTP GET - Find a Cafe.html @@ -0,0 +1 @@ +

1. Create a /search route to search for cafes at a particular location.

If you look in the cafes.db, you can see the field location. This is the rough area where the caf is located.

Make your API return all the cafes in a particular area.

The user will make a GET request to your /search route and pass the location (loc) as a parameter.

Parameters are passed in the URL with a ?

If successful, this is what you should be able to do:

And if the location the user passed as the parameter doesn't exist then this is what you should see:

The challenge here is how to select all the cafes that have a particular location.


Hint: Consider selecting and filtering your results with .where().


SOLUTION

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/007 Postman - The all in one API Testing Tool.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/007 Postman - The all in one API Testing Tool.html new file mode 100644 index 0000000000000000000000000000000000000000..f9ce8af7781f829212b3c6098966ec798184d5c0 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/007 Postman - The all in one API Testing Tool.html @@ -0,0 +1 @@ +

As you can imagine, if you need to test your API with a bunch of parameters, it can quickly get tiring typing them all out in the URL bar of your browser. It's also super error-prone.

So how do developers test their APIs? One of the best tools is Postman.

It allows you to add key-value pairs for your request parameters and it will automatically format your URL:

It will also allow you to automatically create documentation for your API:

https://learning.postman.com/docs/publishing-your-api/documenting-your-api/

(We'll do this a bit later).


You can download Postman for free here:

https://www.postman.com/downloads/


After you have successfully tested your API route, try creating a new collection called Cafe & Wifi and adding all the existing routes to the collection.

You should end up with all 3 routes saved in your collection. This is important if you want to generate documentation for your API later.

See if you can successfully request a random caf using Postman.


\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/008 HTTP POST - A New Cafe.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/008 HTTP POST - A New Cafe.html new file mode 100644 index 0000000000000000000000000000000000000000..3ae7f1a501a8b5f700153357bfb6dddf08500d5b --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/008 HTTP POST - A New Cafe.html @@ -0,0 +1,4 @@ +

What if we wanted to add a new caf to the database? e.g. There is a website where users can contribute cafes they have discovered?

e.g. https://laptopfriendly.co/suggest

How would you test your API without building out a WTForm or HTML Form? Because that's likely where the POST request is going to come from.

Luckily Postman makes this easy.

The Key-Value pairs you enter into the Body tab in Postman is equivalent to <input> elements.

e.g.

<label>Name of Cafe</label>
+<input name="name">
+<label>Google Map URL Link</label>
+<input name="map_url">

It's so good at making POST requests that some call it the "POSTman".

This is what you're aiming to get in Postman:




SOLUTION

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/009 HTTP PUT vs. PATCH.mp4 b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/009 HTTP PUT vs. PATCH.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c085c7e26e7a61768cdb5862f37cbc95ddc4107e --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/009 HTTP PUT vs. PATCH.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac8af86ab9aae862785a4e5d6dfbe52a3154a816f84f61180892ef777abdb57f +size 6764266 diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/009 HTTP PUT vs. PATCH_vi.srt b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/009 HTTP PUT vs. PATCH_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..463364ebfc758f6792b884c559b821b074cbcc8c --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/009 HTTP PUT vs. PATCH_vi.srt @@ -0,0 +1,100 @@ +1 +00:00:00,210 --> 00:00:02,730 +Vậy sự khác biệt giữa put và patch là gì? + +2 +00:00:03,300 --> 00:00:04,870 +Chà, đây là một phép loại suy tốt. + +3 +00:00:05,070 --> 00:00:10,410 +Gần đây, tôi đã lên Amazon và tìm thấy một chiếc xe đạp rất đẹp. + +4 +00:00:10,770 --> 00:00:17,070 +Và bởi vì tôi thực sự muốn thải độc phổi của mình bằng cách tập thể dục quanh London, tôi đã nhấp vào nút Mua + +5 +00:00:17,070 --> 00:00:17,530 +ngay. + +6 +00:00:17,730 --> 00:00:23,040 +Vì vậy, tôi đã ở đó, siêu hạnh phúc, siêu phấn khích cho chiếc xe đạp của tôi đến nơi. + +7 +00:00:23,310 --> 00:00:29,880 +Và sau đó vào ngày đến, tôi mở chiếc hộp đó ra và chiếc xe đạp của tôi đã thực sự lộn xộn. + +8 +00:00:29,880 --> 00:00:31,640 +Toàn bộ bánh trước bị gãy. + +9 +00:00:31,950 --> 00:00:37,860 +Vì vậy, tôi không thực sự chắc chắn điều gì đã xảy ra tại kho hàng của Amazon, nhưng tôi đã liên hệ với họ và tôi muốn thử tìm + +10 +00:00:37,860 --> 00:00:40,200 +hiểu cách chúng tôi có thể giải quyết vấn đề này. + +11 +00:00:40,410 --> 00:00:43,350 +Vì vậy, có hai cách để họ có thể khắc phục sự cố này. + +12 +00:00:43,560 --> 00:00:47,760 +Lựa chọn một là họ gửi cho tôi một chiếc xe đạp hoàn toàn mới. + +13 +00:00:47,940 --> 00:00:55,860 +Vì vậy, đây là tương đương với đặt. Bạn đang cập nhật cơ sở dữ liệu của mình bằng cách gửi toàn bộ mục nhập để thay thế + +14 +00:00:55,860 --> 00:00:56,760 +mục nhập trước đó. + +15 +00:00:57,570 --> 00:01:03,650 +Bây giờ, tùy chọn khác mà Amazon đưa ra là họ chỉ cần gửi cho tôi một chiếc lốp mới. + +16 +00:01:03,840 --> 00:01:05,760 +Đó là thứ duy nhất bị hỏng, phần còn + +17 +00:01:06,030 --> 00:01:07,530 +lại của chiếc xe đạp vẫn ổn. + +18 +00:01:07,770 --> 00:01:13,890 +Và để cứu thế giới khỏi khí thải carbon, vận chuyển một bánh xe tốt hơn nhiều so với vận chuyển toàn + +19 +00:01:13,890 --> 00:01:15,410 +bộ một chiếc xe đạp. + +20 +00:01:15,930 --> 00:01:18,120 +Và điều này cũng giống như Patch. + +21 +00:01:18,360 --> 00:01:25,920 +Vì vậy, khi bạn đang gửi một yêu cầu vá đến máy chủ, bạn chỉ gửi một phần dữ + +22 +00:01:25,920 --> 00:01:30,950 +liệu cần được cập nhật. Thay vì toàn bộ mục nhập sẽ + +23 +00:01:31,170 --> 00:01:34,870 +được thay thế, bạn chỉ cần cập nhật thứ cần cập nhật. + +24 +00:01:34,890 --> 00:01:41,530 +Vì vậy, khi chúng ta thấy điều này trong thực tế, tôi muốn bạn nghĩ lại về sự tương tự xe đạp này và có thể nó sẽ giúp bạn + +25 +00:01:41,530 --> 00:01:44,010 +thử và hiểu sự khác biệt giữa hai từ này. + diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/010 HTTP PATCH - A Cafe's Coffee Price.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/010 HTTP PATCH - A Cafe's Coffee Price.html new file mode 100644 index 0000000000000000000000000000000000000000..58961a286d89c33971bc143d5774ce88219c89ad --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/010 HTTP PATCH - A Cafe's Coffee Price.html @@ -0,0 +1 @@ +

One of the fields in our caf database is the price of a single black coffee. It's a good way for users to gauge how expensive is the coffee shop. But cafes often change their prices. What if a user wanted to submit a change in price at one of the cafes?

If they knew the id of the caf (which they can get by making a GET request to fetch data on all the cafes), then they can update the coffee_price field of the caf.

In this situation, a PATCH request is probably more efficient, as we don't need to change any of the rest of the cafe's data.

1. Create a PATCH request route in main.py to handle PATCH requests to our API. In order for our API to be RESTful, ideally, the route should be something like this:

/update-price/<cafe_id>

So the user might go to localhost:5000/update-price/22 and that would update the caf with an id of 22.

HINT 1: You can use .get_or_404() easily get a caf by a particular id.

HINT 2: The user will also need to provide the updated price of a single black coffee by passing it with the request as a parameter.

Change the request type inside Postman to PATCH. This is what should happen if you've done this correctly, you should be able to test the API in Postman and get a successful response:

NOTE: There might be a chance that the id in the route doesn't exist. In this case, make sure you give the user the correct feedback:

SOLUTION


NOTE: Notice that even when the resource is not found and we get an error the correct HTTP code is not being returned. It should be 404 for "resource not found" but instead we're getting 200 for "a ok".

This is how you can pass an HTTP code with your response:

CODE

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/011 HTTP DELETE - A Cafe that's Closed.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/011 HTTP DELETE - A Cafe that's Closed.html new file mode 100644 index 0000000000000000000000000000000000000000..1fc31197388c1f46b48682eba62bec522a595122 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/011 HTTP DELETE - A Cafe that's Closed.html @@ -0,0 +1 @@ +

One of the saddest things is when your favourite caf/workplace closes. But we have to just accept and move on. Also, make a DELETE request to our server and update the database.

But we can't let just anyone delete things in our database. We might soon end up with someone accidentally deleting everything.

We can add a security feature by requiring an api-key . If they have the api-key "TopSecretAPIKey" then they're allowed to make the delete request, otherwise, we tell them they are not authorized to make that request. A 403 in HTTP speak.

Check out all the HTTP Codes: https://httpstatuses.com/

1. Complete this challenge by adding the DELETE route to /report-closed/<cafe_id>

e.g. The request via Postman might look like this:

And if they have the wrong api-key:

And if the caf with that id doesn't exist:


SOLUTION


\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 Build Documentation for Your API.html b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 Build Documentation for Your API.html new file mode 100644 index 0000000000000000000000000000000000000000..f1afccf81c04251b5eed4fe2be02965ad746255a --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 Build Documentation for Your API.html @@ -0,0 +1 @@ +

If we want other people to use our API, then we have to document how to use it. People can't see the code on our servers, so we have to tell them how to interact with our servers via the API constraints.

e.g. What are the routes, what are the required parameters etc.

Luckily for us, if you made all your requests in Postman and you gave each request a name and description then Postman will generate the documentation automatically for you.

1. Make sure that you've made each of the requests and they work as you expect.

2. Make sure all the requests are saved in the same collection e.g. My collection is called Cafe & Wifi:

3. Click on the three dots next to your collection name and go to "Publish Docs":

4. Go through the steps to publish your documentation and this is what you should end up with:

e.g. Here's mine: https://documenter.getpostman.com/view/2568017/TVRhd9qR


5. We can now edit out index.html to include an anchor tag to our API's documentation.


You can find the completed project solution code in this lesson's resources.

\ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 Course-Fixes-Report-an-Issue.url b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 day-66-cafe-api-end.zip b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 day-66-cafe-api-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..f04230523d0848715e212404ad6dde37e4c5abc1 --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/012 day-66-cafe-api-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34c9b69cf7c4c5be4f383ef88498fc55e6790848c6f446ff742114879469e668 +size 8302 diff --git a/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/external-links.txt b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d57b5726eb6fb1a1225afa4baaa11a6d3ba5267f --- /dev/null +++ b/part3/66 - Day 66 - Advanced - Building Your Own API with RESTful Routing/external-links.txt @@ -0,0 +1,3 @@ + +012 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/001 Day 67 Goals Building a RESTful Blog with Editing!.html b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/001 Day 67 Goals Building a RESTful Blog with Editing!.html new file mode 100644 index 0000000000000000000000000000000000000000..c48754a41c3c5067e627f0a8667d26837b2a0f5c --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/001 Day 67 Goals Building a RESTful Blog with Editing!.html @@ -0,0 +1 @@ +

Using the knowledge we've gained, we're going to take our blog even further. We'll add more HTTP routes so that you can create new blog posts, edit posts and delete posts. All inside your blog website.

This is what your blog will be able to do after today:

\ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/002 Download the Starting Project.html b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/002 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..3e97c1fe0bbcbfa4283c66a0a2f3ec8396feeefc --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/002 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip files from this lessons resources.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.

This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt



5. Look around the project. The starting files include an SQLite database called posts.db. I created this in the same way we created databases before. The database includes some sample posts and we will be using it instead of the npoint JSON bucket.


Take a look a the database using DB Viewer and familiarise yourself with the fields in the database.

\ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/002 day-67-starting-files-upgraded-blog.zip b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/002 day-67-starting-files-upgraded-blog.zip new file mode 100644 index 0000000000000000000000000000000000000000..7d92fb16010421a143316c8acad92a9b36f99288 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/002 day-67-starting-files-upgraded-blog.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abd7dfc5afa2e678c48e87b8eed9221577968c1c1d452a53373959454b846539 +size 1732995 diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/003 Requirement 1 - Be Able to GET Blog Post Items.html b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/003 Requirement 1 - Be Able to GET Blog Post Items.html new file mode 100644 index 0000000000000000000000000000000000000000..817e315537d6ba518401d4d5849741ed2b5c1c39 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/003 Requirement 1 - Be Able to GET Blog Post Items.html @@ -0,0 +1 @@ +

1. Let's put the knowledge from the previous days together. Instead of getting hold of blog posts from the npoint JSON bin as we've done in the previous blog project, grab the all the posts from the posts.db SQLite database using flask-SQLAlchemy.


I've included 3 posts in the database for the starting project. You'll need to add your code under the home "/" route.


This is what you should see when you are reading the blog posts from the posts.db:



2. Once you've successfully loaded all the posts, add the code so that a user can click on an individual post and read it:

HINT: Think about creating a route for the post with the post's unique id. You can then retrieve that particular post from the database. 


SOLUTION

\ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/004 Requirement 2 - Be Able to POST a New Blog Post.html b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/004 Requirement 2 - Be Able to POST a New Blog Post.html new file mode 100644 index 0000000000000000000000000000000000000000..543a86a3c68bbe3aaf8d3979d6e538721f1384c3 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/004 Requirement 2 - Be Able to POST a New Blog Post.html @@ -0,0 +1 @@ +

Load a form the create a block post

Create a new POST route called /new-post in your Flask server. This route should render the make-post.html page when you click on the "Create New Post" button. The make_post.html needs to display a form with 5 fields:

You will need to figure out how to use the Flask CKEditor package to make the Blog Content (body) input in the WTForm into a full CKEditor.

Useful Docs:

https://flask-ckeditor.readthedocs.io/en/latest/basic.html

https://bootstrap-flask.readthedocs.io/en/stable/macros/#render-form

https://flask-wtf.readthedocs.io/en/stable/

See if you can re-create the behaviour that you see in the gif below. Break down the task into smaller steps to make it easier.



Hint 1: Every time you make changes in the Jinja Templating of an HTML file, you will need to stop and re-run your server to see the changes.


Hint 2: If you got stuck, here's how you would link the "Create New Post" button to the make_post.html.


Hint 3: After creating the route, the next small step is making the form appear. Here's how you would create and render the WTF form. I've left out the form body for the blog content for now.

Hint 4: Here's how to add the CKEditor for the blog content body. You'll need to initialise it with your flask app and then load it on the make_post.html


Save the new post to the database

When the user is done typing out entries to all the fields, the data in the form should be saved as a BlogPost Object into the posts.db

Once the post is saved, the user should be redirected to the home page and the new post should show up if the saving process was successful.

Note: the date field is not in the WTForm, because the date should be automatically calculated using the datetime module in the server. The date needs to be formatted like this:

August 31, 2019

<full month name> <date number>, <full year>

Docs: https://www.w3schools.com/python/python_datetime.asp

e.g.


SOLUTION


For the more curious: the data from the CKEditorField is saved as HTML. It contains all the structure and styling of the blog post. In order for this structure to be reflected when you go to the post.html page for the blog post, we added a Jinja safe() filter. This makes sure that when Jinja renders the post.html template, it doesn't treat the HTML as text.  To apply a Jinja filter, we used the pipe symbol "|" and this goes between the Jinja expression and Jinja filter. e.g. {{ Jinja expression | Jinja filter }}. Note for simplicity we are not sanitising the HTML here and assuming that we can trust our blog authors to not post a malicious <script>.


\ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/005 Requirement 3 - Be Able to Edit Existing Blog Posts.html b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/005 Requirement 3 - Be Able to Edit Existing Blog Posts.html new file mode 100644 index 0000000000000000000000000000000000000000..b17d1d82b196dba12718514bfc1faa268b86a229 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/005 Requirement 3 - Be Able to Edit Existing Blog Posts.html @@ -0,0 +1,7 @@ +

Activate the "Edit" button

When you click on each of the blog posts on the home page you are taken to the post.html page for the blog post. At the end of the post, you can see an Edit Post button. When you click on this button, it should take you the make-post.html page.

1. In the main.py create a new route /edit-post/<post_id>

When the user clicks on the "Edit Post" button at the bottom of any blog post (post.html page) it should make a GET request to this route, where the post_id is the id of the post they were reading.

2. Change the make-post.html so that if the user came from "Create New Post" the <h1> should read "New Post", but if the user came to edit a particular blog post, it should read "Edit Post".

3. Fix the href for the edit button in the post.html and pass over the post's id.

e.g.


SOLUTION


Auto-populate the form fields for an existing post

1. When you head over to make-post.html the form should be populated with the existing content when editing an old post. Add the code to auto-populate the fields in the WTForm with the blog post's data. This way the user doesn't have to type out their blog post again.

You can do this by passing the post Object's properties when you create the form:

edit_form = CreatePostForm(
+    title=post.title,
+    subtitle=post.subtitle,
+    img_url=post.img_url,
+    author=post.author,
+    body=post.body
+)

SOLUTION


Redirect the user to the blog entry after submitting their edits

1. When the user is done editing in the WTForm, they click "Submit Post", the post should now be updated in the database. And the user redirected to the post.html page for that blog post.

NOTE: HTML forms (WTForms included) do not accept PUT, PATCH or DELETE methods. So while this would normally be a PUT request (replacing existing data), because the request is coming from a HTML form, you should accept the edited post as a POST request.

Also, the date field should not be changed, it should represent the original date the post was made. Not the date of the edit.

e.g.


SOLUTION

\ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 Course-Fixes-Report-an-Issue.url b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 Requirement 4- Be Able DELETE Blog Posts.html b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 Requirement 4- Be Able DELETE Blog Posts.html new file mode 100644 index 0000000000000000000000000000000000000000..f91f7bfa3318345773d910325e6cdeae0cf01ff2 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 Requirement 4- Be Able DELETE Blog Posts.html @@ -0,0 +1 @@ +

1. In index.html create an anchor tag that just shows a character next to each post.  (you can copy and paste this).

When you click on it, it should delete the post from the database and redirect the user to the home page.

In the main.py create a DELETE route at the path /delete/<post_id>

e.g.


SOLUTION


You can download the complete project from this lesson's resources.


\ No newline at end of file diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 day-67-upgraded-blog-end.zip b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 day-67-upgraded-blog-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..2ed0f61f71b3c913a612e59e7c5a37b85430e4e4 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/006 day-67-upgraded-blog-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb44bd18f5d3d06e813303de25960baf64c8b02eec0aeaaabe3205af0583c701 +size 1733365 diff --git a/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/external-links.txt b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d06ef8c7be4821826fa11d8509a0c4576a8e1899 --- /dev/null +++ b/part3/67 - Day 67 - Advanced - Blog Capstone Project Part 3 - RESTful Routing/external-links.txt @@ -0,0 +1,3 @@ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/001 Day 68 Goals - Login and Registering Users with Authentication.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/001 Day 68 Goals - Login and Registering Users with Authentication.html new file mode 100644 index 0000000000000000000000000000000000000000..a4c7555c27411f772f21927ba05b4cdb5d119cb0 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/001 Day 68 Goals - Login and Registering Users with Authentication.html @@ -0,0 +1 @@ +

The most important component of a website is having users. Real humans who can contribute to the website. If Facebook had no users then it would just be adverts. If blogs had no users then it would just be the ramblings of an author.

But in order to have users and associate data to user accounts, we need a way to register them and allow them to sign back into their accounts at a later date.

This means they will be giving us some information that we have to keep secure. This is what authentication is all about, how to figure out if a user really is who they say they are. And that is the goal of today; Figure out how to register, login and logout users with email and password. So they can access their own private profile pages.

Also, we're going to allow users to download a top-secret Flask Programming Cheat Sheet. But only once they have registered and signed up to our website.

Here's a demo of what we'll create by the end of the day:


\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/002 What is Authentication.mp4 b/part3/68 - Day 68 - Advanced - Authentication with Flask/002 What is Authentication.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..71c3e24bcb3f67bfbc7d4685a1870a63457d2562 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/002 What is Authentication.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d1d6c6a47c84b0e48c54df49111e67062bd00be724a0c1ae1a10f4906866e76 +size 10810567 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/002 What is Authentication_vi.srt b/part3/68 - Day 68 - Advanced - Authentication with Flask/002 What is Authentication_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..c5c23213911d82d9e624181d959a38eef7f9d3fd --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/002 What is Authentication_vi.srt @@ -0,0 +1,184 @@ +1 +00:00:00,300 --> 00:00:03,390 +Được rồi, các bạn, chào mừng bạn đến với một mô-đun hoàn toàn mới. + +2 +00:00:03,420 --> 00:00:08,640 +Và trong mô-đun này, chúng ta sẽ đề cập đến chủ đề xác thực. + +3 +00:00:09,030 --> 00:00:15,290 +Và đó là một thứ gì đó thường được cho là vô cùng phức tạp, nhưng không nhất thiết phải như vậy. + +4 +00:00:15,330 --> 00:00:21,750 +Và chúng tôi sẽ thực hiện từng bước từ đầu đến cuối để bạn có cái nhìn tổng quan về toàn + +5 +00:00:21,750 --> 00:00:24,510 +bộ quá trình thiết lập xác thực từ đầu. + +6 +00:00:25,230 --> 00:00:27,610 +Vậy tại sao chúng ta cần xác thực? + +7 +00:00:28,110 --> 00:00:35,730 +Chà, khi chúng tôi đang tạo trang web hoặc ứng dụng web của mình để người dùng sử dụng, thì những người dùng này sẽ + +8 +00:00:35,730 --> 00:00:38,430 +bắt đầu tạo dữ liệu trong trang web. + +9 +00:00:38,730 --> 00:00:40,710 +Họ có thể thích một số bài viết + +10 +00:00:40,920 --> 00:00:43,080 +nhất định, họ có thể tương tác với những người + +11 +00:00:43,230 --> 00:00:46,880 +dùng khác, có thể có tin nhắn được tạo hoặc công thức nấu ăn được tạo. + +12 +00:00:46,920 --> 00:00:49,860 +Sẽ luôn có một số dữ liệu người dùng được tạo. + +13 +00:00:50,400 --> 00:00:57,150 +Và để liên kết các phần dữ liệu đó với người dùng cá nhân, chúng ta cần tạo + +14 +00:00:57,150 --> 00:01:02,610 +một tài khoản cho mỗi người dùng. Vì vậy, họ sẽ đăng ký vào trang web của chúng + +15 +00:01:02,910 --> 00:01:09,450 +tôi bằng tên người dùng và mật khẩu và về cơ bản chúng tôi sẽ tạo loại giống như thẻ ID để họ nhận dạng duy nhất trên + +16 +00:01:09,750 --> 00:01:14,520 +cơ sở dữ liệu của chúng tôi và lưu tất cả dữ liệu mà họ tạo ra vào tài khoản đó. + +17 +00:01:15,060 --> 00:01:20,670 +Vì vậy, lần sau khi họ quay lại trang web, họ sẽ có thể sử dụng tên người dùng và mật khẩu + +18 +00:01:21,000 --> 00:01:28,110 +của mình và đăng nhập vào trang web của chúng tôi và có thể truy cập tất cả những phần thông tin có thể là riêng tư đó. + +19 +00:01:28,470 --> 00:01:33,510 +Vì vậy, theo cách này, bạn sẽ không phải tất cả mọi người đều có thể xem, bạn biết đấy, bạn đang gửi + +20 +00:01:33,510 --> 00:01:37,280 +tin nhắn riêng tư nào trên Facebook hoặc xem tin nhắn trực tiếp của bạn trên Twitter. + +21 +00:01:37,650 --> 00:01:39,030 +Vì vậy, điều đó khá đơn giản. + +22 +00:01:39,270 --> 00:01:45,420 +Bây giờ, lý do khác tại sao bạn có thể muốn thêm xác thực vào trang web của mình là để hạn chế quyền truy cập + +23 +00:01:45,630 --> 00:01:49,770 +vào các khu vực nhất định của trang web tùy thuộc vào trạng thái của người dùng. + +24 +00:01:50,040 --> 00:01:57,570 +Vì vậy, ví dụ: nếu bạn là Spotify hoặc Netflix và bạn tính phí đăng ký để truy cập vào các phần nhất định của trang web, thì + +25 +00:01:57,570 --> 00:02:03,210 +khi người dùng thanh toán, bạn phải cập nhật tài khoản của họ trong cơ sở dữ liệu của mình + +26 +00:02:03,210 --> 00:02:09,930 +để nói rằng họ đã thanh toán và họ sẽ được phép truy cập các chương trình truyền hình hoặc bài hát mà họ có + +27 +00:02:09,930 --> 00:02:10,229 +quyền. + +28 +00:02:10,770 --> 00:02:16,550 +Vì vậy, đó là một số lý do tại sao bạn có thể muốn thêm xác thực vào trang web của mình. + +29 +00:02:16,860 --> 00:02:21,030 +Nhưng xác thực có thể được thực hiện theo một số cách. + +30 +00:02:21,030 --> 00:02:27,690 +Tạo một trang web nơi chúng tôi đăng ký và đăng nhập người dùng có vẻ đơn giản, nhưng phần khó xác + +31 +00:02:27,690 --> 00:02:32,750 +thực đến từ mức độ an toàn mà bạn sẽ tạo ra trang web của mình. + +32 +00:02:32,840 --> 00:02:38,100 +Nhưng vì vậy, chúng ta sẽ tìm hiểu cách chuyển từ một trang web về cơ bản được + +33 +00:02:38,100 --> 00:02:45,210 +bảo mật bằng Cheeto sang một thứ nghiêm túc hơn rất nhiều và phù hợp hơn với các tiêu chuẩn ngành về bảo mật + +34 +00:02:45,210 --> 00:02:46,810 +tốt trên một trang web. + +35 +00:02:47,160 --> 00:02:50,600 +Vì vậy, cấu trúc của trang web của chúng tôi thực sự, rất đơn giản. + +36 +00:02:51,000 --> 00:02:59,760 +Nó có một trang chủ có hai nút cho phép bạn truy cập đăng ký hoặc đăng + +37 +00:02:59,760 --> 00:03:00,300 +nhập. + +38 +00:03:00,480 --> 00:03:06,120 +Và một khi người dùng đã được đăng ký hoặc đăng nhập và họ đã được xác thực, thì + +39 +00:03:06,150 --> 00:03:08,630 +họ có thể truy cập trang bí mật. + +40 +00:03:09,150 --> 00:03:15,090 +Vì vậy, tôi đã giữ phần còn lại của trang web khá đơn giản vì chúng tôi sẽ tập trung vào một chủ + +41 +00:03:15,090 --> 00:03:16,130 +đề khá phức tạp. + +42 +00:03:16,230 --> 00:03:23,010 +Vì vậy, tôi đã tạo một số tệp bắt đầu để bạn tải xuống để chúng tôi có thể tập trung nỗ lực vào việc học + +43 +00:03:23,010 --> 00:03:27,160 +xác thực và không bị phân tâm bởi những thứ như bootstrap và kiểu dáng. + +44 +00:03:27,600 --> 00:03:33,750 +Vì vậy, khi bạn đã sẵn sàng, hãy chuyển sang bài học tiếp theo và tải xuống các tệp bắt đầu, sau đó + +45 +00:03:33,750 --> 00:03:35,940 +chúng ta sẽ bắt đầu với xác thực. + +46 +00:03:36,270 --> 00:03:37,350 +Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/003 Download the Starting Project.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/003 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..c2f55314af923a01bce120d7cce606e9db834dec --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/003 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip files from this lesson.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.


3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK

Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt



5. Look around the project. The starting files consists of an SQLite database called users.db. I created this in the same way we created databases before. Take a look at the database using DB Viewer and familiarise yourself with the fields in the database.


6. Run the app and navigate around using the buttons and navigation bar. All the HTML pages should already render correctly. The login/register forms won't work (of course). Look through all the code and make sure that everything makes sense before you get started.

\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/003 day-68-starting-files-flask-auth.zip b/part3/68 - Day 68 - Advanced - Authentication with Flask/003 day-68-starting-files-flask-auth.zip new file mode 100644 index 0000000000000000000000000000000000000000..8927977378255fa605629ea28c31bd7de8314f65 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/003 day-68-starting-files-flask-auth.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dabfdc30d690d900d06588930a79ae58e6023cb43d52238e907ff152416acff6 +size 60090 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/004 Register New Users.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/004 Register New Users.html new file mode 100644 index 0000000000000000000000000000000000000000..2a40368a5eefc608c22d2ada07e05f5e4462201f --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/004 Register New Users.html @@ -0,0 +1 @@ +

Register a new user and add them your database

In order to register new users, you will need to take the information they have inputted in register.html form and create a new User object with email, name and password to save into the users.db.

Once the user is registered, send them straight to the secrets.html page.

At this point, you should see a new entry in the database that corresponds to the data entered in the form:

SOLUTION


Greet the user on the Secrets page

The secrets.html page should say "Hello <insert name>" in the h1. The name should correspond to the name they typed in the registration form.

This is what you are aiming for:

SOLUTION


Don't worry about downloading the file just yet. We'll do that in the next lesson!

\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/005 Downloading Files.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/005 Downloading Files.html new file mode 100644 index 0000000000000000000000000000000000000000..7c624e543369fd1661e68957a40162a2443ed173 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/005 Downloading Files.html @@ -0,0 +1 @@ +

When the user accesses the secrets.html page, they should be able to download a secret file. The file is located in the starting project:

static > files > cheat_sheet.pdf

In order to do this, we need to use a method from Flask called send_from_directory().

1. First go into the secrets.html page and make the anchor tag make a GET request to your server at the path /download

2. In the download route in the main.py, use the documentation for send_from_directory() to download the cheat_sheet.pdf file when the user clicks on the "Download Your File" button.

https://flask.palletsprojects.com/en/2.3.x/api/#flask.send_from_directory

This is what should happen:


SOLUTION

\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Cryptii-Online-Encryption.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Cryptii-Online-Encryption.url new file mode 100644 index 0000000000000000000000000000000000000000..82192128d00a7f2ae31a40bd2721d585d1e413c7 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Cryptii-Online-Encryption.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://cryptii.com/ \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Encryption and Hashing.mp4 b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Encryption and Hashing.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ba6bf92e507f3179c75cf9a1158e00d5e20c9bdb --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Encryption and Hashing.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:632ae3605d4aab00c071bd4ba345532e5f36897ffc6b7db454a9641914c785b8 +size 130796211 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Encryption and Hashing_vi.srt b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Encryption and Hashing_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..db747b3e64ca661391e5d106ecbd3ae771875d6e --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 Encryption and Hashing_vi.srt @@ -0,0 +1,720 @@ +1 +00:00:01,230 --> 00:00:08,640 +Được rồi, vì vậy chúng tôi đã xem xét mã hóa cấp một, về cơ bản chỉ lưu mật khẩu dưới dạng văn bản thuần túy + +2 +00:00:08,640 --> 00:00:11,220 +trong cơ sở dữ liệu của chúng tôi. + +3 +00:00:11,370 --> 00:00:18,770 +Vì vậy, có thể mọi người sẽ gặp một chút khó khăn khi truy cập vào máy chủ của chúng tôi và truy cập vào cơ sở dữ liệu của chúng tôi. + +4 +00:00:18,810 --> 00:00:20,160 +Ít nhất bạn không thể + +5 +00:00:20,160 --> 00:00:20,490 +chỉ + +6 +00:00:20,490 --> 00:00:25,690 +cần nhấp chuột phải vào một trang web để xem nguồn trang và có thể xem nó trong HTML. + +7 +00:00:25,710 --> 00:00:30,140 +Ít nhất nó được lưu trữ ở cấp máy chủ. Nhưng điều đó không thực sự đủ tốt. + +8 +00:00:30,150 --> 00:00:37,150 +Vì vậy, hãy tiếp tục và xem chúng tôi có thể làm gì để cải thiện bảo mật cho người dùng trên trang web của chúng tôi. + +9 +00:00:37,470 --> 00:00:47,710 +Vì vậy, hãy tăng lên xác thực cấp độ hai. Và xác thực cấp độ hai liên quan đến việc sử dụng mã hóa. + +10 +00:00:48,480 --> 00:00:50,520 +Vậy mã hóa chính xác là gì? + +11 +00:00:50,550 --> 00:00:57,900 +Về cơ bản, tất cả chỉ là xáo trộn một cái gì đó để mọi người không thể biết bản gốc là + +12 +00:00:57,900 --> 00:01:02,890 +gì trừ khi họ nắm được bí mật và họ biết cách giải mã. + +13 +00:01:03,240 --> 00:01:08,610 +Điều này giống hệt như khi bạn và bạn của bạn đang gửi cho nhau những tin nhắn bí mật và bạn + +14 +00:01:08,610 --> 00:01:14,010 +có một chìa khóa để mã hóa tin nhắn mà cả hai đều biết để bạn có thể giải mã tin nhắn đó. + +15 +00:01:14,970 --> 00:01:21,480 +Bây giờ, ở quy mô lớn hơn, nếu bạn đã từng xem The Imitation Game hoặc đọc về cỗ máy Enigma, thì + +16 +00:01:21,690 --> 00:01:24,750 +đó về cơ bản là một dạng mã hóa. + +17 +00:01:25,230 --> 00:01:31,320 +Và máy Enigma, nếu bạn chưa biết, chỉ đơn giản là một chiếc máy được sử dụng trong + +18 +00:01:31,320 --> 00:01:34,890 +Thế chiến 2 khi người Đức gửi tin nhắn cho + +19 +00:01:35,100 --> 00:01:41,280 +nhau, họ sẽ sử dụng máy để mã hóa những tin nhắn đó để khi tin nhắn bị chặn, + +20 +00:01:41,280 --> 00:01:50,220 +nói, qua radio, trừ khi bạn có cùng một máy Enigma và bạn biết khóa giải mã là gì hoặc cài đặt cho máy là gì, khi + +21 +00:01:50,220 --> 00:01:54,660 +đó bạn sẽ không thể biết họ đang cố gắng liên lạc với + +22 +00:01:54,660 --> 00:01:56,000 +từng cái. khác. + +23 +00:01:56,310 --> 00:02:03,660 +Nếu bạn quan tâm, tôi thực sự khuyên bạn nên xem hai video do Numberphile thực hiện trên YouTube và tôi đã liên kết với video + +24 +00:02:03,660 --> 00:02:06,210 +đó trong danh sách tài nguyên của khóa học. + +25 +00:02:06,540 --> 00:02:14,310 +Nhưng nó giải thích về cỗ máy Enigma và nó nói về lỗ hổng trong cỗ máy Enigma đã khiến Alan Turing và những người khác ở + +26 +00:02:14,310 --> 00:02:20,760 +Bletchley Park có thể bẻ khóa mã và tạo ra thứ rất giống một chiếc máy tính chuyên dụng để có thể giải + +27 +00:02:20,760 --> 00:02:25,920 +mã những thông điệp đó và đã giúp quân đồng minh giành chiến thắng trong cuộc chiến. + +28 +00:02:26,310 --> 00:02:32,010 +Và nếu bạn đã từng đến thăm London, hãy nhớ đến công viên Bletchley và họ cũng có một bảo tàng máy tính + +29 +00:02:32,010 --> 00:02:34,230 +bên cạnh, điều này cực kỳ hấp dẫn. + +30 +00:02:34,740 --> 00:02:36,020 +Dù sao, tôi lạc đề. + +31 +00:02:36,030 --> 00:02:36,810 +Vì vậy, quay + +32 +00:02:36,810 --> 00:02:43,590 +lại mật mã và mã hóa, một trong những cách mã hóa thông điệp sớm nhất mà chúng ta biết đến là mật mã + +33 +00:02:43,590 --> 00:02:44,120 +Caesar. + +34 +00:02:44,610 --> 00:02:50,850 +Và điều này đến từ Julius Caesar, người từng là một trong những vị tướng của Đế chế La Mã. + +35 +00:02:51,000 --> 00:02:57,770 +Và những gì anh ta làm là anh ta sẽ gửi tin nhắn cho các tướng của mình và anh ta sẽ mã hóa nó để nếu người + +36 +00:02:58,020 --> 00:03:03,330 +đưa tin của anh ta bị giết trên đường đi, thì tin nhắn của anh ta sẽ được giữ bí mật. + +37 +00:03:03,990 --> 00:03:09,090 +Và đây là một trong những hình thức mã hóa đơn giản nhất mà chúng ta biết đến và + +38 +00:03:09,360 --> 00:03:10,550 +nó rất đơn giản. + +39 +00:03:10,560 --> 00:03:16,080 +Giả sử chúng ta có bảng chữ cái, phải không? ABCDEFG. Tất cả những gì mà Caesar + +40 +00:03:16,080 --> 00:03:18,540 +Cipher làm là một mật mã thay thế chữ cái. + +41 +00:03:18,660 --> 00:03:24,820 +Và chìa khóa cho mật mã là số chữ cái mà bạn sẽ thay đổi. + +42 +00:03:24,870 --> 00:03:31,900 +Vì vậy, nếu bạn biết mô hình dịch chuyển là gì, thì bạn thực sự có thể nhanh chóng giải mã thông điệp. + +43 +00:03:32,340 --> 00:03:38,210 +Vì vậy, nếu chúng ta mã hóa từ xin chào, có một công cụ trực tuyến thực sự gọn gàng có thể giúp chúng ta làm điều đó. + +44 +00:03:38,220 --> 00:03:41,850 +Nó được gọi là cryptii. com và nó có hai 'tôi ở cuối. + +45 +00:03:42,300 --> 00:03:47,760 +Và về cơ bản, bạn có thể chọn loại mật mã hoặc mã hóa mà bạn muốn sử dụng và sau đó bạn có + +46 +00:03:48,120 --> 00:03:52,550 +thể chỉ định sự thay đổi và chúng ta sẽ nói một sự thay đổi của ba, giả sử. + +47 +00:03:52,800 --> 00:04:00,930 +Vì vậy, nếu văn bản của tôi là xin chào, thì nó sẽ được chuyển thành khoor. Và đối với một người không biết và không am hiểu về mật mã, có thể + +48 +00:04:01,200 --> 00:04:07,950 +khá khó để biết chính xác điều này đang cố gắng nói gì. Bây giờ trong thời hiện đại và với + +49 +00:04:07,950 --> 00:04:14,010 +mật mã hiện đại, điều này quá đơn giản và nó rất, rất dễ bị bẻ khóa. + +50 +00:04:14,460 --> 00:04:20,550 +Nhưng có những hình thức mã hóa khác phức tạp hơn một chút và nó liên quan đến toán + +51 +00:04:20,550 --> 00:04:25,380 +học nhiều hơn để khiến ai đó bẻ khóa mất nhiều thời gian hơn. + +52 +00:04:25,770 --> 00:04:29,760 +Nhưng về cơ bản tất cả các mã hóa đều hoạt động theo cùng một cách. + +53 +00:04:30,150 --> 00:04:38,730 +Bạn có một cách để xáo trộn thư của mình và nó yêu cầu một khóa để có thể xáo trộn thư đó. + +54 +00:04:39,450 --> 00:04:39,930 +Được rồi. + +55 +00:04:39,930 --> 00:04:44,520 +Vì vậy, bây giờ đã đến lúc nâng cấp lên cấp độ bảo mật tiếp theo. + +56 +00:04:44,760 --> 00:04:48,630 +Và trong bài học này, chúng ta sẽ đề cập đến một thứ gọi là băm. + +57 +00:04:49,620 --> 00:04:56,910 +Bây giờ, trước đây, chúng tôi đã xem xét mã hóa, vì vậy lấy mật khẩu của người dùng và bảo mật nó bằng khóa mã + +58 +00:04:56,910 --> 00:05:00,120 +hóa, sau đó sử dụng một phương pháp mật mã + +59 +00:05:00,140 --> 00:05:06,560 +cụ thể, có thể là mật mã Caesar hoặc mật mã Enigma, bất kể chúng tôi chọn cách nào, chúng tôi luôn có + +60 +00:05:06,560 --> 00:05:12,440 +một mật khẩu, một khóa và cuối cùng chúng tôi đã đưa ra một số bản mã khiến mọi người + +61 +00:05:12,440 --> 00:05:16,940 +khó có thể đoán ngay được mật khẩu của người dùng của chúng tôi là gì. + +62 +00:05:17,120 --> 00:05:23,390 +Vì vậy, ví dụ: nếu chúng tôi lấy một mật khẩu như qwerty và chúng tôi sử dụng phương pháp mật mã Caesar và chúng tôi quyết + +63 +00:05:23,390 --> 00:05:27,440 +định chuyển nó từng cái một, thì khóa mã hóa của chúng tôi là số một. + +64 +00:05:27,860 --> 00:05:32,880 +Và điều đó tạo ra bản mã trong đó mỗi chữ cái được chuyển lên từng chữ cái. + +65 +00:05:33,350 --> 00:05:39,110 +Bây giờ, để giải mã điều này, tất cả những gì bạn phải làm, miễn là bạn biết khóa + +66 +00:05:39,110 --> 00:05:45,980 +là gì, sau đó bạn chỉ cần chuyển tất cả bản mã xuống từng cái một và bạn sẽ có mật khẩu ban đầu. + +67 +00:05:46,340 --> 00:05:51,650 +Bây giờ, mật mã Caesar là một phương pháp mã hóa rất, rất yếu. + +68 +00:05:51,650 --> 00:05:58,310 +Thật dễ dàng để tìm ra văn bản gốc là gì, ngay cả khi bạn không có chìa khóa. + +69 +00:05:58,880 --> 00:06:04,790 +Và chỉ để minh họa những điều tồi tệ có thể xảy ra khi bạn có một hệ thống mã hóa yếu, tôi sẽ kể + +70 +00:06:04,790 --> 00:06:11,110 +cho bạn một câu chuyện trong lịch sử cho chúng ta biết lý do tại sao chúng ta không nên sử dụng một hệ thống mã hóa yếu. + +71 +00:06:11,690 --> 00:06:18,770 +Vì vậy, trở lại những năm 1500 trên hòn đảo mà ngày nay chúng ta gọi là Vương quốc Anh, từng có hai khu vực + +72 +00:06:18,770 --> 00:06:19,400 +rộng lớn. + +73 +00:06:19,670 --> 00:06:23,810 +Một là Scotland và một là Anh. + +74 +00:06:24,320 --> 00:06:27,080 +Và họ được cai trị bởi hai Nữ hoàng. + +75 +00:06:27,380 --> 00:06:33,860 +Scotland được cai trị bởi Mary Queen of Scots, một người theo Công giáo, và nước Anh được cai trị bởi Nữ + +76 +00:06:33,860 --> 00:06:35,210 +hoàng Elizabeth đệ nhất. + +77 +00:06:35,630 --> 00:06:41,330 +Giờ đây, hai người phụ nữ giữa họ đã kiểm soát vùng đất mà ngày nay chúng ta gọi là Vương quốc Anh, nhưng mỗi người đều + +78 +00:06:41,330 --> 00:06:43,790 +muốn có nhiều quyền lực hơn và nhiều đất đai hơn. + +79 +00:06:44,300 --> 00:06:45,990 +Vậy họ đã làm gì? + +80 +00:06:46,010 --> 00:06:53,870 +Vâng, Mary Queen of Scots, người trị vì Scotland đã quyết định âm mưu với bạn của mình, Lord Babington, để cố + +81 +00:06:54,200 --> 00:06:56,800 +gắng và ám sát Nữ hoàng Elizabeth. + +82 +00:06:57,260 --> 00:07:02,720 +Bằng cách đó, cô ấy sẽ là người thừa kế hợp pháp cả ngai vàng của Anh và Scotland, và đó giống như + +83 +00:07:03,050 --> 00:07:06,920 +một tình huống của Trò chơi vương quyền đang diễn ra vào thời điểm đó. + +84 +00:07:07,460 --> 00:07:13,910 +Nhưng để huy động lực lượng hoặc cố gắng nghĩ ra một kế hoạch bí mật nào đó, + +85 +00:07:13,910 --> 00:07:17,800 +họ quyết định gửi thư cho nhau bằng bản mã. + +86 +00:07:18,020 --> 00:07:25,850 +Vì vậy, họ đã nghĩ ra một hệ thống mã hóa các bức thư của họ gửi cho nhau để nếu nó rơi vào tay kẻ xấu, + +87 +00:07:25,850 --> 00:07:32,800 +chủ đề của bức thư sẽ không bị tiết lộ và cuối cùng họ sẽ không bị xét xử vì tội phản quốc. + +88 +00:07:32,990 --> 00:07:39,260 +Nhưng vấn đề là phương pháp mã hóa mà họ sử dụng, một phương pháp thay thế chữ + +89 +00:07:39,410 --> 00:07:44,510 +cái tương tự như mật mã Caesar, là một dạng mã hóa rất yếu. + +90 +00:07:45,110 --> 00:07:54,230 +Và Nữ hoàng Elizabeth có một chuyên gia giải mã chính, người đã giải mã các bức thư của họ và tìm ra khóa mã + +91 +00:07:54,230 --> 00:07:56,220 +hóa của họ là gì. + +92 +00:07:56,420 --> 00:08:04,400 +Vì vậy, anh ta quyết định lấy khóa mã hóa này và viết một bức thư gửi lại cho Lãnh chúa Babington để cố gắng bắt + +93 +00:08:04,400 --> 00:08:07,490 +anh ta tiết lộ tất cả những kẻ đồng phạm. + +94 +00:08:07,880 --> 00:08:11,330 +Và kết quả cuối cùng của việc có hệ thống mã hóa yếu của họ là gì? + +95 +00:08:11,720 --> 00:08:19,250 +Chà, Nữ hoàng Elizabeth đã quyết định buộc tội Mary Queen of Scots tội phản quốc, và do đó, cuối cùng bà đã + +96 +00:08:19,250 --> 00:08:20,360 +bị chặt đầu. + +97 +00:08:20,750 --> 00:08:25,420 +Vì vậy, đây không phải là điều bạn muốn xảy ra với bạn hoặc trang web của bạn. + +98 +00:08:25,940 --> 00:08:33,320 +Vì vậy, các hệ thống mã hóa yếu có thể khiến mật khẩu của người dùng gặp rủi ro và công ty của bạn có thể bị chặt đầu + +99 +00:08:33,320 --> 00:08:39,230 +một cách ẩn dụ, chẳng hạn như trong trường hợp của các công ty như TalkTalk hoặc Equifax, nơi họ cuối cùng bị + +100 +00:08:39,230 --> 00:08:42,200 +tấn công và mất rất nhiều niềm tin của người dùng. + +101 +00:08:42,440 --> 00:08:48,410 +Bây giờ, nếu bạn quan tâm đến nhiều câu chuyện như thế này hơn và để tìm hiểu thêm về mật mã và mã hóa, có một đề xuất + +102 +00:08:48,590 --> 00:08:52,820 +cuốn sách thực sự tuyệt vời mà tôi sẽ thực hiện có tên là The Code Book của Simon Singh. + +103 +00:08:53,000 --> 00:08:56,480 +Nó chứa những câu chuyện như câu chuyện mà tôi vừa kể cho bạn và nhiều hơn thế nữa. + +104 +00:08:56,540 --> 00:08:59,380 +Vì vậy, nếu bạn quan tâm đến điều này, hãy tiếp tục và đọc thêm về nó. + +105 +00:08:59,720 --> 00:09:03,500 +Bây giờ, làm thế nào chúng ta có thể làm cho mật khẩu của + +106 +00:09:03,530 --> 00:09:09,920 +mình an toàn hơn Hiện tại, lỗ hổng lớn nhất trong phương pháp xác thực của chúng ta là thực tế là chúng ta cần + +107 +00:09:09,920 --> 00:09:14,450 +một khóa mã hóa để mã hóa mật khẩu và giải mã mật khẩu của chúng ta. + +108 +00:09:14,870 --> 00:09:22,040 +Và rất có thể là nếu ai đó đủ động lực để dành thời gian và xâm nhập vào cơ sở dữ liệu của bạn, + +109 +00:09:22,040 --> 00:09:29,150 +thì có lẽ không khó để họ có thể lấy được khóa mã hóa của bạn, ngay cả khi bạn đã lưu nó trong biến + +110 +00:09:29,150 --> 00:09:33,480 +môi trường hoặc một nơi nào đó an toàn trên máy chủ của bạn. + +111 +00:09:33,950 --> 00:09:38,880 +Vì vậy, làm thế nào chúng ta có thể giải quyết liên kết yếu nhất này, sự cần thiết của khóa mã hóa đó? + +112 +00:09:39,140 --> 00:09:45,380 +Chà, đây là lúc mà băm phát huy tác dụng. Trong khi trước đây với mã hóa, chúng + +113 +00:09:45,380 --> 00:09:52,560 +tôi cần khóa mã hóa đó, thì việc băm sẽ lấy đi và không còn yêu cầu khóa mã hóa nữa. + +114 +00:09:53,180 --> 00:09:59,450 +Vậy thì bạn có thể hỏi, nếu chúng tôi không có khóa mã hóa, làm thế nào chúng tôi có thể giải mã + +115 +00:09:59,450 --> 00:09:59,990 +mật + +116 +00:10:00,060 --> 00:10:08,520 +khẩu của mình trở lại thành văn bản thuần túy? Vâng, bí mật là bạn không. Giả sử một người dùng đăng ký trên trang web + +117 +00:10:08,520 --> 00:10:16,560 +của chúng tôi và họ nhập mật khẩu để đăng ký, chúng tôi sử dụng một thứ gọi là hàm băm để biến mật khẩu đó thành hàm băm và chúng tôi + +118 +00:10:16,560 --> 00:10:19,500 +lưu trữ hàm băm đó trong cơ sở dữ liệu của mình. + +119 +00:10:20,160 --> 00:10:29,700 +Bây giờ, vấn đề là các hàm băm là các phương trình toán học được thiết kế để làm cho nó gần như + +120 +00:10:29,700 --> 00:10:32,280 +không thể quay ngược trở lại. + +121 +00:10:32,560 --> 00:10:38,910 +Vì vậy, hầu như không thể biến một hàm băm trở lại thành một mật khẩu. + +122 +00:10:39,150 --> 00:10:41,130 +Bạn có thể hỏi làm thế nào điều này có thể xảy ra? + +123 +00:10:41,160 --> 00:10:48,690 +Làm cách nào để bạn có thể biến mật khẩu thành một mã băm rất nhanh chóng và dễ dàng, nhưng hầu như không + +124 +00:10:48,690 --> 00:10:52,080 +thể biến hàm băm đó trở lại thành mật khẩu? + +125 +00:10:52,800 --> 00:10:53,880 +Chà, đây là một câu hỏi. + +126 +00:10:54,600 --> 00:11:01,710 +Anh chị cho em hỏi 377 có những yếu tố nào khác với 377? + +127 +00:11:02,040 --> 00:11:05,650 +Vì vậy, về cơ bản, tôi đang nói rằng 377 không phải là một số nguyên tố. + +128 +00:11:06,090 --> 00:11:14,490 +Bạn không chỉ có thể chia 377 cho 1 và 377, mà còn có hai số khác mà bạn có thể + +129 +00:11:14,490 --> 00:11:15,450 +chia nó. + +130 +00:11:15,870 --> 00:11:19,260 +Bây giờ công việc của bạn là tìm ra những con số đó là gì. + +131 +00:11:20,130 --> 00:11:21,420 +Vì vậy, bạn có thể làm gì? + +132 +00:11:21,450 --> 00:11:23,130 +Chà, bạn có thể chia nó cho hai. + +133 +00:11:23,490 --> 00:11:26,090 +OK, vì vậy nó trở thành 188. 5. + +134 +00:11:26,130 --> 00:11:27,300 +Đó không phải là một số + +135 +00:11:27,300 --> 00:11:28,880 +nguyên nên 2 không phải là một thừa số. + +136 +00:11:29,280 --> 00:11:30,610 +Nếu bạn chia nó cho ba thì sao? + +137 +00:11:30,630 --> 00:11:36,290 +Chà, nó trở thành 113. 3 lặp lại, cũng không phải là một số nguyên. + +138 +00:11:36,450 --> 00:11:38,870 +Vì vậy, ba cũng không phải là một yếu tố. + +139 +00:11:39,180 --> 00:11:45,940 +Và bạn có thể trải qua quá trình này trong một thời gian dài, trải qua từng con số một cách tẻ nhạt. + +140 +00:11:45,990 --> 00:11:53,010 +Vâng, sau đó bạn có thể đến điểm mà bạn chia 377 cho 13 và bạn kết thúc bằng + +141 +00:11:53,010 --> 00:11:53,680 +29. + +142 +00:11:54,060 --> 00:12:04,140 +Vì vậy, 13 và 29 là câu trả lời cho câu hỏi này. Chúng là yếu tố duy nhất của 377 khác với 1 và + +143 +00:12:04,140 --> 00:12:05,000 +377. + +144 +00:12:05,640 --> 00:12:12,750 +Và như bạn có thể thấy, quá trình đi đến điểm tìm ra hai yếu tố đó đã khiến chúng ta mất một khoảng thời gian, phải + +145 +00:12:12,750 --> 00:12:13,130 +không? + +146 +00:12:13,140 --> 00:12:14,400 +Nó không phải là dễ dàng. + +147 +00:12:14,910 --> 00:12:17,400 +Nhưng hãy cân nhắc nếu tôi hỏi bạn một câu hỏi khác. + +148 +00:12:17,400 --> 00:12:20,990 +Nếu tôi nói với bạn, bạn có thể nhân 13 với 29 được không? + +149 +00:12:21,330 --> 00:12:24,900 +Chà, bạn sẽ có thể làm điều đó thực sự nhanh chóng và dễ dàng. + +150 +00:12:24,900 --> 00:12:30,050 +Bạn sẽ hầu như không mất chút thời gian nào để tìm ra câu trả lời là 377. + +151 +00:12:30,870 --> 00:12:36,880 +Vì vậy, đây là một phiên bản rất, rất đơn giản của một hàm băm. + +152 +00:12:37,350 --> 00:12:44,790 +Vì vậy, tiến lên, nhân 13 với 29 thực sự nhanh chóng và dễ dàng, nhưng quay ngược lại, + +153 +00:12:44,790 --> 00:12:46,440 +cố gắng lấy lại + +154 +00:12:46,440 --> 00:12:52,360 +các số 13 và 29 bắt đầu từ 377 là rất, rất mất thời gian. + +155 +00:12:52,770 --> 00:12:56,120 +Vì vậy, về cơ bản đây là cách một hàm băm hoạt động. + +156 +00:12:56,520 --> 00:13:01,340 +Chỉ cần thêm một chút phức tạp nữa và bạn sẽ có một hàm băm thực sự. + +157 +00:13:01,590 --> 00:13:09,360 +Vì vậy, chúng được thiết kế để được tính toán rất nhanh để tiến về phía trước, nhưng hầu như không thể lùi lại. + +158 +00:13:09,360 --> 00:13:10,860 +Và gần như không thể, + +159 +00:13:11,100 --> 00:13:19,110 +ý tôi chỉ đơn giản là sử dụng mức sức mạnh tính toán hiện tại, sẽ mất quá nhiều thời gian để khiến nó trở nên đáng giá đối + +160 +00:13:19,110 --> 00:13:19,810 +với hacker. + +161 +00:13:20,130 --> 00:13:26,880 +Vì vậy, giả sử rằng để tính toán băm về phía trước, cần một phần nghìn giây, nhưng để quay ngược lại thì mất hai + +162 +00:13:26,880 --> 00:13:31,800 +năm, thì hacker đó có thể có những việc tốt hơn để làm với thời gian của mình. + +163 +00:13:31,980 --> 00:13:38,700 +Vì vậy, khi người dùng cố gắng đăng ký trên trang web của chúng tôi, sau đó chúng tôi yêu cầu họ nhập mật khẩu đăng ký, mật khẩu này được chúng tôi chuyển + +164 +00:13:38,700 --> 00:13:44,720 +thành mã băm bằng cách sử dụng hàm băm của chúng tôi và sau đó chúng tôi lưu trữ mã băm đó trên cơ sở dữ liệu của mình. + +165 +00:13:45,210 --> 00:13:52,020 +Bây giờ, sau này khi người dùng cố gắng đăng nhập và họ nhập mật khẩu của họ, sau đó chúng tôi băm lại + +166 +00:13:52,110 --> 00:14:00,330 +mật khẩu mà họ đã nhập để tạo ra một hàm băm và sau đó chúng tôi so sánh nó với hàm băm mà chúng tôi đã lưu trữ + +167 +00:14:00,330 --> 00:14:02,570 +trong cơ sở dữ liệu của mình. + +168 +00:14:03,060 --> 00:14:10,170 +Và nếu hai hàm băm đó khớp nhau, thì điều đó có nghĩa là mật khẩu đăng nhập cũng giống với mật khẩu + +169 +00:14:10,170 --> 00:14:11,100 +đăng ký. + +170 +00:14:11,400 --> 00:14:18,810 +Và không lúc nào trong quá trình này, chúng tôi phải lưu trữ mật khẩu của họ ở dạng văn bản thuần túy hay chúng tôi có thể + +171 +00:14:18,810 --> 00:14:22,350 +đảo ngược quy trình để tìm ra mật khẩu ban đầu của họ? + +172 +00:14:22,710 --> 00:14:26,480 +Người duy nhất biết mật khẩu của họ là chính người dùng. + +173 +00:14:26,760 --> 00:14:35,400 +Bây giờ, trước đây chúng ta đã thấy điều đó bằng cách sử dụng máy Enigma, miễn là chúng ta biết các cài đặt dành cho + +174 +00:14:35,400 --> 00:14:39,360 +máy Enigma, về cơ bản là khóa mã hóa, phải không? + +175 +00:14:39,690 --> 00:14:46,800 +Miễn là chúng tôi biết đó là gì, thì tôi có thể giải mã nó bằng cách đặt nó thành cùng một khóa mã hóa. + +176 +00:14:48,270 --> 00:14:55,920 +Và cuối cùng chúng tôi có thể lấy lại văn bản gốc. Tuy nhiên, bây giờ, nếu tôi phải đi và thay đổi điều này + +177 +00:14:56,130 --> 00:15:04,860 +thành một hàm băm, thì bạn có thể thấy rằng khi chúng tôi cố gắng giải mã điều này bằng cách sử dụng cùng một hàm băm, MD5, chúng + +178 +00:15:04,860 --> 00:15:06,900 +tôi gặp lỗi rằng bước giải + +179 +00:15:06,900 --> 00:15:12,210 +mã không được xác định cho hàm băm bởi vì bạn thực sự không thể quay trở lại. + +180 +00:15:12,570 --> 00:15:19,310 +Đó là toàn bộ điểm của hàm băm và đây là điều sẽ giúp xác thực của chúng ta an toàn hơn. + diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/006 How-the-Enigma-Machine-Works.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 How-the-Enigma-Machine-Works.url new file mode 100644 index 0000000000000000000000000000000000000000..13672fe40f91081b433c822eefaa7825e231ede8 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 How-the-Enigma-Machine-Works.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.youtube.com/watch?v=G2_Q9FoD-oQ&ab_channel=Numberphile \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/006 The-Flaw-in-the-Enigma-Machine.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 The-Flaw-in-the-Enigma-Machine.url new file mode 100644 index 0000000000000000000000000000000000000000..4dc6b512e63e6bbe40dc4baac57a8037bca5da88 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/006 The-Flaw-in-the-Enigma-Machine.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.youtube.com/watch?v=V4V2bpZlqx8&ab_channel=Numberphile \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/007 -have-i-been-pwned-.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 -have-i-been-pwned-.url new file mode 100644 index 0000000000000000000000000000000000000000..1841942fab5bde75a80590af355ea69a60a55c28 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 -have-i-been-pwned-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://haveibeenpwned.com/Passwords \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/007 How to Hack Passwords 101.mp4 b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 How to Hack Passwords 101.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ec881e26937109af3d459ba1b56a38aa7013eda5 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 How to Hack Passwords 101.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c36c886e06cfc659beafdd2c10615002169736f59ae3595702cfdc129002ae6 +size 132974281 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/007 How to Hack Passwords 101_vi.srt b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 How to Hack Passwords 101_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..6c195a458d67a14aceed5f578dca8abbfe311b9e --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 How to Hack Passwords 101_vi.srt @@ -0,0 +1,604 @@ +1 +00:00:00,210 --> 00:00:00,850 +Được rồi, các bạn. + +2 +00:00:00,900 --> 00:00:08,340 +Vì vậy, bây giờ chúng tôi đã đề cập đến việc tạo mật khẩu người dùng, mã hóa cơ sở dữ liệu của chúng tôi, cũng như + +3 +00:00:08,730 --> 00:00:14,550 +băm mật khẩu, chúng tôi đã đạt đến mức độ bảo mật mà hầu hết các trang web đều có. + +4 +00:00:14,790 --> 00:00:19,170 +Bây giờ, có nhiều bảo mật hơn mà chúng ta sẽ tìm hiểu sau này một chút. + +5 +00:00:19,710 --> 00:00:25,860 +Nhưng bạn thực sự đã biết khá nhiều về xác thực và giữ an toàn cho mật khẩu của + +6 +00:00:25,860 --> 00:00:31,950 +người dùng, và chắc chắn là hơn rất nhiều người thực sự điều hành các trang web. + +7 +00:00:32,220 --> 00:00:35,720 +Và tôi biết rằng một số bạn đang muốn kiếm việc làm. + +8 +00:00:35,730 --> 00:00:41,520 +Và nếu đó là bạn, thì tôi muốn bạn truy cập vào một trang web có tên là plaintextoffenders. com. Tôi sẽ liên kết đến nó + +9 +00:00:41,520 --> 00:00:43,280 +trong tài nguyên khóa học. + +10 +00:00:43,560 --> 00:00:50,880 +Nhưng ở đây những gì bạn sẽ tìm thấy là các email đến từ nhiều công ty khác nhau nơi người dùng yêu cầu đặt lại + +11 +00:00:50,880 --> 00:00:57,400 +mật khẩu của họ và họ đang gửi cho người dùng phiên bản văn bản thuần túy của mật khẩu của họ. + +12 +00:00:57,690 --> 00:01:03,840 +Bây giờ, tại thời điểm này, chúng tôi biết thậm chí có thể lấy được mật khẩu của người dùng ở dạng văn bản thuần túy, điều đó + +13 +00:01:03,840 --> 00:01:07,830 +có nghĩa là họ đang làm một số điều khủng khiếp với việc bảo mật mật khẩu. + +14 +00:01:08,040 --> 00:01:13,920 +Hoặc nó được mã hóa và có một khóa mã hóa ở đâu đó mà họ đang lưu trữ hoặc đơn giản là nó chỉ được lưu trữ trên + +15 +00:01:13,920 --> 00:01:18,520 +cơ sở dữ liệu của họ dưới dạng văn bản thuần túy, đây là loại bảo mật tồi tệ nhất có thể. + +16 +00:01:18,840 --> 00:01:27,030 +Vì vậy, cho rằng bạn đã biết rõ hơn rất nhiều so với những người chạy getlinuxjobs. com hoặc thế + +17 +00:01:27,030 --> 00:01:34,890 +giới sim. com hoặc Telecom Egypt, thì bạn có thể thực sự chỉ cần gửi email cho những người này và + +18 +00:01:34,890 --> 00:01:39,650 +nói với họ rằng tôi là nhà phát triển web và tôi biết về xác thực và bảo mật mật khẩu của người dùng. + +19 +00:01:39,660 --> 00:01:41,940 +Bạn rõ ràng có vẻ như bạn có thể cần một số trợ giúp. + +20 +00:01:42,210 --> 00:01:43,640 +Bạn có muốn tôi làm việc cho bạn không? + +21 +00:01:44,010 --> 00:01:45,990 +Tôi cũng khuyên bạn nên thử + +22 +00:01:46,020 --> 00:01:50,790 +việc đó nếu bạn muốn tìm việc làm. Nếu bạn không tìm kiếm việc làm, hãy xem những trang web này. + +23 +00:01:50,910 --> 00:01:55,410 +Và nếu bạn đã đăng ký bất kỳ tài khoản nào trong số họ, hãy nhớ xóa tài khoản của bạn vì nó chắc chắn không + +24 +00:01:55,410 --> 00:01:55,910 +an toàn. + +25 +00:01:56,070 --> 00:02:03,120 +Và đây là lý do tại sao rất nhiều công ty và rất nhiều trang web bị tấn công bởi vì họ không tiếp tục vượt quá thời + +26 +00:02:03,120 --> 00:02:03,690 +điểm này. + +27 +00:02:04,050 --> 00:02:09,509 +Vì vậy, điều đó có nghĩa là đây thực sự là thời điểm thích hợp để nói chuyện với bạn về cách mật khẩu + +28 +00:02:09,690 --> 00:02:13,530 +bị tấn công, vì vậy hãy chọn lớp học hack Mật khẩu 101 nếu bạn muốn. + +29 +00:02:13,830 --> 00:02:16,740 +Bây giờ, hầu hết thời gian, tôi sử dụng khả năng lập trình của mình cho tốt. + +30 +00:02:17,070 --> 00:02:23,100 +Nhưng trong trường hợp này, tôi muốn nói với bạn về cách mật khẩu có thể bị tấn công để một khi chúng tôi hiểu cách + +31 +00:02:23,190 --> 00:02:29,700 +bên kia tiếp cận vấn đề này, thì chúng tôi có thể tìm hiểu thêm về bảo mật và làm cho trang web của chúng tôi an toàn + +32 +00:02:29,710 --> 00:02:30,780 +hơn cho người dùng. + +33 +00:02:31,200 --> 00:02:36,230 +Và nhân tiện, tôi không hiểu tại sao các hacker luôn được miêu tả trong một balaclava. + +34 +00:02:36,240 --> 00:02:38,760 +Nó không giống như họ sẽ đánh cắp bất kỳ ai. + +35 +00:02:39,030 --> 00:02:44,580 +Ý tôi là, đặc biệt là anh chàng này, anh ta phải cực kỳ ấm áp khi ngồi cạnh tất cả những chiếc máy tính + +36 +00:02:44,580 --> 00:02:46,470 +này, mặc rất nhiều quần áo trên mặt. + +37 +00:02:47,130 --> 00:02:48,220 +Nhưng tôi lạc đề. + +38 +00:02:48,600 --> 00:02:55,320 +Vì vậy, là một công ty, đây có lẽ là một trong những điều mà bạn ít mong đợi nhất. Một ngày khi bạn thức dậy và + +39 +00:02:55,320 --> 00:02:59,160 +nhận được cuộc gọi và bạn đã bị hack. + +40 +00:02:59,460 --> 00:03:06,300 +Và điều này đã thực sự xảy ra gần đây với rất nhiều công ty lớn như Adobe Creative Cloud bị hack + +41 +00:03:06,300 --> 00:03:09,510 +vào năm 2013, LinkedIn bị hack vào năm 2012. + +42 +00:03:09,810 --> 00:03:14,150 +Và có vô số tài khoản bị rò rỉ mật khẩu. + +43 +00:03:14,430 --> 00:03:21,320 +Rất nhiều người dùng không hài lòng khi sử dụng lại mật khẩu của họ và cảm thấy cực kỳ dễ bị tổn thương. + +44 +00:03:21,690 --> 00:03:27,360 +Và bạn có thể thấy rằng ngay cả cho đến ngày nay, mọi người có thể mua các tài khoản bị tấn công + +45 +00:03:27,360 --> 00:03:34,200 +này mà mọi người có thể không nhận ra rằng email LinkedIn và mật khẩu của họ được liên kết và mọi người có khả năng mua dữ + +46 +00:03:34,200 --> 00:03:40,580 +liệu đó và sử dụng nó để xâm nhập vào tài khoản PayPal của họ hoặc các tài khoản khác các cổng thanh toán tương tự. + +47 +00:03:40,860 --> 00:03:48,450 +Vì vậy, ngay cả khi bạn không học được gì từ bài học này, tôi khuyên bạn chỉ nên truy cập trang web này. Tôi sẽ liên kết đến nó trong tài nguyên khóa + +48 +00:03:48,450 --> 00:03:52,110 +học chỉ dành cho mục đích giáo dục. + +49 +00:03:52,380 --> 00:03:57,540 +Nhưng hãy nhập địa chỉ email của bạn và đảm bảo rằng nếu bạn có bất kỳ mật khẩu nào hiển thị, hãy thay đổi tất + +50 +00:03:57,540 --> 00:03:59,360 +cả những nơi bạn sử dụng mật khẩu đó. + +51 +00:03:59,520 --> 00:04:05,670 +Nhưng tại sao tất cả các công ty lớn này đều bị tấn công và làm rò rỉ mật khẩu người dùng của họ? + +52 +00:04:05,790 --> 00:04:09,120 +Ít nhất họ không mã hóa hoặc băm mật khẩu của họ? + +53 +00:04:09,690 --> 00:04:10,740 +Đúng vậy. + +54 +00:04:11,040 --> 00:04:12,150 +Nhưng hãy cân nhắc điều này. + +55 +00:04:12,150 --> 00:04:17,850 +Vì vậy, bạn là một tin tặc và bạn đã quản lý để xâm nhập vào cơ sở dữ liệu người dùng LinkedIn. + +56 +00:04:18,300 --> 00:04:21,390 +Và chỉ vì lý do đơn giản, hãy nói rằng nó trông như thế này. + +57 +00:04:21,390 --> 00:04:23,340 +Bạn có một tên người dùng và bạn có một băm. + +58 +00:04:23,700 --> 00:04:29,730 +Và rất may, họ không lưu trữ mật khẩu của người dùng dưới dạng văn bản thuần túy, vì vậy bạn không thể truy cập mật khẩu của họ ngay + +59 +00:04:29,730 --> 00:04:30,330 +lập tức. + +60 +00:04:30,900 --> 00:04:39,600 +Tuy nhiên, nếu bạn nhìn vào bảng này kỹ hơn một chút, bạn sẽ nhận ra rằng ba trong số các hàm băm + +61 +00:04:39,630 --> 00:04:41,880 +là hoàn toàn giống nhau. + +62 +00:04:42,420 --> 00:04:44,400 +Bây giờ, tại sao có thể là? + +63 +00:04:44,790 --> 00:04:52,700 +Chà, hãy nhớ rằng cùng một mật khẩu luôn biến thành cùng một hàm băm cho dù bạn có thử nó bao lâu đi chăng nữa. + +64 +00:04:52,710 --> 00:04:59,240 +Và đó là một phần cốt lõi của hàm băm mà chúng tôi dựa vào để xác thực người dùng của mình. + +65 +00:05:00,030 --> 00:05:06,870 +Điều đó có nghĩa là một hacker sẽ nhìn vào bảng này và nhận ra rằng Angela, Tony và Emily đều có cùng một mật khẩu + +66 +00:05:06,870 --> 00:05:13,190 +và những gì họ có thể làm là họ có thể bắt đầu xây dựng cái mà chúng ta gọi là bảng băm. + +67 +00:05:13,500 --> 00:05:20,100 +Vì vậy, bạn sẽ lấy một số mật khẩu được sử dụng phổ biến nhất và bạn sẽ sử dụng cùng một hàm băm + +68 +00:05:20,400 --> 00:05:23,290 +để tạo giá trị băm cho mỗi mật khẩu đó. + +69 +00:05:23,610 --> 00:05:27,810 +Và đây là một số mật khẩu phổ biến nhất mà mọi người thích sử dụng. + +70 +00:05:27,810 --> 00:05:32,280 +123456, qwerty, mật khẩu, 111111. + +71 +00:05:32,290 --> 00:05:41,100 +Và vì vậy bạn tạo bảng băm này và sau đó tất cả những gì bạn phải làm là chỉ cần tra cứu bảng băm của người dùng và + +72 +00:05:41,340 --> 00:05:45,120 +so sánh nó với bảng băm bạn có trong bảng của mình. + +73 +00:05:45,480 --> 00:05:51,660 +Vì vậy, bạn tìm kiếm theo giá trị băm và bạn tìm thấy mật khẩu, đó là qwerty. + +74 +00:05:52,080 --> 00:05:59,140 +Vì vậy, bây giờ bạn đã phát hiện ra rằng ba trong số bốn người dùng trong bảng này đều có cùng một mật khẩu và đó là + +75 +00:05:59,490 --> 00:05:59,850 +qwerty. + +76 +00:06:00,150 --> 00:06:06,600 +Vì vậy, điều gì sẽ xảy ra nếu họ không sử dụng một trong những mật khẩu phổ biến nhất và thay vào đó họ sử dụng một thứ khác, + +77 +00:06:06,810 --> 00:06:09,450 +nói ngày sinh của họ hoặc tên thú cưng của họ? + +78 +00:06:09,750 --> 00:06:13,940 +Chà, hãy xem chúng ta sẽ tạo bảng băm như thế nào nếu chúng ta là một hacker. + +79 +00:06:14,460 --> 00:06:18,330 +Bạn có thể sẽ bắt đầu với tất cả các từ trong từ điển, và + +80 +00:06:18,510 --> 00:06:21,650 +đây là nơi bắt nguồn của thuật ngữ tấn công từ điển. + +81 +00:06:21,930 --> 00:06:29,040 +Bạn tạo mã băm từ tất cả các từ có thể có trong từ điển và đó sẽ chỉ là khoảng 150.000 hàm băm mà + +82 +00:06:29,040 --> 00:06:30,210 +bạn cần tạo. + +83 +00:06:30,450 --> 00:06:36,170 +Và sau đó bạn thêm vào bảng băm đó tất cả các số từ danh bạ điện thoại và tất cả sự kết hợp của các + +84 +00:06:36,180 --> 00:06:37,950 +ký tự lên đến sáu vị trí. + +85 +00:06:38,220 --> 00:06:45,840 +Và sau đó bạn cộng tất cả những thứ này lại với nhau và bạn kết thúc với một cái gì đó gần bằng 19. 8 tỷ sự kết hợp, nghe + +86 +00:06:45,840 --> 00:06:50,330 +có vẻ là một con số lớn, phải không? + +87 +00:06:50,340 --> 00:06:54,300 +Máy tính của bạn sẽ mất bao lâu để tính được số + +88 +00:06:54,300 --> 00:06:55,170 +băm đó? + +89 +00:06:55,380 --> 00:06:56,520 +Vậy ta phải làm sao? + +90 +00:06:56,550 --> 00:06:58,080 +Thôi, đi mua sắm thôi. + +91 +00:06:58,500 --> 00:07:06,990 +Hãy đi và mua một số GPU hoặc card đồ họa mới nhất có khả năng xử lý song song và do + +92 +00:07:06,990 --> 00:07:14,070 +đó đặc biệt phù hợp với không chỉ khai thác Bitcoin mà còn tạo ra các hàm băm. + +93 +00:07:14,340 --> 00:07:23,090 +Với một trong những GPS mới nhất, bạn có thể tính được khoảng 20 tỷ MD5 băm mỗi giây. + +94 +00:07:23,460 --> 00:07:31,170 +Vì vậy, điều đó có nghĩa là với bảng băm 19 của chúng tôi. 8 tỷ sự kết hợp, sẽ chỉ mất một trong + +95 +00:07:31,170 --> 00:07:36,210 +những GPU này là 0. 9 giây, không là gì cả. + +96 +00:07:36,600 --> 00:07:41,520 +Không có nhiều thời gian để đầu tư để băm mật khẩu của nhiều người như vậy. + +97 +00:07:41,820 --> 00:07:48,730 +Và để làm cho nó thậm chí còn tồi tệ hơn, các bảng băm lớn đã được xây dựng cho các mật khẩu phổ biến nhất. + +98 +00:07:49,050 --> 00:07:55,920 +Vì vậy, bởi vì chúng tôi đã có quá nhiều dữ liệu từ các vụ hack trước đây như Adobe một hoặc LinkedIn một hoặc TalkTalk hoặc + +99 +00:07:55,920 --> 00:08:00,630 +Equifax, chúng tôi biết những mật khẩu phổ biến nhất mà mọi người sử dụng là gì. + +100 +00:08:00,840 --> 00:08:07,770 +Và hàng năm, các công ty như Splash Data sẽ biên dịch những mật khẩu phổ biến nhất, chẳng hạn như 25 mật + +101 +00:08:07,770 --> 00:08:08,910 +khẩu hàng đầu. + +102 +00:08:09,240 --> 00:08:12,990 +Và đây là nơi bắt nguồn của tất cả những giá trị trong bảng của chúng tôi. + +103 +00:08:13,200 --> 00:08:15,800 +Nhưng bạn thực sự có thể tiến thêm một bước nữa. + +104 +00:08:16,140 --> 00:08:23,790 +Có những bảng băm được tạo sẵn mà mọi người đã tạo cho 10.000 mật khẩu phổ biến nhất. + +105 +00:08:24,180 --> 00:08:28,620 +Và bạn có thể thấy rằng MD5 là một trong những hàm băm nhanh nhất để tính toán. + +106 +00:08:28,860 --> 00:08:34,470 +Và đây là lý do tại sao việc tìm bảng băm MD5 rất phổ biến. + +107 +00:08:34,590 --> 00:08:38,100 +Và bạn thậm chí có thể sử dụng Google như một bảng băm cơ bản. + +108 +00:08:38,429 --> 00:08:42,150 +Bạn có thể dán mã băm mà bạn tìm thấy từ cơ sở dữ liệu bị tấn công. + +109 +00:08:42,150 --> 00:08:47,500 +Bạn thực hiện một tìm kiếm Google đơn giản và bạn có mật khẩu ban đầu. + +110 +00:08:48,240 --> 00:08:53,580 +Bây giờ, nếu tại thời điểm này, bạn đang cực kỳ sợ hãi và tự hỏi, chính xác thì bạn có thể làm gì + +111 +00:08:53,580 --> 00:08:54,270 +với điều này? + +112 +00:08:54,330 --> 00:09:01,680 +Chà, hãy xem xét rằng trong bảng người dùng của chúng tôi, có một hàm băm cực kỳ khó tìm và nó không khớp với bất + +113 +00:09:01,680 --> 00:09:06,940 +kỳ hàm băm nào trong bảng băm đơn giản nhỏ mà chúng tôi đã xây dựng này. + +114 +00:09:07,140 --> 00:09:14,490 +Vì vậy, điều gì sẽ xảy ra nếu chúng ta đưa nó vào Google để tìm kiếm trên quy mô lớn hơn và xem nó có khớp với bất kỳ hàm + +115 +00:09:14,730 --> 00:09:17,340 +băm nào trong bảng băm mà mọi người đã tạo không? + +116 +00:09:17,880 --> 00:09:20,210 +Và nó không. Nó không phù hợp với bất cứ điều gì. + +117 +00:09:20,490 --> 00:09:27,690 +Và lý do là vì khi John tạo mật khẩu, anh ấy có một mật khẩu rất, + +118 +00:09:27,690 --> 00:09:34,980 +rất mạnh với chữ hoa, chữ thường, số, ký hiệu, nhưng quan trọng nhất là mật khẩu dài. + +119 +00:09:35,220 --> 00:09:42,510 +Khi bạn nghĩ về băm như một công thức toán học, bạn sẽ nhận ra rằng khi số lượng ký tự + +120 +00:09:42,540 --> 00:09:50,130 +trong mật khẩu của bạn tăng lên, thời gian tính toán để bẻ khóa nó sẽ tăng lên theo cấp số nhân. + +121 +00:09:50,290 --> 00:09:57,300 +Vì vậy, không có vấn đề gì nếu tài khoản của bạn trên LinkedIn hoặc Adobe Creative Cloud hoặc Ashley Madison bị bẻ khóa, + +122 +00:09:57,570 --> 00:09:59,520 +miễn là bạn có mật khẩu + +123 +00:09:59,820 --> 00:10:06,300 +mạnh, chúng sẽ không thể xử lý nó từ bảng băm. Ví dụ, có một trang web tên là Password Checker + +124 +00:10:06,300 --> 00:10:12,330 +và bạn có thể nhập mật khẩu của mình vào và nó sẽ cho bạn biết không chỉ độ mạnh + +125 +00:10:12,600 --> 00:10:18,960 +mà còn cho bạn biết sẽ mất bao lâu để các loại máy khác có thể bẻ khóa mật khẩu đó. + +126 +00:10:19,170 --> 00:10:24,660 +Vì vậy, giả sử rằng tôi tạo một mật khẩu sáu ký tự bao gồm một tập hợp các ký + +127 +00:10:24,660 --> 00:10:27,810 +tự ngẫu nhiên, phải không? 123456. + +128 +00:10:28,320 --> 00:10:35,460 +Và bạn có thể thấy rằng ngay cả đối với một máy tính để bàn tiêu chuẩn, chỉ mất khoảng ba giây để thực hiện một + +129 +00:10:35,460 --> 00:10:38,510 +cuộc tấn công bạo lực để bẻ khóa mật khẩu đó. + +130 +00:10:39,090 --> 00:10:43,500 +Nhưng hãy xem điều gì sẽ xảy ra nếu tôi thêm thêm sáu ký tự nữa. + +131 +00:10:43,920 --> 00:10:47,220 +1, 2, 3, 4, 5, 6. + +132 +00:10:48,440 --> 00:10:57,500 +Bây giờ, phải mất 31 năm để một máy tính để bàn tiêu chuẩn có thể bẻ khóa nó và thậm chí một GPU nhanh cũng phải mất hai năm để + +133 +00:10:57,500 --> 00:10:59,270 +bẻ mật khẩu của tôi. + +134 +00:10:59,600 --> 00:11:07,400 +Vì vậy, mặc dù tất cả các trang web đều khuyến khích bạn thêm ký tự viết hoa, viết thường, một số số và một số + +135 +00:11:07,400 --> 00:11:14,660 +ký tự ngẫu nhiên, nếu bạn chỉ có sáu ký tự trong mật khẩu của mình, vì vậy một mật khẩu ngắn, bạn vẫn không + +136 +00:11:14,990 --> 00:11:17,670 +mất nhiều thời gian để bẻ khóa. . + +137 +00:11:18,020 --> 00:11:25,910 +Vì vậy, điều quan trọng nhất của việc tạo một mật khẩu mạnh gần như không thể theo dõi + +138 +00:11:25,910 --> 00:11:32,460 +chỉ là tăng số lượng ký tự. Và cũng để tránh bản thân trở thành nạn nhân của cuộc tấn công + +139 +00:11:32,750 --> 00:11:39,710 +từ điển, chỉ cần đảm bảo rằng bạn không sử dụng một từ trong từ điển hoặc một tên địa điểm hoặc một cái gì đó có trong danh bạ + +140 +00:11:39,710 --> 00:11:41,480 +ở đâu đó như số điện thoại. + +141 +00:11:41,930 --> 00:11:42,290 +Được rồi. + +142 +00:11:42,290 --> 00:11:46,180 +Vì vậy, ít nhất sau bài học này, bạn sẽ biết cách giữ an toàn hơn cho bản thân. + +143 +00:11:46,580 --> 00:11:52,130 +Nhưng trong bài học tiếp theo, chúng ta sẽ giải quyết những lỗ hổng này xảy ra do thuật toán băm yếu và chúng + +144 +00:11:52,130 --> 00:11:52,760 +ta sẽ + +145 +00:11:52,970 --> 00:11:58,790 +tìm hiểu cách chúng ta có thể chống lại những tin tặc cố gắng tấn công cơ sở dữ liệu của chúng ta bằng cách tấn + +146 +00:11:58,790 --> 00:12:00,950 +công từ điển hoặc bằng cách tạo bảng băm . + +147 +00:12:01,250 --> 00:12:04,300 +Vì vậy, cho tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn trong bài học tiếp theo. + +148 +00:12:04,460 --> 00:12:09,050 +Nhưng như một phần thưởng nhanh chóng, nếu bạn muốn lừa bạn bè của mình nghĩ rằng + +149 +00:12:09,050 --> 00:12:14,480 +bạn là một hacker nào đó, ít nhất là theo Hollywood, tôi khuyên bạn nên xem một trang web có tên hackertyper. net nơi bạn có thể kết hợp bàn phím và kết thúc với một thứ gì đó trông cực kỳ thực tế. + +150 +00:12:14,480 --> 00:12:21,280 +Nhưng một lời cảnh báo: cố gắng không làm điều này trên máy bay hoặc trong + +151 +00:12:21,290 --> 00:12:26,840 +tòa nhà chính phủ trừ khi bạn muốn thực sự bị điều tra. + diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Most-Common-Passwords.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Most-Common-Passwords.url new file mode 100644 index 0000000000000000000000000000000000000000..fcdaa738fb5a31c1e71dc40937f5bbc612b3305d --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Most-Common-Passwords.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://en.wikipedia.org/wiki/List_of_the_most_common_passwords \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Password-Complexity-Checker.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Password-Complexity-Checker.url new file mode 100644 index 0000000000000000000000000000000000000000..1cf33e8dcd0cca0d7717c5f917ffdb03743793dd --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Password-Complexity-Checker.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://password-checker.online-domain-tools.com/ \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Plain-Text-Offenders.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Plain-Text-Offenders.url new file mode 100644 index 0000000000000000000000000000000000000000..73ecba98e522edcba58b4ffe208ab0475bc567ec --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/007 Plain-Text-Offenders.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://plaintextoffenders.com/ \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/008 Salting Passwords.mp4 b/part3/68 - Day 68 - Advanced - Authentication with Flask/008 Salting Passwords.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..235575a56e1162b7465ad905ea5f4de31782e904 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/008 Salting Passwords.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b1639eda83e85831a1b33a746af882dcd9e89a0d8008532fc8790f872bca110 +size 20656360 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/008 Salting Passwords_vi.srt b/part3/68 - Day 68 - Advanced - Authentication with Flask/008 Salting Passwords_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..85341c0cf3061de0786bee9fcab1d1cc8f923fb6 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/008 Salting Passwords_vi.srt @@ -0,0 +1,352 @@ +1 +00:00:00,690 --> 00:00:06,900 +Được rồi, bây giờ chúng ta đã thấy một số lỗ hổng có thể có đối với mật khẩu + +2 +00:00:06,900 --> 00:00:15,360 +băm, đã đến lúc nâng cấp và tìm hiểu về cách chúng ta có thể ngăn chặn các loại tấn công từ điển hoặc bẻ khóa + +3 +00:00:15,360 --> 00:00:16,590 +bảng băm này. + +4 +00:00:16,800 --> 00:00:20,260 +Và để làm được điều đó, chúng ta phải tìm hiểu về cách ướp muối. + +5 +00:00:21,150 --> 00:00:23,130 +Bây giờ, muối chính xác là gì? + +6 +00:00:23,370 --> 00:00:26,670 +Chà, chúng ta đã biết băm là gì. Đó là khi chúng tôi lấy một + +7 +00:00:26,670 --> 00:00:33,450 +mật khẩu, chúng tôi chạy nó thông qua một hàm băm và chúng tôi kết thúc với một hàm băm mà chúng tôi lưu trữ trên cơ sở dữ + +8 +00:00:33,450 --> 00:00:34,350 +liệu của mình. + +9 +00:00:34,890 --> 00:00:41,220 +Và như chúng ta đã thấy trong bài học trước, mật khẩu do con người tạo ra là cực kỳ không an toàn. + +10 +00:00:41,370 --> 00:00:47,190 +Chúng có xu hướng rất ngắn và chúng có xu hướng là các từ trong từ điển + +11 +00:00:47,190 --> 00:00:48,540 +cực kỳ dễ + +12 +00:00:48,540 --> 00:00:52,680 +tra cứu và tạo bảng băm. Bây giờ, việc ướp muối cần băm xa hơn một chút. + +13 +00:00:52,890 --> 00:01:01,290 +Ngoài mật khẩu, chúng tôi cũng tạo một bộ ký tự ngẫu nhiên và những ký tự đó cùng với mật khẩu + +14 +00:01:01,290 --> 00:01:06,560 +của người dùng được kết hợp và sau đó đưa vào hàm băm. + +15 +00:01:06,630 --> 00:01:13,470 +Vì vậy, hàm băm kết quả được tạo từ cả mật khẩu cũng như muối duy nhất ngẫu nhiên đó. + +16 +00:01:13,650 --> 00:01:20,400 +Vì vậy, điều đó có nghĩa là bất kể mật khẩu của người dùng đơn giản đến mức nào, việc thêm muối đó sẽ làm tăng độ phức tạp của + +17 +00:01:20,400 --> 00:01:26,170 +nó, tăng số lượng ký tự và chúng tôi làm cho cơ sở dữ liệu người dùng của mình an toàn hơn rất nhiều. + +18 +00:01:26,340 --> 00:01:30,360 +Vì vậy, hãy xem xét vấn đề trước mà chúng ta đã thấy trong bài học trước khi chúng + +19 +00:01:30,600 --> 00:01:32,350 +ta đề cập đến việc hack 101. + +20 +00:01:32,370 --> 00:01:37,860 +Bây giờ chúng tôi biết rằng ba người dùng của chúng tôi có cùng một mật khẩu và chúng tôi đã tìm ra điều đó vì tất cả họ đều + +21 +00:01:37,860 --> 00:01:38,970 +có cùng một hàm băm. + +22 +00:01:39,150 --> 00:01:47,790 +Mặt khác, nếu chúng ta đã tạo một bộ ký tự ngẫu nhiên, đó là muối và kết hợp mật khẩu với muối để tạo hàm + +23 +00:01:47,790 --> 00:01:53,820 +băm, thì chúng sẽ không có cùng một hàm băm trong cơ sở dữ liệu người dùng của + +24 +00:01:53,820 --> 00:01:54,800 +chúng ta. + +25 +00:01:55,020 --> 00:02:01,380 +Vì vậy, hãy thử và tạo mã băm của Emily từ mật khẩu của cô ấy. Vì vậy, chúng tôi biết rằng mật khẩu của cô ấy là qwerty và chúng + +26 +00:02:01,380 --> 00:02:02,970 +tôi tạo ra một muối ngẫu nhiên. + +27 +00:02:03,150 --> 00:02:06,540 +Vì vậy, sau đó chúng ta hãy tiếp tục và nhập mật + +28 +00:02:07,020 --> 00:02:14,670 +khẩu của cô ấy, qwerty, và sau đó chúng tôi thêm vào cuối muối ngẫu nhiên mà chúng tôi đã tạo và chúng tôi kết thúc bằng một hàm băm. + +29 +00:02:15,510 --> 00:02:24,990 +Tuy nhiên, hàm băm này không giống như hàm băm của Tony hay hàm băm của Angela vì muối mỗi lần khác + +30 +00:02:24,990 --> 00:02:25,830 +nhau. + +31 +00:02:26,040 --> 00:02:32,760 +Giờ đây, muối là thứ mà người dùng không cần phải nhớ và thay vào đó, nó được lưu trữ trong cơ sở dữ liệu + +32 +00:02:33,030 --> 00:02:34,410 +cùng với hàm băm. + +33 +00:02:34,800 --> 00:02:40,740 +Vì vậy, điều đó có nghĩa là khi người dùng nhập mật khẩu của họ, khi họ cố gắng đăng nhập, bạn kết hợp mật + +34 +00:02:40,740 --> 00:02:46,170 +khẩu của họ với muối và nếu bạn tạo cùng một hàm băm, thì họ phải có cùng một mật khẩu. + +35 +00:02:46,470 --> 00:02:47,640 +Đó là một loại thông minh, phải không? + +36 +00:02:48,060 --> 00:02:53,670 +Và trên cơ sở dữ liệu của chúng tôi, tất nhiên, chúng tôi sẽ không lưu trữ mật khẩu của họ mà chỉ lưu trữ muối + +37 +00:02:53,670 --> 00:02:54,190 +và băm. + +38 +00:02:54,210 --> 00:02:56,460 +Bây giờ hãy xem xét các số liệu thống kê trước đây của chúng tôi. + +39 +00:02:56,610 --> 00:03:01,950 +Bạn có thể tạo khoảng 20 tỷ băm MD5 mỗi giây. + +40 +00:03:02,040 --> 00:03:10,210 +Vì vậy, ngay cả khi chúng tôi đã thêm một muối và chúng tôi khó tạo bảng băm hơn, với một số GPU mới nhất, + +41 +00:03:10,230 --> 00:03:16,260 +bạn vẫn có thể tạo bảng băm với tất cả các kết hợp muối tương đối nhanh chóng. + +42 +00:03:16,770 --> 00:03:20,040 +Vậy chúng ta có thể làm gì khác để tăng tính bảo mật? + +43 +00:03:20,490 --> 00:03:24,270 +Chà, chúng ta có thể sử dụng thứ gì đó khác ngoài MD5, phải không? + +44 +00:03:24,510 --> 00:03:30,230 +Một thuật toán băm khác được đánh giá cao vì nó cực kỳ chậm. + +45 +00:03:30,780 --> 00:03:32,760 +Và đây là nơi mà bscript đi vào. + +46 +00:03:33,210 --> 00:03:40,800 +Đây là một trong những thuật toán băm tiêu chuẩn ngành mà các nhà phát triển sử dụng để giữ an toàn cho + +47 +00:03:40,800 --> 00:03:48,720 +mật khẩu của người dùng của họ, bởi vì trong khi bạn có thể tính toán 20 tỷ băm MD5 mỗi giây, ngay cả + +48 +00:03:48,720 --> 00:03:57,330 +GPU mới nhất và lớn nhất năm 2019 vẫn chỉ có thể tính toán khoảng 17000 băm bcrypt mỗi giây, điều này khiến hacker khó tạo ra + +49 +00:03:57,330 --> 00:04:05,700 +các bảng băm được biên dịch trước đó một cách đáng kể. Và một bảng băm muối thay vì mất ba giây + +50 +00:04:05,730 --> 00:04:08,220 +Nếu nó được băm bằng MD5, + +51 +00:04:08,430 --> 00:04:10,230 +nếu nó được băm bằng + +52 +00:04:10,410 --> 00:04:15,780 +bcrypt, bạn sẽ mất khoảng tám tháng, điều này không thực sự đáng để + +53 +00:04:15,780 --> 00:04:16,600 +hacker. + +54 +00:04:16,740 --> 00:04:22,890 +Họ có thể sẽ đi và tìm kiếm một công ty được kích hoạt ít bảo mật hơn. Và để làm cho mật khẩu của chúng tôi an + +55 +00:04:22,920 --> 00:04:24,480 +toàn hơn nữa khi chúng + +56 +00:04:24,480 --> 00:04:31,170 +tôi đang sử dụng bcrypt, nó có một khái niệm về những gì được gọi là vòng muối, số vòng bạn sẽ + +57 +00:04:31,170 --> 00:04:33,000 +sử dụng mật khẩu của mình. + +58 +00:04:33,240 --> 00:04:39,090 +Và rõ ràng là bạn càng thực hiện nhiều vòng, mật khẩu của bạn càng có giá trị và cũng là mật khẩu càng an toàn hơn trước các + +59 +00:04:39,090 --> 00:04:39,510 +tin tặc. + +60 +00:04:39,690 --> 00:04:42,110 +Vì vậy, những gì chính xác là vòng muối? + +61 +00:04:42,420 --> 00:04:50,520 +Giả sử rằng mật khẩu người dùng ban đầu của chúng tôi là qwerty và chúng tôi tạo một bộ ký tự ngẫu nhiên dưới + +62 +00:04:50,520 --> 00:04:51,450 +dạng muối. + +63 +00:04:52,500 --> 00:04:55,350 +Vì vậy, bây giờ chúng ta có qwerty và một tập hợp ngẫu nhiên của muối. + +64 +00:04:55,800 --> 00:04:59,790 +Chúng tôi chuyển nó qua hàm băm của chúng tôi, bcrypt, + +65 +00:04:59,990 --> 00:05:07,820 +và chúng tôi kết thúc với một hàm băm. Bây giờ đến một vòng ướp muối, nếu chúng ta muốn có hai lượt muối, thì + +66 +00:05:07,820 --> 00:05:13,100 +chúng ta lấy hàm băm đã được tạo ở vòng một và chúng ta thêm cùng một loại muối từ trước đó. + +67 +00:05:13,580 --> 00:05:19,400 +Và bây giờ chúng tôi chạy nó qua bcrypt, hàm băm một lần nữa, và chúng tôi kết thúc với một hàm băm khác. + +68 +00:05:19,970 --> 00:05:24,650 +Và số lần bạn làm như vậy là số hiệp muối. + +69 +00:05:25,160 --> 00:05:30,630 +Bây giờ, lý do tại sao đây là thiên tài là vì khi máy tính ngày càng nhanh hơn ... + +70 +00:05:30,890 --> 00:05:37,730 +Hãy nhớ rằng Định luật Moore nói rằng mỗi năm số lượng bóng bán dẫn trong chip máy tính gần như tăng gấp đôi và chi + +71 +00:05:37,880 --> 00:05:41,030 +phí của máy tính nhanh hơn đó giảm đi một nửa. + +72 +00:05:41,270 --> 00:05:45,200 +Vì vậy, mỗi năm bạn có thể nhận được nhiều sức mạnh tính toán hơn với số tiền ít hơn. + +73 +00:05:45,320 --> 00:05:47,330 +Và đây là lúc các vòng muối xuất hiện. + +74 +00:05:47,480 --> 00:05:54,410 +Khi băm mật khẩu bằng bcrypt, bạn có thể đặt số vòng bạn muốn để tạo mật + +75 +00:05:54,410 --> 00:05:55,240 +khẩu. + +76 +00:05:55,340 --> 00:06:02,990 +Điều đó có nghĩa là có thể năm nay, năm 2019, bạn đã muối được mười vòng, nhưng có thể năm sau, bạn có thể tăng con + +77 +00:06:02,990 --> 00:06:04,270 +số đó lên 12. + +78 +00:06:04,790 --> 00:06:12,080 +Và cứ mỗi lần tăng con số đó, thời gian cần thiết để băm mật khẩu của bạn sẽ tăng lên gấp đôi. + +79 +00:06:12,350 --> 00:06:19,640 +Và điều đó có nghĩa là bạn không phải thay đổi thuật toán băm hoặc cập nhật mã của mình ngoài việc chỉ cần + +80 +00:06:19,640 --> 00:06:22,460 +thay đổi một số để theo kịp thời đại. + +81 +00:06:22,700 --> 00:06:30,410 +Vì vậy, chỉ để xem xét, quay lại cơ sở dữ liệu người dùng đó, chúng tôi sẽ lưu trữ tên người dùng của mỗi người dùng, chúng tôi + +82 +00:06:30,410 --> 00:06:38,210 +sẽ lưu trữ muối được tạo ngẫu nhiên của họ và sau đó chúng tôi sẽ lưu trữ hàm băm của họ sau một số vòng ướp muối đã + +83 +00:06:38,210 --> 00:06:38,660 +định. + +84 +00:06:40,160 --> 00:06:45,200 +Và khi cần kiểm tra mật khẩu của họ khi họ đăng nhập, chúng tôi sẽ lấy mật khẩu + +85 +00:06:45,200 --> 00:06:51,710 +mà họ đã nhập vào, kết hợp nó với muối được lưu trữ trong cơ sở dữ liệu và chạy nó qua cùng một số + +86 +00:06:51,710 --> 00:06:57,980 +vòng ướp muối cho đến khi chúng tôi kết thúc với băm cuối cùng và chúng tôi so sánh băm với mã được lưu + +87 +00:06:57,980 --> 00:07:02,280 +trữ trong cơ sở dữ liệu để xem liệu họ đã nhập đúng mật khẩu chưa. + +88 +00:07:02,570 --> 00:07:09,920 +Vì vậy, hãy thử xem xét điều đó trong cuộc sống thực và thực hiện các vòng ướp muối vào xác thực trang web của chúng tôi. + diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/009 Hashing and Salting Passwords using Werkzeug.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/009 Hashing and Salting Passwords using Werkzeug.html new file mode 100644 index 0000000000000000000000000000000000000000..34add7039f84df40456cb3d75f9379b08c5937ee --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/009 Hashing and Salting Passwords using Werkzeug.html @@ -0,0 +1 @@ +

At the moment, all the users' password's are stored in our database as plaintext:

1. Delete the previous unhashed entry in the database.


Let's secure their password by hashing it before we store it.

To do this, we'll use the Werkzeug helper function generate_password_hash()

2. Use the documentation here and see if you can figure out how to hash and salt the user's password:

https://werkzeug.palletsprojects.com/en/3.0.x/utils/#module-werkzeug.security

Aim to hash the password using pbkdf2:sha256

And add a salt_length of 8.

This is what you should end up with:

SOLUTION

\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/010 Authenticating Users with Flask-Login.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/010 Authenticating Users with Flask-Login.html new file mode 100644 index 0000000000000000000000000000000000000000..1948784e7257c0817cc750cf7ab26a4b827be412 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/010 Authenticating Users with Flask-Login.html @@ -0,0 +1 @@ +

At the moment, if you simply navigate to /secrets you can see the secret page and the download link. There are no authentication barriers. How can we make sure that only registered/logged in users can see that page and download the file?

We'll need to secure certain routes in our server and make them only accessible if a user is authenticated.

To do this, most Flask developers will use the Flask-Login package.

HARD CHALLENGE: Only allow logged-in users to download the file

Use the Flask-Login documentation to implement the /login route. The /secrets route should be secured so that it requires the user to be logged in.

You'll need to configure Flask-login and then modify the code for several routes: /register, /login, /secrets, and /download.

I recommend tackling this problem in the following order:

  1. Configure Flask-Login

  2. Log the user in upon registering

  3. Protect secrets and download routes so only logged-in users can access them

  4. Write the code for the /login and /logout routes

This is what you're aiming for:

HINT 1: You will  need to configure your Flask app to use Flask_Login.

HINT 2: You will need to create a user_loader callback.

HINT 3: Make sure you implement the UserMixin in your User class.

Note: A Mixin is simply a way to provide multiple inheritance to Python. This is how you add a Mixin:

class MyClass(MixinClassB, MixinClassA, BaseClass):

Further Reading on Mixins

HINT 4: You can check the user's password using the check_password_hash function.

HINT 5: You need to find the user by the email they entered in the login form (e.g., with a where clause).

HINT 6: If the user has successfully logged in or registered, you need to use the login_user() function to authenticate them.

HINT 7: Both the /secrets and /download route need to be secured so that only authenticated users can access them.


SOLUTION


\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/011 Flask Flash Messages.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/011 Flask Flash Messages.html new file mode 100644 index 0000000000000000000000000000000000000000..3958200b6f334912411298019ef4995e30dc79aa --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/011 Flask Flash Messages.html @@ -0,0 +1 @@ +

Sometimes, you will want to give the user some feedback on an action they took. e.g. Was there an issue with login in? Are they typing in the wrong password or does their email not exist? It would be a good user experience if, in these situations, we told them what was wrong, instead of just constantly redirecting them back to the login page.

The easiest way to do this is through Flask Flash messages. They are messages that are sent to the template to be rendered just once. And they disappear when the page is reloaded.

https://flask.palletsprojects.com/en/2.3.x/patterns/flashing/

1. Update the /login route so that if the user's email doesn't exist in the database, you send them a Flash message to let them know and redirect them back to the /login route. e.g.

HINT: A <p> tag in the login page will show up as red text.


2. Update the /login route so that if the check_password() function returns False, you send a Flash message to the user when you redirect them back to the login page. e.g.


3. Update the /register route so that if the user enters an email that already exists in the database, you redirect them to the login page and show a flash message to let them know they have already registered. e.g.


SOLUTION

\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/012 Course-Fixes-Report-an-Issue.url b/part3/68 - Day 68 - Advanced - Authentication with Flask/012 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/012 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/012 Passing Authentication Status to Templates.html b/part3/68 - Day 68 - Advanced - Authentication with Flask/012 Passing Authentication Status to Templates.html new file mode 100644 index 0000000000000000000000000000000000000000..a5f818e89f5313b8d1dcac1ca0085434b0a0bb33 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/012 Passing Authentication Status to Templates.html @@ -0,0 +1 @@ +

Hide the login/register buttons for logged-in users

When a user is logged in, the home page should not show the login/register buttons. And the navigation bar should not show Register or Login either.

e.g.


See if you can make some changes to the code in base.html and index.html so this happens.

Also, add a little message to the logged in user on the homepage that reads (you are already logged in) with a <p> tag.

Remember, as we learnt in previous lessons base.html is the layout template which all the pages inherit from.

https://flask.palletsprojects.com/en/2.3.x/patterns/templateinheritance/


SOLUTION


You can download the completed project in this lesson's resources.

\ No newline at end of file diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/012 day-68-flask-auth-end.zip b/part3/68 - Day 68 - Advanced - Authentication with Flask/012 day-68-flask-auth-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..8ededf301de0ddb5591fe2c7d871ef677951133e --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/012 day-68-flask-auth-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db5cbfd9a72cfb42c2fe3c15c6f9750e59c57c46442911df9c863f60c7b29320 +size 60877 diff --git a/part3/68 - Day 68 - Advanced - Authentication with Flask/external-links.txt b/part3/68 - Day 68 - Advanced - Authentication with Flask/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..f0ab7db057b491bb850ad04e2abddd99bc03aa88 --- /dev/null +++ b/part3/68 - Day 68 - Advanced - Authentication with Flask/external-links.txt @@ -0,0 +1,24 @@ + +006 Cryptii-Online-Encryption +https://cryptii.com/ + +006 How-the-Enigma-Machine-Works +https://www.youtube.com/watch?v=G2_Q9FoD-oQ&ab_channel=Numberphile + +006 The-Flaw-in-the-Enigma-Machine +https://www.youtube.com/watch?v=V4V2bpZlqx8&ab_channel=Numberphile + +007 Plain-Text-Offenders +https://plaintextoffenders.com/ + +007 -have-i-been-pwned- +https://haveibeenpwned.com/Passwords + +007 Most-Common-Passwords +https://en.wikipedia.org/wiki/List_of_the_most_common_passwords + +007 Password-Complexity-Checker +http://password-checker.online-domain-tools.com/ + +012 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/001 Day 69 Goals - Adding Users to Our Blog Project.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/001 Day 69 Goals - Adding Users to Our Blog Project.html new file mode 100644 index 0000000000000000000000000000000000000000..37ef8da567247cb8f6eb94efc8dba1de03e5c29d --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/001 Day 69 Goals - Adding Users to Our Blog Project.html @@ -0,0 +1 @@ +

Wouldn't it be great if we could have some users on our blog? What if we could let anyone sign up and comment on our blog posts? In order for that to work, we would need to add authentication to our blog. This will be the final step in our Blog Capstone Project. Once we're done, it will be a fully-fledged blog website that you can publish and launch.

This is what you'll make by the end of today:

\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/002 Download the Starting Project.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/002 Download the Starting Project.html new file mode 100644 index 0000000000000000000000000000000000000000..931e74f623f33cf5c56a9126cdc68ff722584ece --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/002 Download the Starting Project.html @@ -0,0 +1 @@ +

1. Download the starting .zip files from this lesson.


2. Unzip and open the project in PyCharm. PyCharm may prompt you to create a new virtual environment and install the dependencies listed in the requirements.txt. Agree and click OK.

This should do the trick. However, if you still see any red underlines in your main.py then tell PyCharm to check the virtual environment and dependencies again by going to File -> Reload All from Disk.

3. (Troubleshooting) If you don't get prompted set up a virtual environment, set one up manually by adding a new Python interpreter.

You can also find this under File -> Settings -> Project -> Python Interpreter. Click Add Interpreter -> Add Local Interpreter.

Leave the default settings and click OK


Do not tick "inherit global site-packages". When you click OK, you will create a new venv folder in your project. All of the project requirements and packages will be installed into this venv folder. This keeps the packages isolated from global settings and your operating system as well as all other projects. This is the ideal setup for all Python projects.


4. (Troubleshooting) If you still see red underlines in the main.py, you are missing the required packages (imports). To install all the required packages you can open the Terminal in PyCharm (bottom left).

On Windows type:

python -m pip install -r requirements.txt

On MacOS type:

pip3 install -r requirements.txt



5. Look around the project. The starting files consists of an SQLite database called blog.db. There are some sample blog posts inside. I created this in the same way we created databases before. Take a look a the database using DB Viewer and familiarise yourself with the fields in the database.


6. Run the app and navigate around using the buttons and navigation bar. All the HTML pages should already render. The login/register pages will be incomplete as we're building those out as part of this project. Look through all the code and make sure that everything makes sense before you get started.

\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/002 day-69-starting-files-blog-with-users.zip b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/002 day-69-starting-files-blog-with-users.zip new file mode 100644 index 0000000000000000000000000000000000000000..6624be7e8d499d4838fb3525abff68c1c982d7a8 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/002 day-69-starting-files-blog-with-users.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8519d4334e2709ef3e13b32e10575784fbc130846384a13359da172b543ce1f4 +size 2588346 diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/003 Requirement 1 - Register New Users.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/003 Requirement 1 - Register New Users.html new file mode 100644 index 0000000000000000000000000000000000000000..53f6a2dd227ee841847b4f78c77f925b6c9e6248 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/003 Requirement 1 - Register New Users.html @@ -0,0 +1 @@ +

Use what you've learnt yesterday to allow users to go to the /register route to sign up to your blog website.

1. Create a WTForm in the forms.py called RegisterForm

2. Create a new User table for your database. The data the user entered should be used to create a new entry in your blog.db within a User table.

3. Create your new user within the /register route. Hash and salt the user's password using Werkzeug

4. Use Bootstrap-Flask's render_form() macro to render the form on the register.html.


This is what you are aiming for:



HINT 1: Don't worry about Flask-Login yet, you are just creating a new user in the database. We'll log them in in the next step.


SOLUTION


\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/004 Requirement 2 - Login Registered Users.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/004 Requirement 2 - Login Registered Users.html new file mode 100644 index 0000000000000000000000000000000000000000..e62d4472b94250d7d0c984a52a3e65f1a4542bb5 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/004 Requirement 2 - Login Registered Users.html @@ -0,0 +1 @@ +

1. Users who have been successfully registered (added to the user table in the database) should be able to go to the /login route to use their credentials to log in. You will need to review the Flask-Login docs and the lessons from yesterday to be able to do this.

This is what you're hoping to achieve:

Hint 1: Use a where() clause to filter on user's emails when retrieving a user from the database.

Hint 2: Use Bootsrap-Flask to render the form on the login.html

SOLUTION


2. Add 1 line of code in the /register route so that when users successfully register they are taken back to the home page and are logged in with Flask-Login.


SOLUTION


3. In the in the /register route, if a user is trying to register with an email that already exists in the database then they should be redirected to the /login route and a flash message used to tell them to log in with that email instead.

For the flash message use a <p> tag with class="flash".

This is what you are aiming for:

Hint: To get the flash message to display, edit the login.html.

SOLUTION


4. In the /login route, if a user's email does not exist in the database or if their password does not match the one stored using check_password() then they should be redirected back to /login and a flash message should let them know what they issue was and ask them to try again.

This is what you're aiming for:

SOLUTION


5. Figure out how to update the navbar so that when a user is not logged in it shows:

But if the user is logged in / authenticated after registering, then the navbar should show:

HINT 1: The navbar code is inside header.html

HINT 2: https://flask-login.readthedocs.io/en/latest/#login-example

SOLUTION


6. Code up the /logout route so that when the user clicks on the LOG OUT button, it logs them out and takes them back to the home page.

This is what you're aiming for:


SOLUTION

\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/005 Requirement 3 - Protect Routes.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/005 Requirement 3 - Protect Routes.html new file mode 100644 index 0000000000000000000000000000000000000000..f4a0eaf2f10d8ce09d07e151eeddaa6d037109a7 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/005 Requirement 3 - Protect Routes.html @@ -0,0 +1 @@ +

In our blog, the first registered user will be the admin. The admin user will be able to create new blog posts, edit posts and delete posts.

1. The first user's id is 1. We can use this in index.html and post.html to make sure that only the admin user can see the "Create New Post" and "Edit Post" and Delete buttons.

This is what you're aiming for:

SOLUTION


2. Just because a user can't see the buttons, they can still manually access the /edit-post or /new-post or /delete routes. Protect these routes by writing your own Python decorator called @admin_only.

If the current_user's id is 1 then they can access those routes, otherwise, they should get a 403 error (not authorised).

This is what you're aiming for:


HINT 1: You might need to review the lessons on Python Decorators on day 54.

HINT 2: Your decorator needs to do something similar to Flask's @login_required decorator. Take a look how this code is implemented to figure out how to write your own decorator.

HINT 3: The abort() function is quick way to return HTTP errors like 403 or 404:


SOLUTION


\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/006 Creating Relational Databases.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/006 Creating Relational Databases.html new file mode 100644 index 0000000000000000000000000000000000000000..aa29a347ce3a4684c8247971335640421dda918e --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/006 Creating Relational Databases.html @@ -0,0 +1,25 @@ +

Given that the 1st user is the admin and the blog owner. It would make sense if we could link the blog posts they write to their user in the database. In the future, maybe we will want to invite other users to write posts in the blog and grant them the admin privileges.

So we need to create a relationship between the User table and the BlogPost table to link them together. So we can see which BlogPosts a User has written. Or see which User is the author of a particular BlogPost.

If we were just writing Python code, you could imagine creating a User object which has a property called posts that contains a List of BlogPost objects.

e.g.

class User:
+    def __init__(self, name, email, password):
+         self.name = name
+         self.email = email
+         self.password = password
+         self.posts = []
+
+class BlogPost:
+    def __init__(self, title, subtitle, body):
+         self.title = title
+         self.subtitle = subtitle
+         self.body = body
+
+new_user = User(
+    name="Angela",
+    email="angela@email.com",
+    password=123456,
+    posts=[
+        BlogPost(
+            title="Life of Cactus",
+            subtitle="So Interesting",
+            body="blah blah"
+        )
+    ]        
+}


This would make it easy to find all the BlogPosts a particular user has written. But what about the other way around? How can you find the author of a particular BlogPost object? This is why we're using a database instead of just simple Python data structures.

In relational databases such as SQLite, MySQL or PostgreSQL we're able to define a relationship between tables using a ForeignKey and a relationship() method.

e.g. If we wanted to create a One to Many relationship between the User Table and the BlogPost table, where One User can create many BlogPost objects, we can use the SQLAlchemy docs to achieve this.

https://docs.sqlalchemy.org/en/20/orm/basic_relationships.html


A new database schema

CHALLENGE 1: Modify the class User(UserMixin, db.Model)  and class BlogPost(db.Model) code to create a bidirectional One-to-Many relationship between the two tables. The User should be the parent and the BlogPost will be child. You should be able to easily locate the BlogPosts a User has written and also the User of any BlogPost object.

Note, you will be changing the schema here by adding an foreign key, the author_id. This will be a breaking change. The blog website will not work after you have made this change.

Hint:

SOLUTION

Don't panic if re-run your blog at this point and see this error:

OperationalError: (sqlite3.OperationalError) no such column: blog_posts.author_id



Re-create the database with a new admin user and posts

Our old database is no longer compatible with the new database structure - there are no entries for author_id in the old posts.

Our new code in the main.py modifies our database model by adding a new column into our database that was not present in the original blog.db  from the starter code:

author_id = db.Column(db.Integer, db.ForeignKey("users.id"))


There is no need to preserve the sample data and testing data so we will delete the database and create a new one from scratch. However, this raises an important point: database schemas need to be defined early during the development process. Once an application has launched and accumulated lots of data, you will need to preserve this data by migrating to the new database. Lucky for us, we can leave out the migration step.

Stop your server and delete the existing blog.db entirely. Untick safe delete when prompted and confirm deletion.

Restart your server and register a new admin user.

Also create a new post since we've just wiped our database. However, you'll see the author name disappear from the index.html and page.html pages.

CHALLENGE 2: Modify the index.html and post.html pages so that the author name is still displayed in the right places.

HINT: the author property of BlogPost is now a User object.

SOLUTION


\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 Course-Fixes-Report-an-Issue.url b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 Requirement 4 - Allow Any User to Add Comments to BlogPosts.html b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 Requirement 4 - Allow Any User to Add Comments to BlogPosts.html new file mode 100644 index 0000000000000000000000000000000000000000..0e51814e52482e60daef4e0ae9e862c29132a955 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 Requirement 4 - Allow Any User to Add Comments to BlogPosts.html @@ -0,0 +1 @@ +

1. Create a CommentForm in the form.py file it will only contain a single CKEditorField for users to write their comments.

This is what you're aiming to achieve:

Hint: You might need to check the documentation or day 67 to see how we implement the CKEditor.

SOLUTION


The next step is to allow users to leave a comment and save the comment. Now that we've seen how relationships can be established between tables in our database. Let's step up our relationships to create a new Table where any user can write comments to our blog posts.

2. Create a Table called Comment where the tablename is "comments". It should contain an id and a text property which will be the primary key and the text entered into the CKEditor.

SOLUTION


3. Establish a One to Many relationship Between the User Table (Parent) and the Comment table (Child). Where One User is linked to Many Comment objects.

Hint:


SOLUTION


4. Establish a One to Many relationship between each BlogPost object (Parent) and Comment object (Child). Where each BlogPost can have many associated Comment objects.

Hint:

SOLUTION


5. We added a new Table added and changed the database schema. Let's re-create our database from scratch once again. Stop your flask server and delete the existing blog.db entirely.

Restart your flask server and register your first user. This will be your admin user.

Create a new blog post:


Create another user: a blog reader. The blog reader will comment on the posts.

6. Only allow registered and logged-in users (users that have been authenticated) to comment on posts. Otherwise, they should see a flash message telling them to log in and redirect them to the /login route. You will need to update the /post/<int:post_id> route.


After you've written your code, test it out. Log in as the blog reader, your "John Doe" user (or any user that is not the primary user) and make a comment on a blog post. Check the blog.db to find your comment.

This is what you are aiming for:

If a user is not logged in, clicking "submit comment" should take them back to the login page.

HINT: Will you need a POST method in your routes when adding comments?

SOLUTION


7. Our comments are not visible on the page yet! Let's change this. Update the code in post.html to display all the comments associated with the blog post.

This is what you're aiming for:

HINT 1: Don't worry about the commenter image just yet.

HINT 2: comments is a property of each blog post, you can treat it like a List.

HINT 3: The text of each comment is created from the CKEditor just like the body of each blog post so it will be saved in HTML format.

SOLUTION


Add some profile pics to the comment section

Gravatar images are used across the internet to provide an avatar image for blog commenters.

e.g. Check out the comments section of this blog post:

Gravatar allows you to change the image that you use across the blog websites that use Gravatar here: https://en.gravatar.com/


It's super simple to implement into a Flask application.

7. Use flask-gravatar to add Gravatar images into your comments section.

This is what you should end up with:

HINT: Check out this page for more detailed info


SOLUTION


You can download the completed project in this lesson's resources.

\ No newline at end of file diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 day-69-blog-with-users-end.zip b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 day-69-blog-with-users-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..445ea108b2aae480e80fa6fa076c7e30f4e3fdbc --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/007 day-69-blog-with-users-end.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c49bc7fb97f6781c7ab6f034eb56415d0d83bd12767a263883c84db0ff347a2 +size 2589299 diff --git a/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/external-links.txt b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..70ced16a24185dee9471047f44702028968eea06 --- /dev/null +++ b/part3/69 - Day 69 - Advanced - Blog Capstone Project Part 4 - Adding Users/external-links.txt @@ -0,0 +1,3 @@ + +007 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/001 The Terminal - use either VS Code or PyCharm.html b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/001 The Terminal - use either VS Code or PyCharm.html new file mode 100644 index 0000000000000000000000000000000000000000..3e3fbd366cb6d4d9efba7c9f313d8737d73b0020 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/001 The Terminal - use either VS Code or PyCharm.html @@ -0,0 +1 @@ +

In today's lessons we'll be using the Terminal and the command line to learn about git and version control. Just a quick note, in the videos you'll see me using the Terminal in VS Code instead of PyCharm.

Use the PyCharm Terminal

However, a Terminal is a Terminal, and so you can follow along using PyCharm without any issues. You can find PyCharm's terminal here:

Or download VS Code

If you prefer to match what you see me using in the videos, you can also download and install VS Code from here: https://code.visualstudio.com/


Bash commands on Windows

Windows does not have Bash nor git pre-installed. To follow along as a Windows user, you'll need to install Git Bash as per the next lesson.

\ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Git-for-Windows-incl.Bash-.url b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Git-for-Windows-incl.Bash-.url new file mode 100644 index 0000000000000000000000000000000000000000..962acb9e3b1c7ceae040b357a2a7df3e6fafe13f --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Git-for-Windows-incl.Bash-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://gitforwindows.org/ \ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Install Git Bash on Windows.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Install Git Bash on Windows.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d24909e9b800944faef0d69c28dd5a2d35b7e36c --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Install Git Bash on Windows.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68596447a87cbb8c705537a33cb1afc0f21fc665797fc6b2dec50a1d9e343cfb +size 15830376 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Install Git Bash on Windows_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Install Git Bash on Windows_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..1613181cbe4745a594109f11057c0a935053253c --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/002 Install Git Bash on Windows_vi.srt @@ -0,0 +1,132 @@ +1 +00:00:00,350 --> 00:00:00,890 +Được rồi, các bạn. + +2 +00:00:00,890 --> 00:00:07,790 +Trong bài học này, chúng ta sẽ thực hiện các bước cài đặt để cài đặt git bash và git trên windows. + +3 +00:00:07,820 --> 00:00:13,910 +Mac đã được cài đặt sẵn bash, vì vậy nếu bạn đang làm việc trên mac, bạn có thể bỏ qua bài học này + +4 +00:00:13,910 --> 00:00:16,820 +và chuyển thẳng sang bài học tiếp theo. + +5 +00:00:17,390 --> 00:00:22,400 +Bây giờ, điều đầu tiên bạn sẽ làm là điều hướng đến Git dành cho Windows + +6 +00:00:22,400 --> 00:00:24,800 +và bạn sẽ tải xuống git SM. + +7 +00:00:25,070 --> 00:00:30,200 +Bây giờ, sau khi đã tải xuống, hãy tiếp tục và mở trình cài đặt và chọn. + +8 +00:00:30,200 --> 00:00:31,190 +Đúng. + +9 +00:00:31,960 --> 00:00:34,510 +Và sau đó bạn sẽ đồng ý với giấy phép bằng cách nhấp vào. + +10 +00:00:34,510 --> 00:00:40,720 +Tiếp theo, chọn vị trí mà bạn sẽ cài đặt Git trong bước tiếp theo này, nơi nó yêu cầu bạn + +11 +00:00:40,720 --> 00:00:43,330 +chọn thành phần nào sẽ được cài đặt. + +12 +00:00:43,330 --> 00:00:51,550 +Đảm bảo rằng hộp kiểm bên cạnh Git bash này được chọn và được chọn là Có. + +13 +00:00:51,790 --> 00:00:59,290 +Bây giờ, hãy tiếp tục và để các giá trị mặc định cho phần còn lại và nhấp vào tiếp theo, sau đó để thư mục git + +14 +00:00:59,290 --> 00:01:07,600 +mặc định và nhấp vào tiếp theo, sau đó tiếp tục nhấp vào tiếp theo và tiếp tục với các tùy chọn đã chọn mặc định. + +15 +00:01:07,600 --> 00:01:09,130 +Chọn tiếp theo. + +16 +00:01:09,130 --> 00:01:11,110 +Và tiếp theo. + +17 +00:01:11,110 --> 00:01:13,120 +Và tiếp theo. + +18 +00:01:14,110 --> 00:01:19,900 +Và về cơ bản, hãy tiếp tục chọn tiếp theo và giữ các lựa chọn mặc định từ trình cài đặt. + +19 +00:01:20,620 --> 00:01:25,510 +Bây giờ, sau khi cài đặt hoàn tất, hãy đảm bảo rằng nó hoạt động. + +20 +00:01:25,510 --> 00:01:32,170 +Vì vậy, hãy mở vs mã và mở một thiết bị đầu cuối và bạn có thể tìm thấy nó trên menu trên cùng. + +21 +00:01:32,170 --> 00:01:34,570 +Nhấp vào thiết bị đầu cuối, thiết bị đầu cuối mới. + +22 +00:01:34,570 --> 00:01:42,520 +Và sau đó trong thiết bị đầu cuối mới này, nhấp vào nút thả xuống bên cạnh dấu cộng và chọn Git bash. + +23 +00:01:43,740 --> 00:01:49,080 +Bây giờ bạn sẽ thấy một cái gì đó tương tự như thế này với ký hiệu đô la trong thiết bị đầu cuối. + +24 +00:01:49,440 --> 00:01:55,470 +Bây giờ, để định cấu hình so với mã để biến gitbash thành shell mặc định của bạn, chúng ta phải đi tới bảng lệnh + +25 +00:01:55,470 --> 00:01:59,010 +và chúng ta có thể tìm thấy điều đó bằng cách vào xem bảng lệnh. + +26 +00:01:59,010 --> 00:02:04,380 +Và sau đó trong bảng lệnh, chúng ta sẽ tìm kiếm cấu hình mặc định đã chọn. + +27 +00:02:04,380 --> 00:02:09,870 +Và khi điều đó xuất hiện trong danh sách thả xuống, hãy chọn nó rồi chọn Git bash. + +28 +00:02:09,870 --> 00:02:16,290 +Và điều này sẽ thiết lập sao cho mỗi khi bạn mở một thiết bị đầu cuối mới, chúng tôi sẽ làm việc + +29 +00:02:16,290 --> 00:02:19,530 +với Git Bash làm thiết bị đầu cuối đã chọn. + +30 +00:02:19,530 --> 00:02:20,820 +Vì vậy, hãy thử nó ra. + +31 +00:02:20,820 --> 00:02:27,000 +Hãy nhấp vào đóng thiết bị đầu cuối đó, chọn một thiết bị đầu cuối mới và bạn có thể thấy Bash hiển thị dưới dạng cấu hình cho thiết + +32 +00:02:27,000 --> 00:02:28,350 +bị đầu cuối của chúng ta. + +33 +00:02:28,530 --> 00:02:30,270 +Và bạn có nó rồi đấy! + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/003 Introduction to Version Control and Git.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/003 Introduction to Version Control and Git.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..139e2d1f8888fe041de7e469e9365c52edd8488f --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/003 Introduction to Version Control and Git.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:770996828d9230f5f1acf2ded418ee5340a7124adfd99d16b5ab43b84beef74d +size 8397806 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/003 Introduction to Version Control and Git_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/003 Introduction to Version Control and Git_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..5971f76d73651621bcc2c2c47ccf0303c957cc50 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/003 Introduction to Version Control and Git_vi.srt @@ -0,0 +1,116 @@ +1 +00:00:00,260 --> 00:00:06,980 +Trong mô-đun này, tôi muốn giới thiệu với bạn cách Git hoạt động và cách bạn có thể sử dụng nó để đạt được nhiều mục đích mạnh + +2 +00:00:06,980 --> 00:00:07,840 +mẽ khác nhau. + +3 +00:00:07,850 --> 00:00:14,420 +Và tôi sẽ nói về và chỉ cho bạn cách bạn có thể sử dụng Git trên dòng lệnh để thực hiện những việc như kiểm + +4 +00:00:14,420 --> 00:00:21,980 +soát phiên bản hoặc cách sao chép các kho lưu trữ, cách rẽ nhánh, tạo yêu cầu kéo và hợp nhất các kho lưu trữ và nhiều thứ + +5 +00:00:21,980 --> 00:00:24,620 +thực sự , những điều thực sự thú vị. + +6 +00:00:24,620 --> 00:00:26,960 +Vì vậy, hãy nói về kiểm soát phiên bản. + +7 +00:00:26,960 --> 00:00:32,330 +Ở dạng đơn giản nhất, giả sử rằng tôi tạo một tệp mã mới và tôi viết một vài dòng trong đó. + +8 +00:00:32,360 --> 00:00:36,020 +Bây giờ tôi quyết định đặt nó dưới sự kiểm soát phiên bản bằng Git. + +9 +00:00:36,020 --> 00:00:39,470 +Và hãy nói rằng tôi gọi điểm tiết kiệm này là số một. + +10 +00:00:39,470 --> 00:00:41,840 +Bây giờ đây là phiên bản đầu tiên của tôi. + +11 +00:00:41,840 --> 00:00:47,210 +Vì vậy, sau này, khi tôi tiến bộ, tôi có thể viết thêm một vài dòng mã. + +12 +00:00:47,210 --> 00:00:50,960 +Và tại thời điểm này, tôi quyết định thực hiện một điểm lưu khác. + +13 +00:00:50,960 --> 00:00:53,780 +Và tôi gọi đây là phiên bản thứ hai của mình. + +14 +00:00:54,050 --> 00:01:00,560 +Xa hơn nữa, tôi vô tình làm hỏng toàn bộ tệp mã của mình và không thể sửa được. + +15 +00:01:00,560 --> 00:01:07,670 +Và tôi đã đi đến điểm mà tôi muốn ghi toàn bộ tệp mã của mình hơn là phải thử và sửa + +16 +00:01:07,670 --> 00:01:08,120 +nó. + +17 +00:01:08,150 --> 00:01:14,150 +Bạn gặp phải những tình huống này vì mã của bạn thường được liên kết với nhau và mỗi lớp phụ thuộc vào + +18 +00:01:14,150 --> 00:01:14,840 +lớp khác. + +19 +00:01:14,840 --> 00:01:19,460 +Và đôi khi bạn có thể làm hỏng việc theo cách mà bạn biết đấy, mọi hy vọng đều vụt tắt. + +20 +00:01:19,460 --> 00:01:24,170 +Và tôi chỉ đơn giản là muốn quay lại điểm lưu cuối cùng. + +21 +00:01:24,170 --> 00:01:26,630 +Tôi có thể làm điều đó bằng Git. + +22 +00:01:26,780 --> 00:01:33,140 +Bạn có thể so sánh tệp mã hiện tại của mình với mớ hỗn độn hiện tại mà bạn đã tạo ra với phiên bản trước. + +23 +00:01:33,140 --> 00:01:35,350 +Vì vậy, hãy thêm bất kỳ điểm lưu nào trước đây. + +24 +00:01:35,360 --> 00:01:41,360 +Ngoài ra, bạn có thể chỉ cần quay lại phiên bản trước đó và nó không nhất thiết phải là + +25 +00:01:41,360 --> 00:01:43,190 +phiên bản ngay trước đó. + +26 +00:01:43,190 --> 00:01:49,340 +Bạn có thể quay lại hoặc tiến xa tùy thích miễn là bạn biết mình muốn phiên bản nào. + +27 +00:01:49,370 --> 00:01:55,430 +Trong bài học tiếp theo, tôi sẽ chỉ cho bạn cách kiểm soát phiên bản bằng cách sử dụng Git cục bộ trên máy tính của bạn và chúng ta + +28 +00:01:55,430 --> 00:01:57,590 +sẽ sử dụng dòng lệnh để thực hiện việc này. + +29 +00:01:58,100 --> 00:01:58,940 +Tôi sẽ gặp bạn ở đó. + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Command-Line-Lesson-from-Day-54.url b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Command-Line-Lesson-from-Day-54.url new file mode 100644 index 0000000000000000000000000000000000000000..ebbb0900462cf3c03f16e366682e91fecfb9c3b8 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Command-Line-Lesson-from-Day-54.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://www.udemy.com/course/100-days-of-code/learn/lecture/21928134#overview \ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Version Control using Git and the Command Line.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Version Control using Git and the Command Line.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bd504bc1008a2a39969c6933ab61c7799b8e07f3 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Version Control using Git and the Command Line.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd6ce67506798a549f959ab9a9e97ad63e6d2e9f3611fdd34dc6f41972dd9ef6 +size 98557156 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Version Control using Git and the Command Line_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Version Control using Git and the Command Line_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..3c8d05cf3ac156d2d088c2c356173050daf79402 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/004 Version Control using Git and the Command Line_vi.srt @@ -0,0 +1,676 @@ +1 +00:00:00,260 --> 00:00:05,960 +Bây giờ, điều đầu tiên chúng ta sẽ làm là mở thiết bị đầu cuối và bên trong thiết bị đầu cuối, chúng ta sẽ điều hướng + +2 +00:00:05,960 --> 00:00:07,550 +đến màn hình nền của mình. + +3 +00:00:07,580 --> 00:00:13,640 +Vì vậy, nếu bạn chưa quen với dòng lệnh và chưa xem mô-đun trên dòng lệnh, thì tôi khuyên bạn + +4 +00:00:13,640 --> 00:00:18,260 +nên xem qua nó ngay bây giờ vì chúng ta sẽ sử dụng rất nhiều lệnh để tạo thư + +5 +00:00:18,260 --> 00:00:20,480 +mục và điều hướng xung quanh. + +6 +00:00:20,480 --> 00:00:24,770 +Vì vậy, nếu bạn chưa quen, thì đây là thời điểm tốt để xem qua. + +7 +00:00:25,610 --> 00:00:33,500 +Điều đầu tiên tôi sẽ làm là cho đĩa CD vào máy tính để bàn của mình và ở đây tôi sẽ tạo một thư mục + +8 +00:00:33,500 --> 00:00:35,570 +mới có tên là Story. + +9 +00:00:36,590 --> 00:00:41,030 +Sau đó, tôi sẽ CD vào thư mục câu chuyện này. + +10 +00:00:41,030 --> 00:00:45,020 +Và nếu tôi cho bạn xem với chúng tôi, bạn có thể thấy rằng nó hoàn toàn trống rỗng. + +11 +00:00:45,020 --> 00:00:49,010 +Và tương tự, Inside Finder, tôi có thể cho bạn thấy điều tương tự. + +12 +00:00:49,310 --> 00:00:53,000 +Hãy tiếp tục và tạo một số tệp văn bản. + +13 +00:00:53,000 --> 00:00:59,700 +Tôi sẽ sử dụng Touch để tạo một tệp có tên là Văn bản chấm một chương, sau đó tôi sẽ mở văn bản chấm + +14 +00:00:59,700 --> 00:01:00,870 +một chương. + +15 +00:01:03,450 --> 00:01:09,030 +Vì vậy, chúng ta hãy tiếp tục và mở chương một và viết một cái gì đó bên trong, phải không? + +16 +00:01:12,660 --> 00:01:14,980 +Được rồi, vậy là kiệt tác của tôi đã hoàn thành. + +17 +00:01:15,000 --> 00:01:17,940 +Tôi sẽ tiếp tục và nhấn lưu và tôi sẽ thoát. + +18 +00:01:19,070 --> 00:01:22,580 +Vì vậy, đó là chương đầu tiên của chúng tôi được thực hiện. + +19 +00:01:22,610 --> 00:01:30,320 +Bây giờ, hãy tạo một kho lưu trữ cục bộ Git và bắt đầu theo dõi một số thay đổi của tệp này. + +20 +00:01:30,350 --> 00:01:34,280 +Để khởi tạo git, chúng ta chỉ cần viết git init. + +21 +00:01:34,910 --> 00:01:41,090 +Và như bạn có thể thấy, nó đã khởi tạo một kho lưu trữ git trống bên trong thư mục câu chuyện. + +22 +00:01:41,120 --> 00:01:45,880 +Bây giờ nếu bạn nhìn vào bên trong công cụ tìm, bạn thực sự không thể nhìn thấy dấu chấm git này. + +23 +00:01:45,890 --> 00:01:52,850 +Nhưng như chúng ta đã biết trước đây, nếu bạn sử dụng a, bạn có thể thấy tất cả các tệp ẩn và bạn có thể thấy dot git ở ngay + +24 +00:01:52,880 --> 00:01:59,870 +đó và nó sẽ được sử dụng để theo dõi tất cả các thay đổi của bạn, để chuyển giao các thay đổi của bạn và thực hiện kiểm soát + +25 +00:01:59,870 --> 00:02:01,010 +phiên bản. + +26 +00:02:01,010 --> 00:02:06,770 +Vì vậy, chúng tôi hiện đang ở trong thư mục câu chuyện và bạn cũng có thể gọi đây là thư mục làm việc. + +27 +00:02:06,770 --> 00:02:12,650 +Vì vậy, như tôi đã đề cập trước đây, sử dụng Git và tìm hiểu về kiểm soát phiên bản, nó đi kèm với + +28 +00:02:12,650 --> 00:02:15,170 +một số thuật ngữ và ngôn ngữ riêng. + +29 +00:02:15,170 --> 00:02:19,950 +Vì vậy, tôi sẽ cố gắng đơn giản hóa rất nhiều thuật ngữ mà bạn sẽ bắt gặp chỉ để tất cả chúng ta có thể + +30 +00:02:19,950 --> 00:02:23,550 +ở trên cùng một trang và tất cả chúng ta đều hiểu điều gì đang diễn ra. + +31 +00:02:23,940 --> 00:02:29,370 +Hiện tại chúng tôi đang ở trong thư mục làm việc, đó là thư mục câu chuyện. + +32 +00:02:29,370 --> 00:02:37,500 +Và ở đây, để bắt đầu theo dõi những thay đổi trong tệp của tôi, ví dụ: chương một chấm văn bản, + +33 +00:02:37,500 --> 00:02:46,620 +thì tôi cần thêm tệp này vào cái được gọi là khu vực tổ chức, và về cơ bản, đó là nơi trung gian để bạn có thể + +34 +00:02:46,620 --> 00:02:53,790 +chọn và chọn cái nào các tệp bên trong thư mục làm việc của bạn mà bạn muốn cam kết. + +35 +00:02:53,820 --> 00:03:00,960 +Vì vậy, để xem những gì hiện có bên trong khu vực tổ chức của bạn, bạn có thể sử dụng lệnh trạng thái Git và nó cho bạn thấy + +36 +00:03:00,960 --> 00:03:04,950 +rằng có những tệp chưa được theo dõi sẽ được hiển thị bằng màu đỏ. + +37 +00:03:04,950 --> 00:03:11,040 +Và đây là thứ đơn giản nằm trong thư mục làm việc của bạn, nhưng nó chưa có trong + +38 +00:03:11,040 --> 00:03:18,300 +khu vực tổ chức. Để thêm nó vào khu vực tổ chức và bắt đầu theo dõi các thay đổi trong đó, chúng ta + +39 +00:03:18,300 --> 00:03:20,610 +phải sử dụng lệnh git add. + +40 +00:03:20,970 --> 00:03:24,510 +Chúng ta sẽ gõ git add và gõ tên tệp. + +41 +00:03:24,510 --> 00:03:27,330 +Vì vậy, trong trường hợp này là chương một chấm văn bản. + +42 +00:03:27,330 --> 00:03:29,190 +Vì vậy, hãy tiếp tục và nhấn enter. + +43 +00:03:29,190 --> 00:03:35,820 +Và sau đó, nếu chúng tôi thử sử dụng lại trạng thái Git, bạn có thể thấy rằng tệp đó đã được thêm dưới dạng tệp mới và hiện + +44 +00:03:35,820 --> 00:03:37,350 +tại tệp có màu xanh lục. + +45 +00:03:37,350 --> 00:03:41,880 +Vì vậy, điều này hiện đang ở trong khu vực tổ chức và nó đã sẵn sàng để được cam kết. + +46 +00:03:41,880 --> 00:03:45,600 +Vì vậy, hãy tiếp tục và cam kết điều này dưới sự kiểm soát phiên bản. + +47 +00:03:45,600 --> 00:03:53,790 +Vì vậy, lệnh là git commit và tôi sẽ sử dụng dấu gạch ngang M để thêm thông báo cam kết. + +48 +00:03:53,880 --> 00:03:56,790 +Thông điệp cam kết thực sự, thực sự quan trọng. + +49 +00:03:56,790 --> 00:04:03,360 +Đó là thứ giúp bạn theo dõi những thay đổi bạn đã thực hiện trong mỗi lần cam kết. + +50 +00:04:03,360 --> 00:04:11,640 +Vì vậy, khi bạn tạo một điểm lưu mới, bạn muốn càng rõ ràng càng tốt về những thay đổi đã được thực hiện giữa + +51 +00:04:11,640 --> 00:04:15,270 +điểm lưu cuối cùng và điểm lưu hiện tại này. + +52 +00:04:15,270 --> 00:04:22,940 +Đối với cam kết ban đầu của chúng tôi, chúng tôi có thể sử dụng một cái gì đó rất đơn giản như cam kết ban đầu và điều này cho thấy rằng đây là + +53 +00:04:22,940 --> 00:04:24,620 +điểm bắt đầu của chúng tôi. + +54 +00:04:24,650 --> 00:04:30,680 +Ngoài ra, nếu bạn muốn cụ thể hơn một chút, vì trong trường hợp của chúng tôi, chúng tôi thực sự đã hoàn + +55 +00:04:30,680 --> 00:04:34,790 +thành chương một, vì vậy bạn có thể viết hoàn chỉnh chương một. + +56 +00:04:35,600 --> 00:04:41,270 +Bây giờ, điều mà bạn sẽ nhận ra là thông thường với các thông báo cam kết, chúng được viết ở thì hiện tại + +57 +00:04:41,270 --> 00:04:43,250 +và đây là cách thực hành tốt nhất. + +58 +00:04:43,250 --> 00:04:49,910 +Vì vậy, mặc dù có lẽ sẽ hợp lý hơn, tôi đoán, ít nhất là trong đầu tôi, viết chương một đã + +59 +00:04:49,940 --> 00:04:57,260 +hoàn thành làm điểm lưu này, nhưng thực ra theo quy ước, bạn nên luôn sử dụng thì hiện tại. + +60 +00:04:57,260 --> 00:04:59,570 +Vì vậy, nó giống như bạn đang gửi các thay đổi của mình. + +61 +00:04:59,570 --> 00:05:07,250 +Bây giờ, hãy tiếp tục và nhấn enter để thực hiện cam kết đầu tiên của chúng ta và bạn có thể xem những cam kết nào bạn đã + +62 +00:05:07,250 --> 00:05:10,190 +thực hiện bằng cách sử dụng lệnh Git log. + +63 +00:05:10,400 --> 00:05:15,860 +Bạn có thể thấy rằng cam kết này được thực hiện vào thời điểm này bởi người này. + +64 +00:05:15,860 --> 00:05:18,470 +Và nó cũng có một hàm băm. + +65 +00:05:18,470 --> 00:05:23,490 +Và hàm băm này xác định duy nhất cam kết cụ thể này. + +66 +00:05:23,490 --> 00:05:29,580 +Và ngay ở phần cuối, bạn sẽ thấy thông báo cam kết này về nội dung của điểm lưu này. + +67 +00:05:30,270 --> 00:05:35,010 +Vì vậy, bây giờ tôi sẽ tiếp tục và viết thêm hai chương nữa. + +68 +00:05:35,010 --> 00:05:45,960 +Vì vậy, chúng ta hãy tạo một văn bản chương hai điểm và văn bản chương ba chấm. + +69 +00:05:45,960 --> 00:05:52,320 +Và bây giờ chúng ta có ba chương và tôi sẽ vào và thay đổi một số tệp văn bản này. + +70 +00:05:52,320 --> 00:05:53,970 +Vì vậy, hãy nói. + +71 +00:06:05,500 --> 00:06:07,990 +Được rồi, vậy là xong chương hai. + +72 +00:06:07,990 --> 00:06:13,660 +Và cuối cùng, hãy tiếp tục và chỉ cần mở chương ba và chỉnh sửa nó. + +73 +00:06:25,380 --> 00:06:25,800 +Được rồi. + +74 +00:06:25,800 --> 00:06:27,990 +Vì vậy, cả ba tập tin đã được thay đổi. + +75 +00:06:27,990 --> 00:06:33,360 +Và ở đây trong Finder, bạn thực sự có thể xem nhanh nội dung là gì, điều này sẽ thực sự + +76 +00:06:33,360 --> 00:06:38,850 +hữu ích đối với tôi để có thể chứng minh cho bạn thấy Git đang làm gì đằng sau nền tảng. + +77 +00:06:38,850 --> 00:06:45,180 +Vì vậy, bây giờ hãy tiếp tục và thêm hai tệp mới này vào khu vực tổ chức của chúng tôi. + +78 +00:06:45,180 --> 00:06:51,990 +Vì vậy, một lần nữa, nếu chúng tôi sử dụng trạng thái Git, bạn có thể thấy rằng có hai tệp không được theo dõi, + +79 +00:06:51,990 --> 00:06:56,310 +chỉ có trong thư mục làm việc và chưa có trong khu vực tổ chức. + +80 +00:06:56,310 --> 00:07:02,940 +Vì vậy, chúng tôi có thể đặt nó vào khu vực tổ chức bằng cách thêm từng cái như chúng tôi đã làm trước đây. + +81 +00:07:02,970 --> 00:07:09,600 +Git Add và viết một cái gì đó như văn bản chấm chương hai và sau đó thực hiện git add chương ba văn bản chấm. + +82 +00:07:09,720 --> 00:07:16,050 +Nhưng như bạn có thể tưởng tượng, nếu bạn có khá nhiều tệp, thì việc phải thực hiện từng tệp + +83 +00:07:16,050 --> 00:07:17,700 +một sẽ vô cùng tẻ nhạt. + +84 +00:07:17,700 --> 00:07:20,130 +Vì vậy, tất nhiên có một cách tốt hơn. + +85 +00:07:20,250 --> 00:07:26,050 +Thay vì thêm từng tệp một, chúng ta thực sự có thể chỉ cần nói Git add và sau đó sử + +86 +00:07:26,080 --> 00:07:31,090 +dụng dấu chấm để chỉ định mọi thứ bên trong thư mục hiện tại này. + +87 +00:07:31,090 --> 00:07:33,970 +Vì vậy, mọi thứ bên trong thư mục câu chuyện. + +88 +00:07:34,120 --> 00:07:40,240 +Bây giờ nếu tôi tiếp tục và nhấn enter, sau đó chuyển sang trạng thái Git một lần nữa, bạn + +89 +00:07:40,240 --> 00:07:47,560 +có thể thấy rằng có hai tệp mới đã được thêm vào khu vực tổ chức và bây giờ chúng ta sẽ chuyển hai tệp đó sang + +90 +00:07:47,560 --> 00:07:50,530 +một cam kết mới cho một điểm lưu mới. + +91 +00:07:50,530 --> 00:07:52,450 +Và bạn biết phải làm gì. + +92 +00:07:52,450 --> 00:07:55,510 +Nếu bạn đang theo dõi tôi, hãy tiếp tục và thử đi. + +93 +00:07:59,310 --> 00:07:59,700 +Được rồi. + +94 +00:07:59,700 --> 00:08:01,080 +Vì vậy, làm thế nào mà được? + +95 +00:08:01,200 --> 00:08:09,540 +Nếu bạn còn nhớ, lệnh là git commit và chúng ta sẽ sử dụng cờ M để chỉ định một thông báo + +96 +00:08:09,540 --> 00:08:14,940 +cam kết và chúng ta sẽ viết một thông báo ở thì hiện tại. + +97 +00:08:14,940 --> 00:08:20,940 +Vì vậy, hãy nói hoàn thành chương hai và ba. + +98 +00:08:21,900 --> 00:08:28,740 +Vì vậy, đó là tất cả những gì tôi đã thực hiện giữa cam kết ban đầu và cam kết này. + +99 +00:08:28,740 --> 00:08:33,240 +Sự khác biệt duy nhất là tôi đã hoàn thành chương hai và chương ba. + +100 +00:08:33,240 --> 00:08:37,260 +Vì vậy, hãy tiếp tục và nhấn enter lần nữa. + +101 +00:08:37,260 --> 00:08:45,120 +Hãy xem thử Sử dụng git log, chúng ta có thể thấy rằng chúng ta hiện có hai lần xác nhận, cả hai lần xác nhận đều có giá trị băm khác nhau vì + +102 +00:08:45,120 --> 00:08:47,490 +chúng là duy nhất và chúng khác nhau. + +103 +00:08:47,520 --> 00:08:52,920 +Phần đầu tiên đã hoàn thành chương một và nó đã được thực hiện vào thời điểm này. + +104 +00:08:52,920 --> 00:08:59,680 +Và sau đó, khoảng năm phút sau, tôi đã hoàn thành chương hai và ba và đó là lần cam kết + +105 +00:08:59,680 --> 00:09:00,460 +thứ hai. + +106 +00:09:00,460 --> 00:09:03,520 +Và đây là nơi chúng ta đang ở ngay bây giờ. + +107 +00:09:03,520 --> 00:09:10,840 +Vì vậy, bạn có thể thấy bằng từ đầu này, đây là vị trí hoặc trạng thái hiện tại mà chúng ta đang ở. + +108 +00:09:10,840 --> 00:09:14,320 +Vì vậy, tôi chỉ muốn nhanh chóng tóm tắt lại những gì chúng ta vừa làm. + +109 +00:09:14,350 --> 00:09:19,570 +Chúng tôi đã tạo một tệp trong thư mục làm việc bên trong thư mục câu chuyện của chúng tôi. + +110 +00:09:19,570 --> 00:09:27,130 +Vì vậy, thư mục làm việc là thư mục hoặc thư mục nơi bạn khởi tạo kho lưu trữ git của mình. + +111 +00:09:27,130 --> 00:09:31,540 +Khi chúng tôi nói git init, chúng tôi đã làm điều đó trong thư mục câu chuyện. + +112 +00:09:31,540 --> 00:09:37,840 +Vì vậy, nó trở thành thư mục làm việc của chúng ta và từ bây giờ git sẽ cố gắng theo dõi + +113 +00:09:37,840 --> 00:09:43,150 +những thay đổi mà nó thấy giữa thư mục làm việc và kho lưu trữ cục bộ. + +114 +00:09:43,780 --> 00:09:52,480 +Ban đầu, chúng tôi đã tạo một tệp bên trong thư mục làm việc của chúng tôi bên trong câu chuyện và sau đó chúng tôi sử dụng git + +115 +00:09:52,510 --> 00:09:54,820 +add để đẩy nó vào khu vực tổ chức. + +116 +00:09:54,820 --> 00:10:00,370 +Bây giờ lý do tại sao có khu vực tổ chức trung gian này bởi vì bạn có thể thắc mắc tại sao không đi + +117 +00:10:00,370 --> 00:10:02,980 +thẳng từ thư mục làm việc đến kho lưu trữ? + +118 +00:10:02,980 --> 00:10:05,220 +Tại sao chúng ta cần thêm bước này? + +119 +00:10:05,230 --> 00:10:12,850 +Chà, đôi khi bạn có thể không muốn thêm tất cả các tệp của mình để được theo dõi hoặc tất cả các tệp của bạn sẽ được + +120 +00:10:12,850 --> 00:10:13,780 +cam kết. + +121 +00:10:13,780 --> 00:10:19,600 +Vì vậy, khu vực tổ chức là một nơi tốt để thử và tìm ra đâu là những thứ bạn muốn git bỏ qua và + +122 +00:10:19,600 --> 00:10:22,390 +đâu là những thứ bạn muốn được theo dõi. + +123 +00:10:22,420 --> 00:10:29,020 +Khi chúng tôi đã sử dụng Git Add, chúng tôi đã đặt tệp của mình vào khu vực tổ chức và chúng tôi hài lòng với những thay đổi + +124 +00:10:29,020 --> 00:10:30,520 +mà chúng tôi sẽ cam kết. + +125 +00:10:30,520 --> 00:10:36,490 +Sau đó, bước tiếp theo là tiếp tục và cam kết bằng cách sử dụng lệnh git commit. + +126 +00:10:36,700 --> 00:10:45,400 +Vì vậy, bây giờ tệp của chúng tôi nằm trong kho lưu trữ cục bộ của chúng tôi và phiên bản đó được đặt tên thông qua thông báo cam kết. + +127 +00:10:45,400 --> 00:10:53,440 +Vì vậy, điều đó có nghĩa là ngay cả khi chúng tôi đã làm hỏng tệp của mình, chúng tôi vẫn có thể sử dụng phiên bản cuối cùng dưới + +128 +00:10:53,440 --> 00:11:01,540 +sự kiểm soát phiên bản và chúng tôi có thể sử dụng một lệnh đặc biệt có tên Git checkout để hoàn nguyên hoặc quay lại vị trí cuối + +129 +00:11:01,540 --> 00:11:04,660 +cùng trong kho lưu trữ cục bộ của chúng tôi. + +130 +00:11:04,870 --> 00:11:10,120 +Để tôi cho bạn thấy nó trông như thế nào trong dòng lệnh và cách chúng ta làm điều đó trong thực tế. + +131 +00:11:10,240 --> 00:11:15,340 +Hiện tại tôi đã có ba chương được viết rất hay và tôi có cảm giác cuốn sách của mình + +132 +00:11:15,340 --> 00:11:16,210 +sẽ bán chạy. + +133 +00:11:16,210 --> 00:11:24,550 +Bây giờ hãy giả sử rằng tôi, bạn biết đấy, đang viết chương ba và tôi đã hoàn toàn làm mọi thứ rối tung lên. + +134 +00:11:24,550 --> 00:11:31,030 +Bạn biết đấy, tôi chỉ ngủ quên trên bàn phím và tình cờ tôi đã lưu tệp của mình. + +135 +00:11:31,030 --> 00:11:35,230 +Và bây giờ nếu bạn có một cái nhìn vào nó, nó bây giờ chỉ là mumbo jumbo. + +136 +00:11:35,230 --> 00:11:37,480 +Và tôi đã phá hỏng kiệt tác của mình. + +137 +00:11:37,480 --> 00:11:45,580 +Nhưng đừng sợ, vì chúng tôi có quyền kiểm soát phiên bản và chúng tôi đã kích hoạt git nên chúng tôi không có gì phải lo lắng. + +138 +00:11:45,670 --> 00:11:51,120 +Tôi thực sự có thể hoàn nguyên các thay đổi mà tôi đã thực hiện cục bộ trong thư mục làm việc của mình. + +139 +00:11:51,130 --> 00:11:57,250 +Vì vậy, tại thời điểm này, bạn có thể sử dụng trạng thái Git để thấy rằng chúng tôi có các sửa đổi trong tệp + +140 +00:11:57,250 --> 00:12:02,170 +văn bản chương ba của chúng tôi chưa được cam kết hoặc thêm vào khu vực tổ chức. + +141 +00:12:02,170 --> 00:12:08,470 +Vì vậy, nếu chúng ta muốn, chúng ta thực sự có thể đưa nó trở lại vinh quang trước đây. + +142 +00:12:08,560 --> 00:12:15,520 +Nhưng trước khi làm điều đó, chúng ta có thể sử dụng lệnh Git để kiểm tra sự khác biệt giữa phiên bản hiện tại + +143 +00:12:15,520 --> 00:12:20,500 +của Chương ba và điểm lưu cuối cùng trong kho lưu trữ Git của chúng ta là gì? + +144 +00:12:20,770 --> 00:12:24,160 +Để làm điều đó, bạn có thể sử dụng lệnh git diff. + +145 +00:12:24,160 --> 00:12:29,080 +Vì vậy, sự khác biệt và chúng tôi sẽ đặt cho nó tên tệp chương ba. + +146 +00:12:29,080 --> 00:12:33,880 +Và nếu bạn nhấn enter, bạn có thể thấy rằng đây là phần đã bị xóa. + +147 +00:12:33,880 --> 00:12:40,540 +Vì vậy, phần màu đỏ và sau đó là phần đã được thêm vào, đó là phần gobbled gobbled của chúng tôi. + +148 +00:12:40,540 --> 00:12:46,420 +Vì vậy, bây giờ nếu tôi đã xem xét những điểm khác biệt này, thì có thể là, bạn biết đấy, chỉ + +149 +00:12:46,420 --> 00:12:52,480 +có một vài lỗi trong phiên bản mới của Chương ba của tôi, và tôi chỉ muốn có thể sao chép một số + +150 +00:12:52,480 --> 00:12:57,850 +thứ hoặc xem cách tôi đã làm một số việc trước đây và thay đổi tệp hiện tại của tôi. + +151 +00:12:57,850 --> 00:12:58,330 +Nhưng. + +152 +00:12:58,580 --> 00:13:03,260 +Những lần khác, bạn biết đấy, có thể là do bạn muốn đốt cháy tệp mới. + +153 +00:13:03,260 --> 00:13:05,420 +Bạn chỉ không muốn bất cứ điều gì để làm với nó. + +154 +00:13:05,420 --> 00:13:08,970 +Và bạn muốn quay trở lại phiên bản trước hơn. + +155 +00:13:08,990 --> 00:13:15,470 +Vì vậy, nếu bạn muốn làm điều đó, thì có một lệnh gọi là Git checkout sẽ thực sự, thực sự + +156 +00:13:15,470 --> 00:13:16,830 +hữu ích cho bạn. + +157 +00:13:16,850 --> 00:13:23,120 +Vì vậy, git checkout và sau đó chúng tôi sẽ chỉ định tên của tệp mà chúng tôi muốn kiểm tra, đó + +158 +00:13:23,120 --> 00:13:24,950 +là chương ba dấu chấm txt. + +159 +00:13:24,950 --> 00:13:31,190 +Và nếu bạn chỉ xem qua đây, đó là bản xem trước của phiên bản hiện tại của chương ba dot txt. + +160 +00:13:31,220 --> 00:13:39,320 +Khi tôi nhấn enter vào lệnh này, lệnh này về cơ bản sẽ yêu cầu khôi phục chương ba này về phiên bản cuối cùng đã được cam + +161 +00:13:39,320 --> 00:13:42,610 +kết trong kho lưu trữ cục bộ của chúng tôi. + +162 +00:13:42,620 --> 00:13:46,070 +Vì vậy, nếu tôi nhấn enter, bạn có thể thấy điều đó gần như ngay lập tức. + +163 +00:13:46,070 --> 00:13:53,270 +Chương ba của tôi đã được khôi phục về trạng thái vinh quang trước đó và đây là phiên bản của Chương + +164 +00:13:53,270 --> 00:13:57,290 +ba ở điểm kiểm tra cuối cùng mà tôi đã cam kết. + +165 +00:13:57,290 --> 00:14:01,800 +Vì vậy, đó là cái này, đã hoàn thành chương hai và ba. + +166 +00:14:01,830 --> 00:14:07,410 +Trong khi đó, trong bài học này, chúng ta chủ yếu xem xét các triển khai Git cục bộ. + +167 +00:14:07,410 --> 00:14:11,300 +Vì vậy, lưu cục bộ các phiên bản này trên máy tính của chúng tôi. + +168 +00:14:11,310 --> 00:14:17,100 +Trong bài học tiếp theo, tôi sẽ nói về Git Hub và tạo kho lưu trữ từ xa. + +169 +00:14:17,100 --> 00:14:18,420 +Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/005 Github and Remote Repositories.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/005 Github and Remote Repositories.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..848566d09fb15eff5ae5d38f12fce3339f393a45 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/005 Github and Remote Repositories.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:376de6e43ff138e4ebede782883df7f3c402e9d17a1ceb708672f20a24a0258d +size 139613924 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/005 Github and Remote Repositories_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/005 Github and Remote Repositories_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cd01ba29dacdbbe78dca3d90d0b3fe5a9d40441f --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/005 Github and Remote Repositories_vi.srt @@ -0,0 +1,488 @@ +1 +00:00:00,590 --> 00:00:01,040 +Được rồi. + +2 +00:00:01,040 --> 00:00:08,830 +Vì vậy, trong bài học trước chúng ta đã xem xét các triển khai cục bộ của việc sử dụng Git và kiểm soát phiên bản, thì trong + +3 +00:00:08,840 --> 00:00:13,460 +bài học này, chúng ta sẽ nói về cách bạn có thể tạo một kho lưu trữ từ xa. + +4 +00:00:13,460 --> 00:00:20,390 +Vì vậy, một kho lưu trữ được lưu trữ trên máy chủ của người khác hoặc máy tính của người khác bằng cách sử dụng trung tâm Git. + +5 +00:00:20,420 --> 00:00:25,850 +Bây giờ, hầu hết mọi người đều đã nghe nói về Git Hub và chắc chắn bạn đã sử dụng Git Hub nhiều + +6 +00:00:25,850 --> 00:00:26,420 +lần. + +7 +00:00:26,420 --> 00:00:31,640 +Vì vậy, nếu bạn chưa thiết lập tài khoản trên GitHub, thì đây là lúc để làm điều đó. + +8 +00:00:31,640 --> 00:00:38,660 +Vì vậy, hãy truy cập GitHub. com và chỉ cần điền vào biểu mẫu nhanh này để tạo tài khoản trên GitHub. + +9 +00:00:38,750 --> 00:00:44,660 +Nó hoàn toàn miễn phí và tất cả những gì bạn cần làm chỉ là xác nhận email của bạn để có thể truy cập nó. + +10 +00:00:45,380 --> 00:00:48,220 +Khi bạn đã hoàn thành việc đó, hãy tiếp tục và đăng nhập. + +11 +00:00:48,230 --> 00:00:51,410 +Khi bạn đã đăng nhập, bạn nên xem trang này. + +12 +00:00:51,410 --> 00:00:57,740 +Và những gì chúng ta sẽ làm là tạo một kho lưu trữ bên trong trung tâm Git dựa trên trình duyệt. + +13 +00:00:57,740 --> 00:01:04,590 +Vì vậy, nếu bạn điều hướng đến góc trên cùng bên phải này và nhấp vào mũi tên dấu cộng đó, thì bạn có thể chọn kho lưu trữ + +14 +00:01:04,860 --> 00:01:11,820 +mới và tôi sẽ đặt tên cho kho lưu trữ của mình, cùng tên, tôi đoán chúng ta sẽ gọi nó là câu chuyện và hãy mô tả về nó. + +15 +00:01:11,820 --> 00:01:15,960 +Hãy nói kiệt tác của tôi. + +16 +00:01:16,890 --> 00:01:21,840 +Bây giờ, theo mặc định, tất cả các kho lưu trữ mà bạn tạo trên GitHub là công khai. + +17 +00:01:21,870 --> 00:01:27,810 +Điều đó có nghĩa là bất kỳ ai cũng có thể xem tất cả các tệp bên trong kho lưu trữ đã lưu của bạn. + +18 +00:01:27,930 --> 00:01:34,590 +Mọi thứ bạn cam kết với kho lưu trữ từ xa hoặc với kho lưu trữ GitHub của bạn sẽ được công khai. + +19 +00:01:34,860 --> 00:01:38,490 +Nếu bạn không muốn điều đó, thì bạn có thể chọn riêng tư. + +20 +00:01:38,490 --> 00:01:44,160 +Nhưng trong hầu hết các trường hợp, nếu bạn không làm bất cứ điều gì tối mật, hoặc nếu bạn + +21 +00:01:44,160 --> 00:01:50,820 +không phát triển công nghệ hoàn toàn mới, thì việc có một kho lưu trữ công khai không phải là vấn đề lớn. + +22 +00:01:50,820 --> 00:01:56,760 +Và mặt khác, bạn có thể thấy vô số kho lưu trữ công khai của người khác và bạn có thể thấy, ví dụ, + +23 +00:01:56,760 --> 00:02:02,100 +cách họ cấu trúc mã của họ, phong cách của họ là gì và bạn có thể thấy cách mọi người làm + +24 +00:02:02,100 --> 00:02:02,820 +mọi việc. + +25 +00:02:02,820 --> 00:02:10,620 +Ví dụ, trên GitHub có toàn bộ kho lưu trữ về những thứ như Flappy Bird, vì vậy đây là toàn bộ quá trình triển khai + +26 +00:02:10,620 --> 00:02:17,460 +Flappy Bird và bạn có thể chạy nó hoặc bạn cũng có thể xem qua cơ sở mã của họ để xem họ đã làm điều này + +27 +00:02:17,460 --> 00:02:18,690 +như thế nào. + +28 +00:02:19,560 --> 00:02:25,980 +Đây là vẻ đẹp của mã nguồn mở và khi bạn phát triển trong hành trình trở thành nhà phát triển, thì + +29 +00:02:26,010 --> 00:02:32,310 +bạn có thể thấy rằng bạn muốn đóng góp cho các dự án nguồn mở khác, giúp đỡ họ một chút và làm việc + +30 +00:02:32,310 --> 00:02:37,920 +trong một nhóm ảo để thử và đóng góp. kiến thức và kỹ năng lập trình của bạn. + +31 +00:02:38,190 --> 00:02:44,070 +Được rồi, vì vậy khi tôi đã chọn công khai, điều tiếp theo là tôi sẽ để trống phần này. + +32 +00:02:44,070 --> 00:02:48,180 +Tôi sẽ không khởi tạo Readme cho kho lưu trữ của mình. + +33 +00:02:48,450 --> 00:02:53,940 +Điều tiếp theo là tôi sẽ tiếp tục và nhấp vào nút lớn màu xanh lá cây và tạo kho lưu trữ của mình. + +34 +00:02:54,390 --> 00:02:58,140 +Bây giờ bạn có thể thấy rằng có hai cách mà họ nói với bạn. + +35 +00:02:58,140 --> 00:03:00,690 +Bạn có thể thiết lập kho lưu trữ của mình. + +36 +00:03:00,720 --> 00:03:07,740 +Bạn có thể thiết lập nó trong GitHub trên máy tính để bàn, ứng dụng khách máy tính để bàn của họ, thứ mà tôi không phải là người hâm mộ lớn. + +37 +00:03:07,770 --> 00:03:13,830 +Nhưng thay vào đó, điều chúng ta sẽ làm là sử dụng hướng dẫn dòng lệnh để thiết lập kho lưu trữ + +38 +00:03:13,830 --> 00:03:14,700 +của mình. + +39 +00:03:14,700 --> 00:03:22,260 +Vì vậy, chúng tôi sẽ đẩy một kho lưu trữ hiện có mà chúng tôi đã có cục bộ vào kho lưu trữ từ xa này. + +40 +00:03:22,260 --> 00:03:30,570 +Và để làm được điều đó, chúng tôi cần sao chép địa chỉ của kho lưu trữ GitHub và chúng tôi sẽ sử dụng hai + +41 +00:03:30,570 --> 00:03:37,830 +dòng mã này để chuyển hoặc đẩy kho lưu trữ cục bộ hiện có của chúng tôi từ dòng lệnh. + +42 +00:03:38,010 --> 00:03:38,460 +Được rồi. + +43 +00:03:38,460 --> 00:03:44,730 +Tôi hiện đang ở trong thư mục câu chuyện của mình, đây cũng là thư mục làm việc cho dự án cụ + +44 +00:03:44,730 --> 00:03:45,510 +thể này. + +45 +00:03:45,510 --> 00:03:53,880 +Và ở đây, tôi sẽ xem lại nhật ký Git để xem những cam kết trước đó chúng tôi đã có và bạn có thể thấy rằng chúng + +46 +00:03:53,880 --> 00:04:01,140 +tôi đã có hai cam kết trước đó và tôi muốn đẩy cả hai cam kết này lên GitHub để thực hiện điều + +47 +00:04:01,140 --> 00:04:01,800 +đó. + +48 +00:04:01,800 --> 00:04:04,980 +Điều đầu tiên là tạo một điều khiển từ xa. + +49 +00:04:04,980 --> 00:04:13,680 +Vì vậy, nó nói với kho lưu trữ git cục bộ của tôi rằng tôi đã tạo một kho lưu trữ từ xa ở đâu đó trên internet và + +50 +00:04:13,680 --> 00:04:18,120 +tôi muốn chuyển tất cả các cam kết của mình sang đó. + +51 +00:04:18,120 --> 00:04:23,340 +Vì vậy, lệnh mà chúng ta sẽ sử dụng là git remote, add origin. + +52 +00:04:23,370 --> 00:04:30,630 +Bây giờ Origin chỉ đơn giản là tên của điều khiển từ xa của bạn và về mặt lý thuyết, bạn có thể gọi nó là bất cứ thứ gì bạn muốn. + +53 +00:04:30,660 --> 00:04:38,010 +Bạn có thể gọi nó là thịt xông khói nếu muốn, nhưng theo quy ước và chúng tôi khuyên bạn chỉ nên giữ nguyên + +54 +00:04:38,010 --> 00:04:39,090 +tên gốc. + +55 +00:04:39,090 --> 00:04:45,960 +Và lý do là bởi vì hầu hết các lập trình viên đã quen với cách đặt tên thông thường, và điều đó có nghĩa là họ sẽ dễ dàng + +56 +00:04:45,990 --> 00:04:50,910 +hiểu được những gì đang diễn ra trong dự án của bạn khi họ xem qua nó, thay vì bạn làm + +57 +00:04:50,910 --> 00:04:55,170 +điều gì đó hoàn toàn khác, điều này sẽ sẽ rất ngạc nhiên và mọi người sẽ + +58 +00:04:55,170 --> 00:04:58,170 +khó hiểu chuyện gì đang xảy ra hơn rất nhiều. + +59 +00:04:58,260 --> 00:04:59,910 +Vì vậy, thêm git từ xa. + +60 +00:04:59,930 --> 00:05:00,530 +Nguồn gốc. + +61 +00:05:00,530 --> 00:05:08,180 +Sau đó, chúng tôi sẽ dán URL của kho lưu trữ từ xa của chúng tôi trên GitHub, sau đó chúng tôi sẽ tiếp tục + +62 +00:05:08,180 --> 00:05:09,560 +và nhấn enter. + +63 +00:05:10,310 --> 00:05:18,800 +Và bây giờ, điều khiển từ xa đó đã được tạo để chúng tôi có thể đẩy kho lưu trữ cục bộ của mình lên kho lưu trữ từ xa, được gọi + +64 +00:05:18,800 --> 00:05:20,030 +là nguồn gốc. + +65 +00:05:20,030 --> 00:05:26,240 +Vì vậy, chúng ta sẽ nói git push dash u origin main. + +66 +00:05:26,240 --> 00:05:34,040 +Và những gì dòng mã này thực hiện là nó đẩy kho lưu trữ cục bộ của bạn đến kho lưu trữ từ xa bằng cách sử dụng + +67 +00:05:34,040 --> 00:05:40,940 +cờ U hoặc tùy chọn U, về cơ bản liên kết giữa kho lưu trữ từ xa và kho lưu trữ cục bộ của bạn. + +68 +00:05:40,940 --> 00:05:44,510 +Và sau đó chúng ta sẽ đẩy nó về phía điều khiển. + +69 +00:05:44,510 --> 00:05:48,830 +Đó được gọi là nguồn gốc và chúng tôi sẽ đẩy nó vào nhánh được gọi là chính. + +70 +00:05:49,040 --> 00:05:55,280 +Nhánh chính chỉ đơn giản là nhánh mặc định hoặc nhánh chính của tất cả các cam kết của bạn. + +71 +00:05:55,280 --> 00:06:01,140 +Và sau này khi chúng ta đề cập đến phân nhánh, thì chúng ta sẽ nói nhiều hơn về thế nào là nhánh chính và thế nào + +72 +00:06:01,140 --> 00:06:01,860 +là nhánh. + +73 +00:06:01,860 --> 00:06:08,010 +Nhưng hiện tại, chúng tôi chỉ nói rằng chúng tôi sẽ đẩy kho lưu trữ cục bộ của mình lên điều khiển từ xa gốc này + +74 +00:06:08,010 --> 00:06:10,470 +và chúng tôi sẽ đẩy nó vào nhánh chính. + +75 +00:06:10,470 --> 00:06:17,220 +Vì vậy, hãy tiếp tục và nhấn enter và sẽ có một chút công việc đang được thực hiện ở chế độ nền vì + +76 +00:06:17,220 --> 00:06:24,150 +nó thực sự sẽ phải tải kho lưu trữ cục bộ của bạn lên kho lưu trữ từ xa trên máy chủ GitHub và tùy thuộc + +77 +00:06:24,150 --> 00:06:30,690 +vào kích thước của kho lưu trữ cục bộ của bạn, điều này có thể mất nhiều thời gian. + +78 +00:06:31,560 --> 00:06:38,250 +Bây giờ, khi chúng tôi thấy lời nhắc của mình, do đó, con trỏ nhấp nháy hoặc ký hiệu đô la, điều đó có nghĩa là quá trình đẩy của chúng + +79 +00:06:38,250 --> 00:06:39,240 +tôi đã thành công. + +80 +00:06:39,240 --> 00:06:45,150 +Và như bạn có thể thấy, nó cho biết Branch Main được thiết lập để theo dõi nhánh chính của Remote Branch + +81 +00:06:45,150 --> 00:06:51,360 +từ Origin, điều này nghe có vẻ thực sự khó hiểu, nhưng nếu bạn quay lại GitHub và nếu bạn đang ở trên cùng một + +82 +00:06:51,360 --> 00:06:58,980 +trang, tất cả những gì bạn phải làm là nhấn lệnh R để làm mới hoặc chỉ cần nhấn nút làm mới và bạn có thể thấy rằng tất cả các tệp của + +83 +00:06:58,980 --> 00:07:05,640 +chúng tôi hiện được lưu trữ trên GitHub và nó hoàn chỉnh với tất cả các thông báo cam kết của chúng tôi. + +84 +00:07:05,640 --> 00:07:13,260 +Vì vậy, nếu bạn đi sâu vào thông tin chi tiết và vào mạng, bạn thực sự có thể thấy nhánh chính của chúng tôi, hiện + +85 +00:07:13,260 --> 00:07:16,290 +chỉ có hai điểm lưu hoặc hai lần xác nhận. + +86 +00:07:16,290 --> 00:07:21,750 +Và nếu bạn di chuột qua chúng, bạn thực sự có thể thấy các thông báo cam kết của từng trong số + +87 +00:07:21,750 --> 00:07:28,800 +này khi bạn xây dựng dự án của mình, khi bạn thêm nhiều cam kết cục bộ hoặc đẩy nó từ xa hoặc có thể thực hiện cả hai, thì + +88 +00:07:28,800 --> 00:07:33,960 +bạn có thể thấy tiến trình của các tệp của mình trong kho lưu trữ GitHub của bạn. + +89 +00:07:33,960 --> 00:07:37,290 +Vì vậy, bây giờ bạn có thể thấy tất cả các mã. + +90 +00:07:37,290 --> 00:07:44,790 +Nếu đó là tệp mã hoặc trong trường hợp của chúng tôi thì đó chỉ là một tệp văn bản được lưu trữ trên GitHub và bạn có thể chỉ cho bất kỳ ai về điều + +91 +00:07:44,790 --> 00:07:45,240 +này. + +92 +00:07:45,240 --> 00:07:52,020 +Và thực tế có những trường hợp mọi người viết rất nhiều câu chuyện bằng GitHub chỉ vì nó rất tốt trong việc + +93 +00:07:52,020 --> 00:07:57,840 +theo dõi các điểm lưu của bạn và có thể hoàn nguyên về các phiên bản trước đó trong quá khứ. + +94 +00:07:57,840 --> 00:08:05,970 +Vì vậy, ví dụ: nếu bạn quay lại trang chính và đi đến các cam kết của mình, bạn có thể thấy cả hai cam kết + +95 +00:08:05,970 --> 00:08:08,370 +đó khi chúng được cam kết. + +96 +00:08:08,370 --> 00:08:13,620 +Và nếu bạn nhấp vào nó, bạn có thể thấy những thay đổi đã được thực hiện tại các thời điểm đó. + +97 +00:08:13,620 --> 00:08:19,920 +Vì vậy, nếu chúng ta xem qua chương một, bạn có thể thấy đây là tất cả những gì chúng ta có vào thời điểm chúng ta thực hiện cam kết + +98 +00:08:19,920 --> 00:08:20,610 +đầu tiên. + +99 +00:08:21,000 --> 00:08:26,850 +Trước đây chúng tôi đã nói rằng chúng tôi có một thư mục làm việc, đó là thư mục mà chúng tôi đã khởi tạo git. + +100 +00:08:26,880 --> 00:08:32,940 +Sau đó, chúng tôi có thể đẩy các tệp của mình đến khu vực tổ chức nơi chúng tôi có thể chọn và chọn tệp nào chúng tôi muốn cam kết. + +101 +00:08:32,970 --> 00:08:40,620 +Sau đó, khi chúng tôi đã sẵn sàng, thì chúng tôi có thể cam kết các tệp hoặc điểm lưu của chúng tôi vào kho lưu trữ cục bộ của chúng tôi. + +102 +00:08:40,620 --> 00:08:48,540 +Vì vậy, khi bạn đã thực hiện một vài lần xác nhận, thì bạn thực sự có dòng thời gian gồm nhiều lần xác nhận khác nhau và đây được + +103 +00:08:48,540 --> 00:08:50,400 +gọi là nhánh chính của bạn. + +104 +00:08:50,400 --> 00:08:58,560 +Vì vậy, nhánh chính là nhánh chính của điểm cam kết hoặc lưu và nó diễn ra tuần tự và đây thường + +105 +00:08:58,560 --> 00:09:04,470 +là nơi tiến trình chính của bạn được lưu hoặc cam kết sau này. + +106 +00:09:04,470 --> 00:09:09,510 +Sau đó, chúng tôi đã giới thiệu ý tưởng về kho lưu trữ từ xa này. + +107 +00:09:09,510 --> 00:09:15,510 +Điều quan trọng cần lưu ý là bạn có thể có một kho lưu trữ cục bộ hoàn toàn song song với một kho lưu + +108 +00:09:15,510 --> 00:09:16,260 +trữ từ xa. + +109 +00:09:16,290 --> 00:09:22,110 +Kiểm tra sự khác biệt giữa chúng, nhưng bạn cũng có thể đồng bộ hóa chúng hoặc đẩy mọi thứ từ kho lưu trữ cục + +110 +00:09:22,110 --> 00:09:23,640 +bộ sang kho lưu trữ từ xa. + +111 +00:09:23,640 --> 00:09:30,450 +Vì vậy, trong trường hợp của chúng tôi, kho lưu trữ cục bộ là tệp git mà chúng tôi có trong thư mục câu chuyện của mình. + +112 +00:09:30,450 --> 00:09:38,040 +Và kho lưu trữ từ xa là GitHub, lưu trữ mã của chúng tôi và cũng lưu trữ tất cả các thay đổi được thực hiện giữa + +113 +00:09:38,040 --> 00:09:40,140 +các lần xác nhận khác nhau. + +114 +00:09:40,140 --> 00:09:46,560 +Vì vậy, chúng tôi có nhánh chính này gồm nhiều lần xác nhận khác nhau, lần xác nhận đầu tiên, lần xác nhận thứ + +115 +00:09:46,560 --> 00:09:54,690 +hai, lần xác nhận thứ ba trong kho lưu trữ git cục bộ của chúng tôi và khi chúng tôi thực hiện lệnh git push, thì điều đó đã đẩy tất cả các lần + +116 +00:09:54,690 --> 00:09:59,850 +xác nhận đó một cách hiệu quả, tất cả các phiên bản, thay đổi và mã khác nhau đó. + +117 +00:10:00,100 --> 00:10:03,780 +Các mảnh vào kho lưu trữ từ xa của chúng tôi trên GitHub. + +118 +00:10:03,790 --> 00:10:05,620 +Vì vậy, đó là những gì git đẩy làm. + +119 +00:10:05,650 --> 00:10:11,140 +Bây giờ trong bài học tiếp theo, tôi muốn nói về việc sử dụng git ignore và cách bạn có thể tránh + +120 +00:10:11,140 --> 00:10:18,460 +tải lên các phần thông tin nhạy cảm như khóa API hoặc mật khẩu vào kho lưu trữ từ xa của mình, chẳng hạn như GitHub. + +121 +00:10:18,460 --> 00:10:20,950 +Vì vậy, tất cả điều đó và nhiều hơn nữa trong bài học tiếp theo. + +122 +00:10:20,980 --> 00:10:21,790 +Hẹn gặp bạn ở đó. + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Gitignore.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Gitignore.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..380e36e7f0df94cba51de298d26215454e4110ad --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Gitignore.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1add66438fa945d4f905931acc52a2201de30b0b6fced7c5fc95ac5eb17f9c6 +size 137466260 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Gitignore_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Gitignore_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..f4b647b0318800f4c22838b542cbb0c23450469e --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Gitignore_vi.srt @@ -0,0 +1,536 @@ +1 +00:00:00,800 --> 00:00:05,900 +Được rồi, các bạn, trong bài học này, chúng ta sẽ nói về bỏ qua git và cách bạn + +2 +00:00:05,900 --> 00:00:12,470 +có thể đặt quy tắc để ngăn việc chuyển một số tệp nhất định vào kho git cục bộ và từ xa của bạn. + +3 +00:00:12,470 --> 00:00:15,680 +Vì vậy, điều đầu tiên trước tiên, hãy mở thiết bị đầu cuối. + +4 +00:00:15,680 --> 00:00:21,290 +Và những gì chúng ta sẽ làm là đưa đĩa CD vào máy tính để bàn của mình và chúng ta sẽ tạo một thư mục mới + +5 +00:00:21,290 --> 00:00:22,880 +ở đây có tên là Project. + +6 +00:00:22,880 --> 00:00:30,710 +Chỉ cần nói rằng chúng tôi có dự án hoàn toàn mới này và bây giờ nếu chúng tôi đi vào dự án của + +7 +00:00:30,710 --> 00:00:36,380 +mình và chúng tôi tạo một loạt tệp để mô phỏng dự án ví dụ này. + +8 +00:00:36,650 --> 00:00:44,150 +Vì vậy, giả sử chúng ta có một thứ gọi là tệp văn bản một dấu chấm và chúng ta có một + +9 +00:00:44,150 --> 00:00:51,800 +loạt các tệp khác, tệp hai, tệp ba và chúng tôi cũng có một thứ gọi là Tệp bí mật. + +10 +00:00:52,370 --> 00:00:54,260 +Vì vậy, bây giờ chúng tôi đã có bốn tệp. + +11 +00:00:54,260 --> 00:01:02,100 +Và chỉ để minh họa các trường hợp sử dụng khi chúng ta có thể muốn có một tệp bỏ qua git, Vì vậy, giả sử + +12 +00:01:02,100 --> 00:01:10,410 +nếu bạn có tệp này chứa một số, bạn biết đấy, mật khẩu bí mật hoặc khóa API, về cơ bản là những thứ mà bạn không + +13 +00:01:10,410 --> 00:01:17,730 +muốn cam kết , đặc biệt là bạn không muốn nó được lưu trữ trên một nền tảng mở như GitHub. + +14 +00:01:17,760 --> 00:01:25,950 +Đã có những câu chuyện kinh hoàng về những người có khóa bí mật Amazon AWS trong các dự án của họ và khóa đó được đẩy + +15 +00:01:25,950 --> 00:01:34,380 +đến điều khiển từ xa của họ trên GitHub và chỉ trong vài giây, toàn bộ tài khoản AWS của họ về cơ bản đã được sử dụng hết + +16 +00:01:34,380 --> 00:01:35,970 +và bị xóa sạch. + +17 +00:01:35,970 --> 00:01:43,020 +Vì vậy, điều thực sự rất quan trọng là phải suy nghĩ về một số điều này và nhận thức được những + +18 +00:01:43,020 --> 00:01:46,380 +gì bạn đang đưa lên nền tảng công cộng này. + +19 +00:01:46,590 --> 00:01:52,860 +Một loại tệp khác mà bạn có thể muốn thêm vào bỏ qua git hoặc bạn có thể không muốn tải lên + +20 +00:01:52,890 --> 00:01:58,650 +GitHub là các tệp liên quan đến cài đặt cục bộ hoặc tùy chọn người dùng của bạn. + +21 +00:01:58,650 --> 00:02:05,010 +Và có rất nhiều loại tệp tiện ích này mà bạn thực sự không muốn người khác phải tải + +22 +00:02:05,010 --> 00:02:11,940 +xuống và sao chép vào thư mục dự án của họ nếu họ đang nhân bản hoặc nếu họ đang giả mạo dự án + +23 +00:02:11,940 --> 00:02:12,810 +của bạn. + +24 +00:02:12,810 --> 00:02:19,680 +Vì vậy, một ví dụ thực sự phổ biến mà mọi người có xu hướng thêm vào các tệp bỏ qua git của họ là những gì được gọi là tệp + +25 +00:02:19,680 --> 00:02:20,310 +dsstore. + +26 +00:02:20,350 --> 00:02:26,790 +Các tệp Dsstore về cơ bản là một tệp cài đặt lưu một số thứ nhất định như bạn biết bạn muốn các biểu tượng của mình + +27 +00:02:26,790 --> 00:02:29,970 +được sắp xếp như thế nào trong một thư mục dự án cụ thể. + +28 +00:02:29,970 --> 00:02:36,450 +Vì vậy, giả sử nếu chúng ta vào đây và chúng ta chỉ xem sắp xếp theo, sắp xếp theo không và sau đó tôi sẽ di + +29 +00:02:36,450 --> 00:02:42,240 +chuyển các tệp của mình và giả sử rằng đây chỉ là sở thích của tôi về cách tôi muốn các tệp của mình + +30 +00:02:42,240 --> 00:02:45,150 +được hiển thị bên trong thư mục dự án này. + +31 +00:02:45,150 --> 00:02:51,630 +Bây giờ, tệp Dsstore là một tệp ẩn, vì vậy bạn sẽ không thể nhìn thấy nó trong công cụ tìm của mình. + +32 +00:02:51,630 --> 00:02:59,940 +Nhưng tất nhiên, chúng tôi với tư cách là chuyên gia dòng lệnh biết rằng chúng tôi có thể chỉ cần thực hiện dấu gạch ngang A để xem tất cả + +33 +00:02:59,940 --> 00:03:02,910 +các tệp ẩn bên trong thư mục dự án của chúng tôi. + +34 +00:03:02,910 --> 00:03:05,310 +Và bạn có thể thấy nó ở đó, dsstore. + +35 +00:03:05,310 --> 00:03:09,060 +Vì vậy, đó không phải là thứ sẽ có ích cho bất kỳ ai khác. + +36 +00:03:09,060 --> 00:03:15,960 +Và chúng tôi không muốn phải làm lộn xộn kho lưu trữ từ xa GitHub của chúng tôi hoặc máy tính của bất kỳ ai khác với tệp + +37 +00:03:15,960 --> 00:03:16,410 +đó. + +38 +00:03:16,410 --> 00:03:19,140 +Vì vậy, chúng tôi cũng sẽ thêm điều đó vào git bỏ qua của chúng tôi. + +39 +00:03:19,470 --> 00:03:25,020 +Bắt đầu với việc tạo và sử dụng một tệp bỏ qua git, điều đầu tiên bạn phải + +40 +00:03:25,020 --> 00:03:26,790 +làm là làm cho nó đúng. + +41 +00:03:27,180 --> 00:03:31,830 +Và để làm điều đó, chúng ta sẽ tạo một tệp ẩn. + +42 +00:03:31,830 --> 00:03:36,900 +Vì vậy, sử dụng dấu chấm phía trước tên tệp và nó sẽ được gọi là Git bỏ qua. + +43 +00:03:36,930 --> 00:03:43,500 +Bây giờ trường hợp và từ ngữ là một vấn đề lớn bởi vì chúng tôi đang sử dụng git và nó đang tìm kiếm tệp cụ thể + +44 +00:03:43,500 --> 00:03:43,950 +này. + +45 +00:03:43,950 --> 00:03:47,820 +Vì vậy, hãy chắc chắn rằng khi bạn đang sử dụng nó, nó trông giống hệt như thế này. + +46 +00:03:47,940 --> 00:03:49,350 +Hãy tạo tập tin đó. + +47 +00:03:49,350 --> 00:03:55,710 +Và tất nhiên, nó không hiện ra vì nó là file ẩn, nhưng ta có thể thấy nó bằng a và cũng có thể mở + +48 +00:03:55,710 --> 00:03:58,170 +nó bên trong vs code như thế này. + +49 +00:03:58,960 --> 00:04:04,360 +Đây là nơi chúng tôi thêm các tệp sẽ bị bỏ qua khi chúng tôi cam kết dự án của mình với git. + +50 +00:04:04,450 --> 00:04:09,480 +Trước tiên, hãy để tôi cho bạn thấy điều gì sẽ xảy ra khi chúng ta không có bất kỳ thứ gì bên trong lệnh bỏ qua git của mình. + +51 +00:04:09,490 --> 00:04:14,670 +Và tôi sẽ thực hiện quy trình bình thường để thiết lập git và cam kết nó trước. + +52 +00:04:14,680 --> 00:04:22,600 +Nếu bạn nhớ cách sử dụng git init để khởi tạo kho lưu trữ git trống bên trong thư mục dự án của tôi. + +53 +00:04:22,600 --> 00:04:29,710 +Và sau đó tôi sẽ sử dụng git add dot để thêm tất cả các tệp hiện có trong thư mục này vào + +54 +00:04:29,710 --> 00:04:31,660 +khu vực tổ chức git. + +55 +00:04:31,660 --> 00:04:39,580 +Vì vậy, hãy nhấn enter và chúng ta có thể xem những gì đã được thêm vào bằng cách sử dụng trạng thái git và bạn có thể + +56 +00:04:39,580 --> 00:04:47,110 +thấy rằng tất cả các tệp này được thêm vào khu vực tổ chức và chúng sẽ được cam kết nếu tôi tiếp tục và thực hiện + +57 +00:04:47,140 --> 00:04:48,280 +cam kết git. + +58 +00:04:48,280 --> 00:04:54,730 +Vì vậy, đó không phải là những gì chúng tôi muốn và thay vào đó tôi không muốn cam kết cửa hàng và tôi cũng không muốn cam kết + +59 +00:04:54,730 --> 00:04:55,600 +bí mật của mình. + +60 +00:04:55,600 --> 00:04:56,980 +Tệp văn bản chấm. + +61 +00:04:57,130 --> 00:04:58,150 +Điều đầu tiên đầu tiên. + +62 +00:04:58,150 --> 00:05:01,070 +Về cơ bản, tôi sẽ hoàn tác những gì tôi vừa làm. + +63 +00:05:01,070 --> 00:05:08,660 +Vì vậy, tôi sẽ xóa tất cả các tệp này khỏi khu vực tổ chức của mình và sau đó tôi sẽ thêm chúng sau + +64 +00:05:08,660 --> 00:05:11,810 +khi tôi đã thiết lập xong git ignore. + +65 +00:05:11,930 --> 00:05:14,510 +Về cơ bản, chúng tôi chỉ đang hoàn tác bước cuối cùng. + +66 +00:05:14,540 --> 00:05:23,030 +Để làm điều đó, tôi sẽ viết git remove dash dash cached và tôi sẽ sử dụng cờ R để đệ quy và tôi sẽ sử dụng dấu chấm + +67 +00:05:23,030 --> 00:05:28,220 +để nói rằng mọi thứ bên trong thư mục hiện tại sẽ được xóa khỏi dàn + +68 +00:05:28,220 --> 00:05:29,210 +khu vực. + +69 +00:05:29,210 --> 00:05:35,870 +Vì vậy, bây giờ nếu tôi nhấn enter, bạn có thể thấy rằng tất cả những thứ này đã bị xóa khỏi khu vực tổ chức git. + +70 +00:05:35,870 --> 00:05:42,260 +Và nếu tôi thực hiện lại trạng thái git, bạn có thể thấy rằng tất cả các tệp này không còn được theo dõi để được cam kết nữa. + +71 +00:05:42,260 --> 00:05:47,450 +Vì vậy, bây giờ đây là điểm mà chúng ta sẽ sử dụng tệp bỏ qua git đó và chúng ta + +72 +00:05:47,450 --> 00:05:52,220 +sẽ thêm tên tệp mà chúng ta muốn bỏ qua khi thêm và cam kết với Git. + +73 +00:05:52,340 --> 00:05:59,180 +Để thêm các tệp riêng lẻ, bạn chỉ cần chỉ định tên tệp trên mỗi và mọi dòng mới. + +74 +00:05:59,180 --> 00:06:04,160 +Vì vậy, ví dụ, nếu chúng ta muốn bỏ qua cửa hàng, chúng ta chỉ cần viết cửa hàng DZ. + +75 +00:06:04,160 --> 00:06:09,080 +Vì vậy, chính xác cùng một cách viết hoa trên và dưới như tên của tệp. + +76 +00:06:09,080 --> 00:06:17,780 +Và nếu chúng ta muốn bỏ qua tệp văn bản dấu chấm bí mật, thì tất cả những gì chúng ta phải làm chỉ là chỉ định + +77 +00:06:17,780 --> 00:06:19,970 +nó ở đây trên một dòng mới. + +78 +00:06:19,970 --> 00:06:22,970 +Bây giờ với git bỏ qua nó có các quy tắc nhất định. + +79 +00:06:22,970 --> 00:06:27,860 +Vì vậy, ví dụ bạn có thể sử dụng dấu thăng để bình luận. + +80 +00:06:28,070 --> 00:06:34,190 +Vì vậy, ví dụ, bạn có thể nói, bạn biết đấy, tệp nhật ký, quyền được bỏ qua. + +81 +00:06:34,280 --> 00:06:37,160 +Một điều khác bạn có thể làm là sử dụng ký tự đại diện. + +82 +00:06:37,160 --> 00:06:43,220 +Vì vậy, nếu bạn sử dụng dấu hoa thị và bạn nói dấu hoa thị, dấu chấm văn bản, điều đó có nghĩa là khi + +83 +00:06:43,220 --> 00:06:48,290 +bạn thực hiện dự án của mình, tất cả các tệp có phần mở rộng văn bản sẽ bị bỏ qua. + +84 +00:06:48,830 --> 00:06:49,280 +Được rồi. + +85 +00:06:49,280 --> 00:06:55,940 +Vì vậy, tôi sẽ loại bỏ điều đó bởi vì tôi muốn chuyển giao tệp một, tệp hai và tệp ba cho + +86 +00:06:55,970 --> 00:07:01,820 +git, nhưng tôi muốn nó bỏ qua cửa hàng và các tệp văn bản dấu chấm bí mật. + +87 +00:07:02,750 --> 00:07:06,830 +Bây giờ chúng tôi đã sẵn sàng để thêm các tệp của mình vào khu vực tổ chức của chúng tôi. + +88 +00:07:06,830 --> 00:07:14,960 +Vì vậy, hãy sử dụng lại git add dot và sử dụng git status để xem những gì đã được thêm vào để bạn có thể thấy rằng các tệp duy nhất + +89 +00:07:14,990 --> 00:07:16,580 +được thêm vào là git. + +90 +00:07:16,580 --> 00:07:24,710 +Bỏ qua tệp 1 đến 3, nhưng cửa hàng cũng như văn bản dấu chấm bí mật bị bỏ qua theo thông số kỹ thuật trong tệp gitignore + +91 +00:07:24,710 --> 00:07:26,540 +của chúng tôi. + +92 +00:07:26,840 --> 00:07:36,830 +Bây giờ nếu tôi tiếp tục và cam kết đây là cam kết ban đầu của mình, thì các tệp duy nhất sẽ được đưa vào cam + +93 +00:07:36,830 --> 00:07:40,400 +kết cục bộ của tôi sẽ là bốn tệp này. + +94 +00:07:40,400 --> 00:07:46,370 +Và tương tự, nếu tôi đẩy tệp này lên GitHub, thì nó cũng sẽ chỉ có bốn tệp này. + +95 +00:07:47,420 --> 00:07:51,410 +Và bây giờ hãy mở một dự án bình mới. + +96 +00:07:51,410 --> 00:07:56,750 +Và để tôi chỉ cho bạn cách thêm tệp bỏ qua git cho các dự án python của bạn. + +97 +00:07:56,750 --> 00:08:02,750 +Vì vậy, hãy gọi thử nghiệm này và tôi sẽ đặt nó bên trong máy tính để bàn của mình. + +98 +00:08:03,260 --> 00:08:07,220 +Vì vậy, sau khi tôi mở dự án, tôi sẽ tạo một môi trường ảo mới. + +99 +00:08:10,770 --> 00:08:15,210 +Và tôi sẽ cài đặt tất cả các mô-đun từ Yêu cầu. tập tin txt. + +100 +00:08:16,330 --> 00:08:21,550 +Sau đó, tôi sẽ mở terminal và tạo một tệp gitignore. + +101 +00:08:22,420 --> 00:08:24,970 +Sau đó, chúng tôi sẽ mở gitignore của chúng tôi. + +102 +00:08:25,510 --> 00:08:32,799 +Và ở đây tôi sẽ thêm một số tệp sẽ bị bỏ qua cho dự án Python của chúng ta. + +103 +00:08:32,830 --> 00:08:39,590 +Nếu bạn truy cập GitHub. com chém GitHub, vì vậy đây là kho lưu trữ thuộc sở hữu của nhóm GitHub. + +104 +00:08:39,610 --> 00:08:47,140 +Họ có một kho lưu trữ có tên là Git Ignore và về cơ bản, nó là một bộ sưu tập các mẫu bỏ qua git hữu ích được + +105 +00:08:47,140 --> 00:08:47,860 +tạo sẵn. + +106 +00:08:47,860 --> 00:08:54,550 +Và nếu bạn tìm kiếm ở đây, bạn có thể thấy rằng bạn đã có Python và bạn có thể thấy rằng đây + +107 +00:08:54,550 --> 00:09:02,350 +là mẫu dựng sẵn cho một số tệp mà bạn có thể sẽ không muốn tải lên GitHub hoặc bất kỳ điều khiển từ xa nào + +108 +00:09:02,350 --> 00:09:03,630 +khác kho. + +109 +00:09:03,640 --> 00:09:10,480 +Vì vậy, những tệp này có phần mở rộng tệp cho những thứ là môi trường ảo hoặc cài đặt môi trường và + +110 +00:09:10,480 --> 00:09:13,450 +về cơ bản, tất cả đều được tạo sẵn cho bạn. + +111 +00:09:13,450 --> 00:09:23,390 +Vì vậy, bạn có thể chỉ cần sao chép tất cả những thứ này và đặt nó vào tệp bỏ qua git mà bạn đã tạo trước đó. + +112 +00:09:23,390 --> 00:09:25,430 +Vì vậy, chỉ cần thẳng lên dán. + +113 +00:09:25,430 --> 00:09:30,470 +Và nếu bạn còn nhớ từ trước đó, chúng tôi đã nói rằng những dòng bắt đầu bằng dấu thăng + +114 +00:09:30,470 --> 00:09:34,310 +là nhận xét và những dòng này là phần mở rộng mà bạn sẽ bỏ qua. + +115 +00:09:34,310 --> 00:09:38,120 +Và bạn cũng có thể muốn thêm những thứ như Dsstore vào đây. + +116 +00:09:38,120 --> 00:09:41,300 +Vì vậy, bạn có thể có một cái gì đó giống như dự án rộng. + +117 +00:09:41,300 --> 00:09:49,070 +Vì vậy, ví dụ: Dsstore mà chúng tôi đã đề cập trước đó và nếu bạn nhấn lưu ngay bây giờ, nếu chúng tôi đi vào + +118 +00:09:49,070 --> 00:10:00,320 +thiết bị đầu cuối và chúng tôi đang ở trong thư mục thử nghiệm của mình, vì vậy chúng tôi sẽ thực hiện git init git add git status để xem điều gì sẽ xảy ra + +119 +00:10:00,320 --> 00:10:01,700 +được cam kết. + +120 +00:10:02,700 --> 00:10:08,790 +Và sau đó chúng ta sẽ nói git commit, M lần xác nhận ban đầu. + +121 +00:10:09,840 --> 00:10:10,830 +Chúng ta đi thôi. + +122 +00:10:11,310 --> 00:10:18,030 +Và bây giờ, khi bạn đã sẵn sàng cam kết và thêm tất cả những thứ này vào điều khiển từ xa của mình, thì nó sẽ bỏ + +123 +00:10:18,030 --> 00:10:25,110 +qua tất cả các tệp liên quan đến người dùng phổ biến này sẽ không hữu ích cho cộng tác viên của bạn hoặc bất kỳ ai muốn + +124 +00:10:25,110 --> 00:10:26,910 +đóng góp trên GitHub. + +125 +00:10:27,150 --> 00:10:33,420 +Đó chỉ là một mẩu tin ngắn gọn về việc sử dụng tính năng bỏ qua Git, và tôi biết rằng một số bạn đã hỏi về việc, bạn + +126 +00:10:33,420 --> 00:10:38,910 +biết đấy, bạn nên đặt các khóa API của mình ở đâu, bạn nên đặt dữ liệu nhạy cảm của mình ở đâu? + +127 +00:10:38,910 --> 00:10:45,240 +Và bạn phải đảm bảo rằng khi bạn tải lên các dự án của mình bằng các khóa và mật khẩu bí mật này để đảm + +128 +00:10:45,240 --> 00:10:49,920 +bảo rằng bạn đã thiết lập một tệp bỏ qua git và đưa những thứ đó vào đó. + +129 +00:10:50,850 --> 00:10:51,300 +Được rồi. + +130 +00:10:51,300 --> 00:10:53,670 +Vì vậy, đó là tất cả cho bài học này. + +131 +00:10:53,670 --> 00:11:00,450 +Trong bài học tiếp theo, tôi muốn nói về bản sao Git và cách sao chép các kho lưu trữ khác nhau vào hệ thống cục + +132 +00:11:00,450 --> 00:11:01,230 +bộ của bạn. + +133 +00:11:01,230 --> 00:11:04,210 +Vì vậy, tất cả điều đó và nhiều hơn nữa trong bài học tiếp theo. + +134 +00:11:04,210 --> 00:11:05,260 +Vì vậy, tôi sẽ gặp bạn ở đó. + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Test.zip b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Test.zip new file mode 100644 index 0000000000000000000000000000000000000000..4863f8724d3f12dfe0553f26ca86ecc10e6f69d8 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Test.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:045439e75d7508c50d954b71de8071d9f763a3c4e129805fb4e112641d390225 +size 627 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Useful.gitignore-templates.url b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Useful.gitignore-templates.url new file mode 100644 index 0000000000000000000000000000000000000000..3f1a6e65a3ead61b0188ae2ec8abaf6860a8a43d --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/006 Useful.gitignore-templates.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/github/gitignore \ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Beginner-friendly-repos.url b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Beginner-friendly-repos.url new file mode 100644 index 0000000000000000000000000000000000000000..c54d1f0a0bc47c2166243fa8acea21bf62422e3c --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Beginner-friendly-repos.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/MunGell/awesome-for-beginners \ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Cloning.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Cloning.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2e55ea9933d8aee560eeea5ec59032897935a7e8 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Cloning.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eb42f094abb46072363128ac1e5a1b118f7201d61d602d633c5b846a5157404 +size 137794399 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Cloning_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Cloning_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..438276fe65c590d048bb2fa683e961a310a71974 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Cloning_vi.srt @@ -0,0 +1,436 @@ +1 +00:00:00,290 --> 00:00:07,490 +Trong bài học trước, chúng ta đã xem xét cách đẩy kho lưu trữ cục bộ của mình sang kho lưu trữ từ xa trên GitHub. + +2 +00:00:07,520 --> 00:00:15,800 +Bây giờ, trong bài học này, tôi muốn nói về việc sao chép một kho lưu trữ từ xa trên GitHub để kéo nó vào kho + +3 +00:00:15,800 --> 00:00:18,390 +lưu trữ cục bộ trên máy của bạn. + +4 +00:00:18,410 --> 00:00:23,570 +Vì vậy, điều này được gọi là nhân bản và lệnh là git clone. + +5 +00:00:23,600 --> 00:00:30,140 +Và đây là cách để bạn kéo xuống tất cả các phiên bản và tất cả các cam kết của một kho lưu trữ + +6 +00:00:30,140 --> 00:00:35,420 +từ xa cụ thể và lưu trữ các tệp trong thư mục làm việc của riêng bạn. + +7 +00:00:35,570 --> 00:00:41,870 +Vì vậy, một khi bạn đã nhân bản một repo, về cơ bản, bạn đã tạo một bản sao của nó trên môi trường làm việc cục bộ của + +8 +00:00:41,870 --> 00:00:47,130 +chính mình và cho phép bạn đứng trên vai những người khổng lồ và tiếp tục nơi họ đã dừng lại. + +9 +00:00:47,150 --> 00:00:50,480 +Vì vậy, bạn sẽ không cần phải sao chép lại nó trong quá trình phát triển thông thường. + +10 +00:00:50,480 --> 00:00:53,990 +Bạn sẽ tiếp tục trên nhánh riêng của dự án đó. + +11 +00:00:54,140 --> 00:00:57,560 +Vậy tại sao bạn cần sao chép dự án của người khác? + +12 +00:00:57,590 --> 00:01:02,310 +Chà, về cơ bản, đó là để bạn có thể có bản sao chương trình mà họ đã viết cho riêng mình. + +13 +00:01:02,340 --> 00:01:05,390 +Có thể bạn muốn tùy chỉnh nó theo nhu cầu của riêng bạn. + +14 +00:01:05,400 --> 00:01:11,430 +Có thể chương trình cần làm điều gì đó mà nó hiện không làm được và bạn muốn mở rộng chức năng của nó. + +15 +00:01:11,430 --> 00:01:14,280 +Hoặc có thể bạn vừa tìm thấy một lỗi và bạn muốn sửa nó. + +16 +00:01:14,460 --> 00:01:19,500 +Vì vậy, về cơ bản, nó cho phép bạn tận dụng mã nguồn mở của người khác. + +17 +00:01:19,500 --> 00:01:25,710 +Vì vậy, họ đang đưa mã nguồn của họ lên internet và bạn chỉ cần tạo một bản sao của nó và tiếp tục + +18 +00:01:25,710 --> 00:01:27,190 +từ nơi họ đã dừng lại. + +19 +00:01:27,210 --> 00:01:32,070 +Ví dụ: rất nhiều người sử dụng các ứng dụng tự lưu trữ cho doanh nghiệp của họ. + +20 +00:01:32,100 --> 00:01:37,680 +Đây là những phiên bản miễn phí của các sản phẩm và dịch vụ mà thông thường bạn có thể phải trả + +21 +00:01:37,680 --> 00:01:45,740 +phí, chẳng hạn như các công cụ quản lý dự án và năng suất thay thế cho Zhura hoặc Trello hoặc các máy chủ email như MailChimp. + +22 +00:01:45,750 --> 00:01:48,150 +Thay vì phải trả cho MailChimp rất nhiều tiền. + +23 +00:01:48,180 --> 00:01:54,510 +Bạn có thể lưu trữ dịch vụ email hoặc phần mềm theo dõi thời gian của riêng mình cho các dịch giả tự + +24 +00:01:54,540 --> 00:02:02,220 +do và có rất nhiều tùy chọn khác nhau theo đúng nghĩa đen và bạn có thể xem qua tùy chọn đó trong GitHub Readme này. + +25 +00:02:02,250 --> 00:02:04,200 +Hãy xem nó hoạt động như thế nào trong thực tế. + +26 +00:02:04,200 --> 00:02:09,990 +Hãy sao chép một số repo thực tế từ GitHub và chạy chúng cục bộ để xem toàn bộ quy trình hoạt động như thế nào. + +27 +00:02:10,199 --> 00:02:11,700 +Lệnh khá đơn giản. + +28 +00:02:11,700 --> 00:02:15,330 +Nó chỉ đơn giản là không gian git, không gian sao chép. + +29 +00:02:15,330 --> 00:02:22,490 +URL, URL thường sẽ đến từ GitHub và nó sẽ trông giống như thế này. + +30 +00:02:22,500 --> 00:02:23,970 +Vì vậy, những gì chúng ta sẽ nhân bản? + +31 +00:02:23,970 --> 00:02:29,990 +Chà, bạn có biết rằng bạn có thể chạy trò chơi video gốc trong trình duyệt web của mình không? + +32 +00:02:30,000 --> 00:02:35,160 +Nó hoàn toàn được xây dựng bằng JavaScript, vì vậy sẽ có những phần của nó mà bạn có + +33 +00:02:35,160 --> 00:02:36,780 +thể đọc qua và hiểu được. + +34 +00:02:36,780 --> 00:02:40,590 +Nhưng sẽ có rất nhiều công việc được thực hiện để tạo ra trò chơi này. + +35 +00:02:40,590 --> 00:02:43,440 +Rất may là chúng tôi không phải xây dựng nó từ đầu. + +36 +00:02:43,440 --> 00:02:46,680 +Tất cả những gì chúng ta phải làm chỉ là để có được bản sao. + +37 +00:02:47,400 --> 00:02:55,740 +Tôi tiếp tục, tôi lấy URL để sao chép kho lưu trữ và trong thiết bị đầu cuối của mình, tôi có thể viết git, sao chép và + +38 +00:02:55,740 --> 00:02:56,910 +dán vào URL đó. + +39 +00:02:57,810 --> 00:03:04,410 +Bây giờ, khi nó nhận được tất cả các đối tượng và nó được tải vào máy tính của riêng tôi, thì tôi có thể + +40 +00:03:04,410 --> 00:03:07,560 +tiếp tục và đưa đĩa CD vào kho lưu trữ quake. + +41 +00:03:07,560 --> 00:03:11,250 +JS Và một khi tôi ở trong kho lưu trữ đó. + +42 +00:03:12,060 --> 00:03:19,470 +Tôi có thể cài đặt tất cả các gói NPM bằng cách chạy cài đặt NPM và sau đó bước tiếp theo như chúng mô tả trong + +43 +00:03:19,470 --> 00:03:26,610 +tài liệu là tôi cần đặt js quaked nội dung. com làm máy chủ nội dung. + +44 +00:03:26,610 --> 00:03:31,350 +Vì vậy, tôi sẽ chỉ cần sao chép toàn bộ dòng lệnh này và dán nó vào thiết bị đầu cuối của mình. + +45 +00:03:31,440 --> 00:03:37,950 +Bây giờ khi tôi đã hoàn tất, tôi có thể chỉ cần chạy máy chủ bằng cách sử dụng Node bằng cách dán lại dòng lệnh này. + +46 +00:03:37,950 --> 00:03:45,150 +Và khi nó bắt đầu, bạn có thể thấy rằng máy chủ web hiện đang lắng nghe trên cổng 8080. + +47 +00:03:45,150 --> 00:03:50,550 +Và bây giờ tôi có thể vào cổng đó và xem trò chơi quake JS. + +48 +00:03:52,670 --> 00:03:58,760 +Vì vậy, hãy đảm bảo rằng URL của bạn giống với URL mà họ đã đặt trong tài liệu của họ. + +49 +00:03:58,790 --> 00:04:01,160 +Hãy tiếp tục và đồng ý và bạn sẽ thấy. + +50 +00:04:01,190 --> 00:04:06,800 +Khi mọi thứ đã được tải lên, trò chơi quake ban đầu sẽ chạy trên trình duyệt của bạn. + +51 +00:04:06,800 --> 00:04:12,020 +Nhưng quan trọng hơn, bạn đang chạy nó từ mã mà bạn đã sao chép từ GitHub. + +52 +00:04:12,290 --> 00:04:15,020 +Vì vậy, hãy thoải mái chơi xung quanh trò chơi. + +53 +00:04:15,020 --> 00:04:18,050 +Nó khá tuyệt và nó rất cổ điển. + +54 +00:04:18,500 --> 00:04:19,760 +Và bạn có nó rồi đấy! + +55 +00:04:21,110 --> 00:04:23,990 +Bây giờ một ví dụ khác là Wordle. + +56 +00:04:24,020 --> 00:04:31,420 +Wordle về cơ bản là một trò chơi chữ trong đó bạn phải đoán một từ có năm chữ cái chỉ sau sáu lần thử. + +57 +00:04:31,430 --> 00:04:36,380 +Và nó đã hoàn toàn lan truyền cách đây vài năm và cuối cùng được The New York Times mua lại. + +58 +00:04:36,380 --> 00:04:43,130 +Và Wordle chính thức hiện được truy cập tại New York Times cùng với tất cả các trò chơi ô chữ và câu đố khác + +59 +00:04:43,130 --> 00:04:44,050 +nhau của họ. + +60 +00:04:44,060 --> 00:04:52,380 +Nhưng ai đó đã tạo tất cả mã cho Wordle và chúng tôi có thể sao chép và chạy mã đó trên hệ thống của riêng mình. + +61 +00:04:52,500 --> 00:04:58,800 +Một lần nữa, nắm lấy URL tại kho lưu trữ GitHub, bạn có thể thấy nó hoàn toàn được tạo bằng Python + +62 +00:04:58,800 --> 00:05:00,270 +và sử dụng Tkinter. + +63 +00:05:00,270 --> 00:05:07,080 +Vì vậy, tất cả những điều chúng tôi biết, chúng tôi có thể quay lại thiết bị đầu cuối của mình, sử dụng git clone để sao + +64 +00:05:07,110 --> 00:05:08,160 +chép từ URL đó. + +65 +00:05:09,520 --> 00:05:14,050 +Và sau đó chúng tôi mở thư mục và thiết lập môi trường python ảo của mình. + +66 +00:05:16,280 --> 00:05:21,140 +Và lý do tại sao họ tạo ra nó là vì trò chơi ban đầu chỉ cho phép bạn chơi một từ mỗi ngày. + +67 +00:05:21,140 --> 00:05:26,210 +Nhưng nếu bạn hoàn toàn nghiện Wordle và bạn muốn chơi nhiều hơn một từ mỗi ngày thì sao? + +68 +00:05:26,210 --> 00:05:32,390 +Chà, bạn thật may mắn vì bạn biết cách sao chép chương trình và chạy nó trên hệ thống của riêng bạn. + +69 +00:05:32,780 --> 00:05:39,800 +Bây giờ, tất cả những gì chúng ta phải làm chỉ là cài đặt tất cả các mô-đun cần thiết và sau khi hoàn tất, chúng ta có thể + +70 +00:05:39,800 --> 00:05:43,310 +nhấp vào chơi và trò chơi sẽ bắt đầu trong một cửa sổ riêng. + +71 +00:05:44,220 --> 00:05:44,970 +Tiến lên. + +72 +00:05:45,000 --> 00:05:45,930 +Hãy đoán xem. + +73 +00:05:45,960 --> 00:05:48,140 +Xem những gì bạn có. + +74 +00:05:48,150 --> 00:05:56,910 +Và từ bí mật hàng đầu của cá nhân tôi thường là ghi chú hoặc nói cách khác với R và T và S, nhưng hãy vui vẻ + +75 +00:05:56,910 --> 00:06:00,780 +chơi với điều đó và bạn có thể tìm hiểu mã. + +76 +00:06:00,780 --> 00:06:04,710 +Bạn có thể thay đổi nó từ trò chơi Wordle thành bất kỳ thứ gì khác mà bạn muốn gọi nó. + +77 +00:06:04,710 --> 00:06:06,270 +Hoặc bạn có thể thay đổi màu sắc. + +78 +00:06:06,270 --> 00:06:13,830 +Bạn có thể sửa đổi cơ sở mã bởi vì bạn hiện sở hữu nó trên máy tính của riêng mình và bạn có thể chạy nó, bạn + +79 +00:06:13,830 --> 00:06:21,210 +có thể sửa đổi nó và bạn có thể thấy nó tuyệt vời như thế nào khi có thể sao chép toàn bộ cơ sở mã của người + +80 +00:06:21,210 --> 00:06:26,310 +khác mà họ đã tạo ra. mã nguồn mở để bạn tiếp tục phát triển trên đó. + +81 +00:06:27,130 --> 00:06:35,080 +Vì vậy, hãy xem qua mã, mở nó lên và xem bên trong các tệp từ để xem tất cả các từ có + +82 +00:06:35,080 --> 00:06:35,850 +sẵn. + +83 +00:06:35,860 --> 00:06:41,530 +Không có gian lận ở đây và bạn sẽ có thể xem mã thực sự giúp trò chơi này chạy. + +84 +00:06:41,530 --> 00:06:46,180 +Vì vậy, bạn có thể thấy nó chỉ là con trăn đơn giản mà bạn biết tất cả về nó. + +85 +00:06:46,180 --> 00:06:52,210 +Và một số điều bạn có thể không hiểu, nhưng thông qua việc nghiên cứu mã của người khác và sửa đổi mã đó, điều đó thường + +86 +00:06:52,210 --> 00:06:55,390 +giúp bạn trở thành một nhà phát triển tốt hơn nhiều. + +87 +00:06:55,780 --> 00:07:03,700 +Hãy tiếp tục, cố gắng cải thiện phiên bản của riêng bạn, biến nó thành phiên bản 2. 0 từ, bất kể điều đó có ý nghĩa gì với bạn. + +88 +00:07:03,700 --> 00:07:08,080 +Và đây là một phần quan trọng trong hành trình phát triển của bạn. + +89 +00:07:08,200 --> 00:07:15,490 +Một trong những cách tốt nhất để cải thiện kỹ năng lập trình của bạn là đọc mã của người khác, hiểu + +90 +00:07:15,490 --> 00:07:22,120 +mã của họ đang làm gì và quan trọng nhất là cố gắng sửa đổi nó một chút lúc đầu và có thể nhiều + +91 +00:07:22,120 --> 00:07:24,370 +hơn nữa trong tương lai. + +92 +00:07:24,370 --> 00:07:31,760 +Nhưng nó cung cấp cho bạn một cách để nâng cấp bộ kỹ năng của bạn bằng cách xây dựng dựa trên công việc của người khác. + +93 +00:07:31,760 --> 00:07:36,860 +Và mã nguồn mở là một cách tuyệt vời để bắt đầu. + +94 +00:07:36,890 --> 00:07:39,710 +Bạn có thể sao chép kho lưu trữ của ai đó. + +95 +00:07:39,710 --> 00:07:46,430 +Hãy xem một số thứ thú vị hơn mà chúng tôi đã liệt kê ở đây, chẳng hạn như Wordle hoặc Jarvis. + +96 +00:07:46,460 --> 00:07:52,370 +Xem đại khái mọi thứ hoạt động như thế nào và xem liệu có những điều nhỏ nhặt nào mà bạn có thể muốn thay đổi về nó + +97 +00:07:52,370 --> 00:07:52,790 +không. + +98 +00:07:52,790 --> 00:08:01,370 +Và điều này sẽ dẫn bạn đến một bước rất quan trọng trong hành trình phát triển của bạn, đó là đóng + +99 +00:08:01,400 --> 00:08:03,500 +góp cho mã nguồn mở. + +100 +00:08:03,920 --> 00:08:06,050 +Bây giờ có rất nhiều dự án. + +101 +00:08:06,050 --> 00:08:14,030 +Thậm chí còn có một danh sách các dự án trên GitHub nơi họ đã tuyển chọn một số dự án đặc biệt chào đón + +102 +00:08:14,030 --> 00:08:16,490 +những người đóng góp lần đầu. + +103 +00:08:16,490 --> 00:08:22,670 +Vì vậy, các nhóm mở cho những người lần đầu tiên hoặc những người mới bắt đầu đóng góp. + +104 +00:08:22,670 --> 00:08:29,750 +Và bạn có thể xem qua điều đó bằng cách truy cập kho lưu trữ cụ thể này cho người mới bắt đầu + +105 +00:08:29,750 --> 00:08:31,340 +và xem qua Readme. + +106 +00:08:31,610 --> 00:08:37,580 +Hãy xem có thể là mô-đun Pandas hoặc xem Jarvis hoặc Matplotlib. + +107 +00:08:37,580 --> 00:08:43,789 +Bạn có thể đóng góp cho tất cả những điều này, nhưng để biết cách đóng góp, bạn cần tìm hiểu + +108 +00:08:43,789 --> 00:08:51,320 +về yêu cầu kéo, nhánh và hợp nhất, đó chính xác là những gì chúng ta sẽ đề cập trong các bài học sắp tới. + +109 +00:08:51,320 --> 00:08:54,170 +Vì vậy, đối với tất cả những điều đó và hơn thế nữa, tôi sẽ gặp bạn ở đó. + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 For-the-curious-windows-Quake3-Nodejs-setup.pdf b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 For-the-curious-windows-Quake3-Nodejs-setup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8f535b705220e2458bd4aa13f698635096a36775 Binary files /dev/null and b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 For-the-curious-windows-Quake3-Nodejs-setup.pdf differ diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Wordle-Game-in-Python-ritik48-.url b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Wordle-Game-in-Python-ritik48-.url new file mode 100644 index 0000000000000000000000000000000000000000..bb1698fc9604f9048a4826a2603a5e434832eaba --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/007 Wordle-Game-in-Python-ritik48-.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/ritik48/Wordle-Game \ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/008 Branching and Merging.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/008 Branching and Merging.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ca032f259001f5581d4470586ff661b9ea844979 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/008 Branching and Merging.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7f9937bd18693badcc6f7009cf426c13778c16748e1b41c41b876b30aa024b9 +size 72698237 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/008 Branching and Merging_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/008 Branching and Merging_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a9faf14a53e418fd79189c1dd3f5f7807a5d9bb6 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/008 Branching and Merging_vi.srt @@ -0,0 +1,528 @@ +1 +00:00:00,140 --> 00:00:05,120 +Bây giờ, trong bài học trước, chúng ta đã nói về một số biến thể cơ bản hơn của kiểm soát phiên bản. + +2 +00:00:05,150 --> 00:00:09,110 +Trong bài học này, tôi muốn nói về các nhánh và sự phân nhánh. + +3 +00:00:09,140 --> 00:00:11,580 +Bây giờ hãy bắt đầu với một ví dụ đơn giản. + +4 +00:00:11,600 --> 00:00:14,990 +Nói nếu chúng ta có phiên bản một và hai. + +5 +00:00:15,020 --> 00:00:18,800 +Vì vậy, hai cam kết đã được thực hiện cho kho lưu trữ cục bộ của chúng tôi. + +6 +00:00:18,800 --> 00:00:25,610 +Và tại thời điểm này, chúng tôi nhận ra rằng chúng tôi có thể muốn thử một thứ gì đó khác biệt, có thể xây dựng một tính năng mới + +7 +00:00:25,610 --> 00:00:28,730 +hoặc chỉ để loay hoay với một ý tưởng hoặc khái niệm mới. + +8 +00:00:28,760 --> 00:00:35,690 +Những gì chúng ta có thể làm là thay vì tiếp tục cam kết với nhánh chính mà bạn thấy ở đây, chúng ta + +9 +00:00:35,690 --> 00:00:39,470 +cũng có thể tạo một nhánh phụ sau lần cam kết thứ hai. + +10 +00:00:39,500 --> 00:00:46,880 +Chúng tôi tạo một nhánh mới và chúng tôi bắt đầu cam kết với nhánh mới này hoặc nhánh thử nghiệm này. + +11 +00:00:46,910 --> 00:00:50,150 +Chúng tôi thêm một số tính năng và chúng tôi viết một số mã. + +12 +00:00:50,330 --> 00:00:56,810 +Đồng thời, chúng tôi có thể tiếp tục làm việc trên nhánh chính, đưa ra tất cả các bản cập + +13 +00:00:56,810 --> 00:01:01,860 +nhật hoặc đoạn mã cần thiết để duy trì dự án chính của chúng tôi. + +14 +00:01:01,860 --> 00:01:08,520 +Nhưng đồng thời, chúng tôi có thể tiếp tục cập nhật và làm việc trên nhánh thử nghiệm này, thử mọi thứ và đưa các + +15 +00:01:08,520 --> 00:01:11,840 +thử nghiệm của chúng tôi vào nhánh thử nghiệm này. + +16 +00:01:11,850 --> 00:01:18,610 +Vì vậy, bây giờ chúng tôi có hai nhánh song song với nhau và chúng có thể được phát triển đồng thời. + +17 +00:01:18,630 --> 00:01:24,900 +Nếu tại một thời điểm nào đó trong tương lai, chúng tôi quyết định rằng thử nghiệm đó thực sự hiệu quả và tính + +18 +00:01:24,900 --> 00:01:30,930 +năng mà chúng tôi tích hợp vào thực sự, thực sự tuyệt vời và chúng tôi muốn hợp nhất nó trở lại nhánh chính + +19 +00:01:30,930 --> 00:01:37,350 +hoặc dự án chính, thì điều đó cũng có thể được thực hiện rất dễ dàng bằng cách chỉ cần đặt một yêu cầu hợp nhất vào + +20 +00:01:37,350 --> 00:01:44,370 +và chúng tôi có thể mang tất cả những thay đổi mà chúng tôi đã thử nghiệm với những thứ mà chúng tôi đã loay hoay quay lại dự + +21 +00:01:44,370 --> 00:01:49,200 +án chính và kiểm tra xem có bất kỳ xung đột nào với mã nhánh chính không . + +22 +00:01:49,200 --> 00:01:55,740 +Và nếu không, hoặc nếu sau khi chỉnh sửa một chút thì chúng ta có thể đưa tất cả những thay đổi đó vào nhánh + +23 +00:01:55,740 --> 00:02:03,870 +làm việc chính và sau đó chúng ta có thể tiếp tục làm việc từ đây đến lần xác nhận tiếp theo hoặc chúng ta có thể tạo nhiều nhánh + +24 +00:02:03,870 --> 00:02:04,620 +hơn. + +25 +00:02:04,620 --> 00:02:10,650 +Và những gì bạn thường thấy trong thực tế là sẽ có nhiều nhánh được thực hiện + +26 +00:02:10,650 --> 00:02:13,350 +cùng lúc cho bất kỳ dự án lớn nào. + +27 +00:02:13,350 --> 00:02:19,950 +Và lý do là vì đôi khi bạn đang phát triển các tính năng mới, đôi khi bạn đang sửa lỗi và tất cả những điều này + +28 +00:02:19,950 --> 00:02:25,350 +có thể phá vỡ dự án chính của bạn, vì vậy bạn không muốn làm điều đó trên nhánh chính. + +29 +00:02:25,350 --> 00:02:28,230 +Bạn chỉ muốn đặt nó vào nhánh chính. + +30 +00:02:28,230 --> 00:02:35,130 +Khi bạn biết rằng mọi thứ đang hoạt động tốt và sau đó bạn có thể đưa mã của mình trở lại bản sao đang hoạt động để + +31 +00:02:35,130 --> 00:02:37,410 +sẵn sàng vận chuyển và triển khai. + +32 +00:02:37,530 --> 00:02:41,370 +Chúng ta hãy xem làm thế nào điều này sẽ làm việc trong thực tế. + +33 +00:02:41,400 --> 00:02:49,890 +Bây giờ, giả sử chúng ta điều hướng trở lại thư mục câu chuyện của mình và bên trong đây, chúng ta vẫn có ba chương trước + +34 +00:02:49,890 --> 00:02:53,430 +đó và chúng nằm dưới sự kiểm soát của phiên bản. + +35 +00:02:53,430 --> 00:02:59,880 +Vì vậy, nếu chúng ta chỉ xem nhật ký Git, bạn có thể thấy rằng đây hiện là cam kết gần đây nhất và nó cũng được phản + +36 +00:02:59,880 --> 00:03:02,580 +ánh trong điều khiển từ xa của chúng ta. + +37 +00:03:03,480 --> 00:03:06,270 +Hãy thử và làm điều này tại địa phương đầu tiên. + +38 +00:03:06,420 --> 00:03:14,130 +Nếu tôi quyết định rằng tôi muốn tạo một nhánh mới, bạn chỉ cần viết Git Branch và chỉ định tên + +39 +00:03:14,130 --> 00:03:16,050 +của nhánh mới của bạn. + +40 +00:03:16,080 --> 00:03:25,590 +Tôi sẽ thêm một cốt truyện liên quan đến không gian vào câu chuyện của mình, vì vậy hãy gọi nhánh của chúng ta là cốt truyện người ngoài hành tinh. + +41 +00:03:26,980 --> 00:03:27,820 +Nhấn Enter. + +42 +00:03:27,820 --> 00:03:34,720 +Và bây giờ bạn có thể kiểm tra xem bạn có những nhánh nào bằng cách viết nhánh Git mà không có tên và bạn có thể + +43 +00:03:34,720 --> 00:03:40,450 +thấy rằng bạn có một nhánh tên là Alien Plot và một nhánh khác tên là Main, và các dấu hoa + +44 +00:03:40,450 --> 00:03:43,450 +thị cho bạn biết bạn hiện đang ở nhánh nào. + +45 +00:03:43,450 --> 00:03:45,340 +Vì vậy, chúng tôi hiện đang ở trên chi nhánh chính. + +46 +00:03:45,370 --> 00:03:50,920 +Chúng ta có thể chuyển sang cốt truyện của người ngoài hành tinh bằng cách viết Git checkout. + +47 +00:03:51,790 --> 00:03:53,710 +Âm mưu của người ngoài hành tinh. + +48 +00:03:56,550 --> 00:03:57,110 +Được rồi. + +49 +00:03:57,120 --> 00:04:01,200 +Như đã nói, chúng tôi hiện đã chuyển sang nhánh có tên Alien Plot. + +50 +00:04:01,350 --> 00:04:07,290 +Bây giờ, bên trong nhánh này, tôi sẽ thực hiện một số thay đổi đối với các chương của mình. + +51 +00:04:07,470 --> 00:04:14,730 +Bây giờ tôi sẽ thực hiện một số sửa đổi hoàn toàn vô nghĩa đối với các tệp của mình. + +52 +00:04:14,730 --> 00:04:16,680 +Vì vậy, hãy thay đổi Chương một. + +53 +00:04:16,680 --> 00:04:19,860 +Hãy thay đổi chương hai. + +54 +00:04:26,500 --> 00:04:27,670 +Được rồi. + +55 +00:04:27,880 --> 00:04:28,550 +Chúng ta đi thôi. + +56 +00:04:28,570 --> 00:04:34,780 +Được rồi, vì vậy chúng tôi đã thực hiện một số sửa đổi đối với chương một, chương hai và chúng tôi đã quyết định + +57 +00:04:34,780 --> 00:04:41,080 +thay đổi một số văn bản đã viết sẵn để tích hợp cốt truyện theo chủ đề không gian hoặc người ngoài hành tinh. + +58 +00:04:42,040 --> 00:04:44,200 +Hãy tiếp tục và cam kết điều đó. + +59 +00:04:44,200 --> 00:04:55,510 +Vì vậy, hãy nhớ rằng, chúng ta phải thực hiện git add và sau đó git commit dash m và thông báo của + +60 +00:04:56,020 --> 00:05:04,960 +chúng ta sẽ sửa đổi chương một và hai để có chủ đề người ngoài hành tinh. + +61 +00:05:06,490 --> 00:05:10,870 +Được rồi, bây giờ hãy nhấn enter và chúng tôi đã thực hiện các cam kết của mình. + +62 +00:05:11,050 --> 00:05:18,820 +Bây giờ nếu chúng tôi thực hiện nhật ký git, chúng tôi có thể thấy rằng chúng tôi có hai cam kết được thực hiện trên nhánh chính và chúng tôi có một cam kết được + +63 +00:05:18,820 --> 00:05:21,970 +thực hiện trên nhánh cốt truyện của người ngoài hành tinh. + +64 +00:05:22,120 --> 00:05:25,890 +Vì vậy, bây giờ hãy nói rằng chúng ta quay trở lại nhánh chính của mình. + +65 +00:05:25,900 --> 00:05:32,410 +Bất cứ khi nào bạn bối rối không biết mình đang ở đâu, bạn luôn có thể thực hiện một nhánh git để kiểm tra và xem dấu hoa thị ở đâu. + +66 +00:05:32,410 --> 00:05:35,200 +Và dấu hoa thị rõ ràng là bạn đang ở đâu. + +67 +00:05:35,230 --> 00:05:43,810 +Vì vậy, hãy thực hiện kiểm tra git main để quay lại nhánh chính để bạn có thể thấy rằng nhánh chính của chúng ta không + +68 +00:05:43,810 --> 00:05:44,740 +thay đổi. + +69 +00:05:44,740 --> 00:05:48,790 +Đối với âm mưu không gian hoặc người ngoài hành tinh mà chúng ta vừa làm. + +70 +00:05:48,790 --> 00:05:51,040 +Không có gì đã thay đổi ở đây. + +71 +00:05:51,040 --> 00:05:54,700 +Vì vậy, trong khi ở nhánh chính, tôi sẽ tạo một tệp mới. + +72 +00:05:54,700 --> 00:05:56,440 +Tôi sẽ gọi nó là chương. + +73 +00:05:58,040 --> 00:06:00,050 +Văn bản bốn chấm. + +74 +00:06:01,090 --> 00:06:03,670 +Và bên trong Chương bốn. + +75 +00:06:03,700 --> 00:06:05,290 +Hãy thêm một cái gì đó. + +76 +00:06:09,600 --> 00:06:10,110 +Được rồi. + +77 +00:06:10,110 --> 00:06:11,910 +Và nhấn, nhập và lưu. + +78 +00:06:11,940 --> 00:06:13,590 +Nhân tiện, tôi không biết mình đang gõ cái gì. + +79 +00:06:13,590 --> 00:06:18,620 +Bây giờ tôi đang tạo ra và phá hủy, có lẽ trong quá trình đó là một kiệt tác, nhưng không sao. + +80 +00:06:18,630 --> 00:06:25,050 +Vì vậy, bây giờ chúng tôi có một chương bốn trên nhánh chính của chúng tôi và tôi sẽ tiếp tục và thực hiện một git add + +81 +00:06:25,050 --> 00:06:26,100 +và git commit. + +82 +00:06:26,850 --> 00:06:32,250 +Bây giờ có nhiều cách để kết hợp add và commit với nhau trong cùng một lệnh, nhưng tôi nghĩ nếu bạn là người mới + +83 +00:06:32,250 --> 00:06:36,090 +sử dụng git, bạn nên thực sự biết chính xác điều gì đang diễn ra trong đầu. + +84 +00:06:36,090 --> 00:06:39,360 +Vì vậy, tôi khuyên bạn nên thực sự tách hai bit đó ra. + +85 +00:06:39,390 --> 00:06:42,330 +Hãy tiếp tục và cung cấp cho nó một thông điệp cam kết. + +86 +00:06:42,510 --> 00:06:45,120 +Thêm chương bốn. + +87 +00:06:45,960 --> 00:06:47,760 +Được rồi, vậy hãy git log. + +88 +00:06:47,760 --> 00:06:48,390 +Hãy xem nào. + +89 +00:06:48,390 --> 00:06:49,260 +Những gì chúng ta đã có? + +90 +00:06:49,290 --> 00:06:53,460 +Chúng tôi hiện chỉ xem xét nhánh chính và chúng tôi có ba lần xác nhận. + +91 +00:06:53,490 --> 00:06:57,270 +Đây là vị trí của điều khiển từ xa của chúng tôi. + +92 +00:06:57,270 --> 00:07:02,640 +Vì vậy, trên kho lưu trữ GitHub của chúng tôi, đây là cam kết mới nhất mà nó có thể thấy. + +93 +00:07:02,640 --> 00:07:08,400 +Nhưng trên kho lưu trữ git cục bộ của chúng tôi, đây thực tế là cam kết mới nhất, cam kết mà chúng tôi vừa thực + +94 +00:07:08,400 --> 00:07:09,910 +hiện khi thêm chương bốn. + +95 +00:07:09,910 --> 00:07:16,660 +Và bạn có thể thấy rằng nếu tôi chuyển đổi giữa các nhánh, giả sử nếu tôi đi đến nhánh Alien và nhấn enter, bạn + +96 +00:07:16,660 --> 00:07:22,110 +có thể thấy rằng các tệp cục bộ của chúng tôi thực sự thay đổi khi tôi chuyển đổi nhánh. + +97 +00:07:22,120 --> 00:07:29,020 +Hãy chỉ nói rằng tôi khá hài lòng với những thay đổi mà tôi đã thực hiện liên quan đến việc bổ sung cốt truyện về người ngoài hành + +98 +00:07:29,020 --> 00:07:33,910 +tinh của mình và tôi muốn hợp nhất những thay đổi này trở lại nhánh chính của mình. + +99 +00:07:33,910 --> 00:07:37,540 +Vì vậy, tôi đã thực hiện một chút thử nghiệm trên một nhánh riêng biệt. + +100 +00:07:37,540 --> 00:07:42,040 +Bạn biết đấy, tôi đã làm hỏng một số thứ và tôi nghĩ đó là một thử nghiệm tuyệt vời. + +101 +00:07:42,040 --> 00:07:46,150 +Vì vậy, tôi sẽ đặt nó trở lại chi nhánh chính của chúng tôi. + +102 +00:07:46,240 --> 00:07:50,860 +Để làm điều đó, những gì bạn phải làm là quay trở lại nhánh chính. + +103 +00:07:50,860 --> 00:07:58,990 +Vì vậy, git checkout main và trong khi ở nhánh chính, chúng ta sẽ hợp nhất các thay đổi bên trong nhánh cốt truyện người + +104 +00:07:58,990 --> 00:08:00,280 +ngoài hành tinh. + +105 +00:08:00,280 --> 00:08:10,420 +Vì vậy, chúng tôi sử dụng lệnh git merge và chúng tôi sẽ chỉ định tên nhánh là âm mưu của người ngoài hành tinh nhấn enter. + +106 +00:08:10,420 --> 00:08:16,570 +Và thao tác này sẽ mở ra Vim, một trình soạn thảo văn bản và điều này cho phép bạn thêm một tin nhắn hợp nhất nếu muốn. + +107 +00:08:16,570 --> 00:08:20,830 +Và cách khác, như chúng ta sẽ làm ở đây, chúng ta sẽ để trống và bạn + +108 +00:08:20,830 --> 00:08:24,490 +sẽ viết dấu chấm than Q dấu hai chấm để lưu và thoát. + +109 +00:08:25,370 --> 00:08:31,430 +Và bạn có thể thấy bây giờ tôi đã thực sự tiếp thu những thay đổi đó từ cốt truyện của người ngoài hành tinh. + +110 +00:08:31,550 --> 00:08:37,789 +Và bạn có thể thấy điều đó bởi vì nếu tôi thực hiện nhánh Git, thì tôi đang ở nhánh chính. + +111 +00:08:37,789 --> 00:08:39,590 +Vì vậy, nhánh cốt truyện của người ngoài hành tinh vẫn tồn tại. + +112 +00:08:39,590 --> 00:08:45,500 +Nhân tiện, nếu bạn xem git log, bạn có thể thấy rằng tôi đã có một số cam kết trước đó, nhưng tôi + +113 +00:08:45,500 --> 00:08:51,170 +cũng có sơ đồ người ngoài hành tinh nhánh hợp nhất này là cam kết gần đây nhất của tôi. + +114 +00:08:51,200 --> 00:09:00,950 +Bây giờ, tại thời điểm này, hãy thực hiện một lệnh git push tới miền gốc của chúng ta và nhớ thêm cờ gạch ngang u. + +115 +00:09:02,070 --> 00:09:03,090 +Thế là xong. + +116 +00:09:03,090 --> 00:09:05,130 +Và hãy kiểm tra nó trực tuyến. + +117 +00:09:05,130 --> 00:09:10,770 +Nếu chúng ta xem kho lưu trữ câu chuyện của mình, bạn có thể thấy rằng hiện có năm lần xác nhận. + +118 +00:09:10,980 --> 00:09:13,020 +Chúng tôi sửa đổi Chương một và hai. + +119 +00:09:13,050 --> 00:09:17,160 +Chúng tôi đã thêm chương bốn và chúng tôi hợp nhất nhánh cốt truyện Alien. + +120 +00:09:17,160 --> 00:09:24,300 +Vì vậy, nếu bạn đi sâu vào thông tin chi tiết và truy cập mạng ngay bây giờ, nếu tôi phóng to biểu đồ mạng này, thì bạn + +121 +00:09:24,300 --> 00:09:27,600 +có thể thấy đây là quá trình mà chúng tôi đã trải qua. + +122 +00:09:27,750 --> 00:09:32,040 +Đây là nhánh chính mà chúng tôi đã thực hiện chương một và chương hai. + +123 +00:09:32,040 --> 00:09:39,180 +Và tại thời điểm này, sau khi tôi tạo Chương hai và ba, tôi đã tạo một nhánh mới. + +124 +00:09:39,180 --> 00:09:45,390 +Và khi ở trong chi nhánh này, tôi đã cam kết sửa đổi chương một và hai để có chủ đề về người ngoài hành tinh. + +125 +00:09:45,390 --> 00:09:51,330 +Và sau đó trên nhánh chính, tôi tiếp tục phát triển nhánh chính, thêm Chương bốn. + +126 +00:09:51,330 --> 00:10:00,780 +Nhưng sau đó, tôi nhận ra rằng mình đã làm rất tốt khi thêm các chủ đề về người ngoài hành tinh vào cốt truyện của chúng tôi và + +127 +00:10:00,780 --> 00:10:04,410 +tôi quyết định hợp nhất nó trở lại nhánh chính. + +128 +00:10:04,420 --> 00:10:08,860 +Về cơ bản, đây là một biểu diễn đồ họa về những gì đang diễn ra. + +129 +00:10:08,980 --> 00:10:12,760 +Vì vậy, đó là chúng tôi tạo một nhánh và hợp nhất nó. + +130 +00:10:12,790 --> 00:10:19,570 +Bây giờ tại sao bạn không tiếp tục và bắt đầu tạo kho lưu trữ của riêng mình cả cục bộ cũng như trên GitHub + +131 +00:10:19,570 --> 00:10:27,430 +và, bạn biết đấy, viết một câu chuyện hoặc viết một bài thơ, bất cứ điều gì bạn thích và kiểm tra sự tuyệt vời đang phân + +132 +00:10:27,430 --> 00:10:29,590 +nhánh bằng cách sử dụng git . + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/009 Optional Git Challenge.html b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/009 Optional Git Challenge.html new file mode 100644 index 0000000000000000000000000000000000000000..4a0fc3711b927a6ce75bb013a802e05ee01f436b --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/009 Optional Git Challenge.html @@ -0,0 +1 @@ +

If you want to dive deeper into Git, including learning about Cherry-Picking, Git Rebase and more I recommend completing the challenges here:

https://learngitbranching.js.org/

\ No newline at end of file diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/010 Forking and Pull Requests.mp4 b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/010 Forking and Pull Requests.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4dc0b93f19e1531525d58eafc7122fae0e062a24 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/010 Forking and Pull Requests.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9b6f9b37f17a6ce68123714dfb1f48e77477defc47a7aada1dc2bfb1116bb1a +size 186582813 diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/010 Forking and Pull Requests_vi.srt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/010 Forking and Pull Requests_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..cca489634f8ccb504d55c731f4940bcdbb3555be --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/010 Forking and Pull Requests_vi.srt @@ -0,0 +1,748 @@ +1 +00:00:00,170 --> 00:00:05,780 +Trong một số bài học trước, chúng ta đã xem xét việc triển khai kiểm soát nguồn cục bộ, sử + +2 +00:00:05,780 --> 00:00:08,560 +dụng dòng lệnh và cả sử dụng GitHub từ xa. + +3 +00:00:08,570 --> 00:00:15,530 +Vì vậy, bây giờ tôi muốn đưa bạn đi xa hơn một chút và tôi muốn nói về sự cộng tác bằng cách sử dụng kho lưu + +4 +00:00:15,530 --> 00:00:23,960 +trữ từ xa và GitHub vì đây là một trong những cách tốt nhất để bắt đầu làm việc trong một nhóm lập trình viên và đóng góp kỹ năng + +5 +00:00:23,960 --> 00:00:26,540 +của bạn cho các dự án nguồn mở. + +6 +00:00:26,540 --> 00:00:32,270 +Vì vậy, chúng ta đã thấy tất cả bốn khu vực này là thư mục làm việc, khu vực tổ chức, kho lưu trữ cục + +7 +00:00:32,270 --> 00:00:34,220 +bộ cũng như kho lưu trữ từ xa. + +8 +00:00:34,220 --> 00:00:38,070 +Và bây giờ bạn đã khá quen thuộc với cả bốn lĩnh vực này. + +9 +00:00:38,090 --> 00:00:45,620 +Bây giờ trong kịch bản tiếp theo, hãy chuyển sang chỉ xem kho lưu trữ cục bộ và từ xa mà bạn sở + +10 +00:00:45,620 --> 00:00:46,220 +hữu. + +11 +00:00:46,250 --> 00:00:47,750 +Hãy nói rằng. + +12 +00:00:47,750 --> 00:00:51,200 +Angela Vì vậy, bản thân tôi, tôi sở hữu kho lưu trữ này. + +13 +00:00:51,200 --> 00:00:56,300 +Tôi đã tạo nó cục bộ và sau đó tôi đẩy nó vào kho lưu trữ từ xa của mình trên GitHub. + +14 +00:00:56,360 --> 00:01:02,340 +Bây giờ hãy nói rằng tôi có một người song sinh độc ác tên là gì, tôi không biết. + +15 +00:01:02,610 --> 00:01:04,739 +Angela Đó là một cái tên khủng khiếp. + +16 +00:01:05,519 --> 00:01:10,010 +Giả sử rằng cô ấy cũng muốn thay đổi kho lưu trữ của tôi. + +17 +00:01:10,020 --> 00:01:16,020 +Cô ấy đang xem cơ sở mã của tôi và bạn biết đấy, cô ấy muốn thêm một số tính năng hoặc sửa một số + +18 +00:01:16,650 --> 00:01:20,850 +lỗi hoặc làm điều gì đó vì tôi sở hữu kho lưu trữ từ xa này ở đây. + +19 +00:01:20,850 --> 00:01:28,050 +Để làm việc với nó, cô ấy có thể tạo một bản sao của nó tồn tại trên tài khoản GitHub của mình. + +20 +00:01:28,080 --> 00:01:30,620 +Hãy nhớ rằng, điều này khác với bản sao Git. + +21 +00:01:30,630 --> 00:01:38,610 +Bản sao Git chỉ lấy toàn bộ kho lưu trữ và sau đó sao chép nó vào môi trường làm việc cục bộ của + +22 +00:01:38,610 --> 00:01:39,360 +bạn. + +23 +00:01:39,390 --> 00:01:45,300 +Bây giờ, trong trường hợp này, về cơ bản, chúng tôi chỉ sao chép một kho lưu trữ được lưu trữ trên GitHub và chúng tôi đang giữ bản sao + +24 +00:01:45,300 --> 00:01:49,740 +trong tài khoản GitHub của riêng mình, nơi chúng tôi có thể thực hiện các thay đổi đối với nó. + +25 +00:01:49,740 --> 00:01:53,850 +Vì vậy, theo thuật ngữ GitHub, điều này được gọi là forking. + +26 +00:01:53,850 --> 00:01:58,590 +Bây giờ, khi bạn đã rẽ nhánh một kho lưu trữ từ xa, thì bây giờ bạn sở hữu nó. + +27 +00:01:58,590 --> 00:02:05,160 +Bạn có toàn quyền để làm bất cứ điều gì bạn thích với bản sao này của kho lưu trữ, bởi vì như bạn có thể tưởng + +28 +00:02:05,160 --> 00:02:12,300 +tượng, sẽ rất điên rồ nếu mọi người có thể sửa đổi mã nguồn của bạn trên tất cả các kho lưu trữ nguồn mở của bạn bởi + +29 +00:02:12,300 --> 00:02:18,090 +vì, bạn biết đấy, nó sẽ dẫn đến việc những người nghiệp dư có thể thay đổi tất cả những thứ mà + +30 +00:02:18,090 --> 00:02:24,450 +bạn không muốn họ làm hoặc, bạn biết đấy, những người tạo ra các tính năng không tương thích với những + +31 +00:02:24,450 --> 00:02:25,830 +gì bạn đã có. + +32 +00:02:25,830 --> 00:02:30,600 +Về cơ bản, bạn sẽ chỉ cung cấp cho những người mà bạn có mối quan hệ đáng tin cậy, phải không. + +33 +00:02:30,600 --> 00:02:32,700 +Truy cập vào kho lưu trữ từ xa của bạn. + +34 +00:02:32,700 --> 00:02:39,060 +Vì vậy, giả sử nếu bạn làm việc trong một nhóm và tất cả các bạn đang làm việc trên một sản phẩm, thì mọi người + +35 +00:02:39,060 --> 00:02:45,390 +trong nhóm có thể có cả quyền đọc và ghi trên một kho lưu trữ từ xa duy nhất và theo cách đó họ có thể sao chép + +36 +00:02:45,390 --> 00:02:51,420 +và làm việc trên nó cục bộ và sau đó đẩy nó và giải quyết bất kỳ loại xung đột nào theo cách đó. + +37 +00:02:51,420 --> 00:02:55,890 +Nhưng bạn không muốn bất kỳ ai trên Internet có những loại quyền đó. + +38 +00:02:55,890 --> 00:03:00,000 +Vậy làm thế nào để bạn triển khai kiểu cộng tác nguồn mở này? + +39 +00:03:00,000 --> 00:03:03,480 +Chà, đó là thông qua forking và thực hiện các yêu cầu kéo. + +40 +00:03:04,440 --> 00:03:09,510 +Vì vậy, bây giờ hãy nói rằng Angela Angela độc ác đã phân chia kho lưu trữ của tôi. + +41 +00:03:09,510 --> 00:03:17,940 +Vì vậy, trên tài khoản GitHub của cô ấy, cô ấy hiện sở hữu một bản sao kho lưu trữ của tôi và từ thời điểm này, cô ấy có thể sao chép + +42 +00:03:17,940 --> 00:03:20,880 +kho lưu trữ đó để hoạt động trên nó cục bộ. + +43 +00:03:20,880 --> 00:03:27,420 +Và nếu cô ấy quyết định thêm một số tính năng vào nó, có thể, bạn biết đấy, cải thiện cơ sở mã hoặc thêm một số + +44 +00:03:27,420 --> 00:03:33,390 +mã khác hoặc làm điều gì đó điên rồ hoặc bất cứ điều gì cô ấy muốn, sau đó sau khi cô ấy hài lòng với điều + +45 +00:03:33,390 --> 00:03:39,090 +đó và cô ấy cam kết những thay đổi đó, thì cô ấy có thể đẩy nó vào kho lưu trữ từ xa của mình. + +46 +00:03:39,090 --> 00:03:46,680 +Và sau đó nếu cô ấy muốn tôi hoặc Angela tốt bụng kết hợp những thay đổi mà cô ấy đã thực hiện, thì lựa chọn duy nhất + +47 +00:03:46,680 --> 00:03:49,110 +của cô ấy là đưa ra yêu cầu kéo. + +48 +00:03:49,110 --> 00:03:55,560 +Nếu cô ấy không ở trong nhóm người đáng tin cậy đó, những người có quyền truy cập đọc và ghi vào kho lưu trữ từ xa của tôi. + +49 +00:03:55,560 --> 00:04:00,900 +Vì vậy, giả sử nếu cô ấy chỉ có quyền đọc, thì cô ấy sẽ phải thực hiện yêu cầu kéo. + +50 +00:04:00,900 --> 00:04:03,270 +Và nó gần giống như đưa ra một gợi ý. + +51 +00:04:03,270 --> 00:04:06,450 +Dưới đây là một số thay đổi được đề xuất mà tôi đang thực hiện. + +52 +00:04:06,450 --> 00:04:07,740 +Bạn nghĩ gì về nó? + +53 +00:04:07,740 --> 00:04:13,080 +Nếu bạn đồng ý, thì vui lòng, bạn biết đấy, hợp nhất nó vào kho lưu trữ từ xa của bạn. + +54 +00:04:13,110 --> 00:04:19,470 +Lý do tại sao nó được gọi là yêu cầu kéo chứ không phải yêu cầu đẩy là vì người có quyền + +55 +00:04:19,470 --> 00:04:21,149 +ghi vào kho lưu trữ. + +56 +00:04:21,149 --> 00:04:29,100 +Vì vậy, tôi có quyền ghi vào kho lưu trữ từ xa của riêng mình, kho lưu trữ này đã được phân nhánh và sao chép bởi, bạn biết đấy, người song + +57 +00:04:29,100 --> 00:04:30,570 +sinh độc ác của tôi. + +58 +00:04:30,600 --> 00:04:37,170 +Nếu cô ấy muốn kết hợp những thay đổi đó, thì tôi có phiếu quyết định để tôi có thể xem xét những + +59 +00:04:37,170 --> 00:04:40,980 +thay đổi đó và tôi có thể tiếp tục những thay đổi đó. + +60 +00:04:40,980 --> 00:04:47,520 +Vì vậy, đây không phải là một sự thúc đẩy bởi vì bạn không sở hữu các quyền đối với kho lưu trữ từ xa mà bạn đang cố gắng + +61 +00:04:47,520 --> 00:04:48,150 +thúc đẩy. + +62 +00:04:48,720 --> 00:04:54,690 +Trong trường hợp này, nếu tôi quyết định sau khi xem xét mã rằng thực sự những tính năng mà cô ấy thêm + +63 +00:04:54,690 --> 00:05:00,990 +vào khá tuyệt vời và nó có vẻ tương thích với mã của tôi cho đến nay và không vi phạm bất kỳ điều gì, thì tôi + +64 +00:05:00,990 --> 00:05:11,070 +sẽ chấp thuận yêu cầu kéo và hợp nhất kho lưu trữ của cô ấy với kho lưu trữ của tôi. của riêng mình, vì vậy những thay đổi sẽ được phản ánh trong một cam kết mới. + +65 +00:05:11,070 --> 00:05:13,410 +Vì vậy, chúng ta hãy xem xét điều này trong hành động. + +66 +00:05:14,890 --> 00:05:18,630 +Vì vậy, ở đây chúng tôi đã có kho lưu trữ câu chuyện gốc của chúng tôi. + +67 +00:05:18,640 --> 00:05:25,000 +Vì vậy, đây là một kho lưu trữ từ xa, hãy nhớ rằng, vì nó được lưu trữ trực tuyến trên GitHub và chúng + +68 +00:05:25,000 --> 00:05:31,890 +tôi đã có một số cam kết và chúng tôi đã thực hiện một số sửa đổi và viết để viết cốt truyện của mình. + +69 +00:05:31,900 --> 00:05:35,170 +Bây giờ tôi sẽ đăng xuất khỏi tài khoản của mình. + +70 +00:05:35,170 --> 00:05:42,220 +Vì vậy, đó là tài khoản đã tạo ra câu chuyện và sau đó tôi sẽ đăng nhập bằng một tài khoản khác. + +71 +00:05:42,220 --> 00:05:46,090 +Vì vậy, ngay bây giờ tôi đã đăng nhập vào một tài khoản GitHub khác. + +72 +00:05:46,330 --> 00:05:53,310 +Tài khoản này có tên Gilfoyle là tên khác của tôi, và bây giờ tôi sẽ tìm kiếm kho lưu trữ đó. + +73 +00:05:53,320 --> 00:05:57,580 +Vì vậy, tôi đã tìm thấy kho truyện của người dùng Angela Bower. + +74 +00:05:57,580 --> 00:05:59,860 +Vì vậy, đó là cái mà chúng ta đã thấy trước đó. + +75 +00:05:59,860 --> 00:06:06,070 +Vì vậy, tôi sẽ đi vào kho lưu trữ này và bạn có thể thấy rằng tất cả các dòng và tệp này đều + +76 +00:06:06,070 --> 00:06:12,520 +hiển thị công khai và bạn có thể đọc qua tất cả chúng, mặc dù hiện tại bạn chưa đăng nhập vào + +77 +00:06:12,520 --> 00:06:19,280 +tài khoản đã tạo kho lưu trữ này từ đây , những gì tôi sẽ làm là tôi sẽ rẽ nhánh kho lưu trữ này. + +78 +00:06:20,140 --> 00:06:28,420 +Như chúng tôi đã đề cập trước đây, forking chỉ đơn giản là tạo một bản sao hoặc bản sao của một kho lưu trữ từ xa và đặt + +79 +00:06:28,420 --> 00:06:31,330 +nó dưới tài khoản GitHub của riêng bạn. + +80 +00:06:31,360 --> 00:06:39,280 +Bạn có thể thấy người dùng mà tôi đã tạo này có tên là Guilfoyle là tên khác của tôi, và bây giờ tôi có kho lưu trữ này dưới tên người + +81 +00:06:39,280 --> 00:06:43,210 +dùng của riêng mình, vì vậy tôi đã tạo một bản sao của nó. + +82 +00:06:43,210 --> 00:06:46,000 +Và bạn có thể thấy nó giống hệt như trước đây. + +83 +00:06:46,000 --> 00:06:50,500 +Mọi thứ đã được sao chép, bao gồm tất cả các cam kết trước đó đã được thực hiện. + +84 +00:06:50,770 --> 00:06:54,100 +Vì vậy, từ đây tôi sẽ thực hiện một số thay đổi. + +85 +00:06:54,100 --> 00:06:58,630 +Vì vậy, có lẽ chúng ta hãy thay đổi một trong những cốt truyện này. + +86 +00:06:59,290 --> 00:07:01,570 +Vì vậy, hãy thay đổi Chương bốn. + +87 +00:07:04,480 --> 00:07:11,590 +Vì vậy, giả sử rằng người dùng khác này, người này có một số cải tiến được đề xuất cho mã của tôi hoặc trong trường + +88 +00:07:11,590 --> 00:07:13,340 +hợp này là bài viết của tôi. + +89 +00:07:13,360 --> 00:07:19,750 +Họ vẫn giữ nguyên tinh thần của kho lưu trữ ban đầu vì chúng tôi hiện đang chuyển đổi thành chủ đề không + +90 +00:07:19,750 --> 00:07:22,540 +gian hoặc chủ đề người ngoài hành tinh. + +91 +00:07:22,660 --> 00:07:29,590 +Vì vậy, tôi đã thực hiện các thay đổi của mình đối với chương bốn và tôi sẽ cam kết những thay + +92 +00:07:29,590 --> 00:07:34,080 +đổi đó bằng cách thêm chủ đề không gian vào Chương bốn. + +93 +00:07:34,090 --> 00:07:37,240 +Vì vậy, đó là những gì tôi đã làm và tôi sẽ cam kết với nhánh chính. + +94 +00:07:37,240 --> 00:07:43,420 +Vì vậy, đây là nhánh chính của bản sao rẽ nhánh của kho lưu trữ câu chuyện của riêng tôi. + +95 +00:07:43,420 --> 00:07:50,830 +Vì vậy, khi tôi thực hiện những thay đổi đó, thì chúng ta có thể xem giao diện hiện tại của nó dưới biểu đồ. + +96 +00:07:50,930 --> 00:08:01,600 +Nếu chúng ta nhìn vào mạng, bạn có thể thấy rằng đây là điểm tôi rẽ nhánh kho lưu trữ câu chuyện và cam kết đó được + +97 +00:08:01,630 --> 00:08:08,150 +tạo bởi Angela Yu, về cơ bản đã hợp nhất nhánh này với nhánh chính. + +98 +00:08:08,150 --> 00:08:09,200 +Vì vậy, chúng tôi đã làm điều đó. + +99 +00:08:09,200 --> 00:08:11,030 +Hai bài học trở lại, nếu bạn nhớ. + +100 +00:08:11,450 --> 00:08:15,590 +Mặc dù vậy, cam kết mới nhất được thực hiện bởi người dùng hiện tại này. + +101 +00:08:15,620 --> 00:08:23,300 +Guilfoyle là tên khác của tôi, và bạn có thể thấy rằng tôi đã thêm nó vào nhánh chính của bản sao rẽ nhánh của + +102 +00:08:23,300 --> 00:08:24,680 +kho lưu trữ đó. + +103 +00:08:24,850 --> 00:08:34,580 +Giả sử, nếu bây giờ tôi mở một cửa sổ ẩn danh và đăng nhập lại vào tài khoản Angela và truy cập vào kho lưu trữ câu chuyện đó, bạn có + +104 +00:08:34,580 --> 00:08:43,309 +thể thấy rằng nếu tôi nhìn vào bên trong biểu đồ của mình, hãy truy cập vào mạng mà thay đổi mới nhất đó, nó không được + +105 +00:08:43,309 --> 00:08:46,730 +phản ánh trên chi nhánh chính của tôi. + +106 +00:08:46,760 --> 00:08:54,800 +Nó hiển thị dưới dạng một nhánh riêng biệt được tạo bởi Guilfoyle là tên khác của tôi và bạn có thể thấy các thành viên đã phân + +107 +00:08:54,800 --> 00:08:56,810 +nhánh kho lưu trữ của bạn. + +108 +00:08:57,060 --> 00:09:03,920 +Đây là một cách tuyệt vời để cộng tác vì bạn có thể có những người đóng góp, thực hiện các chỉnh sửa hoặc thêm + +109 +00:09:03,920 --> 00:09:08,000 +các tính năng mới vào cơ sở mã hoặc kho lưu trữ có sẵn của bạn. + +110 +00:09:08,210 --> 00:09:14,060 +Và bây giờ tôi có thể làm gì nếu quay lại tài khoản Guilfoyle. + +111 +00:09:14,700 --> 00:09:20,550 +Vì vậy, tôi sẽ lướt qua hai điều này để bạn có thể thấy ngay bây giờ tôi đang ở trong tài khoản + +112 +00:09:20,550 --> 00:09:23,880 +Guilfoyle và đây là tài khoản Angela Bauer. + +113 +00:09:24,180 --> 00:09:29,820 +Bây giờ, với tài khoản Guilfoyle, điều tôi có thể làm là thực hiện yêu cầu kéo. + +114 +00:09:29,860 --> 00:09:31,620 +Chúng ta có thể làm điều đó ở đây. + +115 +00:09:31,650 --> 00:09:34,200 +Và bạn có thể thấy rằng nó có thể hợp nhất. + +116 +00:09:34,410 --> 00:09:36,570 +Và đây là những thay đổi. + +117 +00:09:36,570 --> 00:09:40,350 +Vì vậy, hoán đổi từ đó cho từ đó, hoán đổi từ đó cho cụm từ đó. + +118 +00:09:40,760 --> 00:09:49,260 +Bây giờ, tất cả những gì tôi phải làm là nhấn, tạo, kéo yêu cầu và nói với tác giả ban đầu, đó là Angela Bauer, + +119 +00:09:49,260 --> 00:09:58,620 +những gì tôi đã làm, tại sao tôi nghĩ rằng các sửa đổi hoặc tính năng của tôi xứng đáng được hợp nhất với kho lưu trữ + +120 +00:09:58,620 --> 00:10:00,180 +ban đầu. + +121 +00:10:00,180 --> 00:10:01,070 +Và bạn biết đấy. + +122 +00:10:01,080 --> 00:10:02,070 +Có ghi chú nào khác không, phải không? + +123 +00:10:02,070 --> 00:10:04,050 +Bất kỳ ý kiến khác mà tôi có? + +124 +00:10:04,530 --> 00:10:06,120 +Ừm, cứ nói đi. + +125 +00:10:09,500 --> 00:10:10,880 +Luôn luôn giúp được miễn phí. + +126 +00:10:10,910 --> 00:10:14,570 +Bây giờ hãy tiếp tục và tạo một yêu cầu kéo. + +127 +00:10:17,120 --> 00:10:18,920 +Yêu cầu kéo được thực hiện. + +128 +00:10:18,920 --> 00:10:27,620 +Nhưng nếu chúng ta xem lại kho truyện, bạn có thể thấy rằng những thay đổi đó không được thực hiện đúng. + +129 +00:10:27,620 --> 00:10:30,200 +Đó là bởi vì tôi không sở hữu kho lưu trữ này. + +130 +00:10:30,200 --> 00:10:36,410 +Tôi không có quyền ghi, chỉ có quyền đọc với tư cách là thành viên của công chúng và không phải là thành viên + +131 +00:10:36,410 --> 00:10:38,870 +của vòng tròn bên trong đáng tin cậy. + +132 +00:10:38,960 --> 00:10:42,680 +Vì vậy, tôi chỉ có thể đề xuất những thay đổi của mình. + +133 +00:10:43,100 --> 00:10:48,860 +Nếu chúng ta quay lại tài khoản Angela Bower, người sở hữu kho lưu trữ này. + +134 +00:10:49,610 --> 00:10:56,150 +Bây giờ, nếu tôi xem xét các yêu cầu kéo, tôi có một yêu cầu kéo hoàn toàn mới, phải không? + +135 +00:10:56,150 --> 00:11:01,940 +Vì vậy, trước đây nó bằng 0, nhưng bây giờ tôi có một và nó đang hiển thị dưới dạng một yêu cầu kéo mở. + +136 +00:11:01,940 --> 00:11:04,790 +Và điều này được thêm vào một phút trước bởi. + +137 +00:11:04,790 --> 00:11:12,380 +Guilfoyle Và nếu tôi nhìn vào nó, tôi có thể hiểu tại sao anh ấy nghĩ rằng sửa đổi này là cần thiết và thông điệp + +138 +00:11:12,380 --> 00:11:14,030 +cam kết của anh ấy là gì. + +139 +00:11:14,030 --> 00:11:21,240 +Và tôi cũng có thể xem các cam kết mà anh ấy đã thực hiện và so sánh sự khác biệt. + +140 +00:11:21,240 --> 00:11:27,960 +Vì vậy, hãy xem lại những thay đổi đó để tôi có thể nói điều gì đó như bạn làm rất tốt. + +141 +00:11:28,530 --> 00:11:31,830 +Guilfoyle Và tôi có thể gửi phản hồi này tới. + +142 +00:11:31,830 --> 00:11:35,820 +Guilfoyle và phê duyệt hợp nhất những thay đổi này. + +143 +00:11:37,870 --> 00:11:50,050 +Bây giờ tất cả những gì tôi phải làm là nhấn, hợp nhất, kéo yêu cầu và có thể thêm một hợp nhất từ các sửa đổi của guilfoyle + +144 +00:11:50,050 --> 00:11:52,330 +vào chương bốn. + +145 +00:11:52,840 --> 00:11:56,440 +Được rồi, vậy hãy tiếp tục và xác nhận việc hợp nhất. + +146 +00:11:57,350 --> 00:12:03,290 +Và bây giờ bạn có thể thấy rằng cam kết đó đã được thêm vào Angela Bower, chủ nhân. + +147 +00:12:03,320 --> 00:12:06,800 +Vì vậy, nếu tôi có một cái nhìn bên trong đồ thị của tôi bây giờ. + +148 +00:12:09,230 --> 00:12:15,110 +Bạn có thể thấy rằng cam kết mới nhất là sự hợp nhất của tôi và bạn có thể biết nó đến từ đâu. + +149 +00:12:15,110 --> 00:12:21,230 +Nó đến từ một nhánh rẽ do Guilfoyle tạo ra, hiển thị dưới dạng một nhánh riêng biệt, sau đó nó được hợp + +150 +00:12:21,230 --> 00:12:24,230 +nhất trở lại nhánh chính của kho lưu trữ chính. + +151 +00:12:24,440 --> 00:12:31,340 +Vì vậy, một số người sử dụng GitHub hoàn toàn làm kiểm soát phiên bản cho các dự án của riêng họ và sử dụng một số tính năng mà chúng + +152 +00:12:31,340 --> 00:12:33,560 +ta đã thảo luận trong các bài học trước. + +153 +00:12:33,560 --> 00:12:43,580 +Nhưng cũng có một cộng đồng khổng lồ gồm các lập trình viên tuyệt vời ở đây, những người đã tạo ra các dự án thực sự xuất sắc và nếu bạn có thể tìm ra cách + +154 +00:12:43,580 --> 00:12:51,200 +cải thiện hoặc đóng góp cho dự án đó, thì đó là một cách tuyệt vời để bắt đầu học cách làm việc trong một nhóm lập trình + +155 +00:12:51,200 --> 00:12:57,590 +viên. là một kỹ năng thực sự cần thiết khi bạn đang làm việc cho một công ty mới thành lập hoặc cho + +156 +00:12:57,590 --> 00:12:59,180 +một công ty. + +157 +00:12:59,780 --> 00:13:08,180 +Vì vậy, ví dụ, nếu chúng ta xem kho lưu trữ Alamofire, nếu bạn xem các đóng góp, bạn có thể thấy rằng đã có + +158 +00:13:08,180 --> 00:13:15,090 +rất nhiều người dùng khác đã xem mã và thực hiện mọi thứ, bạn biết đấy, hoặc đưa ra các + +159 +00:13:15,090 --> 00:13:22,110 +đề xuất và để cải thiện đều đặn khuôn khổ này mà bạn biết đấy, mọi người khác đều được hưởng + +160 +00:13:22,110 --> 00:13:23,990 +lợi, phải không? + +161 +00:13:24,000 --> 00:13:32,130 +Bạn có thể thấy rằng có tổng cộng 4300 nhánh đã được thực hiện và hiện tại có 4 yêu cầu kéo đang + +162 +00:13:32,130 --> 00:13:35,580 +mở, nhưng 559 yêu cầu kéo đã bị đóng. + +163 +00:13:35,580 --> 00:13:37,020 +Vì vậy, chúng ta hãy có một cái nhìn. + +164 +00:13:37,020 --> 00:13:43,290 +Vì vậy, ví dụ, trong trường hợp này, anh chàng này đã cập nhật Readme lên phiên bản hiện tại. + +165 +00:13:43,290 --> 00:13:48,570 +Vì vậy, đó rõ ràng chỉ là chỉnh sửa một tệp văn bản và điều đó gần như nằm trong khả năng của bất kỳ ai, phải + +166 +00:13:48,570 --> 00:13:49,050 +không? + +167 +00:13:49,050 --> 00:13:55,680 +Và sau đó nó được hợp nhất bởi ai đó sở hữu kho lưu trữ này và họ đã cung cấp cho họ một chút phản hồi. + +168 +00:13:55,680 --> 00:13:56,130 +Phải? + +169 +00:13:56,130 --> 00:14:02,940 +Nhưng có những thứ khác, bạn biết đấy, thêm mã hoặc xóa mã hoặc sửa đổi mà mọi người đã thực + +170 +00:14:02,940 --> 00:14:03,690 +hiện. + +171 +00:14:03,690 --> 00:14:08,640 +Vì vậy, anh chàng này đã thực hiện một số sửa chữa và anh ta đã ghi lại. + +172 +00:14:08,640 --> 00:14:09,480 +Mục tiêu là gì? + +173 +00:14:09,480 --> 00:14:13,230 +Các chi tiết triển khai là gì, các thử nghiệm mà anh ấy đã thực hiện là gì? + +174 +00:14:13,230 --> 00:14:18,360 +Và sau đó người sở hữu kho lưu trữ nói, này, bạn biết đấy, có thể một điều mà bạn + +175 +00:14:18,360 --> 00:14:19,320 +cần thay đổi. + +176 +00:14:19,320 --> 00:14:20,310 +Có một cái nhìn ở đây. + +177 +00:14:20,310 --> 00:14:25,410 +Và sau khi nó được thay đổi, thì nó đã được phê duyệt và hợp nhất với nhánh chính. + +178 +00:14:25,560 --> 00:14:31,380 +Hãy xem qua GitHub và xem một số dự án thú vị mà bạn có thể tham gia ngay + +179 +00:14:31,380 --> 00:14:32,910 +từ đầu là gì. + +180 +00:14:33,000 --> 00:14:38,430 +Hãy xem các thư viện mà bạn đang sử dụng và nếu muốn, bạn có thể xây dựng trên thư viện đó, cho + +181 +00:14:38,430 --> 00:14:40,770 +các mục tiêu và mục đích của riêng bạn. + +182 +00:14:40,770 --> 00:14:45,930 +Nhưng bạn cũng biết đấy, nếu bạn đang xây dựng dựa trên mã nguồn mở của người khác, + +183 +00:14:45,930 --> 00:14:53,610 +thì thật tuyệt khi đóng góp lại cho thế giới nguồn mở bằng cách rẽ nhánh và đưa ra yêu cầu kéo để cung cấp các cải tiến + +184 +00:14:53,610 --> 00:14:56,760 +hoặc sửa lỗi hoặc tính năng mới của bạn . + +185 +00:14:56,790 --> 00:15:05,700 +Như tôi đã nói, nó gần giống như một mạng xã hội dành cho các lập trình viên và bạn có thể kết bạn với rất nhiều người bạn tuyệt vời trên đây và bạn + +186 +00:15:05,700 --> 00:15:11,430 +cũng có thể nhận được rất nhiều sự trợ giúp trên đây trong hành trình phát triển của mình. + +187 +00:15:11,880 --> 00:15:17,040 +Vì vậy, tôi hy vọng bạn thích tất cả những điều đó và tôi sẽ gặp lại bạn trong bài học tiếp theo. + diff --git a/part3/70 - Day 70 - Advanced - Git, Github and Version Control/external-links.txt b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..99e1bfa0fb88e13daf524871bddeefc439c58db8 --- /dev/null +++ b/part3/70 - Day 70 - Advanced - Git, Github and Version Control/external-links.txt @@ -0,0 +1,15 @@ + +002 Git-for-Windows-incl.Bash- +https://gitforwindows.org/ + +004 Command-Line-Lesson-from-Day-54 +https://www.udemy.com/course/100-days-of-code/learn/lecture/21928134#overview + +006 Useful.gitignore-templates +https://github.com/github/gitignore + +007 Beginner-friendly-repos +https://github.com/MunGell/awesome-for-beginners + +007 Wordle-Game-in-Python-ritik48- +https://github.com/ritik48/Wordle-Game diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/001 Day 71 Goals - Learn to Deploy Your Website.mp4 b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/001 Day 71 Goals - Learn to Deploy Your Website.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5564b40775a2640051e09df175e5b439f27136d6 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/001 Day 71 Goals - Learn to Deploy Your Website.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b4902b4f791d8430f88c48a72799d92f40cb3a2b67da30cf21ff43d9802f6c5 +size 6361103 diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/001 Day 71 Goals - Learn to Deploy Your Website_vi.srt b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/001 Day 71 Goals - Learn to Deploy Your Website_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a8514013f91e4bbe665f51eef23a7ee765fd5573 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/001 Day 71 Goals - Learn to Deploy Your Website_vi.srt @@ -0,0 +1,64 @@ +1 +00:00:01,240 --> 00:00:05,560 +Xin chào các bạn, chào mừng đến với ngày thứ 70 của 100 ngày viết mã. + +2 +00:00:06,400 --> 00:00:13,180 +Bây giờ, hôm nay là thời điểm quan trọng trong hành trình học cách xây dựng trang web của chúng tôi vì + +3 +00:00:13,180 --> 00:00:18,130 +cuối cùng chúng tôi cũng sẽ xuất bản trang web Flask của mình lên Internet. + +4 +00:00:19,220 --> 00:00:25,850 +Và để làm được điều này, chúng tôi sẽ sử dụng sự trợ giúp của một số công cụ, + +5 +00:00:25,850 --> 00:00:34,610 +bao gồm Git và GitHub, Heroku và một thứ gọi là gunicorn. Và với sức mạnh của họ kết hợp, chúng tôi sẽ kết thúc với việc trang web + +6 +00:00:34,610 --> 00:00:39,170 +của chúng tôi được lưu trữ trực tiếp trên Internet với URL mà chúng tôi có thể + +7 +00:00:39,170 --> 00:00:41,930 +chia sẻ với bất kỳ ai trên thế giới và + +8 +00:00:42,200 --> 00:00:49,250 +họ sẽ có thể truy cập và sử dụng trang web blog của chúng tôi mà chúng tôi đã trải qua thời gian dài xây dựng và + +9 +00:00:49,250 --> 00:00:49,940 +hoàn thiện. + +10 +00:00:51,350 --> 00:00:58,460 +Và thậm chí bạn sẽ có thể tải nó lên điện thoại của mình và xem nó trong vinh quang đầy đủ của nó. + +11 +00:00:59,040 --> 00:01:05,780 +Và trên đường đi, chúng ta sẽ tìm hiểu về kiểm soát phiên bản bằng công nghệ gọi là git. + +12 +00:01:06,440 --> 00:01:13,190 +Và chúng tôi cũng sẽ nâng cấp cơ sở dữ liệu của mình từ một thứ phù hợp hơn với sự + +13 +00:01:13,190 --> 00:01:14,630 +phát triển đó là + +14 +00:01:15,050 --> 00:01:21,220 +SQLite và chúng tôi sẽ thực hiện bước tiếp theo, làm cho nó sẵn sàng sản xuất bằng PostgreSQL. + +15 +00:01:23,630 --> 00:01:25,430 +Vì vậy, đó là tất cả vẫn chưa đến. + +16 +00:01:25,670 --> 00:01:31,820 +Vì vậy, nếu bạn chuyển sang bài học tiếp theo, hãy bắt đầu bằng cách tìm hiểu về Git và kiểm soát phiên bản. + diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/002 Add a .gitignore file (or download the starting files).html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/002 Add a .gitignore file (or download the starting files).html new file mode 100644 index 0000000000000000000000000000000000000000..d46cf2e95b30a6de0d99db54d3dd7a3a1310756c --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/002 Add a .gitignore file (or download the starting files).html @@ -0,0 +1,12 @@ +

You can continue with your own code from the previous day or download the starting .zip files from this lesson. If you are using your own code you need to make two changes.

Add a .gitignore file to your project

Include the .gitignore from the starting project that you can download from this lesson's resources. That way you won't be uploading any unnecessary files to Github during the next lessons. For example, we won't be uploading our posts.db, the venv folder, or the hidden PyCharm .idea folder.


Install the required packages (and versions)

If you're using your own project, replace the requirements.txt with the one from the starting files. That way the version numbers of the packages match what what I've used for deployment and you'll avoid deployment errors. For example, the very latest (minor) version of Flask was not available on render.com.

Note, the requirements.txt also includes two additional packages gunicorn and psycopg2-binary which we'll be using in the next lessons.


Bootstrap_Flask==2.3.3
+Flask_CKEditor==0.5.1
+Flask_Login==0.6.3
+Flask-Gravatar==0.5.0
+Flask_WTF==1.2.1
+WTForms==3.0.1
+Werkzeug==3.0.0
+Flask==2.3.2
+flask_sqlalchemy==3.1.1
+SQLAlchemy==2.0.25
+gunicorn==21.2.0
+psycopg2-binary==2.9.9



\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/002 day-71-starting-files-blog-for-deployment.zip b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/002 day-71-starting-files-blog-for-deployment.zip new file mode 100644 index 0000000000000000000000000000000000000000..abeb22dd5c8c3804a3e7c7b7509b1c6b1052895d --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/002 day-71-starting-files-blog-for-deployment.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7259ab046f3b8b7823d4c99f0f7a51fffd98d429a73321d7f46d8681605f89d3 +size 2591432 diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/003 Use git to add version control to your project.html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/003 Use git to add version control to your project.html new file mode 100644 index 0000000000000000000000000000000000000000..dfa8ccb06fdf51ca9ad400821b71d81ecf3ddb8d --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/003 Use git to add version control to your project.html @@ -0,0 +1 @@ +

So now that you've seen the power of Git and GitHub, it's time to put our blog project under version control. We're going to see how you can do this within the PyCharm GUI.

1. You can either use the final version of your blog project, or download a fresh, completed copy from the previous lesson's resources.


2. Open the project in Pycharm and run it to make sure that everything is working as expected. If you downloaded my version, then install all the required packages. An admin user is already registered in the database:


Admin account email: admin@email.com

Admin account password: asdf


Let's put our project under version control. You can do this using the Terminal or the graphical user interface (GUI).

Enable Version Control Integration in PyCharm

3. Enable git as your local version control system. In the PyCharm GUI go to VCS -> Enable Version Control Integration. This is equivalent to typing git init in the Terminal.


Make sure that you select Git when asked which version control system to use:

If successful, you should now have a new Git Pane where you can see the Git Console and Git Logs.

Add the Unversioned Files and Commit

All the files in our project will turn red because they are not yet added to the staging area to be tracked by git.

4. Add and commit your files to version control using the Commit tool. The files and folders (e.g., PyCharm's .idea folder) listed in the .gitignore file will be excluded.  The Commit tool window will become visible on the side after you've enabled version control.

Add all the unversioned files, write your commit message and click "commit".

All the tracked files should now no longer be red.

If successful, you should now be able to see your first commit in the Git Log pane:





\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/004 Use environment variables to store sensitive information.html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/004 Use environment variables to store sensitive information.html new file mode 100644 index 0000000000000000000000000000000000000000..a90b49a290d51c6d0d34d4942b1acf7cbccd2c9e --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/004 Use environment variables to store sensitive information.html @@ -0,0 +1,2 @@ +

We don't want any configuration details and sensitive data inside our main.py. This means replacing code like this:

app.config['SECRET_KEY'] = '8BYkEfBA6O6donzWlSihBXox7C0sKR6b'

with code that looks like this:

app.config['SECRET_KEY'] = os.environ.get('FLASK_KEY')

where "FLASK_KEY" is the name of your environment variable. We covered environment variables in day 35.


1. Import the os module.

import os


2. Use an environment variable everywhere you have a line that reads app.config['...']

For example the Flask configuration:

app.config['SECRET_KEY'] = '8BYkEfBA6O6donzWlSihBXox7C0sKR6b'

should read:

app.config['SECRET_KEY'] = os.environ.get('FLASK_KEY')


3. And the SQLAlchemy configuration

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts.db'

should read:

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get("DB_URI", "sqlite:///posts.db")

4. If you are using a working contact form, then make sure you get your email and password via an environment variable as well.


5. Finally, set your app.run(debug=True) to


if __name__ == "__main__":
+    app.run(debug=False)
\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/005 Setup a WSGI server with gunicorn.html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/005 Setup a WSGI server with gunicorn.html new file mode 100644 index 0000000000000000000000000000000000000000..093990c67da47c00f54dff1f80ff101de579d523 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/005 Setup a WSGI server with gunicorn.html @@ -0,0 +1 @@ +

You might recall that every time we ran our app, we got a warning telling us that when we want to make our website go live and go from development to production mode that we should use a WSGI server.



WSGI stands for Web Server Gateway Interface and it's described here: https://www.python.org/dev/peps/pep-3333/

In summary: normal web servers can't run Python applications, so a special type of server was created (WSGI) to run our Flask app.  Essentially, a WSGI server standardises the language and protocols between our Python Flask application and the host server.

There are many WSGIs to choose from, but we'll use the most popular - gunicorn. That way our hosting provider will call gunicorn to run our code.


Add gunicorn to the requirements.txt


1. Check if you have the gunicorn package included in your requirements.txt. If you are using the starting code for this section, you should see it listed. If you are using your own code, add gunicorn==21.2.0 to your requirements.txt.


The format for all the packages in the requirements.txt is:

gunicorn==<version number>


Next, we need to tell our hosting provider about our gunicorn server, what our app is called, and how to run our Flask app. We do that using a config file called a Procfile.


Create a Procfile


3. Create a new file in the project top-level folder called Procfile. When you create the new file, PyCharm will prompt you to track the new file under git version control. Agree by clicking add.

NOTE: make sure you spell the name of the file exactly as you see above, with a capital P and no file extension.

Type the following into the Procfile:


web: gunicorn main:app


This will tell our hosting provider to create a web worker that is able to receive HTTP requests. The Procfile also says to use gunicorn to serve your web app. And finally it specifies the Flask app object is the main.py file. That way the hosting provider knows about the entry point for the app and what our app is called.


NOTE: If your app is not inside a file called main.py then you should change main to your file name.


Commit your changes


4. At this point you made some changes in the main.py with your environment variables and created a new file in the project. Go to the Commit Tool and save your changes under version control.

\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/006 Push to your remote on Github.html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/006 Push to your remote on Github.html new file mode 100644 index 0000000000000000000000000000000000000000..e33a7b5a58ff49a0c5b82125974e9bb3d4620a86 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/006 Push to your remote on Github.html @@ -0,0 +1 @@ +

Link PyCharm with GitHub

1. If you don't already have a GitHub account, sign up to GitHub now.

2. Go to your PyCharm settings, search "github" and link Pycharm with GitHub.


You should see you account linked like this:


Push to your remote on GitHub


Once you start using git for version control, PyCharm will change the VCS menu to read "Git" instead. Go to Git -> GitHub -> Share project on Github. This will push your code to your remote.

Pick your repository name (any name will do). And click "Share".

You should then see your project as a GitHub's website.

\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/007 Sign up to a hosting provider and create your web service.html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/007 Sign up to a hosting provider and create your web service.html new file mode 100644 index 0000000000000000000000000000000000000000..3a3c8ed776236fb221f79c639889387dc6968761 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/007 Sign up to a hosting provider and create your web service.html @@ -0,0 +1 @@ +

Create an account with a hosting provider

There are many different hosting providers to choose from when it comes to making your app go live on the internet. Features and pricing vary between them and their pricing plans can change. It's up to you who you want to choose. For this tutorial, I will show you how to host on render.com


Provider                   ~Cost / Month           Name of Plan

Heroku                                $5                      Eco & Basic

render                                  $0                      Individual

Cyclic                                   $0                      Free Forever

Glitch                                   $0                      Starter

Vercel                                  $0                       Hobby

PythonAnywhere              $0                       Beginner 


The nice thing about most of these providers is that they can easily deploy your app straight from a GitHub repo. We've done most of the difficult bits already. There are just a few steps left:

1. Create an account with the hosting provider

2. Link our GitHub repo with the host

3. Set up a PostgreSQL database with the host

4. Store the key-value pairs for our environment variables with our host


Create an account e.g., on render.com


Heroku discontinued their free plan, but other providers are still offering one. You can create an account on render.com simply by signing up via Github.


Click "authorize" and confirm your email address. Job done.

Create a new Web Service


Choose your blog app that you've uploaded to GitHub and connect your repo

Edit the Start Command

Most of render.com's defaults are fine. All you need to do is pick a name for your project and then change the Start Command to:

gunicorn main:app



Add your first environment variable

Before you create your web service, click "Advanced" and add your environment variable your Flask app.

Scroll to the bottom and create your web service.

Your web app won't work yet, however. We first need to set up our database and set the environment variable for SQLAlchemy.

\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/008 Course-Fixes-Report-an-Issue.url b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/008 Upgrade SQLite Database to PostgreSQL.html b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/008 Upgrade SQLite Database to PostgreSQL.html new file mode 100644 index 0000000000000000000000000000000000000000..ce3cd40d5e170618861f1aabf76f39856b014334 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/008 Upgrade SQLite Database to PostgreSQL.html @@ -0,0 +1 @@ +

Getting a website is not that easy huh?

You might be wondering what else we might possibly need to do after all that. There's just one last thing. When we were coding and testing our Flask website, it was nice to use a simple database like SQLite. But SQLite is a file-based database.

This is its strength and weakness. It's a strength because while we're coding up our database and debugging, it's really useful to be able to open the SQLite file using DB Viewer and see how our data looks.

But it's also a weakness because once it's deployed with a hosting provider (like Heroku or Render) the file locations are shifted around every 24 hours or so. This means that your database might just get wiped every day. That will mean some very unhappy users. (Heroku explainer here).

So we've got to put on our big-boy/big-girl pants and upgrade our simple SQLite database to PosgreSQL, a database that can handle millions of data entries and reliably delivers data to users.

Luckily, because we used SQLAlchemy to create our Flask app, there's nothing we need to change in terms of code. We just need to set up the PostgreSQL database.

Create a new Postgres Database


1. Create a new Postgres database from the website menu.

Next, you will see a form. All you need to do is pick a name for the database and create it.

Copy the internal database URL

Once you've created your database, go and find the Internal Database URL in the Info section. You might have to wait a little while until your database is created.

Afterwards, simply copy this URL. You will shortly use this as an environment variable.

Set your SQLALCHEMY_DATABASE_URI environment variable

Go back to your web service settings called "environment".  Create an environment variable that matches the name of the key you're using in the main.py.

Paste your internal database URL as the key value. It should look something like this:

postgres://example_ig2c_user:u0E_lots_of_Symbols_here@dpg-c_more_symbols3bj85d0-a/example_ig2c

You just need to make one small modification. Change the first part from postgres to postgresql. The URI has to start with "postgresql" because this is required by SQLAlchemy:


postgresql://example_ig2c_user:u0E_lots_of_Symbols_here@dpg-c_more_symbols3bj85d0-a/example_ig2c



How does all this work? SQLite is pre-installed for all Python projects, but here we are using Postgres. The reason we can seamlessly switch from SQLite to Postgres is because we are using the psycopg package in combination with SQLAlchemy. The psycopg module is an incredibly popular PostgreSQL database adapter for Python. (You can see the psycopg package listed in the requirements.txt.)


Whoohoo! Congratulations if you got this far! Your blog should be up and running now. You've got a blank slate so register your first (admin) user and write your first blog post.


Also, check out my hosted example here:

https://blog-deployment.onrender.com/

\ No newline at end of file diff --git a/part3/71 - Day 71 - Advanced - Deploying Your Web Application/external-links.txt b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..39062d29c9524ecd0772bf65b1a8c539b26536d7 --- /dev/null +++ b/part3/71 - Day 71 - Advanced - Deploying Your Web Application/external-links.txt @@ -0,0 +1,3 @@ + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/001 Day 72 Goals what you will make by the end of the day.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/001 Day 72 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..31aa01cb79e62aeac2b4f774e762c76429f6ca73 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/001 Day 72 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Learn Data Exploration with Pandas by Analysing the Post-University Salaries of Graduates by Major

College degrees are very expensive. But, do they pay you back? Choosing Philosophy or International Relations as a major may have worried your parents, but does the data back up their fears? PayScale Inc. did a year-long survey of 1.2 million Americans with only a bachelor's degree. We'll be digging into this data and use Pandas to answer these questions:



Today you'll learn

and so much more! Let's get started!

\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/002 Getting Set Up for Data Science.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/002 Getting Set Up for Data Science.html new file mode 100644 index 0000000000000000000000000000000000000000..711788ccb5a6b0cd8340c62e0ed7d6cd94babcb0 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/002 Getting Set Up for Data Science.html @@ -0,0 +1 @@ +

Introducing the Google Colab Notebook


PyCharm is a fantastic IDE, but when we're exploring and visualising a dataset, you'll find the Python notebook format better suited.

Open your first Google Colab Notebook in through your Google Drive. You can find the Python Notebook under New More Google Colaboratory


If you cannot access the Google Colab Notebooks or would like to run everything locally on your computer, then I recommend installing Anaconda and using the bundled Jupyter Notebook instead. Either way works. Google Colab is essentially just an online version of Jupyter.


How to use a Python Notebook


The notebook is divided into cells. Each cell can be executed individually and the result is automatically printed out below. To execute a cell use the shortcut Shift + Enter.

Note: The Google Colab Notebook will to connect to a Runtime in order to execute any code.


That's pretty much it. Let's get started!


\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/003 Upload the Data and Read the .csv File.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/003 Upload the Data and Read the .csv File.html new file mode 100644 index 0000000000000000000000000000000000000000..aa99dc6cbdfc186bab68208e6d7c4ce28a983051 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/003 Upload the Data and Read the .csv File.html @@ -0,0 +1 @@ +

Download the salaries_by_college_major.csv file from the course resources and add this file to the notebook by dropping it into the sidebar with the little folder icon.


Then import pandas into your notebook and read the .csv file. 

import pandas as pd
df = pd.read_csv('salaries_by_college_major.csv')


You can save yourself some typing by bringing up the autocompletion by using the keyboard shortcuts ctrl + Space (windows) or + Space (Mac).


Now take a look at the Pandas dataframe we've just created with .head(). This will show us the first 5 rows of our dataframe.

df.head() 

Once you hit shift + enter on your keyboard the cell will be evaluated and you should see the output automatically printed below the cell. This feature of automatically printing the output below in a pretty format is what makes the notebook format so lovely to work with.

\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/003 salaries-by-college-major.csv b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/003 salaries-by-college-major.csv new file mode 100644 index 0000000000000000000000000000000000000000..01b2e9f161203e66dec32ee9cee7b2f5bb39de0d --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/003 salaries-by-college-major.csv @@ -0,0 +1,52 @@ +Undergraduate Major,Starting Median Salary,Mid-Career Median Salary,Mid-Career 10th Percentile Salary,Mid-Career 90th Percentile Salary,Group +Accounting,46000.00,77100.00,42200.00,152000.00,Business +Aerospace Engineering,57700.00,101000.00,64300.00,161000.00,STEM +Agriculture,42600.00,71900.00,36300.00,150000.00,Business +Anthropology,36800.00,61500.00,33800.00,138000.00,HASS +Architecture,41600.00,76800.00,50600.00,136000.00,Business +Art History,35800.00,64900.00,28800.00,125000.00,HASS +Biology,38800.00,64800.00,36900.00,135000.00,STEM +Business Management,43000.00,72100.00,38800.00,147000.00,Business +Chemical Engineering,63200.00,107000.00,71900.00,194000.00,STEM +Chemistry,42600.00,79900.00,45300.00,148000.00,STEM +Civil Engineering,53900.00,90500.00,63400.00,148000.00,STEM +Communications,38100.00,70000.00,37500.00,143000.00,HASS +Computer Engineering,61400.00,105000.00,66100.00,162000.00,STEM +Computer Science,55900.00,95500.00,56000.00,154000.00,STEM +Construction,53700.00,88900.00,56300.00,171000.00,Business +Criminal Justice,35000.00,56300.00,32200.00,107000.00,HASS +Drama,35900.00,56900.00,36700.00,153000.00,HASS +Economics,50100.00,98600.00,50600.00,210000.00,Business +Education,34900.00,52000.00,29300.00,102000.00,HASS +Electrical Engineering,60900.00,103000.00,69300.00,168000.00,STEM +English,38000.00,64700.00,33400.00,133000.00,HASS +Film,37900.00,68500.00,33900.00,136000.00,HASS +Finance,47900.00,88300.00,47200.00,195000.00,Business +Forestry,39100.00,62600.00,41000.00,111000.00,Business +Geography,41200.00,65500.00,40000.00,132000.00,HASS +Geology,43500.00,79500.00,45000.00,156000.00,STEM +Graphic Design,35700.00,59800.00,36000.00,112000.00,HASS +Health Care Administration,38800.00,60600.00,34600.00,101000.00,Business +History,39200.00,71000.00,37000.00,149000.00,HASS +Hospitality & Tourism,37800.00,57500.00,35500.00,124000.00,Business +Industrial Engineering,57700.00,94700.00,57100.00,173000.00,STEM +Information Technology (IT),49100.00,74800.00,44500.00,129000.00,STEM +Interior Design,36100.00,53200.00,35700.00,107000.00,HASS +International Relations,40900.00,80900.00,38200.00,157000.00,HASS +Journalism,35600.00,66700.00,38400.00,145000.00,HASS +Management Information Systems (MIS),49200.00,82300.00,45300.00,146000.00,STEM +Marketing,40800.00,79600.00,42100.00,175000.00,Business +Math,45400.00,92400.00,45200.00,183000.00,STEM +Mechanical Engineering,57900.00,93600.00,63700.00,163000.00,STEM +Music,35900.00,55000.00,26700.00,134000.00,HASS +Nursing,54200.00,67000.00,47600.00,98300.00,Business +Nutrition,39900.00,55300.00,33900.00,99200.00,HASS +Philosophy,39900.00,81200.00,35500.00,168000.00,HASS +Physician Assistant,74300.00,91700.00,66400.00,124000.00,STEM +Physics,50300.00,97300.00,56000.00,178000.00,STEM +Political Science,40800.00,78200.00,41200.00,168000.00,HASS +Psychology,35900.00,60400.00,31600.00,127000.00,HASS +Religion,34100.00,52000.00,29700.00,96400.00,HASS +Sociology,36500.00,58200.00,30700.00,118000.00,HASS +Spanish,34000.00,53100.00,31000.00,96400.00,HASS +Source: PayScale Inc.,,,,, \ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/004 Preliminary Data Exploration and Data Cleaning with Pandas.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/004 Preliminary Data Exploration and Data Cleaning with Pandas.html new file mode 100644 index 0000000000000000000000000000000000000000..f1cddf3c561292d95d67a776d18b2dcc3042c69d --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/004 Preliminary Data Exploration and Data Cleaning with Pandas.html @@ -0,0 +1,2 @@ +

Now that we've got our data loaded into our dataframe, we need to take a closer look at it to help us understand what it is we are working with. This is always the first step with any data science project. Let's see if we can answer the following questions: 


We've already used the .head() method to peek at the top 5 rows of our dataframe. To see the number of rows and columns we can use the shape attribute:

df.shape

Do you see 51 rows and 6 columns printed out below the cell? 

We saw that each column had a name. We can access the column names directly with the columns attribute.


Missing Values and Junk Data


Before we can proceed with our analysis we should try and figure out if there are any missing or junk data in our dataframe. That way we can avoid problems later on. In this case, we're going to look for NaN (Not A Number) values in our dataframe. NAN values are blank cells or cells that contain strings instead of numbers. Use the .isna() method and see if you can spot if there's a problem somewhere.

df.isna()

Did you find anything? Check the last couple of rows in the dataframe:

df.tail()

Aha! We have a row that contains some information regarding the source of the data with blank values for all the other other columns.

Delete the Last Row

We don't want this row in our dataframe. There's two ways you can go about removing this row. The first way is to manually remove the row at index 50. The second way is to simply use the .dropna() method from pandas. Let's create a new dataframe without the last row and examine the last 5 rows to make sure we removed the last row:

clean_df = df.dropna()
+clean_df.tail()


\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/005 Accessing Columns and Individual Cells in a Dataframe.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/005 Accessing Columns and Individual Cells in a Dataframe.html new file mode 100644 index 0000000000000000000000000000000000000000..f36de7b6f3284ca107250dca7d5c8f7a6ef71e8d --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/005 Accessing Columns and Individual Cells in a Dataframe.html @@ -0,0 +1 @@ +

Find College Major with Highest Starting Salaries

To access a particular column from a data frame we can use the square bracket notation, like so:

clean_df['Starting Median Salary']

You should see all the values printed out below the cell for just this column:

To find the highest starting salary we can simply chain the .max() method.

clean_df['Starting Median Salary'].max()

The highest starting salary is $74,300. But which college major earns this much on average? For this, we need to know the row number or index so that we can look up the name of the major. Lucky for us, the .idxmax() method will give us index for the row with the largest value.

clean_df['Starting Median Salary'].idxmax()

which is 43. To see the name of the major that corresponds to that particular row, we can use the .loc (location) property.

clean_df['Undergraduate Major'].loc[43]

Here we are selecting both a column ('Undergraduate Major') and a row at index 43, so we are retrieving the value of a particular cell. You might see people using the double square brackets notation to achieve exactly the same thing: 

clean_df['Undergraduate Major'][43]



If you don't specify a particular column you can use the .loc property to retrieve an entire row:

clean_df.loc[43]


Challenge


Now that we've found the major with the highest starting salary, can you write the code to find the following:

I'll provide the solution and the code snippets in the next lesson =) 

\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/006 Solution Highest and Lowest Earning Degrees.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/006 Solution Highest and Lowest Earning Degrees.html new file mode 100644 index 0000000000000000000000000000000000000000..8b85bea8220fd7ff868cf0a3b872b14c039240ed --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/006 Solution Highest and Lowest Earning Degrees.html @@ -0,0 +1,4 @@ +

I hope you gave the last challenge a good go before checking the solution below.


The Highest Mid-Career Salary

print(clean_df['Mid-Career Median Salary'].max())
+print(f"Index for the max mid career salary: {clean_df['Mid-Career Median Salary'].idxmax()}")
+clean_df['Undergraduate Major'][8]

If you have multiple lines in the same cell, only the last one will get printed as an output automatically. If you'd like to see more than one thing printed out, then you still have to use a print statement on the lines above.


The Lowest Starting and Mid-Career Salary

print(clean_df['Starting Median Salary'].min())
+clean_df['Undergraduate Major'].loc[clean_df['Starting Median Salary'].idxmin()]

Here I've nested the code that we've seen in the previous lesson in the same line. We can also use the .loc property to access an entire row. Below I've accessed the row at the index of the smallest mid-career salary:

clean_df.loc[clean_df['Mid-Career Median Salary'].idxmin()]

Sadly, education is actually the degree with the lowest mid-career salary and Spanish is the major with the lowest starting salary.

\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/007 Sorting Values & Adding Columns Majors with the Most Potential vs Lowest Risk.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/007 Sorting Values & Adding Columns Majors with the Most Potential vs Lowest Risk.html new file mode 100644 index 0000000000000000000000000000000000000000..a5b232411b556b73e0e29ff11d8af3cc5118abde --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/007 Sorting Values & Adding Columns Majors with the Most Potential vs Lowest Risk.html @@ -0,0 +1,4 @@ +

Lowest Risk Majors

A low-risk major is a degree where there is a small difference between the lowest and highest salaries. In other words, if the difference between the 10th percentile and the 90th percentile earnings of your major is small, then you can be more certain about your salary after you graduate.

How would we calculate the difference between the earnings of the 10th and 90th percentile? Well, Pandas allows us to do simple arithmetic with entire columns, so all we need to do is take the difference between the two columns:

clean_df['Mid-Career 90th Percentile Salary'] - clean_df['Mid-Career 10th Percentile Salary']

Alternatively, you can also use the .subtract() method.

clean_df['Mid-Career 90th Percentile Salary'].subtract(clean_df['Mid-Career 10th Percentile Salary'])

The output of this computation will be another Pandas dataframe column. We can add this to our existing dataframe with the .insert() method:

spread_col = clean_df['Mid-Career 90th Percentile Salary'] - clean_df['Mid-Career 10th Percentile Salary']
+clean_df.insert(1, 'Spread', spread_col)
+clean_df.head()

The first argument is the position of where the column should be inserted. In our case, it's at position 1, so the second column.


Sorting by the Lowest Spread

To see which degrees have the smallest spread, we can use the .sort_values() method. And since we are interested in only seeing the name of the degree and the major, we can pass a list of these two column names to look at the .head() of these two columns exclusively.

low_risk = clean_df.sort_values('Spread')
+low_risk[['Undergraduate Major', 'Spread']].head()

Does .sort_values() sort in ascending or descending order? To find out, check out the Pandas documentation: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html

You can also bring up the quick documentation with shift + tab on your keyboard directly in the Python notebook.



Challenge


Using the .sort_values() method, can you find the degrees with the highest potential? Find the top 5 degrees with the highest values in the 90th percentile. 

Also, find the degrees with the greatest spread in salaries. Which majors have the largest difference between high and low earners after graduation.

I've got the solution for you in the next lesson.

\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/008 Solution Degrees with the Highest Potential.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/008 Solution Degrees with the Highest Potential.html new file mode 100644 index 0000000000000000000000000000000000000000..1378edf797433f9ba4961d89f8016beff8f518fc --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/008 Solution Degrees with the Highest Potential.html @@ -0,0 +1,3 @@ +

Here's the solution to the challenge from the previous lesson:

Majors with the Highest Potential

highest_potential = clean_df.sort_values('Mid-Career 90th Percentile Salary', ascending=False)
+highest_potential[['Undergraduate Major', 'Mid-Career 90th Percentile Salary']].head()

Majors with the Greatest Spread in Salaries

highest_spread = clean_df.sort_values('Spread', ascending=False)
+highest_spread[['Undergraduate Major', 'Spread']].head()

Notice how 3 of the top 5 are present in both. This means that there are some very high earning Economics degree holders out there, but also some who are not earning as much. It's actually quite interesting to compare these two rankings versus the degrees where the median salary is very high.

\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/009 Grouping and Pivoting Data with Pandas.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/009 Grouping and Pivoting Data with Pandas.html new file mode 100644 index 0000000000000000000000000000000000000000..2ffc93bd38b4b303b550a9c9fc71c5310553e3c4 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/009 Grouping and Pivoting Data with Pandas.html @@ -0,0 +1 @@ +

Often times you will want to sum rows that belong to a particular category. For example, which category of degrees has the highest average salary? Is it STEM, Business or HASS (Humanities, Arts, and Social Science)? 

To answer this question we need to learn to use the .groupby() method. This allows us to manipulate data similar to a Microsoft Excel Pivot Table.

We have three categories in the 'Group' column: STEM, HASS and Business. Let's count how many majors we have in each category:

clean_df.groupby('Group').count()


Mini Challenge

Now can you use the .mean() method to find the average salary by group? 

Here's the solution:


Number formats in the Output

The above is a little hard to read, isn't it? We can tell Pandas to print the numbers in our notebook to look like 1,012.45 with the following line:

pd.options.display.float_format = '{:,.2f}'.format 

Ah, that's better, isn't it?



Extra Credit:

The PayScale dataset used in this lesson was from 2008 and looked at the prior 10 years. Notice how Finance ranked very high on post-degree earnings at the time. However, we all know there was a massive financial crash in that year. Perhaps things have changed. Can you use what you've learnt about web scraping in the prior lessons (e.g., Day 45) and share some updated information from PayScale's website in the comments below? 


\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Course-Fixes-Report-an-Issue.url b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Data-Exploration-Pandas-College-Major-complete.zip b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Data-Exploration-Pandas-College-Major-complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..ca21af095217a8232e333fc9934774cf258907b0 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Data-Exploration-Pandas-College-Major-complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:565cc8a9fd9943efa6860239dacd7dbeb7d22256ce9997e09fba86ba9b42c7ad +size 8822 diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Learning Points & Summary.html b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..31d36dbf5f6a4c2e618d3bddee4a6ec3d6ff91fd --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/010 Learning Points & Summary.html @@ -0,0 +1 @@ +

Today's Learning Points



I've attached the completed notebook to this lesson as a .zip file. If you have any issues, unzip the file, upload it to google drive and open it as a Google Colab Notebook.


\ No newline at end of file diff --git a/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/external-links.txt b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8d33c5f0ecc7ffc4c9635ee159e5ef9cec076690 --- /dev/null +++ b/part3/72 - Day 72 - Advanced - Data Exploration with Pandas College Major v.s. Your Salary/external-links.txt @@ -0,0 +1,3 @@ + +010 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/001 Day 73 Goals what you will make by the end of the day.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/001 Day 73 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..37a58d6bc2c54c834c7498d2c532edd18e650aa6 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/001 Day 73 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Analyse the Popularity of Different Programming Languages over Time


The oldest programming language still in use today is FORTRAN, which was developed in 1957. Since then many other programming languages have been developed. But which programming language is the most popular? Which programming language is the Kim Kardashian of programming languages; the one people just can't stop talking about? 


StackOverflow will help us answer this burning question. Each post on Stack OverFlow comes with a Tag. And this Tag can be the name of a programming language.


To figure out which language is the most popular, all we need to do is count the number of posts on Stack Overflow that are tagged with each language. The language with the most posts wins!


Today you will learn:


Without further ado, let's get started!

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 Download and Open the Starter Notebook.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 Download and Open the Starter Notebook.html new file mode 100644 index 0000000000000000000000000000000000000000..33d070cd7b09806be89b1c18aa5243ec1e6a6c3f --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 Download and Open the Starter Notebook.html @@ -0,0 +1 @@ +

Open the Template

To help you with your Data Science journey I'll provide you with starter notebook which already has some of the sections and challenges laid out. Download the .zip file from this lesson's resources, unzip it, and upload it to Google Drive. There you can open the file as a Colab Notebook.


Import the Data

In this lesson, I've also included a QueryResults.csv file with the Stack Overflow data that we'll be using. Download this .csv and add it to your notebook.


Challenge


For the next steps, let's review the data exploration that we've done yesterday:

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 Programming-Languages-start.ipynb.zip b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 Programming-Languages-start.ipynb.zip new file mode 100644 index 0000000000000000000000000000000000000000..d774d1548959da6af90245c52cc68c84a7d8be90 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 Programming-Languages-start.ipynb.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:362ef8794686026bb9a0d4cd7eac51472e365ea756f4d8a0cc8bac82d46d0c83 +size 3082 diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 QueryResults.csv b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 QueryResults.csv new file mode 100644 index 0000000000000000000000000000000000000000..5e7002796ff0fc98036a609b094e07a1f374cd0f --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/002 QueryResults.csv @@ -0,0 +1,1992 @@ +m,TagName, +"2008-07-01 00:00:00","c#","3" +"2008-08-01 00:00:00","assembly","8" +"2008-08-01 00:00:00","javascript","162" +"2008-08-01 00:00:00","c","85" +"2008-08-01 00:00:00","python","124" +"2008-08-01 00:00:00","perl","28" +"2008-08-01 00:00:00","c#","511" +"2008-08-01 00:00:00","c++","164" +"2008-08-01 00:00:00","java","222" +"2008-08-01 00:00:00","delphi","14" +"2008-08-01 00:00:00","ruby","73" +"2008-08-01 00:00:00","php","161" +"2008-09-01 00:00:00","c","321" +"2008-09-01 00:00:00","delphi","105" +"2008-09-01 00:00:00","assembly","28" +"2008-09-01 00:00:00","javascript","640" +"2008-09-01 00:00:00","java","1137" +"2008-09-01 00:00:00","c#","1649" +"2008-09-01 00:00:00","perl","131" +"2008-09-01 00:00:00","python","542" +"2008-09-01 00:00:00","r","6" +"2008-09-01 00:00:00","c++","755" +"2008-09-01 00:00:00","php","482" +"2008-09-01 00:00:00","ruby","290" +"2008-10-01 00:00:00","delphi","112" +"2008-10-01 00:00:00","java","1153" +"2008-10-01 00:00:00","assembly","15" +"2008-10-01 00:00:00","c#","1989" +"2008-10-01 00:00:00","perl","127" +"2008-10-01 00:00:00","c","303" +"2008-10-01 00:00:00","php","617" +"2008-10-01 00:00:00","python","510" +"2008-10-01 00:00:00","javascript","725" +"2008-10-01 00:00:00","c++","811" +"2008-10-01 00:00:00","ruby","249" +"2008-11-01 00:00:00","assembly","17" +"2008-11-01 00:00:00","c#","1730" +"2008-11-01 00:00:00","python","452" +"2008-11-01 00:00:00","c","259" +"2008-11-01 00:00:00","java","958" +"2008-11-01 00:00:00","delphi","141" +"2008-11-01 00:00:00","c++","735" +"2008-11-01 00:00:00","javascript","579" +"2008-11-01 00:00:00","perl","97" +"2008-11-01 00:00:00","php","504" +"2008-11-01 00:00:00","ruby","160" +"2008-11-01 00:00:00","r","1" +"2008-12-01 00:00:00","javascript","627" +"2008-12-01 00:00:00","assembly","18" +"2008-12-01 00:00:00","c","186" +"2008-12-01 00:00:00","c#","1597" +"2008-12-01 00:00:00","java","832" +"2008-12-01 00:00:00","php","481" +"2008-12-01 00:00:00","c++","633" +"2008-12-01 00:00:00","delphi","134" +"2008-12-01 00:00:00","r","1" +"2008-12-01 00:00:00","python","441" +"2008-12-01 00:00:00","perl","134" +"2008-12-01 00:00:00","ruby","161" +"2009-01-01 00:00:00","delphi","164" +"2009-01-01 00:00:00","r","8" +"2009-01-01 00:00:00","php","636" +"2009-01-01 00:00:00","java","1150" +"2009-01-01 00:00:00","c#","2378" +"2009-01-01 00:00:00","assembly","22" +"2009-01-01 00:00:00","c++","853" +"2009-01-01 00:00:00","c","321" +"2009-01-01 00:00:00","ruby","209" +"2009-01-01 00:00:00","perl","147" +"2009-01-01 00:00:00","swift","1" +"2009-01-01 00:00:00","javascript","792" +"2009-01-01 00:00:00","python","631" +"2009-02-01 00:00:00","javascript","948" +"2009-02-01 00:00:00","perl","165" +"2009-02-01 00:00:00","python","630" +"2009-02-01 00:00:00","c","332" +"2009-02-01 00:00:00","c#","2599" +"2009-02-01 00:00:00","assembly","37" +"2009-02-01 00:00:00","java","1208" +"2009-02-01 00:00:00","c++","845" +"2009-02-01 00:00:00","r","9" +"2009-02-01 00:00:00","ruby","287" +"2009-02-01 00:00:00","delphi","168" +"2009-02-01 00:00:00","swift","1" +"2009-02-01 00:00:00","php","769" +"2009-03-01 00:00:00","assembly","24" +"2009-03-01 00:00:00","javascript","1005" +"2009-03-01 00:00:00","c#","3162" +"2009-03-01 00:00:00","c","430" +"2009-03-01 00:00:00","java","1440" +"2009-03-01 00:00:00","php","904" +"2009-03-01 00:00:00","c++","1056" +"2009-03-01 00:00:00","r","4" +"2009-03-01 00:00:00","perl","139" +"2009-03-01 00:00:00","delphi","162" +"2009-03-01 00:00:00","ruby","330" +"2009-03-01 00:00:00","python","765" +"2009-03-01 00:00:00","swift","1" +"2009-04-01 00:00:00","assembly","49" +"2009-04-01 00:00:00","javascript","1050" +"2009-04-01 00:00:00","python","768" +"2009-04-01 00:00:00","java","1534" +"2009-04-01 00:00:00","delphi","185" +"2009-04-01 00:00:00","c++","1020" +"2009-04-01 00:00:00","c#","3320" +"2009-04-01 00:00:00","c","458" +"2009-04-01 00:00:00","php","968" +"2009-04-01 00:00:00","perl","161" +"2009-04-01 00:00:00","ruby","358" +"2009-04-01 00:00:00","r","12" +"2009-05-01 00:00:00","javascript","1434" +"2009-05-01 00:00:00","assembly","47" +"2009-05-01 00:00:00","delphi","202" +"2009-05-01 00:00:00","c","481" +"2009-05-01 00:00:00","c#","3560" +"2009-05-01 00:00:00","python","999" +"2009-05-01 00:00:00","ruby","402" +"2009-05-01 00:00:00","java","1819" +"2009-05-01 00:00:00","c++","1218" +"2009-05-01 00:00:00","perl","197" +"2009-05-01 00:00:00","php","1183" +"2009-05-01 00:00:00","r","2" +"2009-05-01 00:00:00","swift","2" +"2009-06-01 00:00:00","c","505" +"2009-06-01 00:00:00","java","2115" +"2009-06-01 00:00:00","assembly","49" +"2009-06-01 00:00:00","delphi","222" +"2009-06-01 00:00:00","c++","1253" +"2009-06-01 00:00:00","javascript","1557" +"2009-06-01 00:00:00","perl","247" +"2009-06-01 00:00:00","c#","3885" +"2009-06-01 00:00:00","r","5" +"2009-06-01 00:00:00","php","1580" +"2009-06-01 00:00:00","ruby","433" +"2009-06-01 00:00:00","python","1045" +"2009-06-01 00:00:00","swift","1" +"2009-07-01 00:00:00","c#","4411" +"2009-07-01 00:00:00","assembly","32" +"2009-07-01 00:00:00","c++","1468" +"2009-07-01 00:00:00","python","1162" +"2009-07-01 00:00:00","java","2263" +"2009-07-01 00:00:00","perl","259" +"2009-07-01 00:00:00","c","542" +"2009-07-01 00:00:00","delphi","269" +"2009-07-01 00:00:00","javascript","1750" +"2009-07-01 00:00:00","r","51" +"2009-07-01 00:00:00","ruby","500" +"2009-07-01 00:00:00","php","2035" +"2009-08-01 00:00:00","assembly","48" +"2009-08-01 00:00:00","c","530" +"2009-08-01 00:00:00","delphi","246" +"2009-08-01 00:00:00","javascript","1858" +"2009-08-01 00:00:00","perl","252" +"2009-08-01 00:00:00","java","2193" +"2009-08-01 00:00:00","php","2186" +"2009-08-01 00:00:00","c#","4460" +"2009-08-01 00:00:00","r","47" +"2009-08-01 00:00:00","python","1139" +"2009-08-01 00:00:00","c++","1401" +"2009-08-01 00:00:00","ruby","485" +"2009-08-01 00:00:00","swift","2" +"2009-09-01 00:00:00","java","2264" +"2009-09-01 00:00:00","javascript","1755" +"2009-09-01 00:00:00","c#","4356" +"2009-09-01 00:00:00","c","573" +"2009-09-01 00:00:00","assembly","62" +"2009-09-01 00:00:00","php","2268" +"2009-09-01 00:00:00","c++","1465" +"2009-09-01 00:00:00","perl","250" +"2009-09-01 00:00:00","python","1166" +"2009-09-01 00:00:00","delphi","252" +"2009-09-01 00:00:00","ruby","477" +"2009-09-01 00:00:00","r","138" +"2009-09-01 00:00:00","swift","2" +"2009-10-01 00:00:00","assembly","74" +"2009-10-01 00:00:00","delphi","255" +"2009-10-01 00:00:00","javascript","2044" +"2009-10-01 00:00:00","c++","1689" +"2009-10-01 00:00:00","java","2505" +"2009-10-01 00:00:00","c#","4724" +"2009-10-01 00:00:00","c","775" +"2009-10-01 00:00:00","python","1421" +"2009-10-01 00:00:00","perl","282" +"2009-10-01 00:00:00","php","2364" +"2009-10-01 00:00:00","r","73" +"2009-10-01 00:00:00","ruby","493" +"2009-10-01 00:00:00","swift","1" +"2009-11-01 00:00:00","delphi","274" +"2009-11-01 00:00:00","python","1559" +"2009-11-01 00:00:00","c#","4682" +"2009-11-01 00:00:00","c","967" +"2009-11-01 00:00:00","javascript","2227" +"2009-11-01 00:00:00","assembly","82" +"2009-11-01 00:00:00","c++","1758" +"2009-11-01 00:00:00","go","66" +"2009-11-01 00:00:00","ruby","654" +"2009-11-01 00:00:00","perl","323" +"2009-11-01 00:00:00","php","2690" +"2009-11-01 00:00:00","java","2763" +"2009-11-01 00:00:00","swift","2" +"2009-11-01 00:00:00","r","94" +"2009-12-01 00:00:00","delphi","282" +"2009-12-01 00:00:00","php","2830" +"2009-12-01 00:00:00","assembly","62" +"2009-12-01 00:00:00","java","2690" +"2009-12-01 00:00:00","python","1589" +"2009-12-01 00:00:00","c#","4491" +"2009-12-01 00:00:00","perl","262" +"2009-12-01 00:00:00","c","851" +"2009-12-01 00:00:00","r","80" +"2009-12-01 00:00:00","go","11" +"2009-12-01 00:00:00","javascript","2302" +"2009-12-01 00:00:00","ruby","573" +"2009-12-01 00:00:00","c++","1658" +"2009-12-01 00:00:00","swift","1" +"2010-01-01 00:00:00","javascript","2620" +"2010-01-01 00:00:00","assembly","101" +"2010-01-01 00:00:00","c++","2001" +"2010-01-01 00:00:00","python","1949" +"2010-01-01 00:00:00","c#","5116" +"2010-01-01 00:00:00","go","15" +"2010-01-01 00:00:00","c","982" +"2010-01-01 00:00:00","delphi","303" +"2010-01-01 00:00:00","java","3728" +"2010-01-01 00:00:00","perl","302" +"2010-01-01 00:00:00","ruby","686" +"2010-01-01 00:00:00","php","3439" +"2010-01-01 00:00:00","r","94" +"2010-02-01 00:00:00","assembly","69" +"2010-02-01 00:00:00","c","1036" +"2010-02-01 00:00:00","delphi","283" +"2010-02-01 00:00:00","c#","5105" +"2010-02-01 00:00:00","perl","348" +"2010-02-01 00:00:00","java","3582" +"2010-02-01 00:00:00","go","7" +"2010-02-01 00:00:00","javascript","2640" +"2010-02-01 00:00:00","php","3170" +"2010-02-01 00:00:00","r","122" +"2010-02-01 00:00:00","c++","2277" +"2010-02-01 00:00:00","python","1866" +"2010-02-01 00:00:00","swift","2" +"2010-02-01 00:00:00","ruby","688" +"2010-03-01 00:00:00","assembly","122" +"2010-03-01 00:00:00","javascript","2986" +"2010-03-01 00:00:00","go","8" +"2010-03-01 00:00:00","python","2072" +"2010-03-01 00:00:00","delphi","318" +"2010-03-01 00:00:00","c++","2440" +"2010-03-01 00:00:00","c","1118" +"2010-03-01 00:00:00","c#","6039" +"2010-03-01 00:00:00","java","4448" +"2010-03-01 00:00:00","php","3757" +"2010-03-01 00:00:00","perl","392" +"2010-03-01 00:00:00","ruby","696" +"2010-03-01 00:00:00","r","139" +"2010-04-01 00:00:00","javascript","3003" +"2010-04-01 00:00:00","c","1186" +"2010-04-01 00:00:00","delphi","271" +"2010-04-01 00:00:00","python","1816" +"2010-04-01 00:00:00","c#","5786" +"2010-04-01 00:00:00","assembly","124" +"2010-04-01 00:00:00","php","3651" +"2010-04-01 00:00:00","ruby","753" +"2010-04-01 00:00:00","go","10" +"2010-04-01 00:00:00","java","3889" +"2010-04-01 00:00:00","swift","2" +"2010-04-01 00:00:00","c++","2490" +"2010-04-01 00:00:00","r","160" +"2010-04-01 00:00:00","perl","365" +"2010-05-01 00:00:00","java","4177" +"2010-05-01 00:00:00","assembly","108" +"2010-05-01 00:00:00","c++","2423" +"2010-05-01 00:00:00","delphi","280" +"2010-05-01 00:00:00","javascript","3226" +"2010-05-01 00:00:00","perl","287" +"2010-05-01 00:00:00","c","1180" +"2010-05-01 00:00:00","c#","5939" +"2010-05-01 00:00:00","r","139" +"2010-05-01 00:00:00","php","3997" +"2010-05-01 00:00:00","ruby","776" +"2010-05-01 00:00:00","go","17" +"2010-05-01 00:00:00","swift","1" +"2010-05-01 00:00:00","python","2010" +"2010-06-01 00:00:00","assembly","91" +"2010-06-01 00:00:00","java","4290" +"2010-06-01 00:00:00","c#","6153" +"2010-06-01 00:00:00","javascript","3469" +"2010-06-01 00:00:00","delphi","329" +"2010-06-01 00:00:00","c","1155" +"2010-06-01 00:00:00","go","15" +"2010-06-01 00:00:00","c++","2828" +"2010-06-01 00:00:00","php","4099" +"2010-06-01 00:00:00","perl","409" +"2010-06-01 00:00:00","ruby","853" +"2010-06-01 00:00:00","python","2209" +"2010-06-01 00:00:00","swift","2" +"2010-06-01 00:00:00","r","178" +"2010-07-01 00:00:00","c","1288" +"2010-07-01 00:00:00","c#","6687" +"2010-07-01 00:00:00","php","4610" +"2010-07-01 00:00:00","delphi","334" +"2010-07-01 00:00:00","java","4522" +"2010-07-01 00:00:00","javascript","3874" +"2010-07-01 00:00:00","assembly","98" +"2010-07-01 00:00:00","go","8" +"2010-07-01 00:00:00","r","234" +"2010-07-01 00:00:00","c++","2690" +"2010-07-01 00:00:00","perl","437" +"2010-07-01 00:00:00","python","2596" +"2010-07-01 00:00:00","swift","1" +"2010-07-01 00:00:00","ruby","911" +"2010-08-01 00:00:00","javascript","4001" +"2010-08-01 00:00:00","java","4712" +"2010-08-01 00:00:00","c#","6965" +"2010-08-01 00:00:00","go","13" +"2010-08-01 00:00:00","php","5148" +"2010-08-01 00:00:00","assembly","86" +"2010-08-01 00:00:00","c++","2638" +"2010-08-01 00:00:00","c","1371" +"2010-08-01 00:00:00","ruby","995" +"2010-08-01 00:00:00","perl","548" +"2010-08-01 00:00:00","swift","2" +"2010-08-01 00:00:00","r","283" +"2010-08-01 00:00:00","python","2494" +"2010-08-01 00:00:00","delphi","354" +"2010-09-01 00:00:00","assembly","117" +"2010-09-01 00:00:00","javascript","3999" +"2010-09-01 00:00:00","java","4723" +"2010-09-01 00:00:00","python","2252" +"2010-09-01 00:00:00","delphi","319" +"2010-09-01 00:00:00","c++","2744" +"2010-09-01 00:00:00","c","1382" +"2010-09-01 00:00:00","c#","6405" +"2010-09-01 00:00:00","perl","460" +"2010-09-01 00:00:00","php","4703" +"2010-09-01 00:00:00","go","9" +"2010-09-01 00:00:00","ruby","938" +"2010-09-01 00:00:00","r","236" +"2010-09-01 00:00:00","swift","1" +"2010-10-01 00:00:00","javascript","4119" +"2010-10-01 00:00:00","delphi","361" +"2010-10-01 00:00:00","c","1444" +"2010-10-01 00:00:00","assembly","123" +"2010-10-01 00:00:00","c#","6745" +"2010-10-01 00:00:00","python","2672" +"2010-10-01 00:00:00","go","13" +"2010-10-01 00:00:00","perl","500" +"2010-10-01 00:00:00","php","4523" +"2010-10-01 00:00:00","java","5033" +"2010-10-01 00:00:00","c++","2934" +"2010-10-01 00:00:00","r","214" +"2010-10-01 00:00:00","ruby","926" +"2010-10-01 00:00:00","swift","1" +"2010-11-01 00:00:00","java","5603" +"2010-11-01 00:00:00","assembly","164" +"2010-11-01 00:00:00","c","1676" +"2010-11-01 00:00:00","delphi","390" +"2010-11-01 00:00:00","javascript","4545" +"2010-11-01 00:00:00","perl","466" +"2010-11-01 00:00:00","c++","3374" +"2010-11-01 00:00:00","c#","7324" +"2010-11-01 00:00:00","r","242" +"2010-11-01 00:00:00","php","5125" +"2010-11-01 00:00:00","ruby","929" +"2010-11-01 00:00:00","go","16" +"2010-11-01 00:00:00","swift","1" +"2010-11-01 00:00:00","python","2611" +"2010-12-01 00:00:00","c#","7117" +"2010-12-01 00:00:00","c++","3139" +"2010-12-01 00:00:00","python","2484" +"2010-12-01 00:00:00","assembly","123" +"2010-12-01 00:00:00","java","5682" +"2010-12-01 00:00:00","c","1469" +"2010-12-01 00:00:00","go","18" +"2010-12-01 00:00:00","javascript","4948" +"2010-12-01 00:00:00","delphi","321" +"2010-12-01 00:00:00","ruby","1022" +"2010-12-01 00:00:00","perl","501" +"2010-12-01 00:00:00","swift","2" +"2010-12-01 00:00:00","php","5400" +"2010-12-01 00:00:00","r","223" +"2011-01-01 00:00:00","c","1462" +"2011-01-01 00:00:00","delphi","370" +"2011-01-01 00:00:00","assembly","134" +"2011-01-01 00:00:00","c#","7994" +"2011-01-01 00:00:00","java","6546" +"2011-01-01 00:00:00","go","15" +"2011-01-01 00:00:00","perl","480" +"2011-01-01 00:00:00","javascript","5428" +"2011-01-01 00:00:00","r","250" +"2011-01-01 00:00:00","c++","3501" +"2011-01-01 00:00:00","php","6444" +"2011-01-01 00:00:00","python","2907" +"2011-01-01 00:00:00","swift","3" +"2011-01-01 00:00:00","ruby","1204" +"2011-02-01 00:00:00","javascript","5589" +"2011-02-01 00:00:00","java","6876" +"2011-02-01 00:00:00","c#","8233" +"2011-02-01 00:00:00","go","16" +"2011-02-01 00:00:00","php","6723" +"2011-02-01 00:00:00","assembly","145" +"2011-02-01 00:00:00","c++","3449" +"2011-02-01 00:00:00","c","1641" +"2011-02-01 00:00:00","ruby","1253" +"2011-02-01 00:00:00","perl","483" +"2011-02-01 00:00:00","swift","3" +"2011-02-01 00:00:00","r","322" +"2011-02-01 00:00:00","python","3017" +"2011-02-01 00:00:00","delphi","360" +"2011-03-01 00:00:00","php","8128" +"2011-03-01 00:00:00","assembly","192" +"2011-03-01 00:00:00","python","3751" +"2011-03-01 00:00:00","javascript","6767" +"2011-03-01 00:00:00","c#","9998" +"2011-03-01 00:00:00","c","2109" +"2011-03-01 00:00:00","ruby","1639" +"2011-03-01 00:00:00","c++","4182" +"2011-03-01 00:00:00","delphi","518" +"2011-03-01 00:00:00","java","8482" +"2011-03-01 00:00:00","swift","3" +"2011-03-01 00:00:00","perl","604" +"2011-03-01 00:00:00","go","3" +"2011-03-01 00:00:00","r","422" +"2011-04-01 00:00:00","java","7903" +"2011-04-01 00:00:00","delphi","402" +"2011-04-01 00:00:00","perl","553" +"2011-04-01 00:00:00","c#","9288" +"2011-04-01 00:00:00","c","2042" +"2011-04-01 00:00:00","php","7675" +"2011-04-01 00:00:00","assembly","158" +"2011-04-01 00:00:00","c++","4171" +"2011-04-01 00:00:00","javascript","6880" +"2011-04-01 00:00:00","go","7" +"2011-04-01 00:00:00","r","476" +"2011-04-01 00:00:00","ruby","1477" +"2011-04-01 00:00:00","python","3348" +"2011-04-01 00:00:00","swift","3" +"2011-05-01 00:00:00","c++","3889" +"2011-05-01 00:00:00","assembly","158" +"2011-05-01 00:00:00","c#","10038" +"2011-05-01 00:00:00","java","8576" +"2011-05-01 00:00:00","javascript","7311" +"2011-05-01 00:00:00","delphi","477" +"2011-05-01 00:00:00","go","37" +"2011-05-01 00:00:00","c","1826" +"2011-05-01 00:00:00","ruby","1565" +"2011-05-01 00:00:00","php","8121" +"2011-05-01 00:00:00","swift","1" +"2011-05-01 00:00:00","perl","582" +"2011-05-01 00:00:00","python","3522" +"2011-05-01 00:00:00","r","427" +"2011-06-01 00:00:00","python","3475" +"2011-06-01 00:00:00","c#","9781" +"2011-06-01 00:00:00","assembly","140" +"2011-06-01 00:00:00","javascript","7693" +"2011-06-01 00:00:00","c","1767" +"2011-06-01 00:00:00","c++","3817" +"2011-06-01 00:00:00","perl","570" +"2011-06-01 00:00:00","ruby","1560" +"2011-06-01 00:00:00","delphi","456" +"2011-06-01 00:00:00","java","7926" +"2011-06-01 00:00:00","php","8068" +"2011-06-01 00:00:00","swift","3" +"2011-06-01 00:00:00","go","34" +"2011-06-01 00:00:00","r","444" +"2011-07-01 00:00:00","c#","9620" +"2011-07-01 00:00:00","javascript","8113" +"2011-07-01 00:00:00","java","8172" +"2011-07-01 00:00:00","go","26" +"2011-07-01 00:00:00","c++","3853" +"2011-07-01 00:00:00","php","8728" +"2011-07-01 00:00:00","assembly","141" +"2011-07-01 00:00:00","c","1660" +"2011-07-01 00:00:00","ruby","1583" +"2011-07-01 00:00:00","r","454" +"2011-07-01 00:00:00","perl","661" +"2011-07-01 00:00:00","delphi","430" +"2011-07-01 00:00:00","swift","12" +"2011-07-01 00:00:00","python","3667" +"2011-08-01 00:00:00","assembly","159" +"2011-08-01 00:00:00","go","40" +"2011-08-01 00:00:00","python","3835" +"2011-08-01 00:00:00","javascript","8907" +"2011-08-01 00:00:00","delphi","424" +"2011-08-01 00:00:00","c","1823" +"2011-08-01 00:00:00","c#","10090" +"2011-08-01 00:00:00","c++","3955" +"2011-08-01 00:00:00","java","8703" +"2011-08-01 00:00:00","php","8975" +"2011-08-01 00:00:00","perl","616" +"2011-08-01 00:00:00","ruby","1860" +"2011-08-01 00:00:00","r","586" +"2011-08-01 00:00:00","swift","8" +"2011-09-01 00:00:00","c","1918" +"2011-09-01 00:00:00","python","3522" +"2011-09-01 00:00:00","javascript","8207" +"2011-09-01 00:00:00","delphi","414" +"2011-09-01 00:00:00","assembly","155" +"2011-09-01 00:00:00","ruby","1552" +"2011-09-01 00:00:00","java","8348" +"2011-09-01 00:00:00","c#","9323" +"2011-09-01 00:00:00","c++","3949" +"2011-09-01 00:00:00","swift","6" +"2011-09-01 00:00:00","r","612" +"2011-09-01 00:00:00","php","8106" +"2011-09-01 00:00:00","perl","500" +"2011-09-01 00:00:00","go","26" +"2011-10-01 00:00:00","java","8577" +"2011-10-01 00:00:00","assembly","213" +"2011-10-01 00:00:00","delphi","465" +"2011-10-01 00:00:00","c++","4357" +"2011-10-01 00:00:00","javascript","8045" +"2011-10-01 00:00:00","perl","560" +"2011-10-01 00:00:00","c#","9239" +"2011-10-01 00:00:00","c","2140" +"2011-10-01 00:00:00","go","40" +"2011-10-01 00:00:00","php","8102" +"2011-10-01 00:00:00","r","621" +"2011-10-01 00:00:00","python","3631" +"2011-10-01 00:00:00","ruby","1618" +"2011-10-01 00:00:00","swift","6" +"2011-11-01 00:00:00","assembly","211" +"2011-11-01 00:00:00","javascript","8691" +"2011-11-01 00:00:00","java","9665" +"2011-11-01 00:00:00","c#","9926" +"2011-11-01 00:00:00","delphi","507" +"2011-11-01 00:00:00","c++","4490" +"2011-11-01 00:00:00","c","2202" +"2011-11-01 00:00:00","go","66" +"2011-11-01 00:00:00","php","8721" +"2011-11-01 00:00:00","ruby","1741" +"2011-11-01 00:00:00","perl","610" +"2011-11-01 00:00:00","swift","3" +"2011-11-01 00:00:00","python","3877" +"2011-11-01 00:00:00","r","607" +"2011-12-01 00:00:00","java","9227" +"2011-12-01 00:00:00","php","8377" +"2011-12-01 00:00:00","c#","9338" +"2011-12-01 00:00:00","delphi","574" +"2011-12-01 00:00:00","c","2008" +"2011-12-01 00:00:00","assembly","227" +"2011-12-01 00:00:00","javascript","8347" +"2011-12-01 00:00:00","go","52" +"2011-12-01 00:00:00","r","614" +"2011-12-01 00:00:00","perl","542" +"2011-12-01 00:00:00","c++","4366" +"2011-12-01 00:00:00","python","3627" +"2011-12-01 00:00:00","swift","2" +"2011-12-01 00:00:00","ruby","1690" +"2012-01-01 00:00:00","java","10164" +"2012-01-01 00:00:00","javascript","9616" +"2012-01-01 00:00:00","c#","10477" +"2012-01-01 00:00:00","go","37" +"2012-01-01 00:00:00","assembly","170" +"2012-01-01 00:00:00","php","9362" +"2012-01-01 00:00:00","c++","4553" +"2012-01-01 00:00:00","c","2234" +"2012-01-01 00:00:00","perl","569" +"2012-01-01 00:00:00","r","690" +"2012-01-01 00:00:00","ruby","1910" +"2012-01-01 00:00:00","delphi","514" +"2012-01-01 00:00:00","python","4212" +"2012-01-01 00:00:00","swift","6" +"2012-02-01 00:00:00","assembly","233" +"2012-02-01 00:00:00","javascript","10001" +"2012-02-01 00:00:00","python","4498" +"2012-02-01 00:00:00","java","10981" +"2012-02-01 00:00:00","delphi","472" +"2012-02-01 00:00:00","c++","5115" +"2012-02-01 00:00:00","c#","10778" +"2012-02-01 00:00:00","c","2412" +"2012-02-01 00:00:00","php","9984" +"2012-02-01 00:00:00","perl","615" +"2012-02-01 00:00:00","ruby","2051" +"2012-02-01 00:00:00","go","31" +"2012-02-01 00:00:00","swift","9" +"2012-02-01 00:00:00","r","813" +"2012-03-01 00:00:00","delphi","499" +"2012-03-01 00:00:00","c++","5246" +"2012-03-01 00:00:00","java","12425" +"2012-03-01 00:00:00","assembly","261" +"2012-03-01 00:00:00","c#","11621" +"2012-03-01 00:00:00","c","2739" +"2012-03-01 00:00:00","javascript","10718" +"2012-03-01 00:00:00","php","10937" +"2012-03-01 00:00:00","go","47" +"2012-03-01 00:00:00","perl","609" +"2012-03-01 00:00:00","python","5049" +"2012-03-01 00:00:00","r","889" +"2012-03-01 00:00:00","ruby","2196" +"2012-03-01 00:00:00","swift","4" +"2012-04-01 00:00:00","delphi","482" +"2012-04-01 00:00:00","java","12070" +"2012-04-01 00:00:00","assembly","275" +"2012-04-01 00:00:00","php","10470" +"2012-04-01 00:00:00","c","2671" +"2012-04-01 00:00:00","c++","5316" +"2012-04-01 00:00:00","perl","602" +"2012-04-01 00:00:00","c#","11152" +"2012-04-01 00:00:00","python","4932" +"2012-04-01 00:00:00","javascript","10702" +"2012-04-01 00:00:00","r","843" +"2012-04-01 00:00:00","go","69" +"2012-04-01 00:00:00","ruby","1975" +"2012-04-01 00:00:00","swift","5" +"2012-05-01 00:00:00","assembly","227" +"2012-05-01 00:00:00","c++","4992" +"2012-05-01 00:00:00","c#","11605" +"2012-05-01 00:00:00","java","12214" +"2012-05-01 00:00:00","delphi","481" +"2012-05-01 00:00:00","javascript","11540" +"2012-05-01 00:00:00","go","69" +"2012-05-01 00:00:00","c","2485" +"2012-05-01 00:00:00","perl","649" +"2012-05-01 00:00:00","ruby","1980" +"2012-05-01 00:00:00","php","10982" +"2012-05-01 00:00:00","r","876" +"2012-05-01 00:00:00","swift","6" +"2012-05-01 00:00:00","python","5111" +"2012-06-01 00:00:00","java","11142" +"2012-06-01 00:00:00","go","72" +"2012-06-01 00:00:00","c#","11342" +"2012-06-01 00:00:00","javascript","11265" +"2012-06-01 00:00:00","assembly","203" +"2012-06-01 00:00:00","c","2316" +"2012-06-01 00:00:00","c++","4663" +"2012-06-01 00:00:00","php","10630" +"2012-06-01 00:00:00","python","5286" +"2012-06-01 00:00:00","perl","745" +"2012-06-01 00:00:00","ruby","1891" +"2012-06-01 00:00:00","delphi","418" +"2012-06-01 00:00:00","swift","4" +"2012-06-01 00:00:00","r","974" +"2012-07-01 00:00:00","delphi","442" +"2012-07-01 00:00:00","assembly","201" +"2012-07-01 00:00:00","c++","5289" +"2012-07-01 00:00:00","c","2374" +"2012-07-01 00:00:00","c#","12347" +"2012-07-01 00:00:00","java","12274" +"2012-07-01 00:00:00","python","5738" +"2012-07-01 00:00:00","go","76" +"2012-07-01 00:00:00","javascript","12323" +"2012-07-01 00:00:00","perl","668" +"2012-07-01 00:00:00","swift","6" +"2012-07-01 00:00:00","r","1121" +"2012-07-01 00:00:00","php","11797" +"2012-07-01 00:00:00","ruby","2066" +"2012-08-01 00:00:00","php","11943" +"2012-08-01 00:00:00","assembly","189" +"2012-08-01 00:00:00","c#","11973" +"2012-08-01 00:00:00","go","72" +"2012-08-01 00:00:00","c++","5167" +"2012-08-01 00:00:00","delphi","403" +"2012-08-01 00:00:00","python","5872" +"2012-08-01 00:00:00","c","2322" +"2012-08-01 00:00:00","javascript","12448" +"2012-08-01 00:00:00","perl","769" +"2012-08-01 00:00:00","ruby","2063" +"2012-08-01 00:00:00","java","12275" +"2012-08-01 00:00:00","swift","4" +"2012-08-01 00:00:00","r","1090" +"2012-09-01 00:00:00","javascript","11172" +"2012-09-01 00:00:00","c","2533" +"2012-09-01 00:00:00","c#","11290" +"2012-09-01 00:00:00","assembly","225" +"2012-09-01 00:00:00","java","11635" +"2012-09-01 00:00:00","c++","4917" +"2012-09-01 00:00:00","delphi","385" +"2012-09-01 00:00:00","php","11030" +"2012-09-01 00:00:00","go","130" +"2012-09-01 00:00:00","perl","671" +"2012-09-01 00:00:00","python","5260" +"2012-09-01 00:00:00","r","1060" +"2012-09-01 00:00:00","ruby","1960" +"2012-09-01 00:00:00","swift","7" +"2012-10-01 00:00:00","c#","12741" +"2012-10-01 00:00:00","delphi","478" +"2012-10-01 00:00:00","c++","5918" +"2012-10-01 00:00:00","go","101" +"2012-10-01 00:00:00","javascript","12428" +"2012-10-01 00:00:00","assembly","315" +"2012-10-01 00:00:00","c","3155" +"2012-10-01 00:00:00","python","6138" +"2012-10-01 00:00:00","java","13517" +"2012-10-01 00:00:00","php","11840" +"2012-10-01 00:00:00","swift","4" +"2012-10-01 00:00:00","perl","693" +"2012-10-01 00:00:00","r","1266" +"2012-10-01 00:00:00","ruby","2262" +"2012-11-01 00:00:00","java","13632" +"2012-11-01 00:00:00","assembly","303" +"2012-11-01 00:00:00","c++","6280" +"2012-11-01 00:00:00","c#","12247" +"2012-11-01 00:00:00","c","3198" +"2012-11-01 00:00:00","delphi","444" +"2012-11-01 00:00:00","javascript","12357" +"2012-11-01 00:00:00","go","104" +"2012-11-01 00:00:00","r","1346" +"2012-11-01 00:00:00","perl","640" +"2012-11-01 00:00:00","ruby","2134" +"2012-11-01 00:00:00","php","11837" +"2012-11-01 00:00:00","python","6403" +"2012-11-01 00:00:00","swift","2" +"2012-12-01 00:00:00","java","12451" +"2012-12-01 00:00:00","delphi","429" +"2012-12-01 00:00:00","assembly","264" +"2012-12-01 00:00:00","c#","10966" +"2012-12-01 00:00:00","c","2573" +"2012-12-01 00:00:00","python","5765" +"2012-12-01 00:00:00","go","113" +"2012-12-01 00:00:00","c++","5692" +"2012-12-01 00:00:00","javascript","11751" +"2012-12-01 00:00:00","ruby","1906" +"2012-12-01 00:00:00","php","11127" +"2012-12-01 00:00:00","swift","3" +"2012-12-01 00:00:00","perl","558" +"2012-12-01 00:00:00","r","1216" +"2013-01-01 00:00:00","java","13753" +"2013-01-01 00:00:00","c#","12804" +"2013-01-01 00:00:00","c","2913" +"2013-01-01 00:00:00","c++","6055" +"2013-01-01 00:00:00","assembly","297" +"2013-01-01 00:00:00","delphi","484" +"2013-01-01 00:00:00","go","101" +"2013-01-01 00:00:00","python","6590" +"2013-01-01 00:00:00","perl","668" +"2013-01-01 00:00:00","javascript","13807" +"2013-01-01 00:00:00","r","1511" +"2013-01-01 00:00:00","swift","5" +"2013-01-01 00:00:00","php","12937" +"2013-01-01 00:00:00","ruby","2310" +"2013-02-01 00:00:00","php","12650" +"2013-02-01 00:00:00","assembly","322" +"2013-02-01 00:00:00","c#","12546" +"2013-02-01 00:00:00","go","117" +"2013-02-01 00:00:00","c++","6081" +"2013-02-01 00:00:00","delphi","449" +"2013-02-01 00:00:00","python","6755" +"2013-02-01 00:00:00","c","3102" +"2013-02-01 00:00:00","javascript","13671" +"2013-02-01 00:00:00","perl","755" +"2013-02-01 00:00:00","ruby","2226" +"2013-02-01 00:00:00","java","13757" +"2013-02-01 00:00:00","swift","5" +"2013-02-01 00:00:00","r","1664" +"2013-03-01 00:00:00","delphi","523" +"2013-03-01 00:00:00","assembly","365" +"2013-03-01 00:00:00","go","127" +"2013-03-01 00:00:00","java","15971" +"2013-03-01 00:00:00","c#","14289" +"2013-03-01 00:00:00","c","3453" +"2013-03-01 00:00:00","ruby","2567" +"2013-03-01 00:00:00","c++","7200" +"2013-03-01 00:00:00","php","14242" +"2013-03-01 00:00:00","perl","862" +"2013-03-01 00:00:00","swift","5" +"2013-03-01 00:00:00","javascript","15353" +"2013-03-01 00:00:00","python","7650" +"2013-03-01 00:00:00","r","1853" +"2013-04-01 00:00:00","c#","13960" +"2013-04-01 00:00:00","go","125" +"2013-04-01 00:00:00","python","7965" +"2013-04-01 00:00:00","c++","7171" +"2013-04-01 00:00:00","java","16310" +"2013-04-01 00:00:00","assembly","333" +"2013-04-01 00:00:00","c","3549" +"2013-04-01 00:00:00","perl","853" +"2013-04-01 00:00:00","javascript","15415" +"2013-04-01 00:00:00","delphi","517" +"2013-04-01 00:00:00","ruby","2472" +"2013-04-01 00:00:00","r","1843" +"2013-04-01 00:00:00","swift","6" +"2013-04-01 00:00:00","php","13540" +"2013-05-01 00:00:00","javascript","15106" +"2013-05-01 00:00:00","java","15359" +"2013-05-01 00:00:00","c#","13532" +"2013-05-01 00:00:00","c","3202" +"2013-05-01 00:00:00","php","13224" +"2013-05-01 00:00:00","assembly","301" +"2013-05-01 00:00:00","c++","6864" +"2013-05-01 00:00:00","go","143" +"2013-05-01 00:00:00","ruby","2348" +"2013-05-01 00:00:00","python","7839" +"2013-05-01 00:00:00","swift","1" +"2013-05-01 00:00:00","delphi","539" +"2013-05-01 00:00:00","perl","920" +"2013-05-01 00:00:00","r","1787" +"2013-06-01 00:00:00","delphi","474" +"2013-06-01 00:00:00","java","14003" +"2013-06-01 00:00:00","assembly","299" +"2013-06-01 00:00:00","c#","12835" +"2013-06-01 00:00:00","c","2955" +"2013-06-01 00:00:00","c++","6210" +"2013-06-01 00:00:00","perl","851" +"2013-06-01 00:00:00","python","7618" +"2013-06-01 00:00:00","go","176" +"2013-06-01 00:00:00","javascript","14660" +"2013-06-01 00:00:00","php","12835" +"2013-06-01 00:00:00","ruby","2229" +"2013-06-01 00:00:00","r","1780" +"2013-06-01 00:00:00","swift","3" +"2013-07-01 00:00:00","c++","6593" +"2013-07-01 00:00:00","assembly","299" +"2013-07-01 00:00:00","go","200" +"2013-07-01 00:00:00","c#","14245" +"2013-07-01 00:00:00","php","14466" +"2013-07-01 00:00:00","delphi","509" +"2013-07-01 00:00:00","c","3028" +"2013-07-01 00:00:00","python","8642" +"2013-07-01 00:00:00","javascript","16893" +"2013-07-01 00:00:00","perl","984" +"2013-07-01 00:00:00","java","15263" +"2013-07-01 00:00:00","ruby","2448" +"2013-07-01 00:00:00","r","1978" +"2013-07-01 00:00:00","swift","7" +"2013-08-01 00:00:00","javascript","16893" +"2013-08-01 00:00:00","assembly","214" +"2013-08-01 00:00:00","c","3015" +"2013-08-01 00:00:00","c#","13899" +"2013-08-01 00:00:00","java","15122" +"2013-08-01 00:00:00","php","14460" +"2013-08-01 00:00:00","c++","6267" +"2013-08-01 00:00:00","delphi","450" +"2013-08-01 00:00:00","perl","853" +"2013-08-01 00:00:00","python","7960" +"2013-08-01 00:00:00","r","1926" +"2013-08-01 00:00:00","go","208" +"2013-08-01 00:00:00","ruby","2490" +"2013-08-01 00:00:00","swift","3" +"2013-09-01 00:00:00","java","16330" +"2013-09-01 00:00:00","delphi","489" +"2013-09-01 00:00:00","assembly","293" +"2013-09-01 00:00:00","php","14384" +"2013-09-01 00:00:00","c++","6581" +"2013-09-01 00:00:00","c#","13809" +"2013-09-01 00:00:00","c","3406" +"2013-09-01 00:00:00","go","237" +"2013-09-01 00:00:00","javascript","17796" +"2013-09-01 00:00:00","ruby","2396" +"2013-09-01 00:00:00","perl","706" +"2013-09-01 00:00:00","swift","10" +"2013-09-01 00:00:00","python","7989" +"2013-09-01 00:00:00","r","1717" +"2013-10-01 00:00:00","assembly","381" +"2013-10-01 00:00:00","c++","8005" +"2013-10-01 00:00:00","java","18816" +"2013-10-01 00:00:00","c#","15248" +"2013-10-01 00:00:00","delphi","525" +"2013-10-01 00:00:00","javascript","19827" +"2013-10-01 00:00:00","c","4248" +"2013-10-01 00:00:00","go","212" +"2013-10-01 00:00:00","perl","839" +"2013-10-01 00:00:00","ruby","2792" +"2013-10-01 00:00:00","r","2102" +"2013-10-01 00:00:00","swift","9" +"2013-10-01 00:00:00","php","15484" +"2013-10-01 00:00:00","python","9522" +"2013-11-01 00:00:00","java","18846" +"2013-11-01 00:00:00","c#","14654" +"2013-11-01 00:00:00","go","210" +"2013-11-01 00:00:00","javascript","18586" +"2013-11-01 00:00:00","assembly","419" +"2013-11-01 00:00:00","c++","8164" +"2013-11-01 00:00:00","c","4300" +"2013-11-01 00:00:00","php","15047" +"2013-11-01 00:00:00","python","9522" +"2013-11-01 00:00:00","ruby","2579" +"2013-11-01 00:00:00","perl","838" +"2013-11-01 00:00:00","swift","5" +"2013-11-01 00:00:00","delphi","462" +"2013-11-01 00:00:00","r","2192" +"2013-12-01 00:00:00","assembly","358" +"2013-12-01 00:00:00","delphi","450" +"2013-12-01 00:00:00","c++","7036" +"2013-12-01 00:00:00","c","3509" +"2013-12-01 00:00:00","java","17536" +"2013-12-01 00:00:00","c#","13679" +"2013-12-01 00:00:00","python","8492" +"2013-12-01 00:00:00","go","240" +"2013-12-01 00:00:00","perl","782" +"2013-12-01 00:00:00","javascript","18109" +"2013-12-01 00:00:00","swift","9" +"2013-12-01 00:00:00","r","1911" +"2013-12-01 00:00:00","ruby","2452" +"2013-12-01 00:00:00","php","14577" +"2014-01-01 00:00:00","php","16982" +"2014-01-01 00:00:00","c#","15394" +"2014-01-01 00:00:00","go","303" +"2014-01-01 00:00:00","assembly","339" +"2014-01-01 00:00:00","c++","7717" +"2014-01-01 00:00:00","python","9864" +"2014-01-01 00:00:00","c","3748" +"2014-01-01 00:00:00","delphi","493" +"2014-01-01 00:00:00","javascript","21202" +"2014-01-01 00:00:00","perl","825" +"2014-01-01 00:00:00","java","18767" +"2014-01-01 00:00:00","ruby","2773" +"2014-01-01 00:00:00","r","2357" +"2014-01-01 00:00:00","swift","5" +"2014-02-01 00:00:00","javascript","21267" +"2014-02-01 00:00:00","assembly","375" +"2014-02-01 00:00:00","c","3985" +"2014-02-01 00:00:00","c#","15172" +"2014-02-01 00:00:00","java","19378" +"2014-02-01 00:00:00","php","16739" +"2014-02-01 00:00:00","c++","7707" +"2014-02-01 00:00:00","delphi","492" +"2014-02-01 00:00:00","perl","816" +"2014-02-01 00:00:00","python","9939" +"2014-02-01 00:00:00","r","2621" +"2014-02-01 00:00:00","go","205" +"2014-02-01 00:00:00","ruby","2616" +"2014-02-01 00:00:00","swift","12" +"2014-03-01 00:00:00","assembly","455" +"2014-03-01 00:00:00","c#","16265" +"2014-03-01 00:00:00","python","11468" +"2014-03-01 00:00:00","c++","8701" +"2014-03-01 00:00:00","go","255" +"2014-03-01 00:00:00","java","22109" +"2014-03-01 00:00:00","delphi","441" +"2014-03-01 00:00:00","c","4586" +"2014-03-01 00:00:00","perl","940" +"2014-03-01 00:00:00","javascript","22786" +"2014-03-01 00:00:00","php","18564" +"2014-03-01 00:00:00","ruby","2957" +"2014-03-01 00:00:00","r","2823" +"2014-03-01 00:00:00","swift","4" +"2014-04-01 00:00:00","c","4030" +"2014-04-01 00:00:00","perl","842" +"2014-04-01 00:00:00","c#","15402" +"2014-04-01 00:00:00","delphi","393" +"2014-04-01 00:00:00","java","21020" +"2014-04-01 00:00:00","assembly","364" +"2014-04-01 00:00:00","javascript","21573" +"2014-04-01 00:00:00","go","342" +"2014-04-01 00:00:00","r","2744" +"2014-04-01 00:00:00","php","17908" +"2014-04-01 00:00:00","c++","8162" +"2014-04-01 00:00:00","python","10812" +"2014-04-01 00:00:00","swift","4" +"2014-04-01 00:00:00","ruby","2753" +"2014-05-01 00:00:00","java","18088" +"2014-05-01 00:00:00","delphi","475" +"2014-05-01 00:00:00","c","3284" +"2014-05-01 00:00:00","python","9301" +"2014-05-01 00:00:00","c++","6827" +"2014-05-01 00:00:00","c#","13992" +"2014-05-01 00:00:00","assembly","333" +"2014-05-01 00:00:00","ruby","2684" +"2014-05-01 00:00:00","javascript","19923" +"2014-05-01 00:00:00","go","280" +"2014-05-01 00:00:00","swift","9" +"2014-05-01 00:00:00","perl","819" +"2014-05-01 00:00:00","r","2595" +"2014-05-01 00:00:00","php","14984" +"2014-06-01 00:00:00","java","16016" +"2014-06-01 00:00:00","delphi","415" +"2014-06-01 00:00:00","javascript","18428" +"2014-06-01 00:00:00","python","8954" +"2014-06-01 00:00:00","assembly","273" +"2014-06-01 00:00:00","c#","12599" +"2014-06-01 00:00:00","c","2784" +"2014-06-01 00:00:00","c++","5710" +"2014-06-01 00:00:00","perl","702" +"2014-06-01 00:00:00","php","13212" +"2014-06-01 00:00:00","r","2404" +"2014-06-01 00:00:00","ruby","2341" +"2014-06-01 00:00:00","go","288" +"2014-06-01 00:00:00","swift","2413" +"2014-07-01 00:00:00","javascript","20259" +"2014-07-01 00:00:00","c++","6309" +"2014-07-01 00:00:00","c#","13773" +"2014-07-01 00:00:00","assembly","217" +"2014-07-01 00:00:00","java","17466" +"2014-07-01 00:00:00","c","2848" +"2014-07-01 00:00:00","delphi","446" +"2014-07-01 00:00:00","php","14471" +"2014-07-01 00:00:00","go","454" +"2014-07-01 00:00:00","perl","756" +"2014-07-01 00:00:00","python","9974" +"2014-07-01 00:00:00","r","2646" +"2014-07-01 00:00:00","ruby","2566" +"2014-07-01 00:00:00","swift","1646" +"2014-08-01 00:00:00","delphi","426" +"2014-08-01 00:00:00","java","15837" +"2014-08-01 00:00:00","assembly","183" +"2014-08-01 00:00:00","c#","12578" +"2014-08-01 00:00:00","c","2690" +"2014-08-01 00:00:00","c++","5916" +"2014-08-01 00:00:00","perl","701" +"2014-08-01 00:00:00","go","405" +"2014-08-01 00:00:00","python","9149" +"2014-08-01 00:00:00","javascript","18583" +"2014-08-01 00:00:00","r","2486" +"2014-08-01 00:00:00","php","13372" +"2014-08-01 00:00:00","swift","1703" +"2014-08-01 00:00:00","ruby","2480" +"2014-09-01 00:00:00","c#","12407" +"2014-09-01 00:00:00","assembly","288" +"2014-09-01 00:00:00","c++","6241" +"2014-09-01 00:00:00","python","8807" +"2014-09-01 00:00:00","java","16820" +"2014-09-01 00:00:00","go","392" +"2014-09-01 00:00:00","c","3247" +"2014-09-01 00:00:00","delphi","447" +"2014-09-01 00:00:00","javascript","18235" +"2014-09-01 00:00:00","perl","698" +"2014-09-01 00:00:00","ruby","2282" +"2014-09-01 00:00:00","php","13521" +"2014-09-01 00:00:00","swift","1907" +"2014-09-01 00:00:00","r","2380" +"2014-10-01 00:00:00","c#","12640" +"2014-10-01 00:00:00","javascript","19017" +"2014-10-01 00:00:00","java","18010" +"2014-10-01 00:00:00","go","383" +"2014-10-01 00:00:00","c++","6878" +"2014-10-01 00:00:00","php","13782" +"2014-10-01 00:00:00","assembly","391" +"2014-10-01 00:00:00","c","3819" +"2014-10-01 00:00:00","ruby","2346" +"2014-10-01 00:00:00","perl","660" +"2014-10-01 00:00:00","python","9626" +"2014-10-01 00:00:00","delphi","411" +"2014-10-01 00:00:00","swift","2469" +"2014-10-01 00:00:00","r","2790" +"2014-11-01 00:00:00","java","17956" +"2014-11-01 00:00:00","delphi","430" +"2014-11-01 00:00:00","assembly","389" +"2014-11-01 00:00:00","c#","11944" +"2014-11-01 00:00:00","c++","6596" +"2014-11-01 00:00:00","python","9612" +"2014-11-01 00:00:00","c","3692" +"2014-11-01 00:00:00","ruby","2120" +"2014-11-01 00:00:00","javascript","18069" +"2014-11-01 00:00:00","perl","665" +"2014-11-01 00:00:00","swift","2570" +"2014-11-01 00:00:00","go","338" +"2014-11-01 00:00:00","php","13185" +"2014-11-01 00:00:00","r","2713" +"2014-12-01 00:00:00","c++","6113" +"2014-12-01 00:00:00","assembly","329" +"2014-12-01 00:00:00","c#","11167" +"2014-12-01 00:00:00","go","351" +"2014-12-01 00:00:00","php","12513" +"2014-12-01 00:00:00","delphi","317" +"2014-12-01 00:00:00","python","9078" +"2014-12-01 00:00:00","c","3164" +"2014-12-01 00:00:00","javascript","17082" +"2014-12-01 00:00:00","perl","579" +"2014-12-01 00:00:00","ruby","2156" +"2014-12-01 00:00:00","java","16470" +"2014-12-01 00:00:00","swift","2501" +"2014-12-01 00:00:00","r","2369" +"2015-01-01 00:00:00","javascript","18621" +"2015-01-01 00:00:00","c","3222" +"2015-01-01 00:00:00","c#","11823" +"2015-01-01 00:00:00","assembly","333" +"2015-01-01 00:00:00","java","16639" +"2015-01-01 00:00:00","c++","6172" +"2015-01-01 00:00:00","delphi","383" +"2015-01-01 00:00:00","php","13773" +"2015-01-01 00:00:00","go","470" +"2015-01-01 00:00:00","perl","606" +"2015-01-01 00:00:00","python","9730" +"2015-01-01 00:00:00","r","2704" +"2015-01-01 00:00:00","ruby","2437" +"2015-01-01 00:00:00","swift","3070" +"2015-02-01 00:00:00","delphi","416" +"2015-02-01 00:00:00","java","16827" +"2015-02-01 00:00:00","assembly","359" +"2015-02-01 00:00:00","php","13627" +"2015-02-01 00:00:00","c","3380" +"2015-02-01 00:00:00","c++","6495" +"2015-02-01 00:00:00","perl","572" +"2015-02-01 00:00:00","c#","11852" +"2015-02-01 00:00:00","python","10230" +"2015-02-01 00:00:00","javascript","18747" +"2015-02-01 00:00:00","r","2980" +"2015-02-01 00:00:00","go","384" +"2015-02-01 00:00:00","ruby","2261" +"2015-02-01 00:00:00","swift","3247" +"2015-03-01 00:00:00","assembly","390" +"2015-03-01 00:00:00","javascript","20626" +"2015-03-01 00:00:00","c","3925" +"2015-03-01 00:00:00","delphi","412" +"2015-03-01 00:00:00","perl","664" +"2015-03-01 00:00:00","c#","13322" +"2015-03-01 00:00:00","java","19850" +"2015-03-01 00:00:00","go","469" +"2015-03-01 00:00:00","php","15062" +"2015-03-01 00:00:00","python","11653" +"2015-03-01 00:00:00","r","3573" +"2015-03-01 00:00:00","c++","7410" +"2015-03-01 00:00:00","ruby","2466" +"2015-03-01 00:00:00","swift","3607" +"2015-04-01 00:00:00","php","15124" +"2015-04-01 00:00:00","java","19890" +"2015-04-01 00:00:00","c++","7164" +"2015-04-01 00:00:00","c","3966" +"2015-04-01 00:00:00","javascript","20991" +"2015-04-01 00:00:00","assembly","442" +"2015-04-01 00:00:00","c#","13151" +"2015-04-01 00:00:00","go","391" +"2015-04-01 00:00:00","python","11488" +"2015-04-01 00:00:00","perl","587" +"2015-04-01 00:00:00","ruby","2510" +"2015-04-01 00:00:00","delphi","391" +"2015-04-01 00:00:00","swift","4032" +"2015-04-01 00:00:00","r","3335" +"2015-05-01 00:00:00","java","18605" +"2015-05-01 00:00:00","delphi","400" +"2015-05-01 00:00:00","c++","6843" +"2015-05-01 00:00:00","javascript","22240" +"2015-05-01 00:00:00","assembly","372" +"2015-05-01 00:00:00","c#","13430" +"2015-05-01 00:00:00","python","11251" +"2015-05-01 00:00:00","c","3531" +"2015-05-01 00:00:00","r","3435" +"2015-05-01 00:00:00","php","14705" +"2015-05-01 00:00:00","ruby","2510" +"2015-05-01 00:00:00","go","396" +"2015-05-01 00:00:00","perl","538" +"2015-05-01 00:00:00","swift","3813" +"2015-06-01 00:00:00","delphi","388" +"2015-06-01 00:00:00","javascript","22694" +"2015-06-01 00:00:00","perl","594" +"2015-06-01 00:00:00","java","17919" +"2015-06-01 00:00:00","assembly","266" +"2015-06-01 00:00:00","c#","13594" +"2015-06-01 00:00:00","r","3438" +"2015-06-01 00:00:00","c","3175" +"2015-06-01 00:00:00","python","11841" +"2015-06-01 00:00:00","php","14492" +"2015-06-01 00:00:00","go","423" +"2015-06-01 00:00:00","c++","6534" +"2015-06-01 00:00:00","ruby","2583" +"2015-06-01 00:00:00","swift","4339" +"2015-07-01 00:00:00","delphi","385" +"2015-07-01 00:00:00","java","18761" +"2015-07-01 00:00:00","go","468" +"2015-07-01 00:00:00","assembly","260" +"2015-07-01 00:00:00","c#","14179" +"2015-07-01 00:00:00","c++","6729" +"2015-07-01 00:00:00","ruby","2587" +"2015-07-01 00:00:00","c","2821" +"2015-07-01 00:00:00","php","15526" +"2015-07-01 00:00:00","javascript","24075" +"2015-07-01 00:00:00","perl","592" +"2015-07-01 00:00:00","swift","5160" +"2015-07-01 00:00:00","python","12364" +"2015-07-01 00:00:00","r","3987" +"2015-08-01 00:00:00","c#","13289" +"2015-08-01 00:00:00","assembly","217" +"2015-08-01 00:00:00","python","11258" +"2015-08-01 00:00:00","c++","5893" +"2015-08-01 00:00:00","java","17139" +"2015-08-01 00:00:00","go","449" +"2015-08-01 00:00:00","c","2586" +"2015-08-01 00:00:00","delphi","388" +"2015-08-01 00:00:00","javascript","22213" +"2015-08-01 00:00:00","r","3497" +"2015-08-01 00:00:00","ruby","2321" +"2015-08-01 00:00:00","perl","567" +"2015-08-01 00:00:00","swift","5098" +"2015-08-01 00:00:00","php","14364" +"2015-09-01 00:00:00","c","3091" +"2015-09-01 00:00:00","delphi","359" +"2015-09-01 00:00:00","perl","486" +"2015-09-01 00:00:00","javascript","21486" +"2015-09-01 00:00:00","java","17003" +"2015-09-01 00:00:00","go","426" +"2015-09-01 00:00:00","assembly","257" +"2015-09-01 00:00:00","c#","12958" +"2015-09-01 00:00:00","r","3338" +"2015-09-01 00:00:00","python","10999" +"2015-09-01 00:00:00","php","13623" +"2015-09-01 00:00:00","c++","5928" +"2015-09-01 00:00:00","ruby","2167" +"2015-09-01 00:00:00","swift","4566" +"2015-10-01 00:00:00","delphi","422" +"2015-10-01 00:00:00","java","18603" +"2015-10-01 00:00:00","c","3689" +"2015-10-01 00:00:00","c#","12842" +"2015-10-01 00:00:00","assembly","432" +"2015-10-01 00:00:00","c++","7066" +"2015-10-01 00:00:00","go","429" +"2015-10-01 00:00:00","python","12529" +"2015-10-01 00:00:00","perl","517" +"2015-10-01 00:00:00","javascript","21891" +"2015-10-01 00:00:00","r","3690" +"2015-10-01 00:00:00","ruby","2197" +"2015-10-01 00:00:00","php","14021" +"2015-10-01 00:00:00","swift","4316" +"2015-11-01 00:00:00","java","17836" +"2015-11-01 00:00:00","javascript","21335" +"2015-11-01 00:00:00","python","12339" +"2015-11-01 00:00:00","delphi","392" +"2015-11-01 00:00:00","assembly","404" +"2015-11-01 00:00:00","c","3625" +"2015-11-01 00:00:00","c++","7107" +"2015-11-01 00:00:00","c#","12430" +"2015-11-01 00:00:00","perl","476" +"2015-11-01 00:00:00","php","13431" +"2015-11-01 00:00:00","ruby","1962" +"2015-11-01 00:00:00","go","435" +"2015-11-01 00:00:00","r","3547" +"2015-11-01 00:00:00","swift","4331" +"2015-12-01 00:00:00","java","16610" +"2015-12-01 00:00:00","c#","12199" +"2015-12-01 00:00:00","c++","6579" +"2015-12-01 00:00:00","assembly","352" +"2015-12-01 00:00:00","javascript","21156" +"2015-12-01 00:00:00","delphi","314" +"2015-12-01 00:00:00","c","3096" +"2015-12-01 00:00:00","php","13878" +"2015-12-01 00:00:00","perl","489" +"2015-12-01 00:00:00","go","426" +"2015-12-01 00:00:00","r","3184" +"2015-12-01 00:00:00","python","11686" +"2015-12-01 00:00:00","ruby","2031" +"2015-12-01 00:00:00","swift","4391" +"2016-01-01 00:00:00","assembly","248" +"2016-01-01 00:00:00","delphi","318" +"2016-01-01 00:00:00","java","16691" +"2016-01-01 00:00:00","c#","12408" +"2016-01-01 00:00:00","c","3056" +"2016-01-01 00:00:00","go","496" +"2016-01-01 00:00:00","c++","6118" +"2016-01-01 00:00:00","php","14684" +"2016-01-01 00:00:00","perl","464" +"2016-01-01 00:00:00","ruby","2150" +"2016-01-01 00:00:00","javascript","22578" +"2016-01-01 00:00:00","python","12385" +"2016-01-01 00:00:00","swift","4805" +"2016-01-01 00:00:00","r","3542" +"2016-02-01 00:00:00","c#","12788" +"2016-02-01 00:00:00","assembly","349" +"2016-02-01 00:00:00","python","13292" +"2016-02-01 00:00:00","c++","6577" +"2016-02-01 00:00:00","java","17900" +"2016-02-01 00:00:00","go","542" +"2016-02-01 00:00:00","c","3288" +"2016-02-01 00:00:00","delphi","358" +"2016-02-01 00:00:00","javascript","22539" +"2016-02-01 00:00:00","perl","516" +"2016-02-01 00:00:00","ruby","2250" +"2016-02-01 00:00:00","php","15030" +"2016-02-01 00:00:00","swift","4763" +"2016-02-01 00:00:00","r","3607" +"2016-03-01 00:00:00","delphi","340" +"2016-03-01 00:00:00","java","19972" +"2016-03-01 00:00:00","go","595" +"2016-03-01 00:00:00","c#","13673" +"2016-03-01 00:00:00","assembly","437" +"2016-03-01 00:00:00","c","3464" +"2016-03-01 00:00:00","r","4053" +"2016-03-01 00:00:00","python","14118" +"2016-03-01 00:00:00","perl","483" +"2016-03-01 00:00:00","javascript","24158" +"2016-03-01 00:00:00","php","15251" +"2016-03-01 00:00:00","c++","7054" +"2016-03-01 00:00:00","ruby","2266" +"2016-03-01 00:00:00","swift","5091" +"2016-04-01 00:00:00","assembly","412" +"2016-04-01 00:00:00","c#","13771" +"2016-04-01 00:00:00","python","13706" +"2016-04-01 00:00:00","c","3365" +"2016-04-01 00:00:00","java","19551" +"2016-04-01 00:00:00","delphi","323" +"2016-04-01 00:00:00","c++","6917" +"2016-04-01 00:00:00","go","603" +"2016-04-01 00:00:00","perl","507" +"2016-04-01 00:00:00","javascript","23509" +"2016-04-01 00:00:00","ruby","2215" +"2016-04-01 00:00:00","php","14571" +"2016-04-01 00:00:00","r","4136" +"2016-04-01 00:00:00","swift","4770" +"2016-05-01 00:00:00","javascript","23068" +"2016-05-01 00:00:00","c#","13553" +"2016-05-01 00:00:00","c","2730" +"2016-05-01 00:00:00","python","13162" +"2016-05-01 00:00:00","assembly","323" +"2016-05-01 00:00:00","delphi","338" +"2016-05-01 00:00:00","java","17104" +"2016-05-01 00:00:00","ruby","2132" +"2016-05-01 00:00:00","c++","6156" +"2016-05-01 00:00:00","php","14551" +"2016-05-01 00:00:00","r","3804" +"2016-05-01 00:00:00","go","581" +"2016-05-01 00:00:00","perl","501" +"2016-05-01 00:00:00","swift","4442" +"2016-06-01 00:00:00","java","15962" +"2016-06-01 00:00:00","delphi","281" +"2016-06-01 00:00:00","r","3869" +"2016-06-01 00:00:00","php","13748" +"2016-06-01 00:00:00","c","2312" +"2016-06-01 00:00:00","c#","13122" +"2016-06-01 00:00:00","assembly","288" +"2016-06-01 00:00:00","c++","5737" +"2016-06-01 00:00:00","javascript","22209" +"2016-06-01 00:00:00","go","550" +"2016-06-01 00:00:00","perl","453" +"2016-06-01 00:00:00","ruby","2113" +"2016-06-01 00:00:00","python","12953" +"2016-06-01 00:00:00","swift","4817" +"2016-07-01 00:00:00","c++","5490" +"2016-07-01 00:00:00","assembly","200" +"2016-07-01 00:00:00","c#","12061" +"2016-07-01 00:00:00","java","14991" +"2016-07-01 00:00:00","javascript","22245" +"2016-07-01 00:00:00","delphi","243" +"2016-07-01 00:00:00","go","538" +"2016-07-01 00:00:00","c","2355" +"2016-07-01 00:00:00","ruby","1906" +"2016-07-01 00:00:00","php","13005" +"2016-07-01 00:00:00","swift","4954" +"2016-07-01 00:00:00","perl","440" +"2016-07-01 00:00:00","python","12863" +"2016-07-01 00:00:00","r","3754" +"2016-08-01 00:00:00","python","12944" +"2016-08-01 00:00:00","java","15226" +"2016-08-01 00:00:00","assembly","257" +"2016-08-01 00:00:00","javascript","22724" +"2016-08-01 00:00:00","c","2222" +"2016-08-01 00:00:00","c#","12772" +"2016-08-01 00:00:00","perl","475" +"2016-08-01 00:00:00","ruby","1884" +"2016-08-01 00:00:00","delphi","338" +"2016-08-01 00:00:00","c++","5027" +"2016-08-01 00:00:00","php","12955" +"2016-08-01 00:00:00","swift","4923" +"2016-08-01 00:00:00","go","576" +"2016-08-01 00:00:00","r","3791" +"2016-09-01 00:00:00","delphi","288" +"2016-09-01 00:00:00","java","14726" +"2016-09-01 00:00:00","assembly","335" +"2016-09-01 00:00:00","c#","11160" +"2016-09-01 00:00:00","go","514" +"2016-09-01 00:00:00","c","2519" +"2016-09-01 00:00:00","php","12220" +"2016-09-01 00:00:00","python","12380" +"2016-09-01 00:00:00","perl","475" +"2016-09-01 00:00:00","javascript","20490" +"2016-09-01 00:00:00","r","3303" +"2016-09-01 00:00:00","c++","5160" +"2016-09-01 00:00:00","ruby","1929" +"2016-09-01 00:00:00","swift","4883" +"2016-10-01 00:00:00","php","12352" +"2016-10-01 00:00:00","assembly","397" +"2016-10-01 00:00:00","go","533" +"2016-10-01 00:00:00","c#","11497" +"2016-10-01 00:00:00","c++","5995" +"2016-10-01 00:00:00","delphi","268" +"2016-10-01 00:00:00","c","3222" +"2016-10-01 00:00:00","python","13543" +"2016-10-01 00:00:00","javascript","20491" +"2016-10-01 00:00:00","java","15388" +"2016-10-01 00:00:00","ruby","1823" +"2016-10-01 00:00:00","perl","419" +"2016-10-01 00:00:00","swift","4738" +"2016-10-01 00:00:00","r","3791" +"2016-11-01 00:00:00","c","3276" +"2016-11-01 00:00:00","c#","11697" +"2016-11-01 00:00:00","javascript","20563" +"2016-11-01 00:00:00","python","14228" +"2016-11-01 00:00:00","assembly","414" +"2016-11-01 00:00:00","delphi","273" +"2016-11-01 00:00:00","java","15695" +"2016-11-01 00:00:00","ruby","1763" +"2016-11-01 00:00:00","c++","6109" +"2016-11-01 00:00:00","php","12028" +"2016-11-01 00:00:00","r","3566" +"2016-11-01 00:00:00","go","478" +"2016-11-01 00:00:00","perl","387" +"2016-11-01 00:00:00","swift","4372" +"2016-12-01 00:00:00","assembly","314" +"2016-12-01 00:00:00","java","13887" +"2016-12-01 00:00:00","r","3153" +"2016-12-01 00:00:00","delphi","253" +"2016-12-01 00:00:00","perl","352" +"2016-12-01 00:00:00","javascript","19848" +"2016-12-01 00:00:00","c","2803" +"2016-12-01 00:00:00","c#","10739" +"2016-12-01 00:00:00","php","11532" +"2016-12-01 00:00:00","go","498" +"2016-12-01 00:00:00","ruby","1629" +"2016-12-01 00:00:00","python","13082" +"2016-12-01 00:00:00","c++","5254" +"2016-12-01 00:00:00","swift","3946" +"2017-01-01 00:00:00","assembly","307" +"2017-01-01 00:00:00","c++","5670" +"2017-01-01 00:00:00","java","14621" +"2017-01-01 00:00:00","c#","11753" +"2017-01-01 00:00:00","delphi","285" +"2017-01-01 00:00:00","javascript","21457" +"2017-01-01 00:00:00","c","2767" +"2017-01-01 00:00:00","go","562" +"2017-01-01 00:00:00","php","12688" +"2017-01-01 00:00:00","ruby","1825" +"2017-01-01 00:00:00","perl","346" +"2017-01-01 00:00:00","swift","4350" +"2017-01-01 00:00:00","python","14316" +"2017-01-01 00:00:00","r","3500" +"2017-02-01 00:00:00","python","14813" +"2017-02-01 00:00:00","java","14613" +"2017-02-01 00:00:00","assembly","302" +"2017-02-01 00:00:00","javascript","21228" +"2017-02-01 00:00:00","c","2734" +"2017-02-01 00:00:00","c#","11549" +"2017-02-01 00:00:00","perl","419" +"2017-02-01 00:00:00","ruby","1633" +"2017-02-01 00:00:00","delphi","304" +"2017-02-01 00:00:00","c++","5197" +"2017-02-01 00:00:00","php","12593" +"2017-02-01 00:00:00","swift","4075" +"2017-02-01 00:00:00","go","556" +"2017-02-01 00:00:00","r","3685" +"2017-03-01 00:00:00","delphi","305" +"2017-03-01 00:00:00","assembly","373" +"2017-03-01 00:00:00","c++","6244" +"2017-03-01 00:00:00","c","2980" +"2017-03-01 00:00:00","c#","13047" +"2017-03-01 00:00:00","java","17366" +"2017-03-01 00:00:00","python","17167" +"2017-03-01 00:00:00","perl","428" +"2017-03-01 00:00:00","javascript","23758" +"2017-03-01 00:00:00","r","4608" +"2017-03-01 00:00:00","ruby","1791" +"2017-03-01 00:00:00","go","657" +"2017-03-01 00:00:00","swift","4629" +"2017-03-01 00:00:00","php","14159" +"2017-04-01 00:00:00","c#","11138" +"2017-04-01 00:00:00","c","2866" +"2017-04-01 00:00:00","c++","5899" +"2017-04-01 00:00:00","python","15686" +"2017-04-01 00:00:00","javascript","21289" +"2017-04-01 00:00:00","go","510" +"2017-04-01 00:00:00","php","12502" +"2017-04-01 00:00:00","assembly","320" +"2017-04-01 00:00:00","ruby","1491" +"2017-04-01 00:00:00","java","15987" +"2017-04-01 00:00:00","swift","3931" +"2017-04-01 00:00:00","delphi","263" +"2017-04-01 00:00:00","r","4267" +"2017-04-01 00:00:00","perl","376" +"2017-05-01 00:00:00","delphi","319" +"2017-05-01 00:00:00","java","16395" +"2017-05-01 00:00:00","r","4331" +"2017-05-01 00:00:00","php","13115" +"2017-05-01 00:00:00","assembly","349" +"2017-05-01 00:00:00","c","2749" +"2017-05-01 00:00:00","perl","363" +"2017-05-01 00:00:00","c#","12046" +"2017-05-01 00:00:00","python","16214" +"2017-05-01 00:00:00","javascript","22435" +"2017-05-01 00:00:00","c++","5316" +"2017-05-01 00:00:00","go","590" +"2017-05-01 00:00:00","ruby","1521" +"2017-05-01 00:00:00","swift","4113" +"2017-06-01 00:00:00","javascript","21635" +"2017-06-01 00:00:00","perl","332" +"2017-06-01 00:00:00","c","2367" +"2017-06-01 00:00:00","go","576" +"2017-06-01 00:00:00","c#","11350" +"2017-06-01 00:00:00","assembly","242" +"2017-06-01 00:00:00","c++","4702" +"2017-06-01 00:00:00","python","16074" +"2017-06-01 00:00:00","java","14658" +"2017-06-01 00:00:00","r","4460" +"2017-06-01 00:00:00","ruby","1419" +"2017-06-01 00:00:00","delphi","246" +"2017-06-01 00:00:00","swift","4205" +"2017-06-01 00:00:00","php","11845" +"2017-07-01 00:00:00","c#","11254" +"2017-07-01 00:00:00","javascript","21664" +"2017-07-01 00:00:00","python","16961" +"2017-07-01 00:00:00","c","2058" +"2017-07-01 00:00:00","java","14191" +"2017-07-01 00:00:00","php","11859" +"2017-07-01 00:00:00","c++","5041" +"2017-07-01 00:00:00","assembly","222" +"2017-07-01 00:00:00","swift","4357" +"2017-07-01 00:00:00","ruby","1524" +"2017-07-01 00:00:00","delphi","207" +"2017-07-01 00:00:00","perl","341" +"2017-07-01 00:00:00","go","658" +"2017-07-01 00:00:00","r","4591" +"2017-08-01 00:00:00","java","13784" +"2017-08-01 00:00:00","delphi","288" +"2017-08-01 00:00:00","assembly","217" +"2017-08-01 00:00:00","c#","11014" +"2017-08-01 00:00:00","c","2055" +"2017-08-01 00:00:00","python","16512" +"2017-08-01 00:00:00","go","615" +"2017-08-01 00:00:00","c++","4809" +"2017-08-01 00:00:00","javascript","21409" +"2017-08-01 00:00:00","ruby","1395" +"2017-08-01 00:00:00","perl","368" +"2017-08-01 00:00:00","swift","4199" +"2017-08-01 00:00:00","r","4582" +"2017-08-01 00:00:00","php","11727" +"2017-09-01 00:00:00","assembly","228" +"2017-09-01 00:00:00","c#","9933" +"2017-09-01 00:00:00","c","2108" +"2017-09-01 00:00:00","python","15485" +"2017-09-01 00:00:00","java","12800" +"2017-09-01 00:00:00","delphi","263" +"2017-09-01 00:00:00","go","544" +"2017-09-01 00:00:00","c++","4487" +"2017-09-01 00:00:00","perl","318" +"2017-09-01 00:00:00","javascript","19041" +"2017-09-01 00:00:00","r","4235" +"2017-09-01 00:00:00","ruby","1224" +"2017-09-01 00:00:00","php","10761" +"2017-09-01 00:00:00","swift","3789" +"2017-10-01 00:00:00","javascript","19923" +"2017-10-01 00:00:00","c","2797" +"2017-10-01 00:00:00","c#","10280" +"2017-10-01 00:00:00","php","10895" +"2017-10-01 00:00:00","delphi","222" +"2017-10-01 00:00:00","assembly","334" +"2017-10-01 00:00:00","go","619" +"2017-10-01 00:00:00","python","17002" +"2017-10-01 00:00:00","java","14051" +"2017-10-01 00:00:00","ruby","1299" +"2017-10-01 00:00:00","c++","5238" +"2017-10-01 00:00:00","r","4552" +"2017-10-01 00:00:00","perl","343" +"2017-10-01 00:00:00","swift","3913" +"2017-11-01 00:00:00","delphi","199" +"2017-11-01 00:00:00","java","14242" +"2017-11-01 00:00:00","r","4531" +"2017-11-01 00:00:00","php","10668" +"2017-11-01 00:00:00","assembly","387" +"2017-11-01 00:00:00","c","2965" +"2017-11-01 00:00:00","perl","280" +"2017-11-01 00:00:00","c#","9855" +"2017-11-01 00:00:00","python","17038" +"2017-11-01 00:00:00","javascript","19457" +"2017-11-01 00:00:00","c++","5053" +"2017-11-01 00:00:00","go","655" +"2017-11-01 00:00:00","ruby","1178" +"2017-11-01 00:00:00","swift","3681" +"2017-12-01 00:00:00","assembly","248" +"2017-12-01 00:00:00","c++","4472" +"2017-12-01 00:00:00","c#","8658" +"2017-12-01 00:00:00","java","12023" +"2017-12-01 00:00:00","delphi","188" +"2017-12-01 00:00:00","javascript","17022" +"2017-12-01 00:00:00","go","530" +"2017-12-01 00:00:00","c","2203" +"2017-12-01 00:00:00","php","9215" +"2017-12-01 00:00:00","ruby","1023" +"2017-12-01 00:00:00","perl","248" +"2017-12-01 00:00:00","swift","3218" +"2017-12-01 00:00:00","python","15004" +"2017-12-01 00:00:00","r","3723" +"2018-01-01 00:00:00","python","16302" +"2018-01-01 00:00:00","assembly","255" +"2018-01-01 00:00:00","java","12391" +"2018-01-01 00:00:00","javascript","18986" +"2018-01-01 00:00:00","c#","9455" +"2018-01-01 00:00:00","c","2231" +"2018-01-01 00:00:00","c++","4776" +"2018-01-01 00:00:00","ruby","1165" +"2018-01-01 00:00:00","swift","3763" +"2018-01-01 00:00:00","perl","253" +"2018-01-01 00:00:00","delphi","194" +"2018-01-01 00:00:00","php","10209" +"2018-01-01 00:00:00","go","545" +"2018-01-01 00:00:00","r","4209" +"2018-02-01 00:00:00","java","12084" +"2018-02-01 00:00:00","delphi","212" +"2018-02-01 00:00:00","assembly","282" +"2018-02-01 00:00:00","c#","8633" +"2018-02-01 00:00:00","c","2154" +"2018-02-01 00:00:00","python","16389" +"2018-02-01 00:00:00","go","584" +"2018-02-01 00:00:00","c++","4591" +"2018-02-01 00:00:00","javascript","17271" +"2018-02-01 00:00:00","ruby","1032" +"2018-02-01 00:00:00","perl","244" +"2018-02-01 00:00:00","swift","3420" +"2018-02-01 00:00:00","r","4517" +"2018-02-01 00:00:00","php","9217" +"2018-03-01 00:00:00","assembly","318" +"2018-03-01 00:00:00","javascript","19204" +"2018-03-01 00:00:00","c#","9855" +"2018-03-01 00:00:00","c","2483" +"2018-03-01 00:00:00","python","17965" +"2018-03-01 00:00:00","c++","5213" +"2018-03-01 00:00:00","delphi","216" +"2018-03-01 00:00:00","go","613" +"2018-03-01 00:00:00","perl","302" +"2018-03-01 00:00:00","ruby","1064" +"2018-03-01 00:00:00","java","13617" +"2018-03-01 00:00:00","php","9930" +"2018-03-01 00:00:00","r","5110" +"2018-03-01 00:00:00","swift","4077" +"2018-04-01 00:00:00","java","13549" +"2018-04-01 00:00:00","assembly","321" +"2018-04-01 00:00:00","c","2206" +"2018-04-01 00:00:00","c#","9293" +"2018-04-01 00:00:00","javascript","18002" +"2018-04-01 00:00:00","php","9011" +"2018-04-01 00:00:00","c++","4686" +"2018-04-01 00:00:00","delphi","204" +"2018-04-01 00:00:00","perl","267" +"2018-04-01 00:00:00","python","17028" +"2018-04-01 00:00:00","r","4746" +"2018-04-01 00:00:00","go","625" +"2018-04-01 00:00:00","ruby","989" +"2018-04-01 00:00:00","swift","3588" +"2018-05-01 00:00:00","assembly","298" +"2018-05-01 00:00:00","c#","9997" +"2018-05-01 00:00:00","c++","4706" +"2018-05-01 00:00:00","python","17628" +"2018-05-01 00:00:00","go","635" +"2018-05-01 00:00:00","javascript","18117" +"2018-05-01 00:00:00","c","2381" +"2018-05-01 00:00:00","java","13518" +"2018-05-01 00:00:00","delphi","193" +"2018-05-01 00:00:00","ruby","1036" +"2018-05-01 00:00:00","perl","257" +"2018-05-01 00:00:00","swift","3633" +"2018-05-01 00:00:00","php","9547" +"2018-05-01 00:00:00","r","4734" +"2018-06-01 00:00:00","c","1849" +"2018-06-01 00:00:00","c#","8840" +"2018-06-01 00:00:00","assembly","208" +"2018-06-01 00:00:00","c++","4122" +"2018-06-01 00:00:00","java","11846" +"2018-06-01 00:00:00","delphi","187" +"2018-06-01 00:00:00","perl","254" +"2018-06-01 00:00:00","javascript","17232" +"2018-06-01 00:00:00","r","4506" +"2018-06-01 00:00:00","go","678" +"2018-06-01 00:00:00","php","8512" +"2018-06-01 00:00:00","python","16857" +"2018-06-01 00:00:00","ruby","999" +"2018-06-01 00:00:00","swift","3161" +"2018-07-01 00:00:00","delphi","206" +"2018-07-01 00:00:00","java","11823" +"2018-07-01 00:00:00","assembly","182" +"2018-07-01 00:00:00","c#","9459" +"2018-07-01 00:00:00","go","696" +"2018-07-01 00:00:00","c","1612" +"2018-07-01 00:00:00","perl","262" +"2018-07-01 00:00:00","python","17981" +"2018-07-01 00:00:00","r","4416" +"2018-07-01 00:00:00","javascript","17862" +"2018-07-01 00:00:00","php","8637" +"2018-07-01 00:00:00","c++","3931" +"2018-07-01 00:00:00","ruby","943" +"2018-07-01 00:00:00","swift","3684" +"2018-08-01 00:00:00","assembly","182" +"2018-08-01 00:00:00","c#","9577" +"2018-08-01 00:00:00","python","17870" +"2018-08-01 00:00:00","c","1702" +"2018-08-01 00:00:00","java","11420" +"2018-08-01 00:00:00","delphi","206" +"2018-08-01 00:00:00","c++","3946" +"2018-08-01 00:00:00","go","711" +"2018-08-01 00:00:00","perl","239" +"2018-08-01 00:00:00","javascript","17975" +"2018-08-01 00:00:00","ruby","883" +"2018-08-01 00:00:00","php","8600" +"2018-08-01 00:00:00","r","4139" +"2018-08-01 00:00:00","swift","3598" +"2018-09-01 00:00:00","c#","8437" +"2018-09-01 00:00:00","c++","3785" +"2018-09-01 00:00:00","python","16154" +"2018-09-01 00:00:00","c","1867" +"2018-09-01 00:00:00","assembly","262" +"2018-09-01 00:00:00","javascript","16096" +"2018-09-01 00:00:00","delphi","185" +"2018-09-01 00:00:00","go","679" +"2018-09-01 00:00:00","perl","218" +"2018-09-01 00:00:00","php","7786" +"2018-09-01 00:00:00","java","10884" +"2018-09-01 00:00:00","ruby","783" +"2018-09-01 00:00:00","r","3809" +"2018-09-01 00:00:00","swift","3158" +"2018-10-01 00:00:00","delphi","226" +"2018-10-01 00:00:00","java","12668" +"2018-10-01 00:00:00","php","8335" +"2018-10-01 00:00:00","r","4392" +"2018-10-01 00:00:00","c#","9423" +"2018-10-01 00:00:00","c","2492" +"2018-10-01 00:00:00","c++","4365" +"2018-10-01 00:00:00","assembly","330" +"2018-10-01 00:00:00","go","798" +"2018-10-01 00:00:00","javascript","17554" +"2018-10-01 00:00:00","ruby","905" +"2018-10-01 00:00:00","perl","299" +"2018-10-01 00:00:00","swift","3301" +"2018-10-01 00:00:00","python","18328" +"2018-11-01 00:00:00","javascript","16329" +"2018-11-01 00:00:00","go","721" +"2018-11-01 00:00:00","python","18209" +"2018-11-01 00:00:00","c","2571" +"2018-11-01 00:00:00","c#","8577" +"2018-11-01 00:00:00","assembly","312" +"2018-11-01 00:00:00","java","11886" +"2018-11-01 00:00:00","c++","4420" +"2018-11-01 00:00:00","perl","245" +"2018-11-01 00:00:00","ruby","835" +"2018-11-01 00:00:00","delphi","181" +"2018-11-01 00:00:00","swift","3002" +"2018-11-01 00:00:00","r","4276" +"2018-11-01 00:00:00","php","7256" +"2018-12-01 00:00:00","javascript","14425" +"2018-12-01 00:00:00","java","10614" +"2018-12-01 00:00:00","c#","7650" +"2018-12-01 00:00:00","c","2246" +"2018-12-01 00:00:00","php","6364" +"2018-12-01 00:00:00","python","15918" +"2018-12-01 00:00:00","c++","3620" +"2018-12-01 00:00:00","assembly","236" +"2018-12-01 00:00:00","ruby","811" +"2018-12-01 00:00:00","delphi","176" +"2018-12-01 00:00:00","swift","2802" +"2018-12-01 00:00:00","perl","232" +"2018-12-01 00:00:00","go","661" +"2018-12-01 00:00:00","r","3443" +"2019-01-01 00:00:00","delphi","220" +"2019-01-01 00:00:00","java","11196" +"2019-01-01 00:00:00","assembly","229" +"2019-01-01 00:00:00","c#","8887" +"2019-01-01 00:00:00","go","666" +"2019-01-01 00:00:00","c","2330" +"2019-01-01 00:00:00","perl","274" +"2019-01-01 00:00:00","python","17163" +"2019-01-01 00:00:00","r","3994" +"2019-01-01 00:00:00","javascript","16170" +"2019-01-01 00:00:00","php","7328" +"2019-01-01 00:00:00","c++","3955" +"2019-01-01 00:00:00","ruby","920" +"2019-01-01 00:00:00","swift","2937" +"2019-02-01 00:00:00","assembly","232" +"2019-02-01 00:00:00","c#","8468" +"2019-02-01 00:00:00","python","17746" +"2019-02-01 00:00:00","c","2092" +"2019-02-01 00:00:00","java","11164" +"2019-02-01 00:00:00","delphi","190" +"2019-02-01 00:00:00","c++","3799" +"2019-02-01 00:00:00","go","636" +"2019-02-01 00:00:00","perl","263" +"2019-02-01 00:00:00","javascript","15862" +"2019-02-01 00:00:00","ruby","787" +"2019-02-01 00:00:00","php","7469" +"2019-02-01 00:00:00","r","4300" +"2019-02-01 00:00:00","swift","2708" +"2019-03-01 00:00:00","java","12254" +"2019-03-01 00:00:00","c++","4507" +"2019-03-01 00:00:00","delphi","189" +"2019-03-01 00:00:00","assembly","284" +"2019-03-01 00:00:00","javascript","17514" +"2019-03-01 00:00:00","c","2425" +"2019-03-01 00:00:00","c#","9082" +"2019-03-01 00:00:00","php","7964" +"2019-03-01 00:00:00","go","729" +"2019-03-01 00:00:00","perl","243" +"2019-03-01 00:00:00","python","20136" +"2019-03-01 00:00:00","r","4550" +"2019-03-01 00:00:00","ruby","851" +"2019-03-01 00:00:00","swift","2979" +"2019-04-01 00:00:00","delphi","206" +"2019-04-01 00:00:00","javascript","16348" +"2019-04-01 00:00:00","assembly","318" +"2019-04-01 00:00:00","c#","9251" +"2019-04-01 00:00:00","php","7393" +"2019-04-01 00:00:00","c++","4470" +"2019-04-01 00:00:00","c","2478" +"2019-04-01 00:00:00","go","655" +"2019-04-01 00:00:00","java","11352" +"2019-04-01 00:00:00","swift","3122" +"2019-04-01 00:00:00","python","20045" +"2019-04-01 00:00:00","ruby","767" +"2019-04-01 00:00:00","perl","219" +"2019-04-01 00:00:00","r","4659" +"2019-05-01 00:00:00","c#","9161" +"2019-05-01 00:00:00","assembly","253" +"2019-05-01 00:00:00","c","2156" +"2019-05-01 00:00:00","delphi","170" +"2019-05-01 00:00:00","javascript","16310" +"2019-05-01 00:00:00","perl","238" +"2019-05-01 00:00:00","java","11297" +"2019-05-01 00:00:00","go","684" +"2019-05-01 00:00:00","c++","4196" +"2019-05-01 00:00:00","php","7169" +"2019-05-01 00:00:00","r","4357" +"2019-05-01 00:00:00","python","19122" +"2019-05-01 00:00:00","swift","3142" +"2019-05-01 00:00:00","ruby","759" +"2019-06-01 00:00:00","java","9787" +"2019-06-01 00:00:00","javascript","15016" +"2019-06-01 00:00:00","c#","7740" +"2019-06-01 00:00:00","go","536" +"2019-06-01 00:00:00","assembly","205" +"2019-06-01 00:00:00","php","6175" +"2019-06-01 00:00:00","c++","3721" +"2019-06-01 00:00:00","c","1780" +"2019-06-01 00:00:00","python","17507" +"2019-06-01 00:00:00","perl","251" +"2019-06-01 00:00:00","ruby","707" +"2019-06-01 00:00:00","delphi","131" +"2019-06-01 00:00:00","swift","3122" +"2019-06-01 00:00:00","r","4004" +"2019-07-01 00:00:00","delphi","164" +"2019-07-01 00:00:00","assembly","195" +"2019-07-01 00:00:00","c++","4331" +"2019-07-01 00:00:00","c","1792" +"2019-07-01 00:00:00","c#","8588" +"2019-07-01 00:00:00","java","11024" +"2019-07-01 00:00:00","python","20030" +"2019-07-01 00:00:00","perl","249" +"2019-07-01 00:00:00","javascript","16403" +"2019-07-01 00:00:00","r","4265" +"2019-07-01 00:00:00","ruby","763" +"2019-07-01 00:00:00","go","641" +"2019-07-01 00:00:00","swift","3086" +"2019-07-01 00:00:00","php","6853" +"2019-08-01 00:00:00","c#","8027" +"2019-08-01 00:00:00","c","1602" +"2019-08-01 00:00:00","c++","3401" +"2019-08-01 00:00:00","python","18805" +"2019-08-01 00:00:00","delphi","172" +"2019-08-01 00:00:00","go","649" +"2019-08-01 00:00:00","javascript","15945" +"2019-08-01 00:00:00","assembly","177" +"2019-08-01 00:00:00","php","6147" +"2019-08-01 00:00:00","java","9646" +"2019-08-01 00:00:00","ruby","792" +"2019-08-01 00:00:00","perl","205" +"2019-08-01 00:00:00","swift","2656" +"2019-08-01 00:00:00","r","4115" +"2019-09-01 00:00:00","java","11332" +"2019-09-01 00:00:00","c","2141" +"2019-09-01 00:00:00","c#","8799" +"2019-09-01 00:00:00","assembly","241" +"2019-09-01 00:00:00","javascript","16846" +"2019-09-01 00:00:00","c++","4129" +"2019-09-01 00:00:00","delphi","164" +"2019-09-01 00:00:00","php","6454" +"2019-09-01 00:00:00","go","671" +"2019-09-01 00:00:00","perl","213" +"2019-09-01 00:00:00","python","19201" +"2019-09-01 00:00:00","r","4471" +"2019-09-01 00:00:00","ruby","791" +"2019-09-01 00:00:00","swift","2880" +"2019-10-01 00:00:00","c#","9463" +"2019-10-01 00:00:00","assembly","349" +"2019-10-01 00:00:00","c++","5295" +"2019-10-01 00:00:00","python","23398" +"2019-10-01 00:00:00","javascript","18386" +"2019-10-01 00:00:00","go","679" +"2019-10-01 00:00:00","c","2656" +"2019-10-01 00:00:00","delphi","162" +"2019-10-01 00:00:00","java","13156" +"2019-10-01 00:00:00","perl","216" +"2019-10-01 00:00:00","ruby","913" +"2019-10-01 00:00:00","php","7057" +"2019-10-01 00:00:00","swift","3450" +"2019-10-01 00:00:00","r","5135" +"2019-11-01 00:00:00","assembly","323" +"2019-11-01 00:00:00","c","2703" +"2019-11-01 00:00:00","c#","9103" +"2019-11-01 00:00:00","c++","5166" +"2019-11-01 00:00:00","perl","235" +"2019-11-01 00:00:00","java","12165" +"2019-11-01 00:00:00","delphi","180" +"2019-11-01 00:00:00","javascript","18187" +"2019-11-01 00:00:00","php","7047" +"2019-11-01 00:00:00","r","4876" +"2019-11-01 00:00:00","go","659" +"2019-11-01 00:00:00","python","23590" +"2019-11-01 00:00:00","ruby","726" +"2019-11-01 00:00:00","swift","3265" +"2019-12-01 00:00:00","assembly","267" +"2019-12-01 00:00:00","delphi","143" +"2019-12-01 00:00:00","java","10602" +"2019-12-01 00:00:00","c#","7978" +"2019-12-01 00:00:00","go","663" +"2019-12-01 00:00:00","python","20526" +"2019-12-01 00:00:00","c","2290" +"2019-12-01 00:00:00","c++","4595" +"2019-12-01 00:00:00","perl","168" +"2019-12-01 00:00:00","ruby","738" +"2019-12-01 00:00:00","javascript","16433" +"2019-12-01 00:00:00","swift","3010" +"2019-12-01 00:00:00","r","4238" +"2019-12-01 00:00:00","php","6069" +"2020-01-01 00:00:00","assembly","239" +"2020-01-01 00:00:00","c#","8665" +"2020-01-01 00:00:00","c","2177" +"2020-01-01 00:00:00","python","22699" +"2020-01-01 00:00:00","java","11522" +"2020-01-01 00:00:00","delphi","178" +"2020-01-01 00:00:00","perl","174" +"2020-01-01 00:00:00","c++","4521" +"2020-01-01 00:00:00","r","4614" +"2020-01-01 00:00:00","go","686" +"2020-01-01 00:00:00","ruby","817" +"2020-01-01 00:00:00","javascript","18076" +"2020-01-01 00:00:00","swift","3166" +"2020-01-01 00:00:00","php","6699" +"2020-02-01 00:00:00","c#","8679" +"2020-02-01 00:00:00","c","2090" +"2020-02-01 00:00:00","c++","4423" +"2020-02-01 00:00:00","python","22938" +"2020-02-01 00:00:00","delphi","168" +"2020-02-01 00:00:00","go","716" +"2020-02-01 00:00:00","javascript","17947" +"2020-02-01 00:00:00","assembly","281" +"2020-02-01 00:00:00","php","6543" +"2020-02-01 00:00:00","java","11602" +"2020-02-01 00:00:00","ruby","706" +"2020-02-01 00:00:00","perl","197" +"2020-02-01 00:00:00","swift","3103" +"2020-02-01 00:00:00","r","5192" +"2020-03-01 00:00:00","java","13253" +"2020-03-01 00:00:00","go","719" +"2020-03-01 00:00:00","c","2670" +"2020-03-01 00:00:00","delphi","181" +"2020-03-01 00:00:00","c#","8954" +"2020-03-01 00:00:00","python","26673" +"2020-03-01 00:00:00","c++","5107" +"2020-03-01 00:00:00","assembly","317" +"2020-03-01 00:00:00","javascript","20483" +"2020-03-01 00:00:00","perl","215" +"2020-03-01 00:00:00","r","5761" +"2020-03-01 00:00:00","php","6672" +"2020-03-01 00:00:00","swift","3434" +"2020-03-01 00:00:00","ruby","780" +"2020-04-01 00:00:00","java","15377" +"2020-04-01 00:00:00","assembly","406" +"2020-04-01 00:00:00","c++","6820" +"2020-04-01 00:00:00","c#","10042" +"2020-04-01 00:00:00","c","3472" +"2020-04-01 00:00:00","delphi","250" +"2020-04-01 00:00:00","javascript","24634" +"2020-04-01 00:00:00","go","887" +"2020-04-01 00:00:00","perl","240" +"2020-04-01 00:00:00","php","8060" +"2020-04-01 00:00:00","ruby","860" +"2020-04-01 00:00:00","python","32605" +"2020-04-01 00:00:00","swift","4015" +"2020-04-01 00:00:00","r","7047" +"2020-05-01 00:00:00","java","14711" +"2020-05-01 00:00:00","c#","9923" +"2020-05-01 00:00:00","assembly","386" +"2020-05-01 00:00:00","delphi","221" +"2020-05-01 00:00:00","c","3602" +"2020-05-01 00:00:00","javascript","25196" +"2020-05-01 00:00:00","go","826" +"2020-05-01 00:00:00","c++","7063" +"2020-05-01 00:00:00","php","7917" +"2020-05-01 00:00:00","python","34478" +"2020-05-01 00:00:00","perl","228" +"2020-05-01 00:00:00","ruby","774" +"2020-05-01 00:00:00","r","6833" +"2020-05-01 00:00:00","swift","4066" +"2020-06-01 00:00:00","delphi","214" +"2020-06-01 00:00:00","java","13015" +"2020-06-01 00:00:00","c++","6161" +"2020-06-01 00:00:00","c","2757" +"2020-06-01 00:00:00","php","7188" +"2020-06-01 00:00:00","assembly","363" +"2020-06-01 00:00:00","c#","9064" +"2020-06-01 00:00:00","go","765" +"2020-06-01 00:00:00","javascript","23360" +"2020-06-01 00:00:00","perl","203" +"2020-06-01 00:00:00","python","31817" +"2020-06-01 00:00:00","r","6249" +"2020-06-01 00:00:00","ruby","670" +"2020-06-01 00:00:00","swift","3733" +"2020-07-01 00:00:00","delphi","212" +"2020-07-01 00:00:00","java","12723" +"2020-07-01 00:00:00","javascript","23802" +"2020-07-01 00:00:00","c++","5756" +"2020-07-01 00:00:00","c#","9145" +"2020-07-01 00:00:00","assembly","298" +"2020-07-01 00:00:00","c","2294" +"2020-07-01 00:00:00","python","31261" +"2020-07-01 00:00:00","php","7334" +"2020-07-01 00:00:00","r","5694" +"2020-07-01 00:00:00","go","743" +"2020-07-01 00:00:00","ruby","775" +"2020-07-01 00:00:00","perl","182" +"2020-07-01 00:00:00","swift","3607" \ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/003 Solution Preliminary Data Exploration.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/003 Solution Preliminary Data Exploration.html new file mode 100644 index 0000000000000000000000000000000000000000..94d9ebbcf03d1c915448a86e4f793e3ece4fe259 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/003 Solution Preliminary Data Exploration.html @@ -0,0 +1 @@ +

I hope the last steps were fairly straightforward. First, we import pandas and then we can call read_csv(), where we can provide some additional arguments, like the names for our columns.

df = pd.read_csv('QueryResults.csv', names=['DATE', 'TAG', 'POSTS'], header=0)

Setting the header row to 0 allows us to substitute our own column names.

Next, we use .head() and .tail() to look at the first and last 5 rows. This allows us to verify that our column naming worked as intended.

To check the dimensions of the DataFrame, we use our old friend .shape. This tells us we have 1991 rows and 3 columns.

To count the number of entries in each column we can use .count(). Note that .count() will actually tell us the number of non-NaN values in each column.


Next Challenge


The TAG is the name of the programming language. So for example in July 2008, there were 3 posts tagged with the language C#. Given that the TAG serves as our category column, can you figure out how to count the number of posts per language? Which programming language had the most number of posts since the creation of Stack Overflow? (Hint: you may need to review one of yesterday's lessons).

Also, some languages are older like C and other languages are newer (like Swift). The dataset starts in July 2008, so some languages will not have any posts for every month. Can you count how many months of posts exist for each programming language?

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/004 Solution Analysis by Programming Language.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/004 Solution Analysis by Programming Language.html new file mode 100644 index 0000000000000000000000000000000000000000..c5113ac1849c72ae732c09babbde4ee3469b2035 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/004 Solution Analysis by Programming Language.html @@ -0,0 +1 @@ +

In order to look at the number of entries and the number of posts by programming language, we need to make use of the .groupby() method. The key is combining .groupby() with the TAG column, which holds as our categories (the names of the programming languages).

If we .sum() the number of posts then we can see how many posts each programming language had since the creation of Stack Overflow.

If we .count() the entries in each column, we can see how many months of entries exist per programming language.


\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/005 Data Cleaning Working with Time Stamps.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/005 Data Cleaning Working with Time Stamps.html new file mode 100644 index 0000000000000000000000000000000000000000..dcc7818246e667bcaae20b98a455d1474e1e9a7a --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/005 Data Cleaning Working with Time Stamps.html @@ -0,0 +1 @@ +

Selecting an Individual Cell

Let's take a closer look at the 'DATE' column in our DataFrame. We can use the double square bracket notation to look at the second entry in the column: 

df['DATE'][1]

Alternatively, for column names no spaces, we can also use the dot-notation:

df.DATE[1]

I prefer the square bracket notation for column names since it's more flexible, but with the dot notation, you get to use autocomplete, which is also nice.


Inspecting the Data Type

When we type check the contents of this cell, we see that we are not dealing with a date object, but rather with a string.

This is not very handy. Not only will the string format always show the unnecessary 00:00:00, but we also don't get the benefit of working with Datetime objects, which know how to handle dates and times. Pandas can help us convert the string to a timestamp using the to_datetime() method.

Here's how we can convert the entry in our cell and check that it worked:

Let's use Pandas' to_datetime() to convert the entire df['DATE'] column.

Excellent. Now we can start thinking about how to manipulate our data so that we get a one column per programming language. For all of that and more, I'll see you in the next lesson.

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/006 Data Manipulation Pivoting DataFrames.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/006 Data Manipulation Pivoting DataFrames.html new file mode 100644 index 0000000000000000000000000000000000000000..dc1daafa4104dbeb87918911cf01897fada42e77 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/006 Data Manipulation Pivoting DataFrames.html @@ -0,0 +1,5 @@ +

The .pivot() method

Sometimes you want to convert your DataFrame so that each category has its own column. For example, suppose you needed to take the table below and create a separate column for each actor, where each row is the Age of the actor:

How would you do this with the DataFrame below? 

test_df = pd.DataFrame({'Age': ['Young', 'Young', 'Young', 'Young', 'Old', 'Old', 'Old', 'Old'],
+                        'Actor': ['Jack', 'Arnold', 'Keanu', 'Sylvester', 'Jack', 'Arnold', 'Keanu', 'Sylvester'],
+                        'Power': [100, 80, 25, 50, 99, 75, 5, 30]})
+test_df

The easiest way to accomplish this is by using the .pivot() method in Pandas. Try the example for yourself. The thing to understand is how to supply the correct aguments to get the desired outcome. The index are the categories for the rows. The columns are the categories for the columns. And the values are what you want in the new cells. 

pivoted_df = test_df.pivot(index='Age', columns='Actor', values='Power')
+pivoted_df

However, there's one very important thing to notice. What happens if a value is missing? In the example above there's no value for old Sylvester. In this case, the .pivot() method will insert a NaN value.

Mini-Challenge

You should get something like this:




Solution

Here's how you pivot our existing DataFrame to get the outcome above:

reshaped_df = df.pivot(index='DATE', columns='TAG', values='POSTS')

We have 145 rows and 14 columns in the new DataFrame. Each programming language became a column and our date column became the new index (i.e., the label for the rows).

When we count the number of entries per column we see that not all languages are the same. The reason is that the .count() method excludes NaN values. When we pivoted the DataFrame the NaN values were inserted when there were no posts for a language in that month (e.g., Swift in July, 2008).

Dealing with NaN Values

In this case, we don't want to drop the rows that have a NaN value. Instead, we want to substitute the number 0 for each NaN value in the DataFrame. We can do this with the .fillna() method.

reshaped_df.fillna(0, inplace=True) 

The inplace argument means that we are updating reshaped_df. Without this argument we would have to write something like this:

reshaped_df = reshaped_df.fillna(0) 

Let's check if we successfully replaced all the NaN values in our DataFrame.

We can also check if there are any NaN values left in the entire DataFrame with this line:

reshaped_df.isna().values.any()

Here we are using the .isna() method that we've used before, but we're chaining two more things: the values attribute and the any() method. This means we don't have to search through the entire DataFrame to spot if .isna() is True.

Now we're all set to create some charts and visualise our data. For all of that and more, I'll see you in the next lesson!

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/007 Data Visualisation with Matplotlib.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/007 Data Visualisation with Matplotlib.html new file mode 100644 index 0000000000000000000000000000000000000000..47b3e7199122870b7601fe682d55618991f2d1f3 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/007 Data Visualisation with Matplotlib.html @@ -0,0 +1,4 @@ +

Matplotlib

To create our first charts we're going to use a library called Matplotlib. There are many different libraries in Python to help us create charts and graphs. Matplotlib is an incredibly popular one and it works beautifully in combination with Pandas, so let's check it out.

First, we have to import Matplotlib.

import matplotlib.pyplot as plt

Let's do this at the top:

Mini Challenge

You can actually show a line chart for the popularity of a programming language using only a single line of code. Can you use the .plot() documentation to figure out how to do this? Try and plot the popularity of the Java programming language. Here's what you're aiming for:



Solution

All you need to do is supply the values for the horizontal axis (the x-values) and the vertical axis (the y-values) for the chart. The x-values are our dates and the y-values are the number of posts. We can supply these values to the .plot() function by position like so:

plt.plot(reshaped_df.index, reshaped_df.java)

or like so if you prefer the square bracket notation.

plt.plot(reshaped_df.index, reshaped_df['java'])


Styling the Chart

Let's look at a couple of methods that will help us style our chart:

.figure() - allows us to resize our chart

.xticks() - configures our x-axis

.yticks() - configures our y-axis

.xlabel() - add text to the x-axis

.ylabel() - add text to the y-axis

.ylim() - allows us to set a lower and upper bound


To make our chart larger we can provide a width (16) and a height (10) as the figsize of the figure.

plt.figure(figsize=(16,10)) 
+plt.plot(reshaped_df.index, reshaped_df.java)

This will make our chart easier to see. But when we increase the size of the chart, we should also increase the fontsize of the ticks on our axes so that they remain easy to read:

Now we can add labels. Also, we're never going to get less than 0 posts, so let's set a lower limit of 0 for the y-axis with .ylim().

plt.xlabel('Date', fontsize=14)
+plt.ylabel('Number of Posts', fontsize=14)
+plt.ylim(0, 35000)


Challenge


Now that you've successfully created and styled your chart, can you figure out how to plot both Java and Python next to each other? The result should look something like this:

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/008 Multi-Line Charts with Matplotib.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/008 Multi-Line Charts with Matplotib.html new file mode 100644 index 0000000000000000000000000000000000000000..f5816069a630715032953b97bdba3fd0a5ddcabf --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/008 Multi-Line Charts with Matplotib.html @@ -0,0 +1,21 @@ +

Solution: Two Line Charts Next to Each Other

The trick is simply calling the .plot() method twice. That's all there is to it! =)

plt.figure(figsize=(16,10)) # make chart larger
+plt.xticks(fontsize=14)
+plt.yticks(fontsize=14)
+plt.xlabel('Date', fontsize=14)
+plt.ylabel('Number of Posts', fontsize=14)
+plt.ylim(0, 35000)
+
+plt.plot(reshaped_df.index, reshaped_df.java)
+plt.plot(reshaped_df.index, reshaped_df.python) # Tadah!

But what if we wanted to plot all the programming languages on the same chart? We don't want to type out .plot() a million times, right? We can actually just use a for-loop:

for column in reshaped_df.columns:
+    plt.plot(reshaped_df.index, reshaped_df[column])

This will allow us to iterate over each column in the DataFrame and plot it on our chart. The final result should look like this:

But wait, which language is which? It's really hard to make out without a legend that tells us which colour corresponds to each language. Let's modify the plotting code to add a label for each line based on the column name (and make the lines thicker at the same time using linewidth). Then let's add a legend to our chart:

plt.figure(figsize=(16,10))
+plt.xticks(fontsize=14)
+plt.yticks(fontsize=14)
+plt.xlabel('Date', fontsize=14)
+plt.ylabel('Number of Posts', fontsize=14)
+plt.ylim(0, 35000)
+
+for column in reshaped_df.columns:
+    plt.plot(reshaped_df.index, reshaped_df[column], 
+             linewidth=3, label=reshaped_df[column].name)
+
+plt.legend(fontsize=16) 

We should now see something like this:

Looks like Python is the most popular programming language judging by the number of posts on Stack Overflow! Python for the win! =) 


\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/009 Smoothing out Time-Series Data.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/009 Smoothing out Time-Series Data.html new file mode 100644 index 0000000000000000000000000000000000000000..7e962e8198d8d5650bd774754d91de61d30f8b53 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/009 Smoothing out Time-Series Data.html @@ -0,0 +1,16 @@ +

Looking at our chart we see that time-series data can be quite noisy, with a lot of up and down spikes. This can sometimes make it difficult to see what's going on.

A useful technique to make a trend apparent is to smooth out the observations by taking an average. By averaging say, 6 or 12 observations we can construct something called the rolling mean. Essentially we calculate the average in a window of time and move it forward by one observation at a time.

Since this is such a common technique, Pandas actually two handy methods already built-in: rolling() and mean(). We can chain these two methods up to create a DataFrame made up of the averaged observations.

# The window is number of observations that are averaged
+roll_df = reshaped_df.rolling(window=6).mean()
+
+plt.figure(figsize=(16,10))
+plt.xticks(fontsize=14)
+plt.yticks(fontsize=14)
+plt.xlabel('Date', fontsize=14)
+plt.ylabel('Number of Posts', fontsize=14)
+plt.ylim(0, 35000)
+
+# plot the roll_df instead
+for column in roll_df.columns:
+    plt.plot(roll_df.index, roll_df[column], 
+             linewidth=3, label=roll_df[column].name)
+
+plt.legend(fontsize=16)

Now our chart looks something like this:

Play with the window argument (use 3 or 12) and see how the chart changes!

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/010 Programming Language Data Analysis.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/010 Programming Language Data Analysis.html new file mode 100644 index 0000000000000000000000000000000000000000..74ad3da50265a969dae7ce8ef62f693914c9b697 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/010 Programming Language Data Analysis.html @@ -0,0 +1,263 @@ + + + + + + + Quiz + + + + + +
+ Score: N/A of N/A +
+
+ + + + diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Course-Fixes-Report-an-Issue.url b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Learning Points & Summary.html b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..5b4b7fda34207dd27f0cdcbfe7a6d256832df0db --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Learning Points & Summary.html @@ -0,0 +1 @@ +

Congratulations on completing another challenging data science project! Today we've seen how to grab some raw data and create some interesting charts using Pandas and Matplotlib. We've


Well done for completing today's lessons! Have a good rest. I'll see you tomorrow! 

\ No newline at end of file diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Programming-Languages-complete.ipynb.zip b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Programming-Languages-complete.ipynb.zip new file mode 100644 index 0000000000000000000000000000000000000000..e35a578c508e99c3b2f1481a4f9c729852ad52c7 --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/011 Programming-Languages-complete.ipynb.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e455f3628df15733a17475c06802b14a8df485d59cb2e4ea579c493b3749292f +size 581858 diff --git a/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/external-links.txt b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..742e41fb45384a1f8720ffd922a4d78f0e853dfd --- /dev/null +++ b/part3/73 - Day 73 - Advanced - Data Visualisation with Matplotlib Programming Languages/external-links.txt @@ -0,0 +1,3 @@ + +011 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/001 Day 74 Goals what you will make by the end of the day.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/001 Day 74 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..d1ecbf3d1061ee04323d775ec0a346bd1c4f046a --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/001 Day 74 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Learn to Aggregate and Merge Data in Pandas while Analysing a Dataset of LEGO Pieces

Today we're going to be diving deep into a dataset all about LEGO, which will help us answer a whole bunch of interesting questions about the history of the company, their product offering, and which LEGO set rules them all:

What you'll learn today



Download and Open the Template Notebook

Download the .zip file from this lesson. This contains the starter Notebook, some images, and the data. Unzip the file and add the Notebook to your Google Drive.



Add the Data to your Project

Right-click to create a new folder called data and add the .csv files to the data folder (sadly dragging and dropping entire folders won't work).

If you are running the Notebook locally using Jupyter, I've supplied the image assets for you as well. If you're using Google Colab, then you won't need the assets folder.

\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/001 LEGO-Notebook-and-Data-start.zip b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/001 LEGO-Notebook-and-Data-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..eb87fc8897f493e5739d5158e07d7958b5c7c582 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/001 LEGO-Notebook-and-Data-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0630d3f75bbc51e75b84305bb904ee5c8727fd74433bd0c493e7e2a79968f120 +size 3041389 diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/002 Use HTML Markdown to Make Your Notebook Look Pretty.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/002 Use HTML Markdown to Make Your Notebook Look Pretty.html new file mode 100644 index 0000000000000000000000000000000000000000..b8f5f32be7d8f8328ef6518753e16ed48cc7f281 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/002 Use HTML Markdown to Make Your Notebook Look Pretty.html @@ -0,0 +1 @@ +

The cells inside the notebook can either be code cells for your Python code or Text (Markdown) cells. The starter notebook includes a few of these Text cells with section headings and challenge text. However, we can style these cells even more by using HTML (see Days 43 and 44).

Insert a Markdown Cell

Add a new Text cell below the Introduction.

Adding Images

Display an image in a Text cell, use an HTML <img> tag with the URL of the image. For example:

<img src="https://i.imgur.com/49FNOHj.jpg">

If you are using Jupyter Notebook instead of Google Colab, you can also link to one of the files provided in the .zip like so:

<img src="assets/bricks.jpg">

Section Headings

You can add section headings using tags like <h1> or <h2>. However, the Notebook also has its own shorthand for common HTML tags. For example, you can use the # symbol as a shortcut. Here's how the headings change their size up to a minimum of <h5>:


Challenge


Now, let's get warmed up and write some Python code. Let's find out how many different colour LEGO bricks are actually in production!

Read the colors.csv file from the data folder and find the total number of unique colours.

There's a number of different ways you can accomplish this. Maybe try using the .nunique() from Pandas this time.

Also, figure out how many of the LEGO colours are transparent compared to how many colours are opaque. See if you can Google your way to finding at least two different ways of arriving at the answer.

\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/003 Solution Exploring the LEGO Brick Colours.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/003 Solution Exploring the LEGO Brick Colours.html new file mode 100644 index 0000000000000000000000000000000000000000..b685a6fe7864a5fcacb416b02ee6e72b27357c6d --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/003 Solution Exploring the LEGO Brick Colours.html @@ -0,0 +1,2 @@ +

Import Pandas

As always, the first step is importing the module that we'll use: Pandas

import pandas as pd

Examine the Structure

From there we can read the .csv file and take a look at the first 5 rows.

colors = pd.read_csv('data/colors.csv')
+colors.head()

We see that there are 5 columns, which include the name of the colour and its corresponding RGB value. To find the number of unique colours, all we need to do is check if every entry in the name column is unique: 

colors['name'].nunique()

This shows us that there are 135 unique colours for LEGO blocks.

Find the number of transparent colours

One way you can do this is through combining our old friend, the .groupby() method, with the .count() method.

colors.groupby('is_trans').count() 

Here we just group by the is_trans column and count the entries.

But you might have also come across the very handy .value_counts() method in your research.

colors.is_trans.value_counts()

Once again, we select the column (here with the .dot notation) and call the method. The .value_counts() method is a very quick way of finding the number of members of each category.

Challenge


Do you remember how to work with section headings and images? See if you can tackle the next couple of challenges to make your notebook look like this:

\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/004 Find the Oldest and Largest LEGO Sets.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/004 Find the Oldest and Largest LEGO Sets.html new file mode 100644 index 0000000000000000000000000000000000000000..c5b4b79a2e803f08f9a4205c76edcd3b74a0457d --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/004 Find the Oldest and Largest LEGO Sets.html @@ -0,0 +1 @@ +

Markdown Challenge Solution

Here's how you'd organise the markdown cells with the section headings and image tags. You might have also spotted that enclosing text in the double-asterisk ** symbol will make it bold.

Exploring the sets.csv

The sets.csv contains a list of LEGO sets. It shows in which year the set was released and the number of parts in the set.

Can you take the first steps in exploring this dataset? Read the .csv and take a look at the columns.

Then try and answer the following questions:


Scroll down to see the solution below...

.

..

...

..

.

Solution

The first step as always is reading the .csv file and looking what's in it. We see that there's some sort of id for each set (the set_num), the name of the set, the year in which it was released, the theme_id (the code for the theme name) and the number of parts.

So it looks like we have everything we here to answer our two questions.

To find the year when the first LEGO sets were released we have to sort by the year column. The .sort_values() method will by default sort in ascending order.

Looks like LEGO started all the way back in 1949! The names for these sets are nothing to write home about, but let's find out how many different products the company was selling in their first year since launch:

Back in 1949, LEGO got started selling only 5 different sets! Note that here we are filtering our DataFrame on a condition. We are retrieving the rows where the year column has the value 1949: sets['year'] == 1949.


Now let's find the LEGO set with the largest number of parts. If we want to find the largest number of parts, then we have to set the ascending argument to False when we sort by the num_parts column.

The largest LEGO set ever produced has around 10,000 pieces! Apparently, only two of these boxes were ever produced, so if you wanted to get your hands on a ridiculously large LEGO set, you'll have to settle for the 7,541 piece Millennium Falcon.

Oh, and if you've actually built one of these enormous sets, please share a picture in this lesson's comments!


\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/005 Visualise the Number of Sets Published over Time.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/005 Visualise the Number of Sets Published over Time.html new file mode 100644 index 0000000000000000000000000000000000000000..55454a0447b09ae6baacd7369f3d27dc92916e27 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/005 Visualise the Number of Sets Published over Time.html @@ -0,0 +1 @@ +

Now let's take a look at how many sets the LEGO company has published year-on-year. This might tell us something about how LEGO's product offering has changed over time.

First, let's import Matplotlib so we can visualise our findings up top:

Challenge


Now, let's create a new Series called sets_by_year which has the years as the index and the number of sets as the value. The result should look something like this:

Having summed the number of LEGO sets per year, visualise this data using a line chart with Matplotlib. You should get something like this:

Because the .csv file is from late 2020, to plot the full calendar years, you will have to exclude some data from your chart. Use the slicing techniques covered in Day 21 to avoid plotting the last two years? The same syntax will work on Pandas DataFrames. You should get this:

Solution: Sets Per Year

The trick is grouping the data by the year and counting the number of entries for that year.

From this, we can see that LEGO published less than 10 different sets per year during its first few years of operation. But by 2019 the company had grown spectacularly, releasing 840 sets in that year alone!

You also notice that there is an entry for 2021. The .csv file is from late 2020, so it appears that it already includes some sets on a forward-looking basis. We'll have to take this into account for our charts:

plt.plot(sets_by_year.index, sets_by_year.set_num)

If we don't exclude the last two years we get a dramatic drop at the end of the chart. This is quite misleading as it suggests LEGO is in big trouble! Given the dataset does not include a full calendar year for 2020, it's best to exclude the last two rows to get a better picture:

plt.plot(sets_by_year.index[:-2], sets_by_year.set_num[:-2])

The Python List slicing syntax covered in Day 21 comes in quite handy here!

We also see that while the first 45 years or so, LEGO had some steady growth in its product offering, but it was really in the mid-1990s that the number of sets produced by the company increased dramatically! We also see a brief decline in the early 2000s and a strong recovery around 2005 in the chart.


\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/006 How to use the Pandas .agg() function.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/006 How to use the Pandas .agg() function.html new file mode 100644 index 0000000000000000000000000000000000000000..bd75802cbb9b1789d24ad700b9d120e01fc11a31 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/006 How to use the Pandas .agg() function.html @@ -0,0 +1 @@ +

Often you find yourself needing to summarise data. This is where the .groupby() function comes in really handy. However, sometimes you want to run even more operations based on a particular DataFrame column. This is where the .agg() method comes in.

In our case, we want to calculate the number of different themes by calendar year. This means we have to group the data by year and then count the number of unique theme_ids for that year.

Number of Themes per Calendar Year

We can accomplish this by chaining the .groupby() and the .agg() functions together:

Note, the .agg() method takes a dictionary as an argument. In this dictionary, we specify which operation we'd like to apply to each column. In our case, we just want to calculate the number of unique entries in the theme_id column by using our old friend, the .nunique() method.

Let's give our column in themes_by_year a more appropriate name and let's take a look at what we've got:

Here we can see that LEGO only had 2 themes during the first few years, but just like the number of sets the number of themes expanded manifold over the years. Let's plot this on a chart again.


Challenge


Create a line plot of the number of themes released year-on-year. Only include the full calendar years in the dataset (1949 to 2019).


.

.

..

...

..

.

.

Here's the solution:


plt.plot(themes_by_year.index[:-2], themes_by_year.nr_themes[:-2])

Again, we're using the same slicing technique as before. In the chart, we can see that LEGO has pretty consistently added more and more themes until the mid-1990s. From then the number of themes has stagnated for around 10 years or so until the early 2010s.

\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/007 Superimposing Line Charts with Separate Axes.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/007 Superimposing Line Charts with Separate Axes.html new file mode 100644 index 0000000000000000000000000000000000000000..58f49812b9c5fb2eb46b31575c740bf4d927b7d8 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/007 Superimposing Line Charts with Separate Axes.html @@ -0,0 +1,2 @@ +

Wouldn't it be nice to have the number of themes and the number sets on the same chart? But what do we get if we just plot both of them the way we have before? 

Well, that's not very informative! The problem is that the "number of themes" and the "number of sets" have very different scales. The theme number ranges between 0 and 90, while the number of sets ranges between 0 and 900. So what can we do?

Two Separate Axes

We need to be able to configure and plot our data on two separate axes on the same chart. This involves getting hold of an axis object from Matplotlib.

ax1 = plt.gca() # get current axes
+ax2 = ax1.twinx() 

We then create another axis object: ax2. The key thing is that by using the .twinx() method allows ax1 and ax2 to share the same x-axis. When we plot our data on the axes objects we get this:

That's very nice! But there's one problem: we can't tell the lines apart because they have the same colour! Let's add some styling. Let's:

so that we can see what's going on. Here's what we get:

\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/008 Scatter Plots Average Number of Parts per LEGO Set.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/008 Scatter Plots Average Number of Parts per LEGO Set.html new file mode 100644 index 0000000000000000000000000000000000000000..9e30c30229ed75855be357fb7abc87ada72f9dfa --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/008 Scatter Plots Average Number of Parts per LEGO Set.html @@ -0,0 +1 @@ +

Complexity Over Time

Have LEGO sets become larger and more complex over time? Let's work out the average number of parts per LEGO set. This is the perfect time to revise how to use the .agg() function.


Challenge


Create a Pandas Series called parts_per_set that has the year as the index and contains the average number of parts per LEGO set in that year. Here's what you're looking to create:



.

.

..

...

..

.


Solution: How to use .groupby() and .agg() together

Once again, we're going to use the .groupby() and the .agg() function together to work this one out. However, this time we pass a dictionary to the .agg() function so that we will target the num_parts column with the mean() function. That way, we group our data by year and then we average the number of parts for that year.

parts_per_set = sets.groupby('year').agg({'num_parts': pd.Series.mean})


To visualise our parts_per_set data, let's create a scatter plot. A scatter plot simply uses dots to represent the values of each data point.


Challenge

See if you can use the Matplotlib documentation to generate the scatter plot chart. Do you spot a trend in the chart? Again, you'll have to exclude the last two observations.


I'll provide the solution below.


.

.

..

...

..

.

.



Solution: Create a Scatter Plot

We just need to call the .scatter() instead of the .plot() method to create the chart. For the x-values, we'll use the index of the parts_per_set Series (the years) and for the y-values, we'll use the values of the series (the column name happens to be num_parts).

From the chart, we can definitely make out an upward trend in the size and complexity of the LEGO sets based on the average number of parts. In the 2010s the average set contained around 200 individual pieces, which is roughly double what average LEGO set used to contain in the 1960s.


\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/009 Relational Database Schemas Primary and Foreign Keys.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/009 Relational Database Schemas Primary and Foreign Keys.html new file mode 100644 index 0000000000000000000000000000000000000000..6fb19afefdfca52b5f3e2ec38ffa19a7db3cbfa4 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/009 Relational Database Schemas Primary and Foreign Keys.html @@ -0,0 +1 @@ +

LEGO has licensed many hit franchises from Harry Potter to Marvel Super Heros to many others. But which theme has the largest number of individual sets? Is it one of LEGO's own themes like Ninjago or Technic or is it a third party theme? Let's analyse LEGO's product lines in more detail!

Number of Sets per LEGO Theme

To count the number of sets per Theme we can use the .value_counts() method on our theme_id column. But there's one problem:

We have no idea what our themes are actually called! Ok, we can see that the theme with id 158 is the largest theme containing 753 individual sets, but what's that theme called? This is not very helpful. We need to find the names of the themes based on the theme_id from the themes.csv file.


Mini-Challenge

Display the database schema (link: https://i.imgur.com/Sg4lcjx.png) inside the Notebook. You should see something like this:


Solution: Embedding images in a Markdown Cell:

To display an image in a Text (aka Markdown) cell, all you need to do is use the HTML <img> tag.

<img src="https://i.imgur.com/Sg4lcjx.png">


Working with a Relational Database

What is a database schema? A schema is just how the database is organised. Many relational databases, such as our LEGO data, is split into individual tables. We have separate tables for the colours, the sets and the thems. With a relational database, the tables are linked to each other through their keys.

Understand the theme.csv file

The themes.csv file has the actual theme names. How is this table linked to the others tables? Well, the sets .csv has theme_ids which match the id column in the themes.csv.

This means that the theme_id is the foreign key inside the sets.csv. Many different sets can be part of the same theme. But inside the themes.csv, each theme_id, which is just called id is unique. This uniqueness makes the id column the primary key inside the themes.csv. To see this in action, explore the themes.csv.


Challenge

How is the themes.csv structured?

Search for the name 'Star Wars'. How many ids correspond to the 'Star Wars' name in the themes.csv?

Use the ids you just found and look for the corresponding sets in the sets.csv (Hint: you'll need to look for matches in the theme_id column).


.

..

...

...

..

.


Solution: Exploring the themes.csv

Looking at the first 5 rows, we see the column names. Each value in the id column is unique (this is the primary key for the themes table). The theme names are not unique. If we search for the name "Star Wars", we see that 4 different ids correspond to that name.

Why would Star Wars have so many different themes? We can check which products corresponded to those themes in the sets.csv:

Star Wars is a really long-running franchise. Theme number 18 was running from 2000 to 2002 and seems to be comprised of several of the show's characters. What about, say theme 209?

Here we see that all of the Star Wars Advent Calendars share the same theme_id. That makes sense.




\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/010 How to Merge DataFrames and Create Bar Charts.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/010 How to Merge DataFrames and Create Bar Charts.html new file mode 100644 index 0000000000000000000000000000000000000000..0f160d308215f57abdb02b8adf15b262eb64cfc3 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/010 How to Merge DataFrames and Create Bar Charts.html @@ -0,0 +1,7 @@ +

Wouldn't it be nice if we could combine our data on theme names with the number sets per theme? 

Let's use the .merge() method to combine two separate DataFrames into one. The merge method works on columns with the same name in both DataFrames.

Currently, our theme_ids and our number of sets per theme live inside a Series called set_theme_count.

To make sure we have a column with the name id, I'll convert this Pandas Series into a Pandas DataFrame.

Here I'm providing a dictionary to create the DataFrame. The keys in the dictionary become my column names.


The Pandas .merge() function

To .merge() two DataFrame along a particular column, we need to provide our two DataFrames and then the column name on which to merge. This is why we set on='id'. Both our set_theme_count and our themes DataFrames have a column with this name.

merged_df = pd.merge(set_theme_count, themes, on='id')

The first 3 rows in our merged DataFrame look like this:

Aha! Star Wars is indeed the theme with the most LEGO sets. Let's plot the top 10 themes on a chart.


Creating a Bar Chart

Matplotlib can create almost any chart imaginable with very few lines of code. Using .bar() we can provide our theme names and the number of sets. This is what we get:

That worked, but it's almost unreadable. The good thing for us is that we already know how to customize our charts! Here's what we get when we increase the size of our figure, add some labels, and most importantly, rotate the category names on the x-axis so that they don't overlap.

plt.figure(figsize=(14,8))
+plt.xticks(fontsize=14, rotation=45)
+plt.yticks(fontsize=14)
+plt.ylabel('Nr of Sets', fontsize=14)
+plt.xlabel('Theme Name', fontsize=14)
+
+plt.bar(merged_df.name[:10], merged_df.set_count[:10])


Niiiiice. So what can we see here? Well, a couple of these themes like Star Wars, Town, or Ninjago are what I would think of when I think of LEGO. However, it looks like LEGO also produces a huge number of ... books and key chains?!?! I guess I'm showing my age here, but it's interesting that the LEGO company seems to produce so much more these days than just plastic bricks. The 'Gear' category itself is huge and includes everything from bags to pencil cases apparently. Has LEGO strayed from its core business or is it successfully diversifying? That we can't answer from our dataset. I'll leave that one up to a business school case study to decide.


\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 Course-Fixes-Report-an-Issue.url b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 LEGO-Notebook-and-Data-completed.zip b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 LEGO-Notebook-and-Data-completed.zip new file mode 100644 index 0000000000000000000000000000000000000000..98b21c2b68b3492432ee868fee7458504b2f57bd --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 LEGO-Notebook-and-Data-completed.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31768d48aacbae955208a4f757dc88c2d2ff0f174a9ad5ff6c0fa71a3f994643 +size 3320592 diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 Learning Points & Summary.html b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..91fafaf1672cf8fe0b6282d5760164e79f4e4032 --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/011 Learning Points & Summary.html @@ -0,0 +1 @@ +

In this lesson we looked at how to:


You can download the completed code for today in this lesson.


Today was another super packed day. I hope you found digging into LEGOs product catalogue as fascinating as I have. Have a good rest and I'll see you tomorrow!


\ No newline at end of file diff --git a/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/external-links.txt b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..742e41fb45384a1f8720ffd922a4d78f0e853dfd --- /dev/null +++ b/part3/74 - Day 74 - Advanced - Aggregate & Merge Data with Pandas Analyse the LEGO Dataset/external-links.txt @@ -0,0 +1,3 @@ + +011 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/001 Day 75 Goals what you will make by the end of the day.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/001 Day 75 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..39814afe96730ad125916223a6f3d884fe59eb26 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/001 Day 75 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Combine Google Trends with other Time Series Data

What can the popularity of search terms tell us about the world? Google Trends gives us access to the popularity of Google Search terms. Let's investigate:


What you'll learn today


Download and add the Notebook to Google Drive

Download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook.

Add the Data to the Notebook

The .zip file also includes 5 .csv files. This is the data for the project. Add these to the notebook.

and let's get this party started!

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/001 Google-Trends-Data-Viz-start.zip b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/001 Google-Trends-Data-Viz-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..a1fc24d80a7fb028f1f7047b11e4719e1d08ca6b --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/001 Google-Trends-Data-Viz-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bce3aadec6fdbd785cb1288a539846b5d0a1bf5ff02aede85f9c1b1abcde1a3a +size 41990 diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/002 Data Exploration - Making Sense of Google Search Data.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/002 Data Exploration - Making Sense of Google Search Data.html new file mode 100644 index 0000000000000000000000000000000000000000..933aef0b6f5e032a912f418bfb548d033d622ee5 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/002 Data Exploration - Making Sense of Google Search Data.html @@ -0,0 +1,3 @@ +

I've gone ahead and already added the import statements and created the four different DataFrames in this notebook. Your first step is to explore the data, by getting an understanding of what's actually in those .csv files for this project.

Start with df_tesla, then have a look at df_unemployment and finally, check out the two bitcoin DataFrames.

Challenge

Try to answer these questions about the DataFrames:

.

.

..

...

..

.

.

Solution for Tesla

The df_tesla DataFrame has 124 rows and 3 columns: for the Month, the search popularity and the closing price of the Tesla stock.

print(df_tesla.shape)
+df_tesla.head()

You can use the max() and min() functions to see that the largest value in the search column is 31 and the smallest value is 2.

print(f'Largest value for Tesla in Web Search: {df_tesla.TSLA_WEB_SEARCH.max()}')
+print(f'Smallest value for Tesla in Web Search: {df_tesla.TSLA_WEB_SEARCH.min()}')

One of my favourite functions to run on DataFrames is .describe(). If you use df_tesla.describe(), you get a whole bunch of descriptive statistics. Right off the bat.


Solution for Unemployment

The unemployment DataFrame has 181 rows and 3 columns. As with Tesla, we have monthly data from 2004 onwards, organised in rows. Interestingly here, the largest value in the search column is 100.

Solution for Bitcoin

With the Bitcoin data we see that we have two different .csv files. One of them has the day-by-day closing price and the trade volume of Bitcoin across 2204 rows. The other has the monthly search volume from Google Trends.


What do the Search Numbers mean?


We can see from our DataFrames that Google's search interest ranges between 0 and 100. But what does that mean? Google defines the values of search interest as: 

Numbers represent search interest relative to the highest point on the chart for the given region and time. A value of 100 is the peak popularity for the term. A value of 50 means that the term is half as popular. A score of 0 means there was not enough data for this term.

Basically, the actual search volume of a term is not publicly available. Google only offers a scaled number. Each data point is divided by the total searches of the geography and time range it represents to compare relative popularity.


For each word in your search, Google finds how much search volume in each region and time period your term had relative to all the searches in that region and time period. It then combines all of these measures into a single measure of popularity, and then it scales the values across your topics, so the largest measure is set to 100. In short: Google Trends doesnt exactly tell you how many searches occurred for your topic, but it does give you a nice proxy.

Here are the Google Trends Search Parameters that I used to generate the .csv data:

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/003 Data Cleaning - Resampling Time Series Data.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/003 Data Cleaning - Resampling Time Series Data.html new file mode 100644 index 0000000000000000000000000000000000000000..382de5352394773396e7f77c8bbf3030bfeda6c7 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/003 Data Cleaning - Resampling Time Series Data.html @@ -0,0 +1,6 @@ +

First, we have to identify if there are any missing or junk values in our DataFrames.

Challenge

Can you investigate all 4 DataFrames and find if there are any missing values? 

If yes, find how many missing or NaN values there are. Then, find the row where the missing values occur.

Finally, remove any rows that contain missing values.

.

.

..

...

..

.

.

Solution: Finding the missing values

For 3 of the DataFrames there are no missing values. We can verify this using the .isna() method. This will return a whole series of booleans, but we can chain .values.any() to see if any value in the series is True.

print(f'Missing values for Tesla?: {df_tesla.isna().values.any()}')
+print(f'Missing values for U/E?: {df_unemployment.isna().values.any()}')
+print(f'Missing values for BTC Search?: {df_btc_search.isna().values.any()}')

However, for the Bitcoin price data, there seems to be a problem. There's a missing value somewhere.

The number of missing values can be found by using .sum() to add up the number of occurrences of True in the series. This shows that there are 2 missing values.

To find the row where the missing values occur, we can create a subset of the DataFrame using .isna() once again (If you've arrived at this answer using a different approach, that's fine too. There are a number of ways to solve this challenge.)

To remove a missing value we can use .dropna(). The inplace argument allows to overwrite our DataFrame and means we don't have to write:

df_btc_price = df_btc_price.dropna()

Challenge


Our DataFrames contain time-series data. Do you remember how to check the data type of the entries in the DataFrame? Have a look at the data types of the MONTH or DATE columns. Convert any strings you find into Datetime objects. Do this for all 4 DataFrames. Double-check if your type conversion was successful.

.

.

..

...

..

.

.

Solution: Converting Strings to DateTime Objects

All the date data in our columns are in the form of strings. To convert this into a Datetime object we're going to use the Pandas .to_datetime() function.

df_tesla.MONTH = pd.to_datetime(df_tesla.MONTH)
+df_btc_search.MONTH = pd.to_datetime(df_btc_search.MONTH)
+df_unemployment.MONTH = pd.to_datetime(df_unemployment.MONTH)
+df_btc_price.DATE = pd.to_datetime(df_btc_price.DATE)


Resampling Time Series Data

Next, we have to think about how to make our Bitcoin price and our Bitcoin search volume comparable. Our Bitcoin price is daily data, but our Bitcoin Search Popularity is monthly data.

To convert our daily data into monthly data, we're going to use the .resample() function. The only things we need to specify is which column to use (i.e., our DATE column) and what kind of sample frequency we want (i.e., the "rule"). We want a monthly frequency, so we use 'M'.  If you ever need to resample a time series to a different frequency, you can find a list of different options here (for example 'Y' for yearly or 'T' for minute).

After resampling, we need to figure out how the data should be treated. In our case, we want the last available price of the month - the price at month-end.

df_btc_monthly = df_btc_price.resample('M', on='DATE').last()

If we wanted the average price over the course of the month, we could use something like:

df_btc_monthly = df_btc_price.resample('M', on='DATE').mean()

This is what our data looks like now:

We have 73 rows in our price data - the same as our search data. Nice!

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/004 Data Visualisation - Tesla Line Charts in Matplotlib.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/004 Data Visualisation - Tesla Line Charts in Matplotlib.html new file mode 100644 index 0000000000000000000000000000000000000000..e8310840d93358f244e1a2c0dba3f96f66542d68 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/004 Data Visualisation - Tesla Line Charts in Matplotlib.html @@ -0,0 +1,49 @@ +

Let's create a basic line chart of the Tesla stock price and the search popularity and then gradually add more and more styling to our chart.

Challenge

Plot the Tesla stock price against the Tesla search volume using a line chart and two different axes. Here's what you're aiming for:


.

.

..

...

..

.

.

Solution: Creating a basic chart

This bit should pretty much be review from the previous days' lessons. To create a line plot with two different y-axes we first have to get the current axis and make a copy of it using .twinx(). Then we can configure each axis separately and call .plot().

ax1 = plt.gca() # get current axis
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('TSLA Stock Price')
+ax2.set_ylabel('Search Trend')
+
+ax1.plot(df_tesla.MONTH, df_tesla.TSLA_USD_CLOSE)
+ax2.plot(df_tesla.MONTH, df_tesla.TSLA_WEB_SEARCH)


Challenge

Now let's style the chart a bit more. In particular, let's check out the different colours you can use with Matplotlib.

For our updated chart, let's differentiate the two lines and the axis labels using different colours. Try using one of the blue colour names for the search volume and a HEX code for a red colour for the stock price. Here's what you're aiming for:


Hint: you can colour both the axis labels and the lines on the chart using keyword arguments (kwargs).


.

.

..

...

..

.

.


Solution: Adding colours

Your code should now look something like this (with your own choice of colours of course):

ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('TSLA Stock Price', color='#E6232E') # can use a HEX code
+ax2.set_ylabel('Search Trend', color='skyblue') # or a named colour
+
+ax1.plot(df_tesla.MONTH, df_tesla.TSLA_USD_CLOSE, color='#E6232E')
+ax2.plot(df_tesla.MONTH, df_tesla.TSLA_WEB_SEARCH, color='skyblue')


Challenge

There are still some ways to improve the look of this chart. First off, let's make it larger. Can you make the following changes:

  1. Increase the figure size (e.g., to 14 by 8).

  2. Increase the font sizes for the labels and the ticks on the x-axis to 14.

  3. Rotate the text on the x-axis by 45 degrees.

  4. Add a title that reads 'Tesla Web Search vs Price'

  5. Make the lines on the chart thicker.

  6. Keep the chart looking sharp by changing the dots-per-inch or DPI value.

  7. Set minimum and maximum values for the y and x-axis. Hint: check out methods like set_xlim().

  8. Finally use plt.show() to display the chart below the cell instead of relying on the automatic notebook output.

After the changes your chart should then look something like this:

.

.

..

...

..

.

.


Solution: Additional styling, increasing size & resolution

There's a couple of tweaks to the code going on here. First, we use .figure() to increase the size and resolution of our chart. Since we now have a bigger chart, we should also increase the font size of our labels and the thickness of our lines.

Finally, we are calling .show() to explicitly display the chart below the cell. This .show() method is important to be aware of if you're ever trying to generate charts in PyCharm or elsewhere outside of an interactive notebook like Google Colab or Jupyter. Also, it gives our notebook a very clean look.

# increases size and resolution
+plt.figure(figsize=(14,8), dpi=120) 
+plt.title('Tesla Web Search vs Price', fontsize=18)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+# Also, increase fontsize and linewidth for larger charts
+ax1.set_ylabel('TSLA Stock Price', color='#E6232E', fontsize=14)
+ax2.set_ylabel('Search Trend', color='skyblue', fontsize=14)
+
+ax1.plot(df_tesla.MONTH, df_tesla.TSLA_USD_CLOSE, color='#E6232E', linewidth=3)
+ax2.plot(df_tesla.MONTH, df_tesla.TSLA_WEB_SEARCH, color='skyblue', linewidth=3)
+
+# Displays chart explicitly
+plt.show()

Here's the code with rotation added to the x-ticks. With .set_ylim() and .set_xlim() you have precise control over which data you want to show on the chart. You can either choose hard values like displaying the Tesla stock price between $0 and $600. Or you could use the .min() and .max() functions to help you work out the bounds for the chart as well.

plt.figure(figsize=(14,8), dpi=120)
+plt.title('Tesla Web Search vs Price', fontsize=18)
+
+# Increase the size and rotate the labels on the x-axis
+plt.xticks(fontsize=14, rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('TSLA Stock Price', color='#E6232E', fontsize=14)
+ax2.set_ylabel('Search Trend', color='skyblue', fontsize=14)
+
+# Set the minimum and maximum values on the axes
+ax1.set_ylim([0, 600])
+ax1.set_xlim([df_tesla.MONTH.min(), df_tesla.MONTH.max()])
+
+ax1.plot(df_tesla.MONTH, df_tesla.TSLA_USD_CLOSE, color='#E6232E', linewidth=3)
+ax2.plot(df_tesla.MONTH, df_tesla.TSLA_WEB_SEARCH, color='skyblue', linewidth=3)
+
+plt.show()


Fix the Matplotlib Warning (if you see it)

At this point, you might have seen this warning below from Matplotlib:

This is not an error, but an FYI to be explicit about which datetime converter to use. We have a timeline on our x-axis after all. To address this simply follow the instructions in the warning message and add the following code:

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/005 Using Locators and DateFormatters to generate Tick Marks on a Time Line.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/005 Using Locators and DateFormatters to generate Tick Marks on a Time Line.html new file mode 100644 index 0000000000000000000000000000000000000000..81a2c26a792b34c3e14e0f6e41c11996029ce7dd --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/005 Using Locators and DateFormatters to generate Tick Marks on a Time Line.html @@ -0,0 +1 @@ +

Adding Locator Tick Marks

When working with time series, it's often quite difficult to get the tick marks on charts looking the way you want to. This is why we have Locator helpers.

Using Locators we can change our x-axis from looking like this:

to looking like this:

The first step is importing matplotlib.dates.  This is where all the date plotting capabilities live.

Next, we need a YearLocator() and a MonthLocator() objects, which will help Matplotlib find the years and the months. Then we also need a DateFormatter(), which will help us specify how we want to display the dates. 

Now we can go back to our chart and format where the major and minor ticks should be using the Locators.

# format the ticksax1.xaxis.set_major_locator(years)ax1.xaxis.set_major_formatter(years_fmt)ax1.xaxis.set_minor_locator(months)

The final outcome should now look like this:

When we take a look at our chart, we can see the tick marks nicely. The tick marks also allow us to visually date that spike of interest in the middle of the chart - March 2016. This was when the Tesla Model 3 was unveiled. Also, we can clearly see that the most recent spikes in search coincide, not with the release of a new car, but the roaring stock price for the company!



\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/006 Data Visualisation - Bitcoin Line Style and Markers.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/006 Data Visualisation - Bitcoin Line Style and Markers.html new file mode 100644 index 0000000000000000000000000000000000000000..6398595262b1bc64ff0b7d52cb00e34ced5d1d97 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/006 Data Visualisation - Bitcoin Line Style and Markers.html @@ -0,0 +1,25 @@ +

Now that we've got Tesla looking the way we want it to, let's do the same for Bitcoin. We've already matched the sample frequency and we can re-use our chart! Simply copy-paste the entire cell and make some modifications to the code as per the challenge.

Challenge


  1. Modify the chart title to read 'Bitcoin News Search vs Resampled Price'

  2. Change the y-axis label to 'BTC Price'

  3. Change the y- and x-axis limits to improve the appearance

  4. Investigate the linestyles to make the BTC closing price a dashed line

  5. Investigate the marker types to make the search datapoints little circles

  6. Were big increases in searches for Bitcoin accompanied by big increases in the price?

The end result should look something like this:

.

.

..

...

..

.

.

Solution: Charting Bitcoin

I hope you had a good go at generating the chart.

Updating the title and the axis labels just involved changing the strings. To set the axis limits, I've chosen $0 to $15,000 on the left y-axis. I've also used a HEX code for orange to colour the line.

To change the line style or the markers, you just have to look at the documentation (e.g., try '--' or '-.' for the linestyle). Similarly for the markers, you also have loads of different options:

I think the main trick with this challenge involved substituting a different set of dates. The months of the time series are found in the index of the monthly bitcoin prices: df_btc_monthly.index.

plt.figure(figsize=(14,8), dpi=120)
+
+plt.title('Bitcoin News Search vs Resampled Price', fontsize=18)
+plt.xticks(fontsize=14, rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('BTC Price', color='#F08F2E', fontsize=14)
+ax2.set_ylabel('Search Trend', color='skyblue', fontsize=14)
+
+ax1.xaxis.set_major_locator(years)
+ax1.xaxis.set_major_formatter(years_fmt)
+ax1.xaxis.set_minor_locator(months)
+
+ax1.set_ylim(bottom=0, top=15000)
+ax1.set_xlim([df_btc_monthly.index.min(), df_btc_monthly.index.max()])
+
+# Experiment with the linestyle and markers
+ax1.plot(df_btc_monthly.index, df_btc_monthly.CLOSE, 
+         color='#F08F2E', linewidth=3, linestyle='--')
+ax2.plot(df_btc_monthly.index, df_btc_search.BTC_NEWS_SEARCH, 
+         color='skyblue', linewidth=3, marker='o')
+
+plt.show()

What we see in the chart is that similar to Tesla, the crazy price movements in the beginning of 2018 are associated with very high search volumes. Everyone was talking about (and buying) Bitcoin in late 2017/early 2018 so search volumes were at a record high!  Interestingly, there was quite a huge spike in bitcoin prices in Q1 of 2019, but this time the increase in search volume was much less pronounced (perhaps because at this point everyone knew what Bitcoin was).

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/007 Data Visualisation - Unemployment How to use Grids.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/007 Data Visualisation - Unemployment How to use Grids.html new file mode 100644 index 0000000000000000000000000000000000000000..d2b2db706f98b7473688cc23003d6e47510402d4 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/007 Data Visualisation - Unemployment How to use Grids.html @@ -0,0 +1,52 @@ +

For the next challenge, carry over your existing code once again (by copy-pasting the entire cell) and make some modifications.

Challenge

Plot the search for "unemployment benefits" against the official unemployment rate.

  1. Change the title to: Monthly Search of "Unemployment Benefits" in the U.S. vs the U/E Rate

  2. Change the y-axis label to: FRED U/E Rate

  3. Change the axis limits

  4. Add a grey grid to the chart to better see the years and the U/E rate values. Use dashed lines for the line style.

  5. Can you discern any seasonality in the searches? Is there a pattern?

.

.

..

...

..

.

.

Solution: Adding a grid to spot seasonality

Ok, so there are relatively few changes you had to make here. Just the labels and the dataset we're using. The line of code I wanted you to figure out from the documentation was this one:

ax1.grid(color='grey', linestyle='--')

This overlays a grid of dashed lines, so that we get the following look:

Notice how we can now clearly see the vertical dashed lines line up with spikes in searches for "Unemployment benefits". Many of the spikes are at year-end - in December. This clearly shows that there is seasonality in the job market. What else do we see? We see that the financial crisis in 2007/2008 caused a massive spike in unemployment. It took around 10 years (2007-2017) for the unemployment to reach the same level it had before the crisis.

Interestingly the big spike in searches for Unemployment benefits at the end of 2013 was not accompanied by a big increase in the unemployment rate. Something else must have been going on around that time.

Here's the full code for the cell:

plt.figure(figsize=(14,8), dpi=120)
+plt.title('Monthly Search of "Unemployment Benefits" in the U.S. vs the U/E Rate', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(fontsize=14, rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('FRED U/E Rate', color='purple', fontsize=14)
+ax2.set_ylabel('Search Trend', color='skyblue', fontsize=14)
+
+ax1.xaxis.set_major_locator(years)
+ax1.xaxis.set_major_formatter(years_fmt)
+ax1.xaxis.set_minor_locator(months)
+
+ax1.set_ylim(bottom=3, top=10.5)
+ax1.set_xlim([df_unemployment.MONTH.min(), df_unemployment.MONTH.max()])
+
+# Show the grid lines as dark grey lines
+ax1.grid(color='grey', linestyle='--')
+
+# Change the dataset used
+ax1.plot(df_unemployment.MONTH, df_unemployment.UNRATE, 
+         color='purple', linewidth=3, linestyle='--')
+ax2.plot(df_unemployment.MONTH, df_unemployment.UE_BENEFITS_WEB_SEARCH, 
+         color='skyblue', linewidth=3)
+
+plt.show()

The search volume moves around quite a bit - month on month. Perhaps we can smooth out the search volumes to get a slightly different picture (pun intended!).


Challenge

Calculate the 3-month or 6-month rolling average for the web searches. Plot the 6-month rolling average search data against the actual unemployment. What do you see? Which line moves first?


Hint: Take a look at our prior lesson on Programming Languages where we smoothed out time-series data.


.

.

..

...

..

.

.


Solution: Rolling Average

You can create a rolling average using .rolling() and .mean() functions together.

roll_df = df_unemployment[['UE_BENEFITS_WEB_SEARCH', 'UNRATE']].rolling(window=6).mean()

Your plot should look something like this:

What is this telling us? We see that searches for "Unemployment Benefits" happen before the actual official unemployment rate goes up. Similarly, the search popularity for the term goes down before the unemployment rate decreases. In other words, these searches seem to act as a leading economic indicator for the unemployment rate (which is a lagging indicator).

Here's the full code for the cell:

plt.figure(figsize=(14,8), dpi=120)
+plt.title('Rolling Monthly US "Unemployment Benefits" Web Searches vs UNRATE', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(fontsize=14, rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.xaxis.set_major_locator(years)
+ax1.xaxis.set_major_formatter(years_fmt)
+ax1.xaxis.set_minor_locator(months)
+
+ax1.set_ylabel('FRED U/E Rate', color='purple', fontsize=16)
+ax2.set_ylabel('Search Trend', color='skyblue', fontsize=16)
+
+ax1.set_ylim(bottom=3, top=10.5)
+ax1.set_xlim([df_unemployment.MONTH[0], df_unemployment.MONTH.max()])
+
+# Calculate the rolling average over a 6 month window
+roll_df = df_unemployment[['UE_BENEFITS_WEB_SEARCH', 'UNRATE']].rolling(window=6).mean()
+
+ax1.plot(df_unemployment.MONTH, roll_df.UNRATE, 'purple', linewidth=3, linestyle='-.')
+ax2.plot(df_unemployment.MONTH, roll_df.UE_BENEFITS_WEB_SEARCH, 'skyblue', linewidth=3)
+
+plt.show()
\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/008 Data Visualisation - Unemployment The Effect of New Data.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/008 Data Visualisation - Unemployment The Effect of New Data.html new file mode 100644 index 0000000000000000000000000000000000000000..10972387db8fbf4366a141997334cecc4628253f --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/008 Data Visualisation - Unemployment The Effect of New Data.html @@ -0,0 +1,18 @@ +

The financial crisis in 2008 was pretty bad. We saw how it took around 10 years for the unemployment rate to go back to where it was prior to the crisis.

Let's see how 2020 affects our analysis.

Challenge

Read the data in the 'UE Benefits Search vs UE Rate 2004-20.csv' into a DataFrame. Convert the MONTH column to Pandas Datetime objects and then plot the chart. What do you see?

.

.

..

...

..

.

.

Solution: Including 2020

Here's how you read the data and make a DataFrame:

df_ue_2020 = pd.read_csv('UE Benefits Search vs UE Rate 2004-20.csv')
+df_ue_2020.MONTH = pd.to_datetime(df_ue_2020.MONTH)

And here's the chart:

plt.figure(figsize=(14,8), dpi=120)
+plt.yticks(fontsize=14)
+plt.xticks(fontsize=14, rotation=45)
+plt.title('Monthly US "Unemployment Benefits" Web Search vs UNRATE incl 2020', fontsize=18)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('FRED U/E Rate', color='purple', fontsize=16)
+ax2.set_ylabel('Search Trend', color='skyblue', fontsize=16)
+
+ax1.set_xlim([df_ue_2020.MONTH.min(), df_ue_2020.MONTH.max()])
+
+ax1.plot(df_ue_2020.MONTH, df_ue_2020.UNRATE, 'purple', linewidth=3)
+ax2.plot(df_ue_2020.MONTH, df_ue_2020.UE_BENEFITS_WEB_SEARCH, 'skyblue', linewidth=3)
+
+plt.show()

What we see is not pretty. The US unemployment rate spiked to unprecedented levels during the COVID pandemic, dwarfing the levels seen during the financial crisis. Let's hope the recovery will be swifter this time.

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Course-Fixes-Report-an-Issue.url b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Google-Trends-Data-Viz-complete.zip b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Google-Trends-Data-Viz-complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..65bc599cb773ea238df07487f351664974321147 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Google-Trends-Data-Viz-complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b5aeaaba14a3b3ff5bf6f83048f19384c11ef2927027d0c672a5a950b8d0be4 +size 784732 diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Learning Points & Summary.html b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..512018b2f8519ca50cf63f4c4af713a296f045a3 --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/009 Learning Points & Summary.html @@ -0,0 +1 @@ +

In this lesson we looked at how to:

You can download the completed code for today in this lesson.


Well done for completing another challenging data science day! I hope working with Pandas is starting to feel more and more second nature at this point.

\ No newline at end of file diff --git a/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/external-links.txt b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8d82232602470a1524bd2d87e669227ae554fea --- /dev/null +++ b/part3/75 - Day 75 - Advanced - Google Trends Data Resampling and Visualising Time Series/external-links.txt @@ -0,0 +1,3 @@ + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/001 Day 76 Goals what you will make by the end of the day.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/001 Day 76 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..7ac43a5881faf923df737024bef959e411e1ae65 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/001 Day 76 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Wrestle the Android App Store Data into Beautiful Looking Charts with Plotly

Have you ever thought about building your own an iOS or Android app? If so, then you probably have wondered about how things work in the app stores. Today we'll replicate some of the app store analytics provided by companies like App Annie or Sensor Tower that helps inform development and app marketing strategies for many companies. This stuff is BIG business!


In this module, we will compare thousands of apps in the Google Play Store so that we can gain insight into:


Today you'll learn:


Download and add the Notebook to Google Drive

As usual, download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook.


Add the Data to the Notebook

The .zip file also includes a .csv file. This is the data for the project. Add this your notebook.


\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/001 Google-Play-Store-Project-Start.zip b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/001 Google-Play-Store-Project-Start.zip new file mode 100644 index 0000000000000000000000000000000000000000..6e8c15ad94cd94edb66bdcd337d3f92aa6c25fe5 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/001 Google-Play-Store-Project-Start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e0b73e7af145a54ecfc5f2fa7b659e419ca0bc9dcca4b233efd15a132d25cd2 +size 291940 diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/002 Data Cleaning Removing NaN Values and Duplicates.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/002 Data Cleaning Removing NaN Values and Duplicates.html new file mode 100644 index 0000000000000000000000000000000000000000..cab74c583d4ea7561936cb674d6d7d2dbd6f5f6b --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/002 Data Cleaning Removing NaN Values and Duplicates.html @@ -0,0 +1,4 @@ +

The first step as always is getting a better idea about what we're dealing with.


Preliminary Data Exploration


Challenge: How many rows and columns does df_apps have? What are the column names? What does the data look like? Look at a random sample of 5 different rows with .sample()


.

.

..

...

..

.

.

Solution


Compared to the previous projects we are working with a fairly large DataFrame this time.

df_apps.shape

tells us we have 10841 rows and 12 columns.

We can already see that there are some data issues that we need to fix. In the Ratings and Type columns there are NaN (Not a number values) and in the Price column we have dollar signs that will cause problems.


The .sample(n) method will give us n random rows. This is another handy way to inspect our DataFrame.

Challenge: Remove the columns called Last_Updated and Android_Version from the DataFrame. We will not use these columns.


Challenge: How many rows have a NaN value (not-a-number) in the Rating column? Create DataFrame called df_apps_clean that does not include these rows.




.

.

..

...

..

.

.


Solution: Dropping Unused Columns and Removing NaN Values


To remove the unwanted columns, we simply provide a list of the column names ['Last_Updated', Android_Ver'] to the .drop() method. By setting axis=1 we are specifying that we want to drop certain columns.

To find and remove the rows with the NaN values we can create a subset of the DataFrame based on where .isna() evaluates to True. We see that NaN values in ratings are associated with no reviews (and no installs). That makes sense.

We can drop the NaN values with .dropna():


df_apps_clean = df_apps.dropna()
+df_apps_clean.shape

This leaves us with 9,367 entries in our DataFrame. But there may be other problems with the data too:


Challenge: Are there any duplicates in data? Check for duplicates using the .duplicated() function. How many entries can you find for the "Instagram" app? Use .drop_duplicates() to remove any duplicates from df_apps_clean.



.

.

..

..

.

.


Solution: Finding and Removing Duplicates


There are indeed duplicates in the data. We can show them using the .duplicated() method, which brings up 476 rows:


duplicated_rows = df_apps_clean[df_apps_clean.duplicated()]
+print(duplicated_rows.shape)
+duplicated_rows.head()


We can actually check for an individual app like Instagram by looking up all the entries with that name in the App column.

So how do we get rid of duplicates? Can we simply call .drop_duplicates()?


df_apps_clean = df_apps_clean.drop_duplicates()

Not really. If we do this without specifying how to identify duplicates, we see that 3 copies of Instagram are retained because they have a different number of reviews. We need to provide the column names that should be used in the comparison to identify duplicates. For example:

This leaves us with 8,199 entries after removing duplicates. Huzzah!



What else should I know about the data?


So we can see that 13 different features were originally scraped from the Google Play Store.



Heres what you would see under an Android app listing if you go to a listing on the Google Play Store:



\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/003 Preliminary Exploration The Highest Ratings, Most Reviews, and Largest Size.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/003 Preliminary Exploration The Highest Ratings, Most Reviews, and Largest Size.html new file mode 100644 index 0000000000000000000000000000000000000000..8f45e528b11ac144a54bfab88cd2109c23c48a14 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/003 Preliminary Exploration The Highest Ratings, Most Reviews, and Largest Size.html @@ -0,0 +1 @@ +

Challenge: Identify which apps are the highest rated. What problem might you encounter if you rely exclusively on ratings alone to determine the quality of an app?

Challenge: What's the size in megabytes (MB) of the largest Android apps in the Google Play Store. Based on the data, do you think there could be a limit in place or can developers make apps as large as they please?

Challenge: Which apps have the highest number of reviews? Are there any paid apps among the top 50?



.

.

..

..

.

.


Solution: Preliminary Data Exploration

This challenge should have been fairly straightforward if you remembered to use the .sort_values() function.

df_apps_clean.sort_values('Rating', ascending=False).head()

Only apps with very few reviews (and a low number on installs) have perfect 5 star ratings (most likely by friends and family).

df_apps_clean.sort_values('Size_MBs', ascending=False).head()

Here we can clearly see that there seems to be an upper bound of 100 MB for the size of an app. A quick google search would also have revealed that this limit is imposed by the Google Play Store itself. Its interesting to see that a number of apps actually hit that limit exactly.

df_apps_clean.sort_values('Reviews', ascending=False).head(50)

If you look at the number of reviews, you can find the most popular apps on the Android App Store. These include the usual suspects: Facebook, WhatsApp, Instagram etc. Whats also notable is that the list of the top 50 most reviewed apps does not include a single paid app!

\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/004 Data Visualisation with Plotly Create Pie and Donut Charts.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/004 Data Visualisation with Plotly Create Pie and Donut Charts.html new file mode 100644 index 0000000000000000000000000000000000000000..829ed332f1e67d8822bb345137e5e8fb751aa66d --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/004 Data Visualisation with Plotly Create Pie and Donut Charts.html @@ -0,0 +1,16 @@ +

All Android apps have a content rating like Everyone or Teen or Mature 17+. Lets take a look at the distribution of the content ratings in our dataset and see how to visualise it with plotly - a popular data visualisation library that you can use alongside or instead of Matplotlib.

First, well count the number of occurrences of each rating with .value_counts()

ratings = df_apps_clean.Content_Rating.value_counts()

The first step in creating charts with plotly is to import plotly.express. This is the fastest way to create a beautiful graphic with a minimal amount of code in plotly.

To create a pie chart we simply call px.pie() and then .show() the resulting figure. Plotly refers to all their figures, be they line charts, bar charts, or pie charts as graph_objects.

Lets customise our pie chart. Looking at the .pie() documentation we see a number of parameters that we can set, like title or names.

If youd like to configure other aspects of the chart, that you cant see in the list of parameters, you can call a method called .update_traces(). In plotly lingo, traces refer to graphical marks on a figure. Think of traces as collections of attributes. Here we update the traces to change how the text is displayed.

fig = px.pie(labels=ratings.index,
+values=ratings.values,
+title="Content Rating",
+names=ratings.index,
+)
+fig.update_traces(textposition='outside', textinfo='percent+label')
+
+fig.show()

To create a donut chart, we can simply add a value for the hole argument:

fig = px.pie(labels=ratings.index,
+values=ratings.values,
+title="Content Rating",
+names=ratings.index,
+hole=0.6,
+)
+fig.update_traces(textposition='inside', textfont_size=15, textinfo='percent')
+
+fig.show()

Yum!


\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/005 Numeric Type Conversions for the Installations & Price Data.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/005 Numeric Type Conversions for the Installations & Price Data.html new file mode 100644 index 0000000000000000000000000000000000000000..037b78413d938db35279ace48491ff2cf7633b06 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/005 Numeric Type Conversions for the Installations & Price Data.html @@ -0,0 +1,8 @@ +

Challenge

How many apps had over 1 billion (that's right - BILLION) installations? How many apps just had a single install?


  1. Check the datatype of the Installs column.

  2. Count the number of apps at each level of installations.

  3. Convert the number of installations (the Installs column) to a numeric data type. Hint: this is a 2-step process. You'll have to make sure you remove non-numeric characters first.



.

.

..

..

.

.


Solution: Data Cleaning & Converting Data to Numeric Types

To check the data types you can either use .describe() on the column or .info() on the DataFrame.

Both of these show that we are dealing with a non-numeric data type. In this case, the type is "object".


If we take two of the columns, say Installs and the App name, we can count the number of entries per level of installations with .groupby() and .count(). However, because we are dealing with a non-numeric data type, the ordering is not helpful. The reason Python is not recognising our installs as numbers is because of the comma (,) characters.

We can remove the comma (,) character - or any character for that matter - from a DataFrame using the strings .replace() method. Here were saying: replace the , with an empty string. This completely removes all the commas in the Installs column. We can then convert our data to a number using .to_numeric().

df_apps_clean.Installs = df_apps_clean.Installs.astype(str).str.replace(',', "")
+df_apps_clean.Installs = pd.to_numeric(df_apps_clean.Installs)
+df_apps_clean[['App', 'Installs']].groupby('Installs').count()

Let's examine the Price column more closely.


Challenge

Convert the price column to numeric data. Then investigate the top 20 most expensive apps in the dataset.


Remove all apps that cost more than $250 from the df_apps_clean DataFrame.


Add a column called 'Revenue_Estimate' to the DataFrame. This column should hold the price of the app times the number of installs. What are the top 10 highest-grossing paid apps according to this estimate? Out of the top 10, how many are games?




.

.

..

..

.

.


Solution: Finding the most Expensive Apps and Filtering out the Junk


If you look at the data type of the price column:

df_apps_clean.Price.describe()

You also see that is of type object. The reason is the dollar $ signs that weve spotted before. To convert the price column to numeric data we use the .replace() method once again, but this time we filter out the dollar sign.

df_apps_clean.Price = df_apps_clean.Price.astype(str).str.replace('$', "")
+df_apps_clean.Price = pd.to_numeric(df_apps_clean.Price)
+
+df_apps_clean.sort_values('Price', ascending=False).head(20)

Heres what we see:

Whats going on here? There are 15 I am Rich Apps in the Google Play Store apparently. They all cost $300 or more, which is the main point of the app. The story goes that in 2008, Armin Heinrich released the very first I am Rich app in the iOS App Store for $999.90. The app does absolutely nothing. It just displays the picture of a gemstone and can be used to prove to your friends how rich you are. Armin actually made a total of 7 sales before the app was hastily removed by Apple. Nonetheless, it inspired a bunch of copycats on the Android App Store, but if you search today, youll find all of these apps have disappeared as well. The high installation numbers are likely gamed by making the app was available for free at some point to get reviews and appear more legitimate.

Leaving this bad data in our dataset will misrepresent our analysis of the most expensive 'real' apps. Heres how we can remove these rows:

df_apps_clean = df_apps_clean[df_apps_clean['Price'] < 250]
+df_apps_clean.sort_values('Price', ascending=False).head(5)

When we look at the top 5 apps now, we see that 4 out of 5 are medical apps.

We can work out the highest grossing paid apps now. All we need to do is multiply the values in the price and the installs column to get the number:

df_apps_clean['Revenue_Estimate'] = df_apps_clean.Installs.mul(df_apps_clean.Price)
+df_apps_clean.sort_values('Revenue_Estimate', ascending=False)[:10]

This generously assumes of course that all the installs would have been made at the listed price, which is unlikely, as there are always promotions and free give-aways on the App Stores.

The top spot of the highest-grossing paid app goes to Minecraft at close to $70 million. Its quite interesting that Minecraft (along with Bloons and Card Wars) is actually listed in the Family category rather than in the Game category. If we include these titles, we see that 7 out the top 10 highest-grossing apps are games. The Google Play Store seems to be quite flexible with its category labels.


\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/006 Plotly Bar Charts & Scatter Plots The Most Competitive & Popular App Categories.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/006 Plotly Bar Charts & Scatter Plots The Most Competitive & Popular App Categories.html new file mode 100644 index 0000000000000000000000000000000000000000..ba84d4d8d867c91a50f1729a8c8ee507732d896a --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/006 Plotly Bar Charts & Scatter Plots The Most Competitive & Popular App Categories.html @@ -0,0 +1,29 @@ +

If you were to release an app, would you choose to go after a competitive category with many other apps? Or would you target a popular category with a high number of downloads? Or perhaps you can target a category which is both popular but also one where the downloads are spread out among many different apps. That way, even if its more difficult to discover among all the other apps, your app has a better chance of getting installed, right? Lets analyse this with bar charts and scatter plots and figure out which categories are dominating the market.


We can find the number of different categories like so:

df_apps_clean.Category.nunique()

Which shows us that we there are 33 unique categories.


To calculate the number of apps per category we can use our old friend .value_counts()

top10_category = df_apps_clean.Category.value_counts()[:10]

To visualise this data in a bar chart we can use the plotly express (our px) bar() function:

bar = px.bar(x = top10_category.index, # index = category name
+             y = top10_category.values)
+
+bar.show()

Based on the number of apps, the Family and Game categories are the most competitive. Releasing yet another app into these categories will make it hard to get noticed.


But what if we look at it from a different perspective? What matters is not just the total number of apps in the category but how often apps are downloaded in that category. This will give us an idea of how popular a category is. First, we have to group all our apps by category and sum the number of installations:

category_installs = df_apps_clean.groupby('Category').agg({'Installs': pd.Series.sum})
+category_installs.sort_values('Installs', ascending=True, inplace=True)

Then we can create a horizontal bar chart, simply by adding the orientation parameter:

h_bar = px.bar(x = category_installs.Installs,
+               y = category_installs.index,
+               orientation='h')
+
+h_bar.show()

We can also add a custom title and axis labels like so:

h_bar = px.bar(x = category_installs.Installs,
+               y = category_installs.index,
+               orientation='h',
+               title='Category Popularity')
+
+h_bar.update_layout(xaxis_title='Number of Downloads', yaxis_title='Category')
+h_bar.show()

Now we see that Games and Tools are actually the most popular categories. If we plot the popularity of a category next to the number of apps in that category we can get an idea of how concentrated a category is. Do few apps have most of the downloads or are the downloads spread out over many apps?

Challenge

As a challenge, lets use plotly to create a scatter plot that looks like this:


Hint: Use the size, hover_name and color parameters in .scatter(). To scale the y-axis, call .update_layout() and specify that the y-axis should be on a log-scale like so: yaxis=dict(type='log')





.

.

..

..

.

.


Solution: Create a scatter plot with Plotly

First, we need to work out the number of apps in each category (similar to what we did previously).

cat_number = df_apps_clean.groupby('Category').agg({'App': pd.Series.count})

Then we can use .merge() and combine the two DataFrames.

cat_merged_df = pd.merge(cat_number, category_installs, on='Category', how="inner")
+print(f'The dimensions of the DataFrame are: {cat_merged_df.shape}')
+cat_merged_df.sort_values('Installs', ascending=False)

Now we can create the chart. Note that we can pass in an entire DataFrame and specify which columns should be used for the x and y by column name.

scatter = px.scatter(cat_merged_df, # data
+                    x='App', # column name
+                    y='Installs',
+                    title='Category Concentration',
+                    size='App',
+                    hover_name=cat_merged_df.index,
+                    color='Installs')
+
+scatter.update_layout(xaxis_title="Number of Apps (Lower=More Concentrated)",
+                      yaxis_title="Installs",
+                      yaxis=dict(type='log'))
+
+scatter.show()

What we see is that the categories like Family, Tools, and Game have many different apps sharing a high number of downloads. But for the categories like video players and entertainment, all the downloads are concentrated in very few apps.



\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/007 Extracting Nested Column Data using .stack().html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/007 Extracting Nested Column Data using .stack().html new file mode 100644 index 0000000000000000000000000000000000000000..b18b0fd4110ee3d2bdc7ab12fc4237f1cd43de4d --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/007 Extracting Nested Column Data using .stack().html @@ -0,0 +1,16 @@ +

Lets turn our attention to the Genres column. This is quite similar to the categories column but more granular.


Challenge

How many different types of genres are there? Can an app belong to more than one genre? Check what happens when you use .value_counts() on a column with nested values? See if you can work around this problem by using the .split() function and the DataFrame's .stack() method.





.

.

..

..

.

.



Solution: Working with Nested Column Data

If we look at the number of unique values in the Genres column we get 114. But this is not accurate if we have nested data like we do here. We can see this using .value_counts() and looking at the values that just have a single entry. There we see that the semi-colon (;) separates the genre names.

We somehow need to separate the genre names to get a clear picture. This is where the strings .split() method comes in handy. After weve separated our genre names based on the semi-colon, we can add them all into a single column with .stack() and then use .value_counts().


# Split the strings on the semi-colon and then .stack them.
+stack = df_apps_clean.Genres.str.split(';', expand=True).stack()
+print(f'We now have a single column with shape: {stack.shape}')
+num_genres = stack.value_counts()
+print(f'Number of genres: {len(num_genres)}')

This shows us we actually have 53 different genres.

Challenge

Can you create this chart with the Series containing the genre data?

Try experimenting with the built-in colour scales in Plotly. You can find a full list here.







.

.

..

..

.

.



Solution: Working with Colour Scales in Plotly


bar = px.bar(x = num_genres.index[:15], # index = category name
+             y = num_genres.values[:15], # count
+             title='Top Genres',
+             hover_name=num_genres.index[:15],
+             color=num_genres.values[:15],
+             color_continuous_scale='Agsunset')
+
+bar.update_layout(xaxis_title='Genre',
+yaxis_title='Number of Apps',
+coloraxis_showscale=False)
+
+bar.show()
\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/008 Grouped Bar Charts and Box Plots with Plotly.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/008 Grouped Bar Charts and Box Plots with Plotly.html new file mode 100644 index 0000000000000000000000000000000000000000..1a9999f42918c25c0363dfffc298b7fa6d460f89 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/008 Grouped Bar Charts and Box Plots with Plotly.html @@ -0,0 +1,45 @@ +

Now that weve looked at the total number of apps per category and the total number of apps per genre, lets see what the split is between free and paid apps.

df_apps_clean.Type.value_counts()

We see that the majority of apps are free on the Google Play Store. But perhaps some categories have more paid apps than others. Lets investigate. We can group our data first by Category and then by Type. Then we can add up the number of apps per each type. Using as_index=False we push all the data into columns rather than end up with our Categories as the index.

df_free_vs_paid = df_apps_clean.groupby(["Category", "Type"], as_index=False).agg({'App': pd.Series.count})
+df_free_vs_paid.head()

Unsurprisingly the biggest categories have the most paid apps. However, there might be some patterns if we put the numbers of a graph!

Challenge


Use the plotly express bar chart examples and the .bar() API reference to create this bar chart:

You'll want to use the df_free_vs_paid DataFrame that you created above that has the total number of free and paid apps per category.


See if you can figure out how to get the look above by changing the categoryorder to 'total descending' as outlined in the documentation here.



.

.

..

..

.

.


Solution: Contrasting Free vs. Paid Apps per Category

The key is using the color and barmode parameters for the .bar() method. To get a particular order, you can pass a dictionary to the axis parameter in .update_layout().

g_bar = px.bar(df_free_vs_paid,
+               x='Category',
+               y='App',
+               title='Free vs Paid Apps by Category',
+               color='Type',
+               barmode='group')
+
+g_bar.update_layout(xaxis_title='Category',
+                    yaxis_title='Number of Apps',
+                    xaxis={'categoryorder':'total descending'},
+                    yaxis=dict(type='log'))
+
+g_bar.show()

What we see is that while there are very few paid apps on the Google Play Store, some categories have relatively more paid apps than others, including Personalization, Medical and Weather. So, depending on the category you are targeting, it might make sense to release a paid-for app.

But this leads to many more questions:


Lets try and answer these questions with some Box plots. Box plots show us some handy descriptive statistics in a graph - things like the median value, the maximum value, the minimum value, and some quartiles. Heres what were after:

But how do we get there? This is your challenge.

Challenge

Create a box plot that shows the number of Installs for free versus paid apps. How does the median number of installations compare? Is the difference large or small?

Use the Box Plots Guide and the .box API reference to create the chart above.



.

.

..

..

.

.




Solution: Create Box Plots for the Number of Installs

From the hover text in the chart, we see that the median number of downloads for free apps is 500,000, while the median number of downloads for paid apps is around 5,000! This is massively lower.

box = px.box(df_apps_clean,
+             y='Installs',
+             x='Type',
+             color='Type',
+             notched=True,
+             points='all',
+             title='How Many Downloads are Paid Apps Giving Up?')
+
+box.update_layout(yaxis=dict(type='log'))
+
+box.show()

But does this mean we should give up on selling a paid app? Lets see how much revenue we would estimate per category.


Challenge

See if you can generate the chart below:

Looking at the hover text, how much does the median app earn in the Tools category? If developing an Android app costs $30,000 or thereabouts, does the average photography app recoup its development costs?


Hint: I've used 'min ascending' to sort the categories.




.

.

..

..

.

.


Solution: App Revenue by Category

If an Android app costs $30,000 to develop, then the average app in very few categories would cover that development cost. The median paid photography app earned about $20,000. Many more apps revenues were even lower - meaning they would need other sources of revenue like advertising or in-app purchases to make up for their development costs. However, certain app categories seem to contain a large number of outliers that have much higher (estimated) revenue - for example in Medical, Personalisation, Tools, Game, and Family.

So, if you were to list a paid app, how should you price it? To help you decide we can look at how your competitors in the same category price their apps.

df_paid_apps = df_apps_clean[df_apps_clean['Type'] == 'Paid']
box = px.box(df_paid_apps, 
+             x='Category', 
+             y='Revenue_Estimate',
+             title='How Much Can Paid Apps Earn?')
+
+box.update_layout(xaxis_title='Category',
+                  yaxis_title='Paid App Ballpark Revenue',
+                  xaxis={'categoryorder':'min ascending'},
+                  yaxis=dict(type='log'))
+
+
+box.show()


Challenge

What is the median price for a paid app? Then compare pricing by category by creating another box plot. But this time examine the prices (instead of the revenue estimates) of the paid apps. I recommend using {categoryorder':'max descending'} to sort the categories.



.

.

..

..

.

.



Solution: App Pricing by Category

The median price for an Android app is $2.99.

df_paid_apps.Price.median()

However, some categories have higher median prices than others. This time we see that Medical apps have the most expensive apps as well as a median price of $5.49. In contrast, Personalisation apps are quite cheap on average at $1.49. Other categories which higher median prices are Business ($4.99) and Dating ($6.99). It seems like customers who shop in these categories are not so concerned about paying a bit extra for their apps.

box = px.box(df_paid_apps,
+             x='Category',
+             y="Price",
+             title='Price per Category')
+
+box.update_layout(xaxis_title='Category',
+                  yaxis_title='Paid App Price',
+                  xaxis={'categoryorder':'max descending'},
+                  yaxis=dict(type='log'))
+
+box.show()


\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Course-Fixes-Report-an-Issue.url b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Google-Play-Store-Analysis-Complete.zip b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Google-Play-Store-Analysis-Complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..32cab991497ddada13f730713c47dde37158cfae --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Google-Play-Store-Analysis-Complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8e611cafd5f5b3dd1b47f52190d6f7ed4c68d4510d3b9edd2000bf9056dbccc +size 321480 diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Learning Points & Summary.html b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..66ea597794502bc8ec519c98b32912721eb19760 --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/009 Learning Points & Summary.html @@ -0,0 +1 @@ +

In this lesson we looked at how to:

You can download the completed code for today in this lesson.


Well done on completing today's lessons!  I hope you enjoyed todays Google Play Store analysis. It's incredible how much more of a clear picture we can get about the app ecosystem just by looking into some scraped website data for the Google Play Store.


\ No newline at end of file diff --git a/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/external-links.txt b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8d82232602470a1524bd2d87e669227ae554fea --- /dev/null +++ b/part3/76 - Day 76 - Advanced - Beautiful Plotly Charts & Analysing the Android App Store/external-links.txt @@ -0,0 +1,3 @@ + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/001 Computation-with-NumPy-start.zip b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/001 Computation-with-NumPy-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..1534f7ad96cdd29f8d33e0153d7bd20448102626 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/001 Computation-with-NumPy-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0b4949fcff3ac57762ed0cfb1230d534b9d3cd089b113d9666fd41e9f4060c5 +size 120390 diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/001 Day 77 Goals what you will make by the end of the day.html b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/001 Day 77 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..75ed467a9ce33e8a9bea113c175cdfeced72aa7a --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/001 Day 77 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

No Data Science course can be complete without learning NumPy (Numerical Python). NumPy is a Python library thats used in almost every field of science and engineering. Its practically THE standard for working with numerical data in Python. The case studies for how NumPy is being used speak for themselves  

So far, weve been using Pandas, which is built on top of NumPy. Think of Pandas as a high-level data manipulation tool that includes functionality for working with time-series or for grouping, joining, merging and finding missing data (i.e., everything weve been doing so far). NumPy on the other hand shines with low-level tasks, like doing serious math and calculations.


Today you'll learn:

Download and add the Notebook to Google Drive

As usual, download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook.


Add the Data to the Notebook

The .zip file also includes an image. This is the data for the project. Add this file to your notebook.



\ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/002 NumPy's ndarray - Incredible Power at Your Fingertips!.html b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/002 NumPy's ndarray - Incredible Power at Your Fingertips!.html new file mode 100644 index 0000000000000000000000000000000000000000..1173bdbd723d9d86443b89d961a95b1589332661 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/002 NumPy's ndarray - Incredible Power at Your Fingertips!.html @@ -0,0 +1,12 @@ +

Lets import NumPy

Well follow convention and use the name np.

The crown jewel of NumPy is the ndarray. The ndarray is a homogeneous n-dimensional array object. What does that mean?

A Python List or a Pandas DataFrame can contain a mix of strings, numbers, or objects (i.e., a mix of different types). Homogenous means all the data have to have the same data type, for example all floating-point numbers.

And n-dimensional means that we can work with everything from a single column (1-dimensional) to the matrix (2-dimensional) to a bunch of matrices stacked on top of each other (n-dimensional).

1-Dimension

Lets create a 1-dimensional array (i.e., a vector)

my_array = np.array([1.1, 9.2, 8.1, 4.7])

We can see my_array is 1 dimensional by looking at its shape

my_array.shape

We access an element in a ndarray similar to how we work with a Python List, namely by that element's index:

my_array[2]

Lets check the dimensions of my_array with the ndim attribute:

my_array.ndim

2-Dimensions

Now, lets create a 2-dimensional array (i.e., a matrix)

array_2d = np.array([[1, 2, 3, 9], [5, 6, 7, 8]])

Note we have two pairs of square brackets. This array has 2 rows and 4 columns. NumPy refers to the dimensions as axes, so the first axis has length 2 and the second axis has length 4.

print(f'array_2d has {array_2d.ndim} dimensions')
+print(f'Its shape is {array_2d.shape}')
+print(f'It has {array_2d.shape[0]} rows and {array_2d.shape[1]} columns')
+print(array_2d)

Again, you can access a particular row or a particular value with the square bracket notation. To access a particular value, you have to provide an index for each dimension. We have two dimensions, so we need to provide an index for the row and for the column. Heres how to access the 3rd value in the 2nd row:

array_2d[1,2]

To access an entire row and all the values therein, you can use the : operator just like you would do with a Python List. Heres the entire first row:

array_2d[0, :]


N-Dimensions

An array of 3 dimensions (or higher) is often referred to as a tensor. Yes, thats also where Tensorflow, the popular machine learning tool, gets its name. A tensor simply refers to an n-dimensional array. Using what you've learned about 1- and 2-dimensional arrays, can you apply the same techniques to tackle a more complex array?


Challenge

mystery_array = np.array([[[0, 1, 2, 3],
+                           [4, 5, 6, 7]],
+                        
+                         [[7, 86, 6, 98],
+                          [5, 1, 0, 4]],
+                          
+                          [[5, 36, 32, 48],
+                           [97, 0, 27, 18]]])


.

.

..

...

..

.

.

Solution: Working with Higher Dimensions

This is really where we have to start to wrap our heads around how ndarrays work because it takes some getting used to the notation.

The ndim and shape attributes show us the number of dimensions and the length of the axes respectively.

print(f'We have {mystery_array.ndim} dimensions')
+print(f'The shape is {mystery_array.shape}')

The shape is (3, 2, 4), so we have 3 elements along axis #0, 2 elements along axis #1 and 4 elements along axis #3.

To access the value 18 we, therefore, have to provide three different indices - one for each axis. As such, we locate the number at index 2 for the first axis, index number 1 for the second axis, and index number 3 for the third axis.

mystery_array[2, 1, 3]

The values [97, 0, 27, 18] live on the 3rd axis and are on position 2 for the first axis and position 1 on the second axis. Hence we can retrieve them like so:


mystery_array[2, 1, :]

Finally, to retrieve all the first elements on the third axis, we can use the colon operator for the other two dimensions.

mystery_array[:, :, 0]

With the square brackets serving as your guide, the ndarray is quite difficult to visualise for 3 or more dimensions. So if any of this was unclear or confusing. Pause on this lesson for a minute and play around with the array above. Try selecting different subsets from the array. That way you can get comfortable thinking along the different dimensions of the ndarray.




\ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/003 Generating and Manipulating ndarrays.html b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/003 Generating and Manipulating ndarrays.html new file mode 100644 index 0000000000000000000000000000000000000000..88000a3e0988c1bf5b8ac0ea5d908872ae141770 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/003 Generating and Manipulating ndarrays.html @@ -0,0 +1,14 @@ +

NumPy has many many pages of documentation on all of its extensive functionality. But rather than go through the list one by one, the best way to actually learn NumPy is to apply it to a series of small problems. That way you can familiarise yourself with how to use NumPy for the common use cases that you'll encounter on your own data science journey too.


Challenge 1

Use .arange()to createa a vector a with values ranging from 10 to 29. You should get this:

print(a)

[10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29]


Challenge 2

Use Python slicing techniques on a to:


Challenge 3

Reverse the order of the values in a, so that the first element comes last:

[29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10]

If you need a hint, you can check out this part of the NumPy beginner's guide


Challenge 4

Print out all the indices of the non-zero elements in this array: [6,0,9,0,0,5,0]


Challenge 5

Use NumPy to generate a 3x3x3 array with random numbers

Hint: Use the .random() function


Challenge 6

Use .linspace() to create a vector x of size 9 with values spaced out evenly between 0 to 100 (both included).


Challenge 7

Use .linspace() to create another vector y of size 9 with values between -3 to 3 (both included). Then plot x and y on a line chart using Matplotlib.


Challenge 8

Use NumPy to generate an array called noise with shape 128x128x3 that has random values. Then use Matplotlib's .imshow() to display the array as an image.

The random values will be interpreted as the RGB colours for each pixel.




.

.

..

...

..

.

.


Solution: To the NumPy Mini Challenges

Challenge 1: Previously we created NumPy arrays manually where we specified each and every value like this: np.array([1.1, 9.2, 8.1, 4.7])

We can also generate a NumPy arrays using some built-in functions like .arange(). In this case, we can create an array of evenly spaced values by just providing a start and stop value.

a = np.arange(10,30)
+print(a)

Challenge 2: This should be a little bit of revision for using the colon : operator to select a range or interval in an array.

The last 3 values in the array:

a[-3:]

An interval between two values:

a[3:6]

All the values except the first 12:

a[12:]

Every second value (i.e., all the even values in our case)

a[::2]

Challenge 3: To reverse the order of an array, you can either use the (double) colon operator once again or use the built-in .flip() function. Either way works.

np.flip(a)

or

a[::-1]

Challenge 4:  If you did a quick Google search, chances are you discovered the built-in .nonzero() function to print out all the non-zero elements. You can use it like so:

b = np.array([6,0,9,0,0,5,0])
+nz_indices = np.nonzero(b)
+nz_indices # note this is a tuple

Challenge 5: The .random() function is another way to quickly create a ndarray, just like .arange(). The .random() function lives under np.random so you'll either have to import random

from numpy.random import random
+z = random((3,3,3))
+z

or use the full path to call it.

z = np.random.random((3,3,3)) # without an import statement
+print(z.shape)
+z

Challenge 6: The .linspace() function is very similar to .arange() and great for generating evenly spaced numbers over an interval. To generate the vector use:

x = np.linspace(0, 100, num=9)
+print(x)
+x.shape

Challenge 7: A common use-case for .linspace() is to generate the points that you'd like to plot on a chart.

y = np.linspace(start=-3, stop=3, num=9)
+plt.plot(x, y)
+plt.show()


Challenge 8: When you have a 3-dimensional array with values between 0 and 1, we can use Matplotlib to interpret these values as the red-green-blue (RGB) values for a pixel.

noise = np.random.random((128,128,3))
+print(noise.shape)
+plt.imshow(noise)

That's pretty cool, right?! We've just generated a 128x128 pixel image of random noise because each dimension in our NumPy array can be interpreted to hold the colour information for a pixel.


\ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/004 Broadcasting, Scalars and Matrix Multiplication.html b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/004 Broadcasting, Scalars and Matrix Multiplication.html new file mode 100644 index 0000000000000000000000000000000000000000..d92681dff52263547f6c1b2b6f1736e5db684bea --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/004 Broadcasting, Scalars and Matrix Multiplication.html @@ -0,0 +1,11 @@ +

Linear Algebra with Vectors

NumPy is designed to do math (and do it well!). This means that NumPy will treat vectors, matrices and tensors in a way that a mathematician would expect. For example, if you had two vectors:

v1 = np.array([4, 5, 2, 7])
+v2 = np.array([2, 1, 3, 3])

And you add them together

v1 + v2

The result will be a ndarray where all the elements have been added together.

array([ 6, 6, 5, 10])

In contrast, if we had two Python Lists

list1 = [4, 5, 2, 7]
+list2 = [2, 1, 3, 3]

adding them together would just concatenate the lists.

list1 + list2
+# output: [4, 5, 2, 7, 2, 1, 3, 3]

Multiplying the two vectors together also results in an element by element operation:

v1 * v2

Gives us array([ 8, 5, 6, 21]) since 4x2=8, 5x1=5 and so on. And for a Python List, this operation would not work at all.

list1 * list2 # error!


Broadcasting

Now, oftentimes you'll want to do some sort of operation between an array and a single number. In mathematics, this single number is often called a scalar. For example, you might want to multiply every value in your NumPy array by 2:

In order to achieve this result, NumPy will make the shape of the smaller array - our scalar - compatible with the larger array. This is what the documentation refers to when it mentions the term "broadcasting".

The same rules about 'expanding' the smaller ndarray hold true for 2 or more dimensions. We can see this with a 2-Dimensional Array:

array_2d = np.array([[1, 2, 3, 4], 
+                     [5, 6, 7, 8]])

The scalar operates on an element by element basis.

The documentation on broadcasting also shows us a few more examples:


Matrix Multiplication

But what if we're not multiplying our ndarray by a single number? What if we multiply it by another vector or a 2-dimensional array? In this case, we follow the rules of linear algebra.

a1 = np.array([[1, 3],
+               [0, 1],
+               [6, 2],
+               [9, 7]])
+
+b1 = np.array([[4, 1, 3],
+               [5, 8, 5]])

Challenge: Let's multiply a1 with b1. Looking at the Wikipedia example above, work out the values for c12 and c33 on paper. Then use the .matmul() function or the @ operator to check your work.



.

.

..

...

..

.

.


Solution: Matrix multiplication with NumPy

The solution code is pretty straightforward

But how did the calculations arrive at 25 for c12 and 28 for c33? Substituting the number into the formula we get:

c12 = 1*1 + 3*8 = 1 + 24 = 25

c33 = 6*3 + 2*5 = 18 + 10 = 28



\ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/005 Manipulating Images as ndarrays.html b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/005 Manipulating Images as ndarrays.html new file mode 100644 index 0000000000000000000000000000000000000000..cf228a4623b0ab78c357988bc5d620419ff374d8 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/005 Manipulating Images as ndarrays.html @@ -0,0 +1,2 @@ +

Images are nothing other than a collection of pixels. And each pixel is nothing other than value for a colour. And any colour can be represented as a combination of red, green, and blue (RGB).

You should two import statements at the top. Scipy and PIL will help us work with images.

The Scipy library contains an image of a racoon under 'miscellaneous' (misc). We an fetch it like so:

img = misc.face()

and display it using Matplotlib's .imshow()

Challenge

What is the data type of img? Also, what is the shape of img and how many dimensions does it have? What is the resolution of the image?


.

.

..

...

..

.

.


Solution: An image as a ndarray

Let us question the nature of our reality and take a look under the surface. Here's what our "image" actually looks like: 

We can now clearly see that we're dealing with a ndarray. And it's a 3 dimensional array at that.

There are three matrices stacked on top of each other - one for the red values, one for the green values and one for the blue values. Each matrix has a 768 rows and 1024 columns, which makes sense since 768x1024 is the resolution of the image.


Challenge

Now can you try and convert the image to black and white? All you need need to do is use a formula.

Y_linear is what we're after - our black and white image. However, this formula only works if our red, green and blue values are between 0 and 1 - namely in sRGB format. Currently the values in our img range from 0 to 255. So:


.

.

..

...

..

.

.


Solution: Converting an image to grayscale

The first step is a division by a scalar

sRGB_array = img / 255

Here NumPy will use broadcasting to divide all the values in our ndarray by 255.

Next, we use matrix multiplication to multiply our two ndarrays together.

grey_vals = np.array([0.2126, 0.7152, 0.0722])

These are the values given by the formula above

img_gray = sRGB_array @ grey_vals

We can either multiply them together with the @ operator or the .matmul() function.

img_gray = sRGB_array @ grey_vals
img_gray = np.matmul(sRGB_array, grey_vals)

Finally, to show the image we use Matplotlib

plt.imshow(img_gray, cmap='gray')

The cmap parameter is important here. If we leave it out the function will not know that is dealing with a black and white image.

Challenge

Can you manipulate the images by doing some operations on the underlying ndarrays? See if you can change the values in the ndarray so that:

1) You flip the grayscale image upside down like so:

2) Rotate the colour image:

3) Invert (i.e., solarize) the colour image. To do this you need to convert all the pixels to their "opposite" value, so black (0) becomes white (255).



.

.

..

...

..

.

.


Solution: Manipulating the ndarray to change the image

For the first challenge, all you need to do is reverse the order of the rows and the columns in the NumPy array with the .flip() function:

You can display the upside down image in a single line of code:

plt.imshow(np.flip(img_gray), cmap='gray')

To rotate the image, all you need to do is rotate the array with .rot90()

This will rotate our image too:

Inverting the colour image is a bit more tricky. It involved making use of NumPy's ability to broadcast when doing operations with a scalar. In this case, our scalar is 255 - the maximum value for a pixel in RGB (see gif at the very top). If we subtract the values of our img from 255, then we get the opposite value for each pixel:


solar_img = 255 - img
+plt.imshow(solar_img)


Use Your Own Images

I've provided a .jpg file in the starting .zip file, so you can try your code out with an image that isn't a racoon . The key is that your image should have 3 channels (red-green-blue). If you use a .png file with 4 channels there are additional pre-processing steps involved to replicate what we're doing here.

How do you open an image and put it into a NumPy array?

First, make sure you've added the image to your project. All you need to do is use the PIL library to open the image and then create the ndarray using the image. You should see that your ndarray has 3 dimensions. The shape will be the resolution of your image.

Now feel free to manipulate your own images as you see fit. If you discover something particularly cool, be sure to share in the comments below!  I'd love to see your hard work


\ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Computation-with-NumPy-complete.zip b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Computation-with-NumPy-complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..25e7f7d84ec16aae9e5e69c05966a9e51218ff30 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Computation-with-NumPy-complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d56df4e958dfdcf69ca3d621add9e8425f1f9b3bbcda10288a09777ef716f908 +size 1300660 diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Course-Fixes-Report-an-Issue.url b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Learning Points & Summary.html b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..7a6637560bd7aff5f5bc5b43012ece0ad2745152 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/006 Learning Points & Summary.html @@ -0,0 +1 @@ +

In this lesson we looked at how to:


You can download the completed code for today in this lesson.


Oh, and congratulations on completing one of the most mathematical lessons in the course!  Good stuff!


\ No newline at end of file diff --git "a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" "b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" new file mode 100644 index 0000000000000000000000000000000000000000..92f6e72357f936d07dff5ac8aee29e545e4c11d3 --- /dev/null +++ "b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" @@ -0,0 +1,6 @@ +Do là mình up quá nhiều file nên thằng google drive nó giảm độ phân giải về 360 nên ae xem trên gg drive sẽ rất khó chịu và mờ , Nhìn Đống Video Này Mà Tải về Thì khá là nặng nên mình sẽ chia sẻ cho ae cách xem video trên gg drive độ phân giải cao không lag mà vẫn mượt mà nhé ! + +link hướng dẫn : https://tainguyenmienphi.com/huong-dan-cach-xem-video-tren-gg-drive/ + +Nhóm FB:https://www.facebook.com/groups/1105106193836548 +Nhóm account Tele: https://t.me/EduTecHackVN \ No newline at end of file diff --git "a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" "b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" new file mode 100644 index 0000000000000000000000000000000000000000..bbbf5155676f390f80d69ae9563c705d64398c70 --- /dev/null +++ "b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" @@ -0,0 +1 @@ +tải khóa học tại tainguyenmienphi.com \ No newline at end of file diff --git a/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/external-links.txt b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d06ef8c7be4821826fa11d8509a0c4576a8e1899 --- /dev/null +++ b/part3/77 - Day 77 - Advanced - Computation with NumPy and N-Dimensional Arrays/external-links.txt @@ -0,0 +1,3 @@ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/001 Day 78 Goals what you will make by the end of the day.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/001 Day 78 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..3972002ba58f92a876d96b97fb6d65a6ed52b262 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/001 Day 78 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

In this lesson, we're going to be looking at movie budget and revenue data. This dataset is perfect for trying out some new tools like scikit-learn to run a linear regression and seaborn, a popular data visualisation library built on top of Matplotlib. 

The question we want to answer today is: Do higher film budgets lead to more revenue in the box office? In other words, should a movie studio spend more on a film to make more? 


Today you'll learn:


Download and add the Notebook to Google Drive

As usual, download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook.


Add the Data to the Notebook

The .zip file also includes a .csv file called cost_revenue_dirty. This is the data for the project. Add this file to your notebook.


\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/001 Seaborn-Linear-Regression-start.zip b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/001 Seaborn-Linear-Regression-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..e5eb0a7eb041981046bcc01b8cd9400dd1e1b03d --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/001 Seaborn-Linear-Regression-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:038dfab080d2eed56c4d0f673251f3394392cf1dae6e909a895844fb2e3ee9d3 +size 151372 diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/002 Explore and Clean the Data.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/002 Explore and Clean the Data.html new file mode 100644 index 0000000000000000000000000000000000000000..885e7a3f474b9618200bd03d2ba545461271f13b --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/002 Explore and Clean the Data.html @@ -0,0 +1,12 @@ +

As with any dataset, the first steps are going to be data exploration and data cleaning. We need to get a better understanding of what we're dealing with. Since you've gone through this process a number of times before on previous days, can you tackle the following challenges on your own? 


Challenge 1

Answer these questions about how the data is structured:

  1. How many rows and columns does the dataset contain?

  2. Are there any NaN values present?

  3. Are there any duplicate rows?

  4. What are the data types of the columns?


Challenge 2

Convert the USD_Production_Budget, USD_Worldwide_Gross, and USD_Domestic_Gross columns to a numeric format by removing $ signs and ,.

Note that domestic in this context refers to the United States.


Challenge 3

Convert the Release_Date column to a Pandas Datetime type.


.

.

..

...

..

.

.

Solution for Challenge 1

With any new dataset, it's a good idea to do some standard checks and conversions. I typically always first look at .shape, .head(), .tail(), .info() and .sample().  Here's what I'm spotting already:

There are thousands of entries in the DataFrame - one entry for each movie. We'll have some challenges formatting the data before we can do more analysis because we have non-numeric characters in our budget and revenue columns.

We can check for NaN values with this line:

data.isna().values.any()

And check for duplicates with this line:

data.duplicated().values.any()

We can see the total number of duplicates by creating a subset and looking at the length of that subset:

duplicated_rows = data[data.duplicated()]
+len(duplicated_rows)

The fact that there are no duplicates or NaN (not-a-number) values in the dataset will make our job easier. We can also see if there are null values in .info(), which also shows us that we need to do some type conversion.

Solution for Challenge 2

In order to convert the data in the budget and revenue columns and remove all the non-numeric characters, we can use a nested for loop. We create two Python lists: the characters to remove and the column names. Inside the nested loop we can combine .replace() and .to_numeric() to achieve our goal.

chars_to_remove = [',', '$']
+columns_to_clean = ['USD_Production_Budget', 
+                    'USD_Worldwide_Gross',
+                    'USD_Domestic_Gross']
+
+for col in columns_to_clean:
+    for char in chars_to_remove:
+        # Replace each character with an empty string
+        data[col] = data[col].astype(str).str.replace(char, "")
+    # Convert column to a numeric data type
+    data[col] = pd.to_numeric(data[col])

Solution for Challenge 3

To convert the Release_Date column to a DateTime object, all we need to do is call the to_datetime() function.

data.Release_Date = pd.to_datetime(data.Release_Date)

When we check .info() again we see that the columns now have the desired data type. This allows us to proceed with the next parts of our analysis.

\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/003 Investigate the Films that had Zero Revenue.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/003 Investigate the Films that had Zero Revenue.html new file mode 100644 index 0000000000000000000000000000000000000000..f32b579e11de66fa17924bed9dbfe365de069cc1 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/003 Investigate the Films that had Zero Revenue.html @@ -0,0 +1,5 @@ +

Now that we've done some legwork on cleaning our data, we can investigate our data set more thoroughly.


Challenge 1

  1. What is the average production budget of the films in the data set?

  2. What is the average worldwide gross revenue of films?

  3. What were the minimums for worldwide and domestic revenue?

  4. Are the bottom 25% of films actually profitable or do they lose money?

  5. What are the highest production budget and highest worldwide gross revenue of any film?

  6. How much revenue did the lowest and highest budget films make?


Challenge 2

How many films grossed $0 domestically (i.e., in the United States)? What were the highest budget films that grossed nothing?


Challenge 3

How many films grossed $0 worldwide? What are the highest budget films that had no revenue internationally (i.e., the biggest flops)?


.

.

..

...

..

.

.


Solution for Challenge 1

We can answer many of the questions with a single command: .describe().

The average film costs about $31m to make and makes around 3x that (or ~$89m) in worldwide revenue. So that's encouraging.

But quite a lot of films lose money too. In fact, all the films in the bottom quartile lose money, since the average cost is $5 million and they only bring in $3.8m in worldwide revenue!

The minimum domestic and worldwide revenue is $0. That makes sense. If a film never gets screened or is cancelled, then this is the number we would expect to see here.

On the other hand, the highest production budget was $425,000,000 and the highest worldwide revenue was $2,783,918,982. $2.7 Billion revenue! Holy smokes.

So which film was the lowest budget film in the dataset?

I've ... never heard of this film. But it looks like a real money maker. It grossed $181,041 with a measly $1,100 budget. Wow. Talk about return on investment!

And the highest budget film in the dataset is:

Sigh, I remember watching this film in the cinema with 3D glasses and not wanting the film to ever end! I would have been quite content living with those blue people.


Solution to Challenge 2: No domestic revenue

We see that there are 512 films in the dataset that had no revenue in the United States. However, the highest budget films with no revenue have a release date AFTER the date on which the dataset was compiled (May 1st, 2018).

zero_domestic = data[data.USD_Domestic_Gross == 0]
+print(f'Number of films that grossed $0 domestically {len(zero_domestic)}')
+zero_domestic.sort_values('USD_Production_Budget', ascending=False)

Solution to Challenge 3: No worldwide revenue

When we check worldwide revenue instead, we see that there are 357 films that made no money internationally. Once again, some of the films have not been released yet at the time the data was compiled. However, 512 versus 357. Why is there a difference? 

The reason some international films were never screened in the United States.  In fact, we can see an example of this in our previous screenshot. "Don Gato, el inicio de la pandilla" made about $4.5 million dollars in the box office, but nothing in the United States. Perhaps they should have screened it there too, considering it cost $80 million to make!

zero_worldwide = data[data.USD_Worldwide_Gross == 0]
+print(f'Number of films that grossed $0 worldwide {len(zero_worldwide)}')
+zero_worldwide.sort_values('USD_Production_Budget', ascending=False)
\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/004 Filter on Multiple Conditions International Films.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/004 Filter on Multiple Conditions International Films.html new file mode 100644 index 0000000000000000000000000000000000000000..f7102a3b6d85c6ac01c53c1fa06b322f2ca2ed63 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/004 Filter on Multiple Conditions International Films.html @@ -0,0 +1,6 @@ +

So far, we've created subsets for our DataFrames based on a single condition. But what if we want to select our data based on more than one condition? For example, which films made money internationally (i.e., data.USD_Worldwide_Gross != 0), but had zero box office revenue in the United States (i.e., data.USD_Domestic_Gross == 0)? 

How would we create a filter for these two conditions? One approach is to use the .loc[] property combined with the bitwise and & operator.

international_releases = data.loc[(data.USD_Domestic_Gross == 0) & 
+                                  (data.USD_Worldwide_Gross != 0)]

Why does this work? Pandas is built on top of NumPy, which uses Python's bitwise operators. And these bitwise operators allow us to do comparisons on an element by element basis in both NumPy and Pandas! Here's an example:

However, we're also checking if the domestic revenue was zero and the worldwide revenue was not zero. Because the bitwise operator takes precedence, we need to include parentheses () around the comparisons we'd like to prioritise.

However, this is not the only technique we can use to make multiple comparisons.


Challenge

Use the Pandas .query() function to accomplish the same thing. Create a subset for international releases that had some worldwide gross revenue, but made zero revenue in the United States.

Hint: This time you'll have to use the and keyword.


.

.

..

...

..

.

.


Solution: Using the .query() function to filter on multiple conditions

In this case, we enclose the entire query inside a string.

international_releases = data.query('USD_Domestic_Gross == 0 and USD_Worldwide_Gross != 0')
+print(f'Number of international releases: {len(international_releases)}')
+international_releases.tail()

The column names are recognised and we see the following:


Unreleased Films

Now we can turn our attention to films in the dataset that were not released at the time the data was collected. This is why films like Singularity and Aquaman had zero revenue.


Challenge



.

.

..

...

..

.

.


Solution: Removing the unreleased films

There are a total of 7 unreleased films at the time of data collection included in the dataset.

From this point on, we'll work with another DataFrame called data_clean that does not include these films.

data_clean = data.drop(future_releases.index)


Bonus Challenge: Films that Lost Money

Having removed the unreleased films entirely can you calculate the percentage of films that did not break even at the box office? We already saw that more than the bottom quartile of movies appears to lose money when we ran .describe(). However, what is the true percentage of films where the costs exceed the worldwide gross revenue? 


.

.

..

...

..

.

.


Solution: Budget greater than revenue

Again, there are different ways you could have calculated this. For example, using the .loc[] property,

money_losing = data_clean.loc[data_clean.USD_Production_Budget > data_clean.USD_Worldwide_Gross]
+len(money_losing)/len(data_clean)

or the .query() function

money_losing = data_clean.query('USD_Production_Budget > USD_Worldwide_Gross')
+money_losing.shape[0]/data_clean.shape[0]

In both cases, we see that a whopping 37.2% of films do not recoup their production budget at the box office. Who knew that film finance could be so risky!



\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/005 Seaborn Data Visualisation Bubble Charts.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/005 Seaborn Data Visualisation Bubble Charts.html new file mode 100644 index 0000000000000000000000000000000000000000..9525bc133f0ad5301c099dd5cd35d38a424ced0c --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/005 Seaborn Data Visualisation Bubble Charts.html @@ -0,0 +1,53 @@ +

We're now ready to visualise our data. Today I want to introduce you to another popular data visualisation tool that you can use alongside plotly and Matplotlib: Seaborn. Seaborn is built on top of Matplotlib and it makes creating certain visualisations very convenient.

Import Seaborn

The first step is adding Seaborn to our notebook. By convention we'll use the name sns.

Seaborn Scatter Plots

To create a .scatterplot(), all we need to do is supply our DataFrame and the column names that we'd like to see on our axes.

sns.scatterplot(data=data_clean,
+                x='USD_Production_Budget', 
+                y='USD_Worldwide_Gross')

That should look familiar. Because Seaborn is built on top of Matplotlib, we can dive into the Matplotlib layer anytime to configure our chart. For example, we can increase the size of our figure:

And to style our chart we can simply configure the Axes object that is returned from sns.scatterplot().

Here's how:

plt.figure(figsize=(8,4), dpi=200)
+
+ax = sns.scatterplot(data=data_clean,
+                     x='USD_Production_Budget', 
+                     y='USD_Worldwide_Gross')
+
+ax.set(ylim=(0, 3000000000),
+       xlim=(0, 450000000),
+       ylabel='Revenue in $ billions',
+       xlabel='Budget in $100 millions')
+
+plt.show()

Here we're diving into the Matplotb layer to set the limits on the axes and change the labels.

From Scatter Plot to Bubble Chart

But the reason we're using Seaborn is because of the hue and size parameters that make it very easy to create a bubble chart. These parameters allow us to colour the data and change their size according to one of the columns in our DataFrame.

plt.figure(figsize=(8,4), dpi=200)
+ax = sns.scatterplot(data=data_clean,
+                     x='USD_Production_Budget', 
+                     y='USD_Worldwide_Gross',
+                     hue='USD_Worldwide_Gross', # colour
+                     size='USD_Worldwide_Gross',) # dot size
+
+ax.set(ylim=(0, 3000000000),
+       xlim=(0, 450000000),
+       ylabel='Revenue in $ billions',
+       xlabel='Budget in $100 millions',)
+
+plt.show()

Now our higher grossing movies are bigger and darker on our chart. That's super handy. But Seaborn offers a number of convenient styling options as well.

To set the styling on a single chart (as opposed to all the charts in the entire notebook) we can use Python's with keyword. We've seen with used already when it comes to opening files in previous lessons.

plt.figure(figsize=(8,4), dpi=200)
+
+# set styling on a single chart
+with sns.axes_style('darkgrid'):
+  ax = sns.scatterplot(data=data_clean,
+                       x='USD_Production_Budget', 
+                       y='USD_Worldwide_Gross',
+                       hue='USD_Worldwide_Gross',
+                       size='USD_Worldwide_Gross')
+
+  ax.set(ylim=(0, 3000000000),
+        xlim=(0, 450000000),
+        ylabel='Revenue in $ billions',
+        xlabel='Budget in $100 millions')

In addition to 'darkgrid', Seaborn has a number of built-in themes. so you can style your chart very quickly. Try out 'whitegrid', 'dark',  or 'ticks' for example.

Challenge

Now that you've seen how to create a beautiful bubble chart in Seaborn, it's time to create your own. Can you write the code to replicate this chart? Notice how we are actually representing THREE dimensions in this chart: the budget, the release date, and the worldwide revenue. This is what makes bubble charts so awesomely informative.




.

.

..

...

..

.

.


Solution: Movie Budgets over Time

Alright, I hope that was fairly straightforward. All you needed to do is change a few arguments:

plt.figure(figsize=(8,4), dpi=200)
+
+with sns.axes_style("darkgrid"):
+    ax = sns.scatterplot(data=data_clean, 
+                    x='Release_Date', 
+                    y='USD_Production_Budget',
+                    hue='USD_Worldwide_Gross',
+                    size='USD_Worldwide_Gross',)
+
+    ax.set(ylim=(0, 450000000),
+           xlim=(data_clean.Release_Date.min(), data_clean.Release_Date.max()),
+           xlabel='Year',
+           ylabel='Budget in $100 millions')
+
+

Analysis

What do we see here? What is this chart telling us? Well, first off, movie budgets have just exploded in the last 40 years or so. Up until the 1970s, the film industry appears to have been in an entirely different era. Budgets started growing fast from the 1980s onwards and continued to grow through the 2000s. Also, the industry has grown massively, producing many more films than before. The number of data points is so dense from 2000 onwards that they are overlapping.

\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/006 Floor Division A Trick to Convert Years to Decades.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/006 Floor Division A Trick to Convert Years to Decades.html new file mode 100644 index 0000000000000000000000000000000000000000..82ebf9d966708b2438bed5a0cf74bef561967a45 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/006 Floor Division A Trick to Convert Years to Decades.html @@ -0,0 +1,7 @@ +

In our bubble charts, we've seen how massively the industry has changed over time, especially from the 1970s onwards. This makes me think it makes sense to separate our films out by decade. Here's what I'm after:

Challenge

Can you create a column in data_clean that has the decade of the movie release. For example, a film released in 1992 or 1999 should have 1990 in the Decade column.

Here is one approach that you can follow:

  1. Create a DatetimeIndex object from the Release_Date column.

  1. Grab all the years from the DatetimeIndex object using the .year property.

  2. Use floor division // to convert the year data to the decades of the films.

  3. Add the decades as a Decade column to the data_clean DataFrame.


.

.

..

...

..

.

.


Solution: Using Floor Division to Convert Years to Decades

To create a DatetimeIndex, we just call the constructor and provide our release date column as an argument to initialise the DatetimeIndex object. Then we can extract all the years from the DatetimeIndex.

dt_index = pd.DatetimeIndex(data_clean.Release_Date)
+years = dt_index.year

Now, all we need to do is convert the years to decades. For that, we will use floor division (aka integer division). The difference to regular division is that the result is effectively rounded down.

5.0 / 2
+# output: 2.5
+5.0 // 2
+# output: 2.0

In our case, we will use the floor division by 10 and then multiplication by 10 to convert the release year to the release decade:

We can do this for all the years and then add the decades back as a column.

decades = years//10*10
+data_clean['Decade'] = decades


Challenge

Create two new DataFrames: old_films and new_films


.

.

..

...

..

.

.


Solution: Separate the films made before and after 1970

Now that we have our Decades column we can use it to create subsets of our data.

old_films = data_clean[data_clean.Decade <= 1960]
+new_films = data_clean[data_clean.Decade > 1960]

The cut-off for our calculation is 1960 in the Decade column because this will still include 1969. When we inspect our old_films DataFrame we see that it only includes 153 films. As we saw in the bubble chart, the bulk of films in the dataset have been released in the last 30 years.

The most expensive film prior to 1970 was Cleopatra, with a production budget of $42 million. That's some serious 1960s money, and judging by the trailer, a lot of it went into extravagant costumes, set design, and plenty of extras. Impressive.

\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/007 Plotting Linear Regressions with Seaborn.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/007 Plotting Linear Regressions with Seaborn.html new file mode 100644 index 0000000000000000000000000000000000000000..209af03bebdbd65aa70ccc532f58549cd3be0c17 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/007 Plotting Linear Regressions with Seaborn.html @@ -0,0 +1,21 @@ +

Let's visualise the relationship between the movie budget and the worldwide revenue using linear regression. Seaborn makes this incredibly easy with the .regplot() function.

sns.regplot(data=old_films, 
+            x='USD_Production_Budget',
+            y='USD_Worldwide_Gross')

This creates a scatter plot and draws a linear regression line together with the confidence interval at the same time.

To style the chart further, we can once again, drop into the Matplotlib layer and supply keyword arguments as dictionaries. We can customise the scatter plot (e.g., by changing the transparency of the dots) and the regression line itself (e.g., by changing the colour).

plt.figure(figsize=(8,4), dpi=200)
+with sns.axes_style("whitegrid"):
+  sns.regplot(data=old_films, 
+            x='USD_Production_Budget', 
+            y='USD_Worldwide_Gross',
+            scatter_kws = {'alpha': 0.4},
+            line_kws = {'color': 'black'})

What do we see here? Well, first off we can spot Cleopatra on the far right. But also, we see that many lower budget films made much more money! The relationship between the production budget and movie revenue is not very strong. Many points on the left are very far away for the line, so the line appears not to capture the relationship between budget and revenue very well at all!

But does the same hold true for the newer films?

Challenge

Use Seaborn's .regplot() to show the scatter plot and linear regression line against the new_films.

Style the chart

Interpret the chart


.

.

..

...

..

.

.


Solution: Plotting a regression against the newer films

To style the chart we can use the same techniques as before: providing values for the .regplot() function, as well as making use of the Matplotlib Axes object to fine-tune the limits, labels, and general style.

plt.figure(figsize=(8,4), dpi=200)
+with sns.axes_style('darkgrid'):
+  ax = sns.regplot(data=new_films,
+                   x='USD_Production_Budget',
+                   y='USD_Worldwide_Gross',
+                   color='#2f4b7c',
+                   scatter_kws = {'alpha': 0.3},
+                   line_kws = {'color': '#ff7c43'})
+  
+  ax.set(ylim=(0, 3000000000),
+         xlim=(0, 450000000),
+         ylabel='Revenue in $ billions',
+         xlabel='Budget in $100 millions') 

How do we interpret our chart? This time we are getting a much better fit, compared to the old films. We can see this visually from the fact that our data points line up much better with our regression line (pun intended). Also, the confidence interval is much narrower. We also see that a film with a $150 million budget is predicted to make slightly under $500 million by our regression line.

All in all, we can be pretty confident that there does indeed seem to be a relationship between a film's budget and that film's worldwide revenue.

But how much of the variation in revenue does the budget actually explain? And how much extra revenue can we expect for an additional $1 increase in the budget? To find out, we need to dive into the numbers underlying our regression model.

\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/008 Use scikit-learn to Run Your Own Regression.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/008 Use scikit-learn to Run Your Own Regression.html new file mode 100644 index 0000000000000000000000000000000000000000..f80578bb1a3320cf895f58175fabd2e1a4ac34d4 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/008 Use scikit-learn to Run Your Own Regression.html @@ -0,0 +1,10 @@ +

Let's dive into our linear regression model a bit more. We are using a univariate regression. This is a regression with a single explanatory variable (our movie BUDGET). Explanatory variables are also referred to as features in machine learning terminology.

Using our data on budgets, the linear regression estimates the best possible line to fit our movie revenues. The regression line has the following structure:

To find the best possible line, our regression will estimate the y-intercept ("theta zero") and the slope ("theta one"). The line's intercept on the y-axis tells us how much revenue a movie would make if the budget was 0. The slope tells us how much extra revenue we get for a $1 increase in the movie budget.

So how can we find out what our model's estimates are for theta-one and theta-zero? And how can we run our own regression, regardless of whether we want to visualise it on a chart? For that, we can use scikit-learn.

Import scikit-learn

Let's add the LinearRegression from scikit-learn to our notebook.

Now we can run a LinearRegression. First, let's create a LinearRegression object that will do the work for us.

regression = LinearRegression()

Now we should specify our features and our targets (i.e., our response variable). You will often see the features named capital X and the target named lower case y:

# Explanatory Variable(s) or Feature(s)
+X = pd.DataFrame(new_films, columns=['USD_Production_Budget'])
+
+# Response Variable or Target
+y = pd.DataFrame(new_films, columns=['USD_Worldwide_Gross']) 

Our LinearRegression does not like receiving Pandas Series (e.g., new_films.USD_Production_Budget), so I've created some new DataFrames here.

Now it's time to get to work and run the calculations:

# Find the best-fit line
+regression.fit(X, y)

That's it. Now we can look at the values of theta-one and theta-zero from the equation above.

Both intercept_ and coef_ are simply attributes of the LinearRegression object. Don't worry about the underscores at the end, these are simply part of the attribute names that the scikit-learn developers have chosen.

How do we interpret the y-intercept? Literally, means that if a movie budget is $0, the estimated movie revenue is -$8.65 million. Hmm... so this is clearly unrealistic. Why would our model tell us such nonsense? Well, the reason is that we are specifying what the model should be ahead of time - namely a straight line - and then finding the best straight line for our data. Considering that you can't have negative revenue or a negative budget, we have to be careful about interpreting our very simple model too literally. After all, it's just an estimate and this estimate will be the most accurate on the chart where we have the most data points (rather than at the extreme left or right).

What about the slope? The slope tells us that for every extra $1 in the budget, movie revenue increases by $3.1. So, that's pretty interesting. That means the higher our budget, the higher our estimated revenue. If budgets are all that matter to make lots of money, then studio executives and film financiers should try and produce the biggest films possible, right? Maybe that's exactly why we've seen a massive increase in budgets over the past 30 years.

R-Squared: Goodness of Fit

One measure of figuring out how well our model fits our data is by looking at a metric called r-squared. This is a good number to look at in addition to eyeballing our charts.

# R-squared
+regression.score(X, y)

We see that our r-squared comes in at around 0.558. This means that our model explains about 56% of the variance in movie revenue. That's actually pretty amazing, considering we've got the simplest possible model, with only one explanatory variable. The real world is super complex, so in many academic circles, if a researcher can build a simple model that explains over 50% or so of what is actually happening, then it's a pretty decent model.

Remember how we were quite sceptical about our regression looking at the chart for our old_films


Challenge

Run a linear regression for the old_films. Calculate the intercept, slope and r-squared. How much of the variance in movie revenue does the linear model explain in this case?


.

.

..

...

..

.

.


Solution: A bad fit

Running the numbers this time around, we can confirm just how inappropriate the linear model is for the pre-1970 films. We still see a positive relationship between budgets and revenue, since the slope (our theta-one) is 1.6, but the r-squared is very low.

This makes sense considering how poorly our data points aligned with our line earlier.


Challenge

You've just estimated the intercept and slope for the Linear Regression model. Now we can use it to make a prediction! For example, how much global revenue does our model estimate for a film with a budget of $350 million?



.

.

..

...

..

.

.


Solution: Using the model to make a prediction

For a $350 million budget film, our model predicts a worldwide revenue of around $600 million! You can calculate this as follows:

22821538 + 1.64771314 * 350000000

Or, using the regression object, you could also work it out like this:

budget = 350000000
+revenue_estimate = regression.intercept_[0] + regression.coef_[0,0]*budget
+revenue_estimate = round(revenue_estimate, -6)
+print(f'The estimated revenue for a $350 film is around ${revenue_estimate:.10}.')

(The colon : and dot . in a print statement is quite handy for controlling the number of digits you'd like to show up in the output)

\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Course-Fixes-Report-an-Issue.url b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Learning Points & Summary.html b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..1f5f075ac1ce214634b48f17f25370aaaf2a3bbb --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Learning Points & Summary.html @@ -0,0 +1 @@ +

Today was a pretty packed lesson where we introduced a lot of new concepts. In this lesson we looked at how to:


You can download the completed code for today in this lesson.


Well done on completing the next step in your data science journey Upwards and onwards!

\ No newline at end of file diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Seaborn-Linear-Regression-complete.zip b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Seaborn-Linear-Regression-complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..e5519ce33b0e6d5dfe3cfa029b8c4d794595b5d2 --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/009 Seaborn-Linear-Regression-complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c42cc1914423722dc3b526e751e8036efeb2021ece91429e3c668c8d8dcd470 +size 1081598 diff --git a/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/external-links.txt b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8d82232602470a1524bd2d87e669227ae554fea --- /dev/null +++ b/part3/78 - Day 78 - Advanced - Linear Regression and Data Visualisation with Seaborn/external-links.txt @@ -0,0 +1,3 @@ + +009 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part4/101 - Final Stretch/001 Recording of our Live AMA (aka AAA - Ask Angela Anything).mp4 b/part4/101 - Final Stretch/001 Recording of our Live AMA (aka AAA - Ask Angela Anything).mp4 new file mode 100644 index 0000000000000000000000000000000000000000..564310a2f59790e659dd577281ed6e5dce09ca63 --- /dev/null +++ b/part4/101 - Final Stretch/001 Recording of our Live AMA (aka AAA - Ask Angela Anything).mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00cfc0511bbb2a6b012f2f9968d909d46804870329861b81b0b379d34fe3556d +size 1445464142 diff --git a/part4/101 - Final Stretch/001 Recording of our Live AMA (aka AAA - Ask Angela Anything)_vi.srt b/part4/101 - Final Stretch/001 Recording of our Live AMA (aka AAA - Ask Angela Anything)_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..ca880500c21677b1e819ed8ea1dc9261101fd26a --- /dev/null +++ b/part4/101 - Final Stretch/001 Recording of our Live AMA (aka AAA - Ask Angela Anything)_vi.srt @@ -0,0 +1,3208 @@ +1 +00:00:06,320 --> 00:00:07,340 +Chào các cậu. + +2 +00:00:07,340 --> 00:00:17,390 +Đây là Angela từ nhà máy bia và tôi rất vui mừng được thực hiện AMA trực tiếp đầu tiên này. + +3 +00:00:17,660 --> 00:00:23,300 +Vì vậy, đối với những người đã gắn bó với tôi lâu nhất, bạn biết rằng trong những ngày trong các + +4 +00:00:23,300 --> 00:00:32,360 +khóa học chúng tôi đã từng làm những điều này trực tiếp Hãy hỏi Angela bất cứ điều gì và điều này đang cố gắng mang nó trở lại và xem tất cả + +5 +00:00:32,360 --> 00:00:36,980 +các bạn như thế nào làm trong khi bạn đang ở nhà một cách an toàn. + +6 +00:00:36,980 --> 00:00:44,870 +Và vâng, tôi chưa bao giờ thực sự làm bất cứ điều gì như thế này, vì vậy tôi hơi lo lắng, nhưng + +7 +00:00:44,870 --> 00:00:50,420 +hy vọng nó sẽ diễn ra tốt đẹp và tôi sẽ biết thêm một số bạn. + +8 +00:00:51,110 --> 00:00:51,530 +Được rồi. + +9 +00:00:51,530 --> 00:00:59,900 +Vì vậy, kế hoạch là chúng ta sẽ xem xét một số câu hỏi đã được đặt ra trước đó. + +10 +00:00:59,900 --> 00:01:09,530 +Vì vậy, trong tuần qua, các bạn đã đăng câu hỏi của mình trên trang hỏi và nhóm của chúng tôi đã tổng hợp + +11 +00:01:09,530 --> 00:01:14,060 +một loạt các câu hỏi được ủng hộ nhiều nhất. + +12 +00:01:14,060 --> 00:01:20,210 +Vì vậy, chúng tôi sẽ giải quyết một số câu hỏi đó và sau đó chúng tôi sẽ giải quyết trực tiếp một số câu + +13 +00:01:20,210 --> 00:01:21,200 +hỏi YouTube này. + +14 +00:01:21,290 --> 00:01:29,030 +Và tôi không thấy có quá nhiều sự chậm trễ trong cuộc trò chuyện, vì vậy hy vọng tôi sẽ có thể liên hệ với bạn và chúng ta + +15 +00:01:29,030 --> 00:01:31,040 +có thể làm qua lại một chút. + +16 +00:01:31,040 --> 00:01:31,670 +Vì thế. + +17 +00:01:32,270 --> 00:01:36,820 +Được rồi, ở đây chúng tôi có câu hỏi từ Melissa Santos. + +18 +00:01:36,820 --> 00:01:41,000 +Vì vậy, tôi sẽ trả lời lại tất cả một lần nữa, bởi vì có vẻ như khi tôi đến slide, bạn + +19 +00:01:41,000 --> 00:01:42,230 +không thể nghe thấy tôi nữa. + +20 +00:01:42,320 --> 00:01:43,910 +Vì vậy, chúng ta hãy thử điều này một lần nữa. + +21 +00:01:44,180 --> 00:01:50,360 +Vì vậy, câu hỏi của cô ấy là làm thế nào để bạn quản lý sử dụng các ngôn ngữ khác nhau cho các dự án khác nhau mà + +22 +00:01:50,360 --> 00:01:51,440 +không trộn lẫn cú pháp? + +23 +00:01:52,280 --> 00:01:52,730 +Được rồi. + +24 +00:01:52,730 --> 00:02:00,290 +Vì vậy, điều đầu tiên tôi muốn nói là tôi luôn luôn trộn lẫn các cú pháp, đặc biệt là khi tôi đang làm việc như + +25 +00:02:00,290 --> 00:02:03,050 +một dự án nhanh trong một thời gian dài. + +26 +00:02:03,050 --> 00:02:09,650 +Và sau đó tôi chuyển sang có thể thực hiện một dự án phát triển web với JavaScript. + +27 +00:02:09,650 --> 00:02:12,290 +Sau đó, bạn biết đấy, tôi sẽ thiếu dấu chấm phẩy. + +28 +00:02:12,290 --> 00:02:16,250 +Tôi sẽ không viết mã JavaScript. + +29 +00:02:16,280 --> 00:02:24,120 +Nhưng điều tuyệt vời là có những người cho vay tốt và nếu bạn sử dụng một trình soạn thảo mã tốt như Atom of Yes code + +30 +00:02:24,140 --> 00:02:28,280 +hoặc Sublime, thì họ sẽ có thể nhận những thứ này cho bạn. + +31 +00:02:28,280 --> 00:02:36,740 +Vì vậy, tôi để máy móc làm phần máy và sau đó tôi làm phần não, đó là logic. + +32 +00:02:36,740 --> 00:02:38,060 +Đó là phần khó nhất. + +33 +00:02:38,690 --> 00:02:48,950 +Và phần đầu tiên của câu hỏi mà cô ấy đã thực sự hỏi, vậy liệu có nên thông thạo một ngôn ngữ trước + +34 +00:02:48,950 --> 00:02:52,790 +khi chuyển sang các ngôn ngữ khác không? + +35 +00:02:52,940 --> 00:02:58,040 +Bây giờ, tôi nghĩ điều này thực sự phụ thuộc vào những gì bạn đang cố gắng làm, phải không? + +36 +00:02:58,040 --> 00:03:06,260 +Nếu bạn đang cố gắng xây dựng nếu dự án cuối của bạn là một ứng dụng + +37 +00:03:06,260 --> 00:03:12,770 +iOS, thì vâng, bạn chắc chắn, cần phải thực sự giỏi Swift trước. + +38 +00:03:12,860 --> 00:03:18,710 +Nhưng nếu bạn đang cố gắng làm điều gì đó mà đôi khi chỉ + +39 +00:03:18,710 --> 00:03:30,920 +cần một chút kỹ năng phát triển web hoặc chỉ một chút có thể giống như một ứng dụng iOS và Android phổ biến, thì bạn có thể đi sâu + +40 +00:03:30,920 --> 00:03:32,780 +vào thứ bạn cần. + +41 +00:03:33,140 --> 00:03:37,550 +Cách mà tôi luôn thấy đó là những ngôn ngữ lập trình này. + +42 +00:03:37,850 --> 00:03:41,360 +Chúng không giống một môn học, chúng không giống lịch sử hay địa lý. + +43 +00:03:41,360 --> 00:03:44,690 +Chúng giống như một công cụ hơn. + +44 +00:03:44,690 --> 00:03:49,160 +Giống như bạn đang học cách sử dụng cái búa, bạn đang học cách sử dụng một cái cưa. + +45 +00:03:49,340 --> 00:03:56,630 +Bạn không cần phải thích 100% khả năng của búa trước khi có thể chuyển sang công cụ tiếp theo. + +46 +00:03:56,660 --> 00:04:00,560 +Tất cả phụ thuộc vào những gì bạn đang cố gắng xây dựng, phải không? + +47 +00:04:01,700 --> 00:04:02,120 +Được rồi. + +48 +00:04:02,120 --> 00:04:05,720 +Vì vậy, chúng ta hãy chuyển sang câu hỏi tiếp theo. + +49 +00:04:07,280 --> 00:04:07,670 +Được rồi. + +50 +00:04:07,670 --> 00:04:18,140 +Vì vậy, trong câu hỏi này, chúng tôi nhận được từ Jp RD và anh ấy đang hỏi, vì coronavirus đã ảnh hưởng đến rất nhiều + +51 +00:04:18,140 --> 00:04:29,570 +người và rất nhiều người đang tìm kiếm các cách làm việc tại nhà, làm việc từ xa trực tuyến, điều đó có nghĩa là tất cả các + +52 +00:04:29,570 --> 00:04:37,820 +công việc đang diễn ra để được lấp đầy khá nhanh và bạn biết đấy, nó sẽ cạnh tranh hơn + +53 +00:04:37,820 --> 00:04:39,080 +rất nhiều? + +54 +00:04:40,320 --> 00:04:46,860 +Và tôi nghĩ rằng tôi sẽ nói rằng, bạn biết đấy, bạn phải nhớ rằng khi bất cứ điều gì được mong muốn, + +55 +00:04:46,860 --> 00:04:48,400 +nó sẽ bị cạnh tranh. + +56 +00:04:48,420 --> 00:04:59,520 +Vì vậy, nếu bạn nghĩ rằng đó là một ý tưởng tuyệt vời khi làm việc tại nhà và bạn biết đấy, có sự linh hoạt của nơi bạn sống, có thể làm + +57 +00:04:59,520 --> 00:05:04,020 +việc từ xa, thì ai đó cũng sẽ có ý tưởng đó. + +58 +00:05:04,410 --> 00:05:12,570 +Nhưng một lần nữa, bạn biết đấy, những việc đáng làm có lẽ đáng để tranh giành. + +59 +00:05:13,200 --> 00:05:16,470 +Tất cả phụ thuộc vào mục tiêu cuối cùng của bạn là gì. + +60 +00:05:16,470 --> 00:05:24,390 +Và nếu mục tiêu của bạn là kiếm được một công việc với tư cách là nhà phát triển web hoặc nhà phát triển ứng dụng, thì bạn chỉ + +61 +00:05:24,390 --> 00:05:31,740 +cần tập trung vào mục tiêu đó và đừng quá lo lắng về việc có bao nhiêu cạnh tranh hoặc có bao nhiêu người khác đang + +62 +00:05:31,740 --> 00:05:33,510 +ứng tuyển vào điều tương tự. + +63 +00:05:33,960 --> 00:05:37,320 +Ý tôi là, tôi nhớ lại những ngày mà. + +64 +00:05:37,350 --> 00:05:45,300 +Vì vậy, tôi không biết các bạn có biết điều này không, nhưng tôi đã được đào tạo như một bác sĩ y khoa và tôi đã làm việc là một bác sĩ + +65 +00:05:45,300 --> 00:05:48,270 +đào tạo về phẫu thuật chỉnh hình trong một số năm. + +66 +00:05:48,420 --> 00:05:57,960 +Và khi tôi học trường y, ngay từ ngày đầu tiên, mọi người đã nói với tôi rằng nếu bạn muốn + +67 +00:05:57,960 --> 00:06:04,560 +trở thành một bác sĩ phẫu thuật, thì cơ hội là một trong 1000. + +68 +00:06:04,590 --> 00:06:06,330 +Nó chỉ là rất cạnh tranh. + +69 +00:06:06,330 --> 00:06:10,140 +Và sau đó trong cuộc giải phẫu, bạn biết đấy, có các tỷ lệ cạnh tranh khác nhau. + +70 +00:06:10,140 --> 00:06:15,300 +Giống như nếu bạn muốn phẫu thuật não, đó giống như lĩnh vực cạnh tranh nhất vì chỉ có rất ít + +71 +00:06:15,300 --> 00:06:16,650 +bác sĩ phẫu thuật não. + +72 +00:06:17,070 --> 00:06:22,170 +Nhưng nếu bạn muốn làm, tôi không biết, có thể là một loại phẫu thuật khác, có thể nó ít cạnh tranh hơn. + +73 +00:06:22,770 --> 00:06:31,500 +Vì vậy, tôi nghĩ ngay từ thời điểm đó, tôi đã được huấn luyện về ý tưởng này rằng cạnh tranh chỉ là một cách sống. + +74 +00:06:31,500 --> 00:06:37,080 +Bạn biết đấy, bạn muốn thứ gì đó, người khác muốn thứ gì đó, và khi đó bạn chỉ cần tập trung vào bản thân. + +75 +00:06:37,560 --> 00:06:46,590 +Có một cuốn sách thực sự tuyệt vời của Carl Newport, mà tôi rất thích tên là So Good, Họ Không thể Bỏ qua Bạn. + +76 +00:06:46,590 --> 00:06:48,150 +Tôi nghĩ đó là tiêu đề dù sao. + +77 +00:06:48,300 --> 00:06:52,110 +Và ý tôi là, vấn đề là bạn không thực sự phải đọc cuốn sách. + +78 +00:06:52,110 --> 00:07:01,080 +Ý tôi là, đó là một cuốn sách hay, nhưng về cơ bản, phần lớn nội dung của nó nằm ở tiêu đề như trở nên giỏi về bất cứ điều gì + +79 +00:07:01,080 --> 00:07:03,960 +bạn làm đến mức họ không thể bỏ qua bạn. + +80 +00:07:03,960 --> 00:07:11,780 +Và họ có thể là sếp của bạn, họ có thể là một nhà tuyển dụng, họ có thể là bất kỳ ai, thực sự. + +81 +00:07:11,790 --> 00:07:17,970 +Và đây thực sự là điều mà tôi luôn ghi nhớ. + +82 +00:07:17,970 --> 00:07:30,390 +Giống như tôi vừa cố gắng tập trung làm công việc tốt nhất có thể, và điều đó có nghĩa là tập trung vào trải nghiệm của sinh viên, + +83 +00:07:30,390 --> 00:07:41,070 +chẳng hạn như, làm cách nào để tôi có thể tạo ra một khóa học hữu ích nhất, thú vị nhất và hoàn thành + +84 +00:07:41,070 --> 00:07:42,420 +nhất, bên phải? + +85 +00:07:42,420 --> 00:07:48,480 +Vì vậy, tôi tập trung vào những điều này và tôi không thực sự nghĩ về những gì người khác đang làm. + +86 +00:07:49,170 --> 00:07:57,510 +Và điều đó có nghĩa là tôi có một sản phẩm mà tôi đã tạo ra và tôi chỉ nghĩ theo cách này dễ dàng hơn nhiều nếu tôi dành + +87 +00:07:58,110 --> 00:08:03,450 +toàn bộ thời gian để suy nghĩ về việc, bạn biết đấy, người đó đang làm điều này hoặc + +88 +00:08:03,450 --> 00:08:08,160 +người đó đang làm điều đó , thì tôi sẽ luôn sao chép mọi người. + +89 +00:08:08,160 --> 00:08:13,590 +Và nếu các bạn đã tham gia các khóa học của tôi, bạn biết đấy, đó thường không phải là cách để đi. + +90 +00:08:14,160 --> 00:08:20,880 +Ý tôi là, điều đó cũng có nghĩa là có rất nhiều tình huống dở khóc dở cười trong đó chưa được kiểm chứng và không ai bị xử phạt. + +91 +00:08:20,880 --> 00:08:22,830 +Và nó có lẽ không phải là một ý kiến hay. + +92 +00:08:23,130 --> 00:08:27,690 +Nhưng, bạn biết đấy, chúng tôi phải thử mọi thứ đúng. + +93 +00:08:27,780 --> 00:08:28,080 +Được rồi. + +94 +00:08:28,080 --> 00:08:30,900 +Hãy chuyển sang câu hỏi tiếp theo. + +95 +00:08:34,570 --> 00:08:34,900 +Được rồi. + +96 +00:08:34,900 --> 00:08:39,850 +Vì vậy, câu hỏi này là của Mayank Saini. + +97 +00:08:40,390 --> 00:08:42,960 +Tôi hy vọng tôi phát âm điều đó. + +98 +00:08:43,010 --> 00:08:43,590 +Được chứ. + +99 +00:08:43,600 --> 00:08:49,420 +Tôi nghĩ tôi sắp giết tên mọi người vì tôi sẽ phát âm tệ trong việc ăn uống. + +100 +00:08:50,680 --> 00:08:53,050 +Vì vậy, Mayank nói một số điều. + +101 +00:08:53,290 --> 00:08:57,790 +Câu hỏi của tôi là, làm thế nào tôi có thể nhận được một công việc như một nhà phát triển web đầy đủ cho công ty mơ ước của tôi? + +102 +00:08:57,820 --> 00:09:00,340 +Tôi phải nắm vững những gì để làm như vậy? + +103 +00:09:01,200 --> 00:09:01,590 +Được chứ. + +104 +00:09:01,590 --> 00:09:06,990 +Vì vậy, mục tiêu của bạn là kiếm được một công việc với tư cách là nhà phát triển web đầy đủ. + +105 +00:09:07,020 --> 00:09:12,070 +Bây giờ, một số bạn đang xem, có thể mục tiêu của bạn là kiếm được một công việc như một nhà phát triển iOS. + +106 +00:09:12,090 --> 00:09:14,520 +Có thể bạn muốn làm việc như một nhà khoa học dữ liệu. + +107 +00:09:14,520 --> 00:09:18,960 +Có thể bạn muốn làm việc tại Facebook, Apple, Google, bất cứ điều gì có thể. + +108 +00:09:18,960 --> 00:09:21,840 +Nhưng điều tuyệt vời là bạn đã có được mục tiêu của mình. + +109 +00:09:21,840 --> 00:09:27,630 +Như đây là bước đầu tiên bởi vì có rất nhiều người tôi đã nói chuyện với những người thậm chí không biết họ muốn + +110 +00:09:27,630 --> 00:09:28,050 +gì. + +111 +00:09:28,050 --> 00:09:31,320 +Vậy là bạn đã đi trước người khác một bước rồi. + +112 +00:09:32,040 --> 00:09:36,750 +Vì vậy, bây giờ bạn biết những gì bạn muốn có được, làm thế nào để bạn có được chúng? + +113 +00:09:36,780 --> 00:09:41,460 +Vâng, chúng ta hãy nghĩ về nó từ một quan điểm khác. + +114 +00:09:42,060 --> 00:09:44,250 +Giả sử bạn là một công ty. + +115 +00:09:44,730 --> 00:09:49,620 +Giả sử bạn là người quản lý tại Google và bạn muốn thuê một nhà phát triển web. + +116 +00:09:49,920 --> 00:09:55,560 +Chà, nếu bạn là người đang phỏng vấn, người đang sàng lọc tất cả các đơn xin việc, bạn sẽ nghĩ + +117 +00:09:55,560 --> 00:09:56,610 +về điều gì? + +118 +00:09:56,880 --> 00:09:59,700 +Đây là một bài tập thực sự, thực sự hữu ích. + +119 +00:09:59,700 --> 00:10:07,320 +Và đây là điều mà tôi thực sự phải mất một thời gian lớn lên để thực sự hiểu điều này, bởi vì khi bạn nghĩ về + +120 +00:10:07,320 --> 00:10:11,220 +nó từ góc độ của người khác, bạn biết đấy, họ không cố gắng + +121 +00:10:11,220 --> 00:10:12,210 +làm khó bạn. + +122 +00:10:12,210 --> 00:10:16,090 +Họ không cố gắng bắt bạn nhảy qua vòng vì lợi ích của việc nhảy qua vòng. + +123 +00:10:16,110 --> 00:10:20,760 +Nhưng giả sử bạn nhận được 20.000 đơn đăng ký. + +124 +00:10:20,760 --> 00:10:28,920 +Vì vậy, gần đây chúng tôi đang tìm kiếm một thực tập sinh mùa hè và chỉ có vô số ứng dụng + +125 +00:10:28,920 --> 00:10:29,610 +đến. + +126 +00:10:30,690 --> 00:10:40,290 +Và, bạn biết đấy, bạn thực sự muốn dành tất cả sự chú ý và công bằng cho mỗi ứng dụng. + +127 +00:10:41,380 --> 00:10:43,720 +Bạn biết đấy, thực sự hiểu từng người. + +128 +00:10:43,990 --> 00:10:45,340 +Bạn không thực sự có thời gian. + +129 +00:10:45,340 --> 00:10:52,150 +Vì vậy, bạn sẽ phải nghĩ về cách làm cho nó dễ dàng hơn một chút cho chính mình. + +130 +00:10:52,150 --> 00:10:52,660 +Đúng? + +131 +00:10:53,050 --> 00:10:58,300 +Vì vậy, một trong những cách đó là xem xét trình độ của ai đó. + +132 +00:10:58,570 --> 00:11:05,140 +Nhưng một cách khác, và có lẽ điều mà tôi yêu thích hơn thực sự chỉ là xem chúng có + +133 +00:11:05,140 --> 00:11:07,390 +khả năng làm được những gì? + +134 +00:11:08,170 --> 00:11:10,330 +Và đây thực sự là một chìa khóa. + +135 +00:11:10,330 --> 00:11:10,900 +Vì thế. + +136 +00:11:11,770 --> 00:11:14,170 +Bạn cần xây dựng một danh mục đầu tư. + +137 +00:11:14,200 --> 00:11:19,090 +Bạn cần phải cho cả thế giới thấy chứ không phải nói cho cả thế giới biết bạn có thể làm gì. + +138 +00:11:19,510 --> 00:11:23,560 +Vì vậy, hãy tạo một số ứng dụng web. + +139 +00:11:23,560 --> 00:11:28,450 +Nếu bạn muốn trở thành nhà phát triển web, hãy tạo một số ứng dụng iOS nếu bạn muốn trở thành nhà phát triển iOS. + +140 +00:11:28,480 --> 00:11:30,520 +Và đừng chỉ. + +141 +00:11:31,170 --> 00:11:36,090 +Đừng chỉ chăm chăm vào những thứ mà bạn thấy trong các bài hướng dẫn. + +142 +00:11:36,450 --> 00:11:38,730 +Bạn phải bằng cách nào đó nổi bật. + +143 +00:11:39,090 --> 00:11:46,620 +Và một trong những lời khuyên tốt nhất mà tôi có thể cho bạn, một lần nữa, hãy suy nghĩ từ quan điểm của nhà tuyển dụng. + +144 +00:11:46,710 --> 00:11:48,810 +Họ muốn thuê một nhà phát triển web. + +145 +00:11:48,840 --> 00:11:52,980 +Họ có lẽ là một nhà quản lý, đúng, thuộc một loại nào đó. + +146 +00:11:54,000 --> 00:11:58,020 +Loại công cụ mà họ sử dụng hàng ngày là gì? + +147 +00:11:58,950 --> 00:12:04,560 +Vì vậy, nếu bạn là người quản lý, đặc biệt nếu bạn là giám đốc sản phẩm hoặc trưởng phần mềm, có + +148 +00:12:04,560 --> 00:12:09,210 +thể bạn sẽ sử dụng một số hình thức quản lý tác vụ như Trello hoặc Asana. + +149 +00:12:09,720 --> 00:12:14,130 +Có thể bạn sẽ sử dụng GitHub hoặc một cái gì đó tương tự. + +150 +00:12:14,130 --> 00:12:15,390 +Hub như Bitbucket. + +151 +00:12:16,320 --> 00:12:22,920 +Suy nghĩ về các công cụ họ sử dụng và xây dựng một công cụ mà họ có thể hiểu được. + +152 +00:12:23,370 --> 00:12:28,300 +Vì vậy, nếu họ sử dụng Trello hoặc Asana, tôi chắc chắn rằng sẽ có điểm đau. + +153 +00:12:28,320 --> 00:12:32,430 +Tôi chắc rằng có một số tính năng sẽ thực sự thú vị. + +154 +00:12:32,970 --> 00:12:42,390 +Vì vậy, nếu bạn tạo một bản sao Trello, nhưng bạn thêm vào một số tính năng của riêng mình, một số tính năng mà bạn nghĩ ra mà bạn nghĩ sẽ thực + +155 +00:12:42,390 --> 00:12:48,090 +sự hữu ích, và sau đó bạn cho người quản lý đó thấy những gì bạn đã xây dựng. + +156 +00:12:48,090 --> 00:12:51,610 +Họ sẽ hiểu ngay những gì bạn đã xây dựng. + +157 +00:12:51,630 --> 00:12:58,560 +Họ sẽ thấy những ưu điểm của sản phẩm của bạn và họ sẽ có thể chứng thực kỹ + +158 +00:12:58,560 --> 00:13:02,310 +năng của bạn, đó là điều rất quan trọng. + +159 +00:13:03,340 --> 00:13:11,320 +Vì vậy, lời khuyên của tôi, bất cứ khi nào bạn muốn đạt được bất kỳ loại mục tiêu nào liên quan đến người khác, là hãy + +160 +00:13:11,320 --> 00:13:13,720 +suy nghĩ theo quan điểm của người khác. + +161 +00:13:15,100 --> 00:13:15,460 +Được rồi. + +162 +00:13:15,460 --> 00:13:27,640 +Vì vậy, chúng tôi đã thực hiện một số câu hỏi từ trang hỏi bây giờ và tôi thấy rất nhiều hoạt động trò chuyện. + +163 +00:13:27,640 --> 00:13:31,870 +Tôi thực sự muốn làm quen với các bạn tốt hơn một chút. + +164 +00:13:31,960 --> 00:13:34,600 +Vì vậy, tôi muốn làm một cuộc thăm dò ý kiến. + +165 +00:13:34,720 --> 00:13:38,500 +Vì vậy, nó sẽ là thời gian kéo. + +166 +00:13:43,230 --> 00:13:43,710 +Được rồi. + +167 +00:13:43,710 --> 00:13:53,370 +Vì vậy, nếu bạn tiếp tục và xem trang trình bày của tôi, tôi muốn biết bạn đang ở đâu. + +168 +00:13:53,400 --> 00:13:56,070 +Vậy bạn đang phát trực tuyến từ đâu? + +169 +00:13:56,400 --> 00:14:00,570 +Bây giờ, những gì bạn cần làm là truy cập vào liên kết này. + +170 +00:14:00,570 --> 00:14:07,560 +Vì vậy, chờ một chút, tôi sẽ xóa biểu ngữ này và bạn có thể xem nếu bạn đến London, Apple. com chuyển tiếp gạch chéo nơi nó sẽ + +171 +00:14:07,560 --> 00:14:16,260 +chuyển hướng bạn đến URL dài khủng khiếp này nằm bên dưới, đó là một cuộc thăm dò ý kiến. + +172 +00:14:16,500 --> 00:14:25,200 +Vì vậy, hãy chọn một câu trả lời và tôi muốn biết vị trí của bạn là gì. + +173 +00:14:27,170 --> 00:14:27,530 +Được rồi. + +174 +00:14:27,530 --> 00:14:30,470 +Vì vậy, tôi nghĩ rằng một số bạn đã bình chọn. + +175 +00:14:31,530 --> 00:14:35,010 +Hãy cùng xem kết quả. + +176 +00:14:35,830 --> 00:14:35,970 +Được chứ. + +177 +00:14:36,150 --> 00:14:37,760 +Tôi nghĩ bây giờ có khoảng 200 phiếu bầu. + +178 +00:14:37,770 --> 00:14:40,920 +Tôi sẽ xem xét kết quả. + +179 +00:14:43,670 --> 00:14:44,090 +Được rồi. + +180 +00:14:44,090 --> 00:14:47,130 +Vì vậy, có vẻ như hầu hết mọi người đến từ châu Á. + +181 +00:14:47,210 --> 00:14:50,660 +Tiếp theo là Châu Âu và tiếp theo là Bắc Mỹ. + +182 +00:14:51,470 --> 00:14:53,240 +Ý tôi là, điều đó có ý nghĩa với tôi. + +183 +00:14:53,240 --> 00:14:59,750 +Tôi nghĩ bây giờ là khoảng thời gian buổi tối ở châu Á và sau đó là ở châu Âu, nơi tôi đang ở London, chúng + +184 +00:14:59,750 --> 00:15:03,350 +tôi giống như ban ngày và sau đó Bắc Mỹ chỉ mới thức dậy. + +185 +00:15:03,680 --> 00:15:05,240 +Vì vậy, điều đó khá tuyệt. + +186 +00:15:05,840 --> 00:15:06,500 +Được rồi. + +187 +00:15:07,160 --> 00:15:12,740 +Vì vậy, hãy lấy một số câu hỏi từ YouTube. + +188 +00:15:12,770 --> 00:15:19,670 +Các bạn đang trò chuyện trong đó và tôi đang cố gắng xem xét nó. + +189 +00:15:21,360 --> 00:15:25,290 +Chỉ để xem điều gì đang thực sự xảy ra nếu bạn nhận được âm thanh và mọi thứ. + +190 +00:15:25,290 --> 00:15:30,120 +Nhưng hãy lấy một số câu hỏi từ YouTube. + +191 +00:15:30,210 --> 00:15:33,000 +Vì vậy, hãy tiếp tục và hỏi đi. + +192 +00:15:36,190 --> 00:15:36,520 +Được rồi. + +193 +00:15:36,520 --> 00:15:42,700 +Vì vậy, chúng tôi đã nhận một ở đây từ Claudia, và nó sẽ bị cắt bỏ vì nó khá dài, nhưng tôi sẽ đọc + +194 +00:15:42,700 --> 00:15:43,510 +cho bạn nghe. + +195 +00:15:43,840 --> 00:15:47,240 +Tôi muốn hỏi bạn về cách bạn học các kỹ năng viết mã mới. + +196 +00:15:47,260 --> 00:15:49,900 +Làm thế nào để bạn dạy cho mình các kỹ năng mới? + +197 +00:15:49,930 --> 00:15:52,120 +Quá trình học tập của bạn là gì? + +198 +00:15:52,150 --> 00:15:53,260 +Được, tuyệt đấy. + +199 +00:15:53,470 --> 00:15:54,610 +Vì thế. + +200 +00:15:55,650 --> 00:15:58,140 +Tôi nghĩ rằng một trong những kỹ năng hữu ích nhất. + +201 +00:15:58,800 --> 00:16:03,300 +Như thế mà tôi đã từng học là học. + +202 +00:16:04,020 --> 00:16:13,980 +Tôi nghĩ nếu bạn có thể học khá nhanh, thì nó sẽ giúp bạn theo rất nhiều cách. + +203 +00:16:15,040 --> 00:16:16,390 +Vì thế. + +204 +00:16:17,640 --> 00:16:25,950 +Một trong những cách tôi làm, một trong những cách tôi sắp xếp khái niệm đó là tôi cố gắng lấy toàn bộ + +205 +00:16:26,070 --> 00:16:32,640 +chủ đề và chia nhỏ thành, bạn biết đấy, tất cả những phần tôi cần học là gì? + +206 +00:16:32,910 --> 00:16:37,500 +Bởi vì khi bạn đọc sách giáo khoa hoặc khi bạn lấy tôi không biết, hãy nói rằng tôi muốn nói, chẳng hạn như hiện + +207 +00:16:37,500 --> 00:16:39,480 +tại tôi đang cố gắng học tiếng Đức, phải không? + +208 +00:16:39,990 --> 00:16:45,690 +Nếu tôi chỉ lấy một cuốn từ điển, tôi sẽ mất nhiều năm, nhiều năm trước khi tôi học được nó. + +209 +00:16:45,840 --> 00:16:54,240 +Và tôi thấy đôi khi mọi người học lập trình giống như vậy, giống như họ cố gắng học mọi phương + +210 +00:16:54,240 --> 00:17:03,180 +pháp, mọi hàm đơn lẻ trong một API ngôn ngữ lập trình cụ thể hoặc bạn biết đấy, chỉ là cố gắng + +211 +00:17:03,180 --> 00:17:04,140 +học nó. + +212 +00:17:04,140 --> 00:17:04,859 +Được rồi. + +213 +00:17:04,859 --> 00:17:11,190 +Và có rất nhiều khóa học cũng giống như một kiểu hướng dẫn tham khảo, nơi họ chỉ cho bạn + +214 +00:17:11,190 --> 00:17:12,030 +mọi thứ. + +215 +00:17:12,690 --> 00:17:16,650 +Và tôi nghĩ về mặt học tập, nó không thực sự hiệu quả. + +216 +00:17:16,950 --> 00:17:21,869 +Thay vào đó, những gì bạn cần làm, một lần nữa, bạn phải có một mục tiêu, phải không? + +217 +00:17:22,200 --> 00:17:30,150 +Vì vậy, nếu bạn đang học lập trình, có thể mục tiêu đó là bạn có một ứng dụng cụ thể mà bạn muốn xây dựng ngay bây giờ + +218 +00:17:30,150 --> 00:17:33,180 +các kỹ năng cơ bản nhất định mà bạn cần. + +219 +00:17:33,420 --> 00:17:38,580 +Nhưng một khi bạn vượt qua được nền tảng, thì bạn sẽ giống như học Lego vậy. + +220 +00:17:38,610 --> 00:17:40,830 +Bạn đang cố gắng tìm ra, Được rồi, tôi cần tìm hiểu điều này một chút. + +221 +00:17:40,830 --> 00:17:42,060 +Tôi nên đi đâu cho điều đó? + +222 +00:17:42,060 --> 00:17:44,520 +Tôi cần phải học phần đó để làm được điều này. + +223 +00:17:44,700 --> 00:17:50,940 +Vì vậy, ví dụ, cách tôi nghĩ về tiếng Đức, như học tiếng Đức, tôi nhận ra rằng tôi không cần phải + +224 +00:17:50,940 --> 00:17:52,050 +viết tiếng Đức. + +225 +00:17:52,680 --> 00:17:57,910 +Tôi có lẽ có thể đọc, nhưng nó không thực sự làm phiền tôi. + +226 +00:17:57,930 --> 00:18:06,240 +Tất cả những gì tôi muốn tập trung thực sự là nghe và nói, vì vậy điều đó đã làm cho nhiệm vụ của tôi trở nên dễ dàng hơn rất nhiều. + +227 +00:18:07,080 --> 00:18:16,740 +Bây giờ tiếp theo, nếu tôi muốn có thể nói tốt, thì tôi phải luyện tập, phải không? + +228 +00:18:16,860 --> 00:18:26,190 +Vì vậy, có một khóa học thực sự tốt của Pimsleur mà tôi sử dụng khi tất cả những gì họ làm là họ chỉ dạy + +229 +00:18:26,190 --> 00:18:31,740 +bạn một vài cách nói một câu và sau đó họ bắt bạn thực hành. + +230 +00:18:31,740 --> 00:18:36,210 +Bạn chỉ, bạn biết đấy, họ sẽ như thế nào, bạn nói thế nào, tôi muốn đi đến nhà hàng? + +231 +00:18:36,210 --> 00:18:38,070 +Làm thế nào để bạn nói tôi đi đến nhà hàng? + +232 +00:18:38,070 --> 00:18:40,680 +Làm thế nào để bạn nói tôi đã đến nhà hàng, v.v.? + +233 +00:18:40,680 --> 00:18:48,540 +Và bạn phải luyện tập rất nhiều chỉ việc ghép các từ lại với nhau theo một cách hợp lý nào đó. + +234 +00:18:49,170 --> 00:18:55,140 +Và sau đó bởi vì nó không thực sự tương tác, bạn biết đấy, một danh sách các câu, tôi + +235 +00:18:55,140 --> 00:18:55,880 +phải nói. + +236 +00:18:56,070 --> 00:19:04,230 +Sau đó, tôi sẽ lấy nó và sử dụng Google Dịch, có thể nghe trực tiếp những gì bạn đang nói bằng tiếng Đức và tôi sẽ dịch + +237 +00:19:04,230 --> 00:19:10,170 +nó sang văn bản tiếng Anh để sau đó tôi có thể đánh giá dựa trên bản dịch đó. + +238 +00:19:10,170 --> 00:19:11,970 +Chà, tiếng Đức của tôi tốt đến mức nào? + +239 +00:19:11,970 --> 00:19:15,570 +Tôi đã quản lý để chia động từ của mình một cách chính xác? + +240 +00:19:15,570 --> 00:19:17,430 +Tôi đã quản lý để đặt mọi thứ lại với nhau? + +241 +00:19:18,300 --> 00:19:27,420 +Và sau đó về phần nghe, một trong những thủ thuật mà tôi nghĩ ra, tôi đoán, tôi chắc chắn rằng nó không phải là bản + +242 +00:19:27,420 --> 00:19:34,440 +gốc, nhưng tôi đã xem rất nhiều chương trình trên Netflix, vì tôi chắc rằng rất nhiều bạn làm. + +243 +00:19:34,620 --> 00:19:43,290 +Nhưng tôi phát hiện ra rằng nếu bạn nghe một chương trình truyền hình được sản xuất bằng ngôn ngữ khác, thì đối với tôi đó là + +244 +00:19:43,290 --> 00:19:44,010 +tiếng Đức. + +245 +00:19:44,880 --> 00:19:50,730 +Bạn có thể bật không chỉ phụ đề, điều này rất hữu ích, mà bạn + +246 +00:19:50,730 --> 00:20:03,630 +có thể bật một thứ gọi là âm thanh được mô tả, về cơ bản sẽ mô tả cho bạn, nó dành cho những người không thể nhìn có thể nghe được những + +247 +00:20:04,140 --> 00:20:07,440 +gì đang xảy ra trong chương trình. + +248 +00:20:07,680 --> 00:20:13,260 +Nhưng đối với một người nào đó, bạn biết đấy, không thực sự giỏi ngôn ngữ nghe những gì đang xảy + +249 +00:20:13,260 --> 00:20:19,380 +ra trên màn hình được mô tả với tôi bằng tiếng Đức, bạn biết đấy, nó sẽ giống như một người đàn ông + +250 +00:20:19,380 --> 00:20:22,800 +bước vào phòng, người đàn ông lấy chìa khóa từ cái bàn. + +251 +00:20:22,800 --> 00:20:23,820 +Giống như, tôi có thể thấy điều đó. + +252 +00:20:23,820 --> 00:20:29,760 +Tôi có thể thấy những gì đang xảy ra và tôi có thể khớp những gì đang xảy ra với những gì được mô tả. + +253 +00:20:29,790 --> 00:20:33,330 +Và điều này thực sự rất hữu ích cho tôi khi học cách lắng nghe. + +254 +00:20:33,690 --> 00:20:40,200 +Vì vậy, về cơ bản những gì tôi sẽ nói là chia nhỏ vấn đề, tìm ra mục tiêu, chỉ cần thực hiện + +255 +00:20:40,200 --> 00:20:48,390 +những phần bạn cần làm để đạt được mục tiêu và sau đó xem bạn có thể thực hành những kỹ năng đó lặp đi lặp lại như thế nào. + +256 +00:20:48,390 --> 00:20:51,240 +Đó có lẽ là cách học tốt nhất. + +257 +00:20:51,930 --> 00:20:52,200 +Được rồi. + +258 +00:20:52,200 --> 00:20:55,680 +Hãy lấy một câu hỏi khác từ YouTube. + +259 +00:21:00,080 --> 00:21:00,410 +Được rồi. + +260 +00:21:00,410 --> 00:21:03,320 +Chúng tôi nhận được một từ. + +261 +00:21:06,370 --> 00:21:15,820 +Tôi nghĩ tên của bạn là xe Yuvraj Agarkar, vì vậy nó sẽ cắt bỏ dòng chữ một lần nữa, nhưng tôi sẽ đọc nó + +262 +00:21:15,820 --> 00:21:16,210 +ra. + +263 +00:21:16,240 --> 00:21:20,470 +Tôi 17 tuổi và tôi đã hoàn thành khóa học dành cho nhà phát triển iOS và Web của bạn. + +264 +00:21:20,560 --> 00:21:26,230 +Câu hỏi của tôi là làm thế nào để giỏi đọc tài liệu và cũng là làm thế nào để bắt đầu một công ty khởi nghiệp. + +265 +00:21:26,260 --> 00:21:26,800 +Được, tuyệt đấy. + +266 +00:21:26,800 --> 00:21:28,480 +Vì vậy, có hai câu hỏi trong đó. + +267 +00:21:28,480 --> 00:21:31,000 +Câu hỏi đầu tiên là làm thế nào để bạn đọc tài liệu tốt? + +268 +00:21:32,290 --> 00:21:36,230 +Câu trả lơi con phụ thuộc vao nhiêu thư. + +269 +00:21:36,250 --> 00:21:42,280 +Vì vậy, đầu tiên, có sự khác biệt về chất lượng của tài liệu. + +270 +00:21:43,390 --> 00:21:53,110 +Vì vậy, tôi đã làm việc rất nhiều với iOS, và vì vậy tôi chủ yếu đọc tài liệu của Apple, ý tôi là, nó rất + +271 +00:21:53,110 --> 00:21:53,830 +đẹp. + +272 +00:21:53,830 --> 00:21:59,500 +Giống như họ đã bố trí trang web rất đẹp, nhưng nếu bạn đã tham gia các khóa học về mắt của tôi, bạn sẽ biết rằng tôi + +273 +00:21:59,860 --> 00:22:01,510 +nghĩ rằng họ thuộc loại tối giản. + +274 +00:22:02,440 --> 00:22:08,560 +Họ đại loại như, Ồ vâng, chúng tôi có thứ này mà bạn có thể sử dụng, nhưng tại sao bạn không đi và tự + +275 +00:22:08,560 --> 00:22:10,240 +tìm hiểu cách thực hiện nó? + +276 +00:22:10,600 --> 00:22:12,610 +Vì vậy, nó hữu ích. + +277 +00:22:12,610 --> 00:22:18,220 +Nhưng bạn biết đấy, nếu bạn đã từng xem qua một số tài liệu của Google, đặc biệt là tài + +278 +00:22:18,220 --> 00:22:22,030 +liệu về sự cố gắng thì hoàn toàn đáng kinh ngạc và. + +279 +00:22:23,000 --> 00:22:28,260 +Bạn biết đấy, thực sự thích kudo cho đội vì đó là tài liệu tốt nhất mà tôi từng thấy. + +280 +00:22:28,280 --> 00:22:33,560 +Nó giống như đây là một phương pháp mà chúng tôi có trong mô-đun cụ thể này. + +281 +00:22:33,590 --> 00:22:34,970 +Đây là cách bạn sẽ sử dụng nó. + +282 +00:22:35,000 --> 00:22:36,500 +Đây là một ví dụ về mã. + +283 +00:22:36,530 --> 00:22:45,170 +Dưới đây là các thông số khác nhau mà bạn có thể tinh chỉnh, và nó tốt đến mức bạn có thể tưởng tượng rằng mình có + +284 +00:22:45,170 --> 00:22:48,110 +thể chọn cách sử dụng nó rất dễ dàng. + +285 +00:22:48,560 --> 00:22:50,980 +Trong khi Apple thì như vậy, Yeah, chúng tôi không thực sự quan tâm. + +286 +00:22:50,990 --> 00:22:52,670 +Bạn biết đấy, nếu bạn thành công, bạn sẽ thành công. + +287 +00:22:53,330 --> 00:22:55,340 +Nếu bạn tạo ra một ứng dụng, sẽ có đủ người tạo ra ứng dụng. + +288 +00:22:55,340 --> 00:22:55,790 +Tôi không biết. + +289 +00:22:55,790 --> 00:22:56,180 +Tôi không biết. + +290 +00:22:56,180 --> 00:22:56,960 +Đó là gì? + +291 +00:22:56,960 --> 00:22:59,210 +Họ đang suy nghĩ đằng sau tài liệu đó. + +292 +00:22:59,420 --> 00:23:01,310 +Nhưng nó rất khó. + +293 +00:23:02,360 --> 00:23:08,360 +Điều thứ hai tôi muốn nói là bạn không nhất thiết phải học được nhiều thứ từ tài liệu. + +294 +00:23:08,360 --> 00:23:14,570 +Nó giống như nếu bạn đang học một ngôn ngữ và điểm xuất phát của bạn là từ điển, bạn sẽ + +295 +00:23:14,570 --> 00:23:15,830 +ở đó một lúc. + +296 +00:23:16,250 --> 00:23:23,240 +Vì vậy, điều tốt là, bạn biết đấy, loại hình này quay trở lại cách bạn học, phải không? + +297 +00:23:23,240 --> 00:23:31,250 +Rất nhiều người vẫn học theo kiểu trước máy tính, trước internet như cách bạn đọc một cuốn sách, bạn + +298 +00:23:31,670 --> 00:23:34,670 +giảng viên của bạn giảng cho bạn. + +299 +00:23:34,670 --> 00:23:39,110 +Bạn ghi chép, bạn ghi nhớ những ghi chú đó, bạn đọc sách, bạn ghi chép nhiều hơn. + +300 +00:23:39,110 --> 00:23:40,100 +Bạn làm một bài kiểm tra. + +301 +00:23:40,940 --> 00:23:43,100 +Điều này, tôi sẽ nói. + +302 +00:23:44,280 --> 00:23:46,530 +Tốt cho các kỳ thi hoặc cho trường học. + +303 +00:23:46,530 --> 00:23:48,330 +Nó có lẽ vẫn là cách bạn phải làm. + +304 +00:23:48,330 --> 00:23:54,030 +Nhưng nếu bạn thực sự chỉ cố gắng học một kỹ năng cho cuộc sống hoặc cho bạn, bạn biết đấy, thay đổi + +305 +00:23:54,030 --> 00:23:59,610 +công việc hoặc chỉ vì bản thân, đó không phải là cách tốt nhất vì thông tin thực sự rất rẻ. + +306 +00:23:59,910 --> 00:24:06,660 +Bạn có thể nắm được khá nhiều kiến thức hoặc thông tin bạn muốn chỉ bằng cách nhập nó vào Google. + +307 +00:24:06,720 --> 00:24:15,000 +Vậy tại sao tôi phải lưu trữ tất cả thông tin đó trong não khi bạn biết rằng chỉ còn hai hoặc ba lần nhấn + +308 +00:24:15,000 --> 00:24:15,540 +phím? + +309 +00:24:15,540 --> 00:24:17,550 +Vì vậy, tôi không thực sự thích làm điều đó. + +310 +00:24:17,550 --> 00:24:19,620 +Và điều này trở lại tài liệu. + +311 +00:24:19,710 --> 00:24:21,810 +Tôi không nhớ tài liệu. + +312 +00:24:21,810 --> 00:24:23,640 +Tôi không tìm hiểu tài liệu. + +313 +00:24:24,210 --> 00:24:31,770 +Có rất nhiều phương pháp mà tôi không biết, bạn biết đấy, tôi không nhớ cách sử dụng. + +314 +00:24:31,770 --> 00:24:41,100 +Nhưng điều tôi biết là tôi có các kỹ năng để có thể hiểu mã khi tôi cần. + +315 +00:24:41,130 --> 00:24:45,660 +Vì vậy, khi tôi muốn tra cứu điều gì đó, tôi sẽ tra cứu nó trong tài liệu hướng dẫn. + +316 +00:24:45,660 --> 00:24:47,820 +Trên thực tế, tôi thường tra cứu nó trong StackOverflow. + +317 +00:24:47,850 --> 00:24:54,360 +Tôi thử xem một ví dụ về nơi nó được sử dụng và sau đó trong ví dụ đó, tôi sẽ thấy một phương pháp + +318 +00:24:54,360 --> 00:24:56,190 +cụ thể có trong tài liệu. + +319 +00:24:56,190 --> 00:24:59,070 +Và sau đó nếu tôi muốn có thêm thông tin cơ bản, tôi sẽ đọc nó. + +320 +00:24:59,070 --> 00:25:05,460 +Trong tài liệu này, tốt hơn nhiều là bạn nên tìm hiểu mọi thứ khi nào và khi nào bạn cần. + +321 +00:25:05,970 --> 00:25:09,000 +Vì vậy, đó là khá nhiều những gì tôi làm. + +322 +00:25:09,540 --> 00:25:16,410 +Vì vậy, câu hỏi tiếp theo là làm thế nào để bắt đầu một công ty khởi nghiệp. + +323 +00:25:17,790 --> 00:25:20,190 +Đó giống như một câu hỏi thực sự lớn. + +324 +00:25:20,820 --> 00:25:30,360 +Và tôi nghĩ lại trong câu hỏi, cũng có người đã hỏi, tôi nghĩ ai đó tên là Oliver đã nói, Bạn khuyên bạn nên làm + +325 +00:25:30,540 --> 00:25:33,840 +gì cho những doanh nhân đầy tham vọng? + +326 +00:25:33,840 --> 00:25:36,000 +Vì vậy, tôi sẽ trả lời hai điều này cùng nhau. + +327 +00:25:38,090 --> 00:25:39,650 +Vì thế. + +328 +00:25:40,390 --> 00:25:42,520 +Khi tôi bắt đầu. + +329 +00:25:43,450 --> 00:25:52,900 +Vì vậy, tôi bắt đầu xây dựng một công ty khởi nghiệp khi tôi vẫn đang làm bác sĩ, điều + +330 +00:25:52,900 --> 00:26:02,830 +này có lẽ hơi khổ sở vì tôi đã làm những giờ điên cuồng kiểu như, Ôi trời, có lẽ thỉnh thoảng + +331 +00:26:02,830 --> 00:26:07,090 +khoảng 14 giờ, giống như 16 giờ mỗi ngày. + +332 +00:26:08,120 --> 00:26:15,530 +Và điều tốt về y học, ít nhất, là bạn có ca trực đêm hoặc điều tốt hay điều xấu và ca + +333 +00:26:15,530 --> 00:26:23,660 +đêm, bạn biết đấy, để trở nên nhân đạo, ít nhất là ở châu Âu, sau ba ngày làm ca đêm, chúng ta có xu + +334 +00:26:23,660 --> 00:26:25,940 +hướng để được nghỉ ba ngày. + +335 +00:26:26,030 --> 00:26:32,360 +Vì vậy, ngày đầu tiên bạn sẽ bị phá hủy hoàn toàn, bạn sẽ không còn là con người bởi vì bạn đang cố gắng chuyển đổi múi + +336 +00:26:32,360 --> 00:26:33,230 +giờ, phải không? + +337 +00:26:33,230 --> 00:26:36,500 +Nó giống như bay đến Úc và quay lại hàng tuần. + +338 +00:26:37,460 --> 00:26:44,840 +Vì vậy, ngày đầu tiên giống như đã qua, nhưng ngày thứ hai và thứ ba, tôi thấy rằng tôi đã + +339 +00:26:44,840 --> 00:26:52,460 +có thể hồi phục những ngày đó và tôi chỉ cần đến thư viện và bắt đầu công việc khởi động của mình. + +340 +00:26:53,540 --> 00:26:57,800 +Vì vậy, điều đầu tiên là bạn phải tìm thời gian. + +341 +00:26:58,130 --> 00:27:01,040 +Không có thời điểm hoàn hảo để bắt đầu một công ty khởi nghiệp. + +342 +00:27:01,070 --> 00:27:03,740 +Không có cơ hội hoàn hảo. + +343 +00:27:03,740 --> 00:27:05,660 +Đó chỉ là sẽ đánh bạn vào đầu. + +344 +00:27:05,960 --> 00:27:14,120 +Tất cả mọi thứ mà chúng tôi đã xây dựng, mọi cơ hội đến với chúng tôi đều phải mất rất nhiều công sức chuẩn + +345 +00:27:14,120 --> 00:27:16,250 +bị để đạt được điều đó. + +346 +00:27:16,250 --> 00:27:16,760 +Đúng. + +347 +00:27:17,930 --> 00:27:23,930 +Tôi nghĩ rằng có điều này mà ông ngoại của tôi đã truyền vào tôi, đó là ông ngoại quá cố của tôi. + +348 +00:27:24,200 --> 00:27:27,740 +Anh ấy anh ấy thường chở tôi đến trường bằng xe đạp của anh ấy mỗi ngày. + +349 +00:27:27,740 --> 00:27:34,640 +Và trong 30 phút đạp xe nhỏ này, anh ấy sẽ đưa cho tôi những lời khuyên, kiểu như, ừm, kiểu + +350 +00:27:34,640 --> 00:27:37,660 +súp gà, như những mẩu cốm, những lời khuyên. + +351 +00:27:37,670 --> 00:27:42,410 +Tôi giống như rất nhiều lời khuyên, bao gồm, như, chúng sẽ nghe có vẻ kỳ lạ. + +352 +00:27:42,410 --> 00:27:54,800 +Nó giống như, nếu bạn đã ăn đậu chưa nấu chín hai lần và bạn vẫn tiếp tục ăn đậu chưa nấu chín, thì đó là điều không + +353 +00:27:54,800 --> 00:27:55,790 +thông minh. + +354 +00:27:58,640 --> 00:28:03,810 +Vì vậy, tôi nghĩ những gì anh ấy đang cố gắng nói là, đừng phạm cùng một sai lầm hai lần. + +355 +00:28:03,830 --> 00:28:06,290 +Tôi không biết tại sao nó lại liên quan đến đậu chưa nấu chín. + +356 +00:28:07,220 --> 00:28:15,350 +Nhưng một điều khác mà anh ấy nói với tôi là, bạn biết đấy, cơ hội đến với những ai chuẩn bị sẵn sàng. + +357 +00:28:15,350 --> 00:28:19,670 +Tôi khá chắc chắn rằng đó là một loại tương tự thực phẩm khác vì tôi thực sự làm tốt với các loại tương tự thực phẩm. + +358 +00:28:19,670 --> 00:28:21,590 +Đó là cách tôi hiểu thế giới. + +359 +00:28:22,940 --> 00:28:25,760 +Nhưng anh ấy nói điều đó, bạn biết đấy. + +360 +00:28:26,860 --> 00:28:34,210 +Mỗi khi bạn thấy ai đó trông như thể họ thành công chỉ trong một sớm một chiều, không bao giờ là một sớm một chiều. + +361 +00:28:34,390 --> 00:28:44,170 +Bạn không thấy tất cả những ngày và tháng mà họ đã đổ vào để làm điều gì đó có kết quả hay không thành + +362 +00:28:44,170 --> 00:28:50,710 +công hay không cho đến khi họ chuẩn bị đủ để đón nhận cơ hội đó. + +363 +00:28:51,100 --> 00:28:56,830 +Vì vậy, một ví dụ điển hình, tôi nghĩ là, chẳng hạn, chúng tôi đã xây dựng khóa học rung lắc bởi vì. + +364 +00:28:58,820 --> 00:29:06,200 +Tim, người đứng đầu nhóm Flutter tại Google, đã tham gia khóa học iOS của tôi và anh ấy yêu thích nó đến mức đã liên + +365 +00:29:06,200 --> 00:29:13,430 +hệ với tôi qua Twitter và đây là cách chúng tôi hợp tác với nhóm Flutter tại Google để cùng nhau xây dựng khóa + +366 +00:29:13,430 --> 00:29:14,150 +học này. + +367 +00:29:15,090 --> 00:29:22,320 +Bây giờ, nếu tôi mới bắt đầu xây dựng các khóa học ngày đầu tiên và, bạn biết đấy, trước tiên sẽ không ai biết về + +368 +00:29:22,320 --> 00:29:22,620 +bạn. + +369 +00:29:22,650 --> 00:29:25,500 +Thứ hai, bạn biết đấy, không có hồ sơ theo dõi. + +370 +00:29:25,500 --> 00:29:32,520 +Và thứ ba, tôi thậm chí không chắc mình sẽ có thể xây dựng một khóa học tốt như vậy từ đầu. + +371 +00:29:32,820 --> 00:29:33,900 +Vì thế. + +372 +00:29:34,640 --> 00:29:41,780 +Bạn biết đấy, ý tưởng là dành tất cả thời gian của bạn để chuẩn bị, khởi động, làm việc với nó, và sau đó, bạn biết đấy, sẽ + +373 +00:29:41,780 --> 00:29:46,010 +có những khoảnh khắc, sẽ có chiến thắng và sẽ có những tổn thất và bạn phải + +374 +00:29:46,010 --> 00:29:48,800 +nắm lấy thắng và không nghĩ quá nhiều về thua lỗ. + +375 +00:29:48,800 --> 00:29:52,070 +Tóm lại, đó là cách tôi nghĩ về nó. + +376 +00:29:53,040 --> 00:29:54,060 +Khởi động của chúng tôi. + +377 +00:29:55,360 --> 00:29:55,750 +Được chứ. + +378 +00:29:55,750 --> 00:30:05,290 +Vì vậy, tôi sẽ quay lại phần trò chuyện và tôi sẽ hỏi các bạn thêm một số câu hỏi và hãy xem chúng ta có + +379 +00:30:05,290 --> 00:30:07,180 +câu hỏi nào hay không. + +380 +00:30:08,930 --> 00:30:09,260 +Được rồi. + +381 +00:30:09,260 --> 00:30:17,150 +Vì vậy, tôi nghĩ khi xem xét các câu hỏi mà mọi người đã hỏi trước đây và cả trên YouTube ngay bây giờ, + +382 +00:30:17,150 --> 00:30:20,810 +câu hỏi mà tôi thấy nhiều là câu hỏi này. + +383 +00:30:21,260 --> 00:30:29,120 +Có vẻ như mọi người đều muốn biết khi nào bản cập nhật iOS 14 sắp ra mắt cho iOS hoặc sắp có một + +384 +00:30:29,120 --> 00:30:30,290 +khóa học mới? + +385 +00:30:30,290 --> 00:30:31,730 +Khi nào nó sẽ xảy ra? + +386 +00:30:31,760 --> 00:30:32,960 +Điều gì đang xảy ra trên đó? + +387 +00:30:32,960 --> 00:30:34,440 +Tôi có nên đợi khóa học không? + +388 +00:30:34,460 --> 00:30:37,550 +Tôi có nên tiếp tục khóa học iOS 13 không? + +389 +00:30:37,880 --> 00:30:39,050 +Chuyện gì đang xảy ra vậy? + +390 +00:30:39,840 --> 00:30:45,230 +Được rồi, đây là những gì đang xảy ra. + +391 +00:30:46,790 --> 00:30:52,580 +Chúng tôi đã xem xét Big Sur và cả phiên bản mới nhất của Xcode. + +392 +00:30:52,610 --> 00:31:00,140 +Chúng tôi đang trong quá trình thử nghiệm khóa học thông qua tất cả các phần mềm mới này và những gì chúng + +393 +00:31:00,140 --> 00:31:03,620 +tôi nhận ra là những thay đổi không quá lớn. + +394 +00:31:03,950 --> 00:31:09,080 +Vì vậy, về cơ bản không có đủ thay đổi đối với. + +395 +00:31:10,250 --> 00:31:16,220 +Họ đã chỉnh sửa phong cách của Xcode một chút và họ đã thêm một số tính năng tiện dụng mà chúng tôi có thể + +396 +00:31:16,220 --> 00:31:16,880 +chỉ ra. + +397 +00:31:17,030 --> 00:31:24,200 +Nhưng về cơ bản, bạn biết đấy, những gì chúng tôi đang làm là chúng tôi đã làm, chúng tôi chỉ đang cố gắng tìm ra cách + +398 +00:31:24,200 --> 00:31:29,300 +chúng tôi có thể cập nhật những phần cuối cùng của khóa học vì chúng đã lỗi thời hơn. + +399 +00:31:29,390 --> 00:31:34,340 +Tôi nghĩ trong khi các mô-đun ban đầu chỉ dành cho trò chuyện flash. + +400 +00:31:34,340 --> 00:31:40,190 +Vì vậy, 14 hoặc 15 mô-đun đầu tiên chúng tôi sẽ giữ nguyên vì chúng vẫn hoạt động, nhưng chúng tôi sẽ cập nhật + +401 +00:31:40,190 --> 00:31:41,180 +một số giao diện. + +402 +00:31:41,180 --> 00:31:49,250 +Vì vậy, ít nhất ban đầu nó sẽ không quá khó hiểu, nhưng điều đó có nghĩa là sẽ không có khóa học iOS mới. + +403 +00:31:49,250 --> 00:31:54,610 +Bạn sẽ không phải mua bất cứ thứ gì hoặc các bản cập nhật mà chúng tôi đang thực hiện trong mùa đông này. + +404 +00:31:54,640 --> 00:31:59,060 +Mùa xuân tới sẽ được thêm vào khóa học iOS hiện có. + +405 +00:31:59,060 --> 00:32:02,000 +Vì vậy, đừng mua bất kỳ khóa học nào nữa. + +406 +00:32:02,000 --> 00:32:07,250 +Chỉ cần giữ lại cái mà bạn đã có và bạn sẽ thấy các bản cập nhật đến. + +407 +00:32:07,250 --> 00:32:12,980 +Nhưng nếu bạn đã học với khóa học, đừng lo lắng, những thay đổi không phải là lớn. + +408 +00:32:13,430 --> 00:32:16,100 +Bạn sẽ có thể tìm ra nó. + +409 +00:32:17,230 --> 00:32:20,470 +Vì vậy, đó là những gì đang xảy ra trên đó. + +410 +00:32:20,830 --> 00:32:24,790 +Và hãy xem chúng tôi có những câu hỏi nào khác trong YouTube. + +411 +00:32:28,040 --> 00:32:28,370 +Được rồi. + +412 +00:32:28,370 --> 00:32:39,320 +Có vẻ như chúng tôi đã nhận được một câu hỏi từ Atharva Vasco và một số người trên YouTube. + +413 +00:32:41,810 --> 00:32:44,420 +Bạn có xem phim anime ko? + +414 +00:32:45,120 --> 00:32:45,380 +Được chứ. + +415 +00:32:45,420 --> 00:32:46,350 +Vì vậy, đó là. + +416 +00:32:47,280 --> 00:32:48,300 +Đại loại. + +417 +00:32:51,620 --> 00:32:52,280 +Thật thú vị. + +418 +00:32:52,280 --> 00:32:54,800 +Đó là một câu hỏi mà mọi người đều muốn biết. + +419 +00:32:54,800 --> 00:32:59,060 +Tôi tự hỏi có phải vì tất cả các meme mà tôi đã đưa vào các khóa học từ anime hay không. + +420 +00:32:59,330 --> 00:33:01,670 +Vì vậy, tôi. + +421 +00:33:02,440 --> 00:33:04,660 +Tôi không nghĩ vậy. + +422 +00:33:07,190 --> 00:33:10,580 +Vì vậy, bộ anime mà tôi thích về cơ bản là khá lâu đời. + +423 +00:33:10,580 --> 00:33:12,110 +Bạn biết đấy, cô gái của bạn không còn trẻ. + +424 +00:33:12,560 --> 00:33:21,970 +Và vì vậy, ví dụ như phim Spirited Away của Ghibli, nó giống như một trong những bộ phim tôi yêu thích nhất mọi thời đại. + +425 +00:33:21,980 --> 00:33:27,080 +Tôi yêu nó rất nhiều, nhưng với bất kỳ bộ phim nào của Djibouti, nó thật tuyệt vời. + +426 +00:33:27,080 --> 00:33:28,910 +Nó giống như vẽ cảnh. + +427 +00:33:29,270 --> 00:33:36,920 +Nhưng gần đây hơn, tôi hơi muộn với nhóm nhạc ở đây, nhưng Netflix đã bắt đầu chiếu + +428 +00:33:36,920 --> 00:33:42,140 +loại anime phương Tây này có tên là Avatar The Last Airbender. + +429 +00:33:43,310 --> 00:33:49,220 +Vì vậy, nếu bạn chưa xem này, đừng bị đặt tên. + +430 +00:33:49,220 --> 00:33:53,810 +Nó có một cái tên kinh khủng, nhưng nó rất hay. + +431 +00:33:53,900 --> 00:34:01,280 +Nó giống như sống lại thời thơ ấu, bạn biết đấy, giống như, nếu bạn có thể quay trở lại làm một đứa trẻ nhỏ, đó là cảm + +432 +00:34:01,280 --> 00:34:02,180 +giác của nó. + +433 +00:34:02,180 --> 00:34:07,040 +Nó rất bổ dưỡng và ôi, Chúa ơi, nó quá tốt. + +434 +00:34:07,580 --> 00:34:09,830 +Nếu bạn chưa xem nó, tôi sẽ không làm hỏng nó cho bạn. + +435 +00:34:09,830 --> 00:34:18,590 +Nhưng nó thực sự là chương trình hoạt hình hay nhất mà tôi từng xem, và nó có một vị trí đặc biệt trong trái tim tôi. + +436 +00:34:19,889 --> 00:34:22,250 +Được rồi, chúng ta có những câu hỏi nào khác? + +437 +00:34:25,940 --> 00:34:30,320 +Chúng tôi có một câu hỏi từ một cậu bé 13 tuổi. + +438 +00:34:30,620 --> 00:34:35,090 +Tôi nghĩ rằng tôi đã có những lời tán dương về những chàng trai đẹp. + +439 +00:34:35,929 --> 00:34:36,770 +Tôi không chắc. + +440 +00:34:37,730 --> 00:34:43,010 +Và anh ấy hỏi, Tôi có thể có những nghề nghiệp gì ở tuổi 13? + +441 +00:34:43,260 --> 00:34:48,739 +Được rồi, tôi sẽ đọc toàn bộ câu hỏi vì nó hơi dài. + +442 +00:34:50,530 --> 00:34:54,909 +Anh ấy nói rằng tôi là một cậu bé 13 tuổi. + +443 +00:34:55,630 --> 00:34:57,820 +Tôi đang tham gia khóa học phát triển web của bạn. + +444 +00:34:57,850 --> 00:35:01,700 +Tôi thậm chí còn đang thực hiện một khóa học dựa trên cách tạo A. TÔI. và đạo đức hack. + +445 +00:35:01,720 --> 00:35:06,880 +Tôi có thể có những nghề nghiệp nào ở tuổi này hoặc những công việc không xét đến tuổi của tôi? + +446 +00:35:06,910 --> 00:35:08,330 +Xin hãy trả lời câu hỏi này. + +447 +00:35:08,350 --> 00:35:09,220 +Yêu cách bạn dạy. + +448 +00:35:09,250 --> 00:35:10,900 +Tìm thấy nó dễ hiểu Avatar. + +449 +00:35:11,710 --> 00:35:15,880 +Được rồi, vậy trước tiên, tại sao bạn lại nghĩ về công việc? + +450 +00:35:15,910 --> 00:35:17,200 +Bạn là 13 người đàn ông. + +451 +00:35:17,200 --> 00:35:19,250 +Giống như, chỉ cần tận hưởng cuộc sống. + +452 +00:35:19,270 --> 00:35:21,940 +Thật tốt khi ở độ tuổi đó. + +453 +00:35:23,140 --> 00:35:31,690 +Nhưng rồi phải nói lại rằng, như khi tôi 13 tuổi, có lẽ tôi cũng giống như bạn. + +454 +00:35:31,720 --> 00:35:36,460 +Tôi cũng đang nghĩ về việc làm thế nào để có được một công việc. + +455 +00:35:36,460 --> 00:35:37,420 +Tôi không biết nó là gì. + +456 +00:35:37,420 --> 00:35:41,800 +Tôi nghĩ bạn có lẽ là một người quá khích, cũng giống như một người như tôi. + +457 +00:35:42,550 --> 00:35:44,110 +Vì thế. + +458 +00:35:45,330 --> 00:35:53,400 +Khi tôi 13 tuổi, tôi đã nghĩ rằng tôi thực sự muốn có một ít tiền tiêu vặt vì bố mẹ tôi không thực sự tin vào tiền tiêu vặt + +459 +00:35:53,400 --> 00:35:58,620 +và những thứ như đồ ngọt và đồ ăn nhẹ mà bạn bè tôi đang có và tôi đã + +460 +00:35:58,620 --> 00:35:59,430 +ghen tị. + +461 +00:35:59,430 --> 00:36:00,210 +Vì vậy, tôi đã giống như, Bạn biết gì không? + +462 +00:36:00,210 --> 00:36:01,500 +Tôi sẽ tự kiếm tiền. + +463 +00:36:01,740 --> 00:36:07,680 +Vì vậy, tôi quyết định xem lại Tôi giỏi cái gì? + +464 +00:36:08,070 --> 00:36:10,800 +Và tôi đã thử một vài thứ. + +465 +00:36:10,890 --> 00:36:13,880 +Một là tôi có đôi chân mà tôi có thể đi được. + +466 +00:36:13,890 --> 00:36:17,870 +Vì vậy, tôi đã đăng ký thứ này ở Anh. + +467 +00:36:17,880 --> 00:36:22,560 +Tôi thậm chí không chắc nó được gọi là gì và ở những nơi khác, nhưng về cơ bản có cuốn sách khổng lồ này, giống như + +468 +00:36:22,560 --> 00:36:25,500 +một danh bạ điện thoại mà chúng ta từng có, giống như những ngày tiền internet. + +469 +00:36:25,500 --> 00:36:30,990 +Nó được gọi là Những Trang Vàng ở Anh, và về cơ bản bạn có thể đi từng nhà để kẹp + +470 +00:36:31,020 --> 00:36:35,970 +những cuốn sách này như những cuốn sách nặng hai kg và bạn được trả một bảng Anh. + +471 +00:36:35,970 --> 00:36:41,400 +Như vậy khoảng $ 1. 20 cho mỗi cuốn sách bạn giao. + +472 +00:36:41,970 --> 00:36:49,020 +Vì vậy, vấn đề là có quá nặng như thế, tôi không biết rằng chúng giống như hai kg mỗi cái. + +473 +00:36:49,020 --> 00:36:57,900 +Vì vậy, nếu bạn tưởng tượng trong số họ có mười người và tôi 13 tuổi, điều đó khá khó khăn và tôi kiếm được một số tiền tiêu vặt, nhưng tôi đã + +474 +00:36:57,900 --> 00:36:59,910 +nghĩ đến việc lặp lại điều đó. + +475 +00:36:59,910 --> 00:37:05,100 +Vì vậy, bạn biết đấy, quay trở lại với công ty khởi nghiệp, bạn phải thử một cái gì đó, bạn thử nghiệm nó, xem nó có + +476 +00:37:05,100 --> 00:37:06,720 +hiệu quả không, nếu mọi người thích nó. + +477 +00:37:07,260 --> 00:37:10,920 +Vì vậy, nếu nó đưa bạn đến mục tiêu của bạn và nếu không, bạn lặp lại. + +478 +00:37:11,040 --> 00:37:18,450 +Vì vậy, sự lặp lại của tôi về cơ bản kết thúc trong tôi suy nghĩ về những gì tôi còn có? + +479 +00:37:18,450 --> 00:37:22,800 +Và có lẽ lao động chân tay không hẳn là điểm mạnh của tôi. + +480 +00:37:23,490 --> 00:37:29,820 +Vì vậy, tôi nghĩ rằng, bạn biết đấy, tôi giống như khá giỏi toán, tôi khá giỏi vật lý và có thể có những + +481 +00:37:30,870 --> 00:37:33,360 +đứa trẻ khác muốn học toán và vật lý. + +482 +00:37:33,510 --> 00:37:39,060 +Vì vậy, tôi đã in những tờ rơi nhỏ này giống như từ chiếc máy in nhỏ ở nhà của tôi. + +483 +00:37:39,060 --> 00:37:43,380 +Vì vậy, giống như chúng lớn như thế này mỗi lần thêm vào vì tôi không muốn tốn quá nhiều giấy mực. + +484 +00:37:43,770 --> 00:37:49,560 +Và tôi cắt nó ra khỏi trang và nó giống như tám quảng cáo trên mỗi trang. + +485 +00:37:49,560 --> 00:37:55,740 +Và tôi đi từng nhà xung quanh khu vực lân cận của tôi, như một khu vực mà tôi nghĩ là có + +486 +00:37:55,740 --> 00:37:57,210 +thể đi bộ được. + +487 +00:37:57,210 --> 00:38:04,260 +Và tôi đã đăng nó cho mọi người trong hộp thư và sau đó giống như một số người thực sự gọi tôi lên và sau đó tôi trở + +488 +00:38:04,260 --> 00:38:10,410 +thành gia sư, mặc dù có thể là bất hợp pháp, bởi vì tôi khá chắc chắn rằng bạn không được phép đi làm và + +489 +00:38:10,410 --> 00:38:15,150 +kiếm tiền ở tuổi 13 trừ khi bạn giống như được giám sát hoặc một cái gì đó. + +490 +00:38:15,600 --> 00:38:19,560 +Nhưng điều đó giống như công việc kinh doanh đầu tiên của tôi bị bẻ cong. + +491 +00:38:19,800 --> 00:38:23,790 +Vậy quay lại câu hỏi của bạn, bạn có thể có những nghề nghiệp gì ở tuổi 13? + +492 +00:38:23,790 --> 00:38:29,850 +Vâng, bây giờ bạn đã có Internet hiệu quả, bạn có thể làm bất cứ điều gì bạn có thể muốn, + +493 +00:38:29,850 --> 00:38:34,380 +có thể đăng ký trên Fiverr và bắt đầu làm các hợp đồng tự do. + +494 +00:38:35,400 --> 00:38:41,190 +Tôi nghĩ rằng khi mọi người đăng ký các hợp đồng biểu diễn tự do này, họ luôn muốn tính phí những gì nó đáng giá. + +495 +00:38:41,190 --> 00:38:47,670 +Và tôi sẽ nói, đừng làm vậy, không, không thích tính phí quá mức, thấp hơn mức bạn nghĩ rằng + +496 +00:38:47,670 --> 00:38:49,170 +nó sẽ phải trả. + +497 +00:38:49,170 --> 00:38:55,380 +Vì vậy, bạn muốn xây dựng cho ai đó một trang web, tính phí $ 5 cho nó, bạn biết đấy, và những gì bạn muốn làm giống + +498 +00:38:55,380 --> 00:39:03,120 +như xây dựng danh tiếng của bạn để bạn có nhiều khách hàng hơn và nếu họ thích những gì bạn làm, hy vọng rằng bạn đang làm tốt công việc bởi vì bạn biết + +499 +00:39:03,120 --> 00:39:05,310 +đấy, bạn là sinh viên của tôi, phải không? + +500 +00:39:05,310 --> 00:39:06,960 +Vì vậy, bạn sẽ được khá tốt. + +501 +00:39:07,140 --> 00:39:13,230 +Và khi bạn giao lại dự án cho họ, bạn đang học các kỹ năng như giao tiếp, cách làm việc + +502 +00:39:13,230 --> 00:39:18,150 +với khách hàng, ý của khách hàng khi họ nói, Ồ, tôi muốn điều đó trông sang + +503 +00:39:18,150 --> 00:39:18,870 +trọng hơn. + +504 +00:39:18,870 --> 00:39:20,910 +Điều đó thực sự có ý nghĩa gì đối với một nhà phát triển web? + +505 +00:39:20,910 --> 00:39:22,320 +Chà, bạn sẽ giải quyết vấn đề đó. + +506 +00:39:22,680 --> 00:39:27,330 +Vì vậy, một khi bạn đã có một khách hàng tốt, thì bạn đã có một lời truyền miệng. + +507 +00:39:27,330 --> 00:39:28,710 +Bạn cũng có đánh giá. + +508 +00:39:28,710 --> 00:39:33,690 +Bạn có một khách hàng có thể là trọng tài của bạn và bạn xây dựng dựa trên điều đó. + +509 +00:39:33,690 --> 00:39:37,650 +Vì vậy, bạn nhận được nhiều khách hàng hơn, có thể bạn đã có quá nhiều việc. + +510 +00:39:37,650 --> 00:39:42,990 +Vì vậy, bây giờ bạn tăng giá của bạn, bạn tăng giá của bạn bây giờ 10 đô la, và sau đó bạn lại phải làm quá nhiều việc. + +511 +00:39:42,990 --> 00:39:44,670 +Bạn tăng giá của mình lên 20 đô la. + +512 +00:39:44,670 --> 00:39:50,130 +Và theo cách đó, cuối cùng bạn sẽ kiếm đủ tiền tiêu vặt để mua đồ ngọt + +513 +00:39:50,130 --> 00:39:53,940 +hoặc bất cứ thứ gì bạn biết, bạn muốn đạt được. + +514 +00:39:53,940 --> 00:39:59,250 +Có thể bạn muốn mua cổ phiếu ở tuổi 13, có thể bạn sẽ mua Tesla. + +515 +00:39:59,250 --> 00:39:59,970 +Tôi không biết. + +516 +00:40:00,270 --> 00:40:03,420 +Nhưng vâng, đó là lời khuyên của tôi. + +517 +00:40:05,490 --> 00:40:11,310 +Hãy xem liệu chúng tôi có thêm một số câu hỏi trên YouTube hay không. + +518 +00:40:11,790 --> 00:40:13,440 +Vì thế. + +519 +00:40:14,560 --> 00:40:18,490 +Hãy xem các bạn đang nói gì ở đây. + +520 +00:40:25,480 --> 00:40:26,860 +Ồ, đây là một trong những thực sự tốt. + +521 +00:40:27,550 --> 00:40:32,560 +Vì vậy, đây là một câu hỏi từ Dionysius. + +522 +00:40:32,590 --> 00:40:33,760 +Dionysius. + +523 +00:40:34,030 --> 00:40:35,410 +Tôi nghĩ đó là cách bạn phát âm nó. + +524 +00:40:36,310 --> 00:40:41,500 +Và anh hỏi, Hiểu cú pháp không quá khó. + +525 +00:40:41,500 --> 00:40:46,180 +Việc xây dựng cú pháp cùng với logic để xây dựng mã chức năng là rất khó. + +526 +00:40:46,300 --> 00:40:50,750 +Chiến lược tốt nhất để kết nối các dấu chấm để xây dựng các dự án trong thế giới thực là gì? + +527 +00:40:50,770 --> 00:40:56,410 +Đây là thứ mà các bạn đã ủng hộ rất nhiều và đó là thứ mà chúng tôi nghĩ là thực sự quan + +528 +00:40:56,410 --> 00:41:01,630 +trọng vì một trong những loại phản hồi mà chúng tôi luôn nhận được từ sinh viên là, Vâng, được + +529 +00:41:01,690 --> 00:41:09,700 +rồi, bạn biết đấy, tôi đã hoàn thành hướng dẫn này, Tôi đã hoàn thành hướng dẫn đó, nhưng bạn biết đấy, sau khi hoàn thành, tôi vẫn không biết làm thế nào + +530 +00:41:09,700 --> 00:41:11,580 +để thực hiện dự án của mình. + +531 +00:41:11,590 --> 00:41:15,880 +Tôi vẫn không biết làm thế nào để, làm thế nào để xây dựng một cái gì đó, phải không? + +532 +00:41:16,570 --> 00:41:23,770 +Vì vậy, đây thực sự giống như suy nghĩ của chúng tôi khi chúng tôi bắt đầu xây dựng Dự án 100 ngày viết mã. + +533 +00:41:24,040 --> 00:41:33,850 +Tôi muốn thực hiện một khóa học về cơ bản, bắt đầu với các hướng dẫn và rất nhiều hướng dẫn. + +534 +00:41:34,000 --> 00:41:44,650 +Nhưng sau đó để tiếp tục để có thể cho phép bạn trải nghiệm cảm giác như thế nào khi bánh xe đào tạo + +535 +00:41:44,650 --> 00:41:45,250 +tắt. + +536 +00:41:45,430 --> 00:41:52,210 +Vì vậy, khi tôi lần đầu tiên học cách đi xe đạp, tôi đã lái nó và tôi thực sự không có một trong những chiếc xe + +537 +00:41:52,210 --> 00:41:54,160 +đạp ưa thích có bánh xe tập. + +538 +00:41:54,160 --> 00:41:58,240 +Tôi chỉ được bố tôi, giống như, giữ xe đạp từ phía sau. + +539 +00:41:58,720 --> 00:42:02,590 +Và, bạn biết đấy, ban đầu tôi chỉ đang cưỡi ngựa. + +540 +00:42:02,590 --> 00:42:03,820 +Anh ta đang chạy đằng sau. + +541 +00:42:03,820 --> 00:42:06,280 +Và tại một thời điểm nào đó, anh ấy đã buông tay. + +542 +00:42:06,280 --> 00:42:10,060 +Và tôi không thực sự để ý và tôi có thể tự bắt đầu đạp xe. + +543 +00:42:10,060 --> 00:42:13,960 +Nhưng sau đó khi tôi quay lại và thấy không có ai ở đó, tôi lập tức đâm sầm vào. + +544 +00:42:13,960 --> 00:42:14,470 +Đúng. + +545 +00:42:14,770 --> 00:42:19,690 +Vì vậy, tôi đoán vậy, thành tích chạy xe đạp của tôi không lớn. + +546 +00:42:19,870 --> 00:42:26,740 +Nhưng vì vậy tôi đoán điểm học tập ở đó, bạn biết đấy. + +547 +00:42:27,430 --> 00:42:36,370 +Bạn không phải lúc nào cũng có mặt trên lãnh thổ nếu bạn muốn trở thành người không phụ thuộc vào các bài hướng dẫn. + +548 +00:42:36,940 --> 00:42:44,830 +Vì vậy, rất nhiều người đã hỏi tôi, này, bạn biết đấy, khóa học viết mã hàng trăm ngày này, tại sao càng + +549 +00:42:44,830 --> 00:42:48,040 +về cuối càng có ít video như vậy? + +550 +00:42:48,730 --> 00:42:50,290 +Có phải vì bạn chưa hoàn thành nó? + +551 +00:42:50,320 --> 00:42:51,190 +Chuyện gì đang xảy ra vậy? + +552 +00:42:51,400 --> 00:42:54,820 +Vì vậy, câu trả lời là, không, không phải vì tôi chưa hoàn thành nó. + +553 +00:42:54,820 --> 00:42:59,050 +Đó là bởi vì nó thực sự được suy nghĩ cẩn thận, tin hay không. + +554 +00:42:59,050 --> 00:43:01,990 +Và ý tưởng là. + +555 +00:43:03,040 --> 00:43:12,640 +Hãy là người giữ xe đạp từ phía sau và cuối cùng để bạn đi, bởi vì tôi muốn bạn có thể hoàn thành khóa học đó + +556 +00:43:12,640 --> 00:43:20,020 +và kiếm được việc làm hoặc xây dựng công ty khởi nghiệp, xây dựng dự án của riêng bạn. + +557 +00:43:20,110 --> 00:43:22,810 +Nhưng điều đó đòi hỏi khá nhiều khó khăn. + +558 +00:43:23,320 --> 00:43:26,440 +Và cuộc đấu tranh đến từ việc xây dựng các dự án. + +559 +00:43:26,440 --> 00:43:27,040 +Đúng. + +560 +00:43:27,190 --> 00:43:31,900 +Nhưng bạn biết đấy, khi tôi nói với mọi người, cách tốt nhất để học viết mã sau khi bạn hoàn thành phần hướng + +561 +00:43:31,900 --> 00:43:33,730 +dẫn của mình là xây dựng một dự án. + +562 +00:43:33,730 --> 00:43:37,360 +Họ sẽ nói, tôi không biết, tôi xây dựng dự án nào và xây dựng nó như thế nào? + +563 +00:43:37,360 --> 00:43:38,620 +Tôi không biết làm thế nào để đạt được điều đó. + +564 +00:43:39,250 --> 00:43:47,050 +Vì vậy, đó là lý do tại sao chúng tôi xây dựng khóa học này, để cố gắng làm cho nó ban đầu bạn có thể thực + +565 +00:43:47,050 --> 00:43:55,270 +hiện từng bước nhiều hơn, chẳng hạn như các bài học video và sau đó bạn có các bài học văn bản từng bước với sự phụ thuộc nhiều + +566 +00:43:55,270 --> 00:44:01,930 +hơn vào tài liệu và loại thực các công cụ mà một nhà phát triển sẽ sử dụng như Google và StackOverflow. + +567 +00:44:02,050 --> 00:44:03,070 +Bạn cần phải đấu tranh. + +568 +00:44:03,070 --> 00:44:05,980 +Bạn cần tìm ra câu trả lời cho chính mình. + +569 +00:44:06,220 --> 00:44:09,040 +Nhưng, bạn biết đấy, có hướng dẫn và có hướng dẫn. + +570 +00:44:09,040 --> 00:44:14,830 +Và cuối cùng để đưa bạn đến cuối nơi bạn thực sự đang xây dựng các dự án của riêng mình + +571 +00:44:14,830 --> 00:44:20,830 +cho danh mục đầu tư của riêng bạn, chứa 100% mã của riêng bạn, mà bạn có thể sao chép, phải không? + +572 +00:44:20,830 --> 00:44:23,620 +Bạn có thể bán, bạn có thể làm bất cứ điều gì bạn muốn vì đó là của riêng bạn. + +573 +00:44:23,770 --> 00:44:29,920 +Và những gì chúng tôi đã làm chỉ là cung cấp ý tưởng dự án cho bạn, điều mà chúng tôi nghĩ là thực sự khả + +574 +00:44:29,920 --> 00:44:34,810 +thi mà bạn chắc chắn có thể làm được nếu đã hoàn thành toàn bộ 80 ngày đầu tiên. + +575 +00:44:34,900 --> 00:44:37,360 +Vì vậy, đó là những gì chúng tôi đã cố gắng làm. + +576 +00:44:37,360 --> 00:44:46,360 +Và, bạn biết đấy, tôi nghĩ cách tốt nhất để xây dựng các dự án trong thế giới thực là bắt đầu từ quy mô nhỏ. + +577 +00:44:46,720 --> 00:44:51,970 +Vì vậy, đừng bắt đầu cố gắng chế tạo một chiếc ô tô, thay vào đó hãy chế tạo một chiếc ván trượt. + +578 +00:44:52,030 --> 00:44:58,060 +Và sau đó khi bạn đã chế tạo được ván trượt, có thể thêm tay cầm vào nó, biến nó thành một chiếc xe tay ga, và sau đó có thể khi bạn đã + +579 +00:44:58,060 --> 00:45:01,720 +làm xong, hãy biến nó thành một chiếc mô tô và sau đó biến nó thành một chiếc ô tô. + +580 +00:45:01,750 --> 00:45:07,990 +Đừng chỉ ra ngoài đó và thích, tôi muốn xây dựng Facebook và Twitter cộng, bạn biết đấy, bất kỳ phần mềm doanh nghiệp + +581 +00:45:07,990 --> 00:45:12,010 +nào và tôi sẽ làm như thế sau khi hoàn thành khóa học này. + +582 +00:45:12,010 --> 00:45:14,320 +Giống như, đó chỉ là bạn đang thiết lập bản thân để thất bại. + +583 +00:45:14,410 --> 00:45:16,810 +Bạn phải bắt đầu với một cái gì đó đơn giản. + +584 +00:45:17,950 --> 00:45:20,200 +Được rồi, vậy kiểu chạy nào? + +585 +00:45:20,200 --> 00:45:20,920 +Một chút kết thúc? + +586 +00:45:20,920 --> 00:45:27,430 +Tôi đã nói là chúng ta sẽ làm trong 45 phút, nhưng giờ chúng ta còn gần một giờ nữa, vì vậy, tôi sẽ chỉ + +587 +00:45:27,430 --> 00:45:32,740 +lướt qua cuộc trò chuyện trên YouTube và thử xem các bạn đang nói gì, chẳng hạn như trực tiếp. + +588 +00:45:34,120 --> 00:45:36,910 +Hãy làm một số câu hỏi nhanh, giao diện người dùng nhanh hoặc bộ giao diện người dùng. + +589 +00:45:38,040 --> 00:45:40,060 +Vì vậy, nếu giao diện người dùng đang trở nên tốt hơn rất nhiều. + +590 +00:45:40,060 --> 00:45:47,920 +Nhưng bạn biết đấy, khi chúng tôi chuyển đổi Swift từ Objective-C sang Swift, phải mất hàng năm trời. + +591 +00:45:47,920 --> 00:45:50,200 +Vẫn như vô số ứng dụng được xây dựng bằng Objective-C. + +592 +00:45:50,200 --> 00:45:55,330 +Vì vậy Swift UI không phải là thứ mà bạn có thể học và được thuê ngay bây giờ. + +593 +00:45:55,360 --> 00:45:59,350 +Nó thực sự vui và tôi thực sự thích chơi với nó, nhưng. + +594 +00:46:00,190 --> 00:46:05,860 +Tôi thực sự không nghĩ nó đủ nghiêm túc, như nhu cầu của tôi vào lúc này. + +595 +00:46:05,860 --> 00:46:10,000 +Vì vậy, chúng tôi có thể sẽ xây dựng nhiều hướng dẫn hơn cho khóa học hiện có. + +596 +00:46:10,000 --> 00:46:12,910 +Vì vậy, nếu bạn bỏ lỡ điều đó, bạn không phải mua một khóa học mới. + +597 +00:46:12,910 --> 00:46:20,920 +Khóa học iOS 13 hiện tại của bạn sẽ được cập nhật, nhưng có lẽ nó sẽ có giao diện người dùng nhanh hơn, ít + +598 +00:46:20,920 --> 00:46:28,240 +uikit hơn một chút và sau đó chúng tôi sẽ tiếp tục điều chỉnh tỷ lệ phần trăm đó cho đến khi Apple + +599 +00:46:28,240 --> 00:46:29,740 +chuyển đổi hoàn toàn. + +600 +00:46:29,740 --> 00:46:35,050 +Nhưng tôi muốn làm điều đó một cách từ từ bởi vì hiện tại loại kỹ năng thực sự quan trọng sẽ giúp + +601 +00:46:35,050 --> 00:46:36,670 +bạn được tuyển dụng là uikit. + +602 +00:46:38,960 --> 00:46:43,610 +Bạn có thể làm cho khóa học iOS của mình giống như mã thử thách 100 ngày không? + +603 +00:46:46,280 --> 00:46:50,390 +Tôi nghĩ chúng tôi đã nghĩ đến việc thực hiện thử thách viết mã 100 ngày. + +604 +00:46:50,390 --> 00:46:53,480 +Chúng tôi đã nghĩ về ngôn ngữ hoàn hảo cho nó là gì? + +605 +00:46:53,630 --> 00:46:58,730 +Bởi vì Python là thứ mà bạn có thể làm, giống như rất nhiều thứ khác nhau như + +606 +00:46:58,730 --> 00:47:03,290 +phát triển web hoặc khoa học dữ liệu hoặc viết kịch bản hoặc tự động hóa. + +607 +00:47:03,590 --> 00:47:12,320 +Swift tập trung khá nhiều vào việc tạo ra các ứng dụng và nó không thực sự hoạt động tốt với nó. + +608 +00:47:13,520 --> 00:47:19,250 +Tôi nghĩ rằng nó hoạt động tốt hơn khi bạn thực sự có thể xây dựng các dự án thực tế, chẳng hạn như các dự án lớn mà bạn có thể trình + +609 +00:47:19,250 --> 00:47:20,640 +diễn và bạn có thể sử dụng. + +610 +00:47:20,660 --> 00:47:23,090 +Tôi nghĩ đó chỉ là một định dạng tốt hơn. + +611 +00:47:23,090 --> 00:47:26,840 +Giống như không có việc nào chúng ta làm là ngẫu nhiên. + +612 +00:47:26,840 --> 00:47:29,540 +Giống như tôi dành nhiều thời gian để suy nghĩ về nó. + +613 +00:47:31,770 --> 00:47:32,240 +Được chứ. + +614 +00:47:32,280 --> 00:47:34,410 +Bạn thích loại trò chơi nào hơn? + +615 +00:47:34,440 --> 00:47:36,930 +Máy tính chém android. + +616 +00:47:38,490 --> 00:47:39,150 +Trời ơi. + +617 +00:47:39,420 --> 00:47:44,430 +Gần đây tôi đã tham gia trò chơi hơi nước này có tên là Salt and Sanctuary. + +618 +00:47:44,940 --> 00:47:48,600 +Đó là một co-op hai người chơi đi văng, và nó rất tốt. + +619 +00:47:48,600 --> 00:47:56,250 +Nó giống như nó có, giống như, các yếu tố RPG, nó có nền tảng, nó có một số chiến đấu, và nó, giống như, + +620 +00:47:56,250 --> 00:47:58,290 +chỉ là rất nhiều yếu tố. + +621 +00:47:58,290 --> 00:47:59,610 +Nó giống như, thực sự toàn diện. + +622 +00:47:59,610 --> 00:48:04,920 +Và tôi phát hiện ra rằng nó thực sự được tạo ra bởi một người giống như vậy, về cơ bản, anh ta đã xây dựng toàn bộ trò + +623 +00:48:04,920 --> 00:48:06,390 +chơi điện tử, điều này thật điên rồ. + +624 +00:48:06,390 --> 00:48:07,350 +Đó là một trong những thực sự tốt. + +625 +00:48:07,680 --> 00:48:09,990 +Và trên Android, trên điện thoại. + +626 +00:48:11,130 --> 00:48:15,630 +Vâng, trong số chúng ta, sẽ hơi tiếc nếu bạn chưa chơi nó. + +627 +00:48:16,260 --> 00:48:17,430 +Đừng bắt đầu. + +628 +00:48:19,660 --> 00:48:23,640 +Được rồi, vậy chúng ta còn thấy gì khác trong cuộc trò chuyện? + +629 +00:48:23,670 --> 00:48:26,100 +Bạn có ý định xây dựng một khóa học Java không? + +630 +00:48:26,700 --> 00:48:27,960 +Chắc là không. + +631 +00:48:29,100 --> 00:48:32,460 +Tôi không thực sự thích Java cho lắm. + +632 +00:48:33,330 --> 00:48:37,830 +Tôi cảm thấy như Oracle sẽ muốn gửi cho tôi một vụ kiện chỉ vì nói từ Java. + +633 +00:48:38,280 --> 00:48:44,700 +Vì vậy, câu chuyện hài hước là chúng tôi rõ ràng có giống như một khóa học Android và các khóa học Android được xây dựng bằng Java. + +634 +00:48:44,700 --> 00:48:48,540 +Vì vậy, chúng tôi nghĩ rằng sẽ là một ý tưởng hay nếu đặt biểu tượng Java trên hình ảnh của khóa học. + +635 +00:48:48,750 --> 00:48:55,350 +Và sau đó chúng tôi nhận được điều này giống như một bức thư thực sự nghiêm túc từ Oracle nói rằng, Vâng, bạn sẽ gỡ bỏ + +636 +00:48:55,350 --> 00:48:58,350 +logo của chúng tôi vì bạn không sở hữu logo cho Java. + +637 +00:48:58,470 --> 00:49:03,000 +Và chúng tôi đã nói, Này anh bạn, chúng tôi đang cố gắng dạy công nghệ của bạn cho mọi người. + +638 +00:49:03,000 --> 00:49:07,210 +Giống như, chúng tôi đang cố gắng dạy cho nhiều người Java hơn mà bạn sở hữu, nhưng họ giống như vậy, Không. + +639 +00:49:07,230 --> 00:49:12,630 +Vì vậy, tôi nghĩ chúng hơi già ở mặt trận đó. + +640 +00:49:13,680 --> 00:49:16,860 +Để xem, các bạn còn có những tin nhắn nào nữa không? + +641 +00:49:20,070 --> 00:49:23,700 +Tôi đang hoàn thành khóa học viết mã 100 ngày với ông của tôi. + +642 +00:49:23,730 --> 00:49:24,720 +Ồ. + +643 +00:49:24,750 --> 00:49:26,170 +Thật đáng kinh ngạc. + +644 +00:49:26,190 --> 00:49:31,590 +Tôi đã nghe nói về những người hoàn thành nó với, chẳng hạn như, con cái của họ, như những đứa trẻ 10 tuổi hoặc 11 tuổi. + +645 +00:49:31,830 --> 00:49:33,450 +Nhưng điều đó khá tuyệt vời. + +646 +00:49:33,750 --> 00:49:35,690 +Bạn biết đấy, đây là một điểm tốt khác. + +647 +00:49:35,700 --> 00:49:43,410 +Bạn của tôi gần đây đã kể cho tôi câu chuyện rằng họ làm việc tại một ngân hàng và anh ấy đã nói rằng làm + +648 +00:49:43,410 --> 00:49:52,110 +thế nào họ có một người đàn ông giống như cha đỡ đầu của mã nền tảng của họ và không ai khác có thể thích sửa chữa nó + +649 +00:49:52,110 --> 00:49:53,190 +ngoài anh ta. + +650 +00:49:53,730 --> 00:49:57,240 +Và tôi thực sự tò mò, bạn biết không? + +651 +00:49:57,240 --> 00:50:05,670 +Và một ngày nọ, đại tá mã công ty tài chính đến và anh ta giống như một cây gậy chống. + +652 +00:50:05,670 --> 00:50:09,780 +Anh ấy giống như 69 tuổi hoặc gì đó, và anh ấy giống như thực sự già. + +653 +00:50:09,780 --> 00:50:11,250 +Anh ấy giống như những cái đầu bạc trắng. + +654 +00:50:11,370 --> 00:50:20,850 +Và nó chỉ ra rằng toàn bộ hệ thống của họ được xây dựng trên khá nhiều thứ, bạn biết đấy, giống như một công nghệ thực sự + +655 +00:50:20,850 --> 00:50:22,170 +cũ, đúng không? + +656 +00:50:22,170 --> 00:50:29,250 +Và đây giống như người duy nhất thực sự hiểu cách làm điều đó, bạn biết đấy, những loại ngôn ngữ lập + +657 +00:50:29,250 --> 00:50:35,250 +trình cũ như COBOL hay Fortran, bởi vì thực tế không có nhiều người biết và nó cực + +658 +00:50:35,250 --> 00:50:36,210 +kỳ khó. + +659 +00:50:36,210 --> 00:50:38,130 +Giống như nếu bạn đã thử học. + +660 +00:50:38,130 --> 00:50:42,620 +C Và bạn nghĩ điều đó khó như thử học Fortran, nó còn khó hơn. + +661 +00:50:42,630 --> 00:50:49,590 +Tôi đoán là cũng có một mã máy, nhưng bạn biết đấy, cũng có một điểm cần phải làm là có lẽ ai đó nên + +662 +00:50:49,590 --> 00:50:54,900 +dạy như những ngôn ngữ cũ này vì rõ ràng cũng có một số tương lai trong đó. + +663 +00:50:54,990 --> 00:51:00,330 +Giống như tất cả các ngân hàng trong ngành hàng không, tất cả chúng đều được xây dựng trên COBOL, điều này thật điên rồ. + +664 +00:51:01,800 --> 00:51:05,250 +Những cuốn sách hay nhất mà bạn đã đọc trong năm nay là gì? + +665 +00:51:07,180 --> 00:51:08,200 +Những cuốn sách hay nhất. + +666 +00:51:08,320 --> 00:51:17,430 +Ồ, có một cuốn sách thực sự hay về đàm phán của Chris Voss, và anh ấy giống như một nhà đàm phán cũ của FBI, giống như + +667 +00:51:17,440 --> 00:51:21,070 +đàm phán về việc thả con tin và mọi thứ. + +668 +00:51:21,490 --> 00:51:25,960 +Và anh ấy đã viết cuốn sách này có tên Ồ, anh bạn, nó được gọi là gì? + +669 +00:51:25,990 --> 00:51:27,040 +Một cái gì đó về như. + +670 +00:51:29,390 --> 00:51:30,770 +Không bao giờ chia nhỏ sự khác biệt. + +671 +00:51:30,770 --> 00:51:31,400 +Đó là nó. + +672 +00:51:32,240 --> 00:51:37,790 +Vì vậy, về cơ bản anh ấy chỉ dạy bạn cách thương lượng, như nếu bạn muốn mua một chiếc xe cũ, làm thế nào để đạt + +673 +00:51:37,790 --> 00:51:38,860 +được thỏa thuận tốt nhất. + +674 +00:51:38,870 --> 00:51:44,960 +Nhưng sử dụng tất cả những kỹ năng mà anh ta có được như FBI, đó là điều hoàn toàn điên rồ. + +675 +00:51:45,080 --> 00:51:46,340 +Đó là một cuốn sách thực sự tốt. + +676 +00:51:48,080 --> 00:51:49,670 +Được rồi, vậy chúng ta còn gì nữa? + +677 +00:51:50,980 --> 00:51:55,120 +Java, C ++ hoặc Python, là những thứ mạnh nhất. + +678 +00:51:55,120 --> 00:51:55,780 +Ý tôi là, cái gì? + +679 +00:51:55,960 --> 00:51:57,250 +Bạn đang cố gắng thích điều gì? + +680 +00:51:57,730 --> 00:51:59,170 +Bạn thích những chiến binh đường phố. + +681 +00:52:00,160 --> 00:52:03,540 +Bạn biết làm thế nào trên YouTube có tất cả những video như thế này, thích, gấu không? + +682 +00:52:03,580 --> 00:52:04,690 +Đây là Cobra. + +683 +00:52:06,280 --> 00:52:11,680 +Tôi nghĩ ai đó nên tạo một video trên YouTube, nơi nó giống như lập trình viên Java so với chương trình Python. + +684 +00:52:12,910 --> 00:52:13,480 +Tôi không biết. + +685 +00:52:13,480 --> 00:52:15,480 +Tôi không nghĩ rằng bất kỳ ai trong số họ mạnh hơn. + +686 +00:52:15,490 --> 00:52:17,220 +Tôi nghĩ rằng chúng có công dụng riêng của chúng. + +687 +00:52:17,230 --> 00:52:22,030 +Nó giống như kiểu nói, bạn biết đấy, búa đối đầu với người sẽ thắng. + +688 +00:52:22,460 --> 00:52:25,030 +Không thực sự có quá nhiều ý nghĩa. + +689 +00:52:27,140 --> 00:52:28,190 +Những gì chúng ta đã có? + +690 +00:52:31,330 --> 00:52:35,950 +Phát triển web hoặc phát triển phần mềm, bạn thích cái nào hơn? + +691 +00:52:35,980 --> 00:52:37,360 +Ồ, đó là một điều thực sự khó. + +692 +00:52:38,300 --> 00:52:41,120 +Tôi thích. + +693 +00:52:41,120 --> 00:52:42,770 +Tôi thích cả hai, thực sự. + +694 +00:52:43,190 --> 00:52:43,580 +Tôi không biết. + +695 +00:52:43,580 --> 00:52:46,010 +Tôi không có cảm giác mạnh mẽ đối với nó. + +696 +00:52:46,220 --> 00:52:46,980 +Ý tôi là, được rồi. + +697 +00:52:47,000 --> 00:52:50,030 +Vì vậy, anh ấy có một chút bí mật. + +698 +00:52:50,030 --> 00:52:53,090 +Tôi không thực sự thích JavaScript cho lắm. + +699 +00:52:53,750 --> 00:53:00,410 +Tôi nghĩ nếu bạn là người đã chơi với rất nhiều ngôn ngữ mới hơn đã được phát triển gần đây + +700 +00:53:00,440 --> 00:53:05,420 +hơn là một ngôn ngữ chỉ có những thứ mới được bắt đầu, như JavaScript. + +701 +00:53:05,810 --> 00:53:07,340 +Bạn nhận ra nó thật tốt đẹp làm sao. + +702 +00:53:07,340 --> 00:53:10,250 +Giống như Swift rất đáng yêu, Kotlin cũng tốt. + +703 +00:53:10,250 --> 00:53:19,310 +Dart như thể tất cả chúng đều là ngôn ngữ thực sự đẹp, python nhưng JavaScript nhưng phát triển web bạn có thể làm với + +704 +00:53:19,310 --> 00:53:20,660 +Python với JavaScript. + +705 +00:53:20,690 --> 00:53:23,690 +Đó thực sự là lựa chọn của bạn trong những ngày này với rất nhiều khuôn khổ. + +706 +00:53:26,060 --> 00:53:27,140 +Chúng ta có gì khác? + +707 +00:53:28,460 --> 00:53:32,960 +Bạn có thể nói gì đó về thiết kế UI UX không? + +708 +00:53:34,010 --> 00:53:35,710 +Thiết kế UI UX. + +709 +00:53:36,650 --> 00:53:38,620 +Nó thực sự quan trọng. + +710 +00:53:39,620 --> 00:53:41,140 +Ồ, đây là một mẹo hay. + +711 +00:53:41,150 --> 00:53:44,780 +Cuối cùng thì đừng nghĩ về bạn trên UX. + +712 +00:53:46,520 --> 00:53:49,640 +Một người bạn của tôi là một nhà thiết kế UX và cô ấy thực sự rất giỏi. + +713 +00:53:49,640 --> 00:53:53,680 +Nhưng như cô ấy nói, dù điều gì xảy ra cũng vậy, cuối cùng thì các công ty sẽ đưa cô ấy vào. + +714 +00:53:53,690 --> 00:53:57,020 +Họ giống như, Ồ, rắc bạn như bụi ma thuật UX. + +715 +00:53:57,020 --> 00:53:58,210 +Và nó giống như, Không, điều đó không hoạt động. + +716 +00:53:58,220 --> 00:54:00,440 +Bạn phải bắt đầu lại từ đầu. + +717 +00:54:00,590 --> 00:54:03,230 +Vì vậy, siêu quan trọng. + +718 +00:54:04,430 --> 00:54:06,590 +Giống như đọc thêm về nó. + +719 +00:54:06,710 --> 00:54:08,640 +Hãy thử vô số ứng dụng. + +720 +00:54:08,660 --> 00:54:13,190 +Tôi biết rằng ngày nay mọi người giống như chỉ có bảy ứng dụng trên điện thoại của họ và họ không thực sự thêm + +721 +00:54:13,190 --> 00:54:14,450 +bất kỳ ứng dụng nào khác. + +722 +00:54:14,690 --> 00:54:21,650 +Nhưng hãy thử các ứng dụng, thử trải nghiệm người dùng đó và sau đó chỉ cần ghi chú lại những ứng dụng mà bạn thực + +723 +00:54:21,650 --> 00:54:22,220 +sự thích. + +724 +00:54:22,520 --> 00:54:30,290 +Giống như gần đây ở Anh, có một công ty khởi nghiệp ngân hàng tên là Monzo, và khi bạn nhận được thẻ ngân hàng của họ qua đường + +725 +00:54:30,290 --> 00:54:33,170 +bưu điện, tức là khi bạn đang thiết lập nó. + +726 +00:54:33,260 --> 00:54:38,390 +Vì vậy, khi bạn đang làm điều đó với một ngân hàng bình thường, như HSBC hay bất cứ điều gì, bạn + +727 +00:54:38,390 --> 00:54:40,040 +phải gọi dịch vụ khách hàng. + +728 +00:54:40,040 --> 00:54:44,270 +Bạn phải đi vào chi nhánh, họ gõ một số thứ, bạn điền vào một số biểu mẫu. + +729 +00:54:44,480 --> 00:54:46,130 +Thẻ Monzo này đã đến. + +730 +00:54:46,580 --> 00:54:52,850 +Tôi đã phải tải xuống ứng dụng Monzo và sau đó nó giống như sử dụng cảm ứng NFC vào điện thoại, và sau đó nó giống như là, + +731 +00:54:52,850 --> 00:54:54,260 +tất cả đã được thiết lập. + +732 +00:54:55,140 --> 00:54:56,210 +Điều đó thật tuyệt vời. + +733 +00:54:56,220 --> 00:54:58,110 +Đó là trải nghiệm tốt. + +734 +00:54:58,110 --> 00:54:59,820 +Đó là một số chúng tôi tuyệt vời. + +735 +00:55:02,550 --> 00:55:09,960 +Câu hỏi cuối cùng tôi sẽ trả lời Tôi sẽ chọn câu hỏi cuối cùng trước khi chúng ta bắt đầu. + +736 +00:55:09,960 --> 00:55:11,280 +Hãy xem, + +737 +00:55:14,460 --> 00:55:17,720 +câu hỏi cuối cùng là gì? + +738 +00:55:17,730 --> 00:55:19,110 +Ôi, khó quá. + +739 +00:55:22,180 --> 00:55:23,140 +La la, la. + +740 +00:55:27,170 --> 00:55:27,580 +Được chứ. + +741 +00:55:27,620 --> 00:55:33,420 +Tôi sẽ chọn bạn vì tôi thấy bạn trong phần Hỏi & Đáp luôn làm 100 ngày Python. + +742 +00:55:33,440 --> 00:55:37,820 +Matea, bạn thực sự rất, rất mạnh mẽ về động lực. + +743 +00:55:37,820 --> 00:55:42,530 +Vậy câu hỏi của bạn là bạn định giá phần mềm như thế nào? + +744 +00:55:42,560 --> 00:55:44,210 +Giống như cách bạn định giá phần mềm như thế nào? + +745 +00:55:44,210 --> 00:55:45,770 +Tôi nghĩ đó là những gì bạn muốn nói. + +746 +00:55:48,020 --> 00:55:53,450 +Ý tôi là, về mặt lý thuyết, những gì mọi người nói là định giá phần mềm của bạn ở mức giá mà mọi người sẵn + +747 +00:55:53,450 --> 00:55:54,380 +sàng trả cho nó. + +748 +00:55:54,800 --> 00:56:03,530 +Nhưng ý tôi là, tôi không thực sự là người thích hợp để hỏi vì tôi không thực sự thích làm tiếp thị hoặc thực sự + +749 +00:56:03,530 --> 00:56:04,670 +thích bán hàng. + +750 +00:56:04,670 --> 00:56:08,150 +Tôi chỉ không thích khi tôi thực hiện các khóa học của mình. + +751 +00:56:08,150 --> 00:56:12,290 +Tôi nghĩ nếu đó là thứ mà mọi người muốn, thì họ sẽ có được nó. + +752 +00:56:12,290 --> 00:56:16,280 +Thích, tôi không muốn thích. + +753 +00:56:16,980 --> 00:56:21,200 +Tôi không muốn, giống như, nói với mọi người mua thứ gì đó mà họ không cần hoặc họ không muốn. + +754 +00:56:21,210 --> 00:56:28,800 +Bạn biết đấy, giống như tôi nghĩ nhóm tiếp thị muốn tôi thực hiện AMA này để chúng tôi có thể quảng bá khóa học + +755 +00:56:28,800 --> 00:56:30,210 +Python 100 ngày mới. + +756 +00:56:30,210 --> 00:56:34,140 +Nhưng họ sẽ ghét tôi vì tôi chưa làm điều đó, và tôi không định làm vậy. + +757 +00:56:34,560 --> 00:56:36,450 +Vâng, ý tôi là, hãy kiểm tra nó. + +758 +00:56:36,450 --> 00:56:37,920 +Nó nằm trong phần mô tả bên dưới. + +759 +00:56:38,610 --> 00:56:44,820 +Nếu bạn muốn tham gia khóa học Python 100 ngày, bạn có thể nhận được nó với bất kỳ mức giá nào ở đó. + +760 +00:56:45,150 --> 00:56:45,840 +Nhưng mà. + +761 +00:56:47,340 --> 00:56:53,520 +Bạn biết đấy, tôi nghĩ bạn nên định giá sản phẩm của mình tùy thuộc vào độ hấp dẫn của nó. + +762 +00:56:53,520 --> 00:57:00,030 +Vì vậy, nếu đó là thứ gì đó có sức hấp dẫn đại chúng, thì bạn biết đấy, bạn có thể đủ khả năng để làm cho + +763 +00:57:00,030 --> 00:57:04,340 +nó rẻ hơn một chút nếu đó là thứ mà chỉ có rất ít người quan tâm. + +764 +00:57:04,350 --> 00:57:11,070 +Chẳng hạn như, nếu ngày mai tôi muốn xây dựng một phần mềm cho những người đang phát trực + +765 +00:57:11,070 --> 00:57:15,510 +tiếp trên YouTube để họ có thể chơi nhạc như một DJ. + +766 +00:57:15,540 --> 00:57:17,520 +Giống như tôi không biết có bao nhiêu người quan tâm đến nó. + +767 +00:57:17,520 --> 00:57:18,390 +Có lẽ rất nhiều thực sự. + +768 +00:57:18,390 --> 00:57:19,020 +Tôi không biết. + +769 +00:57:19,230 --> 00:57:23,880 +Nhưng nếu đó là thứ thực sự thích hợp, thì bạn phải định giá nó nhiều hơn bởi vì bạn biết đấy, hãy cân + +770 +00:57:23,880 --> 00:57:25,920 +nhắc lượng thời gian mà nó cần để phát triển. + +771 +00:57:26,430 --> 00:57:37,080 +Nhưng ý tôi là, một ví dụ điển hình là nhóm của chúng tôi đã suy nghĩ rất kỹ về cách chúng tôi định giá các khóa học của mình. + +772 +00:57:37,080 --> 00:57:42,870 +Và một trong những điều mà chúng tôi đã nghĩ đến là điều đó. + +773 +00:57:43,620 --> 00:57:51,120 +Bạn biết đấy, nếu chúng ta có đủ khả năng để làm cho nó rẻ hơn chúng ta sẽ làm, bởi vì, vâng, mọi người sẽ mua nó với giá + +774 +00:57:51,120 --> 00:57:52,080 +200 đô la. + +775 +00:57:52,080 --> 00:57:57,270 +Và vâng, bạn biết đấy, sáu người đã làm việc trong dự án này trong gần hai năm. + +776 +00:57:57,270 --> 00:58:02,870 +Và họ, bạn biết đấy, họ nên tạo ra một sản phẩm có giá trị lớn. + +777 +00:58:02,880 --> 00:58:11,280 +Nhưng đồng thời, bạn biết đấy, giống như rất nhiều người trên thế giới có hoàn cảnh sống rất khác nhau. + +778 +00:58:11,280 --> 00:58:15,600 +Tôi biết rằng tôi đã sống ở Malawi một thời gian ở Châu Phi. + +779 +00:58:15,600 --> 00:58:22,290 +Và, bạn biết đấy, tôi biết giống như ở các ngôi làng, và bạn biết đấy, người ta không có nhiều. + +780 +00:58:22,560 --> 00:58:27,750 +Vì vậy, những gì bạn có thể nghĩ là nhiều là những gì bạn có thể nghĩ là một ít thực ra là rất nhiều đối với một số người + +781 +00:58:27,750 --> 00:58:28,050 +khác. + +782 +00:58:28,050 --> 00:58:33,660 +Vì vậy, chúng tôi thực sự muốn có thể đưa ra những lựa chọn mà bất kỳ ai cũng có thể mua được. + +783 +00:58:34,800 --> 00:58:39,390 +Vì vậy, tôi chỉ nói, bạn biết đấy, thực sự phụ thuộc vào bạn. + +784 +00:58:40,620 --> 00:58:48,270 +Vì vậy, tôi nghĩ đây sẽ là câu hỏi cuối cùng, trừ khi có điều gì đó thú vị ở đây. + +785 +00:58:48,300 --> 00:58:51,210 +Tôi có thể làm việc vào Ngày thu nhập cao hơn không? + +786 +00:58:52,440 --> 00:58:56,880 +Ý tôi là, có COVID, nhưng cũng có những vị trí từ xa. + +787 +00:58:57,480 --> 00:59:00,510 +Chúng tôi đang nghĩ đến việc có thể thuê một số thực tập sinh vào một thời điểm nào đó. + +788 +00:59:02,040 --> 00:59:04,510 +Nhưng tôi không thực sự biết nó sẽ hoạt động như thế nào. + +789 +00:59:04,530 --> 00:59:07,310 +Có lẽ chúng tôi sẽ công bố nó, giống như một thông báo giáo dục. + +790 +00:59:07,320 --> 00:59:09,990 +Tôi không biết, nhưng chúng tôi sẽ nghĩ về điều đó. + +791 +00:59:10,410 --> 00:59:10,770 +Được rồi. + +792 +00:59:10,770 --> 00:59:17,040 +Vì vậy, bây giờ là cách, thời gian đã qua và bụng của tôi đang ầm ầm. + +793 +00:59:17,490 --> 00:59:18,510 +Bạn biết làm thế nào nó được. + +794 +00:59:19,650 --> 00:59:25,890 +Cô gái đang đói, vì vậy tôi có thể sẽ ký tắt và. + +795 +00:59:26,730 --> 00:59:28,660 +Vì vậy, cảm ơn, các bạn. + +796 +00:59:28,680 --> 00:59:33,810 +Tất cả 1000 bạn trở lên đã tham gia luồng trực tiếp hôm nay. + +797 +00:59:33,810 --> 00:59:45,330 +Và tôi hy vọng bạn sẽ tiếp tục viết mã và tôi hy vọng bạn sẽ thành công trên thế giới từ người hướng dẫn của + +798 +00:59:45,330 --> 00:59:46,320 +bạn, Angela. + +799 +00:59:46,620 --> 00:59:47,220 +Chúc ngủ ngon. + +800 +00:59:47,250 --> 00:59:48,120 +Buổi sáng tốt lành. + +801 +00:59:48,120 --> 00:59:49,350 +Dù bạn đang ở đâu. + +802 +00:59:50,410 --> 00:59:51,220 +Qua. + diff --git a/part4/101 - Final Stretch/002 Study With Me.mp4 b/part4/101 - Final Stretch/002 Study With Me.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7219de62f6f8afc1ffdd2f98f93f214480e2886e --- /dev/null +++ b/part4/101 - Final Stretch/002 Study With Me.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06536b2b46f55eec93bc2d256454d175097a1d1776e39fd7c6f57aad35ad9fc9 +size 4027669404 diff --git a/part4/101 - Final Stretch/003 Bonus Lecture Check out my other courses.html b/part4/101 - Final Stretch/003 Bonus Lecture Check out my other courses.html new file mode 100644 index 0000000000000000000000000000000000000000..13107c241923b7ebb8ec65afa6ef745b7f9795a9 --- /dev/null +++ b/part4/101 - Final Stretch/003 Bonus Lecture Check out my other courses.html @@ -0,0 +1,4 @@ +

Learn iOS Development

+             

Learn Cross-Platform App Development with Flutter

             

Learn Full-Stack Web Development

+             

Learn Data Science and Machine Learning          

+             

Learn Crowdfunding

\ No newline at end of file diff --git "a/part4/101 - Final Stretch/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" "b/part4/101 - Final Stretch/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" new file mode 100644 index 0000000000000000000000000000000000000000..92f6e72357f936d07dff5ac8aee29e545e4c11d3 --- /dev/null +++ "b/part4/101 - Final Stretch/Ca\314\201ch Xem \304\220o\314\243\314\202 Pha\314\202n Gia\314\211i Cao Ma\314\200 ko Ca\314\202\314\200n ta\314\211i ve\314\202\314\200.txt" @@ -0,0 +1,6 @@ +Do là mình up quá nhiều file nên thằng google drive nó giảm độ phân giải về 360 nên ae xem trên gg drive sẽ rất khó chịu và mờ , Nhìn Đống Video Này Mà Tải về Thì khá là nặng nên mình sẽ chia sẻ cho ae cách xem video trên gg drive độ phân giải cao không lag mà vẫn mượt mà nhé ! + +link hướng dẫn : https://tainguyenmienphi.com/huong-dan-cach-xem-video-tren-gg-drive/ + +Nhóm FB:https://www.facebook.com/groups/1105106193836548 +Nhóm account Tele: https://t.me/EduTecHackVN \ No newline at end of file diff --git "a/part4/101 - Final Stretch/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" "b/part4/101 - Final Stretch/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" new file mode 100644 index 0000000000000000000000000000000000000000..bbbf5155676f390f80d69ae9563c705d64398c70 --- /dev/null +++ "b/part4/101 - Final Stretch/download kho\314\201a ho\314\243c ta\314\243i tainguyenmienphi.com.txt" @@ -0,0 +1 @@ +tải khóa học tại tainguyenmienphi.com \ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/001 Day 79 Goals what you will make by the end of the day.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/001 Day 79 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..1a9f6a9ae96302e1f20e4e16536bfa72733a6fe3 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/001 Day 79 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Today we're going to analyse a dataset on the past winners of the Nobel Prize. Let's see what patterns we can uncover in the past Nobel laureates and what can we learn about the Nobel prize and our world more generally.

On November 27, 1895, Alfred Nobel signed his last will in Paris. When it was opened after his death, the will caused a lot of controversy, as Nobel had left much of his wealth for the establishment of a prize. Alfred Nobel dictates that his entire remaining estate should be used to endow prizes to those who, during the preceding year, have conferred the greatest benefit to humankind. Every year the Nobel Prize is given to scientists and scholars in the categories chemistry, literature, physics, physiology or medicine, economics, and peace.


This project will bring a lot of the tools and techniques that we've covered previously together. While we will review many concepts that we've covered in the previous days, you'll also learn a lot of new things.


Today you'll learn:


Download and add the Notebook to Google Drive

As usual, download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook.


Add the Data to the Notebook

The .zip file also includes a .csv file called nobel_prize_data. This is the data for the project. Add this file to your notebook.






\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/001 Nobel-Prize-Analysis-Start.zip b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/001 Nobel-Prize-Analysis-Start.zip new file mode 100644 index 0000000000000000000000000000000000000000..b60d36f636f69119a56506633b6a1f1c9420f794 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/001 Nobel-Prize-Analysis-Start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ff725412963afaab84ec46956977de9a3afeb43ba32ae58d1158012b7e77510 +size 70490 diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/002 Update Packages in Google Colab & Explore and Clean the Dataset.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/002 Update Packages in Google Colab & Explore and Clean the Dataset.html new file mode 100644 index 0000000000000000000000000000000000000000..60fb61165647f64d0df1074c5e2ed1204de935b5 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/002 Update Packages in Google Colab & Explore and Clean the Dataset.html @@ -0,0 +1,7 @@ +

Using Google Colab? -> Upgrade plotly

Google Colab comes with a lot of Python packages pre-installed and working. However, you can also install new packages as well as upgrade existing packages. In our case, the plotly package is outdated and will cause a problem with our starburst chart. Here's how to updated a package in Google Colab:

Uncomment the cell with the pip install command. Run the cell. And then comment the code out again.


Challenge 1

Preliminary data exploration.

Challenge 2

Challenge 3


.

.

..

...

..

.

.


Solution 1: Preliminary Data Exploration

When we run df_data.shape, df_data.tail(), and df_data.head(), we see that there are 962 rows and 16 columns. The first Nobel prizes were awarded in 1901 and the data goes up to 2020.

We notice that the columns contain the following information:

birth_date: date in string format

motivation: description of what the prize is for

prize_share: given as a fraction

laureate_type: individual or organisation

birth_country: has countries that no longer exist

birth_country_current: current name of the country where the birth city is located

ISO: three-letter international country code

organization_name: research institution where the discovery was made

organization_city: location of the institution


Solution 2: NaN values

There are no duplicates in the dataset:

print(f'Any duplicates? {df_data.duplicated().values.any()}')

However, there are a number of NaN values

print(f'Any NaN values among the data? {df_data.isna().values.any()}')

We can get a count of the NaN values per column using

df_data.isna().sum()

Why are there so many NaN values for the birth date? And why are there so many missing values among the organisation columns?

Filtering on the NaN values in the birth date column we see that we get back a bunch of organisations, like the UN or the Red Cross.

col_subset = ['year','category', 'laureate_type',
+              'birth_date','full_name', 'organization_name']
+df_data.loc[df_data.birth_date.isna()][col_subset]

That makes sense. We also see that since the organisation's name is in the full_name column, the organisation_name column contains NaN.

In addition, when we look at for rows where the organization_name column has no value, we also see that many prizes went to people who were not affiliated with a university or research institute. This includes many of the Literature and Peace prize winners.

col_subset = ['year','category', 'laureate_type','full_name', 'organization_name']
+df_data.loc[df_data.organization_name.isna()][col_subset]


Solution 3: Type Conversions

We can use pandas to convert the birth_date to a Datetime object with a single line:

df_data.birth_date = pd.to_datetime(df_data.birth_date)

Adding a column that contains the percentage share as first requires that we split the string on the forward slash. Then we can convert to a number. And finally, we can do the division.

separated_values = df_data.prize_share.str.split('/', expand=True)
+numerator = pd.to_numeric(separated_values[0])
+denomenator = pd.to_numeric(separated_values[1])
+df_data['share_pct'] = numerator / denomenator

Now we can check if our type conversions were successful:

\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/003 plotly Bar & Donut Charts Analyse Prize Categories & Women Winning Prizes.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/003 plotly Bar & Donut Charts Analyse Prize Categories & Women Winning Prizes.html new file mode 100644 index 0000000000000000000000000000000000000000..8777e252d3bf936f321ad1fddf3a10cca5ab26ba --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/003 plotly Bar & Donut Charts Analyse Prize Categories & Women Winning Prizes.html @@ -0,0 +1,34 @@ +

Challenge 1: Come up with 3 Questions

A big part of data science is coming up with questions that you'd like to explore. This is the most difficult aspect to teach in a tutorial because it's completely open-ended and requires some creativity. Often times you will be asking questions of the data, that it actually cannot answer - and that's ok. That's all part of the process of discovery.

Pause here for a moment and think about the kind of data you saw in the columns. Write down at least 3 questions that you'd like to explore as part of this analysis. For example, your question might go like: "What percentage of the Nobel laureates were women?" or "How many prizes were given out in each category". Practice coming up with a few of your own questions.

In the upcoming lessons, you might find that we will write the code to answer some of your questions. And if not, your questions make for a great exercise to take this analysis even further.


The challenges below are all based on questions we're going to ask the data:


Challenge 2

Create a donut chart using plotly which shows how many prizes went to men compared to how many prizes went to women. What percentage of all the prizes went to women?


Challenge 3


Challenge 4

Did some people get a Nobel Prize more than once? If so, who were they?


Challenge 5


Challenge 6


Challenge 7

Create a plotly bar chart that shows the split between men and women by category.



.

.

..

...

..

.

.



Solution 2: Creating a Donut Chart with Plotly

To create the chart we use the our .value_counts() method together with plotly's .pie() function. We see that out of all the Nobel laureates since 1901, only about 6.2% were women.

biology = df_data.sex.value_counts()
+fig = px.pie(labels=biology.index, 
+             values=biology.values,
+             title="Percentage of Male vs. Female Winners",
+             names=biology.index,
+             hole=0.4,)
+
+fig.update_traces(textposition='inside', textfont_size=15, textinfo='percent')
+
+fig.show()

Solution 3: The first 3 women to win

Even without looking at the data, you might have already guessed one of the famous names: Marie Curie.

df_data[df_data.sex == 'Female'].sort_values('year', ascending=True)[:3]


Solution 4: The Repeat Winners

Winning a Nobel prize is quite an achievement. However, some folks have actually won the prize multiple times. To find them, we can use many different approaches. One approach is to look for duplicates in the full_name column:

is_winner = df_data.duplicated(subset=['full_name'], keep=False)
+multiple_winners = df_data[is_winner]
+print(f'There are {multiple_winners.full_name.nunique()}' \
+      ' winners who were awarded the prize more than once.')

There are 6 winners who were awarded the prize more than once.

col_subset = ['year', 'category', 'laureate_type', 'full_name']
+multiple_winners[col_subset]

Only 4 of the repeat laureates were individuals.

We see that Marie Curie actually got the Nobel prize twice - once in physics and once in chemistry. Linus Carl Pauling got it first in chemistry and later for peace given his work in promoting nuclear disarmament. Also, the International Red Cross was awarded the Peace prize a total of 3 times. The first two times were both during the devastating World Wars.


Solution 5: Number of Prizes per Category

To find the number of unique categories in a column we can use:

df_data.category.nunique()

To generate the vertical plotly bar chart, we again use .value_counts():

prizes_per_category = df_data.category.value_counts()
+v_bar = px.bar(
+        x = prizes_per_category.index,
+        y = prizes_per_category.values,
+        color = prizes_per_category.values,
+        color_continuous_scale='Aggrnyl',
+        title='Number of Prizes Awarded per Category')
+
+v_bar.update_layout(xaxis_title='Nobel Prize Category', 
+                    coloraxis_showscale=False,
+                    yaxis_title='Number of Prizes')
+v_bar.show()


Solution 6: The Economics Prize

The chart above begs the question: "Why are there so few prizes in the field of economics?". Looking at the first couple of winners in the economics category, we have our answer:

df_data[df_data.category == 'Economics'].sort_values('year')[:3]

The economics prize is much newer. It was first awarded in 1969, compared to 1901 for physics.


Solution 7: Male and Female Winners by Category

We already saw that overall, only 6.2% of Nobel prize winners were female. Does this vary by category?

cat_men_women = df_data.groupby(['category', 'sex'], 
+                               as_index=False).agg({'prize': pd.Series.count})
+cat_men_women.sort_values('prize', ascending=False, inplace=True)

We can combine .groupby() and .agg() with the .count() function. This way we can count the number of men and women by prize category.

We can then use .color the parameter in the .bar() function to mark the number of men and women on the chart:

v_bar_split = px.bar(x = cat_men_women.category,
+                     y = cat_men_women.prize,
+                     color = cat_men_women.sex,
+                     title='Number of Prizes Awarded per Category split by Men and Women')
+
+v_bar_split.update_layout(xaxis_title='Nobel Prize Category', 
+                          yaxis_title='Number of Prizes')
+v_bar_split.show()

We see that overall the imbalance is pretty large with physics, economics, and chemistry. Women are somewhat more represented in categories of Medicine, Literature and Peace. Splitting bar charts like this is an incredibly powerful way to show a more granular picture.



\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/004 Using Matplotlib to Visualise Trends over Time.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/004 Using Matplotlib to Visualise Trends over Time.html new file mode 100644 index 0000000000000000000000000000000000000000..a4429e7258c00848265cf30194bc8e5d2ad337a2 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/004 Using Matplotlib to Visualise Trends over Time.html @@ -0,0 +1,92 @@ +

Now let's look at how things have changed over time. This will give us a chance to review what we learnt about creating charts with two y-axes in Matplotlib and generating arrays with NumPy.

Challenge 1

Are more prizes awarded recently than when the prize was first created? Show the trend in awards visually.


Challenge 2

Investigate if more prizes are shared than before.



.

.

..

...

..

.

.



Solution 1: Number of Prizes Awarded over Time

First, we have to count the number of Nobel prizes that are awarded each year.

prize_per_year = df_data.groupby(by='year').count().prize 

This just involves grouping the data so that we can count the number of entries per year. To calculate the 5-year moving average we use .rolling() and .mean() like we did with the Google Trend data.

moving_average = prize_per_year.rolling(window=5).mean()

Now we can create a Matplotlib chart that superimposes the two:

plt.scatter(x=prize_per_year.index, 
+           y=prize_per_year.values, 
+           c='dodgerblue',
+           alpha=0.7,
+           s=100,)
+
+plt.plot(prize_per_year.index, 
+        moving_average.values, 
+        c='crimson', 
+        linewidth=3,)
+
+plt.show()

With the help of a little styling, this chart could look better. To create 5-year tick marks on the x-axis, we generate an array using NumPy:

np.arange(1900, 2021, step=5)

Then we tap into functions like the .figure(), the .title(), the .xticks(), and .yticks() to fine-tune the chart.

In addition, we will shortly be adding a second y-axis, so we can use an Axes object to draw our scatter and line plots.

plt.figure(figsize=(16,8), dpi=200)
+plt.title('Number of Nobel Prizes Awarded per Year', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(ticks=np.arange(1900, 2021, step=5), 
+           fontsize=14, 
+           rotation=45)
+
+ax = plt.gca() # get current axis
+ax.set_xlim(1900, 2020)
+
+ax.scatter(x=prize_per_year.index, 
+           y=prize_per_year.values, 
+           c='dodgerblue',
+           alpha=0.7,
+           s=100,)
+
+ax.plot(prize_per_year.index, 
+        moving_average.values, 
+        c='crimson', 
+        linewidth=3,)
+
+plt.show()


Solution 2: The Prize Share of Laureates over Time

Now we can work out the rolling average of the percentage share of the prize. If more prizes are given out, perhaps it is because the prize is split between more people.

yearly_avg_share = df_data.groupby(by='year').agg({'share_pct': pd.Series.mean})
+share_moving_average = yearly_avg_share.rolling(window=5).mean()

If more people get the prize, then the average share should go down, right? 

plt.figure(figsize=(16,8), dpi=200)
+plt.title('Number of Nobel Prizes Awarded per Year', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(ticks=np.arange(1900, 2021, step=5), 
+           fontsize=14, 
+           rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx() # create second y-axis
+ax1.set_xlim(1900, 2020)
+
+ax1.scatter(x=prize_per_year.index, 
+           y=prize_per_year.values, 
+           c='dodgerblue',
+           alpha=0.7,
+           s=100,)
+
+ax1.plot(prize_per_year.index, 
+        moving_average.values, 
+        c='crimson', 
+        linewidth=3,)
+
+# Adding prize share plot on second axis
+ax2.plot(prize_per_year.index, 
+        share_moving_average.values, 
+        c='grey', 
+        linewidth=3,)
+
+plt.show()

To see the relationship between the number of prizes and the laureate share even more clearly we can invert the second y-axis.

plt.figure(figsize=(16,8), dpi=200)
+plt.title('Number of Nobel Prizes Awarded per Year', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(ticks=np.arange(1900, 2021, step=5), 
+           fontsize=14, 
+           rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+ax1.set_xlim(1900, 2020)
+
+# Can invert axis
+ax2.invert_yaxis()
+
+ax1.scatter(x=prize_per_year.index, 
+           y=prize_per_year.values, 
+           c='dodgerblue',
+           alpha=0.7,
+           s=100,)
+
+ax1.plot(prize_per_year.index, 
+        moving_average.values, 
+        c='crimson', 
+        linewidth=3,)
+
+ax2.plot(prize_per_year.index, 
+        share_moving_average.values, 
+        c='grey', 
+        linewidth=3,)
+
+plt.show()

What do we see on the chart? Well, there is clearly an upward trend in the number of prizes being given out as more and more prizes are shared. Also, more prizes are being awarded from 1969 onwards because of the addition of the economics category. We also see that very few prizes were awarded during the first and second world wars. Note that instead of there being a zero entry for those years, we instead see the effect of the wards as missing blue dots.

\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/005 A Choropleth Map and the Countries with the Most Prizes.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/005 A Choropleth Map and the Countries with the Most Prizes.html new file mode 100644 index 0000000000000000000000000000000000000000..50e849e47a3deb9c1fc773be76077b4a22c05746 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/005 A Choropleth Map and the Countries with the Most Prizes.html @@ -0,0 +1,50 @@ +

For this next bit, we're going to compare which countries actually get the most prizes. And we're also going to look at in which categories those prizes are awarded. This has me feeling a little like I'm at the Olympics .


Challenge 1: Top 20 Country Ranking



Challenge 2: Choropleth Map

Hint: You'll need to use a 3 letter country code for each country.


Challenge 3: Country Bar Chart with Prize Category

See if you can divide up the plotly bar chart you created above to show the which categories made up the total number of prizes. Here's what you're aiming for:

The hard part is preparing the data for this chart!

Hint: Take a two-step approach. The first step is grouping the data by country and category. Then you can create a DataFrame that looks something like this:


Challenge 4: Prizes by Country over Time

Every country's fortunes wax and wane over time. Investigate how the total number of prizes awarded changed over the years.


.

.

..

...

..

.

.


Solution 1: Prize ranking by Country

Looking at our DataFrame there are actually 3 different columns to choose from for creating this ranking: birth_country, birth_country_current or organization_country. However, they each have certain problems and limitations.

If you look at the entries in the birth country, you'll see that some countries no longer exist! These include the Soviet Union or Czechoslovakia for example. Hence, using birth_country_current is better, since it has the country name which controls the city where the laureate was born. Now, notice that this does not determine the laureates' nationality since some globetrotting folks gave birth to their future Nobel laureate children while abroad. Also, people's nationalities can change as they emigrate and acquire different citizenship or get married and change citizenship. What this boils down to is that we will have to be clear about the assumptions that we will make in the upcoming analysis.

We can create the list of the top 20 countries like this:

top_countries = df_data.groupby(['birth_country_current'], 
+                                  as_index=False).agg({'prize': pd.Series.count})
+
+top_countries.sort_values(by='prize', inplace=True)
+top20_countries = top_countries[-20:]

Note that the ranking here determines how our bar chart will be displayed.

h_bar = px.bar(x=top20_countries.prize,
+               y=top20_countries.birth_country_current,
+               orientation='h',
+               color=top20_countries.prize,
+               color_continuous_scale='Viridis',
+               title='Top 20 Countries by Number of Prizes')
+
+h_bar.update_layout(xaxis_title='Number of Prizes', 
+                    yaxis_title='Country',
+                    coloraxis_showscale=False)
+h_bar.show()

The United States has a massive number of prizes by this measure. The UK and Germany are in second and third place respectively.


Solution 2: Displaying the Data on a Map

To show the above ranking on a colour coded map, we need to make use of the ISO codes.

df_countries = df_data.groupby(['birth_country_current', 'ISO'], 
+                               as_index=False).agg({'prize': pd.Series.count})
+df_countries.sort_values('prize', ascending=False)

This means we can use the ISO country codes for the locations parameter on the choropleth.

world_map = px.choropleth(df_countries,
+                          locations='ISO',
+                          color='prize', 
+                          hover_name='birth_country_current', 
+                          color_continuous_scale=px.colors.sequential.matter)
+
+world_map.update_layout(coloraxis_showscale=True,)
+
+world_map.show()

I love it how plotly allows you to zoom in and pan on the map it generates.


Solution 3: The category breakdown by country

Preparing our data to show the breakdown by category and country is challenging. We'll take a two-step approach here. First we count the prizes by category in each country:

cat_country = df_data.groupby(['birth_country_current', 'category'], 
+                               as_index=False).agg({'prize': pd.Series.count})
+cat_country.sort_values(by='prize', ascending=False, inplace=True)

Next, we can merge the DataFrame above with the top20_countries DataFrame that we created previously. That way we get the total number of prizes in a single column too. This is important since we want to control the order for our bar chart.

merged_df = pd.merge(cat_country, top20_countries, on='birth_country_current')
+# change column names
+merged_df.columns = ['birth_country_current', 'category', 'cat_prize', 'total_prize'] 
+merged_df.sort_values(by='total_prize', inplace=True)

Now we can create our bar chart again. This time we use the color parameter based on the category.

cat_cntry_bar = px.bar(x=merged_df.cat_prize,
+                       y=merged_df.birth_country_current,
+                       color=merged_df.category,
+                       orientation='h',
+                       title='Top 20 Countries by Number of Prizes and Category')
+
+cat_cntry_bar.update_layout(xaxis_title='Number of Prizes', 
+                            yaxis_title='Country')
+cat_cntry_bar.show()

Splitting the country bar chart by category allows us to get a very granular look at the data and answer a whole bunch of questions. For example, we see is that the US has won an incredible proportion of the prizes in the field of Economics. In comparison, Japan and Germany have won very few or no economics prize at all. Also, the US has more prizes in physics or medicine alone than all of France's prizes combined. On the chart, we also see that Germany won more prizes in physics than the UK and that France has won more prizes in peace and literature than Germany, even though Germany has been awarded a higher total number of prizes than France.

When did the United States become so dominant? Was it always this way? Has the prize become more global in scope? 


Solution 4: Country Prizes over Time

To see how the prize was awarded over time. To do that, we can count the number of prizes by country by year.

prize_by_year = df_data.groupby(by=['birth_country_current', 'year'], as_index=False).count()
+prize_by_year = prize_by_year.sort_values('year')[['year', 'birth_country_current', 'prize']]

Then we can create a series that has the cumulative sum for the number of prizes won.

cumulative_prizes = prize_by_year.groupby(by=['birth_country_current',
+                                              'year']).sum().groupby(level=[0]).cumsum()
+cumulative_prizes.reset_index(inplace=True) 

Using this, we can create a chart, using the current birth country as the color:

l_chart = px.line(cumulative_prizes,
+                  x='year', 
+                  y='prize',
+                  color='birth_country_current',
+                  hover_name='birth_country_current')
+
+l_chart.update_layout(xaxis_title='Year',
+                      yaxis_title='Number of Prizes')
+
+l_chart.show()

What we see is that the United States really started to take off after the Second World War which decimated Europe. Prior to that, the Nobel prize was pretty much a European affair. Very few laureates were chosen from other parts of the world. This has changed dramatically in the last 40 years or so. There are many more countries represented today than in the early days. Interestingly we also see that the UK and Germany traded places in the 70s and 90s on the total number of prizes won. Sweden being 5th place pretty consistently over many decades is quite interesting too. Perhaps this reflects a little bit of home bias? 


All this analysis of different countries makes me curious about where the actual research is happening. Where are the cities and organisations located where people actually make discoveries? 



\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/006 Create Sunburst Charts for a Detailed Regional Breakdown of Research Locations.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/006 Create Sunburst Charts for a Detailed Regional Breakdown of Research Locations.html new file mode 100644 index 0000000000000000000000000000000000000000..baf70c732937ecd2450df212404cbf8069d99216 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/006 Create Sunburst Charts for a Detailed Regional Breakdown of Research Locations.html @@ -0,0 +1,50 @@ +


Challenge 1

Many Nobel laureates are affiliated with a university, a laboratory, or a research organisation (apart from Literature and Peace prize winners as we've seen). But the world is a big place. Which research institutions had the most Nobel laureates working there at the time of making the discovery?

Create a bar chart showing the organisations affiliated with the Nobel laureates. It should looks something like this:

Challenge 2

Each research organisation is located in a particular city. Are some cities hot spots for scientific discoveries? Where do major discoveries tend to take place?


Challenge 3

Contrast the above chart with the birth city of the Nobel laureates. Would you expect to see a similar ranking for where the laureates are born versus where most discoveries are made? Would you expect to see the most populous cities producing the highest number of Nobel laureates? 


Challenge 4

Here's what you're aiming for:



.

.

..

...

..

.

.



Solution 1: The Top Research Organisations

This one should be pretty simple:

top20_orgs = df_data.organization_name.value_counts()[:20]
+top20_orgs.sort_values(ascending=True, inplace=True)

Our chart includes many of the usual suspects:

org_bar = px.bar(x = top20_orgs.values,
+                 y = top20_orgs.index,
+                 orientation='h',
+                 color=top20_orgs.values,
+                 color_continuous_scale=px.colors.sequential.haline,
+                 title='Top 20 Research Institutions by Number of Prizes')
+
+org_bar.update_layout(xaxis_title='Number of Prizes', 
+                      yaxis_title='Institution',
+                      coloraxis_showscale=False)
+org_bar.show()


Solution 2: Research Cities

top20_org_cities = df_data.organization_city.value_counts()[:20]
+top20_org_cities.sort_values(ascending=True, inplace=True)
+city_bar2 = px.bar(x = top20_org_cities.values,
+                  y = top20_org_cities.index,
+                  orientation='h',
+                  color=top20_org_cities.values,
+                  color_continuous_scale=px.colors.sequential.Plasma,
+                  title='Which Cities Do the Most Research?')
+
+city_bar2.update_layout(xaxis_title='Number of Prizes', 
+                       yaxis_title='City',
+                       coloraxis_showscale=False)
+city_bar2.show()

Cambridge Massachusets and New York in the United States lead the pack:


Solution 3: Laureate Birth Cities

top20_cities = df_data.birth_city.value_counts()[:20]
+top20_cities.sort_values(ascending=True, inplace=True)
+city_bar = px.bar(x=top20_cities.values,
+                  y=top20_cities.index,
+                  orientation='h',
+                  color=top20_cities.values,
+                  color_continuous_scale=px.colors.sequential.Plasma,
+                  title='Where were the Nobel Laureates Born?')
+
+city_bar.update_layout(xaxis_title='Number of Prizes', 
+                       yaxis_title='City of Birth',
+                       coloraxis_showscale=False)
+city_bar.show()

A higher population definitely means that there's a higher chance of a Nobel laureate to be born there. New York, Paris, and London are all very populous. However, Vienna and Budapest are not and still produced many prize winners. That said, much of the ground-breaking research does not take place in big population centres, so the list of birth cities is quite different from the list above. Cambridge Massachusets, Stanford, Berkely and Cambridge (UK) are all the places where many discoveries are made, but they are not the birthplaces of laureates.


Solution 4: The Sunburst Chart

Each country has a number of cities, which contain a number of cities, which in turn contain the research organisations. The sunburst chart is perfect for representing this relationship. It will give us an idea of how geographically concentrated scientific discoveries are!

country_city_org = df_data.groupby(by=['organization_country', 
+                                       'organization_city', 
+                                       'organization_name'], as_index=False).agg({'prize': pd.Series.count})
+
+country_city_org = country_city_org.sort_values('prize', ascending=False)
burst = px.sunburst(country_city_org, 
+                    path=['organization_country', 'organization_city', 'organization_name'], 
+                    values='prize',
+                    title='Where do Discoveries Take Place?',
+                   )
+
+burst.update_layout(xaxis_title='Number of Prizes', 
+                    yaxis_title='City',
+                    coloraxis_showscale=False)
+
+burst.show()

France is a great example of concentration. Practically all the organisations affiliated with Nobel prize winners are in Paris. In contrast, scientific discoveries are much more spread out across Germany. Meanwhile, the UK is dominated by Cambridge and London.

\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/007 Unearthing Patterns in the Laureate Age at the Time of the Award.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/007 Unearthing Patterns in the Laureate Age at the Time of the Award.html new file mode 100644 index 0000000000000000000000000000000000000000..23e6da41fed9b14c0a4c30ef16ee5eaf7650e44d --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/007 Unearthing Patterns in the Laureate Age at the Time of the Award.html @@ -0,0 +1,43 @@ +

How old are the Nobel laureates at the time when they win the prize? Does this vary by category? Also, how has the age of the laureates changed over time?


Challenge 1

Calculate the age of the laureate in the year of the ceremony and add this as a column called winning_age to the df_data DataFrame. Hint: you can use this to help you.


Challenge 2

Who were the oldest and the youngest winners?


Challenge 3


Challenge 4

Are Nobel laureates being nominated later in life than before? Have the ages of laureates at the time of the award increased or decreased over time?


Challenge 5

How does the age of laureates vary by category?


Challenge 6



.

.

..

...

..

.

.



Solution 1: Calculate the Age at the Time of Award

First, we need to extract the year as a number from the birth_date column:

birth_years = df_data.birth_date.dt.year

Now we can work out the age at the time of the award:

df_data['winning_age'] = df_data.year - birth_years



Solution 2: Oldest and Youngest Winners

display(df_data.nlargest(n=1, columns='winning_age'))
+display(df_data.nsmallest(n=1, columns='winning_age'))

John Goodenough was 97 years old when he got the Nobel prize!!! Holy moly. Interestingly John was born to American parents while they were in Germany. This is one example where our analysis of countries counts an extra "German" prize even though he is an American citizen. Too bad we don't have a nationality column in our dataset! Nonetheless, this goes to show it is never too late to win a Nobel prize. I'm keeping my fingers crossed for you!


Solution 3: Descriptive Statistics and Histogram

Using .describe() is a fantastic way to get a feeling for how the numbers are distributed in a particular column. However, actually visualising them on a histogram to see their distribution is highly recommended too since it allows us to see if we have a bell-shaped curve or something else.

Here's what the histogram looks like:

plt.figure(figsize=(8, 4), dpi=200)
+sns.histplot(data=df_data,
+             x=df_data.winning_age,
+             bins=30)
+plt.xlabel('Age')
+plt.title('Distribution of Age on Receipt of Prize')
+plt.show()


Solution 4: Winning Age Over Time (All Categories)

The histogram above shows us the distribution across the entire dataset, over the entire time period. But perhaps the age has changed over time.

plt.figure(figsize=(8,4), dpi=200)
+with sns.axes_style("whitegrid"):
+    sns.regplot(data=df_data,
+                x='year',
+                y='winning_age',
+                lowess=True, 
+                scatter_kws = {'alpha': 0.4},
+                line_kws={'color': 'black'})
+
+plt.show()

Using the lowess parameter allows us to plot a local linear regression. This means the best fit line is still linear, but it's more like a moving average which gives us a non-linear shape across the entire series. This is super neat because it clearly shows how the Nobel laureates are getting their award later and later in life. From 1900 to around 1950, the laureates were around 55 years old, but these days they are closer to 70 years old when they get their award! The other thing that we see in the chart is that in the last 10 years the spread has increased. We've had more very young and very old winners. In 1950s/60s winners were between 30 and 80 years old. Lately, that range has widened.


Solution 5: Age Differences between Categories

Seaborn allows us to create the above chart by category. But first, let's look at a box plot by category.

plt.figure(figsize=(8,4), dpi=200)
+with sns.axes_style("whitegrid"):
+    sns.boxplot(data=df_data,
+                x='category',
+                y='winning_age')
+
+plt.show()

The box plot shows us the mean, the quartiles, the maximum and the minimum values. It raises an interesting question: "Are peace prize winners really older than physics laureates?".


Solution 6: Laureate Age over Time by Category

To get a more complete picture, we should look at how the age of winners has changed over time. The box plot above looked at the dataset as a whole.

with sns.axes_style('whitegrid'):
+    sns.lmplot(data=df_data,
+               x='year', 
+               y='winning_age',
+               row = 'category',
+               lowess=True, 
+               aspect=2,
+               scatter_kws = {'alpha': 0.6},
+               line_kws = {'color': 'black'},)
+
+plt.show()

We see that winners in physics, chemistry, and medicine have gotten older over time. The ageing trend is strongest for physics. The average age used to be below 50, but now it's over 70. Economics, the newest category, is much more stable in comparison. The peace prize shows the opposite trend where winners are getting younger! As such, our scatter plots showing the best fit lines over time and our box plot of the entire dataset can tell very different stories!

To combine all these charts into the same chart, we can use the hue parameter

with sns.axes_style("whitegrid"):
+    sns.lmplot(data=df_data,
+               x='year',
+               y='winning_age',
+               hue='category',
+               lowess=True, 
+               aspect=2,
+               scatter_kws={'alpha': 0.5},
+               line_kws={'linewidth': 5})
+
+plt.show()


Source: smbc-comics.com



\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Course-Fixes-Report-an-Issue.url b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Learning Points & Summary.html b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..1367c2a5fca0370436d8348a2fcbbb8ba217a5c5 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Learning Points & Summary.html @@ -0,0 +1 @@ +

Today was a big and difficult project. Congratulations on making it all the way through! You too deserve a prize !


In this lesson, we reviewed many concepts that we've covered previously, including:


In addition, we learned many new things too. We looked at how to:


You can download the completed code for today in this lesson.



\ No newline at end of file diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Nobel-Prize-Analysis-Complete.zip b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Nobel-Prize-Analysis-Complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..9452e5fc6841f16f70e53956ad88ccb391547fd2 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/008 Nobel-Prize-Analysis-Complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:304ee72c296ea7a5aa1a1b69702cfae79a29ed11b6809409f54bc4e4f0dd7d16 +size 1241799 diff --git a/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/external-links.txt b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..39062d29c9524ecd0772bf65b1a8c539b26536d7 --- /dev/null +++ b/part4/79 - Day 79 - Advanced - Analysing the Nobel Prize with Plotly, Matplotlib & Seaborn/external-links.txt @@ -0,0 +1,3 @@ + +008 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/001 Day 80 Goals what you will make by the end of the day.html b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/001 Day 80 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..4b2544d96c1f3d16440e7a912df558e7a048c4db --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/001 Day 80 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Your Story

Today you will become a doctor, but not just any doctor. You will become Dr Ignaz Semmelweis, a Hungarian physician born in 1818 who worked in the Vienna General Hospital.

In the past, people didn't know about bacteria, germs, or viruses. People illness was caused by "bad air" or evil spirits. But in the 1800s Doctors started looking more at anatomy, doing autopsies and making arguments based on data. Dr Semmelweis suspected that something was going wrong with the procedures at Vienna General Hospital. Dr Semmelweis wanted to figure out why so many women in maternity wards were dying from childbed fever (i.e., puerperal fever).


Today you'll learn:


Download and add the Notebook to Google Drive

As usual, download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook.


Add the Data to the Notebook

The .zip file also includes two .csv files. This is the data for the project. Add this file to your notebook.


\ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/001 Dr-Semmelweis-Analysis-start.zip b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/001 Dr-Semmelweis-Analysis-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..723e8f5b5e369599904d69957bc345e6b63562e9 --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/001 Dr-Semmelweis-Analysis-start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbe878f1b5b83462e3ecb7a9dc5de15f9656b2c3cdc80f4c1908d05fc8d6dac3 +size 8313 diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/002 Preliminary Data Exploration and Visualising Births & Deaths at Vienna Hospital.html b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/002 Preliminary Data Exploration and Visualising Births & Deaths at Vienna Hospital.html new file mode 100644 index 0000000000000000000000000000000000000000..aa589437e3005868286ff1bea46d80228445196b --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/002 Preliminary Data Exploration and Visualising Births & Deaths at Vienna Hospital.html @@ -0,0 +1,54 @@ +

You (aka Dr Semmelweis) are working at Vienna General Hospital. Let's take a closer look at the data you've been collecting on the number of births and maternal deaths throughout the 1840s.


Challenge 1: Preliminary Data Exploration


.

.

..

...

..

.

.


Solution to Challenge 1

Using .shape, .head(), .tail() we see that the dataset covers the years 1841 to 1849. The two tables report the total number of births and the total number of deaths. Interestingly, the yearly data breaks the number of birthds and deaths down by clinic.

We see that there are no NaN values in either of the DataFrames. We can verify this either with using .info() or using .isna().values.any().

There are also no duplicate entries. In other words, the dataset appears to be clean.

Using .describe() allows us to view some interesting statistics at a glance. We see that on average there were about 267 births and 22.47 deaths per month.

Challenge 2: Percentage of Women Dying in Childbirth

How dangerous was childbirth in the 1840s in Vienna?

In comparison, the United States recorded 18.5 maternal deaths per 100,000 or 0.018% in 2013 (source).


.

.

..

...

..

.

.



Solution to Challenge 2

Childbirth was very risky! About 7.08% of women died in the 1840s (compared to 0.018% in the US in 2013).

prob = df_yearly.deaths.sum() / df_yearly.births.sum() * 100
+print(f'Chances of dying in the 1840s in Vienna: {prob:.3}%')

If someone gave me a bag of 100 M&Ms and told me that 7 of them would kill me, I'd (probably) pass on those M&Ms . Just saying.


Challenge 3: Visualise the Total Number of Births and Deaths over Time

Create a Matplotlib chart with twin y-axes. It should look something like this:


.

.

..

...

..

.

.


Solution to Challenge 3

Just as in previous notebooks we can use .twinx() to create to y-axes. Then it's just a matter of adding a gird with .grid() and configuring the look of our plots with the color, linewidth, and linestyle parameters.

plt.figure(figsize=(14,8), dpi=200)
+plt.title('Total Number of Monthly Births and Deaths', fontsize=18)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.grid(color='grey', linestyle='--')
+
+ax1.plot(df_monthly.date, 
+         df_monthly.births, 
+         color='skyblue', 
+         linewidth=3)
+
+ax2.plot(df_monthly.date, 
+         df_monthly.deaths, 
+         color='crimson', 
+         linewidth=2, 
+         linestyle='--')
+
+plt.show()

To get the tickmarks showing up on the x-axis, we need to use mdates and Matplotlib's locators.

# Create locators for ticks on the time axis
+years = mdates.YearLocator()
+months = mdates.MonthLocator()
+years_fmt = mdates.DateFormatter('%Y') 

We can then use the locators in our chart:

plt.figure(figsize=(14,8), dpi=200)
+plt.title('Total Number of Monthly Births and Deaths', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(fontsize=14, rotation=45)
+
+ax1 = plt.gca()
+ax2 = ax1.twinx()
+
+ax1.set_ylabel('Births', color='skyblue', fontsize=18)
+ax2.set_ylabel('Deaths', color='crimson', fontsize=18)
+
+# Use Locators
+ax1.set_xlim([df_monthly.date.min(), df_monthly.date.max()])
+ax1.xaxis.set_major_locator(years)
+ax1.xaxis.set_major_formatter(years_fmt)
+ax1.xaxis.set_minor_locator(months)
+
+ax1.grid(color='grey', linestyle='--')
+
+ax1.plot(df_monthly.date, 
+         df_monthly.births, 
+         color='skyblue', 
+         linewidth=3)
+
+ax2.plot(df_monthly.date, 
+         df_monthly.deaths, 
+         color='crimson', 
+         linewidth=2, 
+         linestyle='--')
+
+plt.show()

What we see is that something happened after 1847. The total number of deaths seems to have dropped, despite an increasing number of births! 


\ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/003 Analysing the Yearly Data Split By Clinic.html b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/003 Analysing the Yearly Data Split By Clinic.html new file mode 100644 index 0000000000000000000000000000000000000000..6ff3e64be34ec8c24e85e6facb4275811bd712fc --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/003 Analysing the Yearly Data Split By Clinic.html @@ -0,0 +1,23 @@ +

Welcome to your workplace...

There are two maternity wards at the Vienna General Hospital: clinic 1 and clinic 2. Clinic 1 was staffed by all-male doctors and medical students, and clinic 2 was staffed by female midwives.

Challenge 1: The Yearly Data Split by Clinic

Let's turn our attention to the annual data. Use plotly to create line charts of the births and deaths of the two different clinics at the Vienna General Hospital.


.

.

..

...

..

.

.


Solution to Challenge 1

To show two line charts side by side we can use plotly and provide the clinic column as the color.

line = px.line(df_yearly, 
+               x='year', 
+               y='births',
+               color='clinic',
+               title='Total Yearly Births by Clinic')
+
+line.show()

We see that more and more women gave birth at the hospital over the years. Clinic 1, which was staffed by male doctors and medical students was also the busier or simply the larger ward. More births took place in clinic 1 than in clinic 2.

We also see that, not only were more people born in clinic 1, more people also died in clinic 1.

line = px.line(df_yearly, 
+               x='year', 
+               y='deaths',
+               color='clinic',
+               title='Total Yearly Deaths by Clinic')
+
+line.show()

To compare apples and apples, we need to look at the proportion of deaths per clinic.


Challenge 2: Calculate the Proportion of Deaths at Each Clinic

Calculate the proportion of maternal deaths per clinic. That way we can compare like with like.


.

.

..

...

..

.

.


Solution to Challenge 2

We can add a new column that has the percentage of deaths for each row like this: 

df_yearly['pct_deaths'] = df_yearly.deaths / df_yearly.births

The average death rate for the entire time period for clinic 1 is:

clinic_1 = df_yearly[df_yearly.clinic == 'clinic 1']
+avg_c1 = clinic_1.deaths.sum() / clinic_1.births.sum() * 100
+print(f'Average death rate in clinic 1 is {avg_c1:.3}%.')

9.92%. In comparison, clinic 2 which was staffed by midwives had a much lower death rate of 3.88% over the course of the entire period. Hmm...

clinic_2 = df_yearly[df_yearly.clinic == 'clinic 2']
+avg_c2 = clinic_2.deaths.sum() / clinic_2.births.sum() * 100
+print(f'Average death rate in clinic 2 is {avg_c2:.3}%.')

Once again, let's see this on a chart

line = px.line(df_yearly, 
+               x='year', 
+               y='pct_deaths',
+               color='clinic',
+               title='Proportion of Yearly Deaths by Clinic')
+
+line.show()

1842 was a rough year. About 16% of women died in clinic 1 and about 7.6% of women died in clinic 2.

Still, clinic 2 had a consistently lower death rate than clinic 1! This is what puzzled and frustrated Dr Semmelweis.


The story continues...

At first, Dr Semmelweis thought that the position of the women giving birth was the issue. In clinic 2, the midwives' clinic, women gave birth on their sides. In the doctors' clinic, women gave birth on their backs. So, Dr. Semmelweis, had women in the doctors' clinic give birth on their sides. However, this had no effect on the death rate.

Next, Dr Semmelweis noticed that whenever someone on the ward died, a priest would walk through clinic 1, past the women's beds ringing a bell . Perhaps the priest and the bell ringing terrified the women so much after birth that they developed a fever, got sick and died. Dr Semmelweis had the priest change his route and stop ringing the bell . Again, this had no effect.

At this point, Dr Semmelweis was so frustrated he went on holiday to Venice. Perhaps a short break would clear his head. When Semmelweis returned from his vacation, he was told that one of his colleagues, a pathologist, had fallen ill and died. His friend had pricked his finger while doing an autopsy on a woman who had died from childbed fever and subsequently got very sick himself and died.

Looking at the pathologist's symptoms, Semmelweis realised the pathologist died from the same thing as the women he had autopsied.  This was his breakthrough: anyone could get sick from childbed fever, not just women giving birth!

This is what led to Semmelweis' new theory. Perhaps there were little pieces or particles of a corpse that the doctors and medical students were getting on their hands while dissecting the cadavers during an autopsy. And when the doctors delivered the babies in clinic 1, these particles would get inside the women giving birth who would then develop the disease and die.

\ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/004 The Effect of Handwashing.html b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/004 The Effect of Handwashing.html new file mode 100644 index 0000000000000000000000000000000000000000..bb007ee1fd20df0d39bf0d11c2db6d676856941a --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/004 The Effect of Handwashing.html @@ -0,0 +1,43 @@ +

In June 1846, Dr Semmelweis ordered everyone on his medical staff to start cleaning their hands and instruments not just with soap and water but with a chlorine solution (he didn't know it at the time, but chlorine is an amazing disinfectant). The reason Dr Semmelweis actually chose the chlorine was that he wanted to get rid of any smell on doctors' hands after an autopsy. No one knew anything about bacteria, germs or viruses at the time.


Challenge 1: The Effect of Handwashing


Challenge 2: Calculate a Rolling Average of the Death Rate

Create a DataFrame that has the 6-month rolling average death rate prior to mandatory handwashing.

Hint: You'll need to set the dates as the index in order to avoid the date column being dropped during the calculation


Challenge 3: Highlighting Subsections of a Line Chart

Copy-paste and then modify the Matplotlib chart from before to plot the monthly death rates (instead of the total number of births and deaths). The chart should look something like this:




.

.

..

...

..

.

.


Solution to Challenge 1

We can add a column with the proportion of deaths per birth like so:

df_monthly['pct_deaths'] = df_monthly.deaths/df_monthly.births

Then we can create two subsets based on the handwashing_start date.

before_washing = df_monthly[df_monthly.date < handwashing_start]
+after_washing = df_monthly[df_monthly.date >= handwashing_start]

The death rate per birth dropped dramatically after handwashing started - from close to 10.53% to 2.15%. We can use the colon and dot inside a print statement to determine the number of digits we'd like to print out from a number.

bw_rate = before_washing.deaths.sum() / before_washing.births.sum() * 100
+aw_rate = after_washing.deaths.sum() / after_washing.births.sum() * 100
+print(f'Average death rate before 1847 was {bw_rate:.4}%')
+print(f'Average death rate AFTER 1847 was {aw_rate:.3}%')


Solution to Challenge 2

To work out the moving 6-month average we first set the date column as the index. Then we can use the same Pandas functions as in the Google Trends notebook.

roll_df = before_washing.set_index('date')
+roll_df = roll_df.rolling(window=6).mean()


Solution to Challenge 3

After copy-pasting the previous code for the Matplotlib chart, we just need to change a few things. First, we remove the twin axes. And instead, we plot the three different lines on the same axis. To create the legend, we supply a label to the .plot() function and capture return value in a variable. It's important to notice that .plot() returns more than one thing, so we need to use a comma (,) since we're only grabbing the first item. We can then feed these handles into plt.legend().

plt.figure(figsize=(14,8), dpi=200)
+plt.title('Percentage of Monthly Deaths over Time', fontsize=18)
+plt.yticks(fontsize=14)
+plt.xticks(fontsize=14, rotation=45)
+
+plt.ylabel('Percentage of Deaths', color='crimson', fontsize=18)
+
+ax = plt.gca()
+ax.xaxis.set_major_locator(years)
+ax.xaxis.set_major_formatter(years_fmt)
+ax.xaxis.set_minor_locator(months)
+ax.set_xlim([df_monthly.date.min(), df_monthly.date.max()])
+
+plt.grid(color='grey', linestyle='--')
+
+ma_line, = plt.plot(roll_df.index, 
+                    roll_df.pct_deaths, 
+                    color='crimson', 
+                    linewidth=3, 
+                    linestyle='--',
+                    label='6m Moving Average')
+bw_line, = plt.plot(before_washing.date, 
+                    before_washing.pct_deaths,
+                    color='black', 
+                    linewidth=1, 
+                    linestyle='--', 
+                    label='Before Handwashing')
+aw_line, = plt.plot(after_washing.date, 
+                    after_washing.pct_deaths, 
+                    color='skyblue', 
+                    linewidth=3, 
+                    marker='o',
+                    label='After Handwashing')
+
+plt.legend(handles=[ma_line, bw_line, aw_line],
+           fontsize=18)
+
+plt.show()
\ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/005 Visualising Distributions and Testing for Statistical Significance.html b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/005 Visualising Distributions and Testing for Statistical Significance.html new file mode 100644 index 0000000000000000000000000000000000000000..df32a1a7206db389e5f5c6f4e46dcfcb4340ef6c --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/005 Visualising Distributions and Testing for Statistical Significance.html @@ -0,0 +1,49 @@ +

There are even more powerful arguments we can make to convince our fellow doctors in clinic 1 of the virtues of handwashing. The first are statistics regarding the mean monthly death rate. The second are compelling visualisations to accompany the statistics.

Challenge 1: Calculate the Difference in the Average Monthly Death Rate


.

.

..

...

..

.

.


Solution to Challenge 1

A lot of statistical tests rely on comparing features of distributions, like the mean. We see that the average death rate before handwashing was 10.5%. After handwashing was made obligatory, the average death rate was 2.11%. The difference is massive. Handwashing decreased the average death rate by 8.4%, a 5x improvement.

avg_prob_before = before_washing.pct_deaths.mean() * 100
+print(f'Chance of death during childbirth before handwashing: {avg_prob_before:.3}%.')
+
+avg_prob_after = after_washing.pct_deaths.mean() * 100
+print(f'Chance of death during childbirth AFTER handwashing: {avg_prob_after:.3}%.')
+
+mean_diff = avg_prob_before - avg_prob_after
+print(f'Handwashing reduced the monthly proportion of deaths by {mean_diff:.3}%!')
+
+times = avg_prob_before / avg_prob_after
+print(f'This is a {times:.2}x improvement!')


Challenge 2: Using Box Plots to Show How the Death Rate Changed Before and After Handwashing

The statistic above is impressive, but how do we show it graphically? With a box plot we can show how the quartiles, minimum, and maximum values changed in addition to the mean.


.

.

..

...

..

.

.


Solution to Challenge 2

The easiest way to create a box plot is to have a column in our DataFrame that shows the rows' "category" (i.e., was it before or after obligatory handwashing). NumPy allows us to easily test for a condition and add a column of data.

df_monthly['washing_hands'] = np.where(df_monthly.date < handwashing_start, 'No', 'Yes')

Now we can use plotly:

box = px.box(df_monthly, 
+             x='washing_hands', 
+             y='pct_deaths',
+             color='washing_hands',
+             title='How Have the Stats Changed with Handwashing?')
+
+box.update_layout(xaxis_title='Washing Hands?',
+                  yaxis_title='Percentage of Monthly Deaths',)
+
+box.show()

The plot shows us the same data as our Matplotlib chart, but from a different perspective. Here we also see the massive spike in deaths in late 1842. Over 30% of women who gave birth that month died in hospital. What we also see in the box plot is how not only did the average death rate come down, but so did the overall range - we have a lower max and 3rd quartile too. Let's take a look at a histogram to get a better sense of the distribution.


Challenge 3: Use Histograms to Visualise the Monthly Distribution of Outcomes

Create a plotly histogram to show the monthly percentage of deaths.



.

.

..

...

..

.

.


Solution to Challenge 3

To create our histogram, we once again make use of the color parameter. This creates two separate histograms for us. When we set the opacity to 0.6 or so we can clearly see how the histograms overlap. The trick to getting a sensible-looking histogram when you have a very different number of observations is to set the histnorm to 'percent'. That way the histogram with more observations won't completely overshadow the shorter series.

hist = px.histogram(df_monthly, 
+                   x='pct_deaths', 
+                   color='washing_hands',
+                   nbins=30,
+                   opacity=0.6,
+                   barmode='overlay',
+                   histnorm='percent',
+                   marginal='box',)
+
+hist.update_layout(xaxis_title='Proportion of Monthly Deaths',
+                   yaxis_title='Count',)
+
+hist.show()

I quite like how in plotly we can display our box plot from earlier at the top.

Now, we have only about 98 data points or so, so our histogram looks a bit jagged. It's not a smooth bell-shaped curve. However, we can estimate what the distribution would look like with a Kernel Density Estimate (KDE).


Challenge 4: Use a Kernel Density Estimate (KDE) to visualise a smooth distribution

Use Seaborn's .kdeplot() to create two kernel density estimates of the pct_deaths, one for before handwashing and one for after.


.

.

..

...

..

.

.


Solution to Challenge 4

To create two bell-shaped curves of the estimated distributions of the death rates we just call .kdeplot() twice.

plt.figure(dpi=200)
+# By default the distribution estimate includes a negative death rate!
+sns.kdeplot(before_washing.pct_deaths, shade=True)
+sns.kdeplot(after_washing.pct_deaths, shade=True)
+plt.title('Est. Distribution of Monthly Death Rate Before and After Handwashing')
+plt.show()

However, the problem is that we end up with a negative monthly death rate on the left tail. The doctors would be very surprised indeed if a corpse came back to life after an autopsy!

The solution is to specify a lower bound of 0 for the death rate.

plt.figure(dpi=200)
+sns.kdeplot(before_washing.pct_deaths, 
+            shade=True,
+            clip=(0,1))
+sns.kdeplot(after_washing.pct_deaths, 
+            shade=True,
+            clip=(0,1))
+plt.title('Est. Distribution of Monthly Death Rate Before and After Handwashing')
+plt.xlim(0, 0.40)
+plt.show()

Now that we have an idea of what the two distributions look like, we can further strengthen our argument for handwashing by using a statistical test. We can test whether our distributions ended up looking so different purely by chance (i.e., the lower death rate is just an accident) or if the 8.4% difference in the average death rate is statistically significant.



Challenge 5: Use a T-Test to Show Statistical Significance

Use a t-test to determine if the differences in the means are statistically significant or purely due to chance.

If the p-value is less than 1% then we can be 99% certain that handwashing has made a difference to the average monthly death rate.


.

.

..

...

..

.

.


Solution to Challenge 5

The first step is to import stats from scipy

import scipy.stats as stats

When we calculate the p_value we see that it is 0.0000002985 or .00002985% which is far below even 1%. In other words, the difference in means is highly statistically significant and we can go ahead on publish our research paper

t_stat, p_value = stats.ttest_ind(a=before_washing.pct_deaths, 
+                                  b=after_washing.pct_deaths)
+print(f'p-palue is {p_value:.10f}')
+print(f't-statstic is {t_stat:.4}')


\ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Course-Fixes-Report-an-Issue.url b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Dr-Semmelweis-Analysis-complete.zip b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Dr-Semmelweis-Analysis-complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..082147dc5da2cdc4c642375e048a4a329c1b1a11 --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Dr-Semmelweis-Analysis-complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3082cfeda02e03e2760c41463aa227f10b71375ddb92033cffd101ce23880b9a +size 1068095 diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Learning Points & Summary.html b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Learning Points & Summary.html new file mode 100644 index 0000000000000000000000000000000000000000..c1cc5fabb9d9fbbf9312b97cf86c651984e139a3 --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/006 Learning Points & Summary.html @@ -0,0 +1 @@ +

Well done, Doctor! With your thorough analysis and compelling visualisations of the handwashing data, you've convinced the hospital board to continue making hand washing obligatory!

Today you've learned

The Tragic Story of Dr Semmelweis

Gather round, gather round. Now I'll tell you how our story ends. Despite the incredible evidence in favour of Dr Semmelweis' theory - that childbed fever was caused by some "substance" (which today we know as bacteria) from autopsy room corpses - was rejected by the medical community at the time. But why?! 

Part of the reason is that Semmelweis was not very tactful. He made it look like doctors were giving childbed fever to women (which they in fact were). This is not something people wanted to hear.

However, he also published his data in the form of long tables without any data visualisations:

The long tables made it very hard to see what's actually going on! Also, at the time statistics and statistical arguments were quite uncommon in the field of medicine.

Eventually, Dr Semmelweis belligerent campaigning made him some powerful and influential enemies. He lost his job at the Vienna hospital, and doctors gave up washing their hands with chlorine. As Dr Semmelweis grew older he got even angrier and eventually quite "strange". This was either the immense frustration or possibly a result of another disease like Alzheimer's or syphilis. In 1965, at the age of 47, Dr Semmelweis was committed to a mental asylum. And at the asylum, he was probably beaten since he eventually died of sepsis, a complication of an infection in the bloodstream. The tragic irony is that sepsis is a similar kind of disease that he fought so hard to prevent in women who died from childbed fever. It wasn't until 20 years later with Louis Pasteur's work on germ theory that Dr Semmelweis' work gained acceptance. RIP Dr Semmelweis.

Here's how you can wash your hands like a surgeon:

You can download the completed code for today in this lesson.

\ No newline at end of file diff --git a/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/external-links.txt b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..d06ef8c7be4821826fa11d8509a0c4576a8e1899 --- /dev/null +++ b/part4/80 - Day 80 - Advanced - The Tragic Discovery of Handwashing t-Tests & Distributions/external-links.txt @@ -0,0 +1,3 @@ + +006 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/001 Day 81 Goals what you will make by the end of the day.html b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/001 Day 81 Goals what you will make by the end of the day.html new file mode 100644 index 0000000000000000000000000000000000000000..7e9024947075b870adb0ef66c00cc010db3b265b --- /dev/null +++ b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/001 Day 81 Goals what you will make by the end of the day.html @@ -0,0 +1 @@ +

Welcome to Boston Massachusetts in the 1970s! Imagine you're working for a real estate development company. Your company wants to value any residential project before they start. You are tasked with building a model that can provide a price estimate based on a home's characteristics like:


Today you will:

  1. Analyse and explore the Boston house price data

  2. Split your data for training and testing

  3. Run a Multivariable Regression

  4. Evaluate how your model's coefficients and residuals

  5. Use data transformation to improve your model performance

  6. Use your model to estimate a property price

Download and add the Notebook to Google Drive

As usual, download the .zip file from this lesson and extract it. Add the .ipynb file into your Google Drive and open it as a Google Colaboratory notebook. All of today's challenges and explanations are contained in the notebook itself.


Add the Data to the Notebook

The .zip file also includes a .csv file. This is the data for the project. Add this file to your notebook.




\ No newline at end of file diff --git a/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/001 Multivariable-Regression-Start.zip b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/001 Multivariable-Regression-Start.zip new file mode 100644 index 0000000000000000000000000000000000000000..0ee871e36ff30136ebe863efcd1c968ad0e6c5ff --- /dev/null +++ b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/001 Multivariable-Regression-Start.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e49c913b314b78c03d9c8699f0347d37699ed70840b8d204144289f275f07e0 +size 52878 diff --git a/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Course-Fixes-Report-an-Issue.url b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Course-Fixes-Report-an-Issue.url new file mode 100644 index 0000000000000000000000000000000000000000..d14cff896140fdde4856a42d48519eb2f321b008 --- /dev/null +++ b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Course-Fixes-Report-an-Issue.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://forms.gle/fpNEQooYBX25gcG67 \ No newline at end of file diff --git a/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Multivariable-Regression-Complete.zip b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Multivariable-Regression-Complete.zip new file mode 100644 index 0000000000000000000000000000000000000000..830e907c52462850ea04f34344986a70a802da73 --- /dev/null +++ b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Multivariable-Regression-Complete.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f18787891bef5f298648423d2ca999e70e8980d0b0d863a30a4c92e4af57ccbb +size 1770106 diff --git a/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Solution & Learning Points.html b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Solution & Learning Points.html new file mode 100644 index 0000000000000000000000000000000000000000..e1567a3a6c12d68fe17c43a14a0c2dc43fc2e2f1 --- /dev/null +++ b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/002 Solution & Learning Points.html @@ -0,0 +1 @@ +

Well done! This was the most challenging data science project to date!


Today you've learned


You can download the completed code for today in this lesson.



\ No newline at end of file diff --git a/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/external-links.txt b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/external-links.txt new file mode 100644 index 0000000000000000000000000000000000000000..84871578bec903c5ca95dde57ae80f92f46d02c4 --- /dev/null +++ b/part4/81 - Day 81 - Advanced - Capstone Project - Predict House Prices/external-links.txt @@ -0,0 +1,3 @@ + +002 Course-Fixes-Report-an-Issue +https://forms.gle/fpNEQooYBX25gcG67 diff --git a/part4/82 - Day 82 - Professional Portfolio Project - [Python Scripting]/001 The Road to Becoming a Professional Developer.html b/part4/82 - Day 82 - Professional Portfolio Project - [Python Scripting]/001 The Road to Becoming a Professional Developer.html new file mode 100644 index 0000000000000000000000000000000000000000..0484b6a450281ab39612f148d1c3300a5de0534e --- /dev/null +++ b/part4/82 - Day 82 - Professional Portfolio Project - [Python Scripting]/001 The Road to Becoming a Professional Developer.html @@ -0,0 +1 @@ +

The upcoming 20 projects are designed to help you consolidate all the knowledge you have gained in this course. But more importantly, it's a trial by fire. One of the biggest pitfalls for people who are self-taught programmers is getting stuck in tutorial hell. Where you only know how to do the things that the tutorial teaches you and you don't progress to a fully-fledged developer.

The way to get out of tutorial hell is through building projects by yourself, with no guidance. You will get stuck plenty of times, you will struggle a lot and you might doubt yourself. The important phrase to keep in mind is "this happens to everyone". You are not alone. Any pro developer can tell you this, the first time they tried to build a project from scratch was one of the hardest things but also one of the most rewarding. You will need to use all the tools at your disposal - Google, StackOverflow, YouTube, books and past notes. But through struggle, if you don't give up, you will come out the other side a stronger developer.

The next 20 projects are designed to take you from junior developer (relying on tutorials) to professional developer (relying on yourself). They will also build your portfolio. Because for the first time, all the code will be your own. You can copyright your code, you can add them to GitHub to show recruiters, you can build your own company using your code. This is your initiation to professional developer land.

Good luck and I look forward to seeing you on the other side!

Your friend, Angela


\ No newline at end of file diff --git a/part4/83 - Day 83 - Professional Portfolio Project - [Python Web Development]/001 Where are the Videos and the Solution Code.mp4 b/part4/83 - Day 83 - Professional Portfolio Project - [Python Web Development]/001 Where are the Videos and the Solution Code.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..263607a9104559c64a9d2aede15ededbc02acc79 --- /dev/null +++ b/part4/83 - Day 83 - Professional Portfolio Project - [Python Web Development]/001 Where are the Videos and the Solution Code.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:865a27e9a766daf9f993efe278b42fc85cf8d2cb650b4dd2cd619d042d9d0b3f +size 99812422 diff --git a/part4/83 - Day 83 - Professional Portfolio Project - [Python Web Development]/001 Where are the Videos and the Solution Code_vi.srt b/part4/83 - Day 83 - Professional Portfolio Project - [Python Web Development]/001 Where are the Videos and the Solution Code_vi.srt new file mode 100644 index 0000000000000000000000000000000000000000..a681f528a51d6278730b4d026a3a5dc39fc449b3 --- /dev/null +++ b/part4/83 - Day 83 - Professional Portfolio Project - [Python Web Development]/001 Where are the Videos and the Solution Code_vi.srt @@ -0,0 +1,140 @@ +1 +00:00:01,090 --> 00:00:05,230 +Này các bạn, làm tốt lắm vì đã đạt được một cột mốc quan trọng. + +2 +00:00:05,750 --> 00:00:10,590 +Bây giờ đây là mẹo nhanh về các dự án và bài học sắp tới. + +3 +00:00:11,080 --> 00:00:15,460 +Bây giờ bạn có thể nhìn về phía trước và bạn có thể thấy, ồ, chuyện gì đang xảy ra vậy? + +4 +00:00:15,490 --> 00:00:17,260 +Không có hướng dẫn từng bước. + +5 +00:00:17,260 --> 00:00:18,840 +Không có mã giải pháp. + +6 +00:00:19,120 --> 00:00:20,210 +Điều gì đang xảy ra ở đây? + +7 +00:00:20,770 --> 00:00:27,730 +Bây giờ, những gì tôi muốn bạn có thể làm sau khi bạn hoàn thành khóa học này là đạt được tất cả các kỹ năng mà + +8 +00:00:27,730 --> 00:00:32,229 +bạn cần để có thể kiếm được công việc với tư cách là nhà phát triển python. + +9 +00:00:32,740 --> 00:00:38,920 +Và một trong những điều quan trọng nhất bạn cần chứng minh là bạn có thể viết mã của riêng mình, không + +10 +00:00:38,920 --> 00:00:45,220 +phải mã từ một hướng dẫn, không phải mã mà tôi đã hướng dẫn bạn, mà là mã mà bạn thực sự nghĩ + +11 +00:00:45,220 --> 00:00:47,080 +đến, mà bạn đã viết. . + +12 +00:00:47,920 --> 00:00:53,220 +Vì vậy, chúng tôi sẽ giúp bạn xây dựng danh mục đầu tư của mình trong phần sắp tới. + +13 +00:00:53,740 --> 00:00:59,230 +Tôi đã tạo ra một số ý tưởng dự án thường khá tốt khi nói đến các cuộc phỏng vấn. + +14 +00:00:59,650 --> 00:01:06,970 +Và công việc của bạn là sử dụng mọi thứ mà bạn đã học, cộng với nghiên cứu cộng với Google và xem lại + +15 +00:01:06,970 --> 00:01:12,420 +một số bài học để tạo các dự án đó và viết hoàn toàn mã của bạn. + +16 +00:01:12,880 --> 00:01:18,730 +Nhưng điều này có nghĩa là bạn có thể đăng ký bản quyền cho mã của mình, bạn có thể xây dựng nó thành một công việc + +17 +00:01:18,730 --> 00:01:25,120 +kinh doanh thực sự, bạn có thể đưa nó vào danh mục đầu tư của mình hoặc đưa nó lên GitHub và chứng minh trong cuộc phỏng vấn tiếp theo rằng + +18 +00:01:25,120 --> 00:01:29,270 +bạn có thể tạo các dự án của riêng mình mà không cần sự trợ giúp của người khác. + +19 +00:01:30,040 --> 00:01:36,100 +Vì vậy, tôi đã dạy các khóa học về phát triển Web, phát triển iOS và tôi thường thấy các sinh viên đến phỏng vấn xin việc với một dự án mà + +20 +00:01:36,100 --> 00:01:43,120 +tôi thích, "Ồ, tôi nghĩ rằng tôi biết rằng tôi đã viết mã cho dự án đó. "Hoặc bạn thấy trên mạng nơi mọi + +21 +00:01:43,450 --> 00:01:49,350 +người lặp đi lặp lại cùng một dự án với cùng một mã. + +22 +00:01:49,780 --> 00:01:53,140 +Đây là điều bạn sẽ tránh được bằng cách thực hiện thêm bước đó. + +23 +00:01:53,200 --> 00:01:54,640 +Bây giờ, tôi không nói rằng nó dễ dàng. + +24 +00:01:54,640 --> 00:02:00,190 +Nó sẽ thực sự khó, nhưng đây là cách bạn học và đây là cách bạn tiến bộ với tư cách là một nhà phát triển. + +25 +00:02:01,360 --> 00:02:04,280 +Trong khóa học này, tôi muốn nó là một không gian an toàn cho bạn. + +26 +00:02:04,300 --> 00:02:10,810 +Tôi muốn nó trở thành một nơi mà bạn có thể chơi, bạn có thể khám phá, bạn có thể thất bại mà không gặp bất kỳ hậu quả + +27 +00:02:10,810 --> 00:02:15,220 +nào, bởi vì tất cả chúng tôi đều ở đây để hỗ trợ bạn trên hành trình của mình. + +28 +00:02:15,640 --> 00:02:19,120 +Vì vậy, đừng lo lắng nếu bạn không thể làm điều gì đó, đừng lo lắng + +29 +00:02:19,120 --> 00:02:20,530 +nếu bạn làm sai, đừng lo + +30 +00:02:20,530 --> 00:02:25,360 +lắng nếu nó trông không đẹp, chỉ cần chia sẻ mã của bạn và chúng tôi sẽ cung cấp phản hồi cho bạn + +31 +00:02:25,360 --> 00:02:30,280 +và chúng tôi sẽ đưa bạn đến nơi mà bạn muốn. Nhưng bạn cũng phải sẵn sàng cố gắng. + +32 +00:02:31,010 --> 00:02:35,380 +Vì vậy, tôi hy vọng bạn sẽ thành công trong những bài học sắp tới và tôi chắc chắn hy vọng bạn + +33 +00:02:35,380 --> 00:02:38,650 +sẽ tiếp tục vì nó rất quan trọng đối với sự phát triển của bạn. + +34 +00:02:39,010 --> 00:02:40,930 +Vì vậy, đây là lời chúc may mắn cho bạn. + +35 +00:02:41,080 --> 00:02:44,380 +Và hãy nhớ, như mọi khi, tôi tin tưởng vào bạn. +